@xona-labs/xpay 0.2.24 → 0.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/CHANGELOG.md +101 -78
  2. package/README.md +71 -69
  3. package/SKILL.md +22 -22
  4. package/dist/agenc/api.d.ts +8 -8
  5. package/dist/agenc/api.js +11 -11
  6. package/dist/agenc/hire.d.ts +4 -4
  7. package/dist/agenc/hire.js +17 -17
  8. package/dist/agenc/price.d.ts +1 -1
  9. package/dist/agenc/price.js +1 -1
  10. package/dist/biometric/index.d.ts +3 -3
  11. package/dist/biometric/index.js +6 -6
  12. package/dist/cli/accounts.d.ts +1 -1
  13. package/dist/cli/accounts.js +1 -1
  14. package/dist/cli/agenc.d.ts +2 -2
  15. package/dist/cli/agenc.js +4 -4
  16. package/dist/cli/balance.d.ts +1 -1
  17. package/dist/cli/balance.js +4 -4
  18. package/dist/cli/bento.d.ts +3 -3
  19. package/dist/cli/bento.js +8 -8
  20. package/dist/cli/bento.js.map +1 -1
  21. package/dist/cli/biometric.d.ts +1 -1
  22. package/dist/cli/biometric.js +8 -8
  23. package/dist/cli/common.js +6 -6
  24. package/dist/cli/common.js.map +1 -1
  25. package/dist/cli/discover.d.ts +2 -2
  26. package/dist/cli/discover.js +4 -4
  27. package/dist/cli/guardrail.d.ts +1 -1
  28. package/dist/cli/guardrail.js +3 -3
  29. package/dist/cli/index.d.ts +2 -2
  30. package/dist/cli/index.js +12 -12
  31. package/dist/cli/init.d.ts +1 -1
  32. package/dist/cli/init.js +2 -2
  33. package/dist/cli/magicblock.d.ts +1 -1
  34. package/dist/cli/magicblock.js +4 -4
  35. package/dist/cli/mcp-server.d.ts +2 -2
  36. package/dist/cli/mcp-server.d.ts.map +1 -1
  37. package/dist/cli/mcp-server.js +25 -22
  38. package/dist/cli/mcp-server.js.map +1 -1
  39. package/dist/cli/pay.d.ts +1 -1
  40. package/dist/cli/pay.js +1 -1
  41. package/dist/cli/report.d.ts +2 -2
  42. package/dist/cli/report.js +4 -4
  43. package/dist/cli/report.js.map +1 -1
  44. package/dist/cli/sana.d.ts +1 -1
  45. package/dist/cli/sana.js +3 -3
  46. package/dist/cli/shop.d.ts +1 -1
  47. package/dist/cli/shop.js +1 -1
  48. package/dist/cli/swap.d.ts +1 -1
  49. package/dist/cli/swap.js +3 -3
  50. package/dist/cli/token.d.ts +2 -2
  51. package/dist/cli/token.js +2 -2
  52. package/dist/cli/trade.d.ts +2 -2
  53. package/dist/cli/trade.js +8 -8
  54. package/dist/cli/trade.js.map +1 -1
  55. package/dist/cli/transfer.d.ts +1 -1
  56. package/dist/cli/transfer.js +1 -1
  57. package/dist/cli/x.d.ts +1 -1
  58. package/dist/cli/x.js +1 -1
  59. package/dist/cli/zauth.d.ts +1 -1
  60. package/dist/cli/zauth.js +5 -5
  61. package/dist/discover/cache.js +1 -1
  62. package/dist/discover/index.d.ts +2 -2
  63. package/dist/discover/index.js +6 -6
  64. package/dist/discover/orbitx402.d.ts +2 -2
  65. package/dist/discover/orbitx402.js +1 -1
  66. package/dist/discover/payai.js +1 -1
  67. package/dist/do/index.d.ts +2 -2
  68. package/dist/do/index.js +1 -1
  69. package/dist/guardrail/index.d.ts +4 -4
  70. package/dist/guardrail/index.js +14 -14
  71. package/dist/guardrail/index.js.map +1 -1
  72. package/dist/index.d.ts +7 -7
  73. package/dist/index.js +2 -2
  74. package/dist/magicblock/client.d.ts +2 -2
  75. package/dist/magicblock/client.js +4 -4
  76. package/dist/profile/index.d.ts +3 -3
  77. package/dist/profile/index.js +3 -3
  78. package/dist/profile/storage.d.ts +1 -1
  79. package/dist/profile/storage.js +4 -4
  80. package/dist/profile/types.d.ts +6 -6
  81. package/dist/profile/types.js +1 -1
  82. package/dist/report/index.d.ts +1 -1
  83. package/dist/report/index.js +2 -2
  84. package/dist/sana/tools.js +8 -8
  85. package/dist/signers/raw-evm.d.ts +1 -1
  86. package/dist/signers/raw-evm.js +5 -5
  87. package/dist/signers/raw-solana.d.ts +1 -1
  88. package/dist/signers/raw-solana.js +4 -4
  89. package/dist/swap/index.d.ts +6 -6
  90. package/dist/swap/index.js +12 -12
  91. package/dist/token/index.d.ts +8 -8
  92. package/dist/token/index.js +14 -14
  93. package/dist/token/rwa.d.ts +3 -3
  94. package/dist/token/rwa.js +3 -3
  95. package/dist/tools/index.d.ts +15 -1
  96. package/dist/tools/index.d.ts.map +1 -1
  97. package/dist/tools/index.js +71 -31
  98. package/dist/tools/index.js.map +1 -1
  99. package/dist/trading/discovery.d.ts +6 -6
  100. package/dist/trading/discovery.js +7 -7
  101. package/dist/trading/index.d.ts +6 -6
  102. package/dist/trading/index.js +13 -13
  103. package/dist/transfer/index.d.ts +4 -4
  104. package/dist/transfer/index.js +8 -8
  105. package/dist/types.d.ts +7 -7
  106. package/dist/use/index.d.ts +5 -5
  107. package/dist/use/index.js +20 -20
  108. package/dist/wallet/index.d.ts +2 -2
  109. package/dist/wallet/index.js +3 -3
  110. package/dist/x402/evm-payment.d.ts +4 -4
  111. package/dist/x402/evm-payment.js +6 -6
  112. package/dist/x402/extract.d.ts +1 -1
  113. package/dist/x402/extract.js +1 -1
  114. package/dist/x402/svm-payment.d.ts +2 -2
  115. package/dist/x402/svm-payment.js +2 -2
  116. package/dist/zauth/index.d.ts +4 -4
  117. package/dist/zauth/index.js +5 -5
  118. package/package.json +4 -3
