@thirdfy/agent-cli 0.2.20 → 0.2.22

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/CHANGELOG.md CHANGED
@@ -4,6 +4,23 @@ All notable changes to `@thirdfy/agent-cli` are documented here. The format is b
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.2.22] - 2026-07-10
8
+
9
+ ### Added
10
+
11
+ - Robinhood Chain (4663) provider hints for trading, bridge, yield-xyz, and market-data; `robinhood-mainnet` chat alias; live capabilities validation for 4663.
12
+
13
+ ### Fixed
14
+
15
+ - Capabilities-derived hints no longer set a write action for read-only `market-data`.
16
+ - Live API validation also asserts `yield-xyz` includes chain 4663.
17
+
18
+ ## [0.2.21] - 2026-07-05
19
+
20
+ ### Added
21
+
22
+ - `console-mandate` command group: `status`, `draft`, `activate`, `revoke` for Console delegated execution (daily cap + expiry). Uses `/api/v1/console/delegation/*` and is separate from certified-agent `delegation *` commands. Pairs with Thirdfy API **v3.10.2+**.
23
+
7
24
  ## [0.2.20] - 2026-07-04
8
25
 
9
26
  ### Added
package/README.md CHANGED
@@ -40,11 +40,12 @@ Run without global install:
40
40
  npx @thirdfy/agent-cli --help
