@antseed/cli 0.1.132 → 0.1.133
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.
- package/README.md +12 -1
- package/dist/cli/commands/buyer/channel-withdraw.d.ts +7 -0
- package/dist/cli/commands/buyer/channel-withdraw.d.ts.map +1 -0
- package/dist/cli/commands/buyer/channel-withdraw.js +178 -0
- package/dist/cli/commands/buyer/channel-withdraw.js.map +1 -0
- package/dist/cli/commands/buyer/channel-withdraw.test.d.ts +2 -0
- package/dist/cli/commands/buyer/channel-withdraw.test.d.ts.map +1 -0
- package/dist/cli/commands/buyer/channel-withdraw.test.js +45 -0
- package/dist/cli/commands/buyer/channel-withdraw.test.js.map +1 -0
- package/dist/cli/commands/buyer/channels.d.ts.map +1 -1
- package/dist/cli/commands/buyer/channels.js +60 -52
- package/dist/cli/commands/buyer/channels.js.map +1 -1
- package/dist/cli/commands/buyer/emissions.d.ts +3 -0
- package/dist/cli/commands/buyer/emissions.d.ts.map +1 -0
- package/dist/cli/commands/buyer/emissions.js +5 -0
- package/dist/cli/commands/buyer/emissions.js.map +1 -0
- package/dist/cli/commands/buyer/index.d.ts.map +1 -1
- package/dist/cli/commands/buyer/index.js +4 -0
- package/dist/cli/commands/buyer/index.js.map +1 -1
- package/dist/cli/commands/buyer/start.d.ts +1 -0
- package/dist/cli/commands/buyer/start.d.ts.map +1 -1
- package/dist/cli/commands/buyer/start.js +16 -0
- package/dist/cli/commands/buyer/start.js.map +1 -1
- package/dist/cli/commands/buyer/start.test.js +2 -0
- package/dist/cli/commands/buyer/start.test.js.map +1 -1
- package/dist/cli/commands/buyer/sweep.d.ts +3 -0
- package/dist/cli/commands/buyer/sweep.d.ts.map +1 -0
- package/dist/cli/commands/buyer/sweep.js +332 -0
- package/dist/cli/commands/buyer/sweep.js.map +1 -0
- package/dist/cli/commands/buyer/sweep.test.d.ts +2 -0
- package/dist/cli/commands/buyer/sweep.test.d.ts.map +1 -0
- package/dist/cli/commands/buyer/sweep.test.js +46 -0
- package/dist/cli/commands/buyer/sweep.test.js.map +1 -0
- package/dist/cli/commands/emissions.d.ts +10 -0
- package/dist/cli/commands/emissions.d.ts.map +1 -0
- package/dist/cli/commands/emissions.js +91 -0
- package/dist/cli/commands/emissions.js.map +1 -0
- package/dist/cli/commands/emissions.test.d.ts +2 -0
- package/dist/cli/commands/emissions.test.d.ts.map +1 -0
- package/dist/cli/commands/emissions.test.js +16 -0
- package/dist/cli/commands/emissions.test.js.map +1 -0
- package/dist/cli/commands/seller/emissions.d.ts.map +1 -1
- package/dist/cli/commands/seller/emissions.js +2 -77
- package/dist/cli/commands/seller/emissions.js.map +1 -1
- package/dist/cli/commands/seller/start.d.ts.map +1 -1
- package/dist/cli/commands/seller/start.js +5 -0
- package/dist/cli/commands/seller/start.js.map +1 -1
- package/dist/cli/commands/system-proxy/index.d.ts +3 -0
- package/dist/cli/commands/system-proxy/index.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/index.js +14 -0
- package/dist/cli/commands/system-proxy/index.js.map +1 -0
- package/dist/cli/commands/system-proxy/install-ca.d.ts +3 -0
- package/dist/cli/commands/system-proxy/install-ca.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/install-ca.js +43 -0
- package/dist/cli/commands/system-proxy/install-ca.js.map +1 -0
- package/dist/cli/commands/system-proxy/start.d.ts +3 -0
- package/dist/cli/commands/system-proxy/start.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/start.js +151 -0
- package/dist/cli/commands/system-proxy/start.js.map +1 -0
- package/dist/cli/commands/system-proxy/status.d.ts +3 -0
- package/dist/cli/commands/system-proxy/status.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/status.js +60 -0
- package/dist/cli/commands/system-proxy/status.js.map +1 -0
- package/dist/cli/commands/system-proxy/stop.d.ts +3 -0
- package/dist/cli/commands/system-proxy/stop.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/stop.js +71 -0
- package/dist/cli/commands/system-proxy/stop.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/payment-utils.d.ts +7 -1
- package/dist/cli/payment-utils.d.ts.map +1 -1
- package/dist/cli/payment-utils.js +20 -1
- package/dist/cli/payment-utils.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +5 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/effective.d.ts +1 -0
- package/dist/config/effective.d.ts.map +1 -1
- package/dist/config/effective.js +18 -0
- package/dist/config/effective.js.map +1 -1
- package/dist/config/effective.test.js +10 -0
- package/dist/config/effective.test.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +9 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/loader.test.js +31 -0
- package/dist/config/loader.test.js.map +1 -1
- package/dist/config/types.d.ts +20 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +17 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/proxy/buyer-proxy.d.ts +2 -0
- package/dist/proxy/buyer-proxy.d.ts.map +1 -1
- package/dist/proxy/buyer-proxy.js +89 -16
- package/dist/proxy/buyer-proxy.js.map +1 -1
- package/dist/proxy/buyer-proxy.test.js +190 -1
- package/dist/proxy/buyer-proxy.test.js.map +1 -1
- package/dist/proxy/request-utils.d.ts +1 -1
- package/dist/proxy/request-utils.d.ts.map +1 -1
- package/dist/proxy/request-utils.js +9 -3
- package/dist/proxy/request-utils.js.map +1 -1
- package/dist/proxy/service-api-adapter.d.ts +2 -2
- package/dist/proxy/service-api-adapter.d.ts.map +1 -1
- package/dist/proxy/service-api-adapter.js +1 -1
- package/dist/proxy/service-api-adapter.js.map +1 -1
- package/dist/proxy/service-api-adapter.test.js +21 -12
- package/dist/proxy/service-api-adapter.test.js.map +1 -1
- package/dist/system-proxy/ca-manager.d.ts +21 -0
- package/dist/system-proxy/ca-manager.d.ts.map +1 -0
- package/dist/system-proxy/ca-manager.js +112 -0
- package/dist/system-proxy/ca-manager.js.map +1 -0
- package/dist/system-proxy/ca-manager.test.d.ts +2 -0
- package/dist/system-proxy/ca-manager.test.d.ts.map +1 -0
- package/dist/system-proxy/ca-manager.test.js +64 -0
- package/dist/system-proxy/ca-manager.test.js.map +1 -0
- package/dist/system-proxy/cert-cache.d.ts +16 -0
- package/dist/system-proxy/cert-cache.d.ts.map +1 -0
- package/dist/system-proxy/cert-cache.js +69 -0
- package/dist/system-proxy/cert-cache.js.map +1 -0
- package/dist/system-proxy/cert-cache.test.d.ts +2 -0
- package/dist/system-proxy/cert-cache.test.d.ts.map +1 -0
- package/dist/system-proxy/cert-cache.test.js +52 -0
- package/dist/system-proxy/cert-cache.test.js.map +1 -0
- package/dist/system-proxy/index.d.ts +11 -0
- package/dist/system-proxy/index.d.ts.map +1 -0
- package/dist/system-proxy/index.js +7 -0
- package/dist/system-proxy/index.js.map +1 -0
- package/dist/system-proxy/node-hook.d.ts +3 -0
- package/dist/system-proxy/node-hook.d.ts.map +1 -0
- package/dist/system-proxy/node-hook.js +27 -0
- package/dist/system-proxy/node-hook.js.map +1 -0
- package/dist/system-proxy/profiles.d.ts +13 -0
- package/dist/system-proxy/profiles.d.ts.map +1 -0
- package/dist/system-proxy/profiles.js +150 -0
- package/dist/system-proxy/profiles.js.map +1 -0
- package/dist/system-proxy/profiles.test.d.ts +2 -0
- package/dist/system-proxy/profiles.test.d.ts.map +1 -0
- package/dist/system-proxy/profiles.test.js +66 -0
- package/dist/system-proxy/profiles.test.js.map +1 -0
- package/dist/system-proxy/proxy-server.d.ts +98 -0
- package/dist/system-proxy/proxy-server.d.ts.map +1 -0
- package/dist/system-proxy/proxy-server.js +977 -0
- package/dist/system-proxy/proxy-server.js.map +1 -0
- package/dist/system-proxy/proxy-server.test.d.ts +2 -0
- package/dist/system-proxy/proxy-server.test.d.ts.map +1 -0
- package/dist/system-proxy/proxy-server.test.js +778 -0
- package/dist/system-proxy/proxy-server.test.js.map +1 -0
- package/dist/system-proxy/system-proxy.d.ts +25 -0
- package/dist/system-proxy/system-proxy.d.ts.map +1 -0
- package/dist/system-proxy/system-proxy.js +152 -0
- package/dist/system-proxy/system-proxy.js.map +1 -0
- package/dist/system-proxy/types.d.ts +69 -0
- package/dist/system-proxy/types.d.ts.map +1 -0
- package/dist/system-proxy/types.js +2 -0
- package/dist/system-proxy/types.js.map +1 -0
- package/package.json +7 -5
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 @@
|
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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":"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,
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../../../../src/cli/commands/buyer/channels.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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;
|
|
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;
|
|
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;
|
|
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...');
|