@senpi/runtime 1.0.95-dev.20260409191205 → 1.0.95-dev.20260414143617

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 (105) 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 +7 -2
  3. package/dist/actions/close-position/close-position.action.js.map +1 -1
  4. package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
  5. package/dist/actions/open-position/open-position.action.js +9 -3
  6. package/dist/actions/open-position/open-position.action.js.map +1 -1
  7. package/dist/cli/guide-commands.d.ts.map +1 -1
  8. package/dist/cli/guide-commands.js +28 -11
  9. package/dist/cli/guide-commands.js.map +1 -1
  10. package/dist/constants/order-types.d.ts +7 -0
  11. package/dist/constants/order-types.d.ts.map +1 -0
  12. package/dist/constants/order-types.js +6 -0
  13. package/dist/constants/order-types.js.map +1 -0
  14. package/dist/dsl/config/exit-block.d.ts +7 -1
  15. package/dist/dsl/config/exit-block.d.ts.map +1 -1
  16. package/dist/dsl/config/parse-plugin-config.d.ts.map +1 -1
  17. package/dist/dsl/config/parse-plugin-config.js +27 -2
  18. package/dist/dsl/config/parse-plugin-config.js.map +1 -1
  19. package/dist/dsl/config/unknown-keys.d.ts.map +1 -1
  20. package/dist/dsl/config/unknown-keys.js +3 -2
  21. package/dist/dsl/config/unknown-keys.js.map +1 -1
  22. package/dist/dsl/engine/tick.d.ts.map +1 -1
  23. package/dist/dsl/engine/tick.js +5 -4
  24. package/dist/dsl/engine/tick.js.map +1 -1
  25. package/dist/dsl/engine-client/client.d.ts.map +1 -1
  26. package/dist/dsl/engine-client/client.js +0 -4
  27. package/dist/dsl/engine-client/client.js.map +1 -1
  28. package/dist/dsl/engine-client/event-mapping.d.ts +6 -3
  29. package/dist/dsl/engine-client/event-mapping.d.ts.map +1 -1
  30. package/dist/dsl/engine-client/event-mapping.js +34 -18
  31. package/dist/dsl/engine-client/event-mapping.js.map +1 -1
  32. package/dist/dsl/monitor/create-monitor.d.ts +4 -0
  33. package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
  34. package/dist/dsl/monitor/create-monitor.js +3 -1
  35. package/dist/dsl/monitor/create-monitor.js.map +1 -1
  36. package/dist/dsl/monitor/process-one-position.d.ts +4 -0
  37. package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
  38. package/dist/dsl/monitor/process-one-position.js +11 -5
  39. package/dist/dsl/monitor/process-one-position.js.map +1 -1
  40. package/dist/dsl/plugin/index.d.ts.map +1 -1
  41. package/dist/dsl/plugin/index.js +4 -5
  42. package/dist/dsl/plugin/index.js.map +1 -1
  43. package/dist/risk/guardrail.types.d.ts +86 -0
  44. package/dist/risk/guardrail.types.d.ts.map +1 -0
  45. package/dist/risk/guardrail.types.js +5 -0
  46. package/dist/risk/guardrail.types.js.map +1 -0
  47. package/dist/risk/index.d.ts +4 -4
  48. package/dist/risk/index.d.ts.map +1 -1
  49. package/dist/risk/index.js +3 -6
  50. package/dist/risk/index.js.map +1 -1
  51. package/dist/risk/risk-audit-log.d.ts +36 -0
  52. package/dist/risk/risk-audit-log.d.ts.map +1 -0
  53. package/dist/risk/risk-audit-log.js +101 -0
  54. package/dist/risk/risk-audit-log.js.map +1 -0
  55. package/dist/risk/risk-guard-helper.d.ts +14 -0
  56. package/dist/risk/risk-guard-helper.d.ts.map +1 -0
  57. package/dist/risk/risk-guard-helper.js +20 -0
  58. package/dist/risk/risk-guard-helper.js.map +1 -0
  59. package/dist/runtime/map-exit-config.d.ts.map +1 -1
  60. package/dist/runtime/map-exit-config.js +0 -3
  61. package/dist/runtime/map-exit-config.js.map +1 -1
  62. package/dist/runtime/map-strategies.d.ts.map +1 -1
  63. package/dist/runtime/map-strategies.js +28 -0
  64. package/dist/runtime/map-strategies.js.map +1 -1
  65. package/dist/runtime/risk-guard.d.ts +18 -2
  66. package/dist/runtime/risk-guard.d.ts.map +1 -1
  67. package/dist/runtime/risk-guard.js +229 -5
  68. package/dist/runtime/risk-guard.js.map +1 -1
  69. package/dist/runtime/runtime-schema.d.ts +473 -18
  70. package/dist/runtime/runtime-schema.d.ts.map +1 -1
  71. package/dist/runtime/runtime-schema.js +19 -1
  72. package/dist/runtime/runtime-schema.js.map +1 -1
  73. package/dist/runtime/runtime.d.ts.map +1 -1
  74. package/dist/runtime/runtime.js +16 -2
  75. package/dist/runtime/runtime.js.map +1 -1
  76. package/dist/senpi/client.d.ts +40 -0
  77. package/dist/senpi/client.d.ts.map +1 -1
  78. package/dist/senpi/client.js +64 -0
  79. package/dist/senpi/client.js.map +1 -1
  80. package/dist/senpi/types.d.ts +27 -0
  81. package/dist/senpi/types.d.ts.map +1 -1
  82. package/dist/strategy/strategy-state.d.ts +4 -1
  83. package/dist/strategy/strategy-state.d.ts.map +1 -1
  84. package/dist/strategy/strategy-state.js +7 -2
  85. package/dist/strategy/strategy-state.js.map +1 -1
  86. package/dist/types/action.d.ts +6 -1
  87. package/dist/types/action.d.ts.map +1 -1
  88. package/dist/types/dsl/index.d.ts +3 -1
  89. package/dist/types/dsl/index.d.ts.map +1 -1
  90. package/dist/types/strategy.d.ts +8 -2
  91. package/dist/types/strategy.d.ts.map +1 -1
  92. package/dist/utils/resolve-order-type.d.ts +5 -0
  93. package/dist/utils/resolve-order-type.d.ts.map +1 -0
  94. package/dist/utils/resolve-order-type.js +29 -0
  95. package/dist/utils/resolve-order-type.js.map +1 -0
  96. package/examples/strategies/dsl-showcase.yaml +6 -0
  97. package/examples/strategies/dsl.yaml +4 -0
  98. package/examples/strategies/fox-minimal-loosened.yaml +16 -0
  99. package/examples/strategies/fox-minimal.yaml +17 -1
  100. package/examples/strategies/minimal.yaml +4 -0
  101. package/examples/strategies/risk-showcase.yaml +94 -0
  102. package/examples/strategies/viper.yaml +9 -0
  103. package/examples/strategies/wolf.yaml +9 -0
  104. package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +10 -1
  105. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/risk/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uEAAuE;AAEvE,MAAM,UAAU,QAAQ,CAAC,IAAmG;IAC1H,0BAA0B;AAC5B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/risk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAI/D,6DAA6D;AAC7D,MAAM,UAAU,QAAQ,CAAC,IAAmG;IAC1H,mDAAmD;AACrD,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Risk Audit Log: append-only JSONL log and daily snapshots for risk state history.
