@thirdfy/agent-cli 0.2.63 → 0.2.64

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,16 @@ All notable changes to `@thirdfy/agent-cli` are documented here. The format is b
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.2.64] - 2026-09-10
8
+
9
+ ### Added
10
+
11
+ - Fomo API provider (`providerId: fomo`): read-only `get_fomo_search`, `get_fomo_user`, `get_fomo_balances`, `get_fomo_leaderboard`, `get_fomo_alerts`. Unofficial [fomoapi.io](https://fomoapi.io/docs) integration, not the Fomo consumer app. See [`docs/providers/fomo.md`](./docs/providers/fomo.md). Pairs with `thirdfy-mcp` **0.0.114** and Thirdfy API **3.14.33**.
12
+
13
+ ### Fixed
14
+
15
+ - Catalog `paramsSchema` coerces finite numbers on `amount*` keys to strings when the schema type is string (`amountUsdc: 29.24` → `"29.24"`). `orderId` numbers still fail. Pairs with `thirdfy-mcp` **0.0.114**. Pin: `test/params-schema-validation.test.cjs`.
16
+
7
17
  ## [0.2.63] - 2026-09-09
8
18
 
9
19
  ### Changed
package/README.md CHANGED
@@ -40,11 +40,10 @@ Run without global install:
40
40
  npx @thirdfy/agent-cli --help
41
41
  ```
42
42
 
43
- ## What's new in v0.2.63
43
+ ## What's new in v0.2.64
44
44
 
45
- - Polymarket discovery uses `get_prediction_markets` with a Gamma `tag_id` and an `end_date_min` / `end_date_max` window.
46
- - `search_prediction_markets` is for human text or slug lookup, not agent discovery.
47
- - `get_polymarket_user_orders` returns `orders` and `openOrderCount` at the top level.
45
+ - Fomo API (`providerId: fomo`) read-only handle intel and app alerts via `get_fomo_*`. Unofficial fomoapi.io integration, not the Fomo consumer app. See [`docs/providers/fomo.md`](./docs/providers/fomo.md).
46
+ - Catalog `paramsSchema` coerces finite numbers on `amount*` keys to strings when the schema type is string (`amountUsdc: 29.24` → `"29.24"`).
48
47
  - See [CHANGELOG.md](./CHANGELOG.md) and GitHub Releases for older versions.
49
48
 
50
49
  ## Quick start
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thirdfy/agent-cli",
3
- "version": "0.2.63",
3
+ "version": "0.2.64",
4
4
  "description": "Thirdfy Agent CLI for onboarding, governance preflight, execute-intent, and status polling.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -707,6 +707,25 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
707
707
  'thirdfy-agent condor policy-status && thirdfy-agent condor preflight --estimated-amount-usd 25 --idempotency-key <key>',
708
708
  };
709
709
  }
710
+ if (provider === 'fomo') {
711
+ return {
712
+ provider,
713
+ category: 'smart_money_intel',
714
+ canonicalReadAction: 'get_fomo_alerts',
715
+ readActions: [
716
+ 'get_fomo_search',
717
+ 'get_fomo_user',
718
+ 'get_fomo_balances',
719
+ 'get_fomo_leaderboard',
720
+ 'get_fomo_alerts',
721
+ ],
722
+ supportedChains: [],
723
+ laneCompatibility:
724
+ 'Fomo API (fomoapi.io) uses string chain slugs (robinhood, solana, base, bsc, eth), not numeric chainId. Unofficial integration; not the Fomo consumer app. Read-only handle intel and app alerts via Thirdfy API. Resolve handles before storing watchlists. Pace calls (~1 req/s).',
725
+ example:
726
+ 'thirdfy-agent run --action get_fomo_alerts --params \'{"chain":"robinhood","type":"buy","limit":5}\' --provider fomo --json',
727
+ };
728
+ }
710
729
  if (provider === 'gmgn') {
711
730
  return {
712
731
  provider,
@@ -869,6 +888,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
869
888
  'vaults-fyi': 'get-vaults-fyi-vaults',
870
889
  'yield-xyz': 'get_yield_xyz_opportunities',
871
890
  'market-data': 'get_trending_tokens',
891
+ fomo: 'get_fomo_alerts',
872
892
  gmgn: 'get_gmgn_kol_trades',
873
893
  nansen: 'get_nansen_perp_screener',
874
894
  basedbid: 'basedbid_get_tokens',
@@ -44,12 +44,29 @@ function extractFieldFromError(message) {
44
44
  return null;
45
45
  }
46
46
 
47
+ /** Coerce JSON numbers on amount* keys when the catalog schema type is string. Do not coerce orderId. */
48
+ export function coerceAmountKeysToSchemaStrings(params, schema) {
49
+ const next = params && typeof params === 'object' ? params : {};
50
+ const properties = schema?.properties;
51
+ if (!properties || typeof properties !== 'object') return next;
52
+ for (const [key, value] of Object.entries(next)) {
53
+ if (!/amount/i.test(key)) continue;
54
+ const rule = properties[key];
55
+ if (!rule || String(rule.type) !== 'string') continue;
56
+ if (typeof value === 'number' && Number.isFinite(value)) {
57
+ next[key] = String(value);
58
+ }
59
+ }
60
+ return next;
61
+ }
62
+
47
63
  /**
48
64
  * Validate action params against catalog paramsSchema (JSON Schema subset used by Thirdfy API).
49
65
  * Mirrors AgentExecutionService.validateParamsSchema for client-side fail-fast.
50
66
  */
51
67
  export function validateParamsSchema(params, schema) {
52
68
  if (!schema || typeof schema !== 'object') return { valid: true };
69
+ coerceAmountKeysToSchemaStrings(params, schema);
53
70
 
54
71
  const required = Array.isArray(schema.required) ? schema.required.map((k) => String(k)) : [];
55
72
  const properties =