@senpi/runtime 3.0.186 → 3.0.190

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 (173) hide show
  1. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts +1 -1
  2. package/dist/actions/llm-decision/openclaw-llm-decision.js +1 -1
  3. package/dist/approvals/telemetry.d.ts +3 -2
  4. package/dist/approvals/telemetry.d.ts.map +1 -1
  5. package/dist/approvals/telemetry.js.map +1 -1
  6. package/dist/approvals/tool-approval-gate.d.ts +9 -3
  7. package/dist/approvals/tool-approval-gate.d.ts.map +1 -1
  8. package/dist/approvals/tool-approval-gate.js +18 -5
  9. package/dist/approvals/tool-approval-gate.js.map +1 -1
  10. package/dist/approvals/turn-context.d.ts +43 -18
  11. package/dist/approvals/turn-context.d.ts.map +1 -1
  12. package/dist/approvals/turn-context.js +67 -24
  13. package/dist/approvals/turn-context.js.map +1 -1
  14. package/dist/cli/guide-commands.d.ts.map +1 -1
  15. package/dist/cli/guide-commands.js +8 -1
  16. package/dist/cli/guide-commands.js.map +1 -1
  17. package/dist/cli/senpi-commands.d.ts.map +1 -1
  18. package/dist/cli/senpi-commands.js +12 -2
  19. package/dist/cli/senpi-commands.js.map +1 -1
  20. package/dist/deploy/box-cap.d.ts +7 -0
  21. package/dist/deploy/box-cap.d.ts.map +1 -0
  22. package/dist/deploy/box-cap.js +13 -0
  23. package/dist/deploy/box-cap.js.map +1 -0
  24. package/dist/deploy/funding.d.ts +13 -1
  25. package/dist/deploy/funding.d.ts.map +1 -1
  26. package/dist/deploy/funding.js +13 -4
  27. package/dist/deploy/funding.js.map +1 -1
  28. package/dist/deploy/job.d.ts +2 -0
  29. package/dist/deploy/job.d.ts.map +1 -1
  30. package/dist/deploy/job.js +2 -2
  31. package/dist/deploy/job.js.map +1 -1
  32. package/dist/deploy/messages.d.ts +14 -0
  33. package/dist/deploy/messages.d.ts.map +1 -1
  34. package/dist/deploy/messages.js +59 -25
  35. package/dist/deploy/messages.js.map +1 -1
  36. package/dist/deploy/orchestrator.d.ts +23 -1
  37. package/dist/deploy/orchestrator.d.ts.map +1 -1
  38. package/dist/deploy/orchestrator.js +87 -30
  39. package/dist/deploy/orchestrator.js.map +1 -1
  40. package/dist/deploy/package.d.ts +14 -1
  41. package/dist/deploy/package.d.ts.map +1 -1
  42. package/dist/deploy/package.js +37 -2
  43. package/dist/deploy/package.js.map +1 -1
  44. package/dist/deploy/register.d.ts +3 -0
  45. package/dist/deploy/register.d.ts.map +1 -1
  46. package/dist/deploy/register.js +50 -33
  47. package/dist/deploy/register.js.map +1 -1
  48. package/dist/dsl/monitor/dsl-failure-events.d.ts +38 -2
  49. package/dist/dsl/monitor/dsl-failure-events.d.ts.map +1 -1
  50. package/dist/dsl/monitor/dsl-failure-events.js +67 -4
  51. package/dist/dsl/monitor/dsl-failure-events.js.map +1 -1
  52. package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
  53. package/dist/dsl/monitor/process-one-position.js +25 -1
  54. package/dist/dsl/monitor/process-one-position.js.map +1 -1
  55. package/dist/index.d.ts +9 -4
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +527 -158
  58. package/dist/index.js.map +1 -1
  59. package/dist/runtime/auto-update/coordinator.d.ts +19 -2
  60. package/dist/runtime/auto-update/coordinator.d.ts.map +1 -1
  61. package/dist/runtime/auto-update/coordinator.js +104 -20
  62. package/dist/runtime/auto-update/coordinator.js.map +1 -1
  63. package/dist/runtime/auto-update/gateway-restart.d.ts +2 -2
  64. package/dist/runtime/auto-update/gateway-restart.js +1 -1
  65. package/dist/runtime/auto-update/idle-gate.d.ts +45 -9
  66. package/dist/runtime/auto-update/idle-gate.d.ts.map +1 -1
  67. package/dist/runtime/auto-update/idle-gate.js +26 -14
  68. package/dist/runtime/auto-update/idle-gate.js.map +1 -1
  69. package/dist/runtime/auto-update/register-idle-gate.d.ts +1 -1
  70. package/dist/runtime/auto-update/register-idle-gate.d.ts.map +1 -1
  71. package/dist/runtime/auto-update/register-idle-gate.js +8 -4
  72. package/dist/runtime/auto-update/register-idle-gate.js.map +1 -1
  73. package/dist/runtime/auto-update/run-update-command.d.ts +1 -1
  74. package/dist/runtime/auto-update/run-update-command.js +1 -1
  75. package/dist/runtime/auto-update/types.d.ts +2 -1
  76. package/dist/runtime/auto-update/types.d.ts.map +1 -1
  77. package/dist/runtime/auto-update/types.js.map +1 -1
  78. package/dist/runtime/auto-update/update-schedule.d.ts +14 -4
  79. package/dist/runtime/auto-update/update-schedule.d.ts.map +1 -1
  80. package/dist/runtime/auto-update/update-schedule.js +21 -5
  81. package/dist/runtime/auto-update/update-schedule.js.map +1 -1
  82. package/dist/runtime/boot-skip.d.ts +18 -0
  83. package/dist/runtime/boot-skip.d.ts.map +1 -1
  84. package/dist/runtime/boot-skip.js +25 -0
  85. package/dist/runtime/boot-skip.js.map +1 -1
  86. package/dist/runtime/lifecycle-events.d.ts +2 -2
  87. package/dist/runtime/lifecycle-events.d.ts.map +1 -1
  88. package/dist/runtime/lifecycle-events.js.map +1 -1
  89. package/dist/runtime/lifecycle-reaper.d.ts +11 -6
  90. package/dist/runtime/lifecycle-reaper.d.ts.map +1 -1
  91. package/dist/runtime/lifecycle-reaper.js +25 -15
  92. package/dist/runtime/lifecycle-reaper.js.map +1 -1
  93. package/dist/runtime/notifications.d.ts +10 -0
  94. package/dist/runtime/notifications.d.ts.map +1 -1
  95. package/dist/runtime/notifications.js +17 -6
  96. package/dist/runtime/notifications.js.map +1 -1
  97. package/dist/runtime/process-state.d.ts +168 -0
  98. package/dist/runtime/process-state.d.ts.map +1 -0
  99. package/dist/runtime/process-state.js +81 -0
  100. package/dist/runtime/process-state.js.map +1 -0
  101. package/dist/runtime/reconcile-state.d.ts.map +1 -1
  102. package/dist/runtime/reconcile-state.js +18 -4
  103. package/dist/runtime/reconcile-state.js.map +1 -1
  104. package/dist/runtime/runtime.d.ts.map +1 -1
  105. package/dist/runtime/runtime.js +4 -1
  106. package/dist/runtime/runtime.js.map +1 -1
  107. package/dist/runtime/strategy-registry.d.ts +16 -0
  108. package/dist/runtime/strategy-registry.d.ts.map +1 -1
  109. package/dist/runtime/strategy-registry.js +7 -3
  110. package/dist/runtime/strategy-registry.js.map +1 -1
  111. package/dist/runtime/update-apply-deps.d.ts +5 -3
  112. package/dist/runtime/update-apply-deps.d.ts.map +1 -1
  113. package/dist/runtime/update-apply-deps.js +15 -3
  114. package/dist/runtime/update-apply-deps.js.map +1 -1
  115. package/dist/scanners/external/scaffold/preflight.py +492 -12
  116. package/dist/senpi/__tests__/helpers/fake-paper-mcp.d.ts +44 -0
  117. package/dist/senpi/__tests__/helpers/fake-paper-mcp.d.ts.map +1 -0
  118. package/dist/senpi/__tests__/helpers/fake-paper-mcp.js +129 -0
  119. package/dist/senpi/__tests__/helpers/fake-paper-mcp.js.map +1 -0
  120. package/dist/senpi/client.d.ts +40 -2
  121. package/dist/senpi/client.d.ts.map +1 -1
  122. package/dist/senpi/client.js +82 -15
  123. package/dist/senpi/client.js.map +1 -1
  124. package/dist/senpi/paper.d.ts +28 -0
  125. package/dist/senpi/paper.d.ts.map +1 -0
  126. package/dist/senpi/paper.js +35 -0
  127. package/dist/senpi/paper.js.map +1 -0
  128. package/dist/senpi/strategy-status.d.ts.map +1 -1
  129. package/dist/senpi/strategy-status.js +2 -0
  130. package/dist/senpi/strategy-status.js.map +1 -1
  131. package/dist/senpi/types.d.ts +8 -1
  132. package/dist/senpi/types.d.ts.map +1 -1
  133. package/dist/telemetry/box-memory.d.ts +29 -0
  134. package/dist/telemetry/box-memory.d.ts.map +1 -0
  135. package/dist/telemetry/box-memory.js +113 -0
  136. package/dist/telemetry/box-memory.js.map +1 -0
  137. package/dist/telemetry/metrics.d.ts +22 -1
  138. package/dist/telemetry/metrics.d.ts.map +1 -1
  139. package/dist/telemetry/metrics.js +83 -1
  140. package/dist/telemetry/metrics.js.map +1 -1
  141. package/dist/telemetry/spans/span-hooks.d.ts +1 -1
  142. package/dist/telemetry/spans/span-hooks.d.ts.map +1 -1
  143. package/dist/telemetry/spans/span-hooks.js +5 -2
  144. package/dist/telemetry/spans/span-hooks.js.map +1 -1
  145. package/dist/telemetry/trace-identity.d.ts.map +1 -1
  146. package/dist/telemetry/trace-identity.js +2 -0
  147. package/dist/telemetry/trace-identity.js.map +1 -1
  148. package/dist/test-setup.js +7 -1
  149. package/dist/test-setup.js.map +1 -1
  150. package/dist/tool-surface/crib-hook.d.ts.map +1 -1
  151. package/dist/tool-surface/crib-hook.js +8 -0
  152. package/dist/tool-surface/crib-hook.js.map +1 -1
  153. package/dist/tool-surface/crib-sheet.d.ts +1 -1
  154. package/dist/tool-surface/crib-sheet.js +1 -1
  155. package/dist/tool-surface/mcp-tool-source.d.ts +1 -1
  156. package/dist/tool-surface/mcp-tool-source.js +2 -2
  157. package/dist/universe/package-universe.js +1 -1
  158. package/dist/universe/package-universe.js.map +1 -1
  159. package/dist/utils/event-catalog.d.ts +34 -4
  160. package/dist/utils/event-catalog.d.ts.map +1 -1
  161. package/dist/utils/event-catalog.js +6 -0
  162. package/dist/utils/event-catalog.js.map +1 -1
  163. package/dist/validate/codes.d.ts +2 -0
  164. package/dist/validate/codes.d.ts.map +1 -1
  165. package/dist/validate/codes.js +6 -0
  166. package/dist/validate/codes.js.map +1 -1
  167. package/dist/validate/live-stage.d.ts +12 -0
  168. package/dist/validate/live-stage.d.ts.map +1 -1
  169. package/dist/validate/live-stage.js +16 -0
  170. package/dist/validate/live-stage.js.map +1 -1
  171. package/dist/widgets/tool.d.ts +1 -1
  172. package/openclaw.plugin.json +1 -1
  173. 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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"}
