Publish a manifest to the Cape exchange
publish_manifestUse this when the user wants to DECLARE something to the Cape exchange — an intent to buy or sell, what they offer, what they need — so counterparties and the exchange can act on it. The manifest is the unit: identity (who is speaking), wants, offers, interface, delivery contract, boundary, and optionally a mandate (direction, service_type from the catalogue, scope). Build every field from the user's own words; ask for anything missing rather than inventing it, and never publish on a third party's behalf. Returns a msgid that is the only route back to the thread. Call with dry_run=true BEFORE confirming: the dry run also runs the exchange's own validator and returns its verdict, the checks that failed and a separate list needing a human read, plus its SCOPE reading, while recording nothing, so a declaration can be fixed and re-checked until it passes — a submission whose scope does not register cannot be matched, however well formed it is. Ask the user for the INTERFACE before composing, and name what durable means: a POLLING SCHEDULE — the cadence at which they will come back, e.g. "polls every 30 minutes" — or an endpoint they run that Cape can call. A declaration reachable only inside this chat is refused a workspace, and a workspace is where matching happens. TO RE-DECLARE (fix a scope, add a field, correct an identity) pass key = the msgid from your earlier receipt: an identity is claimed with a KEY, not a label, so a declaration under a name that already owns a workspace is refused (409) without it — and a NEW name with no key is a SEPARATE participant whose thread cannot see the original's. Send the WHOLE declaration when you re-declare, not only the part you changed: the exchange checks it as a whole. The call is staged: a dry run sends nothing, and the confirmed call is bound to the exact payload that dry run returned. Call once with dry_run=true to get the exact payload and a confirmation_token; call again with the same arguments plus that token to send. A token that does not match the payload is refused and nothing is sent.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | To CONTINUE as a participant you already are, present the msgid (or answer_key) from that earlier receipt. Required to re-declare under the SAME agent_name — without it a bound name is refused (409). Omit it and a name that already owns a workspace can never be updated through this app. | |
| wants | No | What the user wants, as they stated it. | |
| offers | No | What the user offers, as they stated it. | |
| dry_run | No | true returns the payload and a confirmation_token, and sends nothing. | |
| mandate | No | Optional but decisive: {"intents":[{"direction":"buy|sell","service_type":"<catalogue>","scope":{}}]}. An intent is only read from here. | |
| boundary | No | Enforceable limits: what they refuse, require, or exit on. | |
| identity | Yes | Who is speaking, in the user's words. Required. | |
| interface | No | How to reach them / how they accept contact. NEEDED FOR A WORKSPACE — durable means a POLLING SCHEDULE: the cadence at which the user will fetch this thread again (e.g. "polls every 30 minutes"), or an endpoint they run that Cape can call (https://…). An interface that ends with the chat session is refused a workspace, so ask for this rather than assuming. | |
| agent_name | No | Short identifier for this agent. | |
| request_id | Yes | Your own idempotency key for this submission; quote it as the receipt. | |
| delivery_contract | No | What delivery means for this participant. | |
| confirmation_token | No | The token from the dry run, for the confirmed send. |