@antseed/cli 0.1.132 → 0.1.134

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 (157) hide show
  1. package/README.md +12 -1
  2. package/dist/cli/commands/buyer/channel-withdraw.d.ts +7 -0
  3. package/dist/cli/commands/buyer/channel-withdraw.d.ts.map +1 -0
  4. package/dist/cli/commands/buyer/channel-withdraw.js +178 -0
  5. package/dist/cli/commands/buyer/channel-withdraw.js.map +1 -0
  6. package/dist/cli/commands/buyer/channel-withdraw.test.d.ts +2 -0
  7. package/dist/cli/commands/buyer/channel-withdraw.test.d.ts.map +1 -0
  8. package/dist/cli/commands/buyer/channel-withdraw.test.js +45 -0
  9. package/dist/cli/commands/buyer/channel-withdraw.test.js.map +1 -0
  10. package/dist/cli/commands/buyer/channels.d.ts.map +1 -1
  11. package/dist/cli/commands/buyer/channels.js +60 -52
  12. package/dist/cli/commands/buyer/channels.js.map +1 -1
  13. package/dist/cli/commands/buyer/emissions.d.ts +3 -0
  14. package/dist/cli/commands/buyer/emissions.d.ts.map +1 -0
  15. package/dist/cli/commands/buyer/emissions.js +5 -0
  16. package/dist/cli/commands/buyer/emissions.js.map +1 -0
  17. package/dist/cli/commands/buyer/index.d.ts.map +1 -1
  18. package/dist/cli/commands/buyer/index.js +4 -0
  19. package/dist/cli/commands/buyer/index.js.map +1 -1
  20. package/dist/cli/commands/buyer/start.d.ts +1 -0
  21. package/dist/cli/commands/buyer/start.d.ts.map +1 -1
  22. package/dist/cli/commands/buyer/start.js +16 -0
  23. package/dist/cli/commands/buyer/start.js.map +1 -1
  24. package/dist/cli/commands/buyer/start.test.js +2 -0
  25. package/dist/cli/commands/buyer/start.test.js.map +1 -1
  26. package/dist/cli/commands/buyer/sweep.d.ts +3 -0
  27. package/dist/cli/commands/buyer/sweep.d.ts.map +1 -0
  28. package/dist/cli/commands/buyer/sweep.js +332 -0
  29. package/dist/cli/commands/buyer/sweep.js.map +1 -0
  30. package/dist/cli/commands/buyer/sweep.test.d.ts +2 -0
  31. package/dist/cli/commands/buyer/sweep.test.d.ts.map +1 -0
  32. package/dist/cli/commands/buyer/sweep.test.js +46 -0
  33. package/dist/cli/commands/buyer/sweep.test.js.map +1 -0
  34. package/dist/cli/commands/emissions.d.ts +10 -0
  35. package/dist/cli/commands/emissions.d.ts.map +1 -0
  36. package/dist/cli/commands/emissions.js +91 -0
  37. package/dist/cli/commands/emissions.js.map +1 -0
  38. package/dist/cli/commands/emissions.test.d.ts +2 -0
  39. package/dist/cli/commands/emissions.test.d.ts.map +1 -0
  40. package/dist/cli/commands/emissions.test.js +16 -0
  41. package/dist/cli/commands/emissions.test.js.map +1 -0
  42. package/dist/cli/commands/seller/emissions.d.ts.map +1 -1
  43. package/dist/cli/commands/seller/emissions.js +2 -77
  44. package/dist/cli/commands/seller/emissions.js.map +1 -1
  45. package/dist/cli/commands/seller/start.d.ts.map +1 -1
  46. package/dist/cli/commands/seller/start.js +5 -0
  47. package/dist/cli/commands/seller/start.js.map +1 -1
  48. package/dist/cli/commands/system-proxy/index.d.ts +3 -0
  49. package/dist/cli/commands/system-proxy/index.d.ts.map +1 -0
  50. package/dist/cli/commands/system-proxy/index.js +14 -0
  51. package/dist/cli/commands/system-proxy/index.js.map +1 -0
  52. package/dist/cli/commands/system-proxy/install-ca.d.ts +3 -0
  53. package/dist/cli/commands/system-proxy/install-ca.d.ts.map +1 -0
  54. package/dist/cli/commands/system-proxy/install-ca.js +43 -0
  55. package/dist/cli/commands/system-proxy/install-ca.js.map +1 -0
  56. package/dist/cli/commands/system-proxy/start.d.ts +3 -0
  57. package/dist/cli/commands/system-proxy/start.d.ts.map +1 -0
  58. package/dist/cli/commands/system-proxy/start.js +151 -0
  59. package/dist/cli/commands/system-proxy/start.js.map +1 -0
  60. package/dist/cli/commands/system-proxy/status.d.ts +3 -0
  61. package/dist/cli/commands/system-proxy/status.d.ts.map +1 -0
  62. package/dist/cli/commands/system-proxy/status.js +60 -0
  63. package/dist/cli/commands/system-proxy/status.js.map +1 -0
  64. package/dist/cli/commands/system-proxy/stop.d.ts +3 -0
  65. package/dist/cli/commands/system-proxy/stop.d.ts.map +1 -0
  66. package/dist/cli/commands/system-proxy/stop.js +71 -0
  67. package/dist/cli/commands/system-proxy/stop.js.map +1 -0
  68. package/dist/cli/index.js +2 -0
  69. package/dist/cli/index.js.map +1 -1
  70. package/dist/cli/payment-utils.d.ts +7 -1
  71. package/dist/cli/payment-utils.d.ts.map +1 -1
  72. package/dist/cli/payment-utils.js +20 -1
  73. package/dist/cli/payment-utils.js.map +1 -1
  74. package/dist/config/defaults.d.ts.map +1 -1
  75. package/dist/config/defaults.js +5 -1
  76. package/dist/config/defaults.js.map +1 -1
  77. package/dist/config/effective.d.ts +1 -0
  78. package/dist/config/effective.d.ts.map +1 -1
  79. package/dist/config/effective.js +18 -0
  80. package/dist/config/effective.js.map +1 -1
  81. package/dist/config/effective.test.js +10 -0
  82. package/dist/config/effective.test.js.map +1 -1
  83. package/dist/config/loader.d.ts.map +1 -1
  84. package/dist/config/loader.js +9 -0
  85. package/dist/config/loader.js.map +1 -1
  86. package/dist/config/loader.test.js +31 -0
  87. package/dist/config/loader.test.js.map +1 -1
  88. package/dist/config/types.d.ts +20 -0
  89. package/dist/config/types.d.ts.map +1 -1
  90. package/dist/config/validation.d.ts.map +1 -1
  91. package/dist/config/validation.js +17 -0
  92. package/dist/config/validation.js.map +1 -1
  93. package/dist/proxy/buyer-proxy.d.ts +2 -0
  94. package/dist/proxy/buyer-proxy.d.ts.map +1 -1
  95. package/dist/proxy/buyer-proxy.js +89 -16
  96. package/dist/proxy/buyer-proxy.js.map +1 -1
  97. package/dist/proxy/buyer-proxy.test.js +190 -1
  98. package/dist/proxy/buyer-proxy.test.js.map +1 -1
  99. package/dist/proxy/request-utils.d.ts +1 -1
  100. package/dist/proxy/request-utils.d.ts.map +1 -1
  101. package/dist/proxy/request-utils.js +9 -3
  102. package/dist/proxy/request-utils.js.map +1 -1
  103. package/dist/proxy/service-api-adapter.d.ts +2 -2
  104. package/dist/proxy/service-api-adapter.d.ts.map +1 -1
  105. package/dist/proxy/service-api-adapter.js +1 -1
  106. package/dist/proxy/service-api-adapter.js.map +1 -1
  107. package/dist/proxy/service-api-adapter.test.js +21 -12
  108. package/dist/proxy/service-api-adapter.test.js.map +1 -1
  109. package/dist/system-proxy/ca-manager.d.ts +21 -0
  110. package/dist/system-proxy/ca-manager.d.ts.map +1 -0
  111. package/dist/system-proxy/ca-manager.js +112 -0
  112. package/dist/system-proxy/ca-manager.js.map +1 -0
  113. package/dist/system-proxy/ca-manager.test.d.ts +2 -0
  114. package/dist/system-proxy/ca-manager.test.d.ts.map +1 -0
  115. package/dist/system-proxy/ca-manager.test.js +64 -0
  116. package/dist/system-proxy/ca-manager.test.js.map +1 -0
  117. package/dist/system-proxy/cert-cache.d.ts +16 -0
  118. package/dist/system-proxy/cert-cache.d.ts.map +1 -0
  119. package/dist/system-proxy/cert-cache.js +69 -0
  120. package/dist/system-proxy/cert-cache.js.map +1 -0
  121. package/dist/system-proxy/cert-cache.test.d.ts +2 -0
  122. package/dist/system-proxy/cert-cache.test.d.ts.map +1 -0
  123. package/dist/system-proxy/cert-cache.test.js +52 -0
  124. package/dist/system-proxy/cert-cache.test.js.map +1 -0
  125. package/dist/system-proxy/index.d.ts +11 -0
  126. package/dist/system-proxy/index.d.ts.map +1 -0
  127. package/dist/system-proxy/index.js +7 -0
  128. package/dist/system-proxy/index.js.map +1 -0
  129. package/dist/system-proxy/node-hook.d.ts +3 -0
  130. package/dist/system-proxy/node-hook.d.ts.map +1 -0
  131. package/dist/system-proxy/node-hook.js +27 -0
  132. package/dist/system-proxy/node-hook.js.map +1 -0
  133. package/dist/system-proxy/profiles.d.ts +13 -0
  134. package/dist/system-proxy/profiles.d.ts.map +1 -0
  135. package/dist/system-proxy/profiles.js +150 -0
  136. package/dist/system-proxy/profiles.js.map +1 -0
  137. package/dist/system-proxy/profiles.test.d.ts +2 -0
  138. package/dist/system-proxy/profiles.test.d.ts.map +1 -0
  139. package/dist/system-proxy/profiles.test.js +66 -0
  140. package/dist/system-proxy/profiles.test.js.map +1 -0
  141. package/dist/system-proxy/proxy-server.d.ts +98 -0
  142. package/dist/system-proxy/proxy-server.d.ts.map +1 -0
  143. package/dist/system-proxy/proxy-server.js +977 -0
  144. package/dist/system-proxy/proxy-server.js.map +1 -0
  145. package/dist/system-proxy/proxy-server.test.d.ts +2 -0
  146. package/dist/system-proxy/proxy-server.test.d.ts.map +1 -0
  147. package/dist/system-proxy/proxy-server.test.js +778 -0
  148. package/dist/system-proxy/proxy-server.test.js.map +1 -0
  149. package/dist/system-proxy/system-proxy.d.ts +25 -0
  150. package/dist/system-proxy/system-proxy.d.ts.map +1 -0
  151. package/dist/system-proxy/system-proxy.js +152 -0
  152. package/dist/system-proxy/system-proxy.js.map +1 -0
  153. package/dist/system-proxy/types.d.ts +69 -0
  154. package/dist/system-proxy/types.d.ts.map +1 -0
  155. package/dist/system-proxy/types.js +2 -0
  156. package/dist/system-proxy/types.js.map +1 -0
  157. package/package.json +8 -6