package/CHANGELOG.md CHANGED
@@ -6,6 +6,29 @@ versioning follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.25] – 2026-08-07
10
+
11
+ ### Changed
12
+ - **Rebranded to Xona Wallet.** The product name in the README, SKILL.md, and
13
+ on the site is now "Xona Wallet". The SDK surface is deliberately unchanged:
14
+ the npm package is still `@xona-labs/xpay`, the CLI is still `xpay`, the MCP
15
+ tools are still `xpay_*`, and the registry entry is still
16
+ `io.github.xona-labs/xpay`. Nothing to migrate.
17
+ - Site moved from `xpay.xona-agent.com` to `wallet.xona-agent.com`. The npm
18
+ `homepage` and the registry `websiteUrl` point at the new domain. The hosted
19
+ MCP endpoint is now `https://wallet.xona-agent.com/mcp`.
20
+ - Registry and npm metadata now carry the brand: `server.json` description is
21
+ "Xona Wallet: agent wallet for AI agents..." (82 chars, under the registry's
22
+ 100-char cap) and `xona-wallet` was added to the npm keywords. The former
23
+ name stays indexed on the site, since every existing link says xpay.
24
+ - Copy no longer uses em-dashes anywhere: docs, site, code comments, and
25
+ user-facing strings such as CLI output and error messages.
26
+
27
+ ### Note
28
+ - 0.2.24 shipped to npm but was never tagged `v0.2.24`, so the MCP Registry
29
+ never picked it up and stayed on 0.2.23. Tagging `v0.2.25` carries both the
30
+ Stable chain release and this one to the registry in a single publish.
31
+
9
32
  ## [0.2.24] – 2026-08-07
10
33
 
11
34
  ### Added
@@ -15,14 +38,14 @@ versioning follows [Semantic Versioning](https://semver.org/).
15
38
  (`0x779Ded0c9e1022225f8E0630b35a9b54bE713736`, 6 decimals as an ERC-20)
16
39
  rather than USDC.
17
40
  - A Stable signer is registered on every profile from the existing derived
18
- EVM key same treatment as Robinhood Chain so `stable` works without
41
+ EVM key, same treatment as Robinhood Chain, so `stable` works without
19
42
  re-running `xpay init` or editing `networks`.
20
43
  - `xpay balance` / `xpay_balance` show a `stable` row: USDT0 plus the native
21
44
  USDT gas coin (18 decimals, listed separately since the two share a name).
22
45
  USDT0 counts toward the stablecoin total.
23
46
  - Payment routing: a 402 quoting `eip155:988` resolves to the Stable signer,
24
47
  and the balance-aware picker compares USDT0 against the quoted price.
25
- Payment stays gasless the EIP-3009 typed-data path reads USDT0's EIP-712
48
+ Payment stays gasless - the EIP-3009 typed-data path reads USDT0's EIP-712
26
49
  domain (`USDT0` / `1`) from the live challenge's `extra`, which is the only
27
50
  reliable source since `version()` and `eip712Domain()` revert on that
28
51
  contract.
@@ -109,7 +132,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
109
132
  boots in a **locked mode** instead: the connection succeeds, all tools are
110
133
  listed, and every call returns an actionable error telling the user exactly
111
134
  how to unlock (add `XPAY_PASSPHRASE` to the server's `env` in the host
112
- config, or `xpay biometric enable` on macOS) which the agent can relay
135
+ config, or `xpay biometric enable` on macOS) - which the agent can relay
113
136
  in-chat. Any other boot failure also falls back to locked mode with the
114
137
  underlying error, instead of killing the connection.
115
138
 
