@thirdfy/agent-cli 0.2.60 → 0.2.62

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.62] - 2026-09-09
8
+
9
+ ### Added
10
+
11
+ - Ratehopper Managed USDC LP (`providerId: ratehopper`) on Base: `get_ratehopper_*` reads plus Safe deploy, operator enable, and `setup_ratehopper_cash_lp`. Close and owner sweep stay blocked until Ratehopper confirms a REST close path. See [`docs/providers/earn-ratehopper.md`](./docs/providers/earn-ratehopper.md). Pairs with `thirdfy-mcp` **0.0.111** and Thirdfy API **3.14.29**.
12
+
13
+ ## [0.2.61] - 2026-09-06
14
+
15
+ ### Fixed
16
+
17
+ - `resolveTokenInForFunding` no longer uses `tokenAddress` for `withdraw_earn_position` and `claim_earn_rewards`. Those actions receive the asset; the wallet does not need to already hold it. Earn deposits still fund from `tokenAddress`. Pairs with `thirdfy-mcp` **0.0.109**.
18
+
7
19
  ## [0.2.60] - 2026-09-05
8
20
 
9
21
  ### Changed
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.60
43
+ ## What's new in v0.2.62
44
44
 
45
- - basedbid buy and sell are live on Base, Ethereum, and Robinhood Chain.
46
- - Buy spends native ETH on the target chain. `tokenAddress` is the listing, not the funding token.
45
+ - Ratehopper Managed USDC LP on Base is a named earn provider (`ratehopper`).
46
+ - Discover agents and portfolio, then prepare Safe deploy and cash_lp setup when you confirm.
47
+ - Close and owner sweep stay blocked until Ratehopper confirms the REST close path.
47
48
  - See [CHANGELOG.md](./CHANGELOG.md) and GitHub Releases for older versions.
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.60",
3
+ "version": "0.2.62",
4
4
  "description": "Thirdfy Agent CLI for onboarding, governance preflight, execute-intent, and status polling.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -11,12 +11,22 @@ const NATIVE_ETH_SPEND_ACTIONS = new Set([
11
11
  'basedbid_create_board',
12
12
  ]);
13
13
 
14
+ /**
15
+ * Position exits receive `tokenAddress` from the protocol instead of spending it from the wallet.
16
+ * A vault withdraw funded entirely by vault shares would otherwise block on a zero wallet balance.
17
+ */
18
+ const POSITION_EXIT_ACTIONS = new Set([
19
+ 'withdraw_earn_position',
20
+ 'claim_earn_rewards',
21
+ ]);
22
+
14
23
  export function resolveTokenInForFunding(params, action) {
15
24
  if (!params || typeof params !== 'object') return '';
16
25
  const explicit = String(params.tokenIn || '').trim();
17
26
  if (explicit) return explicit;
18
27
  const actionId = normalizeActionKey(action);
19
28
  if (NATIVE_ETH_SPEND_ACTIONS.has(actionId)) return '';
29
+ if (POSITION_EXIT_ACTIONS.has(actionId)) return '';
20
30
  if (params.amountEth != null && String(params.amountEth).trim() !== '') return '';
21
31
  return String(params.tokenAddress || params.token || '').trim();
22
32
  }
