@thirdfy/agent-cli 0.2.49 → 0.2.51

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,18 @@ All notable changes to `@thirdfy/agent-cli` are documented here. The format is b
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.2.51] - 2026-08-16
8
+
9
+ ### Fixed
10
+
11
+ - Earn writes `deposit_earn_position` / `withdraw_earn_position` use the 180s long HTTP timeout (same as Lighter onboarding). Default 30s aborted live Morpho deposits on Hermes (`CLI_UNHANDLED_ERROR` / "This operation was aborted"). Pairs with `thirdfy-mcp` **0.0.99**.
12
+
13
+ ## [0.2.50] - 2026-08-14
14
+
15
+ ### Added
16
+
17
+ - Uniswap LP (`providerId: uniswap`) provider hints and earn-family routing: `get_uniswap_*` reads plus named mint/increase/decrease/collect/close/burn writes. See [`docs/providers/earn-uniswap.md`](./docs/providers/earn-uniswap.md). Pairs with Thirdfy API **3.13.63** and `thirdfy-mcp` **0.0.98**.
18
+
7
19
  ## [0.2.49] - 2026-08-10
8
20
 
9
21
  ### Fixed
package/README.md CHANGED
@@ -40,10 +40,11 @@ Run without global install:
40
40
  npx @thirdfy/agent-cli --help