@@ -127,8 +150,8 @@ versioning follows [Semantic Versioning](https://semver.org/).
127
150
  ### Fixed
128
151
  - **EVM x402 payments demanded native ETH gas despite the scheme being
129
152
  gasless.** Paying an `eip155:*` endpoint (e.g. xona's Base video routes)
130
- went through the legacy v1 path a literal `erc20.transfer()` broadcast
131
- from the wallet so gasless agent wallets died with "insufficient funds
153
+ went through the legacy v1 path, a literal `erc20.transfer()` broadcast
154
+ from the wallet, so gasless agent wallets died with "insufficient funds
132
155
  for intrinsic transaction cost". EVM now gets the same canonical v2
133
156
  treatment Solana has had since 0.1.4: the client signs an off-chain
134
157
  EIP-3009 `transferWithAuthorization` (EIP-712), sends it in `X-Payment`,
@@ -136,14 +159,14 @@ versioning follows [Semantic Versioning](https://semver.org/).
136
159
 
137
160
  ### Added
138
161
  - `Signer.signEvmTypedData` (optional capability, implemented by
139
- `rawEvmSigner`) EIP-712 typed-data signing; custom KMS/MPC signers can
162
+ `rawEvmSigner`) - EIP-712 typed-data signing; custom KMS/MPC signers can
140
163
  implement it to opt into gasless EVM payments.
141
164
  - `buildEvmPaymentHeader` / `isEvmNetwork` / `hasEvmDomainParams` in
142
165
  `src/x402/evm-payment.ts`, mirroring the SVM v2 header builder.
143
166
 
144
167
  ### Changed
145
168
  - Catalog-mode `use()` now falls back to the live 402 challenge for EVM
146
- requirements missing EIP-712 domain params (`extra.name`/`version`)
169
+ requirements missing EIP-712 domain params (`extra.name`/`version`) -
147
170
  catalog snapshots strip `extra`, and without the domain the gasless
148
171
  signature can't be built (previously this silently took the gas-burning
149
172
  legacy path). Same pattern as the existing SVM `feePayer` fallback.
@@ -155,7 +178,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
155
178
  parameter (`['agenc']` / `['orbitx402']`) and the CLI gains
156
179
  `xpay discover --sources agenc`. Mixed results reserve only ~1/3 of the
157
180
  result slots for AgenC (2 of the default 5), which made "show me AgenC
158
- listings" look like the marketplace had two items a single-source browse
181
+ listings" look like the marketplace had two items - a single-source browse
159
182
  now returns everything (default limit 50), and the tool description tells
160
183
  agents to use it when the user asks about AgenC specifically.
161
184
 
@@ -170,7 +193,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
170
193
 
171
194
  ### Changed
172
195
  - **AgenC reads now use the SDK's hosted-indexer client** (`createIndexerClient`
173
- → `listActiveListings` / `getListing`) AgenC's documented "intended scale
196
+ → `listActiveListings` / `getListing`) - AgenC's documented "intended scale
174
197
  read path". Discovery is back to the full active catalog; the freshness
175
198
  check is a single typed lookup. SDK bumped `^0.8.0` → `^0.10.0`.
176
199
  - **Hires are now resilient to AgenC program upgrades.** The moderation
@@ -186,7 +209,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
186
209
 
187
210
  ### Fixed
188
211
  - **zauth reposcan polling broke after the first check.** zauth's poll
189
- responses echo only `{ status, scanId, progress }` no `sessionToken`
212
+ responses echo only `{ status, scanId, progress }`, no `sessionToken`,
190
213
  so the scanning check never matched: the poll loop exited immediately and
191
214
  the MCP result dropped the sessionToken, leaving agents with just the
192
215
  scanId. Agents then passed the scanId to `xpay_zauth_scan_status` and got
