@antseed/cli 0.1.59 → 0.1.61
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 +46 -37
- package/package.json +6 -6
- package/dist/cli/commands/agent.d.ts +0 -3
- package/dist/cli/commands/agent.d.ts.map +0 -1
- package/dist/cli/commands/agent.js +0 -165
- package/dist/cli/commands/agent.js.map +0 -1
- package/dist/cli/commands/balance.d.ts +0 -3
- package/dist/cli/commands/balance.d.ts.map +0 -1
- package/dist/cli/commands/balance.js +0 -62
- package/dist/cli/commands/balance.js.map +0 -1
- package/dist/cli/commands/bootstrap.d.ts +0 -3
- package/dist/cli/commands/bootstrap.d.ts.map +0 -1
- package/dist/cli/commands/bootstrap.js +0 -46
- package/dist/cli/commands/bootstrap.js.map +0 -1
- package/dist/cli/commands/browse.d.ts +0 -7
- package/dist/cli/commands/browse.d.ts.map +0 -1
- package/dist/cli/commands/browse.js +0 -103
- package/dist/cli/commands/browse.js.map +0 -1
- package/dist/cli/commands/channels.d.ts +0 -3
- package/dist/cli/commands/channels.d.ts.map +0 -1
- package/dist/cli/commands/channels.js +0 -79
- package/dist/cli/commands/channels.js.map +0 -1
- package/dist/cli/commands/claim.d.ts +0 -3
- package/dist/cli/commands/claim.d.ts.map +0 -1
- package/dist/cli/commands/claim.js +0 -35
- package/dist/cli/commands/claim.js.map +0 -1
- package/dist/cli/commands/config.d.ts +0 -20
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js +0 -239
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/connect.d.ts +0 -13
- package/dist/cli/commands/connect.d.ts.map +0 -1
- package/dist/cli/commands/connect.js +0 -402
- package/dist/cli/commands/connect.js.map +0 -1
- package/dist/cli/commands/connect.test.d.ts +0 -2
- package/dist/cli/commands/connect.test.d.ts.map +0 -1
- package/dist/cli/commands/connect.test.js +0 -52
- package/dist/cli/commands/connect.test.js.map +0 -1
- package/dist/cli/commands/connection.d.ts +0 -3
- package/dist/cli/commands/connection.d.ts.map +0 -1
- package/dist/cli/commands/connection.js +0 -128
- package/dist/cli/commands/connection.js.map +0 -1
- package/dist/cli/commands/dashboard.d.ts +0 -6
- package/dist/cli/commands/dashboard.d.ts.map +0 -1
- package/dist/cli/commands/dashboard.js +0 -48
- package/dist/cli/commands/dashboard.js.map +0 -1
- package/dist/cli/commands/deposit.d.ts +0 -3
- package/dist/cli/commands/deposit.d.ts.map +0 -1
- package/dist/cli/commands/deposit.js +0 -38
- package/dist/cli/commands/deposit.js.map +0 -1
- package/dist/cli/commands/dev.d.ts +0 -3
- package/dist/cli/commands/dev.d.ts.map +0 -1
- package/dist/cli/commands/dev.js +0 -94
- package/dist/cli/commands/dev.js.map +0 -1
- package/dist/cli/commands/emissions.d.ts +0 -3
- package/dist/cli/commands/emissions.d.ts.map +0 -1
- package/dist/cli/commands/emissions.js +0 -80
- package/dist/cli/commands/emissions.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -3
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -90
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/payments.d.ts +0 -3
- package/dist/cli/commands/payments.d.ts.map +0 -1
- package/dist/cli/commands/payments.js +0 -26
- package/dist/cli/commands/payments.js.map +0 -1
- package/dist/cli/commands/plugin-create.d.ts +0 -11
- package/dist/cli/commands/plugin-create.d.ts.map +0 -1
- package/dist/cli/commands/plugin-create.js +0 -201
- package/dist/cli/commands/plugin-create.js.map +0 -1
- package/dist/cli/commands/plugin-create.test.d.ts +0 -2
- package/dist/cli/commands/plugin-create.test.d.ts.map +0 -1
- package/dist/cli/commands/plugin-create.test.js +0 -53
- package/dist/cli/commands/plugin-create.test.js.map +0 -1
- package/dist/cli/commands/plugin.d.ts +0 -3
- package/dist/cli/commands/plugin.d.ts.map +0 -1
- package/dist/cli/commands/plugin.js +0 -279
- package/dist/cli/commands/plugin.js.map +0 -1
- package/dist/cli/commands/plugin.test.d.ts +0 -2
- package/dist/cli/commands/plugin.test.d.ts.map +0 -1
- package/dist/cli/commands/plugin.test.js +0 -54
- package/dist/cli/commands/plugin.test.js.map +0 -1
- package/dist/cli/commands/profile.d.ts +0 -10
- package/dist/cli/commands/profile.d.ts.map +0 -1
- package/dist/cli/commands/profile.js +0 -89
- package/dist/cli/commands/profile.js.map +0 -1
- package/dist/cli/commands/register.d.ts +0 -3
- package/dist/cli/commands/register.d.ts.map +0 -1
- package/dist/cli/commands/register.js +0 -35
- package/dist/cli/commands/register.js.map +0 -1
- package/dist/cli/commands/seed.d.ts +0 -14
- package/dist/cli/commands/seed.d.ts.map +0 -1
- package/dist/cli/commands/seed.js +0 -500
- package/dist/cli/commands/seed.js.map +0 -1
- package/dist/cli/commands/seed.test.d.ts +0 -2
- package/dist/cli/commands/seed.test.d.ts.map +0 -1
- package/dist/cli/commands/seed.test.js +0 -92
- package/dist/cli/commands/seed.test.js.map +0 -1
- package/dist/cli/commands/setup.d.ts +0 -3
- package/dist/cli/commands/setup.d.ts.map +0 -1
- package/dist/cli/commands/setup.js +0 -84
- package/dist/cli/commands/setup.js.map +0 -1
- package/dist/cli/commands/stake.d.ts +0 -3
- package/dist/cli/commands/stake.d.ts.map +0 -1
- package/dist/cli/commands/stake.js +0 -83
- package/dist/cli/commands/stake.js.map +0 -1
- package/dist/cli/commands/status.d.ts +0 -8
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js +0 -55
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/subscribe.d.ts +0 -3
- package/dist/cli/commands/subscribe.d.ts.map +0 -1
- package/dist/cli/commands/subscribe.js +0 -96
- package/dist/cli/commands/subscribe.js.map +0 -1
- package/dist/cli/commands/types.d.ts +0 -14
- package/dist/cli/commands/types.d.ts.map +0 -1
- package/dist/cli/commands/types.js +0 -41
- package/dist/cli/commands/types.js.map +0 -1
- package/dist/cli/commands/withdraw.d.ts +0 -3
- package/dist/cli/commands/withdraw.d.ts.map +0 -1
- package/dist/cli/commands/withdraw.js +0 -48
- package/dist/cli/commands/withdraw.js.map +0 -1
- package/dist/cli/formatters.d.ts +0 -29
- package/dist/cli/formatters.d.ts.map +0 -1
- package/dist/cli/formatters.js +0 -67
- package/dist/cli/formatters.js.map +0 -1
- package/dist/cli/index.d.ts +0 -3
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -65
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/payment-utils.d.ts +0 -53
- package/dist/cli/payment-utils.d.ts.map +0 -1
- package/dist/cli/payment-utils.js +0 -137
- package/dist/cli/payment-utils.js.map +0 -1
- package/dist/cli/shutdown.d.ts +0 -11
- package/dist/cli/shutdown.d.ts.map +0 -1
- package/dist/cli/shutdown.js +0 -34
- package/dist/cli/shutdown.js.map +0 -1
- package/dist/config/defaults.d.ts +0 -6
- package/dist/config/defaults.d.ts.map +0 -1
- package/dist/config/defaults.js +0 -53
- package/dist/config/defaults.js.map +0 -1
- package/dist/config/effective.d.ts +0 -25
- package/dist/config/effective.d.ts.map +0 -1
- package/dist/config/effective.js +0 -67
- package/dist/config/effective.js.map +0 -1
- package/dist/config/effective.test.d.ts +0 -2
- package/dist/config/effective.test.d.ts.map +0 -1
- package/dist/config/effective.test.js +0 -62
- package/dist/config/effective.test.js.map +0 -1
- package/dist/config/loader.d.ts +0 -12
- package/dist/config/loader.d.ts.map +0 -1
- package/dist/config/loader.js +0 -269
- package/dist/config/loader.js.map +0 -1
- package/dist/config/loader.test.d.ts +0 -2
- package/dist/config/loader.test.d.ts.map +0 -1
- package/dist/config/loader.test.js +0 -124
- package/dist/config/loader.test.js.map +0 -1
- package/dist/config/types.d.ts +0 -167
- package/dist/config/types.d.ts.map +0 -1
- package/dist/config/types.js +0 -2
- package/dist/config/types.js.map +0 -1
- package/dist/config/validation.d.ts +0 -10
- package/dist/config/validation.d.ts.map +0 -1
- package/dist/config/validation.js +0 -130
- package/dist/config/validation.js.map +0 -1
- package/dist/env/load-env.d.ts +0 -6
- package/dist/env/load-env.d.ts.map +0 -1
- package/dist/env/load-env.js +0 -18
- package/dist/env/load-env.js.map +0 -1
- package/dist/plugins/loader.d.ts +0 -12
- package/dist/plugins/loader.d.ts.map +0 -1
- package/dist/plugins/loader.js +0 -111
- package/dist/plugins/loader.js.map +0 -1
- package/dist/plugins/manager.d.ts +0 -11
- package/dist/plugins/manager.d.ts.map +0 -1
- package/dist/plugins/manager.js +0 -52
- package/dist/plugins/manager.js.map +0 -1
- package/dist/plugins/registry.d.ts +0 -8
- package/dist/plugins/registry.d.ts.map +0 -1
- package/dist/plugins/registry.js +0 -45
- package/dist/plugins/registry.js.map +0 -1
- package/dist/proxy/buyer-proxy.d.ts +0 -82
- package/dist/proxy/buyer-proxy.d.ts.map +0 -1
- package/dist/proxy/buyer-proxy.js +0 -1056
- package/dist/proxy/buyer-proxy.js.map +0 -1
- package/dist/proxy/buyer-proxy.test.d.ts +0 -2
- package/dist/proxy/buyer-proxy.test.d.ts.map +0 -1
- package/dist/proxy/buyer-proxy.test.js +0 -124
- package/dist/proxy/buyer-proxy.test.js.map +0 -1
- package/dist/proxy/request-utils.d.ts +0 -21
- package/dist/proxy/request-utils.d.ts.map +0 -1
- package/dist/proxy/request-utils.js +0 -237
- package/dist/proxy/request-utils.js.map +0 -1
- package/dist/proxy/routing.d.ts +0 -17
- package/dist/proxy/routing.d.ts.map +0 -1
- package/dist/proxy/routing.js +0 -115
- package/dist/proxy/routing.js.map +0 -1
- package/dist/proxy/service-api-adapter.d.ts +0 -3
- package/dist/proxy/service-api-adapter.d.ts.map +0 -1
- package/dist/proxy/service-api-adapter.js +0 -2
- package/dist/proxy/service-api-adapter.js.map +0 -1
- package/dist/proxy/service-api-adapter.test.d.ts +0 -2
- package/dist/proxy/service-api-adapter.test.d.ts.map +0 -1
- package/dist/proxy/service-api-adapter.test.js +0 -121
- package/dist/proxy/service-api-adapter.test.js.map +0 -1
- package/dist/proxy/telemetry.d.ts +0 -23
- package/dist/proxy/telemetry.d.ts.map +0 -1
- package/dist/proxy/telemetry.js +0 -227
- package/dist/proxy/telemetry.js.map +0 -1
- package/dist/status/node-status.d.ts +0 -22
- package/dist/status/node-status.d.ts.map +0 -1
- package/dist/status/node-status.js +0 -83
- package/dist/status/node-status.js.map +0 -1
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import ora from 'ora';
|
|
3
|
-
import { readFile } from 'node:fs/promises';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { homedir } from 'node:os';
|
|
6
|
-
import { createConnection } from 'node:net';
|
|
7
|
-
import { getGlobalOptions } from './types.js';
|
|
8
|
-
import { loadConfig } from '../../config/loader.js';
|
|
9
|
-
import { AntseedNode, DepositsClient, getInstance, resolveChainConfig } from '@antseed/node';
|
|
10
|
-
import { OFFICIAL_BOOTSTRAP_NODES, parseBootstrapList, toBootstrapConfig } from '@antseed/node/discovery';
|
|
11
|
-
import { setupShutdownHandler } from '../shutdown.js';
|
|
12
|
-
import { loadRouterPlugin, buildPluginConfig, getPackageVersions } from '../../plugins/loader.js';
|
|
13
|
-
import { BuyerProxy } from '../../proxy/buyer-proxy.js';
|
|
14
|
-
import { resolveEffectiveBuyerConfig } from '../../config/effective.js';
|
|
15
|
-
export function buildBuyerRuntimeOverridesFromFlags(options) {
|
|
16
|
-
const overrides = {};
|
|
17
|
-
if (options.port !== undefined) {
|
|
18
|
-
overrides.proxyPort = options.port;
|
|
19
|
-
}
|
|
20
|
-
if (options.minPeerReputation !== undefined) {
|
|
21
|
-
overrides.minPeerReputation = options.minPeerReputation;
|
|
22
|
-
}
|
|
23
|
-
if (options.maxInputUsdPerMillion !== undefined) {
|
|
24
|
-
overrides.maxInputUsdPerMillion = options.maxInputUsdPerMillion;
|
|
25
|
-
}
|
|
26
|
-
if (options.maxOutputUsdPerMillion !== undefined) {
|
|
27
|
-
overrides.maxOutputUsdPerMillion = options.maxOutputUsdPerMillion;
|
|
28
|
-
}
|
|
29
|
-
return overrides;
|
|
30
|
-
}
|
|
31
|
-
export function buildRouterRuntimeEnvFromBuyerConfig(buyerConfig) {
|
|
32
|
-
const runtimeEnv = {
|
|
33
|
-
ANTSEED_MIN_REPUTATION: String(buyerConfig.minPeerReputation),
|
|
34
|
-
ANTSEED_MAX_PRICING_JSON: JSON.stringify(buyerConfig.maxPricing),
|
|
35
|
-
};
|
|
36
|
-
return runtimeEnv;
|
|
37
|
-
}
|
|
38
|
-
export function buildBuyerBootstrapEntries(configuredBootstrapNodes, localSeederDhtPort) {
|
|
39
|
-
const configured = Array.isArray(configuredBootstrapNodes)
|
|
40
|
-
? configuredBootstrapNodes.filter((entry) => typeof entry === 'string' && entry.trim().length > 0)
|
|
41
|
-
: [];
|
|
42
|
-
// Respect explicit user bootstrap config. If none is provided, keep default public bootstrap nodes.
|
|
43
|
-
const baseEntries = configured.length > 0
|
|
44
|
-
? configured
|
|
45
|
-
: OFFICIAL_BOOTSTRAP_NODES.map((node) => `${node.host}:${node.port}`);
|
|
46
|
-
const entries = [...baseEntries];
|
|
47
|
-
if (Number.isFinite(localSeederDhtPort) && (localSeederDhtPort ?? 0) > 0) {
|
|
48
|
-
const localBootstrap = `127.0.0.1:${Math.floor(localSeederDhtPort)}`;
|
|
49
|
-
if (!entries.includes(localBootstrap)) {
|
|
50
|
-
entries.unshift(localBootstrap);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return entries;
|
|
54
|
-
}
|
|
55
|
-
function parseOptionalBoolEnv(value) {
|
|
56
|
-
if (value === undefined)
|
|
57
|
-
return null;
|
|
58
|
-
const normalized = value.trim().toLowerCase();
|
|
59
|
-
if (['1', 'true', 'yes', 'on'].includes(normalized))
|
|
60
|
-
return true;
|
|
61
|
-
if (['0', 'false', 'no', 'off'].includes(normalized))
|
|
62
|
-
return false;
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
async function isRpcReachable(rpcUrl, timeoutMs = 1500) {
|
|
66
|
-
const controller = new AbortController();
|
|
67
|
-
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
68
|
-
try {
|
|
69
|
-
const response = await fetch(rpcUrl, {
|
|
70
|
-
method: 'POST',
|
|
71
|
-
headers: { 'content-type': 'application/json' },
|
|
72
|
-
body: JSON.stringify({
|
|
73
|
-
jsonrpc: '2.0',
|
|
74
|
-
id: 1,
|
|
75
|
-
method: 'eth_chainId',
|
|
76
|
-
params: [],
|
|
77
|
-
}),
|
|
78
|
-
signal: controller.signal,
|
|
79
|
-
});
|
|
80
|
-
if (!response.ok)
|
|
81
|
-
return false;
|
|
82
|
-
const payload = await response.json();
|
|
83
|
-
return typeof payload.result === 'string' && payload.result.startsWith('0x');
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
finally {
|
|
89
|
-
clearTimeout(timeout);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
async function getLocalSeederInfo() {
|
|
93
|
-
try {
|
|
94
|
-
const stateFile = join(homedir(), '.antseed', 'daemon.state.json');
|
|
95
|
-
const raw = await readFile(stateFile, 'utf-8');
|
|
96
|
-
const state = JSON.parse(raw);
|
|
97
|
-
if (state.state === 'seeding' && state.dhtPort && state.pid) {
|
|
98
|
-
try {
|
|
99
|
-
process.kill(state.pid, 0);
|
|
100
|
-
const signalingPort = state.signalingPort ?? state.dhtPort;
|
|
101
|
-
return { dhtPort: state.dhtPort, signalingPort, pid: state.pid };
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
catch {
|
|
109
|
-
// No state file or unreadable
|
|
110
|
-
}
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
function isAddrInUseError(error) {
|
|
114
|
-
if (!(error instanceof Error)) {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
return error.message.includes('EADDRINUSE');
|
|
118
|
-
}
|
|
119
|
-
async function isPortReachable(port, timeoutMs = 700) {
|
|
120
|
-
return await new Promise((resolve) => {
|
|
121
|
-
const socket = createConnection({ host: '127.0.0.1', port: Math.floor(port) });
|
|
122
|
-
let settled = false;
|
|
123
|
-
const finish = (reachable) => {
|
|
124
|
-
if (settled)
|
|
125
|
-
return;
|
|
126
|
-
settled = true;
|
|
127
|
-
socket.destroy();
|
|
128
|
-
resolve(reachable);
|
|
129
|
-
};
|
|
130
|
-
socket.once('connect', () => finish(true));
|
|
131
|
-
socket.once('error', () => finish(false));
|
|
132
|
-
socket.setTimeout(timeoutMs, () => finish(false));
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
async function isCompatibleBuyerProxy(port, timeoutMs = 1200) {
|
|
136
|
-
const overallBudgetMs = Math.max(1, timeoutMs);
|
|
137
|
-
const startedAt = Date.now();
|
|
138
|
-
const reachabilityTimeoutMs = Math.min(overallBudgetMs, 700);
|
|
139
|
-
if (!await isPortReachable(port, reachabilityTimeoutMs)) {
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
const elapsedMs = Date.now() - startedAt;
|
|
143
|
-
const remainingBudgetMs = overallBudgetMs - elapsedMs;
|
|
144
|
-
if (remainingBudgetMs <= 0) {
|
|
145
|
-
return false;
|
|
146
|
-
}
|
|
147
|
-
const controller = new AbortController();
|
|
148
|
-
const timeout = setTimeout(() => controller.abort(), remainingBudgetMs);
|
|
149
|
-
try {
|
|
150
|
-
const response = await fetch(`http://127.0.0.1:${Math.floor(port)}/v1/models`, {
|
|
151
|
-
method: 'GET',
|
|
152
|
-
headers: {
|
|
153
|
-
accept: 'application/json',
|
|
154
|
-
},
|
|
155
|
-
signal: controller.signal,
|
|
156
|
-
});
|
|
157
|
-
// Antseed proxy usually attaches these telemetry headers when a request reached routing.
|
|
158
|
-
const antseedHeaderNames = ['x-antseed-request-id', 'x-antseed-peer-id', 'x-antseed-provider'];
|
|
159
|
-
if (antseedHeaderNames.some((header) => response.headers.has(header))) {
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
const body = (await response.text()).toLowerCase();
|
|
163
|
-
// Local proxy-generated fallbacks that may not include telemetry headers.
|
|
164
|
-
if (body.includes('no sellers available on the network')
|
|
165
|
-
|| body.includes('no peers support')
|
|
166
|
-
|| body.includes('p2p request failed')
|
|
167
|
-
|| body.includes('pinned peer')) {
|
|
168
|
-
return true;
|
|
169
|
-
}
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
catch {
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
finally {
|
|
176
|
-
clearTimeout(timeout);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
export function registerConnectCommand(program) {
|
|
180
|
-
program
|
|
181
|
-
.command('connect')
|
|
182
|
-
.description('Start the buyer proxy and connect to sellers on the P2P network')
|
|
183
|
-
.option('-p, --port <number>', 'local proxy port', (v) => parseInt(v, 10))
|
|
184
|
-
.option('--router <name>', 'router plugin name or npm package')
|
|
185
|
-
.option('--instance <id>', 'use a configured plugin instance by ID')
|
|
186
|
-
.option('--max-input-usd-per-million <number>', 'runtime-only max input pricing override in USD per 1M tokens', parseFloat)
|
|
187
|
-
.option('--max-output-usd-per-million <number>', 'runtime-only max output pricing override in USD per 1M tokens', parseFloat)
|
|
188
|
-
.option('--peer <peerId>', 'pin all requests to a specific peer ID (40-char hex EVM address), bypassing the router')
|
|
189
|
-
.action(async (options) => {
|
|
190
|
-
const globalOpts = getGlobalOptions(program);
|
|
191
|
-
const config = await loadConfig(globalOpts.config);
|
|
192
|
-
const pinnedPeerId = options.peer;
|
|
193
|
-
if (pinnedPeerId !== undefined && !/^(0x)?[0-9a-f]{40}$/i.test(pinnedPeerId)) {
|
|
194
|
-
console.error(chalk.red('Error: --peer must be a 40-character hex peer ID (EVM address).'));
|
|
195
|
-
process.exit(1);
|
|
196
|
-
}
|
|
197
|
-
const runtimeOverrides = buildBuyerRuntimeOverridesFromFlags({
|
|
198
|
-
port: options.port,
|
|
199
|
-
maxInputUsdPerMillion: options.maxInputUsdPerMillion,
|
|
200
|
-
maxOutputUsdPerMillion: options.maxOutputUsdPerMillion,
|
|
201
|
-
});
|
|
202
|
-
const effectiveBuyerConfig = resolveEffectiveBuyerConfig({
|
|
203
|
-
config,
|
|
204
|
-
buyerOverrides: runtimeOverrides,
|
|
205
|
-
});
|
|
206
|
-
let router;
|
|
207
|
-
let toolHints = [];
|
|
208
|
-
if (options.instance) {
|
|
209
|
-
const configPath = join(homedir(), '.antseed', 'config.json');
|
|
210
|
-
const instance = await getInstance(configPath, options.instance);
|
|
211
|
-
if (!instance) {
|
|
212
|
-
console.error(chalk.red(`Instance "${options.instance}" not found.`));
|
|
213
|
-
process.exit(1);
|
|
214
|
-
}
|
|
215
|
-
if (instance.type !== 'router') {
|
|
216
|
-
console.error(chalk.red(`Instance "${options.instance}" is a ${instance.type}, not a router.`));
|
|
217
|
-
process.exit(1);
|
|
218
|
-
}
|
|
219
|
-
const spinner = ora(`Loading router plugin "${instance.package}"...`).start();
|
|
220
|
-
try {
|
|
221
|
-
const plugin = await loadRouterPlugin(instance.package);
|
|
222
|
-
const runtimeEnv = buildRouterRuntimeEnvFromBuyerConfig(effectiveBuyerConfig);
|
|
223
|
-
const pluginConfig = buildPluginConfig(plugin.configSchema ?? plugin.configKeys ?? [], runtimeEnv, instance.config);
|
|
224
|
-
router = await plugin.createRouter(pluginConfig);
|
|
225
|
-
spinner.succeed(chalk.green(`Router "${plugin.displayName}" loaded`));
|
|
226
|
-
toolHints = plugin.TOOL_HINTS ?? [];
|
|
227
|
-
}
|
|
228
|
-
catch (err) {
|
|
229
|
-
spinner.fail(chalk.red(`Failed to load router: ${err.message}`));
|
|
230
|
-
process.exit(1);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
else if (options.router) {
|
|
234
|
-
const spinner = ora(`Loading router plugin "${options.router}"...`).start();
|
|
235
|
-
try {
|
|
236
|
-
const plugin = await loadRouterPlugin(options.router);
|
|
237
|
-
const runtimeEnv = buildRouterRuntimeEnvFromBuyerConfig(effectiveBuyerConfig);
|
|
238
|
-
const pluginConfig = buildPluginConfig(plugin.configSchema ?? plugin.configKeys ?? [], runtimeEnv);
|
|
239
|
-
router = await plugin.createRouter(pluginConfig);
|
|
240
|
-
spinner.succeed(chalk.green(`Router "${plugin.displayName}" loaded`));
|
|
241
|
-
toolHints = plugin.TOOL_HINTS ?? [];
|
|
242
|
-
}
|
|
243
|
-
catch (err) {
|
|
244
|
-
spinner.fail(chalk.red(`Failed to load router: ${err.message}`));
|
|
245
|
-
process.exit(1);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
console.error(chalk.red('Error: No router specified.'));
|
|
250
|
-
console.error(chalk.dim('Run: antseed connect --router <name> or antseed connect --instance <id>'));
|
|
251
|
-
process.exit(1);
|
|
252
|
-
}
|
|
253
|
-
// Auto-discover local seeder
|
|
254
|
-
const seederInfo = await getLocalSeederInfo();
|
|
255
|
-
const allBootstrapEntries = buildBuyerBootstrapEntries(config.network?.bootstrapNodes, seederInfo?.dhtPort);
|
|
256
|
-
const bootstrapNodes = toBootstrapConfig(parseBootstrapList(allBootstrapEntries));
|
|
257
|
-
const nodeSpinner = ora('Connecting to P2P network...').start();
|
|
258
|
-
// Build payment config — use protocol chain defaults + user overrides
|
|
259
|
-
let paymentsConfig;
|
|
260
|
-
const settlementEnv = parseOptionalBoolEnv(process.env['ANTSEED_ENABLE_SETTLEMENT']);
|
|
261
|
-
const cryptoOverrides = config.payments?.crypto;
|
|
262
|
-
// Resolve chain config with protocol defaults (always available)
|
|
263
|
-
const chainConfig = resolveChainConfig({
|
|
264
|
-
chainId: cryptoOverrides?.chainId,
|
|
265
|
-
rpcUrl: cryptoOverrides?.rpcUrl,
|
|
266
|
-
depositsContractAddress: cryptoOverrides?.depositsContractAddress,
|
|
267
|
-
channelsContractAddress: cryptoOverrides?.channelsContractAddress,
|
|
268
|
-
usdcContractAddress: cryptoOverrides?.usdcContractAddress,
|
|
269
|
-
});
|
|
270
|
-
let settlementEnabled = settlementEnv ?? true;
|
|
271
|
-
if (settlementEnabled && settlementEnv !== true) {
|
|
272
|
-
const rpcUp = await isRpcReachable(chainConfig.rpcUrl);
|
|
273
|
-
if (!rpcUp) {
|
|
274
|
-
settlementEnabled = false;
|
|
275
|
-
console.log(chalk.yellow(`Payments disabled: RPC node unreachable at ${chainConfig.rpcUrl}`));
|
|
276
|
-
console.log(chalk.dim('Start your chain node or set ANTSEED_ENABLE_SETTLEMENT=true to force-enable payments.'));
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
if (settlementEnabled) {
|
|
280
|
-
paymentsConfig = {
|
|
281
|
-
enabled: true,
|
|
282
|
-
rpcUrl: chainConfig.rpcUrl,
|
|
283
|
-
depositsAddress: chainConfig.depositsContractAddress,
|
|
284
|
-
channelsAddress: chainConfig.channelsContractAddress,
|
|
285
|
-
usdcAddress: chainConfig.usdcContractAddress,
|
|
286
|
-
chainId: chainConfig.evmChainId,
|
|
287
|
-
defaultDepositAmountUSDC: cryptoOverrides?.defaultLockAmountUSDC
|
|
288
|
-
? String(Math.round(parseFloat(cryptoOverrides.defaultLockAmountUSDC) * 1_000_000))
|
|
289
|
-
: '1000000',
|
|
290
|
-
platformFeeRate: config.payments?.platformFeeRate,
|
|
291
|
-
maxPerRequestUsdc: config.payments?.maxPerRequestUsdc ?? '100000',
|
|
292
|
-
maxReserveAmountUsdc: config.payments?.maxReserveAmountUsdc ?? '1000000',
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
const routerName = options.instance
|
|
296
|
-
? (await getInstance(join(homedir(), '.antseed', 'config.json'), options.instance))?.package
|
|
297
|
-
: options.router;
|
|
298
|
-
const versions = getPackageVersions(routerName ?? undefined);
|
|
299
|
-
if (Object.keys(versions).length > 0) {
|
|
300
|
-
console.log(chalk.dim(`Package versions: ${Object.entries(versions).map(([k, v]) => `${k}@${v}`).join(', ')}`));
|
|
301
|
-
}
|
|
302
|
-
console.log(chalk.bold('Effective buyer settings:'));
|
|
303
|
-
console.log(chalk.dim(` max pricing defaults (USD/1M): input=${effectiveBuyerConfig.maxPricing.defaults.inputUsdPerMillion}, output=${effectiveBuyerConfig.maxPricing.defaults.outputUsdPerMillion}`));
|
|
304
|
-
const maxPerRequestUsdc = config.payments?.maxPerRequestUsdc ?? '100000';
|
|
305
|
-
const maxReserveAmountUsdc = config.payments?.maxReserveAmountUsdc ?? '1000000';
|
|
306
|
-
console.log(chalk.dim(` max per-request USDC: ${(Number(maxPerRequestUsdc) / 1_000_000).toFixed(6)}`));
|
|
307
|
-
console.log(chalk.dim(` max reserve USDC: ${(Number(maxReserveAmountUsdc) / 1_000_000).toFixed(6)}`));
|
|
308
|
-
console.log(chalk.dim(` min peer reputation: ${effectiveBuyerConfig.minPeerReputation}`));
|
|
309
|
-
console.log(chalk.dim(` proxy port: ${effectiveBuyerConfig.proxyPort}`));
|
|
310
|
-
if (pinnedPeerId) {
|
|
311
|
-
console.log(chalk.yellow(` pinned peer: ${pinnedPeerId} (router bypassed)`));
|
|
312
|
-
}
|
|
313
|
-
console.log('');
|
|
314
|
-
const node = new AntseedNode({
|
|
315
|
-
role: 'buyer',
|
|
316
|
-
bootstrapNodes,
|
|
317
|
-
allowPrivateIPs: true,
|
|
318
|
-
dataDir: globalOpts.dataDir,
|
|
319
|
-
configPath: globalOpts.config,
|
|
320
|
-
payments: paymentsConfig,
|
|
321
|
-
});
|
|
322
|
-
node.setRouter(router);
|
|
323
|
-
try {
|
|
324
|
-
await node.start();
|
|
325
|
-
nodeSpinner.succeed(chalk.green('Connected to P2P network'));
|
|
326
|
-
}
|
|
327
|
-
catch (err) {
|
|
328
|
-
nodeSpinner.fail(chalk.red(`Failed to connect: ${err.message}`));
|
|
329
|
-
process.exit(1);
|
|
330
|
-
}
|
|
331
|
-
// Display available USDC balance only if payments are active
|
|
332
|
-
if (paymentsConfig?.enabled) {
|
|
333
|
-
try {
|
|
334
|
-
const identity = node.identity;
|
|
335
|
-
const address = identity.wallet.address;
|
|
336
|
-
const depositsClient = new DepositsClient({
|
|
337
|
-
rpcUrl: chainConfig.rpcUrl,
|
|
338
|
-
contractAddress: chainConfig.depositsContractAddress,
|
|
339
|
-
usdcAddress: chainConfig.usdcContractAddress,
|
|
340
|
-
});
|
|
341
|
-
const account = await depositsClient.getBuyerBalance(address);
|
|
342
|
-
console.log(chalk.dim(`Wallet: ${address}`));
|
|
343
|
-
const availUsdc = Number(account.available) / 1_000_000;
|
|
344
|
-
console.log(chalk.dim(`Deposits available: ${availUsdc.toFixed(6)} USDC`));
|
|
345
|
-
}
|
|
346
|
-
catch {
|
|
347
|
-
// Non-fatal — chain may not be available
|
|
348
|
-
console.log(chalk.dim('Payment balance unavailable (chain not reachable)'));
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
// Start the local HTTP proxy
|
|
352
|
-
const proxyPort = effectiveBuyerConfig.proxyPort;
|
|
353
|
-
const proxySpinner = ora(`Starting local proxy on port ${proxyPort}...`).start();
|
|
354
|
-
const proxy = new BuyerProxy({
|
|
355
|
-
port: proxyPort,
|
|
356
|
-
node,
|
|
357
|
-
pinnedPeerId,
|
|
358
|
-
});
|
|
359
|
-
let ownsProxyListener = false;
|
|
360
|
-
try {
|
|
361
|
-
await proxy.start();
|
|
362
|
-
ownsProxyListener = true;
|
|
363
|
-
proxySpinner.succeed(chalk.green(`Proxy listening on http://localhost:${proxyPort}`));
|
|
364
|
-
}
|
|
365
|
-
catch (err) {
|
|
366
|
-
if (isAddrInUseError(err) && await isCompatibleBuyerProxy(proxyPort)) {
|
|
367
|
-
proxySpinner.succeed(chalk.yellow(`Proxy port ${proxyPort} already in use; reusing existing local proxy.`));
|
|
368
|
-
console.log(chalk.yellow('Proxy request logs will be emitted by the process that already owns this port.'));
|
|
369
|
-
}
|
|
370
|
-
else {
|
|
371
|
-
proxySpinner.fail(chalk.red(`Failed to start proxy: ${err.message}`));
|
|
372
|
-
await node.stop();
|
|
373
|
-
process.exit(1);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
const proxyUrl = `http://localhost:${proxyPort}`;
|
|
377
|
-
console.log('');
|
|
378
|
-
if (toolHints.length > 0) {
|
|
379
|
-
console.log(chalk.bold('Configure your tools:'));
|
|
380
|
-
for (const hint of toolHints) {
|
|
381
|
-
console.log(` export ${hint.envVar}=${proxyUrl} # ${hint.name}`);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
else {
|
|
385
|
-
console.log(chalk.bold('Configure your CLI tools:'));
|
|
386
|
-
console.log(` export ANTHROPIC_BASE_URL=${proxyUrl}`);
|
|
387
|
-
console.log(` export OPENAI_BASE_URL=${proxyUrl}`);
|
|
388
|
-
}
|
|
389
|
-
console.log('');
|
|
390
|
-
console.log(chalk.dim('Enable debug logs: export ANTSEED_DEBUG=1'));
|
|
391
|
-
console.log('');
|
|
392
|
-
setupShutdownHandler(async () => {
|
|
393
|
-
nodeSpinner.start('Shutting down...');
|
|
394
|
-
if (ownsProxyListener) {
|
|
395
|
-
await proxy.stop();
|
|
396
|
-
}
|
|
397
|
-
await node.stop();
|
|
398
|
-
nodeSpinner.succeed('Disconnected. All channels finalized.');
|
|
399
|
-
});
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
//# sourceMappingURL=connect.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/cli/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/connect.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test from 'node:test';
|
|
3
|
-
import { createDefaultConfig } from '../../config/defaults.js';
|
|
4
|
-
import { resolveEffectiveBuyerConfig } from '../../config/effective.js';
|
|
5
|
-
import { buildBuyerRuntimeOverridesFromFlags, buildBuyerBootstrapEntries, buildRouterRuntimeEnvFromBuyerConfig, } from './connect.js';
|
|
6
|
-
test('connect runtime overrides are runtime-only and win over env/config', () => {
|
|
7
|
-
const config = createDefaultConfig();
|
|
8
|
-
config.buyer.proxyPort = 7777;
|
|
9
|
-
config.buyer.maxPricing.defaults.inputUsdPerMillion = 50;
|
|
10
|
-
config.buyer.maxPricing.defaults.outputUsdPerMillion = 60;
|
|
11
|
-
const beforeResolution = JSON.parse(JSON.stringify(config));
|
|
12
|
-
const env = {
|
|
13
|
-
ANTSEED_BUYER_MAX_INPUT_USD_PER_MILLION: '70',
|
|
14
|
-
ANTSEED_BUYER_MAX_OUTPUT_USD_PER_MILLION: '80',
|
|
15
|
-
};
|
|
16
|
-
const overrides = buildBuyerRuntimeOverridesFromFlags({
|
|
17
|
-
port: 9000,
|
|
18
|
-
maxInputUsdPerMillion: 90,
|
|
19
|
-
maxOutputUsdPerMillion: 95,
|
|
20
|
-
});
|
|
21
|
-
const effective = resolveEffectiveBuyerConfig({
|
|
22
|
-
config,
|
|
23
|
-
env,
|
|
24
|
-
buyerOverrides: overrides,
|
|
25
|
-
});
|
|
26
|
-
assert.equal(effective.proxyPort, 9000);
|
|
27
|
-
assert.equal(effective.maxPricing.defaults.inputUsdPerMillion, 90);
|
|
28
|
-
assert.equal(effective.maxPricing.defaults.outputUsdPerMillion, 95);
|
|
29
|
-
assert.deepEqual(config, beforeResolution);
|
|
30
|
-
});
|
|
31
|
-
test('connect maps effective buyer config into router runtime env keys', () => {
|
|
32
|
-
const config = createDefaultConfig();
|
|
33
|
-
config.buyer.minPeerReputation = 72;
|
|
34
|
-
config.buyer.maxPricing.defaults.inputUsdPerMillion = 21;
|
|
35
|
-
config.buyer.maxPricing.defaults.outputUsdPerMillion = 63;
|
|
36
|
-
const runtimeEnv = buildRouterRuntimeEnvFromBuyerConfig(config.buyer);
|
|
37
|
-
assert.equal(runtimeEnv['ANTSEED_MIN_REPUTATION'], '72');
|
|
38
|
-
const parsed = JSON.parse(runtimeEnv['ANTSEED_MAX_PRICING_JSON'] ?? '{}');
|
|
39
|
-
assert.equal(parsed.defaults?.inputUsdPerMillion, 21);
|
|
40
|
-
assert.equal(parsed.defaults?.outputUsdPerMillion, 63);
|
|
41
|
-
});
|
|
42
|
-
test('connect bootstrap entries use official nodes when config is empty and include local seeder first', () => {
|
|
43
|
-
const entries = buildBuyerBootstrapEntries([], 6881);
|
|
44
|
-
assert.equal(entries[0], '127.0.0.1:6881');
|
|
45
|
-
assert.ok(entries.length > 1);
|
|
46
|
-
});
|
|
47
|
-
test('connect bootstrap entries respect explicit configured nodes', () => {
|
|
48
|
-
const entries = buildBuyerBootstrapEntries(['10.0.0.2:6881'], 6889);
|
|
49
|
-
assert.equal(entries[0], '127.0.0.1:6889');
|
|
50
|
-
assert.deepEqual(entries.slice(1), ['10.0.0.2:6881']);
|
|
51
|
-
});
|
|
52
|
-
//# sourceMappingURL=connect.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect.test.js","sourceRoot":"","sources":["../../../src/cli/commands/connect.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6DxC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoFhE"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { readFile, writeFile, rename } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { randomUUID } from 'node:crypto';
|
|
5
|
-
import chalk from 'chalk';
|
|
6
|
-
const BUYER_STATE_FILE = join(homedir(), '.antseed', 'buyer.state.json');
|
|
7
|
-
async function readStateFile() {
|
|
8
|
-
try {
|
|
9
|
-
const raw = await readFile(BUYER_STATE_FILE, 'utf-8');
|
|
10
|
-
return JSON.parse(raw);
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
async function writeStateFile(data) {
|
|
17
|
-
const dir = join(homedir(), '.antseed');
|
|
18
|
-
const tmp = join(dir, `.buyer.state.${randomUUID()}.json.tmp`);
|
|
19
|
-
try {
|
|
20
|
-
await writeFile(tmp, JSON.stringify(data, null, 2));
|
|
21
|
-
await rename(tmp, BUYER_STATE_FILE);
|
|
22
|
-
}
|
|
23
|
-
catch (err) {
|
|
24
|
-
console.error(chalk.red(`Failed to write session state: ${err instanceof Error ? err.message : String(err)}`));
|
|
25
|
-
process.exit(1);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
function isProcessAlive(pid) {
|
|
29
|
-
try {
|
|
30
|
-
process.kill(pid, 0);
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
async function requireRunningBuyer() {
|
|
38
|
-
const state = await readStateFile();
|
|
39
|
-
if (!state) {
|
|
40
|
-
console.error(chalk.red('No buyer connection found. Run `antseed connect` first.'));
|
|
41
|
-
process.exit(1);
|
|
42
|
-
}
|
|
43
|
-
if (state.state !== 'connected' || !isProcessAlive(state.pid)) {
|
|
44
|
-
console.error(chalk.red('Buyer proxy is not running. Run `antseed connect` first.'));
|
|
45
|
-
process.exit(1);
|
|
46
|
-
}
|
|
47
|
-
return state;
|
|
48
|
-
}
|
|
49
|
-
export function registerConnectionCommand(program) {
|
|
50
|
-
const connection = program
|
|
51
|
-
.command('connection')
|
|
52
|
-
.description('Manage the active buyer connection session');
|
|
53
|
-
connection
|
|
54
|
-
.command('get')
|
|
55
|
-
.description('Show current session state (pinned service, pinned peer)')
|
|
56
|
-
.action(async () => {
|
|
57
|
-
const state = await readStateFile();
|
|
58
|
-
if (!state) {
|
|
59
|
-
console.log(chalk.yellow('No buyer connection state found. Run `antseed connect` first.'));
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const alive = state.state === 'connected' && isProcessAlive(state.pid);
|
|
63
|
-
console.log(`State: ${alive ? chalk.green('connected') : chalk.red(state.state ?? 'stopped')}`);
|
|
64
|
-
console.log(`PID: ${state.pid}`);
|
|
65
|
-
console.log(`Port: ${state.port}`);
|
|
66
|
-
console.log(`Pinned service: ${state.pinnedService ? chalk.cyan(state.pinnedService) : chalk.dim('none')}`);
|
|
67
|
-
console.log(`Pinned peer: ${state.pinnedPeerId ? chalk.cyan(state.pinnedPeerId) : chalk.dim('none')}`);
|
|
68
|
-
});
|
|
69
|
-
connection
|
|
70
|
-
.command('set')
|
|
71
|
-
.description('Update session overrides on the running buyer proxy')
|
|
72
|
-
.option('--service <service>', 'override service ID for all routed requests')
|
|
73
|
-
.option('--peer <peerId>', 'pin all requests to a specific peer ID (40-char hex EVM address)')
|
|
74
|
-
.action(async (options) => {
|
|
75
|
-
const state = await requireRunningBuyer();
|
|
76
|
-
if (options.service === undefined && options.peer === undefined) {
|
|
77
|
-
console.error(chalk.red('Error: specify at least --service or --peer.'));
|
|
78
|
-
process.exit(1);
|
|
79
|
-
}
|
|
80
|
-
if (options.service !== undefined) {
|
|
81
|
-
const service = String(options.service).trim();
|
|
82
|
-
if (service.length === 0) {
|
|
83
|
-
console.error(chalk.red('Error: --service must not be empty.'));
|
|
84
|
-
process.exit(1);
|
|
85
|
-
}
|
|
86
|
-
state.pinnedService = service;
|
|
87
|
-
}
|
|
88
|
-
if (options.peer !== undefined) {
|
|
89
|
-
const peer = String(options.peer).trim();
|
|
90
|
-
if (!/^(0x)?[0-9a-f]{40}$/i.test(peer)) {
|
|
91
|
-
console.error(chalk.red('Error: --peer must be a 40-character hex peer ID (EVM address).'));
|
|
92
|
-
process.exit(1);
|
|
93
|
-
}
|
|
94
|
-
state.pinnedPeerId = peer.toLowerCase();
|
|
95
|
-
}
|
|
96
|
-
await writeStateFile(state);
|
|
97
|
-
if (options.service !== undefined)
|
|
98
|
-
console.log(chalk.green(`Pinned service set to: ${state.pinnedService}`));
|
|
99
|
-
if (options.peer !== undefined)
|
|
100
|
-
console.log(chalk.green(`Pinned peer set to: ${state.pinnedPeerId}`));
|
|
101
|
-
});
|
|
102
|
-
connection
|
|
103
|
-
.command('clear')
|
|
104
|
-
.description('Clear session overrides (defaults to clearing both service and peer)')
|
|
105
|
-
.option('--service', 'clear only the service override')
|
|
106
|
-
.option('--peer', 'clear only the peer pin')
|
|
107
|
-
.action(async (options) => {
|
|
108
|
-
const state = await requireRunningBuyer();
|
|
109
|
-
const clearAll = !options.service && !options.peer;
|
|
110
|
-
const clearService = clearAll || Boolean(options.service);
|
|
111
|
-
const clearPeer = clearAll || Boolean(options.peer);
|
|
112
|
-
if (clearService)
|
|
113
|
-
state.pinnedService = null;
|
|
114
|
-
if (clearPeer)
|
|
115
|
-
state.pinnedPeerId = null;
|
|
116
|
-
await writeStateFile(state);
|
|
117
|
-
if (clearService && clearPeer) {
|
|
118
|
-
console.log(chalk.green('All session overrides cleared.'));
|
|
119
|
-
}
|
|
120
|
-
else if (clearService) {
|
|
121
|
-
console.log(chalk.green('Service override cleared.'));
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
console.log(chalk.green('Peer pin cleared.'));
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=connection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/cli/commands/connection.ts"],"names":[],"mappings":"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"}
|