3
+ * Files live in stateDir alongside the live risk state.
4
+ */
5
+ import type { TradeCounter, GateStatus } from "./guardrail.types.js";
6
+ export interface RiskAuditEntry {
7
+ ts: string;
8
+ event: "gate_check" | "guardian_tick" | "entry_recorded" | "gate_changed" | "day_rollover";
9
+ address: string;
10
+ counter?: TradeCounter;
11
+ evaluations?: Array<{
12
+ guardrail: string;
13
+ result: "pass" | "CLOSED" | "COOLDOWN";
14
+ reason?: string;
15
+ }>;
16
+ meta?: Record<string, unknown>;
17
+ }
18
+ export interface DailySnapshot {
19
+ date: string;
20
+ address: string;
21
+ finalCounter: TradeCounter;
22
+ summary: {
23
+ totalEntries: number;
24
+ totalClosedTrades: number;
25
+ dailyRealizedPnl: number;
26
+ peakAccountValue: number;
27
+ finalGate: GateStatus;
28
+ };
29
+ }
30
+ export interface RiskAuditLog {
31
+ append(entry: RiskAuditEntry): Promise<void>;
32
+ writeDailySnapshot(address: string, counter: TradeCounter): Promise<void>;
33
+ pruneOldFiles(addresses: string[], dataRetentionHours: number): Promise<void>;
34
+ }
35
+ export declare function createRiskAuditLog(stateDir: string): RiskAuditLog;
36
+ //# sourceMappingURL=risk-audit-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-audit-log.d.ts","sourceRoot":"","sources":["../../src/risk/risk-audit-log.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIrE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,GAAG,eAAe,GAAG,gBAAgB,GAAG,cAAc,GAAG,cAAc,CAAC;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;QACvC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,SAAS,EAAE,UAAU,CAAC;KACvB,CAAC;CACH;AAUD,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CA0FjE"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Risk Audit Log: append-only JSONL log and daily snapshots for risk state history.
3
+ * Files live in stateDir alongside the live risk state.
4
+ */
5
+ import { appendFile, writeFile, readdir, stat, unlink, rename } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { createLogger } from "../utils/logger.js";
8
+ const logger = createLogger("[risk][audit-log]");
9
+ function auditLogPath(stateDir, address) {
10
+ return join(stateDir, `risk-audit-${address}.jsonl`);
11
+ }
12
+ function snapshotPath(stateDir, address, date) {
13
+ return join(stateDir, `risk-snapshot-${address}-${date}.json`);
14
+ }
15
+ export function createRiskAuditLog(stateDir) {
16
+ return {
17
+ async append(entry) {
18
+ try {
19
+ const path = auditLogPath(stateDir, entry.address);
20
+ const line = JSON.stringify(entry) + "\n";
21
+ await appendFile(path, line, "utf-8");
22
+ }
23
+ catch (err) {
24
+ logger.warn("Failed to append audit log entry", { address: entry.address, err });
25
+ }
26
+ },
27
+ async writeDailySnapshot(address, counter) {
28
+ try {
29
+ const snapshot = {
30
+ date: counter.date,
31
+ address,
32
+ finalCounter: { ...counter },
33
+ summary: {
34
+ totalEntries: counter.entries,
35
+ totalClosedTrades: counter.closedTrades,
36
+ dailyRealizedPnl: counter.dailyRealizedPnl,
37
+ peakAccountValue: counter.peakAccountValue,
38
+ finalGate: counter.gate,
39
+ },
40
+ };
41
+ const path = snapshotPath(stateDir, address, counter.date);
42
+ await writeFile(path, JSON.stringify(snapshot, null, 2), "utf-8");
43
+ }
44
+ catch (err) {
45
+ logger.warn("Failed to write daily snapshot", { address, err });
46
+ }
47
+ },
48
+ async pruneOldFiles(addresses, dataRetentionHours) {
49
+ try {
50
+ const cutoffMs = Date.now() - dataRetentionHours * 3600000;
51
+ const retentionDays = Math.max(1, Math.ceil(dataRetentionHours / 24));
52
+ const cutoffDate = new Date(Date.now() - retentionDays * 86400000)
53
+ .toISOString()
54
+ .slice(0, 10);
55
+ const files = await readdir(stateDir).catch(() => []);
56
+ for (const file of files) {
57
+ const fullPath = join(stateDir, file);
58
+ // Prune archived JSONL files
59
+ if (file.endsWith(".jsonl.archived")) {
60
+ try {
61
+ const fileStat = await stat(fullPath);
62
+ if (fileStat.mtimeMs < cutoffMs) {
63
+ await unlink(fullPath);
64
+ }
65
+ }
66
+ catch { /* ignore */ }
67
+ continue;
68
+ }
69
+ // Rotate active JSONL if too old
70
+ for (const addr of addresses) {
71
+ if (file === `risk-audit-${addr}.jsonl`) {
72
+ try {
73
+ const fileStat = await stat(fullPath);
74
+ if (fileStat.mtimeMs < cutoffMs) {
75
+ const archivedPath = join(stateDir, `risk-audit-${addr}-${Date.now()}.jsonl.archived`);
76
+ await rename(fullPath, archivedPath);
77
+ }
78
+ }
79
+ catch { /* ignore */ }
80
+ }
81
+ }
82
+ // Prune old daily snapshots
83
+ const snapshotMatch = file.match(/^risk-snapshot-.+-(\d{4}-\d{2}-\d{2})\.json$/);
84
+ if (snapshotMatch) {
85
+ const snapshotDate = snapshotMatch[1];
86
+ if (snapshotDate < cutoffDate) {
87
+ try {
88
+ await unlink(fullPath);
89
+ }
90
+ catch { /* ignore */ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ catch (err) {
96
+ logger.warn("Failed to prune audit files", { err });
97
+ }
98
+ },
99
+ };
100
+ }
101
+ //# sourceMappingURL=risk-audit-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-audit-log.js","sourceRoot":"","sources":["../../src/risk/risk-audit-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Risk Guard Helper: thin wrapper over RiskGuard with gate + risk data read methods.
3
+ */
4
+ import type { GateCheckResult, RiskGuard } from "../types/action.js";
5
+ export interface RiskGuardHelper {
6
+ checkGate(address: string, opts?: {
7
+ candidateAsset?: string;
8
+ }): Promise<GateCheckResult>;
9
+ isOpen(address: string): Promise<boolean>;
10
+ getGateForStrategies(addresses: string[]): Promise<Record<string, GateCheckResult>>;
11
+ getGateStatus(address: string): Promise<GateCheckResult>;
12
+ }
13
+ export declare function createRiskGuardHelper(riskGuard: RiskGuard): RiskGuardHelper;
14
+ //# sourceMappingURL=risk-guard-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-guard-helper.d.ts","sourceRoot":"","sources":["../../src/risk/risk-guard-helper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACzF,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IACpF,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC1D;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe,CAe3E"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Risk Guard Helper: thin wrapper over RiskGuard with gate + risk data read methods.
3
+ */
4
+ export function createRiskGuardHelper(riskGuard) {
5
+ return {
6
+ async checkGate(address, opts) {
7
+ return riskGuard.checkGate(address, opts);
8
+ },
9
+ async isOpen(address) {
10
+ return (await riskGuard.checkGate(address)).gate === "OPEN";
11
+ },
12
+ async getGateForStrategies(addresses) {
13
+ return riskGuard.getGateForStrategies(addresses);
14
+ },
15
+ async getGateStatus(address) {
16
+ return riskGuard.checkGate(address);
17
+ },
18
+ };
19
+ }
20
+ //# sourceMappingURL=risk-guard-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-guard-helper.js","sourceRoot":"","sources":["../../src/risk/risk-guard-helper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,UAAU,qBAAqB,CAAC,SAAoB;IACxD,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,IAAkC;YACjE,OAAO,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,OAAe;YAC1B,OAAO,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;QAC9D,CAAC;QACD,KAAK,CAAC,oBAAoB,CAAC,SAAmB;YAC5C,OAAO,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,OAAe;YACjC,OAAO,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"map-exit-config.d.ts","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA4FvD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,eAAe,CAuBxF"}
1
+ {"version":3,"file":"map-exit-config.d.ts","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA4FvD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,eAAe,CAoBxF"}
@@ -69,21 +69,18 @@ export function mapRuntimeExitToDslConfig(exit) {
69
69
  validateRawExitBlockAndPresetsUnknownKeys(exit);
70
70
  }
71
71
  const rawExit = exit;
72
- const backendHandoffEnabled = rawExit?.backend_handoff_enabled === true;
73
72
  const dslPresetSingle = rawExit?.dsl_preset;
74
73
  if (dslPresetSingle != null && typeof dslPresetSingle === "object" && !Array.isArray(dslPresetSingle)) {
75
74
  const built = buildPreset(dslPresetSingle);
76
75
  return {
77
76
  interval_seconds: exit?.interval_seconds ?? 30,
78
77
  ...(exit?.engine != null && { engine: exit.engine }),
79
- ...(backendHandoffEnabled && { backend_handoff_enabled: true }),
80
78
  dsl_preset: built,
81
79
  };
82
80
  }
83
81
  return {
84
82
  interval_seconds: exit?.interval_seconds ?? 30,
85
83
  ...(exit?.engine != null && { engine: exit.engine }),
86
- ...(backendHandoffEnabled && { backend_handoff_enabled: true }),
87
84
  };
88
85
  }
89
86
  //# sourceMappingURL=map-exit-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-exit-config.js","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,yCAAyC,EAAE,MAAM,+BAA+B,CAAC;AAgC1F,SAAS,gBAAgB,CAAC,MAA+B;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAA6C,CAAC;IACpE,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACjF,OAAO,MAAM,CAAC,YAAY,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,MAA+B;IAClD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC;YAC/C,WAAW,EAAG,CAA6B,CAAC,WAAiC;YAC7E,UAAU,EAAG,CAA6B,CAAC,UAAgC;YAC3E,WAAW,EAAG,CAA6B,CAAC,WAAiC;YAC7E,SAAS,EAAG,CAA6B,CAAC,SAA+B;SAC1E,CAAC,CAAC,CAAC;IACN,CAAC;IACD,IAAI,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,MAA6C,CAAC;IACvE,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,IAAI,SAAS,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QACpF,OAAO,GAAG,CAAC,CAAC;IACd,CAAC;IACD,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,uJAAuJ,CACxJ,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC;IAC9B,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAiC,CAAC;QACxD,MAAM,CAAC,MAAM,GAAG;YACd,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,6BAA6B,EAAE,MAAM,CAAC,6BAAmD;YACzF,2BAA2B,EAAE,MAAM,CAAC,2BAAiD;YACrF,YAAY,EAAE,MAAM,CAAC,YAAkC;YACvD,iBAAiB,EAAE,MAAM,CAAC,iBAAuC;YACjE,gBAAgB,EAAE,MAAM,CAAC,gBAAsC;SAChE,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAiC,CAAC;QACpD,MAAM,CAAC,MAAM,GAAG;YACd,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,KAAuD,CAAC,CAAC,CAAC,SAAS;SACzG,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACnE,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAA6C,CAAC;IAC7E,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QACrE,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,aAA+C,CAAC;IAChF,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;QACzE,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,eAAmD,CAAC;IACtF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAA6B;IACrE,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7C,yCAAyC,CAAC,IAA+B,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,OAAO,GAAG,IAA2C,CAAC;IAC5D,MAAM,qBAAqB,GAAG,OAAO,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACxE,MAAM,eAAe,GAAG,OAAO,EAAE,UAAU,CAAC;IAC5C,IAAI,eAAe,IAAI,IAAI,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACtG,MAAM,KAAK,GAAG,WAAW,CAAC,eAA0C,CAAC,CAAC;QACtE,OAAO;YACL,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,EAAE;YAC9C,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACpD,GAAG,CAAC,qBAAqB,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC;YAC/D,UAAU,EAAE,KAAsC;SACnD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,EAAE;QAC9C,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACpD,GAAG,CAAC,qBAAqB,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"map-exit-config.js","sourceRoot":"","sources":["../../src/runtime/map-exit-config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"map-strategies.d.ts","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAgBzD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,aAAa,GAAG,cAAc,CAsDjF;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAG9F"}
1
+ {"version":3,"file":"map-strategies.d.ts","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAgBzD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,aAAa,GAAG,cAAc,CAsFjF;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAG9F"}
@@ -34,6 +34,10 @@ export function resolveStrategyConfig(recipeConfig) {
34
34
  slots: coerceNumber(entry.slots) || 1,
35
35
  tradingRisk,
36
36
  };
37
+ const rawBudget = entry.budget;
38
+ if (typeof rawBudget === "number" && Number.isFinite(rawBudget)) {
39
+ strategyConfig.budget = rawBudget;
40
+ }
37
41
  if (typeof entry.margin_per_slot === "number" || (typeof entry.margin_per_slot === "string" && entry.margin_per_slot !== "")) {
38
42
  strategyConfig.marginPerSlot = coerceNumber(entry.margin_per_slot);
39
43
  }
@@ -68,6 +72,30 @@ export function resolveStrategyConfig(recipeConfig) {
68
72
  if (typeof entry.enabled === "boolean") {
69
73
  strategyConfig.enabled = entry.enabled;
70
74
  }
75
+ const riskBlock = recipeConfig.risk;
76
+ if (riskBlock?.guard_rails) {
77
+ const gr = riskBlock.guard_rails;
78
+ const budget = strategyConfig.budget;
79
+ strategyConfig.guardRails = {
80
+ dailyLossLimit: typeof gr.daily_loss_limit_pct === "number" &&
81
+ typeof budget === "number" &&
82
+ Number.isFinite(budget)
83
+ ? (gr.daily_loss_limit_pct / 100) * budget
84
+ : undefined,
85
+ dailyLossLimitPct: gr.daily_loss_limit_pct,
86
+ maxEntriesPerDay: gr.max_entries_per_day ?? 8,
87
+ bypassMaxEntriesPerDayOnProfit: gr.bypass_max_entries_per_day_on_profit ?? false,
88
+ maxConsecutiveLosses: gr.max_consecutive_losses ?? 3,
89
+ cooldownMinutes: gr.cooldown_minutes ?? 60,
90
+ drawdownHaltPct: gr.drawdown_halt_pct,
91
+ drawdownResetOnDayRollover: gr.drawdown_reset_on_day_rollover ?? false,
92
+ perAssetCooldownMinutes: gr.per_asset_cooldown_minutes,
93
+ };
94
+ if (typeof strategyConfig.guardRails.dailyLossLimit === "number") {
95
+ strategyConfig.dailyLossLimit = strategyConfig.guardRails.dailyLossLimit;
96
+ }
97
+ strategyConfig.dataRetentionHours = Math.min(168, Math.max(1, riskBlock.data_retention_hours ?? 48));
98
+ }
71
99
  return strategyConfig;
72
100
  }
73
101
  /** @deprecated Use resolveStrategyConfig instead. */
@@ -1 +1 @@
1
- {"version":3,"file":"map-strategies.js","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,MAAM,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAE7D,MAAM,mBAAmB,GAAkB,CAAC,cAAc,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAEtF,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAA2B;IAC/D,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,MAAM,WAAW,GAAgB,mBAAmB,CAAC,QAAQ,CAAC,OAAsB,CAAC;QACnF,CAAC,CAAE,OAAuB;QAC1B,CAAC,CAAC,UAAU,CAAC;IACf,MAAM,cAAc,GAAmB;QACrC,OAAO;QACP,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACrC,WAAW;KACZ,CAAC;IACF,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,CAAC,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,KAAK,CAAC,eAAe,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7H,cAAc,CAAC,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACzC,cAAc,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;IAC9C,CAAC;IACD,IAAI,cAAc,CAAC,SAAS,IAAI,IAAI,IAAI,cAAc,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;QAC7E,MAAM,CAAC,IAAI,CACT,8GAA8G,CAC/G,CAAC;IACJ,CAAC;IACD,IAAI,cAAc,CAAC,SAAS,IAAI,IAAI,IAAI,cAAc,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC;QACjE,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CACT,eAAe,cAAc,CAAC,SAAS,eAAe,cAAc,CAAC,KAAK,OAAO,QAAQ,wBAAwB;gBACjH,wEAAwE,CACzE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAC/C,cAAc,CAAC,eAAe,GAAG,KAAK,CAAC,gBAAgB,CAAC;IAC1D,CAAC;IACD,IAAI,KAAK,CAAC,oBAAoB,IAAI,IAAI,IAAI,OAAO,KAAK,CAAC,oBAAoB,KAAK,QAAQ,EAAE,CAAC;QACzF,MAAM,EAAE,GAAG,KAAK,CAAC,oBAA+C,CAAC;QACjE,MAAM,WAAW,GAAyC,EAAE,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,IAAI,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAChC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAW,CAAC;YACvC,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,cAAc,CAAC,mBAAmB,GAAG,WAAW,CAAC;QACnD,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACvC,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IACzC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,qBAAqB,CAAC,YAA2B;IAC/D,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACnD,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"map-strategies.js","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,22 @@
1
1
  /**
2
- * RiskGuard: gate check and record entry (stub - gate always OPEN, record no-op).
2
+ * RiskGuard: real-time stateless gate evaluation via MCP API calls.
3
+ *
4
+ * All gate decisions are made in real-time — no cached state reads.
5
+ * Every checkGate call logs the decision to the audit log (write-only).
6
+ * If any risk API call fails, the gate is CLOSED (fail-closed).
3
7
  */
4
8
  import type { RiskGuard as IRiskGuard } from "../types/action.js";
5
- export declare function createRiskGuard(): IRiskGuard;
9
+ import type { NotificationService } from "../types/notification.js";
10
+ import type { StrategyConfig } from "../types/strategy.js";
11
+ import type { SenpiClient } from "../senpi/client.js";
12
+ import type { RiskAuditLog } from "../risk/risk-audit-log.js";
13
+ export declare function createRiskGuardStub(): IRiskGuard;
14
+ export interface RiskGuardConfig {
15
+ senpi: SenpiClient;
16
+ notifications: NotificationService;
17
+ strategies: Map<string, StrategyConfig>;
18
+ strategyNames?: Record<string, string>;
19
+ auditLog?: RiskAuditLog;
20
+ }
21
+ export declare function createRiskGuard(config: RiskGuardConfig): IRiskGuard;
6
22
  //# sourceMappingURL=risk-guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"risk-guard.d.ts","sourceRoot":"","sources":["../../src/runtime/risk-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAmB,SAAS,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEnF,wBAAgB,eAAe,IAAI,UAAU,CAS5C"}
1
+ {"version":3,"file":"risk-guard.d.ts","sourceRoot":"","sources":["../../src/runtime/risk-guard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAmB,SAAS,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAI9D,wBAAgB,mBAAmB,IAAI,UAAU,CAYhD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,EAAE,mBAAmB,CAAC;IACnC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAcD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,UAAU,CAoOnE"}
@@ -1,13 +1,237 @@
1
1
  /**
2
- * RiskGuard: gate check and record entry (stub - gate always OPEN, record no-op).
2
+ * RiskGuard: real-time stateless gate evaluation via MCP API calls.
3
+ *
4
+ * All gate decisions are made in real-time — no cached state reads.
5
+ * Every checkGate call logs the decision to the audit log (write-only).
6
+ * If any risk API call fails, the gate is CLOSED (fail-closed).
3
7
  */
4
- export function createRiskGuard() {
8
+ import { isRecord } from "../utils/response.js";
9
+ import { createLogger } from "../utils/logger.js";
10
+ const logger = createLogger("[runtime][risk-guard]");
11
+ export function createRiskGuardStub() {
5
12
  return {
6
- checkGate(_address, _guardRails) {
13
+ async checkGate() {
7
14
  return { gate: "OPEN" };
8
15
  },
9
- recordEntry(_address, _guardRails) {
10
- // no-op
16
+ recordEntry() { },
17
+ async getGateForStrategies(addresses) {
18
+ const out = {};
19
+ for (const addr of addresses)
20
+ out[addr] = { gate: "OPEN" };
21
+ return out;
22
+ },
23
+ };
24
+ }
25
+ /**
26
+ * Extract a verdict boolean from an MCP response envelope.
27
+ * Returns the parsed data object if success=true, or null on failure.
28
+ */
29
+ function extractVerdict(raw) {
30
+ if (!isRecord(raw))
31
+ return null;
32
+ const envelope = raw;
33
+ if (envelope.success === false)
34
+ return null;
35
+ const data = isRecord(envelope.data) ? envelope.data : envelope;
36
+ return data;
37
+ }
38
+ export function createRiskGuard(config) {
39
+ const prevGateState = new Map();
40
+ function strategyKey(address) {
41
+ return config.strategyNames?.[address] ?? `${address.slice(0, 6)}...${address.slice(-4)}`;
42
+ }
43
+ async function logAndNotify(address, result, candidateAsset) {
44
+ const sk = strategyKey(address);
45
+ const curr = `${result.gate}:${result.reason ?? ""}`;
46
+ const prev = prevGateState.get(address);
47
+ if (result.gate !== "OPEN") {
48
+ logger.info("RiskGuard checkGate: gate not OPEN", {
49
+ address: sk,
50
+ gate: result.gate,
51
+ reason: result.reason,
52
+ candidateAsset,
53
+ });
54
+ }
55
+ if (prev !== curr) {
56
+ prevGateState.set(address, curr);
57
+ if (result.gate === "CLOSED") {
58
+ config.notifications.notify(`GATE CLOSED [${sk}]: ${result.reason ?? "unknown"}`).catch(() => { });
59
+ }
60
+ else if (result.gate === "COOLDOWN") {
61
+ config.notifications.notify(`GATE COOLDOWN [${sk}]: ${result.reason ?? "unknown"}`).catch(() => { });
62
+ }
63
+ else if (prev && (prev.startsWith("CLOSED") || prev.startsWith("COOLDOWN"))) {
64
+ config.notifications.notify(`GATE OPEN [${sk}]: previous gate cleared`).catch(() => { });
65
+ }
66
+ }
67
+ if (config.auditLog) {
68
+ await config.auditLog.append({
69
+ ts: new Date().toISOString(),
70
+ event: "gate_check",
71
+ address,
72
+ meta: {
73
+ gate: result.gate,
74
+ reason: result.reason ?? null,
75
+ candidateAsset: candidateAsset ?? null,
76
+ },
77
+ }).catch(() => { });
78
+ }
79
+ }
80
+ /**
81
+ * Evaluate all risk gates in real-time via MCP API calls.
82
+ * Gates are evaluated in order; first CLOSED/COOLDOWN short-circuits.
83
+ * If candidateAsset is provided, per-asset cooldown is also checked.
84
+ */
85
+ async function checkGate(address, opts) {
86
+ const guardRails = config.strategies.get(address)?.guardRails;
87
+ if (!guardRails) {
88
+ return { gate: "OPEN" };
89
+ }
90
+ const { senpi } = config;
91
+ const candidateAsset = opts?.candidateAsset;
92
+ // Gate 1: Daily loss halt + Drawdown halt (via risk snapshot)
93
+ const hasLossLimit = (guardRails.dailyLossLimit != null && guardRails.dailyLossLimit > 0)
94
+ || (guardRails.dailyLossLimitPct != null && guardRails.dailyLossLimitPct > 0);
95
+ const hasDrawdown = guardRails.drawdownHaltPct != null && guardRails.drawdownHaltPct > 0;
96
+ if (hasLossLimit || hasDrawdown) {
97
+ try {
98
+ const raw = await senpi.getDailyRiskSnapshot(address, {
99
+ dailyLossLimitUsd: guardRails.dailyLossLimit,
100
+ dailyLossLimitPct: guardRails.dailyLossLimitPct,
101
+ maxDrawdownPct: guardRails.drawdownHaltPct,
102
+ drawdownResetOnDayRollover: guardRails.drawdownResetOnDayRollover,
103
+ });
104
+ const data = extractVerdict(raw);
105
+ if (!data) {
106
+ const result = { gate: "CLOSED", reason: "Risk snapshot unavailable — fail-closed" };
107
+ await logAndNotify(address, result, candidateAsset);
108
+ return result;
109
+ }
110
+ const hints = data.halt_hints;
111
+ if (hints?.daily_loss_breached) {
112
+ const snap = data.risk_snapshot;
113
+ const pnl = snap?.pnl;
114
+ const result = {
115
+ gate: "CLOSED",
116
+ reason: `Daily loss halt: PnL delta $${(pnl?.delta_since_open ?? 0).toFixed(2)} breached limit`,
117
+ };
118
+ await logAndNotify(address, result, candidateAsset);
119
+ return result;
120
+ }
121
+ if (hints?.drawdown_breached) {
122
+ const snap = data.risk_snapshot;
123
+ const dd = snap?.drawdown;
124
+ const result = {
125
+ gate: "CLOSED",
126
+ reason: `Drawdown halt: ${(dd?.from_peak_pct ?? 0).toFixed(1)}% drop from PnL peak exceeded limit`,
127
+ };
128
+ await logAndNotify(address, result, candidateAsset);
129
+ return result;
130
+ }
131
+ }
132
+ catch (err) {
133
+ logger.warn("getDailyRiskSnapshot failed — fail-closed", { address, err });
134
+ const result = { gate: "CLOSED", reason: "Risk snapshot unavailable — fail-closed" };
135
+ await logAndNotify(address, result, candidateAsset);
136
+ return result;
137
+ }
138
+ }
139
+ // Gate 2: Consecutive loss cooldown
140
+ const hasConsecLoss = guardRails.maxConsecutiveLosses > 0 && guardRails.cooldownMinutes > 0;
141
+ if (hasConsecLoss) {
142
+ try {
143
+ const raw = await senpi.checkConsecutiveLossCooldown(address, guardRails.maxConsecutiveLosses, guardRails.cooldownMinutes);
144
+ const data = extractVerdict(raw);
145
+ if (!data) {
146
+ const result = { gate: "CLOSED", reason: "Consecutive loss cooldown check unavailable — fail-closed" };
147
+ await logAndNotify(address, result, candidateAsset);
148
+ return result;
149
+ }
150
+ if (data.in_cooldown) {
151
+ const result = {
152
+ gate: "COOLDOWN",
153
+ reason: `Consecutive losses: ${data.streak_length ?? "?"} losses in a row, cooldown until ${data.cooldown_expires_at ?? "unknown"}`,
154
+ };
155
+ await logAndNotify(address, result, candidateAsset);
156
+ return result;
157
+ }
158
+ }
159
+ catch (err) {
160
+ logger.warn("checkConsecutiveLossCooldown failed — fail-closed", { address, err });
161
+ const result = { gate: "CLOSED", reason: "Consecutive loss cooldown check unavailable — fail-closed" };
162
+ await logAndNotify(address, result, candidateAsset);
163
+ return result;
164
+ }
165
+ }
166
+ // Gate 3: Per-asset cooldown (only when candidateAsset provided)
167
+ const hasAssetCooldown = guardRails.perAssetCooldownMinutes != null && guardRails.perAssetCooldownMinutes >= 5;
168
+ if (hasAssetCooldown && candidateAsset) {
169
+ try {
170
+ const raw = await senpi.checkAssetCooldown(address, candidateAsset, guardRails.perAssetCooldownMinutes);
171
+ const data = extractVerdict(raw);
172
+ if (!data) {
173
+ const result = { gate: "COOLDOWN", reason: `Asset cooldown check unavailable for ${candidateAsset} — fail-closed` };
174
+ await logAndNotify(address, result, candidateAsset);
175
+ return result;
176
+ }
177
+ if (data.in_cooldown) {
178
+ const result = {
179
+ gate: "COOLDOWN",
180
+ reason: `Asset cooldown: ${candidateAsset} closed at ${data.last_closed_at ?? "unknown"}, cooldown until ${data.cooldown_expires_at ?? "unknown"}`,
181
+ };
182
+ await logAndNotify(address, result, candidateAsset);
183
+ return result;
184
+ }
185
+ }
186
+ catch (err) {
187
+ logger.warn("checkAssetCooldown failed — fail-closed", { address, asset: candidateAsset, err });
188
+ const result = { gate: "COOLDOWN", reason: `Asset cooldown check unavailable for ${candidateAsset} — fail-closed` };
189
+ await logAndNotify(address, result, candidateAsset);
190
+ return result;
191
+ }
192
+ }
193
+ // Gate 4: Max entries per day
194
+ const hasMaxEntries = guardRails.maxEntriesPerDay > 0;
195
+ if (hasMaxEntries) {
196
+ try {
197
+ const raw = await senpi.checkMaxEntries(address, guardRails.maxEntriesPerDay, guardRails.bypassMaxEntriesPerDayOnProfit);
198
+ const data = extractVerdict(raw);
199
+ if (!data) {
200
+ const result = { gate: "CLOSED", reason: "Max entries check unavailable — fail-closed" };
201
+ await logAndNotify(address, result, candidateAsset);
202
+ return result;
203
+ }
204
+ if (!data.gate_open) {
205
+ const result = {
206
+ gate: "CLOSED",
207
+ reason: `Max entries: ${data.entries_today ?? "?"}/${data.max_entries_per_day ?? guardRails.maxEntriesPerDay} entries today${data.bypassed ? " (bypass attempted but not applicable)" : ""}`,
208
+ };
209
+ await logAndNotify(address, result, candidateAsset);
210
+ return result;
211
+ }
212
+ }
213
+ catch (err) {
214
+ logger.warn("checkMaxEntries failed — fail-closed", { address, err });
215
+ const result = { gate: "CLOSED", reason: "Max entries check unavailable — fail-closed" };
216
+ await logAndNotify(address, result, candidateAsset);
217
+ return result;
218
+ }
219
+ }
220
+ const result = { gate: "OPEN" };
221
+ await logAndNotify(address, result, candidateAsset);
222
+ return result;
223
+ }
224
+ return {
225
+ async checkGate(address, opts) {
226
+ return checkGate(address, opts);
227
+ },
228
+ recordEntry() { },
229
+ async getGateForStrategies(addresses) {
230
+ const out = {};
231
+ for (const addr of addresses) {
232
+ out[addr] = await checkGate(addr);
233
+ }
234
+ return out;
11
235
  },
12
236
  };
13
237
  }
@@ -1 +1 @@
1
- {"version":3,"file":"risk-guard.js","sourceRoot":"","sources":["../../src/runtime/risk-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,SAAS,CAAC,QAAgB,EAAE,WAAqC;YAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;QACD,WAAW,CAAC,QAAgB,EAAE,WAAqC;YACjE,QAAQ;QACV,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"risk-guard.js","sourceRoot":"","sources":["../../src/runtime/risk-guard.ts"],"names":[],"mappings":"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"}