@senpi/runtime 3.0.187 → 3.0.191
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/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +6 -0
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/cli/senpi-commands.d.ts.map +1 -1
- package/dist/cli/senpi-commands.js +4 -2
- package/dist/cli/senpi-commands.js.map +1 -1
- package/dist/deploy/box-cap.d.ts +7 -0
- package/dist/deploy/box-cap.d.ts.map +1 -0
- package/dist/deploy/box-cap.js +13 -0
- package/dist/deploy/box-cap.js.map +1 -0
- package/dist/deploy/funding.d.ts +13 -1
- package/dist/deploy/funding.d.ts.map +1 -1
- package/dist/deploy/funding.js +13 -4
- package/dist/deploy/funding.js.map +1 -1
- package/dist/deploy/job.d.ts +2 -0
- package/dist/deploy/job.d.ts.map +1 -1
- package/dist/deploy/job.js +2 -2
- package/dist/deploy/job.js.map +1 -1
- package/dist/deploy/messages.d.ts +14 -0
- package/dist/deploy/messages.d.ts.map +1 -1
- package/dist/deploy/messages.js +59 -25
- package/dist/deploy/messages.js.map +1 -1
- package/dist/deploy/orchestrator.d.ts +23 -1
- package/dist/deploy/orchestrator.d.ts.map +1 -1
- package/dist/deploy/orchestrator.js +87 -30
- package/dist/deploy/orchestrator.js.map +1 -1
- package/dist/deploy/package.d.ts +14 -1
- package/dist/deploy/package.d.ts.map +1 -1
- package/dist/deploy/package.js +37 -2
- package/dist/deploy/package.js.map +1 -1
- package/dist/deploy/register.d.ts +2 -0
- package/dist/deploy/register.d.ts.map +1 -1
- package/dist/deploy/register.js +48 -32
- package/dist/deploy/register.js.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -12
- package/dist/index.js.map +1 -1
- package/dist/runtime/boot-skip.d.ts +18 -0
- package/dist/runtime/boot-skip.d.ts.map +1 -1
- package/dist/runtime/boot-skip.js +25 -0
- package/dist/runtime/boot-skip.js.map +1 -1
- package/dist/runtime/lifecycle-events.d.ts +2 -2
- package/dist/runtime/lifecycle-events.d.ts.map +1 -1
- package/dist/runtime/lifecycle-events.js.map +1 -1
- package/dist/runtime/lifecycle-reaper.d.ts +11 -6
- package/dist/runtime/lifecycle-reaper.d.ts.map +1 -1
- package/dist/runtime/lifecycle-reaper.js +25 -15
- package/dist/runtime/lifecycle-reaper.js.map +1 -1
- package/dist/runtime/notifications.d.ts +10 -0
- package/dist/runtime/notifications.d.ts.map +1 -1
- package/dist/runtime/notifications.js +17 -6
- package/dist/runtime/notifications.js.map +1 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +4 -1
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/scanners/external/scaffold/preflight.py +492 -12
- package/dist/senpi/__tests__/helpers/fake-paper-mcp.d.ts +44 -0
- package/dist/senpi/__tests__/helpers/fake-paper-mcp.d.ts.map +1 -0
- package/dist/senpi/__tests__/helpers/fake-paper-mcp.js +129 -0
- package/dist/senpi/__tests__/helpers/fake-paper-mcp.js.map +1 -0
- package/dist/senpi/client.d.ts +35 -1
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +62 -8
- package/dist/senpi/client.js.map +1 -1
- package/dist/senpi/paper.d.ts +29 -0
- package/dist/senpi/paper.d.ts.map +1 -0
- package/dist/senpi/paper.js +44 -0
- package/dist/senpi/paper.js.map +1 -0
- package/dist/senpi/strategy-status.d.ts.map +1 -1
- package/dist/senpi/strategy-status.js +2 -0
- package/dist/senpi/strategy-status.js.map +1 -1
- package/dist/senpi/types.d.ts +8 -1
- package/dist/senpi/types.d.ts.map +1 -1
- package/dist/telemetry/box-memory.d.ts +29 -0
- package/dist/telemetry/box-memory.d.ts.map +1 -0
- package/dist/telemetry/box-memory.js +113 -0
- package/dist/telemetry/box-memory.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +21 -0
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +82 -0
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/telemetry/spans/span-hooks.d.ts.map +1 -1
- package/dist/telemetry/spans/span-hooks.js +4 -1
- package/dist/telemetry/spans/span-hooks.js.map +1 -1
- package/dist/telemetry/trace-identity.d.ts.map +1 -1
- package/dist/telemetry/trace-identity.js +2 -0
- package/dist/telemetry/trace-identity.js.map +1 -1
- package/dist/universe/package-universe.js +1 -1
- package/dist/universe/package-universe.js.map +1 -1
- package/dist/utils/event-catalog.d.ts +7 -3
- package/dist/utils/event-catalog.d.ts.map +1 -1
- package/dist/utils/event-catalog.js.map +1 -1
- package/dist/validate/codes.d.ts +2 -0
- package/dist/validate/codes.d.ts.map +1 -1
- package/dist/validate/codes.js +6 -0
- package/dist/validate/codes.js.map +1 -1
- package/dist/validate/live-stage.d.ts +12 -0
- package/dist/validate/live-stage.d.ts.map +1 -1
- package/dist/validate/live-stage.js +16 -0
- package/dist/validate/live-stage.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { isPaperAddress, isPaperStrategyId } from "../../paper.js";
|
|
2
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
3
|
+
function ok(data) {
|
|
4
|
+
return { success: true, data, meta: { tool: "fake" } };
|
|
5
|
+
}
|
|
6
|
+
function refuse(code, message) {
|
|
7
|
+
return { success: false, error: { code, message, retryable: false, details: {} }, meta: { tool: "fake" } };
|
|
8
|
+
}
|
|
9
|
+
function wire(row, paper, flag) {
|
|
10
|
+
return {
|
|
11
|
+
id: row.id,
|
|
12
|
+
strategyWalletAddress: row.strategyWalletAddress,
|
|
13
|
+
status: row.status,
|
|
14
|
+
strategyName: row.strategyName,
|
|
15
|
+
strategyType: "CUSTOM",
|
|
16
|
+
traderAddress: "",
|
|
17
|
+
createdAt: "2026-11-07T00:00:00Z",
|
|
18
|
+
...(row.totalFunded !== undefined ? { totalFunded: row.totalFunded } : {}),
|
|
19
|
+
...(row.skillName ? { strategyMetadata: { skillName: row.skillName } } : {}),
|
|
20
|
+
...(paper && flag ? { paper: true } : {}),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function createFakePaperMcp(options = {}) {
|
|
24
|
+
const router = options.router ?? true;
|
|
25
|
+
const live = [...(options.live ?? [])];
|
|
26
|
+
const paper = [...(options.paper ?? [])];
|
|
27
|
+
const calls = [];
|
|
28
|
+
const pendingStatuses = new Map();
|
|
29
|
+
let created = 0;
|
|
30
|
+
const currentStatus = (row) => {
|
|
31
|
+
const queue = pendingStatuses.get(row.id);
|
|
32
|
+
if (queue && queue.length > 0) {
|
|
33
|
+
row.status = queue.length > 1 ? queue.shift() : queue[0];
|
|
34
|
+
}
|
|
35
|
+
return row.status;
|
|
36
|
+
};
|
|
37
|
+
function strategyList(args) {
|
|
38
|
+
const ids = args.strategy_ids ?? [];
|
|
39
|
+
const addresses = args.strategy_addresses ?? [];
|
|
40
|
+
if (!router) {
|
|
41
|
+
if (ids.some((id) => !UUID_RE.test(id)))
|
|
42
|
+
return refuse("SERR186", "strategyIds must be UUIDs");
|
|
43
|
+
return ok({ strategies: select(live, ids, addresses).map((r) => wire(r, false, false)) });
|
|
44
|
+
}
|
|
45
|
+
if (args.paper !== undefined && typeof args.paper !== "boolean") {
|
|
46
|
+
return refuse("PAPER_FLAG_INVALID", "paper must be a boolean");
|
|
47
|
+
}
|
|
48
|
+
const filterWorlds = new Set([
|
|
49
|
+
...ids.map((id) => isPaperStrategyId(id)),
|
|
50
|
+
...addresses.map((a) => isPaperAddress(a)),
|
|
51
|
+
]);
|
|
52
|
+
if (filterWorlds.size > 1)
|
|
53
|
+
return refuse("PAPER_IDENTIFIER_MISMATCH", "filter mixes worlds");
|
|
54
|
+
const flag = args.paper === true;
|
|
55
|
+
const [filterWorld] = [...filterWorlds];
|
|
56
|
+
if (filterWorld !== undefined && args.paper !== undefined && filterWorld !== flag) {
|
|
57
|
+
return refuse("PAPER_IDENTIFIER_MISMATCH", "paper flag disagrees with the filter");
|
|
58
|
+
}
|
|
59
|
+
const world = filterWorld ?? flag;
|
|
60
|
+
if (!world)
|
|
61
|
+
return ok({ strategies: select(live, ids, addresses).map((r) => wire(r, false, false)) });
|
|
62
|
+
const rows = select(paper, ids, addresses).map((r) => wire(r, true, !options.unflaggedPaperRows));
|
|
63
|
+
return ok({ paper_routing: true, strategies: rows });
|
|
64
|
+
}
|
|
65
|
+
function select(rows, ids, addresses) {
|
|
66
|
+
const lowered = addresses.map((a) => a.toLowerCase());
|
|
67
|
+
return rows.filter((row) => {
|
|
68
|
+
if (ids.length > 0 && !ids.includes(row.id))
|
|
69
|
+
return false;
|
|
70
|
+
if (lowered.length > 0 && !lowered.includes(row.strategyWalletAddress.toLowerCase()))
|
|
71
|
+
return false;
|
|
72
|
+
currentStatus(row);
|
|
73
|
+
return true;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function create(args) {
|
|
77
|
+
created += 1;
|
|
78
|
+
const name = typeof args.strategyName === "string" ? args.strategyName : `strategy-${created}`;
|
|
79
|
+
const skillName = typeof args.skillName === "string" ? args.skillName : undefined;
|
|
80
|
+
const funded = typeof args.initialBudget === "number" ? args.initialBudget : undefined;
|
|
81
|
+
if (router && args.paper === true) {
|
|
82
|
+
const statuses = options.paperCreateStatuses ?? ["CREATING", "ACTIVE"];
|
|
83
|
+
const row = {
|
|
84
|
+
id: `paper-0000000${created}-1111-4111-8111-111111111111`,
|
|
85
|
+
strategyWalletAddress: options.paperCreateWallet ?? `0x00000000000000001762460000000abcdef0123${created}`,
|
|
86
|
+
status: statuses[0],
|
|
87
|
+
strategyName: name,
|
|
88
|
+
...(skillName ? { skillName } : {}),
|
|
89
|
+
...(funded !== undefined ? { totalFunded: funded } : {}),
|
|
90
|
+
};
|
|
91
|
+
pendingStatuses.set(row.id, [...statuses]);
|
|
92
|
+
paper.push(row);
|
|
93
|
+
return ok({ strategy: wire(row, true, true), message: "creating" });
|
|
94
|
+
}
|
|
95
|
+
const row = {
|
|
96
|
+
id: `0000000${created}-2222-4222-8222-222222222222`,
|
|
97
|
+
strategyWalletAddress: `0x${String(created).padStart(40, "a")}`,
|
|
98
|
+
status: "ACTIVE",
|
|
99
|
+
strategyName: name,
|
|
100
|
+
...(skillName ? { skillName } : {}),
|
|
101
|
+
...(funded !== undefined ? { totalFunded: funded } : {}),
|
|
102
|
+
};
|
|
103
|
+
live.push(row);
|
|
104
|
+
return ok({ strategy: wire(row, false, false), message: "creating" });
|
|
105
|
+
}
|
|
106
|
+
const transport = async (tool, args) => {
|
|
107
|
+
calls.push({ tool, args: structuredClone(args) });
|
|
108
|
+
switch (tool) {
|
|
109
|
+
case "strategy_list":
|
|
110
|
+
return strategyList(args);
|
|
111
|
+
case "strategy_create_custom_strategy":
|
|
112
|
+
return create(args);
|
|
113
|
+
case "account_get_portfolio":
|
|
114
|
+
return ok({ portfolio: { total_in_hyperliquid: 100000 } });
|
|
115
|
+
case "strategy_close":
|
|
116
|
+
return ok({ success: true });
|
|
117
|
+
default:
|
|
118
|
+
return refuse("NOT_FOUND", `fake MCP has no ${tool}`);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
return {
|
|
122
|
+
transport,
|
|
123
|
+
calls,
|
|
124
|
+
callsTo: (tool) => calls.filter((c) => c.tool === tool).map((c) => c.args),
|
|
125
|
+
live,
|
|
126
|
+
paper,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=fake-paper-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-paper-mcp.js","sourceRoot":"","sources":["../../../../src/senpi/__tests__/helpers/fake-paper-mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/senpi/client.d.ts
CHANGED
|
@@ -109,6 +109,13 @@ export declare function isOutcomeUnknownCode(code: string | null | undefined): b
|
|
|
109
109
|
* rather than each re-deriving the rule.
|
|
110
110
|
*/
|
|
111
111
|
export declare function isRetriableMcpError(err: unknown): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* A `strategy_list` reply from the wrong world: a paper call answered without the router's marker,
|
|
114
|
+
* or a live call answered with it. The list is unknown, never empty.
|
|
115
|
+
*/
|
|
116
|
+
export declare class PaperRoutingError extends Error {
|
|
117
|
+
readonly name = "PaperRoutingError";
|
|
118
|
+
}
|
|
112
119
|
export declare class SenpiClient {
|
|
113
120
|
private readonly injectedTransport;
|
|
114
121
|
private readonly config;
|
|
@@ -336,7 +343,13 @@ export declare class SenpiClient {
|
|
|
336
343
|
* created and funded a second wallet beside every live one and then reported `live`. An empty
|
|
337
344
|
* `strategies` array is still a real answer and is returned as one; anything else throws.
|
|
338
345
|
*/
|
|
339
|
-
|
|
346
|
+
/**
|
|
347
|
+
* One world per call (SPEC §6.3). `filters.paper` is always sent. A paper call refuses a reply
|
|
348
|
+
* without `paper_routing: true`, because an MCP with no router drops the flag and answers with
|
|
349
|
+
* live rows; a live call refuses a reply that carries the marker. Rows from the other world are
|
|
350
|
+
* dropped: a paper call keeps only rows with `paper: true`, a live call only rows without it.
|
|
351
|
+
*/
|
|
352
|
+
listStrategies(filters: ListStrategiesFilters, opts?: {
|
|
340
353
|
signal?: AbortSignal;
|
|
341
354
|
}): Promise<StrategySummary[]>;
|
|
342
355
|
/**
|
|
@@ -349,6 +362,27 @@ export declare class SenpiClient {
|
|
|
349
362
|
getStrategyLimits(opts?: {
|
|
350
363
|
signal?: AbortSignal;
|
|
351
364
|
}): Promise<StrategyLimits>;
|
|
365
|
+
/**
|
|
366
|
+
* Strategies for a set of wallets, each asked in its own world: paper wallets on a `paper: true`
|
|
367
|
+
* call, the rest on a live one. A world with no wallets makes no call. Either call failing throws,
|
|
368
|
+
* so a caller never mistakes half an answer for a whole one.
|
|
369
|
+
*/
|
|
370
|
+
listStrategiesForWallets(wallets: readonly string[], opts?: {
|
|
371
|
+
signal?: AbortSignal;
|
|
372
|
+
}): Promise<StrategySummary[]>;
|
|
373
|
+
/**
|
|
374
|
+
* Whether the MCP routes paper calls, asked with the probe id no strategy has (SPEC §6.3). Any
|
|
375
|
+
* answer but an empty-or-not list carrying `paper_routing: true` is `routed: false`, including a
|
|
376
|
+
* transport fault: a caller that cannot prove it reached a paper-aware MCP does not act.
|
|
377
|
+
*/
|
|
378
|
+
probePaperRouting(opts?: {
|
|
379
|
+
signal?: AbortSignal;
|
|
380
|
+
}): Promise<{
|
|
381
|
+
routed: true;
|
|
382
|
+
} | {
|
|
383
|
+
routed: false;
|
|
384
|
+
reason: string;
|
|
385
|
+
}>;
|
|
352
386
|
getOpenOrders(wallet: string): Promise<GetOpenOrdersResult[]>;
|
|
353
387
|
/**
|
|
354
388
|
* Closed-position history from MCP `discovery_get_trader_history`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/senpi/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/senpi/client.ts"],"names":[],"mappings":"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"}
|
package/dist/senpi/client.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
2
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
3
3
|
import { MCP_BASE_URL } from "./constants.js";
|
|
4
|
+
import { isPaperAddress, PAPER_ROUTING_PROBE_ID } from "./paper.js";
|
|
4
5
|
import { isRecord, unwrapEnvelope, asString, asNumber } from "../utils/response.js";
|
|
5
6
|
import { extractMinClearingHouseTime, createClearingHouseStalenessGuard } from "../utils/clearing-house-staleness.js";
|
|
6
7
|
import { normalizeDslCoinDex, reconcileDexFromClearingHouseKey } from "../utils/perp-coin.js";
|
|
@@ -339,6 +340,13 @@ function describeToolFailure(data) {
|
|
|
339
340
|
return `tool reported failure: ${extractEngineMessage(rec)}`;
|
|
340
341
|
return `response keys: ${Object.keys(rec).join(", ") || "(none)"}`;
|
|
341
342
|
}
|
|
343
|
+
/**
|
|
344
|
+
* A `strategy_list` reply from the wrong world: a paper call answered without the router's marker,
|
|
345
|
+
* or a live call answered with it. The list is unknown, never empty.
|
|
346
|
+
*/
|
|
347
|
+
export class PaperRoutingError extends Error {
|
|
348
|
+
name = "PaperRoutingError";
|
|
349
|
+
}
|
|
342
350
|
/**
|
|
343
351
|
* The attribution stamp on a `strategy_list` row, tolerant of a JSON-encoded metadata payload.
|
|
344
352
|
*
|
|
@@ -1213,7 +1221,7 @@ export class SenpiClient {
|
|
|
1213
1221
|
async getStrategy(wallet) {
|
|
1214
1222
|
// The backend `strategy_get` tool requires a strategy_id, not a wallet address.
|
|
1215
1223
|
// Look up by wallet via `strategy_list` with an address filter instead.
|
|
1216
|
-
const matches = await this.
|
|
1224
|
+
const matches = await this.listStrategiesForWallets([wallet]);
|
|
1217
1225
|
const match = matches.find((s) => s.strategyWalletAddress.toLowerCase() === wallet.toLowerCase())
|
|
1218
1226
|
?? matches[0];
|
|
1219
1227
|
if (!match || !match.id)
|
|
@@ -1240,15 +1248,21 @@ export class SenpiClient {
|
|
|
1240
1248
|
* created and funded a second wallet beside every live one and then reported `live`. An empty
|
|
1241
1249
|
* `strategies` array is still a real answer and is returned as one; anything else throws.
|
|
1242
1250
|
*/
|
|
1251
|
+
/**
|
|
1252
|
+
* One world per call (SPEC §6.3). `filters.paper` is always sent. A paper call refuses a reply
|
|
1253
|
+
* without `paper_routing: true`, because an MCP with no router drops the flag and answers with
|
|
1254
|
+
* live rows; a live call refuses a reply that carries the marker. Rows from the other world are
|
|
1255
|
+
* dropped: a paper call keeps only rows with `paper: true`, a live call only rows without it.
|
|
1256
|
+
*/
|
|
1243
1257
|
async listStrategies(filters, opts) {
|
|
1244
|
-
const args = {};
|
|
1245
|
-
if (filters
|
|
1258
|
+
const args = { paper: filters.paper };
|
|
1259
|
+
if (filters.strategyAddresses)
|
|
1246
1260
|
args.strategy_addresses = filters.strategyAddresses;
|
|
1247
|
-
if (filters
|
|
1261
|
+
if (filters.status)
|
|
1248
1262
|
args.status = filters.status;
|
|
1249
|
-
if (filters
|
|
1263
|
+
if (filters.strategyIds)
|
|
1250
1264
|
args.strategy_ids = filters.strategyIds;
|
|
1251
|
-
if (filters
|
|
1265
|
+
if (filters.strategyType)
|
|
1252
1266
|
args.strategy_type = filters.strategyType;
|
|
1253
1267
|
const raw = await this.callTool("strategy_list", args, opts);
|
|
1254
1268
|
const data = unwrapEnvelope(raw);
|
|
@@ -1258,8 +1272,18 @@ export class SenpiClient {
|
|
|
1258
1272
|
throw new Error(`strategy_list: no strategies array in the response — the strategy list is UNKNOWN, ` +
|
|
1259
1273
|
`not empty (${detail})`);
|
|
1260
1274
|
}
|
|
1261
|
-
|
|
1262
|
-
|
|
1275
|
+
if ((data.paper_routing === true) !== filters.paper) {
|
|
1276
|
+
throw new PaperRoutingError(filters.paper
|
|
1277
|
+
? `strategy_list {paper: true} was answered without paper_routing: true. This MCP has no ` +
|
|
1278
|
+
`paper router, so its rows are live strategies, not simulations. The simulation list ` +
|
|
1279
|
+
`is UNKNOWN and nothing was done with it.`
|
|
1280
|
+
: `strategy_list for live strategies was answered with paper_routing: true. A live call ` +
|
|
1281
|
+
`never reads a simulation reply, so the live list is UNKNOWN and nothing was done with it.`);
|
|
1282
|
+
}
|
|
1283
|
+
const strategies = data.strategies
|
|
1284
|
+
.filter(isRecord)
|
|
1285
|
+
.filter((s) => (s.paper === true) === filters.paper);
|
|
1286
|
+
return strategies.map((s) => ({
|
|
1263
1287
|
id: asString(s.id) ?? "",
|
|
1264
1288
|
strategyWalletAddress: asString(s.strategyWalletAddress) ?? "",
|
|
1265
1289
|
traderAddress: asString(s.traderAddress) ?? "",
|
|
@@ -1299,6 +1323,35 @@ export class SenpiClient {
|
|
|
1299
1323
|
summary: asString(data.summary) ?? "",
|
|
1300
1324
|
};
|
|
1301
1325
|
}
|
|
1326
|
+
/**
|
|
1327
|
+
* Strategies for a set of wallets, each asked in its own world: paper wallets on a `paper: true`
|
|
1328
|
+
* call, the rest on a live one. A world with no wallets makes no call. Either call failing throws,
|
|
1329
|
+
* so a caller never mistakes half an answer for a whole one.
|
|
1330
|
+
*/
|
|
1331
|
+
async listStrategiesForWallets(wallets, opts) {
|
|
1332
|
+
const paper = wallets.filter((w) => isPaperAddress(w));
|
|
1333
|
+
const live = wallets.filter((w) => !isPaperAddress(w));
|
|
1334
|
+
const rows = [];
|
|
1335
|
+
if (live.length > 0)
|
|
1336
|
+
rows.push(...(await this.listStrategies({ paper: false, strategyAddresses: live }, opts)));
|
|
1337
|
+
if (paper.length > 0)
|
|
1338
|
+
rows.push(...(await this.listStrategies({ paper: true, strategyAddresses: paper }, opts)));
|
|
1339
|
+
return rows;
|
|
1340
|
+
}
|
|
1341
|
+
/**
|
|
1342
|
+
* Whether the MCP routes paper calls, asked with the probe id no strategy has (SPEC §6.3). Any
|
|
1343
|
+
* answer but an empty-or-not list carrying `paper_routing: true` is `routed: false`, including a
|
|
1344
|
+
* transport fault: a caller that cannot prove it reached a paper-aware MCP does not act.
|
|
1345
|
+
*/
|
|
1346
|
+
async probePaperRouting(opts) {
|
|
1347
|
+
try {
|
|
1348
|
+
await this.listStrategies({ paper: true, strategyIds: [PAPER_ROUTING_PROBE_ID] }, opts);
|
|
1349
|
+
return { routed: true };
|
|
1350
|
+
}
|
|
1351
|
+
catch (err) {
|
|
1352
|
+
return { routed: false, reason: err instanceof Error ? err.message : String(err) };
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1302
1355
|
async getOpenOrders(wallet) {
|
|
1303
1356
|
const raw = await this.callTool("strategy_get_open_orders", { strategy_wallet: wallet });
|
|
1304
1357
|
const data = unwrapEnvelope(raw);
|
|
@@ -1381,6 +1434,7 @@ export class SenpiClient {
|
|
|
1381
1434
|
skillVersion: params.skillVersion,
|
|
1382
1435
|
...(params.facts ? { facts: params.facts } : {}),
|
|
1383
1436
|
...(params.catalog ? { catalog: params.catalog } : {}),
|
|
1437
|
+
...(params.paper ? { paper: true } : {}),
|
|
1384
1438
|
}, opts);
|
|
1385
1439
|
const data = unwrapEnvelope(raw);
|
|
1386
1440
|
if (!isRecord(data))
|