diff --git a/catalogue/apps/io.pilot.bowmark/metadata.json b/catalogue/apps/io.pilot.bowmark/metadata.json new file mode 100644 index 00000000..5eb8a8c4 --- /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, so agents run cheaper, faster, and more accurately.", + "description_md": "Bowmark gives agents a **pre-computed cheatsheet** for the task at hand. A cheatsheet is a compact, ready-to-run answer for one task on one site: a parameterized URL `shortcut` and/or a short `ui_procedure` of UI steps. Instead of burning tokens re-reading a site's DOM and guessing its way through the page, your agent calls `ask({ site, task })` and gets the exact path back. It spends less, finishes sooner, and lands on the right action the first time.\n\nBowmark is **free to use** — no signup and no API key to manage. It's plain request/response REST — no websockets, no server-side browser, no async jobs. Your agent runs the cheatsheet in its own browser; Bowmark only supplies the path.\n\n## Methods\n\n- **bowmark.ask** `{ site, task }` — give it a site and a plain-English task (e.g. \"find Apple's latest 10-K\") and it returns the cheatsheet: a URL `shortcut` (a `template` with `{name}` slots you fill from your task, then navigate) and/or a `ui_procedure.steps` list to follow in order, plus an `id`. Call it before any browser action, in place of exploring the page yourself; execute the cheatsheet open-loop rather than re-reading the DOM.\n- **bowmark.report_outcome** `{ envelope_id, success }` — after running a cheatsheet, report whether every step ran exactly as written. Honest results keep the cheatsheets fresh: a failure triggers a re-crawl that repairs the path for the next agent, so report `success: false` on any deviation (a retry, a raw-JS fallback, an extra click) even if you still got the answer.\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- A `ui_procedure` step may be flagged `irreversible` (confirm with the user first) or `requires_user_input` (stop and ask the user — a password, payment, or personal detail).\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 cheatsheet synthesis is capped — known ones still answer). On a `503`, 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", + "cheatsheets", + "recipes", + "websites", + "playwright", + "puppeteer", + "computer-use", + "scraping" + ], + "size": { + "bundle_bytes": 5070050, + "installed_bytes": 9105408 + }, + "compat": { + "min_pilot_version": "1.10.0", + "runtimes": [ + "go" + ] + }, + "methods": [ + { + "name": "bowmark.ask", + "summary": "Give it a site and a plain-English task (e.g. 'find Apple's latest 10-K') and it returns a ready-to-run cheatsheet — a URL shortcut to fill and navigate and/or a short ui_procedure of steps. Call it before any browser action, in place of exploring the page yourself, and execute the cheatsheet open-loop. status=ok returns an id; no_useful_data/site_not_supported → browse manually; ambiguous_scope → retry with scopeHint; rate_limited → back off. Pass variants:{auth_state:'logged_in'} for signed-in surfaces. Intent, not a URL." + }, + { + "name": "bowmark.report_outcome", + "summary": "After running a cheatsheet from ask, report whether every step ran exactly as written (envelope_id + success, optional evidence). success=true only if it ran clean — no retries, no raw-JS fallback, no extra clicks; false on any deviation, even if you still got the answer. Honest results trigger a re-crawl that keeps the cheatsheet fresh for the next agent." + }, + { + "name": "bowmark.help", + "summary": "Discovery: every method with params, latency, and description." + } + ], + "changelog": [ + { + "version": "0.1.0", + "date": "2026-07-06", + "notes": [ + "Initial release — REST adapter over the Bowmark API: bowmark.ask (/v1/ask) and bowmark.report_outcome (/v1/outcomes).", + "Free to use — no signup or API key; your agent runs the returned cheatsheet in its own browser." + ] + } + ], + "links": [ + { "label": "Source", "url": "https://github.com/bowmark-ai/plugin" }, + { "label": "Website", "url": "https://bowmark.ai" } + ], + "published_at": "2026-07-06", + "updated_at": "2026-07-06" +} diff --git a/catalogue/catalogue.json b/catalogue/catalogue.json index 2792d0c4..ec2cdcdc 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": "Navigation cheatsheets for public websites, so agents run cheaper, faster, and more accurately. Call ask({site, task}) before any browser action to get a ready-to-run cheatsheet — a parameterized URL shortcut and/or a short UI procedure to execute open-loop — instead of exploring the DOM; then report_outcome to keep them fresh. Free to use — no signup, no API key.", + "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": "af6f94bd8dd1ec2143d6d791205539f3b8ebeab94585d6f29552747de32cf997", + "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": "c90576c9fa3a62100e263215ff771dc4b92966bced0be237e530f20c2d346c7e", + "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": "af6f94bd8dd1ec2143d6d791205539f3b8ebeab94585d6f29552747de32cf997" + }, + "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": "aeb587e89701bdc121717893562bfe50578a9b7235373fa93fd4c868ddacb928" + }, + "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": "c30336813659d2647164b519cd987a0a2b4d362bc985a30e3842903ab5fdb7e7" + }, + "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": "ac71dfcbf72966eec95e3f8b6e4577c10a7fef62952b771e9dc765080613a23b" + } + }, + "publisher": "ed25519:Lmf0vzz0CNPu94pbqsbD/ueSuOaKsGc0xU/DoL+Yu7c=" } ] } diff --git a/catalogue/catalogue.json.sig b/catalogue/catalogue.json.sig index 4efe73a8..7bd3479a 100644 --- a/catalogue/catalogue.json.sig +++ b/catalogue/catalogue.json.sig @@ -1 +1 @@ -gsFIu2mS1Gi4pCAeU/W/f/A1RepSHv8FYHNQYb6tAj9Nq3SrYK5ZOhCQCmQGpjmGwly7NzKSvpXxIae8UI8vAA== +3DeVcBPvNNP7146Rx6m5jkrwFpDx/SB+avfZ1bQ6YuWNZL+FDRVi55HAie2Vz59l2wxgkL+MQAyZ61GM/BGMBA==