@absol-labs/agent 0.12.0-rc.1 → 0.12.0-rc.3

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 (123) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/commands/claim.d.ts +41 -0
  3. package/dist/cli/commands/claim.d.ts.map +1 -1
  4. package/dist/cli/commands/claim.js +127 -28
  5. package/dist/cli/commands/claim.js.map +1 -1
  6. package/dist/cli/commands/pay.d.ts +15 -0
  7. package/dist/cli/commands/pay.d.ts.map +1 -1
  8. package/dist/cli/commands/pay.js +131 -7
  9. package/dist/cli/commands/pay.js.map +1 -1
  10. package/dist/cli/commands/reclaim.d.ts.map +1 -1
  11. package/dist/cli/commands/reclaim.js +20 -4
  12. package/dist/cli/commands/reclaim.js.map +1 -1
  13. package/dist/cli/commands/refund.d.ts +21 -1
  14. package/dist/cli/commands/refund.d.ts.map +1 -1
  15. package/dist/cli/commands/refund.js +323 -32
  16. package/dist/cli/commands/refund.js.map +1 -1
  17. package/dist/cli/commands/status.d.ts.map +1 -1
  18. package/dist/cli/commands/status.js +11 -1
  19. package/dist/cli/commands/status.js.map +1 -1
  20. package/dist/cli/commands/watch.d.ts.map +1 -1
  21. package/dist/cli/commands/watch.js +2 -0
  22. package/dist/cli/commands/watch.js.map +1 -1
  23. package/dist/cli/context.d.ts +19 -0
  24. package/dist/cli/context.d.ts.map +1 -1
  25. package/dist/cli/deps.d.ts +20 -0
  26. package/dist/cli/deps.d.ts.map +1 -1
  27. package/dist/cli/deps.js +14 -0
  28. package/dist/cli/deps.js.map +1 -1
  29. package/dist/cli/progress.d.ts +13 -1
  30. package/dist/cli/progress.d.ts.map +1 -1
  31. package/dist/cli/progress.js +7 -1
  32. package/dist/cli/progress.js.map +1 -1
  33. package/dist/cli/run.d.ts.map +1 -1
  34. package/dist/cli/run.js +26 -14
  35. package/dist/cli/run.js.map +1 -1
  36. package/dist/cli/status.d.ts +109 -0
  37. package/dist/cli/status.d.ts.map +1 -1
  38. package/dist/cli/status.js +335 -47
  39. package/dist/cli/status.js.map +1 -1
  40. package/dist/cli/wallet.d.ts +1 -1
  41. package/dist/cli/wallet.d.ts.map +1 -1
  42. package/dist/cli/wallet.js +28 -4
  43. package/dist/cli/wallet.js.map +1 -1
  44. package/dist/gateway/http-server.d.ts +17 -0
  45. package/dist/gateway/http-server.d.ts.map +1 -1
  46. package/dist/gateway/http-server.js +76 -9
  47. package/dist/gateway/http-server.js.map +1 -1
  48. package/dist/gateway/x402-opener-mode.d.ts +39 -2
  49. package/dist/gateway/x402-opener-mode.d.ts.map +1 -1
  50. package/dist/gateway/x402-opener-mode.js +273 -43
  51. package/dist/gateway/x402-opener-mode.js.map +1 -1
  52. package/dist/mcp/server.d.ts +12 -0
  53. package/dist/mcp/server.d.ts.map +1 -1
  54. package/dist/mcp/server.js +28 -9
  55. package/dist/mcp/server.js.map +1 -1
  56. package/dist/mcp/x402-tools.d.ts +8 -3
  57. package/dist/mcp/x402-tools.d.ts.map +1 -1
  58. package/dist/mcp/x402-tools.js +126 -6
  59. package/dist/mcp/x402-tools.js.map +1 -1
  60. package/dist/sdk/client.d.ts +13 -0
  61. package/dist/sdk/client.d.ts.map +1 -1
  62. package/dist/sdk/client.js +15 -0
  63. package/dist/sdk/client.js.map +1 -1
  64. package/dist/x402-buyer/pay.d.ts +22 -0
  65. package/dist/x402-buyer/pay.d.ts.map +1 -1
  66. package/dist/x402-buyer/pay.js +33 -3
  67. package/dist/x402-buyer/pay.js.map +1 -1
  68. package/dist/x402-opener/block-floors.d.ts +35 -0
  69. package/dist/x402-opener/block-floors.d.ts.map +1 -0
  70. package/dist/x402-opener/block-floors.js +72 -0
  71. package/dist/x402-opener/block-floors.js.map +1 -0
  72. package/dist/x402-opener/facilitator-entry.js +4 -1
  73. package/dist/x402-opener/facilitator-entry.js.map +1 -1
  74. package/dist/x402-opener/facilitator-server.d.ts +29 -0
  75. package/dist/x402-opener/facilitator-server.d.ts.map +1 -1
  76. package/dist/x402-opener/facilitator-server.js +74 -1
  77. package/dist/x402-opener/facilitator-server.js.map +1 -1
  78. package/dist/x402-opener/index.d.ts +1 -0
  79. package/dist/x402-opener/index.d.ts.map +1 -1
  80. package/dist/x402-opener/index.js +1 -0
  81. package/dist/x402-opener/index.js.map +1 -1
  82. package/dist/x402-opener/refund-relay.d.ts +92 -5
  83. package/dist/x402-opener/refund-relay.d.ts.map +1 -1
  84. package/dist/x402-opener/refund-relay.js +482 -202
  85. package/dist/x402-opener/refund-relay.js.map +1 -1
  86. package/dist/x402-opener/scheme.d.ts +87 -0
  87. package/dist/x402-opener/scheme.d.ts.map +1 -1
  88. package/dist/x402-opener/scheme.js +340 -40
  89. package/dist/x402-opener/scheme.js.map +1 -1
  90. package/dist/x402-opener/terms.d.ts +61 -1
  91. package/dist/x402-opener/terms.d.ts.map +1 -1
  92. package/dist/x402-opener/terms.js +94 -2
  93. package/dist/x402-opener/terms.js.map +1 -1
  94. package/docs/cli.md +110 -11
  95. package/docs/mcp-reference.md +18 -2
  96. package/docs/quickstart.md +3 -3
  97. package/docs/x402.md +233 -36
  98. package/package.json +3 -3
  99. package/src/cli/commands/claim.ts +184 -33
  100. package/src/cli/commands/pay.ts +150 -8
  101. package/src/cli/commands/reclaim.ts +25 -5
  102. package/src/cli/commands/refund.ts +377 -38
  103. package/src/cli/commands/status.ts +11 -1
  104. package/src/cli/commands/watch.ts +4 -0
  105. package/src/cli/context.ts +16 -0
  106. package/src/cli/deps.ts +37 -0
  107. package/src/cli/progress.ts +21 -2
  108. package/src/cli/run.ts +26 -13
  109. package/src/cli/status.ts +468 -50
  110. package/src/cli/wallet.ts +44 -7
  111. package/src/gateway/http-server.ts +96 -8
  112. package/src/gateway/x402-opener-mode.ts +365 -43
  113. package/src/mcp/server.ts +43 -11
  114. package/src/mcp/x402-tools.ts +171 -7
  115. package/src/sdk/client.ts +25 -0
  116. package/src/x402-buyer/pay.ts +41 -3
  117. package/src/x402-opener/block-floors.ts +78 -0
  118. package/src/x402-opener/facilitator-entry.ts +4 -1
  119. package/src/x402-opener/facilitator-server.ts +108 -1
  120. package/src/x402-opener/index.ts +1 -0
  121. package/src/x402-opener/refund-relay.ts +609 -210
  122. package/src/x402-opener/scheme.ts +497 -41
  123. package/src/x402-opener/terms.ts +155 -2
