@antseed/cli 0.1.59 → 0.1.60

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 CHANGED
@@ -8,20 +8,35 @@ Command-line interface and web dashboard for the AntSeed Network — a P2P netwo
8
8
 
9
9
  | Command | Description |
10
10
  |---------|-------------|
11
+ | **Setup** | |
11
12
  | `antseed init` | Install trusted provider and router plugins |
12
- | `antseed seed` | Start providing AI services on the P2P network |
13
- | `antseed connect` | Start the buyer proxy and connect to sellers |
13
+ | `antseed setup --role <role>` | Check readiness for provider or buyer role |
14
+ | `antseed register` | Register peer identity on-chain (ERC-8004) |
15
+ | **Providing** | |
16
+ | `antseed seed --provider <name>` | Start providing AI services on the P2P network |
17
+ | `antseed stake <amount>` | Stake USDC as a provider (min $10) |
18
+ | `antseed unstake` | Withdraw staked USDC |
19
+ | `antseed claim` | Claim accumulated seller payouts |
20
+ | **Buying** | |
21
+ | `antseed connect --router <name>` | Start the buyer proxy and connect to sellers |
22
+ | `antseed deposit <amount>` | Deposit USDC for payments |
23
+ | `antseed withdraw <amount>` | Withdraw USDC from deposits |
24
+ | `antseed balance` | Check wallet and deposit balance |
25
+ | `antseed browse` | Browse available services and pricing |
26
+ | `antseed payments` | Launch the payments portal |
27
+ | **Session** | |
14
28
  | `antseed connection get` | Show current session state (pinned service, peer) |
15
29
  | `antseed connection set` | Update service/peer overrides on a running proxy |
16
- | `antseed connection clear` | Clear service/peer overrides on a running proxy |
17
- | `antseed plugin add <pkg>` | Install a provider or router plugin from npm |
18
- | `antseed plugin remove <name>` | Remove an installed plugin |
19
- | `antseed plugin list` | List installed plugins |
30
+ | `antseed connection clear` | Clear service/peer overrides |
31
+ | **Management** | |
20
32
  | `antseed status` | Show current node status |
21
- | `antseed config` | Manage configuration (`show`, `set`, `seller show/set`, `buyer show/set`, `init`) |
22
- | `antseed dashboard` | Start the web dashboard for monitoring and configuration |
23
- | `antseed dev` | Run seller + buyer locally for development and testing |
24
- | `antseed browse` | Browse available services, prices, and reputation on the network |
33
+ | `antseed config` | Manage configuration |
34
+ | `antseed plugin add/remove/list` | Manage plugins |
35
+ | `antseed dashboard` | Start the web dashboard |
36
+ | `antseed channels` | List payment channels |
37
+ | `antseed emissions` | View ANTS emissions and epoch info |
38
+ | `antseed dev` | Run seller + buyer locally for testing |
39
+ | `antseed bootstrap` | Run a dedicated DHT bootstrap node |
25
40
 
26
41
  ## Plugins
27
42
 
@@ -195,33 +210,27 @@ Session overrides are stored in `~/.antseed/buyer.state.json` and picked up by t
195
210
 
196
211
  The service override rewrites the `model` field in the request body **before routing**, so peer selection, pricing, and the forwarded request all reflect the overridden service — regardless of what the tool (e.g. Claude Code) originally requested.
197
212
 
198
- ## Settlement Runtime (Seeder)
199
-
200
- `antseed seed` can enable automatic session settlement when payment config is present.
201
- `antseed connect` can also enable buyer-side deposits/session locking with the same payment config.
202
-
203
- Common runtime env controls:
204
- - `ANTSEED_ENABLE_SETTLEMENT=true|false`
205
- - `ANTSEED_SETTLEMENT_IDLE_MS=30000`
206
- - `ANTSEED_DEFAULT_ESCROW_USDC=1`
207
- - `ANTSEED_AUTO_FUND_ESCROW=true|false`
208
- - `ANTSEED_SELLER_WALLET_ADDRESS=0x...`
209
-
210
- Crypto settlement also requires `config.payments.crypto` values in your config file:
211
- - `chainId` (`base` or `arbitrum`)
212
- - `rpcUrl`
213
- - `depositsContractAddress`
214
- - `channelsContractAddress`
215
- - `usdcContractAddress`
216
-
217
- If `ANTSEED_ENABLE_SETTLEMENT` is not explicitly set and the RPC endpoint is unreachable,
218
- the CLI now auto-disables settlement for that run and logs a warning instead of looping RPC network-detection errors.
219
- Set `ANTSEED_ENABLE_SETTLEMENT=true` to force-enable settlement checks.
220
-
221
- Runtime behavior:
222
- - session opens -> optional deposit into deposits contract
223
- - session finalizes -> exact on-chain split settlement via sessions contract (`seller payout + platform fee + buyer refund remainder`)
224
- - no receipts -> deposit refund path
213
+ ## Payments
214
+
215
+ Payment channels are automatic when `payments.crypto.chainId` is set in config. Set it to `base-mainnet` for production or `base-sepolia` for testing. Contract addresses are resolved automatically from the chain ID.
216
+
217
+ ```json
218
+ {
219
+ "payments": {
220
+ "preferredMethod": "crypto",
221
+ "crypto": {
222
+ "chainId": "base-mainnet"
223
+ }
224
+ }
225
+ }
226
+ ```
227
+
228
+ The node's identity is a secp256k1 private key that doubles as the EVM wallet. Set it via `ANTSEED_IDENTITY_HEX` env var (recommended) or let the CLI generate one at `~/.antseed/identity.key` (not recommended for production — use env var with a secrets manager instead). Providers must register on-chain (`antseed register`) and stake USDC (`antseed stake 10`) before seeding. Buyers must deposit USDC (`antseed deposit 10`) before connecting.
229
+
230
+ Runtime env controls:
231
+ - `ANTSEED_SETTLEMENT_IDLE_MS=600000` — idle time before settling a session (default: 10 minutes)
232
+ - `ANTSEED_DEFAULT_DEPOSIT_USDC=1` default lock amount per session
233
+ - `ANTSEED_IDENTITY_HEX=<hex>` inject identity via env (supports 0x prefix)
225
234
 
