* update table styling for balances and sources commands
* test
* fix: rename Account name column to Source name for consistency
Committed-By-Agent: claude
- Handle nested `{ error: { message } }` error shape in auth resources
(both CLI and SDK implementations) by replacing the cast-only
`err?.error` interpolation with `extractOAuthErrorMessage`, which
does a runtime typeof check before descending into the object
- Fix `switch (err.error)` in `pollDeviceAuth` to switch on
`extractOAuthErrorCode(err)` so polling continues correctly when a
non-string error arrives (object would never match a string case)
- Fix `error_description` truthy guard to a nullish check so an empty
string from the server is preserved rather than falling back to the
error code
- Replace inline cast-only error extraction in payment-methods,
shipping-address, user-info, and web-bot-auth resources with
`extractErrorMessage` from base.ts, which already handles both
string and nested-object error shapes
- Replace `String(err)` in `useAsyncAction` with `JSON.stringify(err)`
so thrown plain objects produce readable output instead of
[object Object]
- Add tests covering all of the above
Committed-By-Agent: claude
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
The link-api PR (mint#2412595, LINK_AI_WALLET-365) added top-level
`card_brand` and `card_last4` to the RetrieveSpendRequest response so
integrators can identify a card for debugging without expanding the full
`card` object via `include=card`.
Add both fields to the SDK `SpendRequest` type and display them in the
interactive `retrieve` view when the full card is not expanded. The SDK
already passed these through to `--format json` output via its
pass-through cast; this closes the typing and interactive-display gap.
Docs (README, SKILL.md, CLAUDE.md) updated to match.
Committed-By-Agent: claude
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a postinstall script that copies the SKILL.md into
~/.claude/skills/ and ~/.codex/skills/ so the skill is
available globally without being inside the repo. Updated
prepack to bundle the skills directory into dist/.
Committed-By-Agent: claude
Co-authored-by: Claude Opus 4.6 (1M context) <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(mpp): support stripe session challenges alongside charge
Add intent="session" support to the MPP flow. Session challenges use an
open/grantedToken credential shape instead of the bare SPT payload.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Committed-By-Agent: claude
* chore: retrigger CI
Committed-By-Agent: claude
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: surface verification_url in spend-request error output
When the API returns additional_verification_required, surface the
verification_url so users know where to complete stepup verification.
Also fixes interactive mode hanging on error by calling useApp().exit().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Committed-By-Agent: claude
* fix: resolve biome lint and format errors in spend-request commands
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Committed-By-Agent: claude
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: add report command for agent observability
Add `link-cli report` command for reporting purchase outcomes (success,
blocked, abandoned) after every agent purchase attempt.
- packages/cli/src/commands/report/schema.ts — Zod schema using SDK constants
- packages/cli/src/commands/report/index.tsx — Command definition
- packages/cli/src/utils/resource-factory.ts — Add createReportResource()
- packages/cli/src/cli.tsx — Register the command
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Committed-By-Agent: claude
* fix: register report as a leaf command so CLI flags parse
The report command was registered with cli.command('', {...}) under a
router Cli. The empty-string subcommand name broke flag parsing
(`link-cli report --domain ...` treated --domain as a subcommand) and
produced the MCP tool name `report_`. Switch to the leaf-command form
used by demo/onboard — pass options/run directly to Cli.create — and
gate auth with requireAuthGuard inside run, matching spend-request.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Committed-By-Agent: claude
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>