Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions catalogue/apps/io.pilot.bowmark/metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
{
"schema_version": 1,
"id": "io.pilot.bowmark",
"display_name": "Bowmark",
"tagline": "Navigation cheatsheets for public websites — recipes that skip explore-and-discover.",
"description_md": "Bowmark gives a browsing agent **pre-computed navigation recipes** for public websites — a parameterized URL `shortcut` or a short `ui_procedure` of UI steps, each verified by prior crawls. Instead of exploring and discovering a site's structure on every task (snapshotting the DOM, guessing selectors, burning tokens), the agent calls `ask({ site, task })` once and executes the returned recipe open-loop. On known sites that means roughly **5x fewer tokens** and far less latency.\n\nManaged-key app: Pilot holds one shared Bowmark account behind the broker and meters each caller, so you install it **keyless** and never handle an API key. It's plain request/response REST — no websockets, no server-side browser, no async jobs. Your agent runs the recipe in its own browser; Bowmark only supplies the recipe.\n\n## Methods\n\n- **bowmark.ask** `{ site, task, variants?, scopeHint? }` — look up a recipe. On `status: ok` you get an `id` plus a `shortcut` (a URL `template` with `{name}` slots + `parameters`) and/or a `ui_procedure.steps` list (each step has an `action`, `locator`, `value`, and may carry `precondition`, `irreversible`, or `requires_user_input` flags). Fill the slots from your task, execute open-loop, and don't snapshot the DOM to re-verify what the recipe already documents.\n- **bowmark.report_outcome** `{ envelope_id, success, evidence }` — after running a recipe, report whether it executed cleanly. This feeds the re-crawl loop that keeps recipes healthy, so it matters: report `success: false` on any deviation (a retry, a JS-eval fallback, an extra click) even if you still got the answer. `evidence.what_happened` describes how the *recipe* behaved, not the task result.\n\n## Syntax & edge cases\n\n- `site` is a registrable domain, optionally with a product surface: `google.com`, `docs.stripe.com`, `google.com/maps` — a matching path acts as an implicit scope hint.\n- `task` is plain-English **intent**, never a URL.\n- Request the signed-in surface with `variants: { auth_state: \"logged_in\", role: \"owner\" }` (also `locale` / `region` / `currency`); the assumed facets come back on `variants_assumed`.\n- Non-`ok` statuses: `no_useful_data` / `site_not_supported` / `synth_invalid` → browse manually; `ambiguous_scope` → retry with `scopeHint` = one of `error.scope_options[].pattern`; `rate_limited` → back off until `error.retry_after` (only NEW recipe synthesis is capped — cached recipes still answer). On a `503` (`embedder_unavailable` / `synth_unavailable`), retry once after `Retry-After`.\n- Skip Bowmark for localhost, RFC1918 IPs, and open-ended search with no destination.",
"vendor": {
"name": "Bowmark AI",
"url": "https://bowmark.ai",
"contact": "support@bowmark.ai",
"publisher_pubkey": "ed25519:Lmf0vzz0CNPu94pbqsbD/ueSuOaKsGc0xU/DoL+Yu7c="
},
"homepage": "https://bowmark.ai",
"source_url": "https://github.com/bowmark-ai/plugin",
"license": "Proprietary",
"categories": [
"web",
"browser",
"agents",
"automation"
],
"keywords": [
"browser",
"navigation",
"recipes",
"cheatsheets",
"websites",
"playwright",
"puppeteer",
"computer-use",
"scraping"
],
"size": {
"bundle_bytes": 5070051,
"installed_bytes": 9105408
},
"compat": {
"min_pilot_version": "1.10.0",
"runtimes": [
"go"
]
},
"methods": [
{
"name": "bowmark.ask",
"summary": "Look up a navigation recipe for a (site, task) pair — a URL shortcut or short UI procedure verified by prior crawls. status=ok → execute it open-loop; no_useful_data/site_not_supported → browse manually; ambiguous_scope → retry with scopeHint; rate_limited → back off. Pass variants:{auth_state:'logged_in', role:'owner'} for signed-in surfaces. Intent, not a URL."
},
{
"name": "bowmark.report_outcome",
"summary": "After running a recipe from ask, report how it executed (envelope_id, success, evidence). success=true only if every step ran as written; false on any retry/JS-eval/extra click. Feeds the re-crawl loop that keeps recipes healthy."
},
{
"name": "bowmark.help",
"summary": "Discovery: every method with params, kind, and latency class."
}
],
"changelog": [
{
"version": "0.1.0",
"date": "2026-07-03",
"notes": [
"Initial release — managed-key REST adapter over the Bowmark API (bowmark.ask → /v1/ask, bowmark.report_outcome → /v1/outcomes).",
"One shared Bowmark account behind the Pilot broker, metered per caller; the installed adapter is keyless."
]
}
],
"links": [
{ "label": "Source", "url": "https://github.com/bowmark-ai/plugin" },
{ "label": "Website", "url": "https://bowmark.ai" }
],
"published_at": "2026-07-03",
"updated_at": "2026-07-03"
}
41 changes: 40 additions & 1 deletion catalogue/catalogue.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"version": 2,
"updated_at": "2026-07-02T00:00:00Z",
"updated_at": "2026-07-03T00:00:00Z",
"apps": [
{
"id": "io.pilot.wallet",
Expand Down Expand Up @@ -461,6 +461,45 @@
"cloud"
],
"publisher": "ed25519:54rnZ8+dN9V2cxZMJLMQKt36oYP/CfhF/zIgJMkjLIQ="
},
{
"id": "io.pilot.bowmark",
"version": "0.1.0",
"description": "Pre-computed navigation recipes for public websites — parameterized URL shortcuts and short UI procedures verified by prior crawls, so a browsing agent skips explore-and-discover and cuts tokens. Two endpoints: ask (look up a recipe) and report_outcome (feed recipe health). Managed-key: Pilot holds one Bowmark account behind the broker and meters each caller; the installed adapter is keyless.",
"bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.bowmark/0.1.0/io.pilot.bowmark-0.1.0-linux-amd64.tar.gz",
"bundle_sha256": "5dc1f2335050b91538513704e7dd089f55b72e67457caefac9be5f18dbc8b57b",
"display_name": "Bowmark",
"vendor": "Bowmark AI",
"categories": [
"web",
"browser",
"agents",
"automation"
],
"bundle_size": 5070051,
"source_url": "https://github.com/bowmark-ai/plugin",
"license": "Proprietary",
"metadata_url": "https://raw.githubusercontent.com/pilot-protocol/pilotprotocol/main/catalogue/apps/io.pilot.bowmark/metadata.json",
"metadata_sha256": "9993a8618ec25ff0bcc31b2eccfb1a257562727b63d45a4bd9f000cb933ab754",
"bundles": {
"linux/amd64": {
"bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.bowmark/0.1.0/io.pilot.bowmark-0.1.0-linux-amd64.tar.gz",
"bundle_sha256": "5dc1f2335050b91538513704e7dd089f55b72e67457caefac9be5f18dbc8b57b"
},
"linux/arm64": {
"bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.bowmark/0.1.0/io.pilot.bowmark-0.1.0-linux-arm64.tar.gz",
"bundle_sha256": "8fa2d36fbd600b16b7aea3a089e5c7d12ee2353d3e8deb7f4ba3323edbba4338"
},
"darwin/arm64": {
"bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.bowmark/0.1.0/io.pilot.bowmark-0.1.0-darwin-arm64.tar.gz",
"bundle_sha256": "fb791bd8bb0dc635842201c561d565ea0d8fc991c0388a2e33252ed2ed206a63"
},
"darwin/amd64": {
"bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.bowmark/0.1.0/io.pilot.bowmark-0.1.0-darwin-amd64.tar.gz",
"bundle_sha256": "f9592403fb7f3d9d075f3922402d9646337d67cf2dddbd2c971ecc432596d48b"
}
},
"publisher": "ed25519:Lmf0vzz0CNPu94pbqsbD/ueSuOaKsGc0xU/DoL+Yu7c="
}
]
}
2 changes: 1 addition & 1 deletion catalogue/catalogue.json.sig
Original file line number Diff line number Diff line change
@@ -1 +1 @@
gsFIu2mS1Gi4pCAeU/W/f/A1RepSHv8FYHNQYb6tAj9Nq3SrYK5ZOhCQCmQGpjmGwly7NzKSvpXxIae8UI8vAA==
GqtM6jTGORW3zFco7WbquijEFAg4V6c7Ot/WY3fyo2NQg6kKutXmkogpd1L1mYsyLzj17W+r7MDmbNk54+2vCw==
Loading