@@ -200,14 +223,14 @@ versioning follows [Semantic Versioning](https://semver.org/).
200
223
  per scan (Solana or Base); session tokens are JWTs valid ~1 hour.
201
224
  - Completed zauth reports are compacted for MCP/CLI display: the bulky
202
225
  `matches` array (full file contents, tens of KB) is replaced by a
203
- `matchCount` `analysisMarkdown` + `zauthScore` carry the summary.
226
+ `matchCount` - `analysisMarkdown` + `zauthScore` carry the summary.
204
227
  `xpay zauth reposcan --json` still emits the full raw report.
205
228
 
206
229
  ## [0.2.11] – 2026-07-06
207
230
 
208
231
  ### Added
209
232
  - **zauth repo security scans (partner integration).** `xpay zauth reposcan
210
- <repoUrl>` CLI and `xpay_zauth_reposcan` MCP tool scans a git repository
233
+ <repoUrl>` CLI and `xpay_zauth_reposcan` MCP tool - scans a git repository
211
234
  via zauth's x402-paywalled endpoint through the normal payment flow
212
235
  (guardrail caps apply; price set by zauth's 402 challenge). Only the scan
213
236
  kickoff is paid: results are polled from a free status endpoint, with
@@ -219,8 +242,8 @@ versioning follows [Semantic Versioning](https://semver.org/).
219
242
 
220
243
  ### Fixed
221
244
  - **Token-2022 balances were invisible.** `tokenBalances()` only scanned the
222
- classic SPL token program, so tokens on the Token-2022 program including
223
- most pump.fun mints never appeared in `xpay balance` / `xpay_balance`,
245
+ classic SPL token program, so tokens on the Token-2022 program, including
246
+ most pump.fun mints, never appeared in `xpay balance` / `xpay_balance`,
224
247
  even right after swapping into them. Both token programs are scanned now,
225
248
  and the 0.2.9 Jupiter enrichment labels and prices them.
226
249
 
@@ -232,18 +255,18 @@ versioning follows [Semantic Versioning](https://semver.org/).
232
255
  built-in registry displayed as a truncated mint with no price. Balances are
233
256
  now enriched via one batched Jupiter lookup: real symbol/name for unknown
234
257
  mints, per-token `usdValue`, a portfolio total, and an `⚠ unverified` flag
235
- on suspicious tokens. Fails soft if Jupiter is unreachable, balances
258
+ on suspicious tokens. Fails soft - if Jupiter is unreachable, balances
236
259
  render exactly as before. New SDK export: `enrichTokenBalances()`.
237
260
 
238
261
  ## [0.2.8] – 2026-07-04
239
262
 
240
263
  ### Added
241
264
  - **Realtime X (Twitter) data, zero setup.** `xpay x user <handle>` /
242
- `xpay x posts <handle>` CLI and `xpay_x_user` / `xpay_x_posts` MCP tools
265
+ `xpay x posts <handle>` CLI and `xpay_x_user` / `xpay_x_posts` MCP tools -
243
266
  live profile (followers, bio, verification) and recent posts with
244
267
  engagement metrics. Calls xona's x402-paywalled proxy of the X API v2 and
245
268
  pays per call from the wallet at **cost price** (~$0.01 profile, ~$0.06 for
246
- 10 posts passthrough of X's pay-per-use billing, no markup). No X
269
+ 10 posts - passthrough of X's pay-per-use billing, no markup). No X
247
270
  developer account or API key needed; guardrail caps apply like any paid
248
271
  call. Endpoint override: `XPAY_XDATA_ENDPOINT`.
249
272
 
@@ -254,7 +277,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
254
277
  a code-execution tool sometimes hand-rolled swap scripts (bypassing the
255
278
  guardrail and token-verification safety) instead of calling the tool. The
256
279
  descriptions now explicitly forbid custom swap code and state that
257
- `xpay_swap` is the single quote+sign+execute step while also making clear
280
+ `xpay_swap` is the single quote+sign+execute step - while also making clear
258
281
  that `xpay_token_find` alone answers informational questions and a swap
259
282
  must never follow automatically unless the user asked to trade.
260
283
 
@@ -262,11 +285,11 @@ versioning follows [Semantic Versioning](https://semver.org/).
262
285
 
263
286
  ### Added
264
287
  - **Solana token discovery.** `xpay token find <query>` / `xpay.findTokens()` /
265
- MCP `xpay_token_find` search any Solana token by ticker, name, or mint via
288
+ MCP `xpay_token_find` - search any Solana token by ticker, name, or mint via
266
289
  Jupiter Token API v2 (keyless). Returns price, market cap, liquidity, and
267
290
  Jupiter's verification flag, ranked verified-first.
268
291
  - **Native token swap.** `xpay swap <amount> <from> <to>` / `xpay.swap()` /
269
- MCP `xpay_swap` swap tokens inside the user's own wallet via Jupiter Swap
292
+ MCP `xpay_swap` - swap tokens inside the user's own wallet via Jupiter Swap
270
293
  API v2 (order → partial-sign → managed execute; keyless). Accepts symbols or
271
294
  mint addresses; bare tickers resolve only to verified tokens (ambiguous
272
295
  tickers error with a candidate list; unverified tokens require the exact
@@ -282,7 +305,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
282
305
 
283
306
  ### Fixed
284
307
  - SKILL.md still documented the removed `xpay_transfer_confirm` staging flow
285
- (dropped in 0.2.2) rewritten for direct execution with guardrail gating.
308
+ (dropped in 0.2.2) - rewritten for direct execution with guardrail gating.
286
309
 
287
310
  ## [0.2.5] – 2026-07-04
288
311
 
@@ -292,7 +315,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
292
315
  `moderator` argument in the hire instruction (P1.2 moderation gate) that
293
316
  SDK 0.7.1 predates. Bumped `@tetsuo-ai/marketplace-sdk` to `^0.8.0` and
294
317
  made the hire path resolve the listing's on-chain moderation record
295
- (`["listing_moderation", listing, specHash]` PDA derivable without
318
+ (`["listing_moderation", listing, specHash]` PDA - derivable without
296
319
  knowing the moderator; the record itself names the moderator), passing
297
320
  `moderator` + the explicit `listingModeration` account. Verified against
298
321
  mainnet by transaction simulation (executes cleanly end-to-end) and against
@@ -311,17 +334,17 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
311
334
  - **AgenC marketplace (agenc.ag) as a discovery source with smart-routed
312
335
  execution.** Hireable AgenC listings now appear in `xpay discover` /
313
336
  `xpay_discover` alongside x402 services (marked `metadata.source: "agenc"`,
314
- priced in SOL). Discovery merges sources with failure isolation one
315
- catalog going down no longer breaks discovery and reserves result slots so
337
+ priced in SOL). Discovery merges sources with failure isolation, one
338
+ catalog going down no longer breaks discovery, and reserves result slots so
316
339
  marketplace listings aren't drowned out by the 21k-item x402 catalog. Opt
317
340
  out with `XPAY_DISCOVERY_SOURCES=orbitx402` or `discover({ sources })`.
318
341
  - **Smart execution routing in `use()`.** AgenC resources are detected by
319
342
  their `agenc-hire` payment scheme and executed as on-chain SOL escrow hires
320
- via `@tetsuo-ai/marketplace-sdk` (humanless entry point tasks pin to
343
+ via `@tetsuo-ai/marketplace-sdk` (humanless entry point - tasks pin to
321
344
  CreatorReview, so escrow never auto-releases without the buyer's
322
345
  acceptance). x402 resources keep the existing payment path; same
323
346
  `use()`/`do()` API for both. The result of a hire is a receipt
324
- (`task`, `hireRecord`, `txSig`, explorer link) the provider works
347
+ (`task`, `hireRecord`, `txSig`, explorer link) - the provider works
325
348
  asynchronously.
326
349
  - **CLI `xpay agenc hire <listingPda>` / `xpay agenc status <taskPda>`** and
327
350
  MCP tool `xpay_agenc_status` for tracking hire progress.
@@ -331,7 +354,7 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
331
354
  while caps are configured.
332
355
  - Examples: `examples/agenc-hire.ts` (live discover → hire → poll) and
333
356
  `examples/agenc-local-sandbox.ts` (full hire lifecycle against the real
334
- compiled program in-process via litesvm no RPC, no SOL spent).
357
+ compiled program in-process via litesvm - no RPC, no SOL spent).
335
358
 
336
359
  ### Changed
337
360
  - `@solana/kit` bumped `^5.5.1` → `^6.9.0` (required by the AgenC SDK;
@@ -345,7 +368,7 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
345
368
  and return a 6-digit code, requiring a second `xpay_transfer_confirm` call to
346
369
  actually move funds. Agents routinely skipped the follow-up call, read the
347
370
  `"Transfer staged…"` response as a receipt, and reported success with a
348
- **hallucinated transaction hash** a hash that never hit the chain (not on
371
+ **hallucinated transaction hash** - a hash that never hit the chain (not on
349
372
  Solscan, no funds moved). This affected private (MagicBlock PER) transfers in
350
373
  particular. The terminal path was never affected because it executes directly.
351
374
  `xpay_transfer` now runs the same direct path as the CLI, and
@@ -355,7 +378,7 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
355
378
  - **The transfer spending gate no longer depends on the agent making a second
356
379
  tool call.** Safety comes from the guardrail (per-tx / per-day caps +
357
380
  `requireApprovalAbove`), which on MCP surfaces as a Touch ID prompt when
358
- biometric unlock is enabled a gate the model cannot fake or skip. Set
381
+ biometric unlock is enabled - a gate the model cannot fake or skip. Set
359
382
  `xpay guardrail --require-approval-above 0` with biometric enabled to require
360
383
  approval on every transfer.
361
384
 
@@ -367,7 +390,7 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
367
390
  on-chain wallet registration, and the ALLOW / BLOCKED / ESCALATED verdicts),
368
391
  the MCP tool list re-includes `xpay_bento_status` / `xpay_bento_enable` /
369
392
  `xpay_bento_disable`, and SKILL.md re-adds the tools plus a safety note. No
370
- code change the firewall shipped in 0.1.28; this release publishes the docs
393
+ code change - the firewall shipped in 0.1.28; this release publishes the docs
371
394
  to npm.
372
395
 
373
396
  ## [0.2.0] – 2026-06-23
@@ -376,10 +399,10 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
376
399
 
377
400
  ### Easiest onboarding
378
401
  - **Zero-config wallet provisioning.** Drop the MCP server into any agent host
379
- with no env the agent is given its own persistent wallet on first boot
402
+ with no env - the agent is given its own persistent wallet on first boot
380
403
  (address printed to stderr to fund). Bring-your-own-key and existing profiles
381
404
  still take precedence.
382
- - **`SKILL.md`** a framework-agnostic guide so any agent (Claude, Codex,
405
+ - **`SKILL.md`**: a framework-agnostic guide so any agent (Claude, Codex,
383
406
  OpenAI, Gemini, custom) can drive xPay's tools, kept current with this release.
384
407
 
385
408
  ### Smart pay routing
@@ -398,14 +421,14 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
398
421
 
399
422
  ### Reporting
400
423
  - Comprehensive on-chain USDC usage report (daily / weekly / monthly) via
401
- OrbitX402 summary, timeline, top counterparties, and biggest transactions.
424
+ OrbitX402 - summary, timeline, top counterparties, and biggest transactions.
402
425
 
403
426
  ## [0.1.31] – 2026-06-23
404
427
 
405
428
  ### Fixed
406
429
  - **Payments now work against x402 servers that expect a `Payment-Signature`
407
430
  header.** The retry attaches the payment payload under both `X-PAYMENT` (the
408
- common name) and `Payment-Signature` some providers (e.g. Nansen) only read
431
+ common name) and `Payment-Signature` - some providers (e.g. Nansen) only read
409
432
  the latter and were silently returning `402 Payment Required` even though the
410
433
  payload was valid. Confirmed against the live Nansen endpoint: the same
411
434
  payload that was ignored under `X-PAYMENT` is accepted under
@@ -418,11 +441,11 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
418
441
  ### Fixed
419
442
  - **`use` no longer attempts a payment on an unfunded network.** 0.1.29's
420
443
  balance-aware picker fell back to the "best-funded" option when none could
421
- cover the cost which, with everything at $0, still tried to pay and surfaced
444
+ cover the cost - which, with everything at $0, still tried to pay and surfaced
422
445
  a raw `402 Payment Required` from the provider. Now, when multiple networks
423
446
  are payable but none has the funds, `use` raises a clear error listing each
424
447
  network's USDC balance (e.g. *"insufficient USDC balance to pay on any funded
425
- network base $0.00, solana $0.00"*) instead. The settlement flow itself is
448
+ network - base $0.00, solana $0.00"*) instead. The settlement flow itself is
426
449
  unchanged. A single-network resource is still attempted as before (funding is
427
450
  left to the payment flow).
428
451
 
@@ -432,31 +455,31 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
432
455
  - **`use` now picks the payment network by balance, not by list order.** When a
433
456
  resource accepts multiple networks (e.g. Base *and* Solana), xPay reads the
434
457
  wallet balance on each and pays from the first option that can cover the cost
435
- so a $0 Base wallet automatically falls through to a funded Solana one.
458
+ - so a $0 Base wallet automatically falls through to a funded Solana one.
436
459
  Previously it always took the first listed option (usually Base) and failed
437
460
  if that wallet was empty. Both the catalog and live-402 paths use the new
438
461
  picker. Single-network resources are unaffected (no extra balance lookups).
439
462
  Falls back to the best-funded option when none can cover the cost outright.
440
463
 
441
464
  ### Added
442
- - **`Wallet.pickRequirementByBalance()`** the async, balance-aware selector
465
+ - **`Wallet.pickRequirementByBalance()`**: the async, balance-aware selector
443
466
  behind the above. `pickRequirement()` (first-match, sync) is retained.
444
467
 
445
468
  ### Added
446
469
  - **Bento firewall controls exposed as MCP tools.** Agents can now manage the
447
470
  intent firewall directly, not just via the CLI:
448
- - `xpay_bento_status` read whether screening is on (and the agent wallet to register).
449
- - `xpay_bento_enable` turn it on; returns the agent wallet address to register at app.bentoguard.xyz.
450
- - `xpay_bento_disable` turn it off; the escape hatch when the wallet isn't registered and payments are being rejected.
471
+ - `xpay_bento_status` - read whether screening is on (and the agent wallet to register).
472
+ - `xpay_bento_enable` - turn it on; returns the agent wallet address to register at app.bentoguard.xyz.
473
+ - `xpay_bento_disable` - turn it off; the escape hatch when the wallet isn't registered and payments are being rejected.
451
474
  Enable/disable take effect live on the running guardrail (no restart) and
452
- persist to the profile. Only available on profile-backed wallets raw-key
475
+ persist to the profile. Only available on profile-backed wallets - raw-key
453
476
  (`XPAY_SOLANA_SECRET`) mode reports `profileBacked: false`.
454
477
  - **`Guardrail.bentoEnabled()` / `setBentoEnabled()`** for runtime toggling.
455
478
 
456
479
  ## [0.1.27] – 2026-06-23
457
480
 
458
481
  ### Added
459
- - **`SKILL.md` framework-agnostic onboarding guide.** A single page that
482
+ - **`SKILL.md` - framework-agnostic onboarding guide.** A single page that
460
483
  teaches any agent (Claude, Codex, OpenAI, Gemini, custom) how to drive xPay:
461
484
  zero-config setup, the tool surface, the pay-per-call model, the safety rules
462
485
  (guardrail, transfer confirmation, Bento), and copy-paste recipes. Shipped in
@@ -472,7 +495,7 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
472
495
 
473
496
  ### Added
474
497
  - **Zero-config wallet onboarding for the MCP server.** Drop xPay into any
475
- agent host with no env at all on first boot the agent is given its own
498
+ agent host with no env at all - on first boot the agent is given its own
476
499
  persistent wallet (generated, saved under `~/.xpay`/`XPAY_HOME`, address
477
500
  printed to stderr to fund). Reused on every later boot, so the agent keeps a
478
501
  stable address. The wallet source order is: existing profile → raw key env
@@ -485,7 +508,7 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
485
508
  ### Changed
486
509
  - **`mcp-server.ts` header now documents the zero-config form as primary.** The
487
510
  previous example showed `XPAY_PASSPHRASE` alone, which only works once a
488
- profile already exists a setup trap for fresh hosts.
511
+ profile already exists - a setup trap for fresh hosts.
489
512
 
490
513
  ## [0.1.25] – 2026-06-23
491
514
 
@@ -508,8 +531,8 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
508
531
  ### Added
509
532
  - **Bento Guard intent firewall (optional).** A second enforcement gate on top
510
533
  of the local guardrail caps. When enabled, every `use` / `transfer` is
511
- screened by Bento's `protect()` for malicious *intent* prompt-injection,
512
- wallet-drain, intent-vs-execution mismatch before signing. The local
534
+ screened by Bento's `protect()` for malicious *intent*, prompt-injection,
535
+ wallet-drain, intent-vs-execution mismatch, before signing. The local
513
536
  guardrail still owns spend caps; Bento adds the AI intent layer xPay can't
514
537
  compute itself.
515
538
  - Enable per-profile with `xpay bento enable` (also `disable` / `status`).
@@ -519,7 +542,7 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
519
542
  [app.bentoguard.xyz](https://app.bentoguard.xyz/); `enable` prints it.
520
543
  - `BLOCKED` verdicts throw a `GuardrailError`; `ESCALATED` verdicts defer to
521
544
  the existing `onApprovalRequired` hook, or fail closed if none is set.
522
- - `@bentoguard/sdk` is an **optional** dependency loaded lazily installs
545
+ - `@bentoguard/sdk` is an **optional** dependency loaded lazily - installs
523
546
  that can't build its native bindings won't break `npm i @xona-labs/xpay`,
524
547
  and the SDK is only required once a profile turns the firewall on.
525
548
 
@@ -538,32 +561,32 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
538
561
  ### Changed
539
562
  - **Discovery searches server-side.** `discover({ query })` now passes the
540
563
  query to the OrbitX402 API (`?query=`), which searches and ranks the
541
- catalog and returns only the matches one small request instead of
564
+ catalog and returns only the matches - one small request instead of
542
565
  downloading the entire 33k-item catalog (~2 minutes of sequential page
543
566
  fetches) to filter locally. Cold `xpay discover <query>` drops from
544
567
  minutes to ~2s. Local filtering remains as a fallback for endpoints that
545
568
  ignore the query param; no-query browsing still fetches the full catalog.
546
569
 
547
570
  ### Fixed
548
- - **MCP server no longer unlocks the wallet just to read the Sana API key**
571
+ - **MCP server no longer unlocks the wallet just to read the Sana API key** -
549
572
  `config.json` is plaintext, so `sana_*` tools now register correctly when
550
573
  the server starts without `XPAY_PASSPHRASE` (e.g. biometric-unlock setups).
551
574
 
552
575
  ## [0.1.18] – 2026-06-12
553
576
 
554
577
  ### Fixed
555
- - **`xpay balance` now unlocks via Touch ID** it had its own inline
578
+ - **`xpay balance` now unlocks via Touch ID**: it had its own inline
556
579
  passphrase prompt instead of the shared unlock path, so it never offered
557
580
  biometric unlock. It now uses `unlockActive` like every other command.
558
581
 
559
582
  ## [0.1.17] – 2026-06-12
560
583
 
561
584
  ### Added
562
- - **Biometric unlock (macOS Touch ID)** `xpay biometric enable|disable|status`.
585
+ - **Biometric unlock (macOS Touch ID)**: `xpay biometric enable|disable|status`.
563
586
  When enabled, the wallet passphrase is stored in the login keychain and
564
587
  released by a native LocalAuthentication helper (compiled on first use to
565
588
  `~/.xpay/bin/`, requires Xcode Command Line Tools) after a Touch ID check.
566
- The scrypt/AES wallet encryption is unchanged the passphrase remains the
589
+ The scrypt/AES wallet encryption is unchanged - the passphrase remains the
567
590
  fallback and recovery path. Unlock order is now: `--passphrase` flag →
568
591
  `$XPAY_PASSPHRASE` → Touch ID → interactive prompt.
569
592
  - **Guardrail approval hook is now wired in the CLI and MCP server.**
@@ -571,32 +594,32 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
571
594
  configured"); `xpay pay` / `xpay transfer` now resolve it via Touch ID (when
572
595
  biometric unlock is enabled) or a y/n confirm on a TTY. The MCP server uses
573
596
  Touch ID only (no TTY) and denies above-threshold calls otherwise.
574
- - **MCP server can start without `XPAY_PASSPHRASE`** when the profile has
597
+ - **MCP server can start without `XPAY_PASSPHRASE`**: when the profile has
575
598
  biometric unlock enabled, the server prompts Touch ID once at startup
576
599
  instead of requiring the passphrase in plaintext host config.
577
600
 
578
601
  ## [0.1.5] – 2026-05-26
579
602
 
580
603
  ### Added
581
- - **`UseResult.txSig` is now populated on SVM v2 calls** extracted from
604
+ - **`UseResult.txSig` is now populated on SVM v2 calls**: extracted from
582
605
  the facilitator's `PAYMENT-RESPONSE` (or `X-PAYMENT-RESPONSE`) header,
583
606
  which carries the canonical `SettleResponse` envelope (base64 JSON).
584
607
  Previously `useByUrl()` returned `txSig: undefined` for v2 because the
585
608
  facilitator (not the client) broadcasts the transaction.
586
- - **`UseResult.settlement?: SettleEnvelope`** full settle envelope from
609
+ - **`UseResult.settlement?: SettleEnvelope`**: full settle envelope from
587
610
  the facilitator when present: `{ transaction, payer?, network, amount?,
588
611
  success?, extensions?, extra? }`. Useful for reconciliation
589
612
  (payer address, actual settled amount in `upto`-style schemes, etc.).
590
613
 
591
614
  ### Verified
592
- - Live against `api.xona-agent.com/audio/x-text-to-speech` 200 OK,
615
+ - Live against `api.xona-agent.com/audio/x-text-to-speech` - 200 OK,
593
616
  $0.01 USDC settled, real on-chain signature
594
617
  (`3puHTvEY…EpEHi`) returned in both `txSig` and `settlement.transaction`.
595
618
 
596
619
  ## [0.1.4] – 2026-05-26
597
620
 
598
621
  ### Fixed
599
- - **`useByUrl()` against canonical x402 SVM v2 servers** the SDK now signs
622
+ - **`useByUrl()` against canonical x402 SVM v2 servers**: the SDK now signs
600
623
  but does **not** broadcast the USDC transfer, and sends the canonical
601
624
  `PaymentPayloadV2` envelope (`{ x402Version, accepted, payload: { transaction } }`)
602
625
  base64-encoded in the `X-Payment` header. The facilitator verifies + settles.
@@ -607,19 +630,19 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
607
630
  reject with `"Unsupported x402 payload"`.
608
631
 
609
632
  ### Added
610
- - New `Signer.getKitSigner?()` (optional, additive) returns a `@solana/kit`
633
+ - New `Signer.getKitSigner?()` (optional, additive) - returns a `@solana/kit`
611
634
  `TransactionSigner`. `rawSolanaSigner` implements it out of the box.
612
635
  Custom signers (KMS/MPC) implementing it gain canonical x402 v2 support
613
636
  for SVM endpoints; existing custom signers without it keep working via
614
637
  the legacy broadcast-then-`txSig` path for non-SVM networks.
615
- - New module `src/x402/svm-payment.ts` wraps `@x402/svm`'s
638
+ - New module `src/x402/svm-payment.ts` - wraps `@x402/svm`'s
616
639
  `ExactSvmScheme.createPaymentPayload` and assembles the canonical
617
640
  `PaymentPayloadV2` envelope. Used by `useByUrl()` for any network matching
618
641
  `solana` / `solana:*` / `solana-*`.
619
642
 
620
643
  ### Dependencies
621
- - `@x402/core`, `@x402/svm` canonical x402 encoding (no spec drift).
622
- - `@solana/kit` pulled in transitively by `@x402/svm`; used to construct
644
+ - `@x402/core`, `@x402/svm` - canonical x402 encoding (no spec drift).
645
+ - `@solana/kit` - pulled in transitively by `@x402/svm`; used to construct
623
646
  `TransactionSigner` instances from existing `@solana/web3.js` Keypairs via
624
647
  `createKeyPairSignerFromBytes`.
625
648
 
@@ -628,29 +651,29 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
628
651
  facilitator broadcasts; we never see the resulting signature client-side).
629
652
  Downstream reconciliation can still use the upstream response + your own
630
653
  correlationId in your DB.
631
- - Direct `transfer()` is unchanged still uses `signer.pay()` (broadcasts
654
+ - Direct `transfer()` is unchanged - still uses `signer.pay()` (broadcasts
632
655
  client-side, returns the real `txSig`), since there's no facilitator in
633
656
  the direct-transfer path.
634
657
 
635
658
  ## [0.1.3] – 2026-05-26
636
659
 
637
660
  ### Fixed
638
- - **`useByUrl()` against x402-spec endpoints** now resolves the CAIP form
661
+ - **`useByUrl()` against x402-spec endpoints**: now resolves the CAIP form
639
662
  of Solana (`solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp` and `solana:*` /
640
663
  `solana-*` variants) to the configured `solana` signer. Previously failed
641
664
  with "no matching signer" against any endpoint reporting network in CAIP.
642
- - **`xpay pay` defaulted to GET** most x402 service endpoints are POST, so
665
+ - **`xpay pay` defaulted to GET**: most x402 service endpoints are POST, so
643
666
  the CLI returned 404 from the upstream. Added a `--method <m>` flag and
644
667
  documented it in the help text.
645
- - **Blank error output on signing failures** `xpay pay` and `xpay transfer`
668
+ - **Blank error output on signing failures**: `xpay pay` and `xpay transfer`
646
669
  printed a bare `✗` when the underlying Solana / SPL error had an empty
647
670
  `.message`. Now falls back to `toString()` and surfaces optional `logs`.
648
- - **402 challenges in response headers** were not parsed only the body was
671
+ - **402 challenges in response headers** were not parsed - only the body was
649
672
  checked. Now reads the requirements from either the body OR a header
650
673
  (`Payment-Required`, `X-Payment`, `X-Accept-Payment`, `WWW-Authenticate`,
651
674
  `X-402`, …), decoded as raw JSON, base64-JSON, URL-encoded JSON, or
652
675
  `<scheme> <payload>`.
653
- - **x402-spec field names not recognized** the parser now aliases
676
+ - **x402-spec field names not recognized**: the parser now aliases
654
677
  `maxAmountRequired → amount`, `recipient → payTo`, `token` / `mint` →
655
678
  `asset`, etc. Also accepts a bare requirement object, an `{accepts:[]}` /
656
679
  `{items:[]}` envelope, or a v1 bare array.
@@ -666,7 +689,7 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
666
689
  shipped `dist/` so internal pipelines (e.g. curation) can deep-import.
667
690
 
668
691
  ### Internal
669
- - New shared `src/x402/extract.ts` module single source of truth for
692
+ - New shared `src/x402/extract.ts` module - single source of truth for
670
693
  parsing x402 challenges, consumed by both `useByUrl()` and the internal
671
694
  curation pipeline. Replaces the duplicated parser that used to live in
672
695
  `use/` and `probe/`.
@@ -681,22 +704,22 @@ GitHub releases page for the diff against 0.1.0.
681
704
  Initial public release.
682
705
 
683
706
  ### Added
684
- - Multi-network wallet Solana + Base from one BIP-39 mnemonic, encrypted
707
+ - Multi-network wallet - Solana + Base from one BIP-39 mnemonic, encrypted
685
708
  on disk with scrypt + AES-256-GCM.
686
- - `discover()` search across the live x402 catalog (PayAI facilitator).
687
- - `useByUrl()` / `use()` pay any x402 endpoint, handles the 402
709
+ - `discover()` - search across the live x402 catalog (PayAI facilitator).
710
+ - `useByUrl()` / `use()` - pay any x402 endpoint, handles the 402
688
711
  challenge → sign → retry-with-`X-Payment` flow.
689
- - `transfer()` direct USDC send to an address, gated by the same guardrail.
690
- - `balance()` unified USDC balance across configured networks.
691
- - `history()` recent on-chain USDC activity (Solana via RPC, EVM via
712
+ - `transfer()` - direct USDC send to an address, gated by the same guardrail.
713
+ - `balance()` - unified USDC balance across configured networks.
714
+ - `history()` - recent on-chain USDC activity (Solana via RPC, EVM via
692
715
  chunked `eth_getLogs`).
693
- - `Guardrail` per-tx and per-day caps + allowed-host whitelist, enforced
716
+ - `Guardrail` - per-tx and per-day caps + allowed-host whitelist, enforced
694
717
  before any signature.
695
- - Profile management `initProfile()`, `loadProfile()`, multi-profile via
718
+ - Profile management - `initProfile()`, `loadProfile()`, multi-profile via
696
719
  `~/.xpay/<name>/`.
697
720
  - CLI: `xpay init / accounts / discover / pay / transfer / balance / history /
698
721
  guardrail / mcp`.
699
- - MCP server (`xpay-mcp`) on stdio exposes the SDK as tools for Claude
722
+ - MCP server (`xpay-mcp`) on stdio - exposes the SDK as tools for Claude
700
723
  Desktop, Cursor, Codex.
701
724
  - LLM tool exporters: `forClaude(xpay)`, `forOpenAI(xpay)`, `forGemini(xpay)`.
702
725