226
235
  Provider-specific options are configured via each plugin's config schema (see `antseed plugin add --help`).
227
236
 
package/dist/cli/index.js CHANGED
@@ -24,7 +24,6 @@ import { registerEmissionsCommand } from './commands/emissions.js';
24
24
  import { registerChannelsCommand } from './commands/channels.js';
25
25
  import { registerSubscribeCommand } from './commands/subscribe.js';
26
26
  import { registerPaymentsCommand } from './commands/payments.js';
27
- import { registerClaimCommand } from './commands/claim.js';
28
27
  loadEnvFromFiles();
29
28
  import pkg from '../../package.json' with { type: 'json' };
30
29
  const version = pkg.version;
@@ -60,6 +59,5 @@ registerEmissionsCommand(program);
60
59
  registerChannelsCommand(program);
61
60
  registerSubscribeCommand(program);
62
61
  registerPaymentsCommand(program);
63
- registerClaimCommand(program);
64
62
  program.parse(process.argv);
65
63
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antseed/cli",
3
- "version": "0.1.59",
3
+ "version": "0.1.60",
4
4
  "description": "Antseed Network CLI and Web Dashboard",
5
5
  "type": "module",
6
6
  "files": [
@@ -19,12 +19,12 @@
19
19
  "dotenv": "^16.6.1",
20
20
  "open": "^11.0.0",
21
21
  "ora": "^9.3.0",
22
- "@antseed/api-adapter": "0.1.15",
23
- "@antseed/ant-agent": "0.1.14",
22
+ "@antseed/api-adapter": "0.1.16",
23
+ "@antseed/ant-agent": "0.1.15",
24
+ "@antseed/provider-core": "0.2.28",
24
25
  "@antseed/payments": "0.1.3",
25
- "@antseed/provider-core": "0.2.27",
26
- "@antseed/dashboard": "0.1.23",
27
- "@antseed/node": "0.2.33"
26
+ "@antseed/node": "0.2.34",
27
+ "@antseed/dashboard": "0.1.24"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^20.11.0",
@@ -1,3 +0,0 @@
1
- import type { Command } from 'commander';
2
- export declare function registerClaimCommand(program: Command): void;
3
- //# sourceMappingURL=claim.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/claim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgC3D"}
@@ -1,35 +0,0 @@
1
- import chalk from 'chalk';
2
- import ora from 'ora';
3
- import { getGlobalOptions } from './types.js';
4
- import { loadConfig } from '../../config/loader.js';
5
- import { createDepositsClient, loadCryptoContext, formatUsdc, } from '../payment-utils.js';
6
- export function registerClaimCommand(program) {
7
- program
8
- .command('claim')
9
- .description('Claim accumulated seller payouts from the deposits contract')
10
- .action(async () => {
11
- const globalOpts = getGlobalOptions(program);
12
- const config = await loadConfig(globalOpts.config);
13
- const spinner = ora('Checking seller payouts...').start();
14
- try {
15
- const { wallet, address } = await loadCryptoContext(globalOpts.dataDir);
16
- const depositsClient = createDepositsClient(config);
17
- const pending = await depositsClient.getSellerPayouts(address);
18
- if (pending === 0n) {
19
- spinner.succeed(chalk.yellow('No payouts to claim.'));
20
- return;
21
- }
22
- console.log(chalk.dim(`Wallet: ${address}`));
23
- console.log(chalk.dim(`Pending payouts: ${formatUsdc(pending)} USDC`));
24
- spinner.text = 'Claiming payouts...';
25
- const txHash = await depositsClient.claimPayouts(wallet);
26
- spinner.succeed(chalk.green(`Claimed ${formatUsdc(pending)} USDC`));
27
- console.log(chalk.dim(`Transaction: ${txHash}`));
28
- }
29
- catch (err) {
30
- spinner.fail(chalk.red(`Claim failed: ${err.message}`));
31
- process.exit(1);
32
- }
33
- });
34
- }
35
- //# sourceMappingURL=claim.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../../src/cli/commands/claim.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;QAE1D,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACxE,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAEpD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC/D,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;gBACnB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBACtD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAEvE,OAAO,CAAC,IAAI,GAAG,qBAAqB,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAkB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}