41
41
  ```
42
42
 
43
- ## What's new in v0.2.20
43
+ ## What's new in v0.2.22
44
44
 
45
- - **Console Brain:** `thirdfy-agent brain sections|suggest|preflight|graduate` read ranked Trading, Yield, and Prediction lanes from Thirdfy API (no local ranking).
46
- - Brain commands support `--strategy`, `--section`, `--capital-usd`, `--risk`, and `--target earnclaw` for read/preflight-first strategy workflows.
47
- - Pairs with Thirdfy API **v3.10.0** Brain routes (`GET /api/v1/console/brain-*`). See [`docs/command-reference.md`](./docs/command-reference.md).
45
+ - **Robinhood Chain (4663):** Provider hints for `trading`, `bridge`, `yield-xyz`, and `market-data`; `robinhood-mainnet` chat alias.
46
+ - Live capabilities validation asserts chain 4663 when `THIRDFY_API_BASE` is set. Pairs with Thirdfy API **v3.10.7+**.
47
+
48
+ Older versions: see [CHANGELOG.md](./CHANGELOG.md) and [GitHub Releases](https://github.com/thirdfy/agent-cli/releases).
48
49
 
49
50
  Older versions: see [CHANGELOG.md](./CHANGELOG.md) and [GitHub Releases](https://github.com/thirdfy/agent-cli/releases).
50
51
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thirdfy/agent-cli",
3
- "version": "0.2.20",
3
+ "version": "0.2.22",
4
4
  "description": "Thirdfy Agent CLI for onboarding, governance preflight, execute-intent, and status polling.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -377,6 +377,34 @@ export const CLI_MANIFEST = [
377
377
  options: ['auth', 'execution'],
378
378
  description: 'Redeem via delegation',
379
379
  },
380
+ {
381
+ path: ['console-mandate', 'status'],
382
+ handler: 'commandConsoleMandateStatus',
383
+ tier: 'online',
384
+ options: ['auth', 'delegation'],
385
+ description: 'Console delegated execution status',
386
+ },
387
+ {
388
+ path: ['console-mandate', 'draft'],
389
+ handler: 'commandConsoleMandateDraft',
390
+ tier: 'online',
391
+ options: ['auth', 'delegation'],
392
+ description: 'Create Console mandate draft',
393
+ },
394
+ {
395
+ path: ['console-mandate', 'activate'],
396
+ handler: 'commandConsoleMandateActivate',
397
+ tier: 'online',
398
+ options: ['auth', 'delegation'],
399
+ description: 'Activate signed Console mandate',
400
+ },
401
+ {
402
+ path: ['console-mandate', 'revoke'],
403
+ handler: 'commandConsoleMandateRevoke',
404
+ tier: 'online',
405
+ options: ['auth', 'delegation'],
406
+ description: 'Revoke Console mandate',
407
+ },
380
408
  {
381
409
  path: ['credentials', 'upsert'],
382
410
  handler: 'commandCredentialsUpsert',
@@ -5,6 +5,7 @@ import { apiGet, safeJsonParse } from '../core/http.mjs';
5
5
  const NETWORK_CHAIN_IDS = {
6
6
  'base-mainnet': 8453,
7
7
  'base-sepolia': 84532,
8
+ 'robinhood-mainnet': 4663,
8
9
  };
9
10
 
10
11
  const DEFAULT_CHAT_CHAIN_ID = 8453;
@@ -0,0 +1,125 @@
1
+ import { requireFlag } from '../core/args.mjs';
2
+ import { apiGet, apiPost } from '../core/http.mjs';
3
+
4
+ export function createConsoleMandateCommands(deps) {
5
+ const { buildOwnerAuthHeaders, printEnvelope } = deps;
6
+
7
+ async function commandConsoleMandateStatus(ctx, flags) {
8
+ const authHeaders = buildOwnerAuthHeaders(
9
+ flags,
10
+ 'Missing --auth-token/--owner-session-token for console mandate status',
11
+ );
12
+ const chainId = Number(flags.chainId || 8453);
13
+ const walletAddress = String(flags.walletAddress || flags.ownerAddress || '').trim();
14
+ const query = new URLSearchParams({ chainId: String(chainId) });
15
+ if (walletAddress) query.set('walletAddress', walletAddress);
16
+ const response = await apiGet(ctx, `/api/v1/console/delegation/status?${query.toString()}`, {
17
+ ...authHeaders,
18
+ headers: {
19
+ ...(authHeaders.headers || {}),
20
+ 'x-thirdfy-surface': 'cli',
21
+ },
22
+ });
23
+ printEnvelope({
24
+ success: Boolean(response?.success !== false),
25
+ code: 'CONSOLE_MANDATE_STATUS',
26
+ message: 'Console delegated execution status',
27
+ data: response?.data || response,
28
+ meta: { apiBase: ctx.apiBase },
29
+ });
30
+ }
31
+
32
+ async function commandConsoleMandateDraft(ctx, flags) {
33
+ const authHeaders = buildOwnerAuthHeaders(
34
+ flags,
35
+ 'Missing --auth-token/--owner-session-token for console mandate draft',
36
+ );
37
+ const payload = {
38
+ ownerAddress: requireFlag(flags, 'ownerAddress', 'Missing --owner-address'),
39
+ chainId: Number(flags.chainId || 8453),
40
+ maxUsdPerDay: Number(requireFlag(flags, 'maxUsdPerDay', 'Missing --max-usd-per-day')),
41
+ expirySeconds: Number(flags.expirySeconds || 30 * 24 * 60 * 60),
42
+ tokenAddress: flags.tokenAddress,
43
+ periodDuration: Number(flags.periodDuration || 86_400),
44
+ };
45
+ const response = await apiPost(ctx, '/api/v1/console/delegation/draft', payload, {
46
+ ...authHeaders,
47
+ headers: {
48
+ ...(authHeaders.headers || {}),
49
+ 'x-thirdfy-surface': 'cli',
50
+ },
51
+ });
52
+ printEnvelope({
53
+ success: Boolean(response?.success !== false),
54
+ code: 'CONSOLE_MANDATE_DRAFT',
55
+ message: 'Console mandate draft created',
56
+ data: response?.data || response,
57
+ meta: { apiBase: ctx.apiBase },
58
+ });
59
+ }
60
+
61
+ async function commandConsoleMandateActivate(ctx, flags) {
62
+ const authHeaders = buildOwnerAuthHeaders(
63
+ flags,
64
+ 'Missing --auth-token/--owner-session-token for console mandate activate',
65
+ );
66
+ const payload = {
67
+ walletAddress: requireFlag(flags, 'walletAddress', 'Missing --wallet-address'),
68
+ chainId: Number(flags.chainId || 8453),
69
+ delegationManager: requireFlag(flags, 'delegationManager', 'Missing --delegation-manager'),
70
+ delegation: JSON.parse(requireFlag(flags, 'delegation', 'Missing --delegation JSON')),
71
+ signature: requireFlag(flags, 'signature', 'Missing --signature'),
72
+ permissionsExpiry: flags.permissionsExpiry,
73
+ maxUsdPerDay: Number(requireFlag(flags, 'maxUsdPerDay', 'Missing --max-usd-per-day')),
74
+ periodDuration: Number(flags.periodDuration || 86_400),
75
+ tokenAddress: flags.tokenAddress,
76
+ };
77
+ const response = await apiPost(ctx, '/api/v1/console/delegation/activate', payload, {
78
+ ...authHeaders,
79
+ headers: {
80
+ ...(authHeaders.headers || {}),
81
+ 'x-thirdfy-surface': 'cli',
82
+ },
83
+ });
84
+ printEnvelope({
85
+ success: Boolean(response?.success !== false),
86
+ code: 'CONSOLE_MANDATE_ACTIVATED',
87
+ message: 'Console mandate activated',
88
+ data: response?.data || response,
89
+ meta: { apiBase: ctx.apiBase },
90
+ });
91
+ }
92
+
93
+ async function commandConsoleMandateRevoke(ctx, flags) {
94
+ const authHeaders = buildOwnerAuthHeaders(
95
+ flags,
96
+ 'Missing --auth-token/--owner-session-token for console mandate revoke',
97
+ );
98
+ const payload = {
99
+ walletAddress: flags.walletAddress,
100
+ chainId: Number(flags.chainId || 8453),
101
+ reason: flags.reason || 'cli_revoked',
102
+ };
103
+ const response = await apiPost(ctx, '/api/v1/console/delegation/revoke', payload, {
104
+ ...authHeaders,
105
+ headers: {
106
+ ...(authHeaders.headers || {}),
107
+ 'x-thirdfy-surface': 'cli',
108
+ },
109
+ });
110
+ printEnvelope({
111
+ success: Boolean(response?.success !== false),
112
+ code: 'CONSOLE_MANDATE_REVOKED',
113
+ message: 'Console mandate revoked',
114
+ data: response?.data || response,
115
+ meta: { apiBase: ctx.apiBase },
116
+ });
117
+ }
118
+
119
+ return {
120
+ commandConsoleMandateStatus,
121
+ commandConsoleMandateDraft,
122
+ commandConsoleMandateActivate,
123
+ commandConsoleMandateRevoke,
124
+ };
125
+ }
@@ -6,6 +6,7 @@ import { createLighterHelpers } from '../commands/lighter.mjs';
6
6
  import { createExecuteCommands } from '../commands/execute.mjs';
7
7
  import { createWalletCommands } from '../commands/wallet.mjs';
8
8
  import { createDelegationCommands } from '../commands/delegation.mjs';
9
+ import { createConsoleMandateCommands } from '../commands/consoleMandate.mjs';
9
10
  import { createBootstrapCommands } from '../commands/bootstrap.mjs';
10
11
  import { createDiscoveryCommands } from '../commands/discovery.mjs';
11
12
  import { createCreditsCommands } from '../commands/credits.mjs';
@@ -156,6 +157,11 @@ export function createRuntimeHandlers(deps) {
156
157
  commandRun: __execute.commandRun,
157
158
  });
158
159
 
160
+ const __consoleMandate = createConsoleMandateCommands({
161
+ buildOwnerAuthHeaders,
162
+ printEnvelope,
163
+ });
164
+
159
165
  const __polymarket = createPolymarketCommands({
160
166
  commandPreflight: __execute.commandPreflight,
161
167
  printEnvelope,
@@ -184,6 +190,7 @@ export function createRuntimeHandlers(deps) {
184
190
  ...__execute,
185
191
  ...__wallet,
186
192
  ...__delegation,
193
+ ...__consoleMandate,
187
194
  ...__polymarket,
188
195
  ...__hummingbot,
189
196
  ...__bootstrap,
@@ -11,9 +11,9 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
11
11
  provider,
12
12
  category: 'onchain_spot',
13
13
  canonicalWriteAction: 'swap',
14
- supportedChains: [1, 10, 130, 137, 8453, 84532, 42161],
14
+ supportedChains: [1, 10, 130, 137, 8453, 84532, 42161, 4663],
15
15
  laneCompatibility:
16
- 'Kyber quote/build is live on Ethereum, Optimism, Unichain, Polygon, Base, and Arbitrum; sponsored Kyber execution is validated on Base only. Gnosis FX uses the fx provider via CoW.',
16
+ 'Kyber quote/build is live on Ethereum, Optimism, Unichain, Polygon, Base, and Arbitrum; sponsored Kyber execution is validated on Base only. Robinhood Chain (4663) uses Li.Fi Intents for spot swaps with user-pays gas. Gnosis FX uses the fx provider via CoW.',
17
17
  credentialUx: 'Use normal Thirdfy login/delegation; do not use this provider for Hyperliquid, Lighter, or Polymarket.',
18
18
  };
19
19
  }
@@ -329,7 +329,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
329
329
  canonicalWriteAction: 'execute_bridge',
330
330
  readActions: ['get_bridge_quote', 'get_supported_bridge_chains', 'check_bridge_status'],
331
331
  orderManagementActions: ['execute_bridge'],
332
- supportedChains: [1, 8453, 42161, 10, 137, 56, 43114, 250, 100, 1284, 1285, 25, 288, 1088, 42220, 122, 324, 59144, 534352, 5000, 81457, 169],
332
+ supportedChains: [1, 8453, 42161, 10, 137, 56, 43114, 250, 100, 1284, 1285, 25, 288, 1088, 42220, 122, 324, 59144, 534352, 5000, 81457, 169, 4663],
333
333
  laneCompatibility: 'Li.Fi bridge supports mainnet value movement only; testnets are not auto-mapped to mainnet.',
334
334
  };
335
335
  }
@@ -455,6 +455,22 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
455
455
  'Yield.xyz writes are transaction-prep first. Thirdfy calls Yield.xyz directly and validates returned unsigned transactions with @yieldxyz/shield before signing or returning prepared calls.',
456
456
  example:
457
457
  'thirdfy-agent actions --provider yield-xyz && thirdfy-agent preflight --action deposit_earn_position --params \'{"providerId":"yield-xyz","opportunityId":"ethereum-eth-lido-staking","tokenAddress":"0x...","amount":"0.01","chainId":1}\'',
458
+ supportedChains: [1, 10, 100, 130, 137, 42220, 8453, 42161, 4663],
459
+ };
460
+ }
461
+ if (provider === 'market-data') {
462
+ return {
463
+ provider,
464
+ category: 'market_data',
465
+ canonicalReadAction: 'get_trending_tokens',
466
+ readActions: [
467
+ 'get_trending_tokens',
468
+ 'get_new_token_launches',
469
+ 'get_token_market_data',
470
+ 'get_chain_market_overview',
471
+ ],
472
+ supportedChains: [8453, 84532, 4663],
473
+ laneCompatibility: 'Read-only market data via API-owned actions. Robinhood Chain uses CoinGecko Onchain network id robinhood.',
458
474
  };
459
475
  }
460
476
  return null;
@@ -488,6 +504,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
488
504
  curve: 'get_curve_pools',
489
505
  'vaults-fyi': 'get-vaults-fyi-vaults',
490
506
  'yield-xyz': 'get_yield_xyz_opportunities',
507
+ 'market-data': 'get_trending_tokens',
491
508
  prediction: 'get_prediction_markets',
492
509
  };
493
510
  return {