@@ -18,7 +18,11 @@ export declare const ORDER_CALL_TOOLS: ReadonlySet<string>;
18
18
  * stops gating it.
19
19
  */
20
20
  export declare function isMoneyCallTool(bare: string): boolean;
21
- /** Order/close MCP calls currently in flight across every `SenpiClient` in this process. */
21
+ /**
22
+ * Order/close MCP calls currently in flight across every `SenpiClient` in this process. The count
23
+ * lives in the process state, not this module: a 10.x plugin reload evaluates a new copy of this
24
+ * module while the previous copy's calls are still running, and the idle gate must see both.
25
+ */
22
26
  export declare function senpiOrderCallsInFlight(): number;
23
27
  /**
24
28
  * Typed error thrown by `SenpiClient` mutation methods when the response
@@ -105,6 +109,13 @@ export declare function isOutcomeUnknownCode(code: string | null | undefined): b
105
109
  * rather than each re-deriving the rule.
106
110
  */
107
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
+ }
108
119
  export declare class SenpiClient {
109
120
  private readonly injectedTransport;
110
121
  private readonly config;
@@ -332,7 +343,13 @@ export declare class SenpiClient {
332
343
  * created and funded a second wallet beside every live one and then reported `live`. An empty
333
344
  * `strategies` array is still a real answer and is returned as one; anything else throws.
334
345
  */
335
- 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?: {
336
353
  signal?: AbortSignal;
337
354
  }): Promise<StrategySummary[]>;
338
355
  /**
@@ -345,6 +362,27 @@ export declare class SenpiClient {
345
362
  getStrategyLimits(opts?: {
346
363
  signal?: AbortSignal;
347
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
+ }>;
348
386
  getOpenOrders(wallet: string): Promise<GetOpenOrdersResult[]>;
349
387
  /**
350
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";
@@ -12,6 +13,7 @@ import { SpanKind } from "@opentelemetry/api";
12
13
  import { GEN_AI, errorTypeOf, setDefinedAttributes, setGenAiContentAttribute, } from "../telemetry/spans/gen-ai.js";
13
14
  import { EVENT_NAME, eventAttrs } from "../utils/event-catalog.js";
14
15
  import { elapsedSeconds, recordToolCall, recordClearinghouseRetry } from "../telemetry/metrics.js";
16
+ import { runtimeProcessState } from "../runtime/process-state.js";
15
17
  const logger = createLogger("[senpi][client]");
16
18
  /**
17
19
  * MCP tools that move money or change protection: place, change or close an
@@ -49,10 +51,13 @@ export function isMoneyCallTool(bare) {
49
51
  moneyCallTools ??= new Set([...ORDER_CALL_TOOLS, ...loadToolApprovalsManifest().tradeTools]);
50
52
  return moneyCallTools.has(bare);
51
53
  }
52
- let orderCallsInFlight = 0;
53
- /** Order/close MCP calls currently in flight across every `SenpiClient` in this process. */
54
+ /**
55
+ * Order/close MCP calls currently in flight across every `SenpiClient` in this process. The count
56
+ * lives in the process state, not this module: a 10.x plugin reload evaluates a new copy of this
57
+ * module while the previous copy's calls are still running, and the idle gate must see both.
58
+ */
54
59
  export function senpiOrderCallsInFlight() {
55
- return orderCallsInFlight;
60
+ return runtimeProcessState().orderCallsInFlight;
56
61
  }
57
62
  /**
58
63
  * Typed error thrown by `SenpiClient` mutation methods when the response
@@ -335,6 +340,13 @@ function describeToolFailure(data) {
335
340
  return `tool reported failure: ${extractEngineMessage(rec)}`;
336
341
  return `response keys: ${Object.keys(rec).join(", ") || "(none)"}`;
337
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
+ }
338
350
  /**
339
351
  * The attribution stamp on a `strategy_list` row, tolerant of a JSON-encoded metadata payload.
340
352
  *
@@ -371,6 +383,11 @@ function readSkillName(raw) {
371
383
  * with a best-effort engine message.
372
384
  * 5. Otherwise return the inner data.
373
385
  *
386
+ * On 2 and 4 the envelope's / engine's own `error.code` (e.g. `UNAVAILABLE`,
387
+ * `INVALID_ARGUMENT`) also rides `SenpiClientError.upstreamCode`, so telemetry
388
+ * can key on it without parsing the message. It is informational only:
389
+ * `mayHaveExecuted` stays false here, as before.
390
+ *
374
391
  * Used by every mutation method (createPosition, editPosition,
375
392
  * closePosition, etc.) so DSL/actions can rely on `throw` semantics
376
393
  * matching real failures, instead of trusting an outer-envelope-only
@@ -387,7 +404,9 @@ function requireMutationSuccess(tool, raw) {
387
404
  const message = (errObj && typeof errObj.message === "string")
388
405
  ? errObj.message
389
406
  : `${tool}: outer envelope reported failure`;
390
- throw new SenpiClientError("UPSTREAM_ERROR", `${tool}: ${code}: ${message}`, raw);
407
+ throw new SenpiClientError("UPSTREAM_ERROR", `${tool}: ${code}: ${message}`, raw, {
408
+ upstreamCode: envelopeErrorCode(errObj),
409
+ });
391
410
  }
392
411
  const data = unwrapEnvelope(raw) ?? raw;
393
412
  if (!isRecord(data)) {
@@ -395,7 +414,7 @@ function requireMutationSuccess(tool, raw) {
395
414
  }
396
415
  // Inner engine-level success check (only when the field is explicitly boolean).
397
416
  if (typeof data.success === "boolean" && data.success === false) {
398
- throw new SenpiClientError("ENGINE_FAILURE", `${tool}: ${extractEngineMessage(data)}`, data);
417
+ throw new SenpiClientError("ENGINE_FAILURE", `${tool}: ${extractEngineMessage(data)}`, data, { upstreamCode: envelopeErrorCode(data.error) });
399
418
  }
400
419
  return data;
401
420
  }
@@ -634,12 +653,14 @@ export class SenpiClient {
634
653
  async callTool(toolName, args, opts) {
635
654
  if (!isMoneyCallTool(toolName))
636
655
  return this.callToolSpan(toolName, args, opts);
637
- orderCallsInFlight += 1;
656
+ // The same object for the decrement as for the increment.
657
+ const processState = runtimeProcessState();
658
+ processState.orderCallsInFlight += 1;
638
659
  try {
639
660
  return await this.callToolSpan(toolName, args, opts);
640
661
  }
641
662
  finally {
642
- orderCallsInFlight -= 1;
663
+ processState.orderCallsInFlight -= 1;
643
664
  }
644
665
  }
645
666
  /** The span-wrapped body of {@link callTool}. */
@@ -1200,7 +1221,7 @@ export class SenpiClient {
1200
1221
  async getStrategy(wallet) {
1201
1222
  // The backend `strategy_get` tool requires a strategy_id, not a wallet address.
1202
1223
  // Look up by wallet via `strategy_list` with an address filter instead.
1203
- const matches = await this.listStrategies({ strategyAddresses: [wallet] });
1224
+ const matches = await this.listStrategiesForWallets([wallet]);
1204
1225
  const match = matches.find((s) => s.strategyWalletAddress.toLowerCase() === wallet.toLowerCase())
1205
1226
  ?? matches[0];
1206
1227
  if (!match || !match.id)
@@ -1227,15 +1248,21 @@ export class SenpiClient {
1227
1248
  * created and funded a second wallet beside every live one and then reported `live`. An empty
1228
1249
  * `strategies` array is still a real answer and is returned as one; anything else throws.
1229
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
+ */
1230
1257
  async listStrategies(filters, opts) {
1231
- const args = {};
1232
- if (filters?.strategyAddresses)
1258
+ const args = { paper: filters.paper };
1259
+ if (filters.strategyAddresses)
1233
1260
  args.strategy_addresses = filters.strategyAddresses;
1234
- if (filters?.status)
1261
+ if (filters.status)
1235
1262
  args.status = filters.status;
1236
- if (filters?.strategyIds)
1263
+ if (filters.strategyIds)
1237
1264
  args.strategy_ids = filters.strategyIds;
1238
- if (filters?.strategyType)
1265
+ if (filters.strategyType)
1239
1266
  args.strategy_type = filters.strategyType;
1240
1267
  const raw = await this.callTool("strategy_list", args, opts);
1241
1268
  const data = unwrapEnvelope(raw);
@@ -1245,8 +1272,18 @@ export class SenpiClient {
1245
1272
  throw new Error(`strategy_list: no strategies array in the response — the strategy list is UNKNOWN, ` +
1246
1273
  `not empty (${detail})`);
1247
1274
  }
1248
- const strategies = data.strategies;
1249
- 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) => ({
1250
1287
  id: asString(s.id) ?? "",
1251
1288
  strategyWalletAddress: asString(s.strategyWalletAddress) ?? "",
1252
1289
  traderAddress: asString(s.traderAddress) ?? "",
@@ -1286,6 +1323,35 @@ export class SenpiClient {
1286
1323
  summary: asString(data.summary) ?? "",
1287
1324
  };
1288
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
+ }
1289
1355
  async getOpenOrders(wallet) {
1290
1356
  const raw = await this.callTool("strategy_get_open_orders", { strategy_wallet: wallet });
1291
1357
  const data = unwrapEnvelope(raw);
@@ -1368,6 +1434,7 @@ export class SenpiClient {
1368
1434
  skillVersion: params.skillVersion,
1369
1435
  ...(params.facts ? { facts: params.facts } : {}),
1370
1436
  ...(params.catalog ? { catalog: params.catalog } : {}),
1437
+ ...(params.paper ? { paper: true } : {}),
1371
1438
  }, opts);
1372
1439
  const data = unwrapEnvelope(raw);
1373
1440
  if (!isRecord(data))