@thirdfy/agent-cli 0.2.62 → 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 +16 -0
- package/README.md +3 -4
- package/package.json +1 -1
- package/src/runtime/providerHints.mjs +29 -2
- package/src/runtime/validation/paramsSchema.mjs +17 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ 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
|
+
|
|
17
|
+
## [0.2.63] - 2026-09-09
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Prediction provider hints prefer `get_prediction_markets` with Gamma `tag_id` and `end_date_min` / `end_date_max` over `search_prediction_markets` for discovery. Pairs with `thirdfy-mcp` **0.0.113** and Thirdfy API **3.14.30**.
|
|
22
|
+
|
|
7
23
|
## [0.2.62] - 2026-09-09
|
|
8
24
|
|
|
9
25
|
### Added
|
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.
|
|
43
|
+
## What's new in v0.2.64
|
|
44
44
|
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
- Close and owner sweep stay blocked until Ratehopper confirms the REST close path.
|
|
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
|
@@ -433,11 +433,18 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
|
|
|
433
433
|
canonicalWriteAction: 'place_prediction_order',
|
|
434
434
|
readActions: [
|
|
435
435
|
'get_prediction_tags',
|
|
436
|
-
'search_prediction_markets',
|
|
437
|
-
'get_prediction_events',
|
|
438
436
|
'get_prediction_markets',
|
|
437
|
+
'get_prediction_events',
|
|
439
438
|
'get_prediction_market',
|
|
440
439
|
'get_prediction_order_book',
|
|
440
|
+
'search_prediction_markets',
|
|
441
|
+
],
|
|
442
|
+
discoveryFlow: [
|
|
443
|
+
'get_prediction_tags (resolve numeric tag_id once)',
|
|
444
|
+
'get_prediction_markets with tag_id + end_date_min/end_date_max + liquidity_num_min',
|
|
445
|
+
'get_prediction_order_book when book prices are missing',
|
|
446
|
+
'place_prediction_order after setup/funding/preflight',
|
|
447
|
+
'search_prediction_markets last for human text/slug lookup only',
|
|
441
448
|
],
|
|
442
449
|
orderManagementActions: ['place_prediction_order', 'cancel_prediction_order'],
|
|
443
450
|
compatibilityProvider: 'polymarket',
|
|
@@ -700,6 +707,25 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
|
|
|
700
707
|
'thirdfy-agent condor policy-status && thirdfy-agent condor preflight --estimated-amount-usd 25 --idempotency-key <key>',
|
|
701
708
|
};
|
|
702
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
|
+
}
|
|
703
729
|
if (provider === 'gmgn') {
|
|
704
730
|
return {
|
|
705
731
|
provider,
|
|
@@ -862,6 +888,7 @@ export function createProviderHints({ getNegotiatedCapabilitiesCache }) {
|
|
|
862
888
|
'vaults-fyi': 'get-vaults-fyi-vaults',
|
|
863
889
|
'yield-xyz': 'get_yield_xyz_opportunities',
|
|
864
890
|
'market-data': 'get_trending_tokens',
|
|
891
|
+
fomo: 'get_fomo_alerts',
|
|
865
892
|
gmgn: 'get_gmgn_kol_trades',
|
|
866
893
|
nansen: 'get_nansen_perp_screener',
|
|
867
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 =
|