@thirdfy/agent-cli 0.2.41 → 0.2.43
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 +18 -0
- package/README.md +6 -3
- package/package.json +1 -1
- package/src/commands/execute.mjs +14 -1
- package/src/commands/polymarket.mjs +3 -3
- package/src/core/readOnlyActions.mjs +2 -1
- package/src/runtime/actions/selection.mjs +13 -2
- package/src/runtime/handlers.mjs +1 -0
- package/src/runtime/providerHints.mjs +31 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,24 @@ All notable changes to `@thirdfy/agent-cli` are documented here. The format is b
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.2.43] - 2026-07-31
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `aave` provider routing, hints, and action aliases (`get_aave_markets`, lending actions) for earn CLI/MCP parity with Thirdfy API.
|
|
12
|
+
- Provider index links `earn-aave.md` and lists `aave` in the earn providers row. MCP parity in `thirdfy-mcp` **0.0.88**.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- `polymarket status` and `polymarket setup` use the execute run rail (`commandRun`) so responses include live funding/setup payloads, not wallet-only preflight.
|
|
17
|
+
- `prepare_polymarket_onboarding` in `READ_ONLY_EXACT` (parity with Thirdfy API).
|
|
18
|
+
|
|
19
|
+
## 0.2.42
|
|
20
|
+
|
|
21
|
+
- Treat `check_*` actions as read-only (Near Intents `check_bridge_status` parity with API/MCP).
|
|
22
|
+
- Selection/routing updates for Near Intents bridge provider alias.
|
|
23
|
+
|
|
24
|
+
|
|
7
25
|
## [0.2.41] - 2026-07-28
|
|
8
26
|
|
|
9
27
|
### Fixed
|
package/README.md
CHANGED
|
@@ -40,9 +40,12 @@ Run without global install:
|
|
|
40
40
|
npx @thirdfy/agent-cli --help
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
## What's new in v0.2.
|
|
44
|
-
|
|
45
|
-
-
|
|
43
|
+
## What's new in v0.2.43
|
|
44
|
+
|
|
45
|
+
- Aave earn provider routing (`get_aave_markets`, supply/withdraw, lending beta actions).
|
|
46
|
+
- Polymarket `status`/`setup` return live execute payloads; `prepare_polymarket_onboarding` is read-only.
|
|
47
|
+
|
|
48
|
+
See [CHANGELOG.md](./CHANGELOG.md) for older versions.
|
|
46
49
|
|
|
47
50
|
|
|
48
51
|
## Quick start
|
package/package.json
CHANGED
package/src/commands/execute.mjs
CHANGED
|
@@ -128,11 +128,24 @@ async function commandRun(ctx, flags, capabilities) {
|
|
|
128
128
|
});
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
|
+
const data = flags.__polymarketSetupGuide
|
|
132
|
+
? {
|
|
133
|
+
...normalized,
|
|
134
|
+
setupGuide: {
|
|
135
|
+
message:
|
|
136
|
+
'Review the onboarding plan above. Use polymarket status for live funding and setup payloads.',
|
|
137
|
+
nextCommands: [
|
|
138
|
+
'thirdfy-agent polymarket status --json',
|
|
139
|
+
'thirdfy-agent run --run-mode agent_wallet --action complete_polymarket_onboarding --params \'{"agentKey":"<key>","dryRun":true}\' --json',
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
}
|
|
143
|
+
: normalized;
|
|
131
144
|
printEnvelope({
|
|
132
145
|
success: normalized.success,
|
|
133
146
|
code: backendResult.code,
|
|
134
147
|
message: backendResult.message,
|
|
135
|
-
data
|
|
148
|
+
data,
|
|
136
149
|
meta: {
|
|
137
150
|
apiBase: ctx.apiBase,
|
|
138
151
|
requestedAction: resolved.requestedAction,
|
|
@@ -27,7 +27,7 @@ export function resolveConfigAgentKey(flags) {
|
|
|
27
27
|
return extractAgentKey(config);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
export function createPolymarketCommands({ commandPreflight, printEnvelope }) {
|
|
30
|
+
export function createPolymarketCommands({ commandRun, commandPreflight, printEnvelope }) {
|
|
31
31
|
async function commandPolymarketStatus(ctx, flags) {
|
|
32
32
|
const agentKey = resolveConfigAgentKey(flags);
|
|
33
33
|
const capabilities = await negotiateCapabilities(ctx);
|
|
@@ -47,7 +47,7 @@ export function createPolymarketCommands({ commandPreflight, printEnvelope }) {
|
|
|
47
47
|
flags.action = 'get_polymarket_setup_status';
|
|
48
48
|
flags.params = JSON.stringify(params);
|
|
49
49
|
}
|
|
50
|
-
await
|
|
50
|
+
await commandRun(ctx, flags, capabilities);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
async function commandPolymarketSetup(ctx, flags) {
|
|
@@ -61,7 +61,7 @@ export function createPolymarketCommands({ commandPreflight, printEnvelope }) {
|
|
|
61
61
|
});
|
|
62
62
|
if (!flags.runMode) flags.runMode = 'agent_wallet';
|
|
63
63
|
flags.__polymarketSetupGuide = true;
|
|
64
|
-
await
|
|
64
|
+
await commandRun(ctx, flags, capabilities);
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
async function commandPolymarketDryRun(ctx, flags) {
|
|
@@ -7,12 +7,13 @@
|
|
|
7
7
|
* execute rail and come back shaped as an execution envelope instead of provider data.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
const READ_ONLY_PREFIXES = ['get_', 'list_', 'fetch_', 'search_', 'show_', 'dogeos_get_'];
|
|
10
|
+
const READ_ONLY_PREFIXES = ['get_', 'list_', 'fetch_', 'search_', 'show_', 'check_', 'dogeos_get_'];
|
|
11
11
|
|
|
12
12
|
const READ_ONLY_EXACT = new Set([
|
|
13
13
|
'dogeos_barkswap_get_quote',
|
|
14
14
|
'dogeos_laika_read_contract',
|
|
15
15
|
'dogeos_laika_token_state',
|
|
16
|
+
'prepare_polymarket_onboarding',
|
|
16
17
|
]);
|
|
17
18
|
|
|
18
19
|
export function normalizeActionKey(actionKey) {
|
|
@@ -122,6 +122,11 @@ function inferActionProvider(action) {
|
|
|
122
122
|
'get-morpho-vaults': 'morpho',
|
|
123
123
|
'deposit-morpho-vault': 'morpho',
|
|
124
124
|
'withdraw-morpho-vault': 'morpho',
|
|
125
|
+
'get-aave-markets': 'aave',
|
|
126
|
+
'get-aave-portfolio': 'aave',
|
|
127
|
+
'aave-borrow': 'aave',
|
|
128
|
+
'aave-repay': 'aave',
|
|
129
|
+
'aave-set-collateral': 'aave',
|
|
125
130
|
'get-curve-pools': 'curve',
|
|
126
131
|
'get-curve-pool-details': 'curve',
|
|
127
132
|
'deposit-curve-pool': 'curve',
|
|
@@ -171,6 +176,7 @@ function inferActionProvider(action) {
|
|
|
171
176
|
if (key.includes('capyfi')) return 'capyfi';
|
|
172
177
|
if (key.includes('fx') || key.includes('monerium')) return 'fx';
|
|
173
178
|
if (key.includes('morpho')) return 'morpho';
|
|
179
|
+
if (key.includes('aave')) return 'aave';
|
|
174
180
|
if (key.includes('aegis')) return 'aegis';
|
|
175
181
|
if (key.includes('curve')) return 'curve';
|
|
176
182
|
if (key.includes('earn') || key.includes('yield') || key.includes('vault')) return 'earn';
|
|
@@ -247,11 +253,16 @@ function actionMatchesProvider(action, requestedProvider, allActions) {
|
|
|
247
253
|
if (provider === 'bridge' || isProviderActionKey(action, 'bridge')) return true;
|
|
248
254
|
return false;
|
|
249
255
|
}
|
|
256
|
+
if (requestedProvider === 'near-intents' || requestedProvider === 'near_intents') {
|
|
257
|
+
if (provider === 'hyperliquid' || provider === 'lighter') return false;
|
|
258
|
+
if (provider === 'bridge' || isProviderActionKey(action, 'bridge')) return true;
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
250
261
|
if (requestedProvider.startsWith('dogeos')) return isProviderActionKey(action, requestedProvider);
|
|
251
262
|
if (requestedProvider === 'earn') {
|
|
252
|
-
return provider === 'earn' || provider === 'morpho' || provider === 'aegis' || provider === 'curve' || provider === 'capyfi' || provider === 'vaults-fyi' || provider === 'yield-xyz' || isEarnCatalogAction(action);
|
|
263
|
+
return provider === 'earn' || provider === 'morpho' || provider === 'aave' || provider === 'aegis' || provider === 'curve' || provider === 'capyfi' || provider === 'vaults-fyi' || provider === 'yield-xyz' || isEarnCatalogAction(action);
|
|
253
264
|
}
|
|
254
|
-
if (requestedProvider === 'morpho' || requestedProvider === 'aegis' || requestedProvider === 'curve' || requestedProvider === 'capyfi' || requestedProvider === 'vaults-fyi' || requestedProvider === 'yield-xyz') {
|
|
265
|
+
if (requestedProvider === 'morpho' || requestedProvider === 'aave' || requestedProvider === 'aegis' || requestedProvider === 'curve' || requestedProvider === 'capyfi' || requestedProvider === 'vaults-fyi' || requestedProvider === 'yield-xyz') {
|
|
255
266
|
const hasProtocolSpecificEarnRows = allActions.some((candidate) => getActionProviderWithInference(candidate) === requestedProvider);
|
|
256
267
|
return (
|
|
257
268
|
isProviderActionKey(action, requestedProvider) ||
|
package/src/runtime/handlers.mjs
CHANGED
|
@@ -347,6 +347,8 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
|
|
|
347
347
|
'get_earn_provider',
|
|
348
348
|
'get_earn_position',
|
|
349
349
|
'get_morpho_vaults',
|
|
350
|
+
'get_aave_markets',
|
|
351
|
+
'get_aave_portfolio',
|
|
350
352
|
'get_aegis_pools',
|
|
351
353
|
'get_aegis_pool_state',
|
|
352
354
|
'get_aegis_vault_state',
|
|
@@ -356,7 +358,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
|
|
|
356
358
|
],
|
|
357
359
|
orderManagementActions: ['deposit_earn_position', 'withdraw_earn_position'],
|
|
358
360
|
laneCompatibility:
|
|
359
|
-
'Generic earn writes use deposit_earn_position / withdraw_earn_position on normal Thirdfy policy/delegation rails; routing selects Morpho, Curve, Vaults.fyi, or Yield.xyz adapters per provider/opportunity.',
|
|
361
|
+
'Generic earn writes use deposit_earn_position / withdraw_earn_position on normal Thirdfy policy/delegation rails; routing selects Morpho, Aave, Curve, Vaults.fyi, or Yield.xyz adapters per provider/opportunity.',
|
|
360
362
|
};
|
|
361
363
|
}
|
|
362
364
|
if (provider === 'capyfi') {
|
|
@@ -399,6 +401,32 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
|
|
|
399
401
|
'thirdfy-agent run --action get_earn_opportunities --params \'{"providerId":"morpho","chainId":8453,"asset":"USDC"}\' && thirdfy-agent run --action deposit_earn_position --params \'{"providerId":"morpho","chainId":8453,"vaultAddress":"0x...","tokenAddress":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","amount":"0.1","tokenDecimals":6}\'',
|
|
400
402
|
};
|
|
401
403
|
}
|
|
404
|
+
if (provider === 'aave') {
|
|
405
|
+
return {
|
|
406
|
+
provider,
|
|
407
|
+
category: 'earn',
|
|
408
|
+
canonicalReadAction: 'get_aave_markets',
|
|
409
|
+
canonicalWriteAction: 'deposit_earn_position',
|
|
410
|
+
readActions: [
|
|
411
|
+
'get_aave_markets',
|
|
412
|
+
'get_aave_portfolio',
|
|
413
|
+
'get_earning_opportunities',
|
|
414
|
+
'get_earn_opportunities',
|
|
415
|
+
'get_earn_position',
|
|
416
|
+
],
|
|
417
|
+
orderManagementActions: [
|
|
418
|
+
'deposit_earn_position',
|
|
419
|
+
'withdraw_earn_position',
|
|
420
|
+
'aave_borrow',
|
|
421
|
+
'aave_repay',
|
|
422
|
+
'aave_set_collateral',
|
|
423
|
+
],
|
|
424
|
+
laneCompatibility:
|
|
425
|
+
'Aave V3 supply and withdraw route through deposit_earn_position / withdraw_earn_position with providerId aave. Lending beta actions use aave_borrow, aave_repay, and aave_set_collateral with health-factor guards.',
|
|
426
|
+
example:
|
|
427
|
+
'thirdfy-agent actions --provider aave --json && thirdfy-agent run --action get_aave_markets --params \'{"chainId":8453}\'',
|
|
428
|
+
};
|
|
429
|
+
}
|
|
402
430
|
if (provider === 'aegis') {
|
|
403
431
|
return {
|
|
404
432
|
provider,
|
|
@@ -496,6 +524,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
|
|
|
496
524
|
prediction: 'place_prediction_order',
|
|
497
525
|
earn: 'deposit_earn_position',
|
|
498
526
|
morpho: 'deposit_earn_position',
|
|
527
|
+
aave: 'deposit_earn_position',
|
|
499
528
|
aegis: 'deposit_aegis_lender',
|
|
500
529
|
curve: 'deposit_earn_position',
|
|
501
530
|
'vaults-fyi': 'deposit_earn_position',
|
|
@@ -504,6 +533,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
|
|
|
504
533
|
const canonicalReadActions = {
|
|
505
534
|
earn: 'get_earning_opportunities',
|
|
506
535
|
morpho: 'get_morpho_vaults',
|
|
536
|
+
aave: 'get_aave_markets',
|
|
507
537
|
aegis: 'get_aegis_pools',
|
|
508
538
|
curve: 'get_curve_pools',
|
|
509
539
|
'vaults-fyi': 'get-vaults-fyi-vaults',
|