package/README.md CHANGED
@@ -126,6 +126,13 @@ or:
126
126
  ANTSEED_DEBUG=1 antseed <command>
127
127
  ```
128
128
 
129
+ Filter debug logs by source or text with:
130
+
131
+ ```bash
132
+ antseed buyer start --log-filter ProxyMux
133
+ ANTSEED_LOG_FILTER=PaymentMux,BuyerPayment ANTSEED_DEBUG=1 antseed buyer start
134
+ ```
135
+
129
136
  For dashboard frontend debug logging, set:
130
137
 
131
138
  ```bash
@@ -174,7 +181,8 @@ Pricing is configured in USD per 1M tokens with role-specific defaults and optio
174
181
  },
175
182
  "proxyPort": 8377,
176
183
  "peerRefreshIntervalMs": 300000,
177
- "metadataFetchTimeoutMs": 1500
184
+ "metadataFetchTimeoutMs": 1500,
185
+ "disableMetadataV2Services": false
178
186
  }
179
187
  }
180
188
  ```
@@ -233,6 +241,7 @@ antseed config buyer set maxPricing.defaults.cachedInputUsdPerMillion 12
233
241
  antseed config buyer set maxPricing.defaults.outputUsdPerMillion 75
234
242
  antseed config buyer set peerRefreshIntervalMs 300000
235
243
  antseed config buyer set metadataFetchTimeoutMs 1500
244
+ antseed config buyer set disableMetadataV2Services true
236
245
  ```
