@raintree-technology/perps 0.1.0
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 +33 -0
- package/LICENSE +21 -0
- package/README.md +175 -0
- package/dist/adapters/aevo.d.ts +64 -0
- package/dist/adapters/aevo.js +899 -0
- package/dist/adapters/certification.d.ts +33 -0
- package/dist/adapters/certification.js +99 -0
- package/dist/adapters/decibel/order-manager.d.ts +45 -0
- package/dist/adapters/decibel/order-manager.js +140 -0
- package/dist/adapters/decibel/rest-client.d.ts +176 -0
- package/dist/adapters/decibel/rest-client.js +155 -0
- package/dist/adapters/decibel/ws-feed.d.ts +28 -0
- package/dist/adapters/decibel/ws-feed.js +166 -0
- package/dist/adapters/decibel.d.ts +108 -0
- package/dist/adapters/decibel.js +1377 -0
- package/dist/adapters/hyperliquid.d.ts +63 -0
- package/dist/adapters/hyperliquid.js +797 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/interface.d.ts +310 -0
- package/dist/adapters/interface.js +15 -0
- package/dist/adapters/orderly.d.ts +70 -0
- package/dist/adapters/orderly.js +936 -0
- package/dist/adapters/paradex.d.ts +69 -0
- package/dist/adapters/paradex.js +862 -0
- package/dist/adapters/utils.d.ts +17 -0
- package/dist/adapters/utils.js +122 -0
- package/dist/cli/command-metadata.d.ts +2 -0
- package/dist/cli/command-metadata.js +44 -0
- package/dist/cli/context.d.ts +14 -0
- package/dist/cli/context.js +59 -0
- package/dist/cli/experience.d.ts +48 -0
- package/dist/cli/experience.js +243 -0
- package/dist/cli/ink/app/AppShell.d.ts +12 -0
- package/dist/cli/ink/app/AppShell.js +32 -0
- package/dist/cli/ink/app/MetricStrip.d.ts +6 -0
- package/dist/cli/ink/app/MetricStrip.js +14 -0
- package/dist/cli/ink/app/Panel.d.ts +9 -0
- package/dist/cli/ink/app/Panel.js +7 -0
- package/dist/cli/ink/app/ascii.d.ts +2 -0
- package/dist/cli/ink/app/ascii.js +46 -0
- package/dist/cli/ink/app/index.d.ts +5 -0
- package/dist/cli/ink/app/index.js +4 -0
- package/dist/cli/ink/app/types.d.ts +15 -0
- package/dist/cli/ink/app/types.js +1 -0
- package/dist/cli/ink/components/PnL.d.ts +12 -0
- package/dist/cli/ink/components/PnL.js +23 -0
- package/dist/cli/ink/components/Spinner.d.ts +13 -0
- package/dist/cli/ink/components/Spinner.js +13 -0
- package/dist/cli/ink/components/Table.d.ts +14 -0
- package/dist/cli/ink/components/Table.js +42 -0
- package/dist/cli/ink/components/WatchHeader.d.ts +10 -0
- package/dist/cli/ink/components/WatchHeader.js +18 -0
- package/dist/cli/ink/components/index.d.ts +4 -0
- package/dist/cli/ink/components/index.js +4 -0
- package/dist/cli/ink/index.d.ts +4 -0
- package/dist/cli/ink/index.js +4 -0
- package/dist/cli/ink/render.d.ts +12 -0
- package/dist/cli/ink/render.js +21 -0
- package/dist/cli/ink/theme.d.ts +29 -0
- package/dist/cli/ink/theme.js +40 -0
- package/dist/cli/network-defaults.d.ts +10 -0
- package/dist/cli/network-defaults.js +35 -0
- package/dist/cli/output.d.ts +11 -0
- package/dist/cli/output.js +115 -0
- package/dist/cli/program.d.ts +18 -0
- package/dist/cli/program.js +164 -0
- package/dist/cli/watch.d.ts +19 -0
- package/dist/cli/watch.js +35 -0
- package/dist/client/index.d.ts +55 -0
- package/dist/client/index.js +157 -0
- package/dist/commands/account/add.d.ts +2 -0
- package/dist/commands/account/add.js +510 -0
- package/dist/commands/account/balances-simple.d.ts +5 -0
- package/dist/commands/account/balances-simple.js +63 -0
- package/dist/commands/account/index.d.ts +2 -0
- package/dist/commands/account/index.js +17 -0
- package/dist/commands/account/ls.d.ts +2 -0
- package/dist/commands/account/ls.js +95 -0
- package/dist/commands/account/positions-simple.d.ts +5 -0
- package/dist/commands/account/positions-simple.js +77 -0
- package/dist/commands/account/remove.d.ts +2 -0
- package/dist/commands/account/remove.js +47 -0
- package/dist/commands/account/set-default.d.ts +2 -0
- package/dist/commands/account/set-default.js +47 -0
- package/dist/commands/agent/index.d.ts +2 -0
- package/dist/commands/agent/index.js +126 -0
- package/dist/commands/arb/alert.d.ts +6 -0
- package/dist/commands/arb/alert.js +88 -0
- package/dist/commands/arb/basis-execute.d.ts +6 -0
- package/dist/commands/arb/basis-execute.js +332 -0
- package/dist/commands/arb/basis.d.ts +6 -0
- package/dist/commands/arb/basis.js +181 -0
- package/dist/commands/arb/compare.d.ts +6 -0
- package/dist/commands/arb/compare.js +216 -0
- package/dist/commands/arb/execute.d.ts +6 -0
- package/dist/commands/arb/execute.js +467 -0
- package/dist/commands/arb/funding.d.ts +6 -0
- package/dist/commands/arb/funding.js +201 -0
- package/dist/commands/arb/history.d.ts +6 -0
- package/dist/commands/arb/history.js +153 -0
- package/dist/commands/arb/index.d.ts +6 -0
- package/dist/commands/arb/index.js +29 -0
- package/dist/commands/arb/positions.d.ts +6 -0
- package/dist/commands/arb/positions.js +158 -0
- package/dist/commands/arb/spread.d.ts +6 -0
- package/dist/commands/arb/spread.js +253 -0
- package/dist/commands/arb/track.d.ts +6 -0
- package/dist/commands/arb/track.js +259 -0
- package/dist/commands/asset/book-simple.d.ts +5 -0
- package/dist/commands/asset/book-simple.js +77 -0
- package/dist/commands/asset/index.d.ts +2 -0
- package/dist/commands/asset/index.js +5 -0
- package/dist/commands/completion.d.ts +2 -0
- package/dist/commands/completion.js +161 -0
- package/dist/commands/config/index.d.ts +5 -0
- package/dist/commands/config/index.js +109 -0
- package/dist/commands/data/index.d.ts +31 -0
- package/dist/commands/data/index.js +1466 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +201 -0
- package/dist/commands/exchange/index.d.ts +2 -0
- package/dist/commands/exchange/index.js +107 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.js +48 -0
- package/dist/commands/markets/index.d.ts +2 -0
- package/dist/commands/markets/index.js +5 -0
- package/dist/commands/markets/ls-simple.d.ts +7 -0
- package/dist/commands/markets/ls-simple.js +277 -0
- package/dist/commands/operator/index.d.ts +2 -0
- package/dist/commands/operator/index.js +146 -0
- package/dist/commands/order/cancel-simple.d.ts +5 -0
- package/dist/commands/order/cancel-simple.js +104 -0
- package/dist/commands/order/index.d.ts +2 -0
- package/dist/commands/order/index.js +13 -0
- package/dist/commands/order/limit-simple.d.ts +5 -0
- package/dist/commands/order/limit-simple.js +195 -0
- package/dist/commands/order/market-simple.d.ts +5 -0
- package/dist/commands/order/market-simple.js +190 -0
- package/dist/commands/order/shared.d.ts +17 -0
- package/dist/commands/order/shared.js +51 -0
- package/dist/commands/order/trigger-simple.d.ts +5 -0
- package/dist/commands/order/trigger-simple.js +246 -0
- package/dist/commands/referral/index.d.ts +2 -0
- package/dist/commands/referral/index.js +7 -0
- package/dist/commands/referral/set.d.ts +2 -0
- package/dist/commands/referral/set.js +26 -0
- package/dist/commands/referral/status.d.ts +2 -0
- package/dist/commands/referral/status.js +31 -0
- package/dist/commands/replay/index.d.ts +2 -0
- package/dist/commands/replay/index.js +152 -0
- package/dist/commands/risk/analytics.d.ts +2 -0
- package/dist/commands/risk/analytics.js +64 -0
- package/dist/commands/risk/audit.d.ts +2 -0
- package/dist/commands/risk/audit.js +52 -0
- package/dist/commands/risk/index.d.ts +2 -0
- package/dist/commands/risk/index.js +9 -0
- package/dist/commands/risk/rules.d.ts +2 -0
- package/dist/commands/risk/rules.js +102 -0
- package/dist/commands/server.d.ts +2 -0
- package/dist/commands/server.js +208 -0
- package/dist/commands/setup/index.d.ts +2 -0
- package/dist/commands/setup/index.js +478 -0
- package/dist/commands/signal/index.d.ts +2 -0
- package/dist/commands/signal/index.js +129 -0
- package/dist/commands/state/index.d.ts +2 -0
- package/dist/commands/state/index.js +5 -0
- package/dist/commands/state/show.d.ts +2 -0
- package/dist/commands/state/show.js +105 -0
- package/dist/commands/strategy/index.d.ts +4 -0
- package/dist/commands/strategy/index.js +73 -0
- package/dist/commands/traces/index.d.ts +2 -0
- package/dist/commands/traces/index.js +76 -0
- package/dist/commands/ui/demo.d.ts +9 -0
- package/dist/commands/ui/demo.js +195 -0
- package/dist/commands/ui/index.d.ts +2 -0
- package/dist/commands/ui/index.js +7 -0
- package/dist/commands/ui/terminal.d.ts +2 -0
- package/dist/commands/ui/terminal.js +255 -0
- package/dist/commands/upgrade.d.ts +2 -0
- package/dist/commands/upgrade.js +98 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/dist/lib/agent/audit.d.ts +12 -0
- package/dist/lib/agent/audit.js +13 -0
- package/dist/lib/agent/gateway.d.ts +13 -0
- package/dist/lib/agent/gateway.js +598 -0
- package/dist/lib/agent/metrics.d.ts +33 -0
- package/dist/lib/agent/metrics.js +175 -0
- package/dist/lib/agent/signature.d.ts +8 -0
- package/dist/lib/agent/signature.js +28 -0
- package/dist/lib/agent/tools.d.ts +28 -0
- package/dist/lib/agent/tools.js +453 -0
- package/dist/lib/agent/x402.d.ts +23 -0
- package/dist/lib/agent/x402.js +62 -0
- package/dist/lib/api-wallet.d.ts +69 -0
- package/dist/lib/api-wallet.js +101 -0
- package/dist/lib/balance-watcher.d.ts +25 -0
- package/dist/lib/balance-watcher.js +83 -0
- package/dist/lib/book-watcher.d.ts +25 -0
- package/dist/lib/book-watcher.js +48 -0
- package/dist/lib/config.d.ts +88 -0
- package/dist/lib/config.js +427 -0
- package/dist/lib/constants.d.ts +50 -0
- package/dist/lib/constants.js +84 -0
- package/dist/lib/contracts.d.ts +7 -0
- package/dist/lib/contracts.js +8 -0
- package/dist/lib/credential-vault.d.ts +22 -0
- package/dist/lib/credential-vault.js +109 -0
- package/dist/lib/db/accounts.d.ts +83 -0
- package/dist/lib/db/accounts.js +203 -0
- package/dist/lib/db/funding-history.d.ts +69 -0
- package/dist/lib/db/funding-history.js +183 -0
- package/dist/lib/db/index.d.ts +11 -0
- package/dist/lib/db/index.js +272 -0
- package/dist/lib/events/bus.d.ts +10 -0
- package/dist/lib/events/bus.js +17 -0
- package/dist/lib/events/types.d.ts +51 -0
- package/dist/lib/events/types.js +1 -0
- package/dist/lib/exchange.d.ts +30 -0
- package/dist/lib/exchange.js +84 -0
- package/dist/lib/execution/journal.d.ts +25 -0
- package/dist/lib/execution/journal.js +158 -0
- package/dist/lib/execution/safety.d.ts +34 -0
- package/dist/lib/execution/safety.js +197 -0
- package/dist/lib/exit-codes.d.ts +18 -0
- package/dist/lib/exit-codes.js +60 -0
- package/dist/lib/fetch.d.ts +18 -0
- package/dist/lib/fetch.js +66 -0
- package/dist/lib/fs-security.d.ts +10 -0
- package/dist/lib/fs-security.js +26 -0
- package/dist/lib/funding-tracker.d.ts +40 -0
- package/dist/lib/funding-tracker.js +118 -0
- package/dist/lib/logger.d.ts +27 -0
- package/dist/lib/logger.js +82 -0
- package/dist/lib/network-model.d.ts +13 -0
- package/dist/lib/network-model.js +30 -0
- package/dist/lib/onboarding.d.ts +133 -0
- package/dist/lib/onboarding.js +1459 -0
- package/dist/lib/operator-state.d.ts +25 -0
- package/dist/lib/operator-state.js +82 -0
- package/dist/lib/orders-watcher.d.ts +24 -0
- package/dist/lib/orders-watcher.js +74 -0
- package/dist/lib/paths.d.ts +20 -0
- package/dist/lib/paths.js +23 -0
- package/dist/lib/portfolio-watcher.d.ts +33 -0
- package/dist/lib/portfolio-watcher.js +95 -0
- package/dist/lib/position-watcher.d.ts +16 -0
- package/dist/lib/position-watcher.js +44 -0
- package/dist/lib/price-watcher.d.ts +15 -0
- package/dist/lib/price-watcher.js +84 -0
- package/dist/lib/prompts.d.ts +32 -0
- package/dist/lib/prompts.js +105 -0
- package/dist/lib/rate-limit.d.ts +32 -0
- package/dist/lib/rate-limit.js +88 -0
- package/dist/lib/risk/analytics.d.ts +39 -0
- package/dist/lib/risk/analytics.js +98 -0
- package/dist/lib/risk/drawdown.d.ts +18 -0
- package/dist/lib/risk/drawdown.js +49 -0
- package/dist/lib/risk/evaluation-log.d.ts +29 -0
- package/dist/lib/risk/evaluation-log.js +61 -0
- package/dist/lib/risk/index.d.ts +4 -0
- package/dist/lib/risk/index.js +4 -0
- package/dist/lib/risk/limits.d.ts +23 -0
- package/dist/lib/risk/limits.js +27 -0
- package/dist/lib/risk/manager.d.ts +32 -0
- package/dist/lib/risk/manager.js +85 -0
- package/dist/lib/risk/policy-middleware.d.ts +33 -0
- package/dist/lib/risk/policy-middleware.js +267 -0
- package/dist/lib/risk/position-sizer.d.ts +9 -0
- package/dist/lib/risk/position-sizer.js +14 -0
- package/dist/lib/risk/rules-store.d.ts +16 -0
- package/dist/lib/risk/rules-store.js +47 -0
- package/dist/lib/schema.d.ts +254 -0
- package/dist/lib/schema.js +199 -0
- package/dist/lib/secrets.d.ts +3 -0
- package/dist/lib/secrets.js +62 -0
- package/dist/lib/settings.d.ts +24 -0
- package/dist/lib/settings.js +86 -0
- package/dist/lib/signals.d.ts +73 -0
- package/dist/lib/signals.js +136 -0
- package/dist/lib/stable-stringify.d.ts +6 -0
- package/dist/lib/stable-stringify.js +17 -0
- package/dist/lib/state-context.d.ts +44 -0
- package/dist/lib/state-context.js +133 -0
- package/dist/lib/strategy/basis-trade.d.ts +2 -0
- package/dist/lib/strategy/basis-trade.js +24 -0
- package/dist/lib/strategy/funding-arb.d.ts +2 -0
- package/dist/lib/strategy/funding-arb.js +23 -0
- package/dist/lib/strategy/interface.d.ts +23 -0
- package/dist/lib/strategy/interface.js +1 -0
- package/dist/lib/strategy/registry.d.ts +4 -0
- package/dist/lib/strategy/registry.js +10 -0
- package/dist/lib/telemetry.d.ts +25 -0
- package/dist/lib/telemetry.js +101 -0
- package/dist/lib/trace-queries.d.ts +20 -0
- package/dist/lib/trace-queries.js +133 -0
- package/dist/lib/trace.d.ts +1 -0
- package/dist/lib/trace.js +4 -0
- package/dist/lib/trade-reputation.d.ts +6 -0
- package/dist/lib/trade-reputation.js +99 -0
- package/dist/lib/ui-tokens.d.ts +21 -0
- package/dist/lib/ui-tokens.js +26 -0
- package/dist/lib/validate.d.ts +39 -0
- package/dist/lib/validate.js +108 -0
- package/dist/lib/validation.d.ts +9 -0
- package/dist/lib/validation.js +64 -0
- package/dist/server/cache.d.ts +38 -0
- package/dist/server/cache.js +56 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +89 -0
- package/dist/server/ipc.d.ts +18 -0
- package/dist/server/ipc.js +159 -0
- package/dist/server/subscriptions.d.ts +18 -0
- package/dist/server/subscriptions.js +114 -0
- package/package.json +124 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { AGENT_METRICS_PATH } from "../paths.js";
|
|
4
|
+
import { ensurePrivateDir, hardenPrivateFile, PRIVATE_FILE_MODE } from "../fs-security.js";
|
|
5
|
+
const METRICS_SCHEMA_VERSION = 1;
|
|
6
|
+
let startedAt = Date.now();
|
|
7
|
+
const routes = new Map();
|
|
8
|
+
const exchanges = new Map();
|
|
9
|
+
function metricsPersistenceEnabled() {
|
|
10
|
+
if (process.env.PERPS_DISABLE_AGENT_METRICS_PERSISTENCE === "1") {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (process.env.VITEST) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
function createRouteMetrics() {
|
|
19
|
+
return {
|
|
20
|
+
total: 0,
|
|
21
|
+
success: 0,
|
|
22
|
+
failure: 0,
|
|
23
|
+
latencyMsTotal: 0,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function normalizeMetricKey(value, fallback) {
|
|
27
|
+
const trimmed = value?.trim().toLowerCase();
|
|
28
|
+
if (!trimmed) {
|
|
29
|
+
return fallback;
|
|
30
|
+
}
|
|
31
|
+
return trimmed;
|
|
32
|
+
}
|
|
33
|
+
function entryFor(target, key) {
|
|
34
|
+
const existing = target.get(key);
|
|
35
|
+
if (existing) {
|
|
36
|
+
return existing;
|
|
37
|
+
}
|
|
38
|
+
const created = createRouteMetrics();
|
|
39
|
+
target.set(key, created);
|
|
40
|
+
return created;
|
|
41
|
+
}
|
|
42
|
+
function mapToRecord(target) {
|
|
43
|
+
const result = {};
|
|
44
|
+
for (const [key, value] of target.entries()) {
|
|
45
|
+
result[key] = {
|
|
46
|
+
total: value.total,
|
|
47
|
+
success: value.success,
|
|
48
|
+
failure: value.failure,
|
|
49
|
+
latencyMsTotal: value.latencyMsTotal,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
function writeMetricsSnapshot() {
|
|
55
|
+
if (!metricsPersistenceEnabled()) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
ensurePrivateDir(dirname(AGENT_METRICS_PATH));
|
|
59
|
+
const snapshot = {
|
|
60
|
+
version: METRICS_SCHEMA_VERSION,
|
|
61
|
+
startedAt,
|
|
62
|
+
updatedAt: Date.now(),
|
|
63
|
+
routes: mapToRecord(routes),
|
|
64
|
+
exchanges: mapToRecord(exchanges),
|
|
65
|
+
};
|
|
66
|
+
writeFileSync(AGENT_METRICS_PATH, `${JSON.stringify(snapshot, null, 2)}\n`, {
|
|
67
|
+
mode: PRIVATE_FILE_MODE,
|
|
68
|
+
});
|
|
69
|
+
hardenPrivateFile(AGENT_METRICS_PATH);
|
|
70
|
+
}
|
|
71
|
+
function hydrateMetricsSnapshot() {
|
|
72
|
+
if (!metricsPersistenceEnabled() || !existsSync(AGENT_METRICS_PATH)) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const raw = readFileSync(AGENT_METRICS_PATH, "utf8");
|
|
77
|
+
const parsed = JSON.parse(raw);
|
|
78
|
+
const parsedStartedAt = typeof parsed.startedAt === "number" ? parsed.startedAt : Date.now();
|
|
79
|
+
startedAt = parsedStartedAt;
|
|
80
|
+
routes.clear();
|
|
81
|
+
exchanges.clear();
|
|
82
|
+
for (const [route, metric] of Object.entries(parsed.routes ?? {})) {
|
|
83
|
+
const key = normalizeMetricKey(route, "unknown");
|
|
84
|
+
routes.set(key, {
|
|
85
|
+
total: Number.isFinite(metric.total) ? metric.total : 0,
|
|
86
|
+
success: Number.isFinite(metric.success) ? metric.success : 0,
|
|
87
|
+
failure: Number.isFinite(metric.failure) ? metric.failure : 0,
|
|
88
|
+
latencyMsTotal: Number.isFinite(metric.latencyMsTotal) ? metric.latencyMsTotal : 0,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
for (const [exchange, metric] of Object.entries(parsed.exchanges ?? {})) {
|
|
92
|
+
const key = normalizeMetricKey(exchange, "unknown");
|
|
93
|
+
exchanges.set(key, {
|
|
94
|
+
total: Number.isFinite(metric.total) ? metric.total : 0,
|
|
95
|
+
success: Number.isFinite(metric.success) ? metric.success : 0,
|
|
96
|
+
failure: Number.isFinite(metric.failure) ? metric.failure : 0,
|
|
97
|
+
latencyMsTotal: Number.isFinite(metric.latencyMsTotal) ? metric.latencyMsTotal : 0,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
startedAt = Date.now();
|
|
103
|
+
routes.clear();
|
|
104
|
+
exchanges.clear();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
hydrateMetricsSnapshot();
|
|
108
|
+
function updateMetric(target, key, ok, latencyMs) {
|
|
109
|
+
const entry = entryFor(target, key);
|
|
110
|
+
entry.total += 1;
|
|
111
|
+
entry.latencyMsTotal += Math.max(0, latencyMs);
|
|
112
|
+
if (ok) {
|
|
113
|
+
entry.success += 1;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
entry.failure += 1;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export function resetAgentMetrics() {
|
|
120
|
+
startedAt = Date.now();
|
|
121
|
+
routes.clear();
|
|
122
|
+
exchanges.clear();
|
|
123
|
+
writeMetricsSnapshot();
|
|
124
|
+
}
|
|
125
|
+
export function recordAgentRouteMetrics(route, ok, latencyMs, exchange) {
|
|
126
|
+
const routeKey = normalizeMetricKey(route, "unknown");
|
|
127
|
+
const exchangeKey = normalizeMetricKey(exchange, "system");
|
|
128
|
+
updateMetric(routes, routeKey, ok, latencyMs);
|
|
129
|
+
updateMetric(exchanges, exchangeKey, ok, latencyMs);
|
|
130
|
+
writeMetricsSnapshot();
|
|
131
|
+
}
|
|
132
|
+
export function getAgentMetricsSnapshot() {
|
|
133
|
+
return {
|
|
134
|
+
startedAt,
|
|
135
|
+
routes: mapToRecord(routes),
|
|
136
|
+
exchanges: mapToRecord(exchanges),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export function getAgentReputationSummary() {
|
|
140
|
+
let totalRequests = 0;
|
|
141
|
+
let totalSuccess = 0;
|
|
142
|
+
const routeRows = [];
|
|
143
|
+
const exchangeRows = [];
|
|
144
|
+
for (const [route, metric] of routes.entries()) {
|
|
145
|
+
totalRequests += metric.total;
|
|
146
|
+
totalSuccess += metric.success;
|
|
147
|
+
const avgLatencyMs = metric.total > 0 ? metric.latencyMsTotal / metric.total : 0;
|
|
148
|
+
routeRows.push({
|
|
149
|
+
route,
|
|
150
|
+
total: metric.total,
|
|
151
|
+
successRate: metric.total > 0 ? metric.success / metric.total : 0,
|
|
152
|
+
// We do not capture distributions yet; use avg as a conservative estimate.
|
|
153
|
+
p50LatencyEstimateMs: avgLatencyMs,
|
|
154
|
+
avgLatencyMs,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
for (const [exchange, metric] of exchanges.entries()) {
|
|
158
|
+
const avgLatencyMs = metric.total > 0 ? metric.latencyMsTotal / metric.total : 0;
|
|
159
|
+
exchangeRows.push({
|
|
160
|
+
exchange,
|
|
161
|
+
total: metric.total,
|
|
162
|
+
successRate: metric.total > 0 ? metric.success / metric.total : 0,
|
|
163
|
+
avgLatencyMs,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
routeRows.sort((a, b) => a.route.localeCompare(b.route));
|
|
167
|
+
exchangeRows.sort((a, b) => a.exchange.localeCompare(b.exchange));
|
|
168
|
+
return {
|
|
169
|
+
uptimeMs: Date.now() - startedAt,
|
|
170
|
+
successRate: totalRequests > 0 ? totalSuccess / totalRequests : 1,
|
|
171
|
+
totalRequests,
|
|
172
|
+
routes: routeRows,
|
|
173
|
+
exchanges: exchangeRows,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface AgentSignature {
|
|
2
|
+
signer: string;
|
|
3
|
+
requestHash: string;
|
|
4
|
+
resultHash: string;
|
|
5
|
+
signature: string;
|
|
6
|
+
algorithm: "sha256" | "hmac-sha256";
|
|
7
|
+
}
|
|
8
|
+
export declare function signAgentResponse(requestPayload: unknown, responsePayload: unknown): AgentSignature;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createHash, createHmac } from "node:crypto";
|
|
2
|
+
import { hostname } from "node:os";
|
|
3
|
+
import { stableStringify } from "../stable-stringify.js";
|
|
4
|
+
function hash(value) {
|
|
5
|
+
return createHash("sha256").update(stableStringify(value)).digest("hex");
|
|
6
|
+
}
|
|
7
|
+
export function signAgentResponse(requestPayload, responsePayload) {
|
|
8
|
+
const requestHash = hash(requestPayload);
|
|
9
|
+
const resultHash = hash(responsePayload);
|
|
10
|
+
const message = `${requestHash}:${resultHash}`;
|
|
11
|
+
const secret = process.env.PERPS_AGENT_SIGNING_SECRET?.trim();
|
|
12
|
+
if (secret) {
|
|
13
|
+
return {
|
|
14
|
+
signer: `local:${hostname()}`,
|
|
15
|
+
requestHash,
|
|
16
|
+
resultHash,
|
|
17
|
+
signature: createHmac("sha256", secret).update(message).digest("hex"),
|
|
18
|
+
algorithm: "hmac-sha256",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
signer: `local:${hostname()}`,
|
|
23
|
+
requestHash,
|
|
24
|
+
resultHash,
|
|
25
|
+
signature: createHash("sha256").update(message).digest("hex"),
|
|
26
|
+
algorithm: "sha256",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ToolExample {
|
|
2
|
+
description: string;
|
|
3
|
+
input: Record<string, unknown>;
|
|
4
|
+
output: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface ToolDefinition {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: "object";
|
|
11
|
+
properties: Record<string, {
|
|
12
|
+
type: string;
|
|
13
|
+
description: string;
|
|
14
|
+
enum?: string[];
|
|
15
|
+
default?: unknown;
|
|
16
|
+
}>;
|
|
17
|
+
required?: string[];
|
|
18
|
+
};
|
|
19
|
+
outputSchema?: {
|
|
20
|
+
type: string;
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
riskLevel: "read-only" | "mutating" | "destructive";
|
|
24
|
+
requiresAuth: boolean;
|
|
25
|
+
examples: ToolExample[];
|
|
26
|
+
}
|
|
27
|
+
export declare function getToolDefinitions(): ToolDefinition[];
|
|
28
|
+
export declare function getToolByName(name: string): ToolDefinition | undefined;
|
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
const TOOL_DEFINITIONS = [
|
|
2
|
+
{
|
|
3
|
+
name: "context",
|
|
4
|
+
description: "Get current portfolio state context including equity, positions, exposure, and risk limits",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
exchange: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "Exchange to query (defaults to configured exchange)",
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
outputSchema: {
|
|
15
|
+
type: "object",
|
|
16
|
+
description: "Portfolio state context blob",
|
|
17
|
+
},
|
|
18
|
+
riskLevel: "read-only",
|
|
19
|
+
requiresAuth: true,
|
|
20
|
+
examples: [
|
|
21
|
+
{
|
|
22
|
+
description: "Get current portfolio context",
|
|
23
|
+
input: {},
|
|
24
|
+
output: {
|
|
25
|
+
exchange: "hyperliquid",
|
|
26
|
+
equity: 12450.32,
|
|
27
|
+
availableBalance: 8200.1,
|
|
28
|
+
totalExposureUsd: 4250.22,
|
|
29
|
+
positions: [
|
|
30
|
+
{
|
|
31
|
+
market: "BTC-PERP",
|
|
32
|
+
side: "long",
|
|
33
|
+
size: "0.05",
|
|
34
|
+
entryPrice: "67200.00",
|
|
35
|
+
unrealizedPnl: 85.0,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
riskLimits: {
|
|
39
|
+
maxPositionSizeUsd: 10000,
|
|
40
|
+
maxTotalExposureUsd: 50000,
|
|
41
|
+
maxLeverage: 5,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "quote",
|
|
49
|
+
description: "Get a price quote for a proposed trade including reference price, spread, and notional value",
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: "object",
|
|
52
|
+
properties: {
|
|
53
|
+
market: {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "Market symbol (e.g. BTC-PERP)",
|
|
56
|
+
},
|
|
57
|
+
side: {
|
|
58
|
+
type: "string",
|
|
59
|
+
description: "Trade direction",
|
|
60
|
+
enum: ["long", "short"],
|
|
61
|
+
},
|
|
62
|
+
size: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Trade size in base asset units",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
required: ["market", "side", "size"],
|
|
68
|
+
},
|
|
69
|
+
outputSchema: {
|
|
70
|
+
type: "object",
|
|
71
|
+
description: "Price quote with reference price, notional, and spread",
|
|
72
|
+
},
|
|
73
|
+
riskLevel: "read-only",
|
|
74
|
+
requiresAuth: false,
|
|
75
|
+
examples: [
|
|
76
|
+
{
|
|
77
|
+
description: "Quote for 0.1 BTC-PERP long",
|
|
78
|
+
input: { market: "BTC-PERP", side: "long", size: "0.1" },
|
|
79
|
+
output: {
|
|
80
|
+
status: "ok",
|
|
81
|
+
market: "BTC-PERP",
|
|
82
|
+
side: "long",
|
|
83
|
+
size: 0.1,
|
|
84
|
+
quote: {
|
|
85
|
+
referencePrice: 67250.5,
|
|
86
|
+
notionalUsd: 6725.05,
|
|
87
|
+
spread: 1.5,
|
|
88
|
+
bid: 67249.75,
|
|
89
|
+
ask: 67251.25,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: "execute",
|
|
97
|
+
description: "Execute a trade with risk policy evaluation, idempotency protection, and execution journaling",
|
|
98
|
+
inputSchema: {
|
|
99
|
+
type: "object",
|
|
100
|
+
properties: {
|
|
101
|
+
market: {
|
|
102
|
+
type: "string",
|
|
103
|
+
description: "Market symbol (e.g. BTC-PERP)",
|
|
104
|
+
},
|
|
105
|
+
side: {
|
|
106
|
+
type: "string",
|
|
107
|
+
description: "Trade direction",
|
|
108
|
+
enum: ["long", "short"],
|
|
109
|
+
},
|
|
110
|
+
size: {
|
|
111
|
+
type: "string",
|
|
112
|
+
description: "Trade size in base asset units",
|
|
113
|
+
},
|
|
114
|
+
confidence: {
|
|
115
|
+
type: "number",
|
|
116
|
+
description: "Signal confidence score for risk sizing",
|
|
117
|
+
default: 0.5,
|
|
118
|
+
},
|
|
119
|
+
reduceOnly: {
|
|
120
|
+
type: "boolean",
|
|
121
|
+
description: "Whether the order should only reduce an existing position",
|
|
122
|
+
},
|
|
123
|
+
idempotencyKey: {
|
|
124
|
+
type: "string",
|
|
125
|
+
description: "Unique key to prevent duplicate execution",
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
required: ["market", "side", "size"],
|
|
129
|
+
},
|
|
130
|
+
outputSchema: {
|
|
131
|
+
type: "object",
|
|
132
|
+
description: "Execution result with order details and risk metadata",
|
|
133
|
+
},
|
|
134
|
+
riskLevel: "mutating",
|
|
135
|
+
requiresAuth: true,
|
|
136
|
+
examples: [
|
|
137
|
+
{
|
|
138
|
+
description: "Buy 0.1 BTC-PERP",
|
|
139
|
+
input: {
|
|
140
|
+
market: "BTC-PERP",
|
|
141
|
+
side: "long",
|
|
142
|
+
size: "0.1",
|
|
143
|
+
confidence: 0.8,
|
|
144
|
+
idempotencyKey: "agent-btc-001",
|
|
145
|
+
},
|
|
146
|
+
output: {
|
|
147
|
+
status: "executed",
|
|
148
|
+
market: "BTC-PERP",
|
|
149
|
+
idempotency: {
|
|
150
|
+
key: "agent-btc-001",
|
|
151
|
+
replayed: false,
|
|
152
|
+
},
|
|
153
|
+
result: {
|
|
154
|
+
order: {
|
|
155
|
+
orderId: "abc123",
|
|
156
|
+
fillPrice: "67250.50",
|
|
157
|
+
filledSize: "0.1",
|
|
158
|
+
status: "filled",
|
|
159
|
+
},
|
|
160
|
+
risk: {
|
|
161
|
+
requestedSize: 0.1,
|
|
162
|
+
adjustedSize: 0.1,
|
|
163
|
+
adjustedNotionalUsd: 6725.05,
|
|
164
|
+
referencePrice: 67250.5,
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: "positions",
|
|
173
|
+
description: "Get current open positions with entry prices, unrealized PnL, and liquidation levels",
|
|
174
|
+
inputSchema: {
|
|
175
|
+
type: "object",
|
|
176
|
+
properties: {
|
|
177
|
+
exchange: {
|
|
178
|
+
type: "string",
|
|
179
|
+
description: "Exchange to query (defaults to configured exchange)",
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
outputSchema: {
|
|
184
|
+
type: "object",
|
|
185
|
+
description: "Array of current position objects",
|
|
186
|
+
},
|
|
187
|
+
riskLevel: "read-only",
|
|
188
|
+
requiresAuth: true,
|
|
189
|
+
examples: [
|
|
190
|
+
{
|
|
191
|
+
description: "Get all open positions",
|
|
192
|
+
input: {},
|
|
193
|
+
output: {
|
|
194
|
+
positions: [
|
|
195
|
+
{
|
|
196
|
+
market: "BTC-PERP",
|
|
197
|
+
side: "long",
|
|
198
|
+
size: "0.05",
|
|
199
|
+
entryPrice: "67200.00",
|
|
200
|
+
markPrice: "67850.00",
|
|
201
|
+
unrealizedPnl: 32.5,
|
|
202
|
+
liquidationPrice: "58400.00",
|
|
203
|
+
leverage: 3.2,
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
market: "ETH-PERP",
|
|
207
|
+
side: "short",
|
|
208
|
+
size: "1.5",
|
|
209
|
+
entryPrice: "3520.00",
|
|
210
|
+
markPrice: "3480.00",
|
|
211
|
+
unrealizedPnl: 60.0,
|
|
212
|
+
liquidationPrice: "4100.00",
|
|
213
|
+
leverage: 2.1,
|
|
214
|
+
},
|
|
215
|
+
],
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
],
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
name: "balances",
|
|
222
|
+
description: "Get current account balances including total equity, available margin, and margin usage",
|
|
223
|
+
inputSchema: {
|
|
224
|
+
type: "object",
|
|
225
|
+
properties: {
|
|
226
|
+
exchange: {
|
|
227
|
+
type: "string",
|
|
228
|
+
description: "Exchange to query (defaults to configured exchange)",
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
outputSchema: {
|
|
233
|
+
type: "object",
|
|
234
|
+
description: "Account balance breakdown",
|
|
235
|
+
},
|
|
236
|
+
riskLevel: "read-only",
|
|
237
|
+
requiresAuth: true,
|
|
238
|
+
examples: [
|
|
239
|
+
{
|
|
240
|
+
description: "Get current balances",
|
|
241
|
+
input: {},
|
|
242
|
+
output: {
|
|
243
|
+
balances: [
|
|
244
|
+
{
|
|
245
|
+
asset: "USDC",
|
|
246
|
+
total: "12450.32",
|
|
247
|
+
available: "8200.10",
|
|
248
|
+
marginUsed: "4250.22",
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
name: "markets",
|
|
257
|
+
description: "List available perpetual markets with trading pairs and metadata",
|
|
258
|
+
inputSchema: {
|
|
259
|
+
type: "object",
|
|
260
|
+
properties: {
|
|
261
|
+
exchange: {
|
|
262
|
+
type: "string",
|
|
263
|
+
description: "Exchange to list markets for (defaults to all available)",
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
outputSchema: {
|
|
268
|
+
type: "object",
|
|
269
|
+
description: "Array of available market objects",
|
|
270
|
+
},
|
|
271
|
+
riskLevel: "read-only",
|
|
272
|
+
requiresAuth: false,
|
|
273
|
+
examples: [
|
|
274
|
+
{
|
|
275
|
+
description: "List all markets on hyperliquid",
|
|
276
|
+
input: { exchange: "hyperliquid" },
|
|
277
|
+
output: {
|
|
278
|
+
markets: [
|
|
279
|
+
{ symbol: "BTC-PERP", baseCurrency: "BTC", quoteCurrency: "USD" },
|
|
280
|
+
{ symbol: "ETH-PERP", baseCurrency: "ETH", quoteCurrency: "USD" },
|
|
281
|
+
{ symbol: "SOL-PERP", baseCurrency: "SOL", quoteCurrency: "USD" },
|
|
282
|
+
],
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
name: "arb_compare",
|
|
289
|
+
description: "Compare funding rates and basis spreads across exchanges to identify arbitrage opportunities",
|
|
290
|
+
inputSchema: {
|
|
291
|
+
type: "object",
|
|
292
|
+
properties: {
|
|
293
|
+
assets: {
|
|
294
|
+
type: "array",
|
|
295
|
+
description: "List of assets to compare (e.g. [\"BTC\", \"ETH\"]). Defaults to top markets.",
|
|
296
|
+
},
|
|
297
|
+
minSpread: {
|
|
298
|
+
type: "number",
|
|
299
|
+
description: "Minimum annualized funding spread to include in results",
|
|
300
|
+
default: 0.05,
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
outputSchema: {
|
|
305
|
+
type: "object",
|
|
306
|
+
description: "Cross-exchange funding rate comparison with spread calculations",
|
|
307
|
+
},
|
|
308
|
+
riskLevel: "read-only",
|
|
309
|
+
requiresAuth: false,
|
|
310
|
+
examples: [
|
|
311
|
+
{
|
|
312
|
+
description: "Compare BTC and ETH funding across exchanges",
|
|
313
|
+
input: { assets: ["BTC", "ETH"], minSpread: 0.03 },
|
|
314
|
+
output: {
|
|
315
|
+
comparisons: [
|
|
316
|
+
{
|
|
317
|
+
asset: "BTC",
|
|
318
|
+
rates: [
|
|
319
|
+
{ exchange: "hyperliquid", fundingRate: 0.0102, annualized: 0.0372 },
|
|
320
|
+
{ exchange: "vertex", fundingRate: 0.0085, annualized: 0.031 },
|
|
321
|
+
],
|
|
322
|
+
spread: 0.0062,
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
],
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
name: "risk_evaluate",
|
|
331
|
+
description: "Check if a proposed order passes all active risk policy rules without executing it",
|
|
332
|
+
inputSchema: {
|
|
333
|
+
type: "object",
|
|
334
|
+
properties: {
|
|
335
|
+
market: {
|
|
336
|
+
type: "string",
|
|
337
|
+
description: "Market symbol (e.g. BTC-PERP)",
|
|
338
|
+
},
|
|
339
|
+
side: {
|
|
340
|
+
type: "string",
|
|
341
|
+
description: "Trade direction",
|
|
342
|
+
enum: ["long", "short"],
|
|
343
|
+
},
|
|
344
|
+
sizeUsd: {
|
|
345
|
+
type: "number",
|
|
346
|
+
description: "Proposed position size in USD",
|
|
347
|
+
},
|
|
348
|
+
confidence: {
|
|
349
|
+
type: "number",
|
|
350
|
+
description: "Signal confidence for risk scaling",
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
required: ["market", "side", "sizeUsd"],
|
|
354
|
+
},
|
|
355
|
+
outputSchema: {
|
|
356
|
+
type: "object",
|
|
357
|
+
description: "Risk evaluation result with allowed/blocked status and reasoning",
|
|
358
|
+
},
|
|
359
|
+
riskLevel: "read-only",
|
|
360
|
+
requiresAuth: true,
|
|
361
|
+
examples: [
|
|
362
|
+
{
|
|
363
|
+
description: "Evaluate risk for a 5000 USD BTC long",
|
|
364
|
+
input: { market: "BTC-PERP", side: "long", sizeUsd: 5000, confidence: 0.75 },
|
|
365
|
+
output: {
|
|
366
|
+
allowed: true,
|
|
367
|
+
adjustedSizeUsd: 5000,
|
|
368
|
+
adjustedSizeBase: 0.0743,
|
|
369
|
+
referencePriceUsd: 67250.5,
|
|
370
|
+
reason: "within risk limits",
|
|
371
|
+
rulesEvaluated: 4,
|
|
372
|
+
rulesPassed: 4,
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
description: "Risk evaluation blocks oversized order",
|
|
377
|
+
input: { market: "BTC-PERP", side: "long", sizeUsd: 100000 },
|
|
378
|
+
output: {
|
|
379
|
+
allowed: false,
|
|
380
|
+
adjustedSizeUsd: 0,
|
|
381
|
+
adjustedSizeBase: 0,
|
|
382
|
+
referencePriceUsd: 67250.5,
|
|
383
|
+
reason: "exceeds maxPositionSizeUsd (10000)",
|
|
384
|
+
rulesEvaluated: 4,
|
|
385
|
+
rulesPassed: 2,
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
],
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
name: "risk_rules",
|
|
392
|
+
description: "List all active risk policy rules with their current thresholds and status",
|
|
393
|
+
inputSchema: {
|
|
394
|
+
type: "object",
|
|
395
|
+
properties: {},
|
|
396
|
+
},
|
|
397
|
+
outputSchema: {
|
|
398
|
+
type: "object",
|
|
399
|
+
description: "Array of active risk rule definitions",
|
|
400
|
+
},
|
|
401
|
+
riskLevel: "read-only",
|
|
402
|
+
requiresAuth: false,
|
|
403
|
+
examples: [
|
|
404
|
+
{
|
|
405
|
+
description: "List active risk rules",
|
|
406
|
+
input: {},
|
|
407
|
+
output: {
|
|
408
|
+
rules: [
|
|
409
|
+
{ name: "maxPositionSizeUsd", value: 10000, enabled: true },
|
|
410
|
+
{ name: "maxTotalExposureUsd", value: 50000, enabled: true },
|
|
411
|
+
{ name: "maxLeverage", value: 5, enabled: true },
|
|
412
|
+
{ name: "minSignalConfidence", value: 0.6, enabled: true },
|
|
413
|
+
{ name: "maxDrawdownPct", value: 10, enabled: true },
|
|
414
|
+
],
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
],
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
name: "operator_status",
|
|
421
|
+
description: "Get operator status including halt state, uptime, and system health indicators",
|
|
422
|
+
inputSchema: {
|
|
423
|
+
type: "object",
|
|
424
|
+
properties: {},
|
|
425
|
+
},
|
|
426
|
+
outputSchema: {
|
|
427
|
+
type: "object",
|
|
428
|
+
description: "Operator status and halt information",
|
|
429
|
+
},
|
|
430
|
+
riskLevel: "read-only",
|
|
431
|
+
requiresAuth: false,
|
|
432
|
+
examples: [
|
|
433
|
+
{
|
|
434
|
+
description: "Check operator status",
|
|
435
|
+
input: {},
|
|
436
|
+
output: {
|
|
437
|
+
status: "running",
|
|
438
|
+
halted: false,
|
|
439
|
+
uptimeMs: 3600000,
|
|
440
|
+
defaultExchange: "hyperliquid",
|
|
441
|
+
defaultTestnet: true,
|
|
442
|
+
allowMainnetExecution: false,
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
],
|
|
446
|
+
},
|
|
447
|
+
];
|
|
448
|
+
export function getToolDefinitions() {
|
|
449
|
+
return TOOL_DEFINITIONS;
|
|
450
|
+
}
|
|
451
|
+
export function getToolByName(name) {
|
|
452
|
+
return TOOL_DEFINITIONS.find((t) => t.name === name);
|
|
453
|
+
}
|