@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.
Files changed (103) hide show
  1. package/dist/cli/guide-commands.d.ts.map +1 -1
  2. package/dist/cli/guide-commands.js +6 -0
  3. package/dist/cli/guide-commands.js.map +1 -1
  4. package/dist/cli/senpi-commands.d.ts.map +1 -1
  5. package/dist/cli/senpi-commands.js +4 -2
  6. package/dist/cli/senpi-commands.js.map +1 -1
  7. package/dist/deploy/box-cap.d.ts +7 -0
  8. package/dist/deploy/box-cap.d.ts.map +1 -0
  9. package/dist/deploy/box-cap.js +13 -0
  10. package/dist/deploy/box-cap.js.map +1 -0
  11. package/dist/deploy/funding.d.ts +13 -1
  12. package/dist/deploy/funding.d.ts.map +1 -1
  13. package/dist/deploy/funding.js +13 -4
  14. package/dist/deploy/funding.js.map +1 -1
  15. package/dist/deploy/job.d.ts +2 -0
  16. package/dist/deploy/job.d.ts.map +1 -1
  17. package/dist/deploy/job.js +2 -2
  18. package/dist/deploy/job.js.map +1 -1
  19. package/dist/deploy/messages.d.ts +14 -0
  20. package/dist/deploy/messages.d.ts.map +1 -1
  21. package/dist/deploy/messages.js +59 -25
  22. package/dist/deploy/messages.js.map +1 -1
  23. package/dist/deploy/orchestrator.d.ts +23 -1
  24. package/dist/deploy/orchestrator.d.ts.map +1 -1
  25. package/dist/deploy/orchestrator.js +87 -30
  26. package/dist/deploy/orchestrator.js.map +1 -1
  27. package/dist/deploy/package.d.ts +14 -1
  28. package/dist/deploy/package.d.ts.map +1 -1
  29. package/dist/deploy/package.js +37 -2
  30. package/dist/deploy/package.js.map +1 -1
  31. package/dist/deploy/register.d.ts +2 -0
  32. package/dist/deploy/register.d.ts.map +1 -1
  33. package/dist/deploy/register.js +48 -32
  34. package/dist/deploy/register.js.map +1 -1
  35. package/dist/index.d.ts +0 -4
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +43 -12
  38. package/dist/index.js.map +1 -1
  39. package/dist/runtime/boot-skip.d.ts +18 -0
  40. package/dist/runtime/boot-skip.d.ts.map +1 -1
  41. package/dist/runtime/boot-skip.js +25 -0
  42. package/dist/runtime/boot-skip.js.map +1 -1
  43. package/dist/runtime/lifecycle-events.d.ts +2 -2
  44. package/dist/runtime/lifecycle-events.d.ts.map +1 -1
  45. package/dist/runtime/lifecycle-events.js.map +1 -1
  46. package/dist/runtime/lifecycle-reaper.d.ts +11 -6
  47. package/dist/runtime/lifecycle-reaper.d.ts.map +1 -1
  48. package/dist/runtime/lifecycle-reaper.js +25 -15
  49. package/dist/runtime/lifecycle-reaper.js.map +1 -1
  50. package/dist/runtime/notifications.d.ts +10 -0
  51. package/dist/runtime/notifications.d.ts.map +1 -1
  52. package/dist/runtime/notifications.js +17 -6
  53. package/dist/runtime/notifications.js.map +1 -1
  54. package/dist/runtime/runtime.d.ts.map +1 -1
  55. package/dist/runtime/runtime.js +4 -1
  56. package/dist/runtime/runtime.js.map +1 -1
  57. package/dist/scanners/external/scaffold/preflight.py +492 -12
  58. package/dist/senpi/__tests__/helpers/fake-paper-mcp.d.ts +44 -0
  59. package/dist/senpi/__tests__/helpers/fake-paper-mcp.d.ts.map +1 -0
  60. package/dist/senpi/__tests__/helpers/fake-paper-mcp.js +129 -0
  61. package/dist/senpi/__tests__/helpers/fake-paper-mcp.js.map +1 -0
  62. package/dist/senpi/client.d.ts +35 -1
  63. package/dist/senpi/client.d.ts.map +1 -1
  64. package/dist/senpi/client.js +62 -8
  65. package/dist/senpi/client.js.map +1 -1
  66. package/dist/senpi/paper.d.ts +29 -0
  67. package/dist/senpi/paper.d.ts.map +1 -0
  68. package/dist/senpi/paper.js +44 -0
  69. package/dist/senpi/paper.js.map +1 -0
  70. package/dist/senpi/strategy-status.d.ts.map +1 -1
  71. package/dist/senpi/strategy-status.js +2 -0
  72. package/dist/senpi/strategy-status.js.map +1 -1
  73. package/dist/senpi/types.d.ts +8 -1
  74. package/dist/senpi/types.d.ts.map +1 -1
  75. package/dist/telemetry/box-memory.d.ts +29 -0
  76. package/dist/telemetry/box-memory.d.ts.map +1 -0
  77. package/dist/telemetry/box-memory.js +113 -0
  78. package/dist/telemetry/box-memory.js.map +1 -0
  79. package/dist/telemetry/metrics.d.ts +21 -0
  80. package/dist/telemetry/metrics.d.ts.map +1 -1
  81. package/dist/telemetry/metrics.js +82 -0
  82. package/dist/telemetry/metrics.js.map +1 -1
  83. package/dist/telemetry/spans/span-hooks.d.ts.map +1 -1
  84. package/dist/telemetry/spans/span-hooks.js +4 -1
  85. package/dist/telemetry/spans/span-hooks.js.map +1 -1
  86. package/dist/telemetry/trace-identity.d.ts.map +1 -1
  87. package/dist/telemetry/trace-identity.js +2 -0
  88. package/dist/telemetry/trace-identity.js.map +1 -1
  89. package/dist/universe/package-universe.js +1 -1
  90. package/dist/universe/package-universe.js.map +1 -1
  91. package/dist/utils/event-catalog.d.ts +7 -3
  92. package/dist/utils/event-catalog.d.ts.map +1 -1
  93. package/dist/utils/event-catalog.js.map +1 -1
  94. package/dist/validate/codes.d.ts +2 -0
  95. package/dist/validate/codes.d.ts.map +1 -1
  96. package/dist/validate/codes.js +6 -0
  97. package/dist/validate/codes.js.map +1 -1
  98. package/dist/validate/live-stage.d.ts +12 -0
  99. package/dist/validate/live-stage.d.ts.map +1 -1
  100. package/dist/validate/live-stage.js +16 -0
  101. package/dist/validate/live-stage.js.map +1 -1
  102. package/openclaw.plugin.json +1 -1
  103. 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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"}
@@ -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
- listStrategies(filters?: ListStrategiesFilters, opts?: {
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":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/senpi/client.ts"],"names":[],"mappings":"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"}
@@ -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.listStrategies({ strategyAddresses: [wallet] });
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?.strategyAddresses)
1258
+ const args = { paper: filters.paper };
1259
+ if (filters.strategyAddresses)
1246
1260
  args.strategy_addresses = filters.strategyAddresses;
1247
- if (filters?.status)
1261
+ if (filters.status)
1248
1262
  args.status = filters.status;
1249
- if (filters?.strategyIds)
1263
+ if (filters.strategyIds)
1250
1264
  args.strategy_ids = filters.strategyIds;
1251
- if (filters?.strategyType)
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
- const strategies = data.strategies;
1262
- return strategies.filter(isRecord).map((s) => ({
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))