237
246
 
238
247
  Runtime-only overrides (do not write your config file):
@@ -242,6 +251,7 @@ antseed seller start --provider anthropic --input-usd-per-million 10 --cached-in
242
251
  antseed seller start --base-rpc-url https://base-mainnet.infura.io/v3/<key>
243
252
  antseed buyer start --max-input-usd-per-million 20 --max-cached-input-usd-per-million 10 --max-output-usd-per-million 60
244
253
  antseed buyer start --metadata-fetch-timeout-ms 1500
254
+ antseed buyer start --disable-metadata-v2-services
245
255
  ```
246
256
 
247
257
  For production sellers, prefer a dedicated Base JSON-RPC endpoint over public defaults. You can set it durably with `payments.crypto.rpcUrl`, at runtime with `ANTSEED_BASE_RPC_URL`, or for one run with `antseed seller start --base-rpc-url <url>`.
@@ -331,6 +341,7 @@ Use `base-sepolia` for testing with MockUSDC.
331
341
 
332
342
  - `ANTSEED_BASE_RPC_URL=<url>` — custom Base JSON-RPC endpoint for seller on-chain operations (recommended for production)
333
343
  - `ANTSEED_BUYER_METADATA_FETCH_TIMEOUT_MS=<ms>` — runtime override for buyer peer-discovery metadata fetch timeout
344
+ - `ANTSEED_BUYER_DISABLE_METADATA_V2_SERVICES=true` — suppress buyer per-service metadata v2 attribution while keeping aggregate usage totals
334
345
  - `ANTSEED_SETTLEMENT_IDLE_MS=600000` — idle time before settling a session (default: 10 minutes)
335
346
  - `ANTSEED_DEFAULT_DEPOSIT_USDC=1` — default lock amount per session
336
347
  - `ANTSEED_IDENTITY_HEX=<hex>` — inject identity via env (supports 0x prefix)
@@ -0,0 +1,7 @@
1
+ import type { Command } from 'commander';
2
+ import type { StoredChannel } from '@antseed/node';
3
+ export declare const CHANNEL_CLOSE_GRACE_PERIOD_SECONDS: number;
4
+ export declare function resolveBuyerChannelById(channels: StoredChannel[], channelIdOrPrefix: string): StoredChannel;
5
+ export declare function secondsUntilChannelWithdrawReady(closeRequestedAtSeconds: bigint, nowSeconds: number, gracePeriodSeconds?: number): number;
6
+ export declare function registerBuyerChannelWithdrawCommands(channelsCmd: Command, buyerCmd: Command): void;
7
+ //# sourceMappingURL=channel-withdraw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-withdraw.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/channel-withdraw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAYnD,eAAO,MAAM,kCAAkC,QAAU,CAAC;AAe1D,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EAAE,EACzB,iBAAiB,EAAE,MAAM,GACxB,aAAa,CAYf;AAED,wBAAgB,gCAAgC,CAC9C,uBAAuB,EAAE,MAAM,EAC/B,UAAU,EAAE,MAAM,EAClB,kBAAkB,SAAqC,GACtD,MAAM,CAIR;AAkBD,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CA4IlG"}
@@ -0,0 +1,178 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { CHANNEL_STATUS } from '@antseed/node/payments';
4
+ import { getGlobalOptions } from '../types.js';
5
+ import { loadConfig } from '../../../config/loader.js';
6
+ import { createChannelsClient, formatUsdc, loadCryptoContext, openChannelStore, shortId, } from '../../payment-utils.js';
7
+ export const CHANNEL_CLOSE_GRACE_PERIOD_SECONDS = 15 * 60;
8
+ // Contract channel status is a uint8; 1 maps to the on-chain Active enum value.
9
+ const ON_CHAIN_STATUS_ACTIVE = 1;
10
+ const CHANNEL_STATUS_LABELS = {
11
+ 0: 'none',
12
+ 1: 'active',
13
+ 2: 'settled',
14
+ 3: 'timed out',
15
+ };
16
+ function normalizeChannelId(value) {
17
+ return value.trim().toLowerCase();
18
+ }
19
+ export function resolveBuyerChannelById(channels, channelIdOrPrefix) {
20
+ const query = normalizeChannelId(channelIdOrPrefix);
21
+ const matches = channels.filter((channel) => normalizeChannelId(channel.sessionId).startsWith(query));
22
+ if (matches.length === 0) {
23
+ throw new Error(`No local buyer channel found for ${channelIdOrPrefix}. Run \`antseed buyer channels\` to list channels.`);
24
+ }
25
+ if (matches.length > 1) {
26
+ const examples = matches.slice(0, 5).map((channel) => channel.sessionId).join(', ');
27
+ throw new Error(`Channel id prefix is ambiguous. Matches: ${examples}`);
28
+ }
29
+ return matches[0];
30
+ }
31
+ export function secondsUntilChannelWithdrawReady(closeRequestedAtSeconds, nowSeconds, gracePeriodSeconds = CHANNEL_CLOSE_GRACE_PERIOD_SECONDS) {
32
+ if (closeRequestedAtSeconds <= 0n)
33
+ return gracePeriodSeconds;
34
+ const readyAt = Number(closeRequestedAtSeconds) + gracePeriodSeconds;
35
+ return Math.max(0, readyAt - nowSeconds);
36
+ }
37
+ function formatWait(seconds) {
38
+ const minutes = Math.ceil(seconds / 60);
39
+ if (minutes <= 1)
40
+ return 'about 1 minute';
41
+ return `about ${minutes} minutes`;
42
+ }
43
+ function openChannelStoreOrExit(dataDir) {
44
+ try {
45
+ return openChannelStore(dataDir);
46
+ }
47
+ catch (err) {
48
+ console.error(chalk.red(`Failed to open channel store: ${err.message}`));
49
+ console.error(chalk.dim('Have you connected to the network yet? Channels are stored locally after first use.'));
50
+ process.exit(1);
51
+ }
52
+ }
53
+ export function registerBuyerChannelWithdrawCommands(channelsCmd, buyerCmd) {
54
+ channelsCmd
55
+ .command('request-close <channelId>')
56
+ .description('Request timeout close for an active buyer payment channel so reserved funds can be withdrawn after the grace period')
57
+ .option('--json', 'output as JSON', false)
58
+ .action(async (channelId, options) => {
59
+ const globalOpts = getGlobalOptions(buyerCmd);
60
+ const config = await loadConfig(globalOpts.config);
61
+ const { wallet, address } = await loadCryptoContext(globalOpts.dataDir);
62
+ const channelsClient = createChannelsClient(config);
63
+ let localChannel;
64
+ const store = openChannelStoreOrExit(globalOpts.dataDir);
65
+ try {
66
+ localChannel = resolveBuyerChannelById(store.getAllChannelsByBuyer('buyer', address), channelId);
67
+ }
68
+ finally {
69
+ store.close();
70
+ }
71
+ if (localChannel.status !== CHANNEL_STATUS.ACTIVE) {
72
+ console.error(chalk.red(`Error: Local channel ${shortId(localChannel.sessionId, 18)} is ${localChannel.status}, not active.`));
73
+ console.error(chalk.dim('Only active channels can be timeout closed.'));
74
+ process.exit(1);
75
+ }
76
+ const spinner = ora(`Requesting timeout close for channel ${shortId(localChannel.sessionId, 18)}...`).start();
77
+ try {
78
+ const onChain = await channelsClient.getSession(localChannel.sessionId);
79
+ if (onChain.buyer.toLowerCase() !== address.toLowerCase()) {
80
+ throw new Error(`Configured wallet ${address} is not the on-chain buyer for this channel.`);
81
+ }
82
+ if (onChain.status !== ON_CHAIN_STATUS_ACTIVE) {
83
+ throw new Error(`On-chain channel is ${CHANNEL_STATUS_LABELS[onChain.status] ?? `status ${onChain.status}`}, not active.`);
84
+ }
85
+ if (onChain.closeRequestedAt > 0n) {
86
+ const waitSeconds = secondsUntilChannelWithdrawReady(onChain.closeRequestedAt, Math.floor(Date.now() / 1000));
87
+ spinner.stop();
88
+ if (options.json) {
89
+ console.log(JSON.stringify({
90
+ channelId: localChannel.sessionId,
91
+ alreadyRequested: true,
92
+ closeRequestedAt: onChain.closeRequestedAt.toString(),
93
+ withdrawReady: waitSeconds === 0,
94
+ waitSeconds,
95
+ }, null, 2));
96
+ return;
97
+ }
98
+ console.log(chalk.yellow(`Close was already requested for ${shortId(localChannel.sessionId, 18)}.`));
99
+ console.log(waitSeconds === 0
100
+ ? chalk.green('It is ready to withdraw now: antseed buyer channels withdraw ' + localChannel.sessionId)
101
+ : chalk.dim(`Withdraw should be available in ${formatWait(waitSeconds)}.`));
102
+ return;
103
+ }
104
+ const txHash = await channelsClient.requestClose(wallet, localChannel.sessionId);
105
+ spinner.succeed(chalk.green(`Requested timeout close for ${shortId(localChannel.sessionId, 18)}`));
106
+ if (options.json) {
107
+ console.log(JSON.stringify({
108
+ channelId: localChannel.sessionId,
109
+ transaction: txHash,
110
+ withdrawAfterSeconds: CHANNEL_CLOSE_GRACE_PERIOD_SECONDS,
111
+ }, null, 2));
112
+ return;
113
+ }
114
+ console.log(chalk.dim(`Transaction: ${txHash}`));
115
+ console.log(chalk.dim(`Withdraw reserved funds after ${formatWait(CHANNEL_CLOSE_GRACE_PERIOD_SECONDS)}:`));
116
+ console.log(chalk.cyan(` antseed buyer channels withdraw ${localChannel.sessionId}`));
117
+ }
118
+ catch (err) {
119
+ spinner.fail(chalk.red(`Close request failed: ${err.message}`));
120
+ process.exit(1);
121
+ }
122
+ });
123
+ channelsCmd
124
+ .command('withdraw <channelId>')
125
+ .description('Withdraw/release reserved buyer funds after a channel timeout close grace period has elapsed')
126
+ .option('--json', 'output as JSON', false)
127
+ .action(async (channelId, options) => {
128
+ const globalOpts = getGlobalOptions(buyerCmd);
129
+ const config = await loadConfig(globalOpts.config);
130
+ const { wallet, address } = await loadCryptoContext(globalOpts.dataDir);
131
+ const channelsClient = createChannelsClient(config);
132
+ let localChannel;
133
+ const store = openChannelStoreOrExit(globalOpts.dataDir);
134
+ try {
135
+ localChannel = resolveBuyerChannelById(store.getAllChannelsByBuyer('buyer', address), channelId);
136
+ }
137
+ finally {
138
+ store.close();
139
+ }
140
+ const spinner = ora(`Withdrawing reserved funds for channel ${shortId(localChannel.sessionId, 18)}...`).start();
141
+ try {
142
+ const onChain = await channelsClient.getSession(localChannel.sessionId);
143
+ if (onChain.buyer.toLowerCase() !== address.toLowerCase()) {
144
+ throw new Error(`Configured wallet ${address} is not the on-chain buyer for this channel.`);
145
+ }
146
+ if (onChain.status !== ON_CHAIN_STATUS_ACTIVE) {
147
+ throw new Error(`On-chain channel is ${CHANNEL_STATUS_LABELS[onChain.status] ?? `status ${onChain.status}`}; nothing active remains to withdraw.`);
148
+ }
149
+ if (onChain.closeRequestedAt <= 0n) {
150
+ throw new Error(`Close has not been requested yet. Run \`antseed buyer channels request-close ${localChannel.sessionId}\` first.`);
151
+ }
152
+ const waitSeconds = secondsUntilChannelWithdrawReady(onChain.closeRequestedAt, Math.floor(Date.now() / 1000));
153
+ if (waitSeconds > 0) {
154
+ throw new Error(`Close grace period is not over yet. Try again in ${formatWait(waitSeconds)}.`);
155
+ }
156
+ const refund = onChain.deposit > onChain.settled ? onChain.deposit - onChain.settled : 0n;
157
+ const txHash = await channelsClient.withdraw(wallet, localChannel.sessionId);
158
+ spinner.succeed(chalk.green(`Withdrew reserved funds for ${shortId(localChannel.sessionId, 18)}`));
159
+ if (options.json) {
160
+ console.log(JSON.stringify({
161
+ channelId: localChannel.sessionId,
162
+ transaction: txHash,
163
+ deposit: onChain.deposit.toString(),
164
+ settled: onChain.settled.toString(),
165
+ estimatedRefund: refund.toString(),
166
+ }, null, 2));
167
+ return;
168
+ }
169
+ console.log(chalk.dim(`Transaction: ${txHash}`));
170
+ console.log(chalk.dim(`Estimated released reserve: ${formatUsdc(refund)} USDC`));
171
+ }
172
+ catch (err) {
173
+ spinner.fail(chalk.red(`Withdraw failed: ${err.message}`));
174
+ process.exit(1);
175
+ }
176
+ });
177
+ }
178
+ //# sourceMappingURL=channel-withdraw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-withdraw.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/channel-withdraw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=channel-withdraw.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-withdraw.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/channel-withdraw.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { CHANNEL_CLOSE_GRACE_PERIOD_SECONDS, resolveBuyerChannelById, secondsUntilChannelWithdrawReady, } from './channel-withdraw.js';
4
+ function channel(sessionId) {
5
+ return {
6
+ sessionId,
7
+ peerId: 'peer',
8
+ role: 'buyer',
9
+ sellerEvmAddr: '0x' + '11'.repeat(20),
10
+ buyerEvmAddr: '0x' + '22'.repeat(20),
11
+ nonce: 0,
12
+ authMax: '1000000',
13
+ previousConsumption: '0',
14
+ tokensDelivered: '0',
15
+ deadline: 0,
16
+ previousSessionId: '',
17
+ requestCount: 0,
18
+ reservedAt: 0,
19
+ settledAt: null,
20
+ settledAmount: null,
21
+ status: 'active',
22
+ latestBuyerSig: null,
23
+ latestSpendingAuthSig: null,
24
+ latestMetadata: null,
25
+ createdAt: 0,
26
+ updatedAt: 0,
27
+ };
28
+ }
29
+ test('resolveBuyerChannelById accepts exact ids and unique prefixes', () => {
30
+ const first = channel('0x' + 'aa'.repeat(32));
31
+ const second = channel('0x' + 'bb'.repeat(32));
32
+ assert.equal(resolveBuyerChannelById([first, second], first.sessionId), first);
33
+ assert.equal(resolveBuyerChannelById([first, second], '0xaaaa'), first);
34
+ });
35
+ test('resolveBuyerChannelById rejects ambiguous prefixes', () => {
36
+ const first = channel('0xaaaa' + '11'.repeat(30));
37
+ const second = channel('0xaaaa' + '22'.repeat(30));
38
+ assert.throws(() => resolveBuyerChannelById([first, second], '0xaaaa'), /ambiguous/i);
39
+ });
40
+ test('secondsUntilChannelWithdrawReady tracks 15 minute timeout grace period', () => {
41
+ assert.equal(secondsUntilChannelWithdrawReady(0n, 100), CHANNEL_CLOSE_GRACE_PERIOD_SECONDS);
42
+ assert.equal(secondsUntilChannelWithdrawReady(100n, 100 + CHANNEL_CLOSE_GRACE_PERIOD_SECONDS - 1), 1);
43
+ assert.equal(secondsUntilChannelWithdrawReady(100n, 100 + CHANNEL_CLOSE_GRACE_PERIOD_SECONDS), 0);
44
+ });
45
+ //# sourceMappingURL=channel-withdraw.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-withdraw.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/channel-withdraw.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,kCAAkC,EAClC,uBAAuB,EACvB,gCAAgC,GACjC,MAAM,uBAAuB,CAAC;AAE/B,SAAS,OAAO,CAAC,SAAiB;IAChC,OAAO;QACL,SAAS;QACT,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,OAAO;QACb,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,SAAS;QAClB,mBAAmB,EAAE,GAAG;QACxB,eAAe,EAAE,GAAG;QACpB,QAAQ,EAAE,CAAC;QACX,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,QAAQ;QAChB,cAAc,EAAE,IAAI;QACpB,qBAAqB,EAAE,IAAI;QAC3B,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,CAAC;KACb,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACzE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/C,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/E,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnD,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,EACxD,YAAY,CACb,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;IAClF,MAAM,CAAC,KAAK,CACV,gCAAgC,CAAC,EAAE,EAAE,GAAG,CAAC,EACzC,kCAAkC,CACnC,CAAC;IACF,MAAM,CAAC,KAAK,CACV,gCAAgC,CAAC,IAAI,EAAE,GAAG,GAAG,kCAAkC,GAAG,CAAC,CAAC,EACpF,CAAC,CACF,CAAC;IACF,MAAM,CAAC,KAAK,CACV,gCAAgC,CAAC,IAAI,EAAE,GAAG,GAAG,kCAAkC,CAAC,EAChF,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/channels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA2DpE"}
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/channels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+EzC,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAoBpE"}
@@ -1,10 +1,8 @@
1
1
  import chalk from 'chalk';