@@ -27,6 +27,7 @@ export const reclaimCommand = {
27
27
  signs: true,
28
28
  async run(context) {
29
29
  const { args, config, env, out, deps } = context;
30
+ const setActivity = (activity) => context.progress?.setActivity(activity);
30
31
  const [streamIdArg] = args.positionals;
31
32
  if (streamIdArg === undefined) {
32
33
  throw usageError("metrik reclaim requires a <streamId>");
@@ -98,7 +99,9 @@ export const reclaimCommand = {
98
99
  }
99
100
  else {
100
101
  out.note(`closed in ${closeResult.txHash} — waiting for it to land …`);
102
+ setActivity(`waiting for the RPC endpoint to show the close in ${closeResult.txHash}`);
101
103
  await awaitClosed(read, streamId, deps.sleep, closeResult.txHash);
104
+ setActivity(null);
102
105
  // A stream closed before any checkpoint covers its stop time is the
103
106
  // ORDINARY outcome of a short trial run, not an exotic one — and it
104
107
  // is the state `--close-first` leaves behind by construction. Say
@@ -122,7 +125,11 @@ export const reclaimCommand = {
122
125
  sleep: deps.sleep,
123
126
  isRetryable: async (error) => await isWaitingForCheckpoint(error, read, streamId, deps.nowSeconds()),
124
127
  explainFailure: async (error) => await explainReclaimFailure(error, read, streamId, deps.nowSeconds()),
125
- onRetry: (attempt, reason) => out.note(`reclaim blocked: no checkpoint covers the stream's stop time yet (attempt ${attempt}/${attempts}) — ${reason}`),
128
+ onRetry: (attempt, reason) => {
129
+ out.note(`reclaim blocked: no checkpoint covers the stream's stop time yet (attempt ${attempt}/${attempts}) — ${reason}`);
130
+ // The heartbeat must describe THIS wait, not guess at a slow RPC.
131
+ setActivity(`waiting for the oracle's next checkpoint (attempt ${attempt}/${attempts} was blocked; retrying every ${interval}s)`);
132
+ },
126
133
  // "Retry later" is the wrong advice when the oracle is gone: every
127
134
  // attempt this command makes needs a proof FROM that oracle. So the
128
135
  // give-up message names the path that needs no proof, and says whether
@@ -132,11 +139,13 @@ export const reclaimCommand = {
132
139
  // Read the settled figure back only once the node we are reading from has
133
140
  // actually applied the reclaim. The public RPC is load-balanced, so an
134
141
  // immediate read can land on a lagged node and report `settledCumulative: 0`
135
- // for a stream that just settled a non-zero amount — printing "settled to
136
- // operator 0 USDC" when it was not zero. Poll for `reclaimed` (which the
142
+ // for a stream that just settled a non-zero amount — printing an operator
143
+ // entitlement of 0 USDC when it was not zero. Poll for `reclaimed` (which the
137
144
  // transaction we just landed sets) so the number beside it is from the same
138
145
  // post-reclaim state. Bounded, and falls back to the last value read.
146
+ setActivity("waiting for the RPC endpoint to show the reclaim");
139
147
  const stream = await readSettledStream(read, streamId, deps.sleep);
148
+ setActivity(null);
140
149
  // The refund comes from the reclaim's own BuyerReclaimed event, never from
141
150
  // a post-reclaim read: reclaim overwrites `deposit` with the operator's
142
151
  // entitlement, so deposit − settled reads 0 after every reclaim.
@@ -171,7 +180,14 @@ export const reclaimCommand = {
171
180
  ...(stream === null
172
181
  ? []
173
182
  : [
174
- ["settled to operator", formatUsdc(stream.settledCumulative)],
183
+ // No USDC moves to the operator at reclaim: reclaim fixes the
184
+ // operator's entitlement, the operator claims it later, and the
185
+ // protocol fee comes out at that claim. "Settled to operator"
186
+ // read as a payment that never happened.
187
+ [
188
+ "operator entitled",
189
+ `${formatUsdc(stream.settledCumulative)} (claims separately; fee taken at claim)`,
190
+ ],
175
191
  ...(refunded === null
176
192
  ? []
177
193
  : [
@@ -1 +1 @@
1
- {"version":3,"file":"reclaim.js","sourceRoot":"","sources":["../../../src/cli/commands/reclaim.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reclaim.js","sourceRoot":"","sources":["../../../src/cli/commands/reclaim.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,33 @@
1
- import type { RefundClient } from "@absol-labs/sdk/x402";
1
+ import type { RefundClient, RefundStatus } from "@absol-labs/sdk/x402";
2
2
  import type { CommandSpec } from "../context.js";
3
3
  /** Environment fallback for `--refund-url`. */
4
4
  export declare const REFUND_URL_ENV = "METRIK_AGENT_REFUND_URL";
5
5
  export declare const refundCommand: CommandSpec;
6
+ /** `closed`, `expired` (Active on-chain but past expiresAt) or `active`. */
7
+ export declare function stateOf(status: RefundStatus): "active" | "expired" | "closed";
8
+ /** Why a recovery is over. */
9
+ export type FinishedReason = "reclaimed" | "nothing-to-reclaim";
10
+ /** Why a requested `--close` / `--reclaim` sent nothing. */
11
+ export type SkipReason = FinishedReason | "already-closed";
12
+ /**
13
+ * Whether the relay's status says nothing is left to recover. `reclaimed` is
14
+ * the chain's one-reclaim-per-stream flag; `next: none` with `reclaimable: 0`
15
+ * is the relay's "the verified delivery covers the whole deposit".
16
+ */
17
+ export declare function finishedReason(status: RefundStatus): FinishedReason | null;
18
+ export declare function describeFinished(reason: FinishedReason): string;
6
19
  /**
7
20
  * Accepts the relay's full stream URL, a `{streamId}` template, or the relay's
8
21
  * base origin (`https://relay.example` -> `https://relay.example/streams/<id>`).
9
22
  */
10
23
  export declare function resolveRefundUrl(raw: string | undefined, streamId: `0x${string}`): string;
11
24
  export declare function explainRefundFailure(error: unknown): unknown;
25
+ /**
26
+ * What to do after a relay refusal. The on-chain fallback is only offered
27
+ * where it can still recover something: never "close it (needs gas)" for a
28
+ * stream that is already closed, and never any recovery at all for one with
29
+ * nothing left in it.
30
+ */
31
+ export declare function relayRefusalHint(code: string | undefined): string;
12
32
  export type { RefundClient };
13
33
  //# sourceMappingURL=refund.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"refund.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/refund.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,sBAAsB,CAAC;AAU9B,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjE,+CAA+C;AAC/C,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAKxD,eAAO,MAAM,aAAa,EAAE,WA+H3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,EAAE,KAAK,MAAM,EAAE,GACtB,MAAM,CAmBR;AAUD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA6B5D;AA2DD,YAAY,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"refund.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/refund.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EAEZ,YAAY,EAEb,MAAM,sBAAsB,CAAC;AAe9B,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjE,+CAA+C;AAC/C,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAcxD,eAAO,MAAM,aAAa,EAAE,WAmO3B,CAAC;AAmFF,4EAA4E;AAC5E,wBAAgB,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAY7E;AAMD,8BAA8B;AAC9B,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAChE,4DAA4D;AAC5D,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,GAAG,IAAI,CAM1E;AAiDD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAI/D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,EAAE,KAAK,MAAM,EAAE,GACtB,MAAM,CAmBR;AAUD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAqC5D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAajE;AAoFD,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -4,11 +4,20 @@ import { formatUsdc } from "../amounts.js";
4
4
  import { assertTestnetRpc, parseBytes32 } from "../config.js";
5
5
  import { CliError, configError, usageError } from "../errors.js";
6
6
  import { signRecoveryMandate } from "../mandate.js";
7
- import { isPrivyWalletSource, resolveCliWallet } from "../wallet.js";
7
+ import { CDP_ENV_VARS, PRIVATE_KEY_ENV, isPrivyWalletSource, resolveCliWallet, } from "../wallet.js";
8
8
  /** Environment fallback for `--refund-url`. */
9
9
  export const REFUND_URL_ENV = "METRIK_AGENT_REFUND_URL";
10
10
  const DEFAULT_ATTEMPTS = 5;
11
11
  const DEFAULT_MAX_WAIT_SECONDS = 60;
12
+ /**
13
+ * After a close/reclaim, how many times the summary re-reads the relay until
14
+ * it reflects the transaction just mined (a load-balanced RPC behind the relay
15
+ * can answer from a node that has not seen it yet), and how long it waits
16
+ * between reads. Bounded: past it the summary is derived from the verified
17
+ * receipts instead.
18
+ */
19
+ const POST_ACTION_READS = 6;
20
+ const POST_ACTION_INTERVAL_MS = 1_500;
12
21
  export const refundCommand = {
13
22
  name: "refund",
14
23
  summary: "Recover the unearned part of an x402 payment through the gasless refund relay",
@@ -19,6 +28,12 @@ export const refundCommand = {
19
28
  // permissionless and always pays `payerOf(streamId)`.
20
29
  signs: false,
21
30
  requiresKey: false,
31
+ walletHelp: {
32
+ tag: "[--close needs the payer's key]",
33
+ text: "Broadcasts nothing itself: the seller's refund relay broadcasts and pays the gas. Status and --reclaim need no wallet. " +
34
+ "--close signs the payer's off-chain EIP-712 Close message, so it needs the key that paid (no ETH or USDC needed) in the environment: " +
35
+ `${PRIVATE_KEY_ENV} or ${CDP_ENV_VARS.join(" + ")}. A Privy wallet cannot sign the Close.`,
36
+ },
22
37
  async run(context) {
23
38
  const { args, config, env, out, deps } = context;
24
39
  if (deps.x402 === undefined) {
@@ -30,6 +45,13 @@ export const refundCommand = {
30
45
  throw usageError("metrik refund requires a <streamId>");
31
46
  }
32
47
  const streamId = parseBytes32(streamIdArg, "<streamId>");
48
+ if (/^0x0{64}$/i.test(streamId)) {
49
+ // Stream id 0 = an upfront-only payment (`metrik pay` printed no stream):
50
+ // nothing was escrowed. A FINISHED state, not a failure — and nothing is
51
+ // read, requested, signed or sent for it.
52
+ reportNothingToRefund(context, streamId);
53
+ return;
54
+ }
33
55
  const refundUrl = resolveRefundUrl(stringFlag(args, "refund-url") ?? env[REFUND_URL_ENV], streamId);
34
56
  const doClose = booleanFlag(args, "close");
35
57
  const doReclaim = booleanFlag(args, "reclaim");
@@ -54,41 +76,109 @@ export const refundCommand = {
54
76
  maxDelayMs: maxWait * 1_000,
55
77
  });
56
78
  let closeResult = null;
79
+ let closeSkipped = null;
80
+ // Set when the relay itself says there is nothing left: the stream was
81
+ // already reclaimed, or the verified delivery covers the whole deposit.
82
+ // Those are FINISHED recoveries, not failures — a second
83
+ // `--close --reclaim` on a done stream must exit 0 and must never point
84
+ // the payer at a gas-spending on-chain recovery that cannot recover a cent.
85
+ let finishedByRelay = null;
57
86
  if (doClose) {
58
- const wallet = await resolveCliWallet(env, {
59
- purpose: "capability",
60
- note: out.note,
61
- rpcUrl: config.rpcUrl,
62
- });
63
- if (isPrivyWalletSource(wallet.source)) {
64
- throw configError("metrik refund --close cannot sign with a Privy wallet", "the payer signs the opener's EIP-712 Close, which the Privy broker's typed-data policy does not allow. Use the key that paid.");
87
+ // Ask first: a stream that is already closed (or already finished) needs
88
+ // no Close, so there is nothing to sign and no wallet is needed.
89
+ const before = await relay(() => refunds.status());
90
+ const finishedBefore = finishedReason(before);
91
+ if (finishedBefore !== null || before.status === "closed") {
92
+ closeSkipped = finishedBefore ?? "already-closed";
93
+ finishedByRelay = finishedBefore;
94
+ out.note(finishedBefore === null
95
+ ? "stream is already closed — no Close to sign."
96
+ : `stream is already closed and ${finishedBefore === "reclaimed" ? "reclaimed" : "has nothing left to reclaim"} — no Close to sign.`);
65
97
  }
66
- // Buyer recovery: authorized on the mandate OWNER's signature alone, like
67
- // `metrik close` — never on caps or expiry, so nothing can strand the
68
- // payer's own money. The SDK then refuses a signer that is not
69
- // `payerOf(streamId)` before anything is signed for the relay.
70
- const mandate = await signRecoveryMandate(wallet.account, config.chainId);
71
- const decision = await verifyMandateOwnerSignature(mandate);
72
- if (!decision.allowed) {
73
- throw new CliError(`mandate denied: ${decision.reason}`, {
74
- exitCode: 3,
98
+ else {
99
+ const wallet = await resolveCliWallet(env, {
100
+ purpose: "payer-close",
101
+ note: out.note,
102
+ rpcUrl: config.rpcUrl,
75
103
  });
104
+ if (isPrivyWalletSource(wallet.source)) {
105
+ throw configError("metrik refund --close cannot sign with a Privy wallet", "the payer signs the opener's EIP-712 Close, which the Privy broker's typed-data policy does not allow. Use the key that paid.");
106
+ }
107
+ // Buyer recovery: authorized on the mandate OWNER's signature alone,
108
+ // like `metrik close` — never on caps or expiry, so nothing can strand
109
+ // the payer's own money. The SDK then refuses a signer that is not
110
+ // `payerOf(streamId)` before anything is signed for the relay.
111
+ const mandate = await signRecoveryMandate(wallet.account, config.chainId);
112
+ const decision = await verifyMandateOwnerSignature(mandate);
113
+ if (!decision.allowed) {
114
+ throw new CliError(`mandate denied: ${decision.reason}`, {
115
+ exitCode: 3,
116
+ });
117
+ }
118
+ try {
119
+ closeResult = await relay(() => refunds.close({
120
+ signer: wallet.account,
121
+ }));
122
+ out.note(`close relayed in ${closeResult.transaction}${closeResult.verified ? " (receipt verified on-chain)" : ""}`);
123
+ }
124
+ catch (error) {
125
+ // The status read above said "active", but the stream closed in the
126
+ // meantime (it reached expiresAt, or another close landed): the
127
+ // state the payer asked for. Anything else is a real failure.
128
+ if (relayCode(error) !== "already-closed")
129
+ throw error;
130
+ closeSkipped = "already-closed";
131
+ out.note("stream was already closed — no Close was needed.");
132
+ }
76
133
  }
77
- closeResult = await relay(() => refunds.close({
78
- signer: wallet.account,
79
- }));
80
- out.note(`close relayed in ${closeResult.transaction}${closeResult.verified ? " (receipt verified on-chain)" : ""}`);
81
134
  }
82
135
  let reclaimResult = null;
136
+ let reclaimSkipped = null;
83
137
  if (doReclaim) {
84
- reclaimResult = await relay(() => refunds.reclaim());
138
+ if (finishedByRelay !== null) {
139
+ reclaimSkipped = finishedByRelay;
140
+ }
141
+ else {
142
+ context.progress?.setActivity(`waiting on the refund relay's reclaim (it retries up to ${attempts} time${attempts === 1 ? "" : "s"} while the settlement window is open, at most ${maxWait}s per wait)`);
143
+ try {
144
+ reclaimResult = await relay(() => refunds.reclaim());
145
+ }
146
+ catch (error) {
147
+ const finished = finishedFromRelayCode(relayCode(error));
148
+ if (finished === null)
149
+ throw error;
150
+ reclaimSkipped = finished;
151
+ finishedByRelay = finished;
152
+ }
153
+ finally {
154
+ context.progress?.setActivity(null);
155
+ }
156
+ }
85
157
  }
86
- const status = await relay(() => refunds.status());
158
+ // The summary describes the state AFTER what this run did: re-read until
159
+ // the relay reflects the close/reclaim just mined (bounded), else derive
160
+ // it from the verified receipts. Never the pre-action state.
161
+ const status = await statusAfterActions(refunds, {
162
+ closed: closeResult !== null,
163
+ reclaim: reclaimResult,
164
+ payer: stream.payer ?? null,
165
+ opener,
166
+ streamId,
167
+ sleep: deps.sleep,
168
+ });
169
+ // A reclaim THIS run performed is reported as a reclaim, not as "already
170
+ // finished".
171
+ const finished = reclaimResult === null
172
+ ? (finishedReason(status) ?? finishedByRelay)
173
+ : null;
87
174
  out.result({
88
175
  streamId,
89
176
  opener,
90
177
  payer: status.payer,
178
+ // The escrow's own on-chain status, verbatim.
91
179
  status: status.status,
180
+ // What it means now: an Active stream past expiresAt is "expired".
181
+ state: stateOf(status),
92
182
  reclaimed: status.reclaimed,
93
183
  reclaimable: status.reclaimable,
94
184
  next: status.next,
@@ -105,14 +195,164 @@ export const refundCommand = {
105
195
  amount: reclaimResult.amount,
106
196
  verified: reclaimResult.verified,
107
197
  },
198
+ // Why a requested `--close` / `--reclaim` sent nothing (null when it was
199
+ // sent, or not requested).
200
+ closeSkipped,
201
+ reclaimSkipped,
202
+ // True when the recovery is over: nothing is left for the payer to get
203
+ // back (already reclaimed, or the verified delivery covers the deposit).
204
+ finished: finished !== null,
205
+ finishedReason: finished,
206
+ nothingToRecover: finished !== null,
108
207
  refundIsAutomatic: false,
109
208
  });
110
209
  out.print(`x402 stream ${streamId}`);
111
- out.table(statusRows(status, closeResult, reclaimResult));
210
+ out.table(statusRows(status, closeResult, reclaimResult, closeSkipped, finished));
112
211
  out.print("");
113
- out.print(nextStep(status, streamId, refundUrl));
212
+ out.print(reclaimResult !== null
213
+ ? describeReclaimed(reclaimResult)
214
+ : finished === null
215
+ ? nextStep(status, streamId, refundUrl)
216
+ : describeFinished(finished));
114
217
  },
115
218
  };
219
+ /**
220
+ * The relay's view of a stream AFTER this run's actions. Reads until it
221
+ * reflects them (closed after a close, reclaimed after a reclaim), bounded;
222
+ * if the relay still lags, the state those verified transactions imply is
223
+ * reported instead, marked as derived. With no action, one plain read.
224
+ */
225
+ async function statusAfterActions(refunds, done) {
226
+ const reclaimed = done.reclaim !== null;
227
+ if (!done.closed && !reclaimed)
228
+ return await relay(() => refunds.status());
229
+ const reflects = (status) => (!done.closed || status.status === "closed" || status.reclaimed) &&
230
+ (!reclaimed || status.reclaimed);
231
+ let last = null;
232
+ for (let attempt = 1; attempt <= POST_ACTION_READS; attempt++) {
233
+ try {
234
+ const status = await refunds.status();
235
+ if (reflects(status))
236
+ return status;
237
+ last = status;
238
+ }
239
+ catch {
240
+ // A lagging relay (503 chain-lagging, a stale not-found, a blip): the
241
+ // transactions already happened, so keep going and derive if need be.
242
+ }
243
+ if (attempt < POST_ACTION_READS)
244
+ await done.sleep(POST_ACTION_INTERVAL_MS);
245
+ }
246
+ return derivedStatus(last, done);
247
+ }
248
+ /** The state this run's verified close/reclaim imply, when the relay lags. */
249
+ function derivedStatus(last, done) {
250
+ const reclaimed = done.reclaim !== null;
251
+ const note = "derived from this run's transaction receipts; the refund relay had not caught up with them yet";
252
+ return {
253
+ streamId: done.streamId,
254
+ chainId: last?.chainId ?? 0,
255
+ opener: last?.opener ?? done.opener,
256
+ payer: last?.payer ?? done.payer ?? done.opener,
257
+ status: "closed",
258
+ reclaimed: reclaimed || (last?.reclaimed ?? false),
259
+ chainTime: last?.chainTime ?? null,
260
+ reclaimable: null,
261
+ // Both legs this run verified are on-chain facts: the stream is closed.
262
+ state: "closed",
263
+ onChainStatus: "closed",
264
+ maxRefund: last?.maxRefund ?? null,
265
+ maxRefundMeaning: last?.maxRefundMeaning ?? null,
266
+ reclaimableMeaning: last?.reclaimableMeaning ?? null,
267
+ next: reclaimed
268
+ ? {
269
+ action: "none",
270
+ message: "Reclaimed: the unearned remainder was returned to the payer. Nothing further to do.",
271
+ }
272
+ : {
273
+ action: "reclaim",
274
+ message: "Closed. Reclaim the unearned remainder once a checkpoint covering the close is posted (usually within a minute).",
275
+ },
276
+ raw: { derived: true, note },
277
+ };
278
+ }
279
+ /** `closed`, `expired` (Active on-chain but past expiresAt) or `active`. */
280
+ export function stateOf(status) {
281
+ if (status.status === "closed" || status.reclaimed)
282
+ return "closed";
283
+ const raw = status.raw;
284
+ if (raw.state === "expired")
285
+ return "expired";
286
+ if (typeof raw.expiresAt === "number" &&
287
+ status.chainTime !== null &&
288
+ status.chainTime >= raw.expiresAt) {
289
+ return "expired";
290
+ }
291
+ return "active";
292
+ }
293
+ function describeReclaimed(result) {
294
+ return `Reclaimed: ${result.amount === null ? "the unearned remainder" : formatUsdc(result.amount)} was returned to the payer${result.verified ? " (receipt verified on-chain)" : ""}. Nothing further to do for this stream.`;
295
+ }
296
+ /**
297
+ * Whether the relay's status says nothing is left to recover. `reclaimed` is
298
+ * the chain's one-reclaim-per-stream flag; `next: none` with `reclaimable: 0`
299
+ * is the relay's "the verified delivery covers the whole deposit".
300
+ */
301
+ export function finishedReason(status) {
302
+ if (status.reclaimed)
303
+ return "reclaimed";
304
+ if (status.next.action === "none" && status.reclaimable === 0n) {
305
+ return "nothing-to-reclaim";
306
+ }
307
+ return null;
308
+ }
309
+ /** The relay's 409 codes that mean "finished", not "failed". */
310
+ function finishedFromRelayCode(code) {
311
+ if (code === "already-reclaimed")
312
+ return "reclaimed";
313
+ if (code === "nothing-to-reclaim")
314
+ return "nothing-to-reclaim";
315
+ return null;
316
+ }
317
+ function relayCode(error) {
318
+ for (let current = error, depth = 0; depth < 4; depth++) {
319
+ if (!(current instanceof Error))
320
+ return null;
321
+ const code = current.code;
322
+ if (current.name === "RefundRelayError" && typeof code === "string") {
323
+ return code;
324
+ }
325
+ current = current.cause;
326
+ }
327
+ return null;
328
+ }
329
+ /** The `metrik refund` answer for an upfront-only payment (exit 0). */
330
+ function reportNothingToRefund(context, streamId) {
331
+ context.out.result({
332
+ streamId,
333
+ opener: null,
334
+ payer: null,
335
+ status: null,
336
+ reclaimed: false,
337
+ reclaimable: null,
338
+ next: { action: "none" },
339
+ close: null,
340
+ reclaim: null,
341
+ closeSkipped: null,
342
+ reclaimSkipped: null,
343
+ finished: true,
344
+ finishedReason: "upfront-only",
345
+ nothingToRecover: true,
346
+ nothingToRefund: true,
347
+ refundIsAutomatic: false,
348
+ });
349
+ context.out.print("Nothing to refund: this was an upfront-only payment. The whole price was a non-refundable per-call charge paid to the seller at settlement, no escrow stream was opened, and the payment is final. Nothing was requested, signed or sent.");
350
+ }
351
+ export function describeFinished(reason) {
352
+ return reason === "reclaimed"
353
+ ? "Already finished: the stream is closed and was already reclaimed — the unearned remainder went to the payer. Nothing left to recover."
354
+ : "Already finished: nothing to recover — the verified delivery covers the whole deposit, so none of it is unearned.";
355
+ }
116
356
  /**
117
357
  * Accepts the relay's full stream URL, a `{streamId}` template, or the relay's
118
358
  * base origin (`https://relay.example` -> `https://relay.example/streams/<id>`).
@@ -148,6 +388,12 @@ export function explainRefundFailure(error) {
148
388
  if (!(error instanceof Error))
149
389
  return error;
150
390
  switch (error.name) {
391
+ case "NothingToRefundError":
392
+ return new CliError(error.message, {
393
+ exitCode: 3,
394
+ hint: "this is an upfront-only payment (stream id 0): nothing was escrowed and there is nothing to refund. Run `metrik refund 0x0000…0000` to confirm; it exits 0.",
395
+ cause: error,
396
+ });
151
397
  case "RefundNotReadyError": {
152
398
  const retryAt = error.retryAt;
153
399
  return new CliError(error.message, {
@@ -158,12 +404,14 @@ export function explainRefundFailure(error) {
158
404
  cause: error,
159
405
  });
160
406
  }
161
- case "RefundRelayError":
407
+ case "RefundRelayError": {
408
+ const code = error.code;
162
409
  return new CliError(error.message, {
163
410
  exitCode: 3,
164
- hint: `relay refusal${error.code === undefined ? "" : ` (${error.code})`}. The payer can always recover on-chain without the relay: \`metrik close\` (as the payer, needs gas) and \`metrik reclaim\` (anyone).`,
411
+ hint: relayRefusalHint(code),
165
412
  cause: error,
166
413
  });
414
+ }
167
415
  case "NotStreamPayerError":
168
416
  return new CliError(error.message, {
169
417
  exitCode: 3,
@@ -174,20 +422,59 @@ export function explainRefundFailure(error) {
174
422
  return error;
175
423
  }
176
424
  }
177
- function statusRows(status, closeResult, reclaimResult) {
425
+ /**
426
+ * What to do after a relay refusal. The on-chain fallback is only offered
427
+ * where it can still recover something: never "close it (needs gas)" for a
428
+ * stream that is already closed, and never any recovery at all for one with
429
+ * nothing left in it.
430
+ */
431
+ export function relayRefusalHint(code) {
432
+ const label = `relay refusal${code === undefined ? "" : ` (${code})`}`;
433
+ switch (code) {
434
+ case "already-reclaimed":
435
+ case "nothing-to-reclaim":
436
+ return `${label}. Nothing is left to recover for this stream, on-chain or through the relay.`;
437
+ case "already-closed":
438
+ return `${label}. The stream is already closed, so no close is needed: reclaim the unearned remainder with --reclaim (no wallet, no gas), or \`metrik reclaim\` (anyone).`;
439
+ case "not-closable":
440
+ return `${label}. The relay's next step is not a close (the stream may have reached expiresAt by itself): run without --close to see the next step.`;
441
+ default:
442
+ return `${label}. The payer can always recover on-chain without the relay: \`metrik close\` (as the payer, needs gas) and \`metrik reclaim\` (anyone).`;
443
+ }
444
+ }
445
+ function statusRows(status, closeResult, reclaimResult, closeSkipped, finished) {
446
+ const state = stateOf(status);
447
+ const derived = status.raw.derived === true;
178
448
  const rows = [
179
449
  [
180
450
  "status",
181
- status.reclaimed ? `${status.status} (reclaimed)` : status.status,
451
+ (status.reclaimed
452
+ ? `${state} (reclaimed)`
453
+ : state === status.status
454
+ ? state
455
+ : `${state} (on-chain: ${status.status}; past expiresAt, accrues nothing more)`) +
456
+ (derived
457
+ ? " — from this run's receipts; the relay is still catching up"
458
+ : ""),
182
459
  ],
460
+ ...(finished === null
461
+ ? []
462
+ : [["recovery", "finished — nothing to recover"]]),
183
463
  ["payer", status.payer],
184
464
  ["opener", status.opener],
185
465
  [
186
- "reclaimable",
187
- status.reclaimable === null ? "-" : formatUsdc(status.reclaimable),
466
+ "reclaimable now",
467
+ reclaimResult !== null || status.reclaimed
468
+ ? "- (already reclaimed)"
469
+ : status.reclaimable === null
470
+ ? "-"
471
+ : formatUsdc(status.reclaimable),
188
472
  ],
189
- ["next", status.next.action],
473
+ ["next", reclaimResult !== null ? "none" : status.next.action],
190
474
  ];
475
+ if (closeResult === null && closeSkipped !== null) {
476
+ rows.push(["close", "skipped — already closed"]);
477
+ }
191
478
  if (closeResult !== null) {
192
479
  rows.push([
193
480
  "close tx",
@@ -212,6 +499,10 @@ function nextStep(status, streamId, refundUrl) {
212
499
  const base = `metrik refund ${streamId} --refund-url ${refundUrl}`;
213
500
  switch (status.next.action) {
214
501
  case "close":
502
+ if (status.status === "closed") {
503
+ // Never "still running" for a stream the chain shows closed.
504
+ return `Refunds are NOT automatic. The stream is closed: reclaim the unearned remainder with ${base} --reclaim`;
505
+ }
215
506
  return `Refunds are NOT automatic. The stream is still running: stop it with ${base} --close --reclaim`;
216
507
  case "reclaim":
217
508
  return `Refunds are NOT automatic. Reclaim the unearned remainder with ${base} --reclaim`;