@thirdfy/agent-cli 0.2.11 → 0.2.13

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.13] - 2026-06-23
8
+
9
+ ### Changed
10
+
11
+ - Lighter provider hints: Base-first `complete_lighter_onboarding` lead action and catalog-aligned names for CCTP funding, API-key setup, and integrator approval. Pairs with Thirdfy API **v3.5.3+** and `thirdfy-mcp` **v0.0.62+**.
12
+
13
+ ## [0.2.12] - 2026-06-22
14
+
15
+ ### Added
16
+
17
+ - Lighter perps provider: `lighter` command group, provider hints, execution lanes, and wallet helpers for CCTP funding discovery, market reads, API-key setup, and signed perps writes. Pairs with Thirdfy API **v3.5.2+** and `thirdfy-mcp` **v0.0.61+**.
18
+
7
19
  ## [0.2.11] - 2026-06-17
8
20
 
9
21
  ### Changed
package/README.md CHANGED
@@ -40,10 +40,14 @@ Run without global install:
40
40
  npx @thirdfy/agent-cli --help
41
41
  ```
42
42
 
43
- ## What's new in v0.2.11
43
+ ## What's new in v0.2.13
44
44
 
45
- - Command reference adds `get_allora_topics` and `get_allora_topic_inference` examples for provider `allora`. Pairs with Thirdfy API **v3.4.60+**.
46
- - Public docs no longer imply you need an Allora API key in the CLI. Allora reads bill through Thirdfy credits like other provider actions.
45
+ - Lighter provider hints prioritize Base-first `complete_lighter_onboarding` and catalog-aligned action names for CCTP funding, API-key setup, and integrator approval. Pairs with Thirdfy API **v3.5.3+** and `thirdfy-mcp` **v0.0.62+**.
46
+
47
+ ## What's new in v0.2.12
48
+
49
+ - Lighter perps provider support: funding discovery, `complete_lighter_onboarding`, market/account reads, API-key setup, and signed perps order management via the `lighter` command group. Pairs with Thirdfy API **v3.5.2+**.
50
+ - Provider parity validation and command reference updated for `provider=lighter` actions.
47
51
 
48
52
  Older versions: see [CHANGELOG.md](./CHANGELOG.md) and [GitHub Releases](https://github.com/thirdfy/agent-cli/releases).
49
53
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thirdfy/agent-cli",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "description": "Thirdfy Agent CLI for onboarding, governance preflight, execute-intent, and status polling.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,6 +19,7 @@ export function createExecuteCommands(deps) {
19
19
  enforceOffchainVenueLaneCompatibility,
20
20
  enforceChainCompatibility,
21
21
  applyHyperliquidAgentWalletAddressDefault,
22
+ applyLighterAgentWalletAddressDefault,
22
23
  runPreflightByMode,
23
24
  runExecutionByMode,
24
25
  applyExecutionFallbackHints,
@@ -38,7 +39,9 @@ async function commandPreflight(ctx, flags, capabilities) {
38
39
  enforceOffchainVenueLaneCompatibility(resolved.resolvedAction, runMode);
39
40
  const hybridWalletMode = runMode === 'hybrid' ? normalizeHybridWalletMode(flags.hybridWalletMode) : null;
40
41
  enforceChainCompatibility(capabilities, flags, runMode);
41
- const managedPreflight = await applyHyperliquidAgentWalletAddressDefault(ctx, flags, resolved, runMode);
42
+ const managedPreflight =
43
+ (await applyHyperliquidAgentWalletAddressDefault(ctx, flags, resolved, runMode))
44
+ || (await applyLighterAgentWalletAddressDefault(ctx, flags, resolved, runMode));
42
45
  const backendResult = await runPreflightByMode(runMode, ctx, flags, resolved, { hybridWalletMode, managedPreflight });
43
46
  const normalized = applyExecutionFallbackHints(backendResult.normalized, {
44
47
  flags,
@@ -88,7 +91,9 @@ async function commandRun(ctx, flags, capabilities) {
88
91
  enforceOffchainVenueLaneCompatibility(resolved.resolvedAction, runMode);
89
92
  const hybridWalletMode = runMode === 'hybrid' ? normalizeHybridWalletMode(flags.hybridWalletMode) : null;
90
93
  enforceChainCompatibility(capabilities, flags, runMode);
91
- const managedPreflight = await applyHyperliquidAgentWalletAddressDefault(ctx, flags, resolved, runMode);
94
+ const managedPreflight =
95
+ (await applyHyperliquidAgentWalletAddressDefault(ctx, flags, resolved, runMode))
96
+ || (await applyLighterAgentWalletAddressDefault(ctx, flags, resolved, runMode));
92
97
  const skipPreflight = Boolean(flags.skipPreflight);
93
98
  const backendResult = await runExecutionByMode(runMode, ctx, flags, resolved, {
94
99
  skipPreflight,
@@ -1,5 +1,6 @@
1
1
  export { createPolymarketCommands, resolveConfigAgentKey } from './polymarket.mjs';
2
2
  export { createHyperliquidHelpers } from './hyperliquid.mjs';
3
+ export { createLighterHelpers } from './lighter.mjs';
3
4
  export { createExecuteCommands } from './execute.mjs';
4
5
  export { createWalletCommands } from './wallet.mjs';
5
6
  export { createDelegationCommands } from './delegation.mjs';
@@ -0,0 +1,52 @@
1
+ import { parseJsonFlag } from '../core/args.mjs';
2
+
3
+ export function createLighterHelpers(deps) {
4
+ const { getPreparedParams, resolveManagedExecutionPreflight } = deps;
5
+
6
+
7
+ function lighterDefaultAddressParamForAction(action) {
8
+ const canonical = String(action || '').trim().toLowerCase().replace(/_/g, '-');
9
+ if (
10
+ canonical === 'get-lighter-open-orders'
11
+ || canonical === 'get-lighter-user-state'
12
+ ) {
13
+ return 'userAddress';
14
+ }
15
+ if (
16
+ canonical === 'get-lighter-account'
17
+ || canonical === 'get-lighter-setup-status'
18
+ || canonical === 'get-lighter-funding-status'
19
+ || canonical === 'get-lighter-onboarding-plan'
20
+ || canonical === 'prepare-lighter-onboarding'
21
+ || canonical === 'complete-lighter-onboarding'
22
+ || canonical === 'create-lighter-deposit-intent'
23
+ ) {
24
+ return 'l1Address';
25
+ }
26
+ return null;
27
+ }
28
+
29
+
30
+ async function applyLighterAgentWalletAddressDefault(ctx, flags, resolved, runMode) {
31
+ if (runMode !== 'agent_wallet') return null;
32
+ const paramName = lighterDefaultAddressParamForAction(resolved?.resolvedAction);
33
+ if (!paramName) return null;
34
+ const params = getPreparedParams(flags);
35
+ if (String(params?.[paramName] || '').trim()) return null;
36
+ const preflight = await resolveManagedExecutionPreflight(ctx, flags, resolved, {
37
+ runMode: 'agent_wallet',
38
+ requireFundingCheck: false,
39
+ });
40
+ if (!preflight.success || !preflight.executionWalletAddress) return preflight;
41
+ flags.__preparedParams = {
42
+ ...(params || {}),
43
+ [paramName]: preflight.executionWalletAddress,
44
+ };
45
+ return preflight;
46
+ }
47
+
48
+ return {
49
+ lighterDefaultAddressParamForAction,
50
+ applyLighterAgentWalletAddressDefault,
51
+ };
52
+ }
@@ -9,6 +9,7 @@ export function createWalletCommands(deps) {
9
9
  enforceOffchainVenueLaneCompatibility,
10
10
  enforceChainCompatibility,
11
11
  applyHyperliquidAgentWalletAddressDefault,
12
+ applyLighterAgentWalletAddressDefault,
12
13
  executeManagedWalletRun,
13
14
  executeSelfRun,
14
15
  submitSignedTx,
@@ -21,7 +22,9 @@ async function commandWalletExecute(ctx, flags, capabilities) {
21
22
  const resolved = await resolveActionSelection(ctx, normalizedFlags);
22
23
  prepareActionParamsForFlags(normalizedFlags, resolved.resolvedAction);
23
24
  enforceChainCompatibility(capabilities, normalizedFlags, 'agent_wallet');
24
- const managedPreflight = await applyHyperliquidAgentWalletAddressDefault(ctx, normalizedFlags, resolved, 'agent_wallet');
25
+ const managedPreflight =
26
+ (await applyHyperliquidAgentWalletAddressDefault(ctx, normalizedFlags, resolved, 'agent_wallet'))
27
+ || (await applyLighterAgentWalletAddressDefault(ctx, normalizedFlags, resolved, 'agent_wallet'));
25
28
  const skipPreflight = Boolean(normalizedFlags.skipPreflight);
26
29
  const result = await executeManagedWalletRun(ctx, normalizedFlags, resolved, { skipPreflight, managedPreflight });
27
30
  printEnvelope({
@@ -93,6 +93,22 @@ function inferActionProvider(action) {
93
93
  'get-perps-position': 'hyperliquid',
94
94
  'place-perps-order': 'hyperliquid',
95
95
  'cancel-perps-order': 'hyperliquid',
96
+ 'get-lighter-perps-meta': 'lighter',
97
+ 'get-lighter-all-mids': 'lighter',
98
+ 'search-lighter-markets': 'lighter',
99
+ 'get-lighter-l2-book': 'lighter',
100
+ 'get-lighter-candles': 'lighter',
101
+ 'get-lighter-user-state': 'lighter',
102
+ 'get-lighter-open-orders': 'lighter',
103
+ 'get-lighter-setup-status': 'lighter',
104
+ 'get-lighter-funding-status': 'lighter',
105
+ 'get-lighter-onboarding-plan': 'lighter',
106
+ 'prepare-lighter-onboarding': 'lighter',
107
+ 'approve-lighter-agent': 'lighter',
108
+ 'deposit-lighter-cctp': 'lighter',
109
+ 'place-lighter-perps-order': 'lighter',
110
+ 'cancel-lighter-perps-order': 'lighter',
111
+ 'update-lighter-leverage': 'lighter',
96
112
  'get-earn-opportunities': 'earn',
97
113
  'get-earn-provider': 'earn',
98
114
  'get-earn-position': 'earn',
@@ -146,6 +162,7 @@ function inferActionProvider(action) {
146
162
  };
147
163
  if (knownMap[key]) return knownMap[key];
148
164
  if (key.includes('hyperliquid')) return 'hyperliquid';
165
+ if (key.includes('lighter')) return 'lighter';
149
166
  if (key.includes('bitfinex')) return 'bitfinex';
150
167
  if (key.includes('polymarket') || key.includes('prediction')) return 'polymarket';
151
168
  if (key.includes('vaults-fyi')) return 'vaults-fyi';
@@ -214,10 +231,11 @@ function actionMatchesProvider(action, requestedProvider, allActions) {
214
231
  if (requestedProvider === 'trading') return isSpotTradingCatalogAction(action);
215
232
  // Here resolved metadata already disagrees with the filter; fall back to action-key shape only.
216
233
  if (requestedProvider === 'hyperliquid') return isProviderActionKey(action, 'hyperliquid');
234
+ if (requestedProvider === 'lighter') return isProviderActionKey(action, 'lighter');
217
235
  if (requestedProvider === 'polymarket') return isProviderActionKey(action, 'polymarket');
218
236
  if (requestedProvider === 'bridge') {
219
- // Hyperliquid Bridge2 setup actions are owned by Hyperliquid, not the cross-chain bridge provider.
220
- if (provider === 'hyperliquid') return false;
237
+ // Hyperliquid Bridge2 and Lighter CCTP setup actions are owned by their perps providers, not cross-chain bridge.
238
+ if (provider === 'hyperliquid' || provider === 'lighter') return false;
221
239
  return isProviderActionKey(action, 'bridge');
222
240
  }
223
241
  if (requestedProvider.startsWith('dogeos')) return isProviderActionKey(action, requestedProvider);
@@ -7,6 +7,16 @@ const OFFCHAIN_VENUE_ORDER_ACTIONS = new Set([
7
7
  'cancel-hyperliquid-perps-order',
8
8
  'update_hyperliquid_leverage',
9
9
  'update-hyperliquid-leverage',
10
+ 'place_lighter_perps_order',
11
+ 'place-lighter-perps-order',
12
+ 'cancel_lighter_perps_order',
13
+ 'cancel-lighter-perps-order',
14
+ 'update_lighter_leverage',
15
+ 'update-lighter-leverage',
16
+ 'modify_lighter_perps_order',
17
+ 'modify-lighter-perps-order',
18
+ 'update_lighter_margin',
19
+ 'update-lighter-margin',
10
20
  'place_polymarket_order',
11
21
  'place-polymarket-order',
12
22
  ]);
@@ -15,7 +25,7 @@ function enforceOffchainVenueLaneCompatibility(action, runMode) {
15
25
  if (runMode !== 'self' || !OFFCHAIN_VENUE_ORDER_ACTIONS.has(normalizedAction)) return;
16
26
  throw createCliError(
17
27
  'OFFCHAIN_VENUE_ORDER_SELF_UNSUPPORTED',
18
- 'Polymarket CLOB and Hyperliquid perps orders are offchain signed API actions, not EVM build-tx actions. Use self for setup/funding signatures, then run venue orders with --run-mode thirdfy, --run-mode hybrid, or --run-mode agent_wallet.',
28
+ 'Polymarket CLOB, Hyperliquid perps, and Lighter perps orders are offchain signed API actions, not EVM build-tx actions. Use self for setup/funding signatures, then run venue orders with --run-mode thirdfy, --run-mode hybrid, or --run-mode agent_wallet.',
19
29
  {
20
30
  recommendedRunModes: ['thirdfy', 'hybrid', 'agent_wallet'],
21
31
  setupOnlyRunMode: 'self',
@@ -1,6 +1,7 @@
1
1
  import { negotiateCapabilities } from '../core/http.mjs';
2
2
  import { createPolymarketCommands } from '../commands/polymarket.mjs';
3
3
  import { createHyperliquidHelpers } from '../commands/hyperliquid.mjs';
4
+ import { createLighterHelpers } from '../commands/lighter.mjs';
4
5
  import { createExecuteCommands } from '../commands/execute.mjs';
5
6
  import { createWalletCommands } from '../commands/wallet.mjs';
6
7
  import { createDelegationCommands } from '../commands/delegation.mjs';
@@ -93,12 +94,19 @@ export function createRuntimeHandlers(deps) {
93
94
  });
94
95
  const { applyHyperliquidAgentWalletAddressDefault } = __hyperliquid;
95
96
 
97
+ const __lighter = createLighterHelpers({
98
+ getPreparedParams,
99
+ resolveManagedExecutionPreflight,
100
+ });
101
+ const { applyLighterAgentWalletAddressDefault } = __lighter;
102
+
96
103
  const __wallet = createWalletCommands({
97
104
  resolveActionSelection,
98
105
  prepareActionParamsForFlags,
99
106
  enforceOffchainVenueLaneCompatibility,
100
107
  enforceChainCompatibility,
101
108
  applyHyperliquidAgentWalletAddressDefault,
109
+ applyLighterAgentWalletAddressDefault,
102
110
  executeManagedWalletRun,
103
111
  executeSelfRun,
104
112
  submitSignedTx,
@@ -111,6 +119,7 @@ export function createRuntimeHandlers(deps) {
111
119
  enforceOffchainVenueLaneCompatibility,
112
120
  enforceChainCompatibility,
113
121
  applyHyperliquidAgentWalletAddressDefault,
122
+ applyLighterAgentWalletAddressDefault,
114
123
  runPreflightByMode,
115
124
  runExecutionByMode,
116
125
  applyExecutionFallbackHints,
@@ -14,7 +14,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
14
14
  supportedChains: [1, 10, 130, 137, 8453, 84532, 42161],
15
15
  laneCompatibility:
16
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.',
17
- credentialUx: 'Use normal Thirdfy login/delegation; do not use this provider for Hyperliquid or Polymarket.',
17
+ credentialUx: 'Use normal Thirdfy login/delegation; do not use this provider for Hyperliquid, Lighter, or Polymarket.',
18
18
  };
19
19
  }
20
20
  if (provider === 'hyperliquid') {
@@ -106,6 +106,96 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
106
106
  'thirdfy-agent actions --provider hyperliquid && thirdfy-agent preflight --action place_hyperliquid_perps_order --params \'{"coin":"ETH","isBuy":true,"size":0.01,"limitPx":3500,"orderType":"market"}\'',
107
107
  };
108
108
  }
109
+ if (provider === 'lighter') {
110
+ return {
111
+ provider,
112
+ category: 'leveraged_perps',
113
+ canonicalWriteAction: 'place_lighter_perps_order',
114
+ readActions: [
115
+ 'get_lighter_markets',
116
+ 'search_lighter_markets',
117
+ 'get_lighter_order_book',
118
+ 'get_lighter_candles',
119
+ 'get_lighter_funding_rates',
120
+ 'get_lighter_account',
121
+ 'get_lighter_positions',
122
+ 'get_lighter_open_orders',
123
+ 'get_lighter_pnl',
124
+ 'get_lighter_funding_status',
125
+ 'get_lighter_setup_status',
126
+ 'get_lighter_onboarding_plan',
127
+ 'get_lighter_integrator_status',
128
+ 'get_lighter_partner_stats',
129
+ ],
130
+ orderManagementActions: [
131
+ 'place_lighter_perps_order',
132
+ 'cancel_lighter_perps_order',
133
+ 'modify_lighter_perps_order',
134
+ 'update_lighter_leverage',
135
+ 'update_lighter_margin',
136
+ 'get_lighter_open_orders',
137
+ ],
138
+ setupActions: [
139
+ 'get_lighter_funding_status',
140
+ 'get_lighter_setup_status',
141
+ 'get_lighter_onboarding_plan',
142
+ 'prepare_lighter_onboarding',
143
+ 'complete_lighter_onboarding',
144
+ 'create_lighter_deposit_intent',
145
+ 'setup_lighter_api_key',
146
+ 'create_lighter_api_key',
147
+ 'register_lighter_api_key',
148
+ 'approve_lighter_integrator',
149
+ 'get_bridge_quote',
150
+ 'execute_bridge',
151
+ ],
152
+ statusActions: [
153
+ 'get_lighter_funding_status',
154
+ 'get_lighter_setup_status',
155
+ 'get_lighter_integrator_status',
156
+ ],
157
+ recoveryActions: [
158
+ 'get_lighter_account',
159
+ 'get_lighter_withdrawal_status',
160
+ 'prepare_lighter_secure_withdrawal',
161
+ ],
162
+ decommissionExample:
163
+ 'get_lighter_account -> prepare_lighter_secure_withdrawal -> withdraw-to-user on execution wallet',
164
+ credentialType: 'lighter_api_key',
165
+ credentialUx:
166
+ 'Delegated Lighter writes require encrypted lighter_api_key credentials: privateKey, apiKeyIndex (4-254), and accountIndex. Upsert via delegation credentials before place_lighter_perps_order.',
167
+ recommendedFundingChainId: 8453,
168
+ supportedFundingSourceChains: [
169
+ { chainId: 8453, name: 'Base', path: 'native USDC -> CCTP intent -> Lighter margin (recommended)' },
170
+ { chainId: 42161, name: 'Arbitrum One', path: 'Li.Fi -> Base USDC -> CCTP intent -> Lighter margin' },
171
+ { chainId: 43114, name: 'Avalanche', path: 'Li.Fi -> Base USDC -> CCTP intent -> Lighter margin' },
172
+ { chainId: 1, name: 'Ethereum', path: 'Priority changePubKey registration only (chainId 1)' },
173
+ ],
174
+ setupBlockers: [
175
+ 'LIGHTER_SOURCE_FUNDS_REQUIRED',
176
+ 'LIGHTER_DEPOSIT_REQUIRED',
177
+ 'LIGHTER_ACCOUNT_NOT_FOUND',
178
+ 'LIGHTER_API_KEY_REGISTRATION_REQUIRED',
179
+ 'LIGHTER_INTEGRATOR_APPROVAL_REQUIRED',
180
+ 'LIGHTER_POLICY_REQUIRED',
181
+ 'LIGHTER_CREDITS_REQUIRED',
182
+ 'LIGHTER_SIGNER_NOT_CONFIGURED',
183
+ ],
184
+ setupWarnings: [
185
+ 'LIGHTER_API_KEY_NOT_PROVIDED',
186
+ 'LIGHTER_INTEGRATOR_ACCOUNT_UNFUNDED',
187
+ ],
188
+ sourceBridgeProvider: 'lifi',
189
+ funding:
190
+ 'Run complete_lighter_onboarding on Base (chainId 8453) for automated Li.Fi, CCTP intent, and USDC transfer. API key registration uses an Ethereum priority changePubKey transaction (chainId 1). Minimum CCTP deposit is 5 USDC.',
191
+ laneCompatibility:
192
+ 'Use agent_wallet for automated complete_lighter_onboarding (CCTP on Base, priority changePubKey on Ethereum). Perps writes use thirdfy, hybrid, or agent_wallet with a stored lighter_api_key credential. Gator covers EVM funding and setup only, not L2 orders.',
193
+ setupExample:
194
+ 'actions --provider lighter -> complete_lighter_onboarding (chainId 8453, agent_wallet) -> re-run after CCTP credit -> setup_lighter_api_key on chainId 1 when prompted -> credentials upsert lighter_api_key (auto on agent_wallet) -> get_lighter_setup_status -> place_lighter_perps_order',
195
+ example:
196
+ 'thirdfy-agent actions --provider lighter && thirdfy-agent preflight --action place_lighter_perps_order --params \'{"accountIndex":1,"apiKeyIndex":4,"marketId":0,"baseAmount":100,"price":310000,"isAsk":false,"orderType":"limit"}\'',
197
+ };
198
+ }
109
199
  if (provider === 'bitfinex') {
110
200
  return {
111
201
  provider,
@@ -381,6 +471,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
381
471
  const canonicalWriteActions = {
382
472
  trading: 'swap',
383
473
  hyperliquid: 'place_hyperliquid_perps_order',
474
+ lighter: 'place_lighter_perps_order',
384
475
  polymarket: 'place_polymarket_order',
385
476
  prediction: 'place_prediction_order',
386
477
  earn: 'deposit_earn_position',