A step-by-step account of the path the agent took on a domain, written so
another agent could follow it. `--step` already records where the agent was
when the outcome occurred; `--attempt-trace` is the whole path.
Sent for every outcome, not just `success`. The dead ends on a failed attempt
are what stop the next agent from spending tokens on them.
The field's value is set almost entirely by how it is described, so the schema
description asks for a specific shape — one numbered line per step, each with
the URL path, the label acted on, the action, and the observed result — and
`skills/create-payment-credential/SKILL.md` carries a worked example. Agents
match an example far more reliably than they follow prose.
Deliberately no zod `.max()`. The API truncates past
`REPORT_ATTEMPT_TRACE_MAX_LENGTH` (8000) and still records the report, so
rejecting client-side would trade a long narrative for a lost outcome.
`--step` and `--freeform-context` keep their `.max(500)` because the API
rejects those outright.
Both the description and the docs tell agents to keep the buyer's personal
data out of it and write `[email]`/`[address]` instead.
Requires the server-side `attempt_trace` field on `POST /agent_observations`,
which ships separately and is not deployed yet. Until it is, the API ignores
the extra key, so sending it is a no-op rather than an error.
Test plan
- `pnpm run test` — 310 tests pass, including new SDK coverage for sending
`attempt_trace` in the body, omitting it, and passing an over-cap value
through unchanged for the server to truncate.
- `pnpm run typecheck` and `pnpm biome check .` clean.
- `node packages/cli/dist/cli.js report --schema` shows `attemptTrace` with no
`maxLength`, while `step`/`freeformContext` keep theirs.
Committed-By-Agent: claude
Orbit-Session-Id: e89d7110-bf81-4181-974b-21b0d5dc0c30
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Add --expires-at support to spend-request create
Mirrors the mint PR (stripe-internal/mint#2484603) that lets allow-listed
OAuth clients request a spend request expiration up to 7 days out instead
of the default 12 hours, for extended/repeat-use agent scenarios.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Committed-By-Agent: claude
* Hide --expires-at from docs and CLI schema output
Most OAuth clients aren't allow-listed for the server-side flag; leaving
it documented in SKILL.md/README.md/schema descriptions would prompt
general agents to try it and hit a 400. The flag stays functional
(same as the existing `approve` field) but drops its description so it
no longer shows up meaningfully in --schema/--llms-full.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Committed-By-Agent: claude
* Note the unit for --expires-at in its schema description
Bare field with no description gave zero signal, but agents seeing an
undocumented integer field could just as easily guess wrong (e.g.
milliseconds). Clarifying the unit alone doesn't explain the gating or
bounds, so it stays unlikely to be tried speculatively.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Committed-By-Agent: claude
* Fix biome formatting on expiresAt schema field
CI was failing pnpm biome check on the line-length wrap for the
one-line describe() call added in 1b6021f.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Committed-By-Agent: claude
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* Add MPP inspect command
* feat: rework mpp pay to handle full end-to-end 402 flow
mpp pay now probes the URL for a 402 challenge, parses the
WWW-Authenticate header to extract network_id and amount, creates a
spend request, yields the approval URL for the agent to present, and
completes payment with the SPT after approval.
- Remove mpp inspect (subsumed into pay flow)
- Add --context, --amount, --payment-method-id, --test flags
- Make --spend-request-id optional (backward compat)
- Agent mode yields approval URL immediately with _next hints
- Interactive mode handles full flow inline with polling
- Update SKILL.md and CLAUDE.md with new flow docs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Committed-By-Agent: claude
* fix: update mpp pay tests to handle generator array output
The mpp pay command now uses an async generator (`async *run`) which
wraps yielded values in an array in JSON output mode. Update three
tests to extract [0] from the output array.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Committed-By-Agent: claude
* refactor: remove auto-generated context and step translation layer in mpp pay
Context is now required (min 100 chars) for the full MPP flow — agents must
provide a meaningful description. Also refactors onStep to emit typed Step
values directly, removing the string-to-enum mapping in the component.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Committed-By-Agent: claude
* revert version bump in SKILL.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Committed-By-Agent: claude
* fix: remove extra blank line to pass biome format check
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Committed-By-Agent: claude
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: add serve command to expose MCP endpoint over HTTP
Committed-By-Agent: claude
* fix: cleanup and readme
* Potential fix for pull request finding 'CodeQL / Information exposure through a stack trace'
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
---------
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
* feat: add noRefresh option to createAccessTokenProvider
Committed-By-Agent: claude
* feat: add env-based token provider to ResourceFactory
Committed-By-Agent: claude
* feat: read LINK_ACCESS_TOKEN, LINK_REFRESH_TOKEN, LINK_NO_REFRESH from env
Committed-By-Agent: claude
* docs: add LINK_ACCESS_TOKEN, LINK_REFRESH_TOKEN, LINK_NO_REFRESH to env vars docs
Committed-By-Agent: claude
* fix: auth status shows LINK_ACCESS_TOKEN state instead of stored credentials
Committed-By-Agent: claude
* refactor: extract resolveAuthInfo helper, simplify auth status component
Committed-By-Agent: claude
* fix: formatting
* support polling straight from auth login
* improvements
* sanitize output; make the polling into a shared helper and share across the auth login polling and the auth status polling
Server-returned string fields (merchant_name, line_items[].name,
billing_address.*, payment method brand/nickname) are now sanitized
before rendering in Ink components using strip-ansi plus control
character stripping. This prevents terminal escape sequence injection
that could spoof the approval UI.
Committed-By-Agent: claude
Co-authored-by: Ben Davis <ben@bencdavis.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* commands to cancel a spend request
* document
* nit: remove unneeded status text
* code improvements
* Fix typecheck
* Just go back to old promise approach
* migrate commander -> incur enabling mcp server
* save
* use incur skill handling and clarify to use mcp if running
* add changeset
* fix type error
* fix fmt
* fix tests
* fmt