41
41
  ```
42
42
 
43
- ## What's new in v0.2.49
43
+ ## What's new in v0.2.51
44
44
 
45
- - Legacy spot write id `execute_optimal_swap` now routes to the trading provider like `swap` and `execute-optimal-swap`.
46
- - See [CHANGELOG.md](./CHANGELOG.md) for older versions.
45
+ - Morpho and Aave earn writes (`deposit_earn_position` / `withdraw_earn_position`) wait up to 180s instead of aborting at the 30s default.
46
+ - Hyphen and snake action ids both use the long timeout.
47
+ - See [CHANGELOG.md](./CHANGELOG.md) and GitHub Releases for older versions.
47
48
 
48
49
 
49
50
  ## Quick start
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thirdfy/agent-cli",
3
- "version": "0.2.49",
3
+ "version": "0.2.51",
4
4
  "description": "Thirdfy Agent CLI for onboarding, governance preflight, execute-intent, and status polling.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -4,6 +4,8 @@ const LONG_RUNNING_ACTIONS = new Set([
4
4
  'complete_lighter_onboarding',
5
5
  'setup_lighter_api_key',
6
6
  'register_lighter_api_key',
7
+ 'deposit_earn_position',
8
+ 'withdraw_earn_position',
7
9
  ]);
8
10
 
9
11
  function normalizeActionId(action) {
@@ -13,7 +15,7 @@ function normalizeActionId(action) {
13
15
  .toLowerCase();
14
16
  }
15
17
 
16
- /** Longer HTTP timeout for Lighter onboarding writes that poll CCTP credit or Ethereum changePubKey. */
18
+ /** Longer HTTP timeout for Lighter onboarding and Morpho/Aave earn writes (approve + vault call). */
17
19
  export function resolveActionTimeoutMs(action, baseTimeoutMs = DEFAULT_TIMEOUT_MS) {
18
20
  const base = Number.isFinite(baseTimeoutMs) && baseTimeoutMs > 0 ? baseTimeoutMs : DEFAULT_TIMEOUT_MS;
19
21
  if (!LONG_RUNNING_ACTIONS.has(normalizeActionId(action))) return base;
@@ -132,6 +132,17 @@ function inferActionProvider(action) {
132
132
  'get-curve-pool-details': 'curve',
133
133
  'deposit-curve-pool': 'curve',
134
134
  'withdraw-curve-pool': 'curve',
135
+ 'get-uniswap-pools': 'uniswap',
136
+ 'get-uniswap-pool-state': 'uniswap',
137
+ 'get-uniswap-positions': 'uniswap',
138
+ 'get-uniswap-position': 'uniswap',
139
+ 'get-uniswap-fees': 'uniswap',
140
+ 'mint-uniswap-position': 'uniswap',
141
+ 'increase-uniswap-liquidity': 'uniswap',
142
+ 'decrease-uniswap-liquidity': 'uniswap',
143
+ 'collect-uniswap-fees': 'uniswap',
144
+ 'close-uniswap-position': 'uniswap',
145
+ 'burn-uniswap-position': 'uniswap',
135
146
  'get-aegis-pools': 'aegis',
136
147
  'get-aegis-pool-state': 'aegis',
137
148
  'get-aegis-vault-state': 'aegis',
@@ -180,6 +191,7 @@ function inferActionProvider(action) {
180
191
  if (key.includes('aave')) return 'aave';
181
192
  if (key.includes('aegis')) return 'aegis';
182
193
  if (key.includes('curve')) return 'curve';
194
+ if (key.includes('uniswap')) return 'uniswap';
183
195
  if (key.includes('earn') || key.includes('yield') || key.includes('vault')) return 'earn';
184
196
  if (key.includes('bridge')) return 'bridge';
185
197
  if (key.includes('dogeos-barkswap')) return 'dogeos-barkswap';
@@ -261,9 +273,9 @@ function actionMatchesProvider(action, requestedProvider, allActions) {
261
273
  }
262
274
  if (requestedProvider.startsWith('dogeos')) return isProviderActionKey(action, requestedProvider);
263
275
  if (requestedProvider === 'earn') {
264
- return provider === 'earn' || provider === 'morpho' || provider === 'aave' || provider === 'aegis' || provider === 'curve' || provider === 'capyfi' || provider === 'vaults-fyi' || provider === 'yield-xyz' || isEarnCatalogAction(action);
276
+ return provider === 'earn' || provider === 'morpho' || provider === 'aave' || provider === 'aegis' || provider === 'curve' || provider === 'uniswap' || provider === 'capyfi' || provider === 'vaults-fyi' || provider === 'yield-xyz' || isEarnCatalogAction(action);
265
277
  }
266
- if (requestedProvider === 'morpho' || requestedProvider === 'aave' || requestedProvider === 'aegis' || requestedProvider === 'curve' || requestedProvider === 'capyfi' || requestedProvider === 'vaults-fyi' || requestedProvider === 'yield-xyz') {
278
+ if (requestedProvider === 'morpho' || requestedProvider === 'aave' || requestedProvider === 'aegis' || requestedProvider === 'curve' || requestedProvider === 'uniswap' || requestedProvider === 'capyfi' || requestedProvider === 'vaults-fyi' || requestedProvider === 'yield-xyz') {
267
279
  const hasProtocolSpecificEarnRows = allActions.some((candidate) => getActionProviderWithInference(candidate) === requestedProvider);
268
280
  return (
269
281
  isProviderActionKey(action, requestedProvider) ||
@@ -471,6 +471,36 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
471
471
  'Curve EVM writes are limited to the validated Base mainnet 4pool adapter; other pools remain discovery-only until per-pool calldata is validated.',
472
472
  };
473
473
  }
474
+ if (provider === 'uniswap') {
475
+ return {
476
+ provider,
477
+ category: 'earn',
478
+ canonicalReadAction: 'get_uniswap_pools',
479
+ canonicalWriteAction: 'mint_uniswap_position',
480
+ readActions: [
481
+ 'get_uniswap_pools',
482
+ 'get_uniswap_pool_state',
483
+ 'get_uniswap_positions',
484
+ 'get_uniswap_position',
485
+ 'get_uniswap_fees',
486
+ 'get_earning_opportunities',
487
+ 'get_earn_opportunities',
488
+ ],
489
+ orderManagementActions: [
490
+ 'mint_uniswap_position',
491
+ 'increase_uniswap_liquidity',
492
+ 'decrease_uniswap_liquidity',
493
+ 'collect_uniswap_fees',
494
+ 'close_uniswap_position',
495
+ 'burn_uniswap_position',
496
+ ],
497
+ supportedChains: [8453, 42161, 1, 4663],
498
+ laneCompatibility:
499
+ 'Uniswap LP discovery is read-first on Base v3 and vanilla v4 pools. Named mint/increase/decrease/collect/close actions replace deposit_earn_position; writes ship after Gate A discover passes.',
500
+ example:
501
+ 'thirdfy-agent actions --provider uniswap --json && thirdfy-agent run --action get_uniswap_pools --params \'{"chainId":8453}\'',
502
+ };
503
+ }
474
504
  if (provider === 'vaults-fyi') {
475
505
  return {
476
506
  provider,
@@ -599,6 +629,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
599
629
  aave: 'deposit_earn_position',
600
630
  aegis: 'deposit_aegis_lender',
601
631
  curve: 'deposit_earn_position',
632
+ uniswap: 'mint_uniswap_position',
602
633
  'vaults-fyi': 'deposit_earn_position',
603
634
  'yield-xyz': 'deposit_earn_position',
604
635
  };
@@ -608,6 +639,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
608
639
  aave: 'get_aave_markets',
609
640
  aegis: 'get_aegis_pools',
610
641
  curve: 'get_curve_pools',
642
+ uniswap: 'get_uniswap_pools',
611
643
  'vaults-fyi': 'get-vaults-fyi-vaults',
612
644
  'yield-xyz': 'get_yield_xyz_opportunities',
613
645
  'market-data': 'get_trending_tokens',