@senpi/runtime 3.0.32 → 3.0.34

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 (67) hide show
  1. package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
  2. package/dist/actions/close-position/close-position.action.js +2 -9
  3. package/dist/actions/close-position/close-position.action.js.map +1 -1
  4. package/dist/actions/decision-error-notification.d.ts +22 -1
  5. package/dist/actions/decision-error-notification.d.ts.map +1 -1
  6. package/dist/actions/decision-error-notification.js +22 -0
  7. package/dist/actions/decision-error-notification.js.map +1 -1
  8. package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
  9. package/dist/actions/open-position/open-position.action.js +2 -8
  10. package/dist/actions/open-position/open-position.action.js.map +1 -1
  11. package/dist/cli/guide-commands.js +3 -3
  12. package/dist/dsl/engine-client/event-mapping.d.ts.map +1 -1
  13. package/dist/dsl/engine-client/event-mapping.js +6 -0
  14. package/dist/dsl/engine-client/event-mapping.js.map +1 -1
  15. package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
  16. package/dist/dsl/monitor/process-one-position.js +2 -0
  17. package/dist/dsl/monitor/process-one-position.js.map +1 -1
  18. package/dist/dsl/notifications/formatter.d.ts +1 -6
  19. package/dist/dsl/notifications/formatter.d.ts.map +1 -1
  20. package/dist/dsl/notifications/formatter.js +0 -28
  21. package/dist/dsl/notifications/formatter.js.map +1 -1
  22. package/dist/dsl/notifications/index.d.ts +0 -2
  23. package/dist/dsl/notifications/index.d.ts.map +1 -1
  24. package/dist/dsl/notifications/index.js +33 -5
  25. package/dist/dsl/notifications/index.js.map +1 -1
  26. package/dist/dsl/notifications/stop-raise-ratchet.d.ts +76 -0
  27. package/dist/dsl/notifications/stop-raise-ratchet.d.ts.map +1 -0
  28. package/dist/dsl/notifications/stop-raise-ratchet.js +113 -0
  29. package/dist/dsl/notifications/stop-raise-ratchet.js.map +1 -0
  30. package/dist/dsl/plugin/index.d.ts.map +1 -1
  31. package/dist/dsl/plugin/index.js +0 -1
  32. package/dist/dsl/plugin/index.js.map +1 -1
  33. package/dist/dsl/plugin/options.d.ts +3 -8
  34. package/dist/dsl/plugin/options.d.ts.map +1 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +45 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/runtime/decision-errors.d.ts +7 -2
  39. package/dist/runtime/decision-errors.d.ts.map +1 -1
  40. package/dist/runtime/decision-errors.js +28 -4
  41. package/dist/runtime/decision-errors.js.map +1 -1
  42. package/dist/runtime/managed-wallet-guard.d.ts +47 -0
  43. package/dist/runtime/managed-wallet-guard.d.ts.map +1 -0
  44. package/dist/runtime/managed-wallet-guard.js +106 -0
  45. package/dist/runtime/managed-wallet-guard.js.map +1 -0
  46. package/dist/runtime/notifications.d.ts +0 -2
  47. package/dist/runtime/notifications.d.ts.map +1 -1
  48. package/dist/runtime/notifications.js +12 -19
  49. package/dist/runtime/notifications.js.map +1 -1
  50. package/dist/runtime/protection-nudge.d.ts +67 -0
  51. package/dist/runtime/protection-nudge.d.ts.map +1 -0
  52. package/dist/runtime/protection-nudge.js +244 -0
  53. package/dist/runtime/protection-nudge.js.map +1 -0
  54. package/dist/runtime/runtime.d.ts.map +1 -1
  55. package/dist/runtime/runtime.js +5 -7
  56. package/dist/runtime/runtime.js.map +1 -1
  57. package/dist/runtime/strategy-lifecycle.d.ts +18 -4
  58. package/dist/runtime/strategy-lifecycle.d.ts.map +1 -1
  59. package/dist/runtime/strategy-lifecycle.js +17 -33
  60. package/dist/runtime/strategy-lifecycle.js.map +1 -1
  61. package/dist/scripts/run-dsl-standalone-live.d.ts +2 -2
  62. package/dist/scripts/run-dsl-standalone-live.js +7 -12
  63. package/dist/scripts/run-dsl-standalone-live.js.map +1 -1
  64. package/dist/types/dsl/index.d.ts +13 -0
  65. package/dist/types/dsl/index.d.ts.map +1 -1
  66. package/openclaw.plugin.json +1 -1
  67. package/package.json +1 -1
