diff --git a/catalogue/apps/io.pilot.bowmark/metadata.json b/catalogue/apps/io.pilot.bowmark/metadata.json new file mode 100644 index 00000000..c99a54b0 --- /dev/null +++ b/catalogue/apps/io.pilot.bowmark/metadata.json @@ -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" +} diff --git a/catalogue/catalogue.json b/catalogue/catalogue.json index 2792d0c4..67f2318f 100644 --- a/catalogue/catalogue.json +++ b/catalogue/catalogue.json @@ -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", @@ -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=" } ] } diff --git a/catalogue/catalogue.json.sig b/catalogue/catalogue.json.sig index 4efe73a8..56bb00e9 100644 --- a/catalogue/catalogue.json.sig +++ b/catalogue/catalogue.json.sig @@ -1 +1 @@ -gsFIu2mS1Gi4pCAeU/W/f/A1RepSHv8FYHNQYb6tAj9Nq3SrYK5ZOhCQCmQGpjmGwly7NzKSvpXxIae8UI8vAA== +GqtM6jTGORW3zFco7WbquijEFAg4V6c7Ot/WY3fyo2NQg6kKutXmkogpd1L1mYsyLzj17W+r7MDmbNk54+2vCw==