@@ -144,6 +144,16 @@ function inferActionProvider(action) {
144
144
  'collect-uniswap-fees': 'uniswap',
145
145
  'close-uniswap-position': 'uniswap',
146
146
  'burn-uniswap-position': 'uniswap',
147
+ 'get-ratehopper-agents': 'ratehopper',
148
+ 'get-ratehopper-portfolio': 'ratehopper',
149
+ 'get-ratehopper-logs': 'ratehopper',
150
+ 'get-ratehopper-performance': 'ratehopper',
151
+ 'get-ratehopper-setup-status': 'ratehopper',
152
+ 'deploy-ratehopper-safe': 'ratehopper',
153
+ 'enable-ratehopper-operator': 'ratehopper',
154
+ 'setup-ratehopper-cash-lp': 'ratehopper',
155
+ 'close-ratehopper-agent': 'ratehopper',
156
+ 'transfer-ratehopper-to-owner': 'ratehopper',
147
157
  'get-aegis-pools': 'aegis',
148
158
  'get-aegis-pool-state': 'aegis',
149
159
  'get-aegis-vault-state': 'aegis',
@@ -195,6 +205,7 @@ function inferActionProvider(action) {
195
205
  if (key.includes('aegis')) return 'aegis';
196
206
  if (key.includes('curve')) return 'curve';
197
207
  if (key.includes('uniswap')) return 'uniswap';
208
+ if (key.includes('ratehopper')) return 'ratehopper';
198
209
  if (key.includes('earn') || key.includes('yield') || key.includes('vault')) return 'earn';
199
210
  if (key.includes('bridge')) return 'bridge';
200
211
  if (key.includes('dogeos-barkswap')) return 'dogeos-barkswap';
@@ -283,9 +294,9 @@ function actionMatchesProvider(action, requestedProvider, allActions) {
283
294
  }
284
295
  if (requestedProvider.startsWith('dogeos')) return isProviderActionKey(action, requestedProvider);
285
296
  if (requestedProvider === 'earn') {
286
- return provider === 'earn' || provider === 'morpho' || provider === 'aave' || provider === 'aegis' || provider === 'curve' || provider === 'uniswap' || provider === 'capyfi' || provider === 'vaults-fyi' || provider === 'yield-xyz' || isEarnCatalogAction(action);
297
+ return provider === 'earn' || provider === 'morpho' || provider === 'aave' || provider === 'aegis' || provider === 'curve' || provider === 'uniswap' || provider === 'ratehopper' || provider === 'capyfi' || provider === 'vaults-fyi' || provider === 'yield-xyz' || isEarnCatalogAction(action);
287
298
  }
288
- if (requestedProvider === 'morpho' || requestedProvider === 'aave' || requestedProvider === 'aegis' || requestedProvider === 'curve' || requestedProvider === 'uniswap' || requestedProvider === 'capyfi' || requestedProvider === 'vaults-fyi' || requestedProvider === 'yield-xyz') {
299
+ if (requestedProvider === 'morpho' || requestedProvider === 'aave' || requestedProvider === 'aegis' || requestedProvider === 'curve' || requestedProvider === 'uniswap' || requestedProvider === 'ratehopper' || requestedProvider === 'capyfi' || requestedProvider === 'vaults-fyi' || requestedProvider === 'yield-xyz') {
289
300
  const hasProtocolSpecificEarnRows = allActions.some((candidate) => getActionProviderWithInference(candidate) === requestedProvider);
290
301
  return (
291
302
  isProviderActionKey(action, requestedProvider) ||
@@ -611,6 +611,33 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
611
611
  'thirdfy-agent actions --provider uniswap --json && thirdfy-agent run --action get_uniswap_pools --params \'{"chainId":8453}\'',
612
612
  };
613
613
  }
614
+ if (provider === 'ratehopper') {
615
+ return {
616
+ provider,
617
+ category: 'earn',
618
+ canonicalReadAction: 'get_ratehopper_agents',
619
+ canonicalWriteAction: 'setup_ratehopper_cash_lp',
620
+ readActions: [
621
+ 'get_ratehopper_agents',
622
+ 'get_ratehopper_portfolio',
623
+ 'get_ratehopper_logs',
624
+ 'get_ratehopper_performance',
625
+ 'get_ratehopper_setup_status',
626
+ ],
627
+ orderManagementActions: [
628
+ 'deploy_ratehopper_safe',
629
+ 'enable_ratehopper_operator',
630
+ 'setup_ratehopper_cash_lp',
631
+ 'close_ratehopper_agent',
632
+ 'transfer_ratehopper_to_owner',
633
+ ],
634
+ supportedChains: [8453],
635
+ laneCompatibility:
636
+ 'Ratehopper Managed USDC LP uses a user-owned Safe on Base. Reads need Thirdfy-hosted Partner REST access. Close and owner sweep stay blocked until the REST close-path spike is confirmed.',
637
+ example:
638
+ 'thirdfy-agent actions --provider ratehopper --json && thirdfy-agent run --action get_ratehopper_agents --params \'{"chainId":8453}\'',
639
+ };
640
+ }
614
641
  if (provider === 'vaults-fyi') {
615
642
  return {
616
643
  provider,
@@ -820,6 +847,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
820
847
  basedbid: 'basedbid_create_lbp',
821
848
  curve: 'deposit_earn_position',
822
849
  uniswap: 'mint_uniswap_position',
850
+ ratehopper: 'setup_ratehopper_cash_lp',
823
851
  'vaults-fyi': 'deposit_earn_position',
824
852
  'yield-xyz': 'deposit_earn_position',
825
853
  };
@@ -830,6 +858,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
830
858
  aegis: 'get_aegis_pools',
831
859
  curve: 'get_curve_pools',
832
860
  uniswap: 'get_uniswap_pools',
861
+ ratehopper: 'get_ratehopper_agents',
833
862
  'vaults-fyi': 'get-vaults-fyi-vaults',
834
863
  'yield-xyz': 'get_yield_xyz_opportunities',
835
864
  'market-data': 'get_trending_tokens',