@@ -55,10 +55,11 @@ function classifyStatus(status) {
55
55
  return "retry";
56
56
  return "drop";
57
57
  }
58
- const lastWarnedAt = new Map();
59
58
  /** Log a WARN, but suppress repeats of the same reason within {@link WARN_REPEAT_WINDOW_MS}
60
- * so a hot failure path (e.g. a sustained outage) doesn't flood the log. */
61
- function warnRateLimited(key, message, attributes) {
59
+ * so a hot failure path (e.g. a sustained outage) doesn't flood the log. The suppression
60
+ * map is passed in (owned per service instance — see {@link createNotificationService}), so
61
+ * two services with different tokens never suppress each other's WARNs. */
62
+ function warnRateLimited(lastWarnedAt, key, message, attributes) {
62
63
  const now = Date.now();
63
64
  const last = lastWarnedAt.get(key);
64
65
  if (last !== undefined && now - last < WARN_REPEAT_WINDOW_MS)
@@ -96,7 +97,7 @@ async function postOnce(ingestUrl, authToken, envelope, timeoutMs) {
96
97
  /** POST the envelope with a single bounded retry on a transient failure (5xx / network / timeout).
97
98
  * Never throws — every outcome resolves, so a delivery failure can never surface as a rejected
98
99
  * promise into the caller's (often serial, trading-critical) code path. */
99
- async function deliver(ingestUrl, authToken, envelope, timeoutMs) {
100
+ async function deliver(lastWarnedAt, ingestUrl, authToken, envelope, timeoutMs) {
100
101
  let outcome = await postOnce(ingestUrl, authToken, envelope, timeoutMs);
101
102
  for (let attempt = 2; outcome.kind === "retry" && attempt <= MAX_ATTEMPTS; attempt++) {
102
103
  outcome = await postOnce(ingestUrl, authToken, envelope, timeoutMs);
@@ -106,7 +107,7 @@ async function deliver(ingestUrl, authToken, envelope, timeoutMs) {
106
107
  const notificationId = envelope.notificationId;
107
108
  const subtype = envelope.actionMetadata?.notificationSubtype;
108
109
  const rateLimitKey = `${outcome.status ?? "network"}:${typeof subtype === "string" ? subtype : "unknown"}`;
109
- warnRateLimited(rateLimitKey, `Notification delivery dropped notificationId=${String(notificationId)} status=${outcome.status ?? "n/a"}: ${outcome.reason}`, { notificationId, status: outcome.status });
110
+ warnRateLimited(lastWarnedAt, rateLimitKey, `Notification delivery dropped notificationId=${String(notificationId)} status=${outcome.status ?? "n/a"}: ${outcome.reason}`, { notificationId, status: outcome.status });
110
111
  }
111
112
  /**
112
113
  * User-facing alert when the backend rejects orders because the strategy is
@@ -133,7 +134,6 @@ export function formatBackendPausedNotification(address) {
133
134
  * the next notification retries the transport fresh.
134
135
  */
135
136
  export function createNotificationService(options) {
136
- const mcpTransport = options?.mcpTransport;
137
137
  const ingestUrl = (options?.ingest_url || process.env.NOTIFICATIONS_INGEST_URL)?.trim();
138
138
  if (!ingestUrl) {
139
139
  throw new Error("NotificationService misconfigured: NOTIFICATIONS_INGEST_URL is not set. " +
@@ -149,6 +149,11 @@ export function createNotificationService(options) {
149
149
  "the runtime authenticates to the notification-ingest endpoint with its own Senpi token.");
150
150
  }
151
151
  const timeoutMs = options?.ingest_timeout_ms ?? DEFAULT_TIMEOUT_MS;
152
+ // Per-instance WARN suppression state. Owned by this service (not a module global)
153
+ // so sibling services don't suppress each other's WARNs, and each service's first
154
+ // delivery failure always logs — a module-global map would let one service's WARN
155
+ // rate-limit another's, and made this hard to observe/test.
156
+ const lastWarnedAt = new Map();
152
157
  // Telegram delivery is gone; a recipe still carrying telegram_chat_id from before
153
158
  // the cutover is a silent misconfiguration footgun otherwise — the operator set it
154
159
  // expecting delivery and gets nothing. Ignore it, but say so loudly once.
@@ -219,19 +224,7 @@ export function createNotificationService(options) {
219
224
  envelope.context = p.context;
220
225
  if (recipient !== undefined)
221
226
  envelope.recipientUserId = recipient;
222
- // Test-only seam: the deployed OpenClaw gateway never injects mcpTransport
223
- // for notifications, so this branch only ever runs under test. When present
224
- // it short-circuits before any HTTP call.
225
- if (mcpTransport) {
226
- try {
227
- await mcpTransport("notify", envelope);
228
- }
229
- catch (err) {
230
- logger.warn("mcpTransport notify failed", undefined, { err: describeError(err) });
231
- }
232
- return;
233
- }
234
- await deliver(ingestUrl, authToken, envelope, timeoutMs);
227
+ await deliver(lastWarnedAt, ingestUrl, authToken, envelope, timeoutMs);
235
228
  },
236
229
  };
237
230
  }
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/runtime/notifications.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/runtime/notifications.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,GAAG,YAAY,CAAC,6BAA6B,CAAC,CAAC;AAE3D;;;;GAIG;AACH,MAAM,qBAAqB,GAAG,OAAO,CAAC;AACtC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,mFAAmF;AACnF,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,gFAAgF;AAChF,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAcrC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,+BAA+B,CAAC,UAAkB;IAChE,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC;AACvD,CAAC;AAED,qFAAqF;AACrF,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAOD;;;wFAGwF;AACxF,SAAS,cAAc,CAAC,MAAc;IACpC,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,OAAO,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;2EAG2E;AAC3E,SAAS,eAAe,CACtB,YAAiC,EACjC,GAAW,EACX,OAAe,EACf,UAAoC;IAEpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,GAAG,qBAAqB;QAAE,OAAO;IACrE,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,SAAiB,EACjB,SAAiB,EACjB,QAAiC,EACjC,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,SAAS,EAAE;aACrC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAC9B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACrF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,8EAA8E;QAC9E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IACvD,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED;;2EAE2E;AAC3E,KAAK,UAAU,OAAO,CACpB,YAAiC,EACjC,SAAiB,EACjB,SAAiB,EACjB,QAAiC,EACjC,SAAiB;IAEjB,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACxE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;QACrF,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO;IAElC,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;IAC/C,MAAM,OAAO,GAAI,QAAQ,CAAC,cAAsD,EAAE,mBAAmB,CAAC;IACtG,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAC3G,eAAe,CACb,YAAY,EACZ,YAAY,EACZ,gDAAgD,MAAM,CAAC,cAAc,CAAC,WAAW,OAAO,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,EAC7H,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAC3C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAAC,OAAe;IAC7D,OAAO,CACL,0BAA0B,OAAO,2CAA2C;QAC5E,4EAA4E;QAC5E,uEAAuE;QACvE,gDAAgD,CACjD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAoC;IAC5E,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,IAAI,EAAE,CAAC;IACxF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,0EAA0E;YACxE,2EAA2E;YAC3E,+CAA+C,CAClD,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,CAChB,OAAO,EAAE,gBAAgB;QACzB,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,OAAO,CAAC,GAAG,CAAC,aAAa,CAC1B,EAAE,IAAI,EAAE,CAAC;IACV,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,oEAAoE;YAClE,yFAAyF;YACzF,yFAAyF,CAC5F,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,CAAC;IAEnE,mFAAmF;IACnF,kFAAkF;IAClF,kFAAkF;IAClF,4DAA4D;IAC5D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C,kFAAkF;IAClF,mFAAmF;IACnF,0EAA0E;IAC1E,IAAI,OAAO,OAAO,EAAE,gBAAgB,KAAK,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChG,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IAC1F,CAAC;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,eAAe,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACrD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,yEAAyE;QACzE,2EAA2E;QAC3E,qCAAqC;QACrC,MAAM,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;IAC/G,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,2CAA2C,SAAS,EAAE,CAAC,CAAC;IAEpE,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,KAAmC;YAC9C,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;YAC1B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAEhE,gEAAgE;YAChE,sEAAsE;YACtE,MAAM,SAAS,GAAG,eAAe,IAAI,CAAC,CAAC,eAAe,CAAC;YAEvD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;YAEzE,yFAAyF;YACzF,wEAAwE;YACxE,2EAA2E;YAC3E,4EAA4E;YAC5E,MAAM,cAAc,GAAG,CAAC,CAAC,OAAO,EAAE,cAAc,IAAI,UAAU,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC;YAEhD,wEAAwE;YACxE,yEAAyE;YACzE,uEAAuE;YACvE,uEAAuE;YACvE,uEAAuE;YACvE,MAAM,IAAI,GAAqB,CAAC,CAAC,IAAI,IAAI;gBACvC,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC;gBAClE,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC;gBACvE,KAAK,EAAE,OAAO;aACf,CAAC;YAEF,MAAM,QAAQ,GAA4B;gBACxC,cAAc;gBACd,OAAO;gBACP,QAAQ,EAAE,qBAAqB;gBAC/B,MAAM,EAAE,mBAAmB;gBAC3B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC3D,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,KAAK,IAAI;gBAC7C,cAAc,EAAE;oBACd,UAAU,EAAE,CAAC,cAAc,CAAC;oBAC5B,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClE,EAAE,EAAE,cAAc;oBAClB,qBAAqB,EAAE,IAAI,CAAC,SAAS;oBACrC,uBAAuB,EAAE,IAAI,CAAC,QAAQ;oBACtC,wBAAwB,EAAE,IAAI,CAAC,KAAK;oBACpC,qBAAqB,EAAE,IAAI,CAAC,KAAK;oBACjC,IAAI,EAAE,EAAE;oBACR,QAAQ,EAAE,qBAAqB;iBAChC;gBACD,0EAA0E;gBAC1E,yEAAyE;gBACzE,mEAAmE;gBACnE,cAAc,EAAE,cAAc;aAC/B,CAAC;YACF,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;gBAAE,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;YAC1D,IAAI,SAAS,KAAK,SAAS;gBAAE,QAAQ,CAAC,eAAe,GAAG,SAAS,CAAC;YAElE,MAAM,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Manual-trade protection: a `before_tool_call` gate plus a
3
+ * `tool_result_persist` nudge for agent-issued position tools on non-runtime
4
+ * (manual) wallets — the only wallets where `create_position` succeeds, since
5
+ * runtime-managed wallets are vetoed upstream by the managed-wallet guard.
6
+ *
7
+ * Gate (veto-until-protected): a manual `create_position` must carry a stop
8
+ * loss on every order, or an explicit top-level `protection: "none"` marker
9
+ * showing the agent means it. `edit_position` is gated narrowly — only an
10
+ * explicit stop-loss cancel is blocked, because the hook cannot see current
11
+ * server-side state and must not demand a stop on every edit.
12
+ *
13
+ * Nudge: after a successful `create_position`, a message is appended to the
14
+ * tool result telling the agent what protection the order carries, to attach
15
+ * `ratchet_stop_add` (server-side trailing protection that takes over driving
16
+ * the stop) unless the user opted out, and to report active protection to the
17
+ * user and offer to adjust it.
18
+ *
19
+ * The `protection` marker is stripped harmlessly by the MCP server's zod schema
20
+ * (plain `z.object`, no `.strict()`/`.passthrough()`), so it is visible to this
21
+ * hook but never reaches execution.
22
+ */
23
+ import type { Logger } from "../utils/logger.js";
24
+ /**
25
+ * Correlates the gate and the nudge across the two hook events. The
26
+ * `tool_result_persist` event carries tool identity (toolName/toolCallId) and
27
+ * the result, but NOT the call params — so the gate (which sees params) stashes
28
+ * the computed protection summary keyed by toolCallId and the nudge reads it
29
+ * back. Bounded: a `create_position` the gate allowed but whose result is never
30
+ * persisted (an aborted turn) would otherwise leak an entry forever.
31
+ */
32
+ export interface ProtectionSummaryCapture {
33
+ record(toolCallId: string, summary: string): void;
34
+ take(toolCallId: string): string | undefined;
35
+ }
36
+ export declare function createProtectionSummaryCapture(maxEntries?: number): ProtectionSummaryCapture;
37
+ export interface ProtectionGateOptions {
38
+ logger: Logger;
39
+ capture?: ProtectionSummaryCapture;
40
+ }
41
+ export interface ProtectionNudgeOptions {
42
+ logger: Logger;
43
+ capture?: ProtectionSummaryCapture;
44
+ }
45
+ /** Veto shape understood by OpenClaw's before_tool_call dispatcher. */
46
+ export interface ProtectionGateBlock {
47
+ block: true;
48
+ blockReason: string;
49
+ }
50
+ /** Result shape understood by OpenClaw's tool_result_persist dispatcher. */
51
+ export interface ProtectionNudgeResult {
52
+ message: Record<string, unknown>;
53
+ }
54
+ export type ProtectionGateHandler = (event: unknown) => Promise<ProtectionGateBlock | undefined>;
55
+ export type ProtectionNudgeHandler = (event: unknown) => ProtectionNudgeResult | undefined;
56
+ /**
57
+ * Build the `before_tool_call` gate. The hook fires on EVERY tool call, so the
58
+ * non-gated fast path is a string check only.
59
+ */
60
+ export declare function createProtectionGate(options: ProtectionGateOptions): ProtectionGateHandler;
61
+ /**
62
+ * Build the `tool_result_persist` nudge. Synchronous by contract — the host
63
+ * runs this on the transcript-append hot path and warns-and-ignores any handler
64
+ * that returns a Promise.
65
+ */
66
+ export declare function createProtectionNudge(options: ProtectionNudgeOptions): ProtectionNudgeHandler;
67
+ //# sourceMappingURL=protection-nudge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protection-nudge.d.ts","sourceRoot":"","sources":["../../src/runtime/protection-nudge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQjD;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED,wBAAgB,8BAA8B,CAAC,UAAU,SAAM,GAAG,wBAAwB,CAiBzF;AAUD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACpC;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,IAAI,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4EAA4E;AAC5E,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;AAE9C,MAAM,MAAM,sBAAsB,GAAG,CACnC,KAAK,EAAE,OAAO,KACX,qBAAqB,GAAG,SAAS,CAAC;AAwGvC;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,CAoE1F;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,sBAAsB,CAwC7F"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Manual-trade protection: a `before_tool_call` gate plus a
3
+ * `tool_result_persist` nudge for agent-issued position tools on non-runtime
4
+ * (manual) wallets — the only wallets where `create_position` succeeds, since
5
+ * runtime-managed wallets are vetoed upstream by the managed-wallet guard.
6
+ *
7
+ * Gate (veto-until-protected): a manual `create_position` must carry a stop
8
+ * loss on every order, or an explicit top-level `protection: "none"` marker
9
+ * showing the agent means it. `edit_position` is gated narrowly — only an
10
+ * explicit stop-loss cancel is blocked, because the hook cannot see current
11
+ * server-side state and must not demand a stop on every edit.
12
+ *
13
+ * Nudge: after a successful `create_position`, a message is appended to the
14
+ * tool result telling the agent what protection the order carries, to attach
15
+ * `ratchet_stop_add` (server-side trailing protection that takes over driving
16
+ * the stop) unless the user opted out, and to report active protection to the
17
+ * user and offer to adjust it.
18
+ *
19
+ * The `protection` marker is stripped harmlessly by the MCP server's zod schema
20
+ * (plain `z.object`, no `.strict()`/`.passthrough()`), so it is visible to this
21
+ * hook but never reaches execution.
22
+ */
23
+ import { baseToolName } from "./managed-wallet-guard.js";
24
+ /** Base tool name whose orders must be protected (or explicitly opted out). */
25
+ const CREATE_POSITION = "create_position";
26
+ /** Base tool name gated only against an explicit stop-loss cancel. */
27
+ const EDIT_POSITION = "edit_position";
28
+ export function createProtectionSummaryCapture(maxEntries = 256) {
29
+ const store = new Map();
30
+ return {
31
+ record(toolCallId, summary) {
32
+ if (store.size >= maxEntries) {
33
+ // Map preserves insertion order — evicting the first key drops the oldest.
34
+ const oldest = store.keys().next().value;
35
+ if (oldest !== undefined)
36
+ store.delete(oldest);
37
+ }
38
+ store.set(toolCallId, summary);
39
+ },
40
+ take(toolCallId) {
41
+ const summary = store.get(toolCallId);
42
+ if (summary !== undefined)
43
+ store.delete(toolCallId);
44
+ return summary;
45
+ },
46
+ };
47
+ }
48
+ /**
49
+ * Default shared capture, used when a factory is called with `{ logger }` only.
50
+ * Lets the gate and nudge correlate without the caller threading a capture, but
51
+ * the plugin registration passes one explicit instance to both (and tests pass
52
+ * their own) so the coupling is visible rather than global.
53
+ */
54
+ const sharedCapture = createProtectionSummaryCapture();
55
+ function asObject(value) {
56
+ return value && typeof value === "object" && !Array.isArray(value)
57
+ ? value
58
+ : undefined;
59
+ }
60
+ /** True when the base tool name (after the last `__`) equals `expected`. */
61
+ function isTool(toolName, expected) {
62
+ return typeof toolName === "string" && baseToolName(toolName.toLowerCase()) === expected;
63
+ }
64
+ /**
65
+ * True when a stop-loss value is zero — numeric `0` or a string that parses to
66
+ * it (`"0"`, `"0.0"`). Zero is the cancel sentinel (see the `edit_position`
67
+ * gate), not real protection, so both gates read it as "no stop" via this one
68
+ * helper. An empty/absent value is not zero.
69
+ */
70
+ function isZeroStop(value) {
71
+ if (value == null)
72
+ return false;
73
+ if (typeof value === "number")
74
+ return value === 0;
75
+ if (typeof value === "string")
76
+ return value.trim() !== "" && Number(value) === 0;
77
+ return false;
78
+ }
79
+ /**
80
+ * An exit object counts as a real stop loss when it carries a non-zero
81
+ * `percentage` or `price`. A zero value is the cancel sentinel (`isZeroStop`),
82
+ * not protection — so a `create_position` with `stopLoss: { percentage: 0 }` or
83
+ * `{ price: 0 }` is rejected, matching how the `edit_position` gate reads 0.
84
+ */
85
+ function hasStopLoss(order) {
86
+ const sl = asObject(order.stopLoss);
87
+ if (sl == null)
88
+ return false;
89
+ const hasPct = sl.percentage != null && !isZeroStop(sl.percentage);
90
+ const hasPrice = sl.price != null && !isZeroStop(sl.price);
91
+ return hasPct || hasPrice;
92
+ }
93
+ /** One order's protection, e.g. `#1 SL 5% TP 10%` or `#2 SL @42000`. */
94
+ function summarizeOrder(order, index) {
95
+ const sl = describeExit("SL", asObject(order.stopLoss));
96
+ const tp = describeExit("TP", asObject(order.takeProfit));
97
+ return `#${index + 1} ${sl ?? "no SL"}${tp ? ` ${tp}` : ""}`;
98
+ }
99
+ function describeExit(label, exit) {
100
+ if (!exit)
101
+ return undefined;
102
+ if (exit.percentage != null)
103
+ return `${label} ${String(exit.percentage)}%`;
104
+ if (exit.price != null)
105
+ return `${label} @${String(exit.price)}`;
106
+ return undefined;
107
+ }
108
+ function buildCreateBlockReason() {
109
+ return [
110
+ `Blocked create_position: every manual order needs a flat stop loss (a "stopLoss" with either "percentage" or "price") — the safety floor from the first fill.`,
111
+ `Resubmit with a stopLoss on each order.`,
112
+ `After the fill, attach ratchet_stop_add — server-side trailing protection that takes over driving the stop loss as price moves in your favor.`,
113
+ `Take profit ("takeProfit") is optional.`,
114
+ `If the user explicitly wants no protection, resubmit the identical call with a top-level "protection": "none".`,
115
+ ].join(" ");
116
+ }
117
+ function buildEditBlockReason() {
118
+ return [
119
+ `Blocked edit_position: this edit cancels the stop loss (stopLoss.percentage: 0), leaving the position unprotected.`,
120
+ `Keep a stop loss, or hand the stop to ratchet_stop_add for server-side trailing protection.`,
121
+ `If the user explicitly wants to remove all protection, resubmit the identical call with a top-level "protection": "none".`,
122
+ ].join(" ");
123
+ }
124
+ function buildNudge(summary) {
125
+ return [
126
+ `[senpi] Manual position opened. Protection on this order: ${summary}.`,
127
+ `A flat stop loss is only the initial safety floor — now attach server-side trailing protection: call ratchet_stop_add for this wallet so the runtime drives the stop as price moves in your favor, unless the user has explicitly opted out of protection.`,
128
+ `Then tell the user exactly what protection is active on the position and offer to adjust it.`,
129
+ ].join(" ");
130
+ }
131
+ const UNPROTECTED_SUMMARY = `explicitly unprotected (protection: "none")`;
132
+ /**
133
+ * Build the `before_tool_call` gate. The hook fires on EVERY tool call, so the
134
+ * non-gated fast path is a string check only.
135
+ */
136
+ export function createProtectionGate(options) {
137
+ const { logger, capture = sharedCapture } = options;
138
+ return async (event) => {
139
+ const ev = (event ?? {});
140
+ const gatesCreate = isTool(ev.toolName, CREATE_POSITION);
141
+ const gatesEdit = isTool(ev.toolName, EDIT_POSITION);
142
+ if (!gatesCreate && !gatesEdit) {
143
+ return undefined;
144
+ }
145
+ try {
146
+ const params = asObject(ev.params);
147
+ // Malformed/missing params: allow — the MCP server's schema owns that error.
148
+ if (!params) {
149
+ return undefined;
150
+ }
151
+ const optedOut = params.protection === "none";
152
+ const toolCallId = typeof ev.toolCallId === "string" ? ev.toolCallId : undefined;
153
+ if (gatesEdit) {
154
+ // Narrow gate: block ONLY an explicit stop-loss cancel. The hook can't
155
+ // see current server-side state, so an edit touching other fields (or a
156
+ // take-profit-only edit) must pass.
157
+ const sl = asObject(params.stopLoss);
158
+ if (sl != null && isZeroStop(sl.percentage) && !optedOut) {
159
+ logger.warn("[protection-gate] blocked edit_position stop-loss cancel without protection:none", {
160
+ toolName: ev.toolName,
161
+ });
162
+ return { block: true, blockReason: buildEditBlockReason() };
163
+ }
164
+ return undefined;
165
+ }
166
+ // create_position: require a stop loss on every order unless opted out.
167
+ const orders = Array.isArray(params.orders) ? params.orders.map(asObject) : undefined;
168
+ // Missing/empty/malformed orders: allow — the server schema owns those.
169
+ if (!orders || orders.length === 0 || orders.some((o) => o === undefined)) {
170
+ return undefined;
171
+ }
172
+ if (optedOut) {
173
+ if (toolCallId)
174
+ capture.record(toolCallId, UNPROTECTED_SUMMARY);
175
+ return undefined;
176
+ }
177
+ if (orders.some((o) => !hasStopLoss(o))) {
178
+ logger.warn("[protection-gate] blocked create_position without a stop loss on every order", {
179
+ toolName: ev.toolName,
180
+ });
181
+ return { block: true, blockReason: buildCreateBlockReason() };
182
+ }
183
+ // All orders protected: allow, and stash the per-order summary so the
184
+ // nudge (which never sees params) can report it after the fill.
185
+ if (toolCallId) {
186
+ capture.record(toolCallId, orders.map((o, i) => summarizeOrder(o, i)).join("; "));
187
+ }
188
+ return undefined;
189
+ }
190
+ catch (err) {
191
+ // Fail open: a gate error must never block a legitimate trade. (A throw
192
+ // would fail closed — the host blocks on hook errors.)
193
+ logger.warn("[protection-gate] gate check failed; allowing tool call", err, {
194
+ toolName: ev.toolName,
195
+ });
196
+ return undefined;
197
+ }
198
+ };
199
+ }
200
+ /**
201
+ * Build the `tool_result_persist` nudge. Synchronous by contract — the host
202
+ * runs this on the transcript-append hot path and warns-and-ignores any handler
203
+ * that returns a Promise.
204
+ */
205
+ export function createProtectionNudge(options) {
206
+ const { logger, capture = sharedCapture } = options;
207
+ return (event) => {
208
+ try {
209
+ const ev = (event ?? {});
210
+ // A synthetic result is a host placeholder, not a real create_position fill.
211
+ if (ev.isSynthetic === true || !isTool(ev.toolName, CREATE_POSITION)) {
212
+ return undefined;
213
+ }
214
+ const message = asObject(ev.message);
215
+ if (!message) {
216
+ return undefined;
217
+ }
218
+ // Silent on failed results: no position was opened, nothing to protect.
219
+ if (message.isError === true) {
220
+ return undefined;
221
+ }
222
+ // Append a text block to the existing content; never replace it, so the
223
+ // real tool result reaches the model intact. If content isn't an array we
224
+ // can't append safely — leave the result untouched.
225
+ const content = message.content;
226
+ if (!Array.isArray(content)) {
227
+ return undefined;
228
+ }
229
+ const toolCallId = typeof ev.toolCallId === "string" ? ev.toolCallId : undefined;
230
+ const summary = (toolCallId ? capture.take(toolCallId) : undefined) ?? "see the order you just submitted";
231
+ return {
232
+ message: {
233
+ ...message,
234
+ content: [...content, { type: "text", text: buildNudge(summary) }],
235
+ },
236
+ };
237
+ }
238
+ catch (err) {
239
+ logger.warn("[protection-nudge] nudge build failed; leaving tool result unchanged", err);
240
+ return undefined;
241
+ }
242
+ };
243
+ }
244
+ //# sourceMappingURL=protection-nudge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protection-nudge.js","sourceRoot":"","sources":["../../src/runtime/protection-nudge.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI/E,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAmCjF,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAgBrE,OAAO,KAAK,EAKV,mBAAmB,EACnB,kBAAkB,EAEnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AAgEnC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAcD,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,SAAS,CAA+B;IAEhD,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,qBAAqB,CAAsC;IACnE,6FAA6F;IAC7F,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,2FAA2F;IAC3F,OAAO,CAAC,kBAAkB,CAAC,CAAyB;IACpD,OAAO,CAAC,aAAa,CAAC,CAAmB;IACzC,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuB;IAExC,4FAA4F;IAC5F,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,kBAAkB,CAA8B;IACxD,yGAAyG;IACzG,OAAO,CAAC,sBAAsB,CAA6B;IAC3D,0GAA0G;IAC1G,OAAO,CAAC,8BAA8B,CAA6B;IACnE,0FAA0F;IAC1F,OAAO,CAAC,sBAAsB,CAA+C;IAC7E,OAAO,CAAC,mBAAmB,CAAuC;IAClE,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,mBAAmB,CAAuB;IAElD,kGAAkG;IAClG,OAAO,CAAC,oBAAoB,CAA8E;IAE1G,4FAA4F;IAC5F,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,uGAAuG;IACvG,OAAO,CAAC,oBAAoB,CAAgC;IAE5D,kGAAkG;IAClG,OAAO,CAAC,uBAAuB,CAA6B;IAC5D,kGAAkG;IAClG,OAAO,CAAC,sBAAsB,CAA6B;IAG3D,0EAA0E;IAC1E,OAAO,CAAC,cAAc,CAAgC;IACtD,yFAAyF;IACzF,OAAO,CAAC,aAAa,CAAmF;IACxG,4FAA4F;IAC5F,OAAO,CAAC,gBAAgB,CAAS;IACjC,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB,CAA8C;IACzE,+IAA+I;IAC/I,OAAO,CAAC,cAAc,CAAuB;IAC7C,wEAAwE;IACxE,OAAO,CAAC,mBAAmB,CAAK;IAEhC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAElC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc;IAK1D,IAAI,GAAG,IAAI,cAAc,GAAG,IAAI,CAE/B;IAEK,eAAe,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAItD,cAAc,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAI1D;;;OAGG;IACH,sBAAsB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI3E,wEAAwE;IACxE,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAI5F,sDAAsD;IACtD,yBAAyB,CACvB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,wBAAwB,GAC9B,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAInC;;;;;;;;;OASG;IACG,yBAAyB,CAC7B,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC;IAQvC;;;;;OAKG;IACI,mBAAmB,IAAI,MAAM;IAIpC;;;;;;;;;;;OAWG;IACI,aAAa,IAAI,MAAM,GAAG,IAAI;IAIrC;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,UAAU,CACrB,IAAI,EAAE,cAAc,EACpB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAC9B,OAAO,CAAC,gBAAgB,CAAC;IAkC5B;;;OAGG;YACW,2BAA2B;IASzC;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAqB1B,qGAAqG;IACrG,OAAO,CAAC,uBAAuB;IAS/B;;;;;OAKG;YACW,iBAAiB;IA6CzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsc5B;;OAEG;IACH,uEAAuE;IACjE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAStD,0FAA0F;IACpF,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpD;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;YACW,iBAAiB;IAyI/B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;;OAIG;YACW,oBAAoB;IAiElC;;;OAGG;YACW,kBAAkB;IAc1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA4D5B"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
@@ -434,9 +434,11 @@ export class Runtime {
434
434
  const llmDecision = createLlmDecision({});
435
435
  const contextBuilder = createContextBuilder();
436
436
  const notifications = createNotificationService({
437
+ // A config-provided senpi_auth_token wins; when absent, createNotificationService
438
+ // resolves the token itself from apiKey/SENPI_AUTH_TOKEN/SENPI_API_KEY. Do NOT set
439
+ // senpi_auth_token here — spread after the config, it would clobber a config token.
440
+ senpi_auth_token: this.options.apiKey,
437
441
  ...this.config.notifications,
438
- mcpTransport: this.options.mcpTransport,
439
- senpi_auth_token: this.options.apiKey ?? process.env.SENPI_AUTH_TOKEN ?? process.env.SENPI_API_KEY,
440
442
  });
441
443
  const riskBlock = this.config.risk;
442
444
  const strategyAddress = this.strategyConfig.address;
@@ -526,10 +528,7 @@ export class Runtime {
526
528
  })();
527
529
  // Build strategyStates map once — shared by DslPlugin and the reconcile loop.
528
530
  const strategyStatesMap = createStrategyStatesMap(this.strategyConfig, senpi);
529
- const notificationsConfig = this.config.notifications;
530
531
  if (hasDsl) {
531
- const dslNotificationsDisabled = notificationsConfig?.dsl_lifecycle === false;
532
- const dslNotifySlUpdates = notificationsConfig?.dsl_notify_sl_updates !== false;
533
532
  this.dslPlugin = await DslPluginClass.create({
534
533
  config: exitConfig,
535
534
  bus: this.bus,
@@ -537,8 +536,7 @@ export class Runtime {
537
536
  stateManager: this.stateManager,
538
537
  senpiClient: senpi,
539
538
  strategyStates: strategyStatesMap,
540
- notifications: dslNotificationsDisabled ? undefined : notifications,
541
- notifySlUpdates: dslNotifySlUpdates,
539
+ notifications,
542
540
  strategyName: notificationLabel,
543
541
  // Monitor runs the unified periodic reconcile (adopt/resize/gone), serialized
544
542
  // against the trade loop on the same reconcileMutex key, and can resolve the boot gate.