From beea39844f4978d81783710f31f84e739be4aef1 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 28 Jul 2026 17:04:21 -0700 Subject: [PATCH 1/2] catalogue: io.pilot.agentphone 0.3.0 -> 0.3.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Point at the 0.3.1 bundles (uploaded to pilot-artifacts-prod R2) + refresh metadata: drop /v1/usage/daily+monthly (cross-user leak; broker allow-list already 403s them), honest managed-model description (no starter agent). NOTE: catalogue.json.sig is stale — needs re-signing with the catalogue key (normally the publish pipeline regenerates it). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../apps/io.pilot.agentphone/metadata.json | 88 +++++++++---------- catalogue/catalogue.json | 66 +++++++------- 2 files changed, 73 insertions(+), 81 deletions(-) diff --git a/catalogue/apps/io.pilot.agentphone/metadata.json b/catalogue/apps/io.pilot.agentphone/metadata.json index 805b433d..cdc84d04 100644 --- a/catalogue/apps/io.pilot.agentphone/metadata.json +++ b/catalogue/apps/io.pilot.agentphone/metadata.json @@ -2,8 +2,8 @@ "schema_version": 1, "id": "io.pilot.agentphone", "display_name": "AgentPhone", - "tagline": "A real phone number for your agent — voice calls, SMS/iMessage, and conversations over REST", - "description_md": "# AgentPhone — a real phone number for your AI agent\n\nAgentPhone gives your agent its **own real US/Canada phone number**: place and receive **voice calls**, send and receive **SMS \u0026 iMessage**, and hold threaded **conversations** with real people — all over plain REST. This is the managed Pilot front door: you bring **nothing** (no signup, no API key). Pilot holds one AgentPhone master key behind the broker and gives **each Pilot user a $5 budget**; calls and texts debit against it, and once it's spent the paid endpoints return `402 Payment Required` (reads stay free).\n\n## What you can do\n\n- **Call people.** `agentphone.place_call` with a `systemPrompt` runs an autonomous voice call — the phone rings in ~1–2s and the AI holds the conversation. Book a reservation, chase a shipment, return a missed call, or call another agent.\n- **Text people.** `agentphone.send_message` delivers over **iMessage** when both sides support it (unlocking threaded replies, tapback reactions, send effects, typing indicators, group chats) and transparently falls back to **SMS/MMS** otherwise — same call either way.\n- **Answer \u0026 follow up.** Poll `agentphone.list_number_messages` / `agentphone.list_conversation_messages` for inbound texts and `agentphone.get_call` for call transcripts — **no websockets required**.\n- **Manage your setup.** Buy/release numbers, create and tune agents (voice, model tier, system prompt, ambience), keep an address book of contacts, and attach numbers to agents.\n\n## How it works (no signup step)\n\nBecause this is the **managed** app, the AgentPhone account already exists behind the Pilot broker — you skip the `/v0/agent/sign-up` + `/v0/agent/verify` flow entirely. Just call the `/v1` methods below; the broker authenticates you as your Pilot identity, injects the master key, meters your spend, and forwards to `https://api.agentphone.ai`.\n\n**Async, poll-based (no streaming):**\n1. `agentphone.place_call` → returns a call `id` immediately; the call runs in the background.\n2. Poll `agentphone.get_call` every few seconds until `status` is `completed` or `failed`, then read `transcripts[]` (or `agentphone.get_transcript`).\n3. For inbound SMS, poll `agentphone.list_number_messages` with the `after` cursor and filter `direction == \"inbound\"`.\n\n## Critical gotchas (read once)\n\n- **You cannot call 911**, N11 numbers, or crisis lines — they're blocked. If your human has an emergency, tell them to dial directly.\n- **Released numbers are gone forever** — no refund for the unused month. Confirm before `agentphone.release_number`.\n- **Always use E.164**: `+14155551234` ✓ — never `(415) 555-1234` or `415-555-1234`. Assume `+1` for a bare US number and confirm if it matters.\n- **Inbound calls need hosted mode OR a webhook.** Create agents with `voiceMode: \"hosted\"` explicitly (the backend defaults to `webhook`, which fails inbound if no webhook is set).\n- **iMessage-only features** (reactions, send effects, typing, backgrounds, contact cards) are silently ignored on SMS — check the response `channel`.\n- **Don't spam.** Unsolicited bulk calls/texts are illegal and get the account suspended.\n\n## Cost \u0026 the $5 budget\n\nReads are free. Spending operations debit your per-user $5 Pilot budget: buying a number (**$3.00/mo**), placing a call (**per-minute**), and sending a text (**~$0.01–0.02**). When a call would overdraw, the broker returns `402` before anything is charged, and every response carries your remaining balance in the `X-Pilot-Credits-Remaining` header (micro-dollars).\n\nEvery method's parameters, kind, and latency class are discoverable at runtime via `agentphone.help`.\n", + "tagline": "A real phone number for your agent \u2014 voice calls, SMS/iMessage, and conversations over REST", + "description_md": "# AgentPhone \u2014 a real phone number for your AI agent\n\nAgentPhone gives your agent its **own real US/Canada phone number**: place and receive **voice calls**, send and receive **SMS & iMessage**, and hold threaded **conversations** with real people \u2014 all over plain REST. This is the managed Pilot front door: you bring **nothing** (no signup, no API key). Pilot holds one AgentPhone master key behind the broker and gives **each Pilot user a $5 budget**; calls and texts debit against it, and once it's spent the paid endpoints return `402 Payment Required` (reads stay free).\n\n## What you can do\n\n- **Call people.** `agentphone.place_call` with a `systemPrompt` runs an autonomous voice call \u2014 the phone rings in ~1\u20132s and the AI holds the conversation. Book a reservation, chase a shipment, return a missed call, or call another agent.\n- **Text people.** `agentphone.send_message` delivers over **iMessage** when both sides support it (unlocking threaded replies, tapback reactions, send effects, typing indicators, group chats) and transparently falls back to **SMS/MMS** otherwise \u2014 same call either way.\n- **Answer & follow up.** Poll `agentphone.list_number_messages` / `agentphone.list_conversation_messages` for inbound texts and `agentphone.get_call` for call transcripts \u2014 **no websockets required**.\n- **Manage your setup.** Buy/release numbers, create and tune agents (voice, model tier, system prompt, ambience), keep an address book of contacts, and attach numbers to agents.\n\n## First run: `agentphone.setup` (no signup, no starter agent)\n\nBecause this is the **managed** app there is no signup \u2014 but there is also **no starter agent or number**: the AgentPhone account is shared behind the broker and every Pilot user starts empty. So the first thing to do is call **`agentphone.setup`** once. It creates your agent and attaches a phone number (buying one costs **$3/mo** \u2014 setup asks you to confirm with `confirm_spend:true` before spending). After that, `agentphone.send_message` / `agentphone.place_call` work from the `agent_id` it returned. `agentphone.status` tells you at any time whether you're ready. Just call the `/v1` methods below; the broker authenticates you as your Pilot identity, injects the master key, meters your spend, and forwards to `https://api.agentphone.ai`.\n\n## Your data is yours (per-user isolation)\n\nEven though every Pilot user shares one AgentPhone account, the broker isolates you completely: **you only ever see and act on your own agents, numbers, messages, calls, conversations, and contacts** \u2014 never another user's, whatever the method. References to a resource you don't own return `404`, and list methods return only your own rows (and your own counts). **Billing is per-user at the broker**, not AgentPhone: your remaining budget rides on the `X-Pilot-Credits-Remaining` header of every metered response (account-wide usage aggregates are deliberately not exposed).\n\n**Async, poll-based (no streaming):**\n1. `agentphone.place_call` \u2192 returns a call `id` immediately; the call runs in the background.\n2. Poll `agentphone.get_call` every few seconds until `status` is `completed` or `failed`, then read `transcripts[]` (or `agentphone.get_transcript`).\n3. For inbound SMS, poll `agentphone.list_number_messages` with the `after` cursor and filter `direction == \"inbound\"`.\n\n## Critical gotchas (read once)\n\n- **You cannot call 911**, N11 numbers, or crisis lines \u2014 they're blocked. If your human has an emergency, tell them to dial directly.\n- **Released numbers are gone forever** \u2014 no refund for the unused month. Confirm before `agentphone.release_number`.\n- **Always use E.164**: `+14155551234` \u2713 \u2014 never `(415) 555-1234` or `415-555-1234`. Assume `+1` for a bare US number and confirm if it matters.\n- **Inbound calls need hosted mode OR a webhook.** Create agents with `voiceMode: \"hosted\"` explicitly (the backend defaults to `webhook`, which fails inbound if no webhook is set).\n- **iMessage-only features** (reactions, send effects, typing, backgrounds, contact cards) are silently ignored on SMS \u2014 check the response `channel`.\n- **Don't spam.** Unsolicited bulk calls/texts are illegal and get the account suspended.\n\n## Cost & the $5 budget\n\nReads are free. Spending operations debit your per-user $5 Pilot budget: buying a number (**$3.00/mo**), placing a call (**per-minute**), and sending a text (**~$0.01\u20130.02**). When a call would overdraw, the broker returns `402` before anything is charged, and every response carries your remaining balance in the `X-Pilot-Credits-Remaining` header (micro-dollars).\n\nEvery method's parameters, kind, and latency class are discoverable at runtime via `agentphone.help`.\n", "vendor": { "name": "AgentPhone", "url": "https://agentphone.ai", @@ -44,14 +44,6 @@ "name": "agentphone.usage", "summary": "Account status: plan, phone-number hold limit (used/limit/remaining), and message/call/webhook stats. Call this first to orient in a session. Read-only; no charge." }, - { - "name": "agentphone.usage_daily", - "summary": "Daily usage breakdown for the last N days (max 365). Read-only." - }, - { - "name": "agentphone.usage_monthly", - "summary": "Monthly usage aggregation. Read-only." - }, { "name": "agentphone.usage_by_number", "summary": "Usage broken down per phone number. Read-only." @@ -62,11 +54,11 @@ }, { "name": "agentphone.list_voices", - "summary": "List available text-to-speech voices (voice_id, voice_name, provider, gender, accent, preview_audio_url) across ElevenLabs, Cartesia, OpenAI, and platform voices. gender/accent/preview may be null — do not crash on missing fields. Use voice_id when creating/updating an agent. Read-only." + "summary": "List available text-to-speech voices (voice_id, voice_name, provider, gender, accent, preview_audio_url) across ElevenLabs, Cartesia, OpenAI, and platform voices. gender/accent/preview may be null \u2014 do not crash on missing fields. Use voice_id when creating/updating an agent. Read-only." }, { "name": "agentphone.list_agents", - "summary": "List your agents (phone personas: name, voiceMode, model tier, system prompt, attached numbers). You get one starter agent on account setup — ALWAYS list before creating another. Read-only." + "summary": "List your agents (phone personas: name, voiceMode, model tier, system prompt, attached numbers). You get one agent on account setup \u2014 ALWAYS list before creating another. Read-only." }, { "name": "agentphone.create_agent", @@ -78,11 +70,11 @@ }, { "name": "agentphone.update_agent", - "summary": "Update an agent — only the fields you send change. Any create field is updatable (systemPrompt, voice, modelTier, …). Free." + "summary": "Update an agent \u2014 only the fields you send change. Any create field is updatable (systemPrompt, voice, modelTier, \u2026). Free." }, { "name": "agentphone.delete_agent", - "summary": "Delete an agent. Irreversible — clears the agent's references on its numbers/conversations/calls (those are NOT deleted). Confirm with your human first. Free." + "summary": "Delete an agent. Irreversible \u2014 clears the agent's references on its numbers/conversations/calls (those are NOT deleted). Confirm with your human first. Free." }, { "name": "agentphone.attach_number", @@ -106,7 +98,7 @@ }, { "name": "agentphone.buy_number", - "summary": "Provision a new US/CA phone number. COSTS $3.00 from your $5 Pilot budget (402 if it would overdraw). The provisioned number is saved to this host's ~/.pilot/.agentphone so you can recall it later with agentphone.mynumber — no need to store it yourself. Optionally attach to an agent and request an area code." + "summary": "Provision a new US/CA phone number. COSTS $3.00 from your $5 Pilot budget (402 if it would overdraw). The provisioned number is saved to this host's ~/.pilot/.agentphone so you can recall it later with agentphone.mynumber \u2014 no need to store it yourself. Optionally attach to an agent and request an area code." }, { "name": "agentphone.get_number", @@ -114,7 +106,7 @@ }, { "name": "agentphone.release_number", - "summary": "Release (delete) a number. IRREVERSIBLE — the number returns to the carrier pool; no refund for the unused month. Confirm with your human first. Free to call." + "summary": "Release (delete) a number. IRREVERSIBLE \u2014 the number returns to the carrier pool; no refund for the unused month. Confirm with your human first. Free to call." }, { "name": "agentphone.list_number_messages", @@ -138,11 +130,11 @@ }, { "name": "agentphone.send_message", - "summary": "Send an SMS/iMessage. COSTS MONEY (~$0.01–0.02, debited from your $5 budget → 402 if over). Auto-delivers over iMessage when both sides support it, else SMS/MMS — the response `channel` (sms|mms|imessage) tells you how it went. E.164 for `to_number` (or a group id grp_… for an iMessage group). iMessage-only extras (send_style, reply_to_message_id) are silently ignored on SMS." + "summary": "Send an SMS/iMessage. COSTS MONEY (~$0.01\u20130.02, debited from your $5 budget \u2192 402 if over). Auto-delivers over iMessage when both sides support it, else SMS/MMS \u2014 the response `channel` (sms|mms|imessage) tells you how it went. E.164 for `to_number` (or a group id grp_\u2026 for an iMessage group). iMessage-only extras (send_style, reply_to_message_id) are silently ignored on SMS." }, { "name": "agentphone.react", - "summary": "Send a tapback reaction to a message. iMessage ONLY — returns 400 on SMS. Free." + "summary": "Send a tapback reaction to a message. iMessage ONLY \u2014 returns 400 on SMS. Free." }, { "name": "agentphone.list_calls", @@ -150,7 +142,7 @@ }, { "name": "agentphone.place_call", - "summary": "Place an OUTBOUND voice call. COSTS MONEY (per-minute, ~$0.05+, debited from your $5 budget → 402 if over). With `systemPrompt` the AI runs the call autonomously (recommended); without it, each turn is POSTed to the agent's webhook. Returns a call id IMMEDIATELY (async) — the phone rings in a second or two. Then POLL agentphone.get_call every few seconds until status is completed/failed to read the transcript. Cannot call 911 / N11 / crisis lines (blocked)." + "summary": "Place an OUTBOUND voice call. COSTS MONEY (per-minute, ~$0.05+, debited from your $5 budget \u2192 402 if over). With `systemPrompt` the AI runs the call autonomously (recommended); without it, each turn is POSTed to the agent's webhook. Returns a call id IMMEDIATELY (async) \u2014 the phone rings in a second or two. Then POLL agentphone.get_call every few seconds until status is completed/failed to read the transcript. Cannot call 911 / N11 / crisis lines (blocked)." }, { "name": "agentphone.get_call", @@ -158,11 +150,11 @@ }, { "name": "agentphone.end_call", - "summary": "Terminate an in-progress call. status/endedAt settle shortly after via the provider — keep polling agentphone.get_call until terminal. Free." + "summary": "Terminate an in-progress call. status/endedAt settle shortly after via the provider \u2014 keep polling agentphone.get_call until terminal. Free." }, { "name": "agentphone.get_transcript", - "summary": "Get the full ordered transcript of a call as plain JSON (user utterance + agent response per turn). This is the REST/polling alternative to the SSE live-transcript stream — the adapter never uses the stream. Read-only." + "summary": "Get the full ordered transcript of a call as plain JSON (user utterance + agent response per turn). This is the REST/polling alternative to the SSE live-transcript stream \u2014 the adapter never uses the stream. Read-only." }, { "name": "agentphone.list_conversations", @@ -206,7 +198,7 @@ }, { "name": "agentphone.update_contact", - "summary": "Update a contact — only the fields you send change (phone is re-normalized; 409 on conflict). Free." + "summary": "Update a contact \u2014 only the fields you send change (phone is re-normalized; 409 on conflict). Free." }, { "name": "agentphone.delete_contact", @@ -218,11 +210,11 @@ }, { "name": "agentphone.set_webhook", - "summary": "Set the account-level webhook URL (returns a signing `secret`; a new one each call). NOTE: on the shared Pilot AgentPhone account this is a GLOBAL setting — prefer per-agent webhooks or polling. Free." + "summary": "Set the account-level webhook URL (returns a signing `secret`; a new one each call). NOTE: on the shared Pilot AgentPhone account this is a GLOBAL setting \u2014 prefer per-agent webhooks or polling. Free." }, { "name": "agentphone.delete_webhook", - "summary": "Remove the account-level webhook. Global on the shared account — use with care. Free." + "summary": "Remove the account-level webhook. Global on the shared account \u2014 use with care. Free." }, { "name": "agentphone.list_webhook_deliveries", @@ -242,7 +234,7 @@ }, { "name": "agentphone.set_agent_webhook", - "summary": "Set an agent-specific webhook URL (overrides the account default for THIS agent only — safer than the account-level webhook on a shared account). Free." + "summary": "Set an agent-specific webhook URL (overrides the account default for THIS agent only \u2014 safer than the account-level webhook on a shared account). Free." }, { "name": "agentphone.delete_agent_webhook", @@ -250,7 +242,7 @@ }, { "name": "agentphone.mynumber", - "summary": "Recall the phone number(s) THIS daemon provisioned (local, no backend call, free). Reads ~/.pilot/.agentphone, populated automatically by agentphone.buy_number. Returns {entries:[{id,phoneNumber,status,agentId,...}]} — empty if this host hasn't provisioned one yet. Use it to find 'my number' without listing the shared account." + "summary": "Recall the phone number(s) THIS daemon provisioned (local, no backend call, free). Reads ~/.pilot/.agentphone, populated automatically by agentphone.buy_number. Returns {entries:[{id,phoneNumber,status,agentId,...}]} \u2014 empty if this host hasn't provisioned one yet. Use it to find 'my number' without listing the shared account." }, { "name": "agentphone.help", @@ -278,17 +270,17 @@ "product_demo": { "skill": "io.pilot.agentphone", "title": "Full usage demo", - "when_to_use": "When your agent needs to place a real phone call or send an SMS/iMessage to a person — bookings, reminders, follow-ups, chasing a shipment or a missed call.", + "when_to_use": "When your agent needs to place a real phone call or send an SMS/iMessage to a person \u2014 bookings, reminders, follow-ups, chasing a shipment or a missed call.", "metered": true, "quickstart": { - "goal": "Orient — check your account and $5 budget (free read)", + "goal": "Orient \u2014 check your account and $5 budget (free read)", "command": "pilotctl appstore call io.pilot.agentphone agentphone.usage '{}'", "expect": "{\"plan\":\"managed\",\"numbers\":{\"used\":0,\"limit\":1},\"stats\":{...}}", "cost": "$0.00 (read)" }, "examples": [ { - "title": "Find your starter agent (free read)", + "title": "Find your agent (free read)", "goal": "Get the agentId you place calls / send texts as", "command": "pilotctl appstore call io.pilot.agentphone agentphone.list_agents '{}'", "expect": "{\"data\":[{\"id\":\"agent_...\",\"name\":\"Assistant\",\"voiceMode\":\"hosted\"}]}", @@ -309,7 +301,7 @@ "cost": "$0.00 (read)" }, { - "title": "Send a text (iMessage → SMS fallback)", + "title": "Send a text (iMessage \u2192 SMS fallback)", "command": "pilotctl appstore call io.pilot.agentphone agentphone.send_message '{\"agent_id\":\"agent_123\",\"to_number\":\"+14155551234\",\"body\":\"On my way, 5 min out.\"}'", "expect": "{\"id\":\"msg_...\",\"channel\":\"imessage\"}", "cost": "$0.02" @@ -345,12 +337,12 @@ "check_balance": "pilotctl appstore call io.pilot.agentphone agentphone.usage '{}'" }, "gotchas": [ - "Always use E.164 numbers (+14155551234) — never (415) 555-1234.", - "You cannot dial 911, N11, or crisis lines — they are blocked.", - "402 Payment Required means your $5.00 budget is spent — reads still work.", - "place_call/send_message need an agent with a number attached — list_agents / list_numbers first.", + "Always use E.164 numbers (+14155551234) \u2014 never (415) 555-1234.", + "You cannot dial 911, N11, or crisis lines \u2014 they are blocked.", + "402 Payment Required means your $5.00 budget is spent \u2014 reads still work.", + "place_call/send_message need an agent with a number attached \u2014 list_agents / list_numbers first.", "Calls are async: place_call returns a call id, then poll get_call until status is completed/failed.", - "iMessage-only extras (reactions, send effects) are silently ignored on SMS — check the response channel." + "iMessage-only extras (reactions, send effects) are silently ignored on SMS \u2014 check the response channel." ], "next": [ "io.pilot.agentphone agentphone.help '{}'" @@ -364,16 +356,16 @@ "from": "*", "on": "err", "code": 402, - "why": "your per-user $5 budget is spent — buy_number ($3), place_call (~$0.05+/min) and send_message (~$0.02) are blocked. The grant is one-time: there is no top-up or balance call. Reads stay free.", + "why": "your per-user $5 budget is spent \u2014 buy_number ($3), place_call (~$0.05+/min) and send_message (~$0.02) are blocked. The grant is one-time: there is no top-up or balance call. Reads stay free.", "then": [ { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.usage '{}'", - "why": "free — the closest thing to a balance: plan, number hold limit, and your call/message stats", + "why": "free \u2014 the closest thing to a balance: plan, number hold limit, and your call/message stats", "kind": "recovery" }, { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.mynumber '{}'", - "why": "free, local — a number you already bought is still yours; recall it instead of buying again", + "why": "free, local \u2014 a number you already bought is still yours; recall it instead of buying again", "kind": "recovery" } ] @@ -382,7 +374,7 @@ "from": "*", "on": "err", "code": 429, - "why": "a rate/identity limit, NOT an empty budget — per-caller quota or the per-IP identity cap. Your credit is intact; back off and retry rather than trying to pay.", + "why": "a rate/identity limit, NOT an empty budget \u2014 per-caller quota or the per-IP identity cap. Your credit is intact; back off and retry rather than trying to pay.", "then": [ { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.mynumber '{}'", @@ -403,12 +395,12 @@ "then": [ { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.list_agents '{}'", - "why": "free — you get a starter agent on setup; its id is required by send_message and place_call", + "why": "free \u2014 you get a agent on setup; its id is required by send_message and place_call", "kind": "flow" }, { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.mynumber '{}'", - "why": "free, local — shows whether this host already provisioned a number (empty means you need buy_number)", + "why": "free, local \u2014 shows whether this host already provisioned a number (empty means you need buy_number)", "kind": "flow" } ] @@ -420,7 +412,7 @@ "then": [ { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.list_numbers '{}'", - "why": "free — if a number is already listed, attach it rather than paying $3 for another", + "why": "free \u2014 if a number is already listed, attach it rather than paying $3 for another", "kind": "flow" }, { @@ -433,7 +425,7 @@ { "from": "agentphone.buy_number", "on": "ok", - "why": "you now have a real US/CA number attached — this is the point of the app", + "why": "you now have a real US/CA number attached \u2014 this is the point of the app", "then": [ { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.send_message '{\"agent_id\":\"agent_123\",\"to_number\":\"+14155551234\",\"body\":\"On my way, 5 min out.\"}'", @@ -450,11 +442,11 @@ { "from": "agentphone.place_call", "on": "ok", - "why": "place_call is async — it returned a call id, not a result. Nothing has been said yet.", + "why": "place_call is async \u2014 it returned a call id, not a result. Nothing has been said yet.", "then": [ { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.get_call '{\"call_id\":\"call_123\"}'", - "why": "free — poll with the id you just got every few seconds until status is completed/failed to read the transcript", + "why": "free \u2014 poll with the id you just got every few seconds until status is completed/failed to read the transcript", "kind": "flow" } ] @@ -467,16 +459,16 @@ "then": [ { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.list_agents '{}'", - "why": "free — the agent_id you are missing, plus its attached numbers", + "why": "free \u2014 the agent_id you are missing, plus its attached numbers", "kind": "recovery" }, { "cmd": "pilotctl appstore call io.pilot.agentphone agentphone.send_message '{\"agent_id\":\"agent_123\",\"to_number\":\"+14155551234\",\"body\":\"On my way, 5 min out.\"}'", - "why": "the complete shape — E.164 for to_number, never (415) 555-1234", + "why": "the complete shape \u2014 E.164 for to_number, never (415) 555-1234", "kind": "recovery" } ] } ] } -} +} \ No newline at end of file diff --git a/catalogue/catalogue.json b/catalogue/catalogue.json index 1305a4bd..af337879 100644 --- a/catalogue/catalogue.json +++ b/catalogue/catalogue.json @@ -5,7 +5,7 @@ { "id": "io.pilot.wallet", "version": "0.3.3", - "description": "On-overlay USDC payments — multichain (Base + Ethereum + Polygon).", + "description": "On-overlay USDC payments \u2014 multichain (Base + Ethereum + Polygon).", "bundle_url": "https://github.com/pilot-protocol/pilotprotocol/releases/download/wallet-v0.3.3/io.pilot.wallet-0.3.3.tar.gz", "bundle_sha256": "8d30b4331bc025c327dd2d8610362984cc9365843176e21b96a2637d8e18ff54", "display_name": "Wallet", @@ -84,14 +84,14 @@ "id": "io.pilot.smolmachines", "renamed_to": "io.pilot.smol", "hidden": true, - "display_name": "Smol Machines (renamed → io.pilot.smol)", - "description": "Renamed to io.pilot.smol. Install io.pilot.smol — it is the same app plus a cloud plane. This tombstone entry is retained only to keep already-installed copies running and to redirect the old id; it is not listed and is not installable.", + "display_name": "Smol Machines (renamed \u2192 io.pilot.smol)", + "description": "Renamed to io.pilot.smol. Install io.pilot.smol \u2014 it is the same app plus a cloud plane. This tombstone entry is retained only to keep already-installed copies running and to redirect the old id; it is not listed and is not installable.", "publisher": "ed25519:3QJm6H6OdjtfrF+Es1lrRjfFmdtq2tGvVSWxia63vcI=" }, { "id": "io.telepat.ideon-free", "version": "0.3.1", - "description": "Free article generation for agents: ideon-free.generate(idea) returns a jobId; ideon-free.poll(jobId) returns the finished markdown article. Thin adapter over Ideon's ideon_write — no payment.", + "description": "Free article generation for agents: ideon-free.generate(idea) returns a jobId; ideon-free.poll(jobId) returns the finished markdown article. Thin adapter over Ideon's ideon_write \u2014 no payment.", "bundle_url": "https://github.com/pilot-protocol/catalog/releases/download/ideon-free-v0.3.1/io.telepat.ideon-free-0.3.1.tar.gz", "bundle_sha256": "dd8e37057f33eadefff6b7ff5fc99130667076ea398c10a154c345fd87dd1ad6", "publisher": "ed25519:5cqj+zTVecj8r0YRUShpgFi/g7TxDg1lkDKQzfNyDyc=", @@ -101,7 +101,7 @@ { "id": "io.pilot.slipstream", "version": "1.0.0", - "description": "SLIPSTREAM — Polymarket smart-money leaderboard, signals, tape & opportunities (Ed25519-signed API).", + "description": "SLIPSTREAM \u2014 Polymarket smart-money leaderboard, signals, tape & opportunities (Ed25519-signed API).", "bundle_url": "https://github.com/pilot-protocol/catalog/releases/download/slipstream-v1.0.0/io.pilot.slipstream-1.0.0.tar.gz", "bundle_sha256": "8f19c06c886b97abb1272e8f657773950bee747c58dab8493d454742313ef2f5", "display_name": "Slipstream", @@ -131,7 +131,7 @@ { "id": "io.pilot.miren", "version": "0.1.0", - "description": "Operate the Miren PaaS from an agent: deploy and roll back apps; inspect status, logs, and history; run the server; and diagnose connectivity — plus a passthrough exec for any miren subcommand.", + "description": "Operate the Miren PaaS from an agent: deploy and roll back apps; inspect status, logs, and history; run the server; and diagnose connectivity \u2014 plus a passthrough exec for any miren subcommand.", "display_name": "Miren", "vendor": "Miren", "license": "Proprietary", @@ -163,7 +163,7 @@ { "id": "io.pilot.otto", "version": "0.20.0", - "description": "Drive real Chrome tabs from an agent: extract page content as markdown or HTML, run site commands (Reddit, LinkedIn, Hacker News, Google), screenshot pages, and inspect relay and node status — over a relay to a browser extension, no headless farm. Plus a passthrough exec for any otto subcommand.", + "description": "Drive real Chrome tabs from an agent: extract page content as markdown or HTML, run site commands (Reddit, LinkedIn, Hacker News, Google), screenshot pages, and inspect relay and node status \u2014 over a relay to a browser extension, no headless farm. Plus a passthrough exec for any otto subcommand.", "display_name": "Otto", "vendor": "Telepat", "license": "MIT", @@ -227,7 +227,7 @@ { "id": "io.pilot.postgres", "version": "17.5.0", - "description": "PostgreSQL 17.5.0 as a native CLI for agents: stand up and manage a local Postgres server (initdb / start / stop / createdb) and run SQL with psql — aligned-table or CSV results, backslash schema introspection, database listing, and the full client/server toolchain (pg_dump, pg_restore, pg_isready, ...) via a verbatim-argv passthrough. Connects to a local or remote server via a libpq connection string or PG* env.", + "description": "PostgreSQL 17.5.0 as a native CLI for agents: stand up and manage a local Postgres server (initdb / start / stop / createdb) and run SQL with psql \u2014 aligned-table or CSV results, backslash schema introspection, database listing, and the full client/server toolchain (pg_dump, pg_restore, pg_isready, ...) via a verbatim-argv passthrough. Connects to a local or remote server via a libpq connection string or PG* env.", "display_name": "PostgreSQL", "vendor": "Pilot Protocol", "license": "PostgreSQL", @@ -259,7 +259,7 @@ { "id": "io.pilot.duckdb", "version": "1.5.4", - "description": "DuckDB 1.5.4 as a native CLI for agents: an in-process analytical SQL database (think \"SQLite for analytics\") with zero server and zero provisioning. Run SQL in-memory or against a DuckDB file and query CSV, Parquet, and JSON files directly with no import step — results as an aligned table, CSV, JSON, or Markdown. Schema/table introspection, run a .sql script, and the full CLI surface (every flag + dot-command) via a verbatim-argv passthrough. Ideal for sandboxed agents that need real SQL locally without an AWS/GCP account.", + "description": "DuckDB 1.5.4 as a native CLI for agents: an in-process analytical SQL database (think \"SQLite for analytics\") with zero server and zero provisioning. Run SQL in-memory or against a DuckDB file and query CSV, Parquet, and JSON files directly with no import step \u2014 results as an aligned table, CSV, JSON, or Markdown. Schema/table introspection, run a .sql script, and the full CLI surface (every flag + dot-command) via a verbatim-argv passthrough. Ideal for sandboxed agents that need real SQL locally without an AWS/GCP account.", "display_name": "DuckDB", "vendor": "Pilot Protocol", "license": "MIT", @@ -298,7 +298,7 @@ { "id": "io.pilot.docker", "version": "29.6.1", - "description": "Docker 29.6.1 as a native CLI for agents (Linux): delivers the Docker Engine (dockerd + containerd + runc) and the docker CLI, sha-pinned. Start a local engine (docker.engine_start), then pull images and run containers — run/ps/images/pull/logs, plus build, exec, networks, volumes, and any docker command via a verbatim-argv passthrough. Real containers on a real Linux host, no Docker Desktop.", + "description": "Docker 29.6.1 as a native CLI for agents (Linux): delivers the Docker Engine (dockerd + containerd + runc) and the docker CLI, sha-pinned. Start a local engine (docker.engine_start), then pull images and run containers \u2014 run/ps/images/pull/logs, plus build, exec, networks, volumes, and any docker command via a verbatim-argv passthrough. Real containers on a real Linux host, no Docker Desktop.", "display_name": "Docker", "vendor": "Pilot Protocol", "license": "Apache-2.0", @@ -329,7 +329,7 @@ { "id": "io.pilot.redis", "version": "8.6.2", - "description": "Redis 8.6.2 as a native CLI for agents: stand up a local in-memory data store (redis.start) and talk to it with redis-cli — SET/GET, PING, INFO, DBSIZE, and ANY Redis command (lists, hashes, sets, sorted sets, streams, pub/sub, transactions) via a verbatim-argv passthrough. Server lifecycle (start/stop), health checks, and the full redis-cli/redis-server toolchain (redis-benchmark, redis-check-rdb, ...). No server to provision — runs locally on this host.", + "description": "Redis 8.6.2 as a native CLI for agents: stand up a local in-memory data store (redis.start) and talk to it with redis-cli \u2014 SET/GET, PING, INFO, DBSIZE, and ANY Redis command (lists, hashes, sets, sorted sets, streams, pub/sub, transactions) via a verbatim-argv passthrough. Server lifecycle (start/stop), health checks, and the full redis-cli/redis-server toolchain (redis-benchmark, redis-check-rdb, ...). No server to provision \u2014 runs locally on this host.", "display_name": "Redis", "vendor": "Pilot Protocol", "license": "AGPL-3.0", @@ -368,7 +368,7 @@ { "id": "io.pilot.aegis", "version": "0.1.3", - "description": "AEGIS 0.1.3 — a runtime firewall for AI agents (native CLI): scan files, commands, and tool results for prompt injection, jailbreaks, homoglyph/leetspeak obfuscation, and impersonation before your agent acts on them. L1 Aho-Corasick patterns plus an optional local Qwen3-1.7B judge, fully offline; an 880 KB binary. The scan-cmd/scan-result blocking gates run via aegis.exec (allow 0 / block 2); plus aegis.scan / status / targets / config.", + "description": "AEGIS 0.1.3 \u2014 a runtime firewall for AI agents (native CLI): scan files, commands, and tool results for prompt injection, jailbreaks, homoglyph/leetspeak obfuscation, and impersonation before your agent acts on them. L1 Aho-Corasick patterns plus an optional local Qwen3-1.7B judge, fully offline; an 880 KB binary. The scan-cmd/scan-result blocking gates run via aegis.exec (allow 0 / block 2); plus aegis.scan / status / targets / config.", "display_name": "AEGIS", "vendor": "Pilot Protocol", "license": "MIT", @@ -402,7 +402,7 @@ { "id": "io.pilot.smol", "version": "1.2.0", - "description": "Smol Machines — fast, hardware-isolated Linux microVMs, now local AND cloud. Create/run sub-second microVMs locally with the smolvm CLI, then push a VM to the smol cloud with smol.push. Pilot provisions a per-user cloud key automatically; cloud VMs are isolated per user and billed by real usage against $5 free credit.", + "description": "Smol Machines \u2014 fast, hardware-isolated Linux microVMs, now local AND cloud. Create/run sub-second microVMs locally with the smolvm CLI, then push a VM to the smol cloud with smol.push. Pilot provisions a per-user cloud key automatically; cloud VMs are isolated per user and billed by real usage against $5 free credit.", "display_name": "Smol Machines", "vendor": "smol machines", "license": "Apache-2.0", @@ -445,7 +445,7 @@ { "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.", + "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 \u2014 a parameterized URL shortcut and/or a short UI procedure to execute open-loop \u2014 instead of exploring the DOM; then report_outcome to keep them fresh. Free to use \u2014 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", @@ -484,7 +484,7 @@ { "id": "io.pilot.sqlite", "version": "3.45.2", - "description": "SQLite 3.45.2 as a native SQL database for agents: a zero-server, single-file, transactional (OLTP) SQL engine delivered to the host and fronted as typed methods. Run SQL against a .db file or an in-memory database and get rows back as JSON, run a multi-statement script, introspect the schema and table list, and reach the full sqlite3 CLI (every dot-command and flag — .dump, .import, .backup, CSV/table/markdown output, …) via a verbatim-argv passthrough. The durable, on-disk complement to DuckDB's in-memory analytics — real transactional SQL locally with no server, no provisioning, and no cloud account.", + "description": "SQLite 3.45.2 as a native SQL database for agents: a zero-server, single-file, transactional (OLTP) SQL engine delivered to the host and fronted as typed methods. Run SQL against a .db file or an in-memory database and get rows back as JSON, run a multi-statement script, introspect the schema and table list, and reach the full sqlite3 CLI (every dot-command and flag \u2014 .dump, .import, .backup, CSV/table/markdown output, \u2026) via a verbatim-argv passthrough. The durable, on-disk complement to DuckDB's in-memory analytics \u2014 real transactional SQL locally with no server, no provisioning, and no cloud account.", "display_name": "SQLite", "vendor": "Pilot Protocol", "license": "blessing", @@ -521,30 +521,30 @@ }, { "id": "io.pilot.agentphone", - "version": "0.3.0", - "description": "Give your AI agent a real US/Canada phone number: place and receive voice calls, send and receive SMS/iMessage, and hold threaded conversations — all over REST, metered per user against a $5 budget.", + "version": "0.3.1", + "description": "Give your AI agent a real US/Canada phone number: place and receive voice calls, send and receive SMS/iMessage, and hold threaded conversations \u2014 all over REST, metered per user against a $5 budget.", "display_name": "AgentPhone", "vendor": "AgentPhone", "license": "Apache-2.0", "source_url": "https://github.com/AgentPhone-AI/skills", - "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.0/io.pilot.agentphone-0.3.0-linux-amd64.tar.gz", - "bundle_sha256": "7b7792c7df26be0a1f8bf516b46d4629a31a975fbc4b7586555688cb735471a0", + "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.1/io.pilot.agentphone-0.3.1-linux-amd64.tar.gz", + "bundle_sha256": "d99e8d998b05075931af79376ce4cdb22b8ced435c65f551671fc62f87994d76", "bundles": { "darwin/amd64": { - "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.0/io.pilot.agentphone-0.3.0-darwin-amd64.tar.gz", - "bundle_sha256": "155c5413edd960932d9d70421e7f80d8f6a5f35f492d723e98f3d02a52e9c53d" + "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.1/io.pilot.agentphone-0.3.1-darwin-amd64.tar.gz", + "bundle_sha256": "f49a04ff21ce05727b54e4644dc91f54e24e67396198014b6104714a7c1d1d74" }, "darwin/arm64": { - "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.0/io.pilot.agentphone-0.3.0-darwin-arm64.tar.gz", - "bundle_sha256": "93e4a0c334d45de63c7d96befed9af8a1aa7fb841f54a4d137ec679331a32f6a" + "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.1/io.pilot.agentphone-0.3.1-darwin-arm64.tar.gz", + "bundle_sha256": "a14b6184004bafc4921213172d635139035a7e2588f440f7d6a09a7fc442ff3a" }, "linux/amd64": { - "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.0/io.pilot.agentphone-0.3.0-linux-amd64.tar.gz", - "bundle_sha256": "7b7792c7df26be0a1f8bf516b46d4629a31a975fbc4b7586555688cb735471a0" + "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.1/io.pilot.agentphone-0.3.1-linux-amd64.tar.gz", + "bundle_sha256": "d99e8d998b05075931af79376ce4cdb22b8ced435c65f551671fc62f87994d76" }, "linux/arm64": { - "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.0/io.pilot.agentphone-0.3.0-linux-arm64.tar.gz", - "bundle_sha256": "c40b977bd0e1b28d770911c97bb0bfe342bd6ebe1a375c583e4c440c6836ff78" + "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.agentphone/0.3.1/io.pilot.agentphone-0.3.1-linux-arm64.tar.gz", + "bundle_sha256": "cd6f64a77866bf048d110f58a285316e89e90b8af1f64389ff0484259af8cb36" } }, "metadata_url": "https://raw.githubusercontent.com/pilot-protocol/pilotprotocol/main/catalogue/apps/io.pilot.agentphone/metadata.json", @@ -554,7 +554,7 @@ { "id": "io.pilot.insforge", "version": "1.0.0", - "description": "The agent-native cloud (an AWS for agents) as ONE Pilot app. insforge.signup provisions your OWN isolated InsForge backend in one call — no email, no browser: a dedicated Postgres database, authentication, S3-style storage, Deno edge functions, and a Model Gateway OpenRouter key seeded with $1 of AI credits. Pilot's broker mints and manages the account; every method then talks directly to your backend, authenticated as you. Free to provision — pay only for what your backend uses.", + "description": "The agent-native cloud (an AWS for agents) as ONE Pilot app. insforge.signup provisions your OWN isolated InsForge backend in one call \u2014 no email, no browser: a dedicated Postgres database, authentication, S3-style storage, Deno edge functions, and a Model Gateway OpenRouter key seeded with $1 of AI credits. Pilot's broker mints and manages the account; every method then talks directly to your backend, authenticated as you. Free to provision \u2014 pay only for what your backend uses.", "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.insforge/1.0.0/io.pilot.insforge-1.0.0-linux-amd64.tar.gz", "bundle_sha256": "9e1d05248b99dd66e1482aeda23ece61b2b110601c7848e3fb716f4a79ba47b6", "display_name": "Insforge", @@ -588,7 +588,7 @@ { "id": "io.pilot.orthogonal", "version": "0.1.1", - "description": "Connect your agent to Orthogonal — one key fronting 58 paid APIs / 851 endpoints (lead & contact enrichment, email & phone finding, web & social scraping, AI search, company/people/jobs data, weather, voice). Describe a task in plain English and Orthogonal's router returns the exact APIs to call; execute any of them through a single run, billed at the real per-call price and metered against a per-user $5 budget. Discovery, pricing and balance calls are free.", + "description": "Connect your agent to Orthogonal \u2014 one key fronting 58 paid APIs / 851 endpoints (lead & contact enrichment, email & phone finding, web & social scraping, AI search, company/people/jobs data, weather, voice). Describe a task in plain English and Orthogonal's router returns the exact APIs to call; execute any of them through a single run, billed at the real per-call price and metered against a per-user $5 budget. Discovery, pricing and balance calls are free.", "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.orthogonal/0.1.1/io.pilot.orthogonal-0.1.1-linux-amd64.tar.gz", "bundle_sha256": "3f2c9bfc009e41898b36ff2e88a313c0c3bc8bb39500f9673572a1d40b84fac7", "display_name": "Orthogonal", @@ -622,7 +622,7 @@ { "id": "io.pilot.mysql", "version": "9.7.1", - "description": "MySQL 9.7.1 server + client as a native CLI for agents: a full, real client/server SQL database that runs entirely locally with no cloud account and no provisioning. Initialize a data directory, start a server on 127.0.0.1, create databases, and run SQL — results as an aligned table or TSV — with the actual InnoDB engine (transactions, foreign keys, triggers, JSON, window functions). Lifecycle (initialize/start/stop/ping), createdb, query/query_tsv, databases/tables listing, mysqldump, and the full tool surface via a verbatim-argv passthrough. The transactional server-grade sibling of io.pilot.sqlite and io.pilot.postgres.", + "description": "MySQL 9.7.1 server + client as a native CLI for agents: a full, real client/server SQL database that runs entirely locally with no cloud account and no provisioning. Initialize a data directory, start a server on 127.0.0.1, create databases, and run SQL \u2014 results as an aligned table or TSV \u2014 with the actual InnoDB engine (transactions, foreign keys, triggers, JSON, window functions). Lifecycle (initialize/start/stop/ping), createdb, query/query_tsv, databases/tables listing, mysqldump, and the full tool surface via a verbatim-argv passthrough. The transactional server-grade sibling of io.pilot.sqlite and io.pilot.postgres.", "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.mysql/9.7.1/io.pilot.mysql-9.7.1-linux-amd64.tar.gz", "bundle_sha256": "74e57bee2b99cbef1cc10a1120894c6872027766509f0d8d4b252b93d1d0a9e1", "display_name": "Mysql", @@ -656,7 +656,7 @@ { "id": "io.pilot.didit", "version": "1.0.0", - "description": "Full Didit identity-verification platform over one HTTPS app — KYC/ID, liveness, face match, AML, proof-of-address, database validation, email/phone OTP, plus hosted sessions, workflows, users, billing, blocklists, questionnaires and webhooks. didit.signup mints your own Didit API key in ONE call with no email and no code (Pilot's broker handles the whole signup), caches it locally, and then every method authenticates as you and bills to your own Didit balance (500 free full-KYC checks/month).", + "description": "Full Didit identity-verification platform over one HTTPS app \u2014 KYC/ID, liveness, face match, AML, proof-of-address, database validation, email/phone OTP, plus hosted sessions, workflows, users, billing, blocklists, questionnaires and webhooks. didit.signup mints your own Didit API key in ONE call with no email and no code (Pilot's broker handles the whole signup), caches it locally, and then every method authenticates as you and bills to your own Didit balance (500 free full-KYC checks/month).", "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.didit/1.0.0/io.pilot.didit-1.0.0-linux-amd64.tar.gz", "bundle_sha256": "57c63cf5c51c10871273126b408dae17e2c4cffc5330342d96c648ca95aa29d5", "display_name": "Didit", @@ -690,7 +690,7 @@ { "id": "io.pilot.tldr", "version": "1.13.1", - "description": "tldr (tlrc 1.13.1) as native, example-first documentation for agents: simplified, community-driven man pages for ~7,350+ command-line tools, delivered to the host and fronted as typed methods. Look up a command's cheat-sheet as clean text or raw Markdown, search the whole catalog by keyword, list the directory of documented tools, refresh or inspect the local cache, render a local page, and reach every client flag (--platform, --language, --list-all, --offline, …) via a verbatim-argv passthrough. Open source — MIT client, CC-BY-4.0 pages — self-contained and offline after the first fetch, on macOS and Linux.", + "description": "tldr (tlrc 1.13.1) as native, example-first documentation for agents: simplified, community-driven man pages for ~7,350+ command-line tools, delivered to the host and fronted as typed methods. Look up a command's cheat-sheet as clean text or raw Markdown, search the whole catalog by keyword, list the directory of documented tools, refresh or inspect the local cache, render a local page, and reach every client flag (--platform, --language, --list-all, --offline, \u2026) via a verbatim-argv passthrough. Open source \u2014 MIT client, CC-BY-4.0 pages \u2014 self-contained and offline after the first fetch, on macOS and Linux.", "bundle_url": "https://pub-f09f9a4ea848491198d48e329ba030e3.r2.dev/bundles/io.pilot.tldr/1.13.1/io.pilot.tldr-1.13.1-linux-amd64.tar.gz", "bundle_sha256": "0e73bc90fcf6fd62972cf08171b2c8e56cd2adf43b42e01afdb529f084bc1407", "display_name": "Tldr", @@ -758,4 +758,4 @@ "publisher": "ed25519:BAsg7bdd2t0V9tFCkXRCWRgIdEuuWtJVEjjZp8HBgEg=" } ] -} +} \ No newline at end of file From 9229045b2355c337b62afc4b043c536d9abeb144 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 28 Jul 2026 17:18:14 -0700 Subject: [PATCH 2/2] catalogue: re-sign catalogue.json.sig for 0.3.1 (verifies against trust key) Co-Authored-By: Claude Opus 4.8 (1M context) --- catalogue/catalogue.json.sig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/catalogue/catalogue.json.sig b/catalogue/catalogue.json.sig index f15921f6..040c545e 100644 --- a/catalogue/catalogue.json.sig +++ b/catalogue/catalogue.json.sig @@ -1 +1 @@ -XY4ZhxuRt7CiDv7CLRC02LClcJUMwmYQXcmPlyEQYPG9+tT71Y4AAHLa2n2jQeEjdlYYbycEIcF6pvSv0cL2BQ== +syvhIseWmgaUmh1xuEXDOuH7T8FX0JwUE9j86UwpAWqZwQlpT0G5OazwshuePurdqNQfG7/109f++kIWc3hoDQ== \ No newline at end of file