2
2
  import { loadOrCreateIdentity } from '@antseed/node';
3
3
  import { getGlobalOptions } from '../types.js';
4
- import { formatUsdc, openChannelStore } from '../../payment-utils.js';
5
- function short(id, len = 10) {
6
- return id.length > len ? id.slice(0, len) + '...' : id;
7
- }
4
+ import { formatUsdc, openChannelStore, shortId } from '../../payment-utils.js';
5
+ import { registerBuyerChannelWithdrawCommands } from './channel-withdraw.js';
8
6
  function statusColor(status) {
9
7
  switch (status) {
10
8
  case 'active': return chalk.green(status);
@@ -21,59 +19,69 @@ function subtractBigintFloor(left, right) {
21
19
  const result = BigInt(left ?? '0') - BigInt(right ?? '0');
22
20
  return result > 0n ? result.toString() : '0';
23
21
  }
22
+ async function listBuyerChannels(buyerCmd, options) {
23
+ const globalOpts = getGlobalOptions(buyerCmd);
24
+ const identity = await loadOrCreateIdentity(globalOpts.dataDir);
25
+ const buyerAddress = identity.wallet.address;
26
+ let store;
27
+ try {
28
+ store = openChannelStore(globalOpts.dataDir);
29
+ }
30
+ catch (err) {
31
+ console.error(chalk.red(`Failed to open channel store: ${err.message}`));
32
+ console.error(chalk.dim('Have you connected to the network yet? Channels are stored locally after first use.'));
33
+ process.exit(1);
34
+ }
35
+ try {
36
+ const limit = parseInt(options.limit, 10) || 20;
37
+ const statusFilter = options.status;
38
+ const allSessions = store.getAllChannelsByBuyer('buyer', buyerAddress);
39
+ let filtered = allSessions;
40
+ if (statusFilter)
41
+ filtered = filtered.filter((session) => session.status === statusFilter);
42
+ filtered.sort((a, b) => b.updatedAt - a.updatedAt);
43
+ const limited = filtered.slice(0, limit);
44
+ if (options.json) {
45
+ console.log(JSON.stringify(limited, null, 2));
46
+ return;
47
+ }
48
+ if (limited.length === 0) {
49
+ console.log(chalk.yellow('No channels found.'));
50
+ return;
51
+ }
52
+ console.log(chalk.bold(`Payment Channels (${limited.length} of ${filtered.length}):\n`));
53
+ for (const session of limited) {
54
+ console.log(` ${chalk.bold(shortId(session.sessionId, 16))} ${statusColor(session.status)} ${chalk.dim(session.role)}`);
55
+ const unsettled = subtractBigintFloor(session.authMax, session.settledAmount);
56
+ console.log(` Peer: ${chalk.dim(shortId(session.peerId, 16))} Requests: ${session.requestCount} Tokens: ${session.tokensDelivered}`);
57
+ console.log(` Deposit: ${chalk.green(usdc(session.authMax))} Settled: ${chalk.cyan(usdc(session.settledAmount))} Unsettled: ${chalk.yellow(usdc(unsettled))}`);
58
+ console.log(` Created: ${chalk.dim(new Date(session.createdAt).toISOString())}`);
59
+ if (session.settledAt) {
60
+ console.log(` Settled: ${chalk.dim(new Date(session.settledAt).toISOString())}`);
61
+ }
62
+ console.log('');
63
+ }
64
+ }
65
+ finally {
66
+ store.close();
67
+ }
68
+ }
24
69
  export function registerBuyerChannelsCommand(buyerCmd) {
25
- buyerCmd
70
+ const channelsCmd = buyerCmd
26
71
  .command('channels')
72
+ .description('List, request-close, and withdraw buyer payment channels');
73
+ channelsCmd
74
+ .command('list')
27
75
  .description('List payment channels from local store')
28
76
  .option('--status <status>', 'filter by status: active, settled, timeout, ghost')
29
77
  .option('--limit <number>', 'max number of channels to show', '20')
30
78
  .option('--json', 'output as JSON', false)
31
- .action(async (options) => {
32
- const globalOpts = getGlobalOptions(buyerCmd);
33
- const identity = await loadOrCreateIdentity(globalOpts.dataDir);
34
- const buyerAddress = identity.wallet.address;
35
- let store;
36
- try {
37
- store = openChannelStore(globalOpts.dataDir);
38
- }
39
- catch (err) {
40
- console.error(chalk.red(`Failed to open channel store: ${err.message}`));
41
- console.error(chalk.dim('Have you connected to the network yet? Channels are stored locally after first use.'));
42
- process.exit(1);
43
- }
44
- try {
45
- const limit = parseInt(options.limit, 10) || 20;
46
- const statusFilter = options.status;
47
- const allSessions = store.getAllChannelsByBuyer('buyer', buyerAddress);
48
- let filtered = allSessions;
49
- if (statusFilter)
50
- filtered = filtered.filter((session) => session.status === statusFilter);
51
- filtered.sort((a, b) => b.updatedAt - a.updatedAt);
52
- const limited = filtered.slice(0, limit);
53
- if (options.json) {
54
- console.log(JSON.stringify(limited, null, 2));
55
- return;
56
- }
57
- if (limited.length === 0) {
58
- console.log(chalk.yellow('No channels found.'));
59
- return;
60
- }
61
- console.log(chalk.bold(`Payment Channels (${limited.length} of ${filtered.length}):\n`));
62
- for (const session of limited) {
63
- console.log(` ${chalk.bold(short(session.sessionId, 16))} ${statusColor(session.status)} ${chalk.dim(session.role)}`);
64
- const unsettled = subtractBigintFloor(session.authMax, session.settledAmount);
65
- console.log(` Peer: ${chalk.dim(short(session.peerId, 16))} Requests: ${session.requestCount} Tokens: ${session.tokensDelivered}`);
66
- console.log(` Deposit: ${chalk.green(usdc(session.authMax))} Settled: ${chalk.cyan(usdc(session.settledAmount))} Unsettled: ${chalk.yellow(usdc(unsettled))}`);
67
- console.log(` Created: ${chalk.dim(new Date(session.createdAt).toISOString())}`);
68
- if (session.settledAt) {
69
- console.log(` Settled: ${chalk.dim(new Date(session.settledAt).toISOString())}`);
70
- }
71
- console.log('');
72
- }
73
- }
74
- finally {
75
- store.close();
76
- }
77
- });
79
+ .action(async (options) => listBuyerChannels(buyerCmd, options));
80
+ channelsCmd
81
+ .option('--status <status>', 'filter by status: active, settled, timeout, ghost')
82
+ .option('--limit <number>', 'max number of channels to show', '20')
83
+ .option('--json', 'output as JSON', false)
84
+ .action(async (options) => listBuyerChannels(buyerCmd, options));
85
+ registerBuyerChannelWithdrawCommands(channelsCmd, buyerCmd);
78
86
  }
79
87
  //# sourceMappingURL=channels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/channels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/channels.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,oCAAoC,EAAE,MAAM,uBAAuB,CAAC;AAE7E,SAAS,WAAW,CAAC,MAAc;IACjC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,KAAK,SAAS,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,KAAK,SAAS,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,KAAK,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,SAAoC;IAChD,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC;AACxD,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA+B,EAAE,KAAgC;IAC5F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAC1D,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAiB,EAAE,OAA4D;IAC9G,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IAE7C,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAkC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qFAAqF,CAAC,CAAC,CAAC;QAChH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAe,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,MAA4B,CAAC;QAE1D,MAAM,WAAW,GAAG,KAAK,CAAC,qBAAqB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvE,IAAI,QAAQ,GAAG,WAAW,CAAC;QAC3B,IAAI,YAAY;YAAE,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;QAE3F,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEzC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,MAAM,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC;QACzF,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3H,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,eAAe,OAAO,CAAC,YAAY,aAAa,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;YAC1I,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,gBAAgB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;YACpK,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,QAAiB;IAC5D,MAAM,WAAW,GAAG,QAAQ;SACzB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,0DAA0D,CAAC,CAAC;IAE3E,WAAW;SACR,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,mBAAmB,EAAE,mDAAmD,CAAC;SAChF,MAAM,CAAC,kBAAkB,EAAE,gCAAgC,EAAE,IAAI,CAAC;SAClE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,WAAW;SACR,MAAM,CAAC,mBAAmB,EAAE,mDAAmD,CAAC;SAChF,MAAM,CAAC,kBAAkB,EAAE,gCAAgC,EAAE,IAAI,CAAC;SAClE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,oCAAoC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerBuyerEmissionsCommand(buyerCmd: Command): void;
3
+ //# sourceMappingURL=emissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emissions.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/emissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAErE"}
@@ -0,0 +1,5 @@
1
+ import { registerEmissionsCommand } from '../emissions.js';
2
+ export function registerBuyerEmissionsCommand(buyerCmd) {
3
+ registerEmissionsCommand(buyerCmd, 'buyer');
4
+ }
5
+ //# sourceMappingURL=emissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emissions.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/emissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,UAAU,6BAA6B,CAAC,QAAiB;IAC7D,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe5D"}
@@ -2,10 +2,12 @@ import { registerBuyerStartCommand } from './start.js';
2
2
  import { registerBuyerStatusCommand } from './status.js';
3
3
  import { registerBuyerDepositCommand } from './deposit.js';
4
4
  import { registerBuyerWithdrawCommand } from './withdraw.js';
5
+ import { registerBuyerSweepCommand } from './sweep.js';
5
6
  import { registerBuyerBalanceCommand } from './balance.js';
6
7
  import { registerBuyerConnectionCommand } from './connection.js';
7
8
  import { registerBuyerChannelsCommand } from './channels.js';
8
9
  import { registerBuyerMeteringCommand } from './metering.js';
10
+ import { registerBuyerEmissionsCommand } from './emissions.js';
9
11
  export function registerBuyerCommands(program) {
10
12
  const buyerCmd = program
11
13
  .command('buyer')
@@ -14,9 +16,11 @@ export function registerBuyerCommands(program) {
14
16
  registerBuyerStatusCommand(buyerCmd);
15
17
  registerBuyerDepositCommand(buyerCmd);
16
18
  registerBuyerWithdrawCommand(buyerCmd);
19
+ registerBuyerSweepCommand(buyerCmd);
17
20
  registerBuyerBalanceCommand(buyerCmd);
18
21
  registerBuyerConnectionCommand(buyerCmd);
19
22
  registerBuyerChannelsCommand(buyerCmd);
20
23
  registerBuyerMeteringCommand(buyerCmd);
24
+ registerBuyerEmissionsCommand(buyerCmd);
21
25
  }
22
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAE7D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAE1E,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACrC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACtC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACtC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACzC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAE1E,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACrC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACtC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACpC,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACtC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IACzC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACvC,6BAA6B,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
@@ -7,6 +7,7 @@ export declare function buildBuyerRuntimeOverridesFromFlags(options: {
7
7
  maxInputUsdPerMillion?: number;
8
8
  maxOutputUsdPerMillion?: number;
9
9
  metadataFetchTimeoutMs?: number;
10
+ disableMetadataV2Services?: boolean;
10
11
  }): BuyerRuntimeOverrides;
11
12
  export declare function buildRouterRuntimeEnvFromBuyerConfig(buyerConfig: BuyerCLIConfig): Record<string, string>;
12
13
  export declare function resolveBuyerRouterName(options: {
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAiBxC,OAAO,EAA+B,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAQ9D,wBAAgB,mCAAmC,CAAC,OAAO,EAAE;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC,GAAG,qBAAqB,CAQxB;AAED,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKxG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE3E;AAED,wBAAgB,0BAA0B,CACxC,wBAAwB,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9C,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,EAAE,CAiBV;AAgHD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAkQjE"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAiBxC,OAAO,EAA+B,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAQ9D,wBAAgB,mCAAmC,CAAC,OAAO,EAAE;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACpC,GAAG,qBAAqB,CASxB;AAED,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKxG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAE3E;AAED,wBAAgB,0BAA0B,CACxC,wBAAwB,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9C,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,EAAE,CAiBV;AAgHD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAgRjE"}
@@ -26,6 +26,8 @@ export function buildBuyerRuntimeOverridesFromFlags(options) {
26
26
  overrides.maxOutputUsdPerMillion = options.maxOutputUsdPerMillion;
27
27
  if (options.metadataFetchTimeoutMs !== undefined)
28
28
  overrides.metadataFetchTimeoutMs = options.metadataFetchTimeoutMs;
29
+ if (options.disableMetadataV2Services === true)
30
+ overrides.disableMetadataV2Services = true;
29
31
  return overrides;
30
32
  }
31
33
  export function buildRouterRuntimeEnvFromBuyerConfig(buyerConfig) {
@@ -178,10 +180,17 @@ export function registerBuyerStartCommand(buyerCmd) {
178
180
  .option('--max-input-usd-per-million <number>', 'runtime-only max input pricing override in USD per 1M tokens', parseFloat)
179
181
  .option('--max-output-usd-per-million <number>', 'runtime-only max output pricing override in USD per 1M tokens', parseFloat)
180
182
  .option('--metadata-fetch-timeout-ms <number>', 'runtime-only timeout for each peer metadata HTTP fetch during discovery', Number)
183
+ .option('--disable-metadata-v2-services', 'runtime-only opt-out from per-service buyer metadata v2 attribution')
181
184
  .option('--peer <peerId>', 'pin all requests to a specific peer ID (40-char hex EVM address), bypassing the router')
185
+ .option('--log-filter <sourceOrText>', 'show only debug logs matching a source or text, e.g. ProxyMux')
182
186
  .action(async (options) => {
183
187
  const globalOpts = getGlobalOptions(buyerCmd);
184
188
  const config = await loadConfig(globalOpts.config);
189
+ const logFilter = typeof options.logFilter === 'string' ? options.logFilter.trim() : '';
190
+ if (logFilter.length > 0) {
191
+ process.env['ANTSEED_DEBUG'] = '1';
192
+ process.env['ANTSEED_LOG_FILTER'] = logFilter;
193
+ }
185
194
  const pinnedPeerId = options.peer;
186
195
  if (pinnedPeerId !== undefined && !/^(0x)?[0-9a-f]{40}$/i.test(pinnedPeerId)) {
187
196
  console.error(chalk.red('Error: --peer must be a 40-character hex peer ID (EVM address).'));
@@ -192,6 +201,7 @@ export function registerBuyerStartCommand(buyerCmd) {
192
201
  maxInputUsdPerMillion: options.maxInputUsdPerMillion,
193
202
  maxOutputUsdPerMillion: options.maxOutputUsdPerMillion,
194
203
  metadataFetchTimeoutMs: options.metadataFetchTimeoutMs,
204
+ disableMetadataV2Services: options.disableMetadataV2Services,
195
205
  });
196
206
  const effectiveBuyerConfig = resolveEffectiveBuyerConfig({
197
207
  config,
@@ -300,6 +310,7 @@ export function registerBuyerStartCommand(buyerCmd) {
300
310
  // seller can extract via an inflated 402 target (per 402 round trip).
301
311
  maxPerRequestUsdc: config.payments?.maxPerRequestUsdc ?? '300000',
302
312
  maxReserveAmountUsdc: config.payments?.maxReserveAmountUsdc ?? '1000000',
313
+ disableMetadataV2Services: effectiveBuyerConfig.disableMetadataV2Services,
303
314
  };
304
315
  }
305
316
  const resolvedRouterName = options.instance
@@ -318,6 +329,10 @@ export function registerBuyerStartCommand(buyerCmd) {
318
329
  console.log(chalk.dim(` min peer reputation: ${effectiveBuyerConfig.minPeerReputation}`));
319
330
  console.log(chalk.dim(` peer refresh interval: ${effectiveBuyerConfig.peerRefreshIntervalMs}ms`));
320
331
  console.log(chalk.dim(` metadata fetch timeout: ${effectiveBuyerConfig.metadataFetchTimeoutMs}ms`));
332
+ console.log(chalk.dim(` metadata v2 service opt-out: ${effectiveBuyerConfig.disableMetadataV2Services ? 'enabled' : 'disabled'}`));
333
+ if (logFilter.length > 0) {
334
+ console.log(chalk.dim(` debug log filter: ${logFilter}`));
335
+ }
321
336
  console.log(chalk.dim(` proxy port: ${effectiveBuyerConfig.proxyPort}`));
322
337
  if (pinnedPeerId) {
323
338
  console.log(chalk.yellow(` pinned peer: ${pinnedPeerId} (router bypassed)`));
@@ -409,6 +424,7 @@ export function registerBuyerStartCommand(buyerCmd) {
409
424
  }
410
425
  console.log('');
411
426
  console.log(chalk.dim('Enable debug logs: export ANTSEED_DEBUG=1'));
427
+ console.log(chalk.dim('Filter debug logs: antseed buyer start --log-filter ProxyMux'));
412
428
  console.log('');
413
429
  setupShutdownHandler(async () => {
414
430
  nodeSpinner.start('Shutting down...');