@senpi/runtime 1.0.95-dev.feat-dsl-backend-int.20260416023008 → 1.0.95-dev.runtime-phase-2.20260416194608
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -0
- package/dist/actions/action-runtime-module.d.ts +55 -0
- package/dist/actions/action-runtime-module.d.ts.map +1 -0
- package/dist/actions/action-runtime-module.js +444 -0
- package/dist/actions/action-runtime-module.js.map +1 -0
- package/dist/actions/close-position/close-position.action.d.ts +1 -0
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
- package/dist/actions/close-position/close-position.action.js +55 -20
- package/dist/actions/close-position/close-position.action.js.map +1 -1
- package/dist/actions/decision-engine.d.ts.map +1 -1
- package/dist/actions/decision-engine.js +5 -0
- package/dist/actions/decision-engine.js.map +1 -1
- package/dist/actions/llm-decision/shared.d.ts +1 -1
- package/dist/actions/llm-decision/shared.d.ts.map +1 -1
- package/dist/actions/llm-decision/shared.js +1 -1
- package/dist/actions/llm-decision/shared.js.map +1 -1
- package/dist/actions/notifications/formatter.d.ts +39 -0
- package/dist/actions/notifications/formatter.d.ts.map +1 -0
- package/dist/actions/notifications/formatter.js +68 -0
- package/dist/actions/notifications/formatter.js.map +1 -0
- package/dist/actions/notifications/index.d.ts +37 -0
- package/dist/actions/notifications/index.d.ts.map +1 -0
- package/dist/actions/notifications/index.js +89 -0
- package/dist/actions/notifications/index.js.map +1 -0
- package/dist/actions/open-position/open-position.action.d.ts +1 -0
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +132 -27
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/open-position/resolve-margin.d.ts +22 -0
- package/dist/actions/open-position/resolve-margin.d.ts.map +1 -0
- package/dist/actions/open-position/resolve-margin.js +30 -0
- package/dist/actions/open-position/resolve-margin.js.map +1 -0
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +4 -1
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/actions/store/action-store.d.ts +45 -0
- package/dist/actions/store/action-store.d.ts.map +1 -0
- package/dist/actions/store/action-store.js +127 -0
- package/dist/actions/store/action-store.js.map +1 -0
- package/dist/actions/store/index.d.ts +11 -0
- package/dist/actions/store/index.d.ts.map +1 -0
- package/dist/actions/store/index.js +9 -0
- package/dist/actions/store/index.js.map +1 -0
- package/dist/actions/store/paths.d.ts +15 -0
- package/dist/actions/store/paths.d.ts.map +1 -0
- package/dist/actions/store/paths.js +29 -0
- package/dist/actions/store/paths.js.map +1 -0
- package/dist/actions/store/types.d.ts +114 -0
- package/dist/actions/store/types.d.ts.map +1 -0
- package/dist/actions/store/types.js +48 -0
- package/dist/actions/store/types.js.map +1 -0
- package/dist/actions/tracking-helpers.d.ts +13 -0
- package/dist/actions/tracking-helpers.d.ts.map +1 -0
- package/dist/actions/tracking-helpers.js +47 -0
- package/dist/actions/tracking-helpers.js.map +1 -0
- package/dist/actions/types.d.ts +8 -0
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +105 -3
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/cli/senpi-commands.d.ts.map +1 -1
- package/dist/cli/senpi-commands.js +428 -1
- package/dist/cli/senpi-commands.js.map +1 -1
- package/dist/constants/order-types.d.ts +7 -0
- package/dist/constants/order-types.d.ts.map +1 -0
- package/dist/constants/order-types.js +6 -0
- package/dist/constants/order-types.js.map +1 -0
- package/dist/context/interpolate.d.ts +6 -2
- package/dist/context/interpolate.d.ts.map +1 -1
- package/dist/context/interpolate.js +6 -2
- package/dist/context/interpolate.js.map +1 -1
- package/dist/context/types.d.ts +8 -1
- package/dist/context/types.d.ts.map +1 -1
- package/dist/context/types.js +8 -1
- package/dist/context/types.js.map +1 -1
- package/dist/dsl/config/exit-block.d.ts +7 -0
- package/dist/dsl/config/exit-block.d.ts.map +1 -1
- package/dist/dsl/config/parse-plugin-config.d.ts.map +1 -1
- package/dist/dsl/config/parse-plugin-config.js +27 -1
- package/dist/dsl/config/parse-plugin-config.js.map +1 -1
- package/dist/dsl/config/unknown-keys.d.ts.map +1 -1
- package/dist/dsl/config/unknown-keys.js +3 -1
- package/dist/dsl/config/unknown-keys.js.map +1 -1
- package/dist/dsl/monitor/create-monitor.d.ts +4 -0
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
- package/dist/dsl/monitor/create-monitor.js +8 -5
- package/dist/dsl/monitor/create-monitor.js.map +1 -1
- package/dist/dsl/monitor/process-one-position.d.ts +4 -0
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
- package/dist/dsl/monitor/process-one-position.js +8 -2
- package/dist/dsl/monitor/process-one-position.js.map +1 -1
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js +3 -1
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/health/index.d.ts +5 -2
- package/dist/health/index.d.ts.map +1 -1
- package/dist/health/index.js +106 -6
- package/dist/health/index.js.map +1 -1
- package/dist/health/types.d.ts +102 -0
- package/dist/health/types.d.ts.map +1 -1
- package/dist/health/types.js +7 -1
- package/dist/health/types.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -1
- package/dist/index.js.map +1 -1
- package/dist/risk/guardrail.types.d.ts +53 -0
- package/dist/risk/guardrail.types.d.ts.map +1 -0
- package/dist/risk/guardrail.types.js +5 -0
- package/dist/risk/guardrail.types.js.map +1 -0
- package/dist/risk/index.d.ts +2 -4
- package/dist/risk/index.d.ts.map +1 -1
- package/dist/risk/index.js +2 -6
- package/dist/risk/index.js.map +1 -1
- package/dist/risk/risk-audit-log.d.ts +25 -0
- package/dist/risk/risk-audit-log.d.ts.map +1 -0
- package/dist/risk/risk-audit-log.js +30 -0
- package/dist/risk/risk-audit-log.js.map +1 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts +162 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts.map +1 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js +285 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js.map +1 -0
- package/dist/runtime/create-actions.d.ts +6 -2
- package/dist/runtime/create-actions.d.ts.map +1 -1
- package/dist/runtime/create-actions.js +18 -7
- package/dist/runtime/create-actions.js.map +1 -1
- package/dist/runtime/create-scanner-module.d.ts +5 -0
- package/dist/runtime/create-scanner-module.d.ts.map +1 -1
- package/dist/runtime/create-scanner-module.js +12 -1
- package/dist/runtime/create-scanner-module.js.map +1 -1
- package/dist/runtime/load-runtime-config.d.ts +1 -1
- package/dist/runtime/load-runtime-config.d.ts.map +1 -1
- package/dist/runtime/load-runtime-config.js +37 -1
- package/dist/runtime/load-runtime-config.js.map +1 -1
- package/dist/runtime/map-strategies.d.ts +1 -1
- package/dist/runtime/map-strategies.d.ts.map +1 -1
- package/dist/runtime/map-strategies.js +38 -1
- package/dist/runtime/map-strategies.js.map +1 -1
- package/dist/runtime/risk-guard.d.ts +23 -2
- package/dist/runtime/risk-guard.d.ts.map +1 -1
- package/dist/runtime/risk-guard.js +441 -5
- package/dist/runtime/risk-guard.js.map +1 -1
- package/dist/runtime/run.d.ts +7 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -0
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runtime-schema.d.ts +1169 -24
- package/dist/runtime/runtime-schema.d.ts.map +1 -1
- package/dist/runtime/runtime-schema.js +105 -2
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +26 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +192 -6
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/scanner-composition.d.ts +10 -0
- package/dist/runtime/scanner-composition.d.ts.map +1 -1
- package/dist/runtime/scanner-composition.js +10 -0
- package/dist/runtime/scanner-composition.js.map +1 -1
- package/dist/runtime/scanner-registry.d.ts +39 -1
- package/dist/runtime/scanner-registry.d.ts.map +1 -1
- package/dist/runtime/scanner-registry.js +105 -2
- package/dist/runtime/scanner-registry.js.map +1 -1
- package/dist/runtime/state-layout.d.ts +2 -0
- package/dist/runtime/state-layout.d.ts.map +1 -1
- package/dist/runtime/state-layout.js +1 -0
- package/dist/runtime/state-layout.js.map +1 -1
- package/dist/runtime/validate-action-prompts.d.ts +30 -0
- package/dist/runtime/validate-action-prompts.d.ts.map +1 -0
- package/dist/runtime/validate-action-prompts.js +110 -0
- package/dist/runtime/validate-action-prompts.js.map +1 -0
- package/dist/scanners/__tests__/test-helpers.d.ts +10 -0
- package/dist/scanners/__tests__/test-helpers.d.ts.map +1 -1
- package/dist/scanners/__tests__/test-helpers.js +52 -0
- package/dist/scanners/__tests__/test-helpers.js.map +1 -1
- package/dist/scanners/engine/engine.d.ts +37 -0
- package/dist/scanners/engine/engine.d.ts.map +1 -1
- package/dist/scanners/engine/engine.js +132 -14
- package/dist/scanners/engine/engine.js.map +1 -1
- package/dist/scanners/engine/result-builder.d.ts +16 -0
- package/dist/scanners/engine/result-builder.d.ts.map +1 -1
- package/dist/scanners/engine/result-builder.js +22 -0
- package/dist/scanners/engine/result-builder.js.map +1 -1
- package/dist/scanners/engine/strategy-registry.d.ts +2 -0
- package/dist/scanners/engine/strategy-registry.d.ts.map +1 -1
- package/dist/scanners/engine/strategy-registry.js +5 -1
- package/dist/scanners/engine/strategy-registry.js.map +1 -1
- package/dist/scanners/external-scanner-receiver.d.ts +118 -0
- package/dist/scanners/external-scanner-receiver.d.ts.map +1 -0
- package/dist/scanners/external-scanner-receiver.js +266 -0
- package/dist/scanners/external-scanner-receiver.js.map +1 -0
- package/dist/scanners/implementations/external-scanner.d.ts +17 -0
- package/dist/scanners/implementations/external-scanner.d.ts.map +1 -0
- package/dist/scanners/implementations/external-scanner.js +51 -0
- package/dist/scanners/implementations/external-scanner.js.map +1 -0
- package/dist/scanners/implementations/index.d.ts +1 -0
- package/dist/scanners/implementations/index.d.ts.map +1 -1
- package/dist/scanners/implementations/index.js +1 -0
- package/dist/scanners/implementations/index.js.map +1 -1
- package/dist/scanners/implementations/position-tracker.d.ts.map +1 -1
- package/dist/scanners/implementations/position-tracker.js +3 -1
- package/dist/scanners/implementations/position-tracker.js.map +1 -1
- package/dist/scanners/index.d.ts +4 -1
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +2 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/protocol/scanner.d.ts +3 -1
- package/dist/scanners/protocol/scanner.d.ts.map +1 -1
- package/dist/scanners/providers/client.d.ts.map +1 -1
- package/dist/scanners/providers/client.js +0 -8
- package/dist/scanners/providers/client.js.map +1 -1
- package/dist/scanners/runtime-module.d.ts +10 -0
- package/dist/scanners/runtime-module.d.ts.map +1 -1
- package/dist/scanners/runtime-module.js +19 -3
- package/dist/scanners/runtime-module.js.map +1 -1
- package/dist/scanners/scanner-definition.d.ts +12 -1
- package/dist/scanners/scanner-definition.d.ts.map +1 -1
- package/dist/scanners/types.d.ts +3 -0
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js.map +1 -1
- package/dist/scripts/run-dsl-standalone-live.js +1 -1
- package/dist/scripts/run-dsl-standalone-live.js.map +1 -1
- package/dist/scripts/run-dsl-standalone-mock.js +1 -1
- package/dist/scripts/run-dsl-standalone-mock.js.map +1 -1
- package/dist/senpi/client.d.ts +27 -2
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +74 -1
- package/dist/senpi/client.js.map +1 -1
- package/dist/senpi/index.d.ts +1 -1
- package/dist/senpi/index.d.ts.map +1 -1
- package/dist/senpi/types.d.ts +68 -0
- package/dist/senpi/types.d.ts.map +1 -1
- package/dist/strategy/strategy-state.d.ts +4 -1
- package/dist/strategy/strategy-state.d.ts.map +1 -1
- package/dist/strategy/strategy-state.js +7 -2
- package/dist/strategy/strategy-state.js.map +1 -1
- package/dist/tracking/constants.d.ts +24 -0
- package/dist/tracking/constants.d.ts.map +1 -0
- package/dist/tracking/constants.js +46 -0
- package/dist/tracking/constants.js.map +1 -0
- package/dist/tracking/index.d.ts +12 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +8 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/tracker.d.ts +22 -0
- package/dist/tracking/tracker.d.ts.map +1 -0
- package/dist/tracking/tracker.js +44 -0
- package/dist/tracking/tracker.js.map +1 -0
- package/dist/tracking/tracking-handler.d.ts +12 -0
- package/dist/tracking/tracking-handler.d.ts.map +1 -0
- package/dist/tracking/tracking-handler.js +148 -0
- package/dist/tracking/tracking-handler.js.map +1 -0
- package/dist/tracking/transport.d.ts +35 -0
- package/dist/tracking/transport.d.ts.map +1 -0
- package/dist/tracking/transport.js +117 -0
- package/dist/tracking/transport.js.map +1 -0
- package/dist/tracking/types.d.ts +21 -0
- package/dist/tracking/types.d.ts.map +1 -0
- package/dist/tracking/types.js +6 -0
- package/dist/tracking/types.js.map +1 -0
- package/dist/types/action.d.ts +13 -2
- package/dist/types/action.d.ts.map +1 -1
- package/dist/types/dsl/index.d.ts +3 -0
- package/dist/types/dsl/index.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +9 -3
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +19 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/resolve-order-type.d.ts +5 -0
- package/dist/utils/resolve-order-type.d.ts.map +1 -0
- package/dist/utils/resolve-order-type.js +29 -0
- package/dist/utils/resolve-order-type.js.map +1 -0
- package/examples/strategies/dsl-showcase.yaml +7 -2
- package/examples/strategies/dsl.yaml +5 -1
- package/examples/strategies/fox-minimal-loosened.yaml +18 -3
- package/examples/strategies/fox-minimal.yaml +25 -3
- package/examples/strategies/minimal.yaml +4 -2
- package/examples/strategies/momentum/how-it-works.md +47 -0
- package/examples/strategies/momentum/momentum-guarded.yaml +161 -0
- package/examples/strategies/risk-showcase.yaml +93 -0
- package/examples/strategies/viper.yaml +11 -3
- package/examples/strategies/wolf.yaml +11 -3
- package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +12 -4
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-schema.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-schema.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyCxB,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAaT,CAAC;AAEjB,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA+EtB,CAAC;AA6BH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAUP,CAAC;AAEjB,QAAA,MAAM,eAAe;;;IAQnB,kFAAkF;;;;;;;;;;;;;;;;;IAAlF,kFAAkF;;;;;;;;;;;;;;;;;IAAlF,kFAAkF;;;;;;;;;;;;;;gCAQpE,CAAC;AAEjB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAV9B,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;QAAlF,kFAAkF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA8CjF,CAAC;AAEJ,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
|
|
@@ -4,6 +4,22 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
const dependencyPolicyModeSchema = z.enum(["fail", "skip", "degrade"]);
|
|
7
|
+
const retentionPolicySchema = z.enum(["last_only", "rolling_window"]);
|
|
8
|
+
const externalFieldTypeSchema = z.enum([
|
|
9
|
+
"string",
|
|
10
|
+
"number",
|
|
11
|
+
"boolean",
|
|
12
|
+
"object",
|
|
13
|
+
"array",
|
|
14
|
+
]);
|
|
15
|
+
const externalFieldSchema = z.object({
|
|
16
|
+
type: externalFieldTypeSchema,
|
|
17
|
+
required: z.boolean().optional(),
|
|
18
|
+
});
|
|
19
|
+
const scannerOutputsSchema = z.object({
|
|
20
|
+
signals: z.boolean(),
|
|
21
|
+
context: z.boolean(),
|
|
22
|
+
});
|
|
7
23
|
const scannerDependencySchema = z.object({
|
|
8
24
|
scanner: z.string().min(1),
|
|
9
25
|
required: z.boolean().optional(),
|
|
@@ -11,11 +27,21 @@ const scannerDependencySchema = z.object({
|
|
|
11
27
|
on_missing: dependencyPolicyModeSchema.optional(),
|
|
12
28
|
on_stale: dependencyPolicyModeSchema.optional(),
|
|
13
29
|
});
|
|
30
|
+
const guardRailsSchema = z.object({
|
|
31
|
+
daily_loss_limit_pct: z.number().min(0).optional(),
|
|
32
|
+
max_entries_per_day: z.number().int().min(1).optional(),
|
|
33
|
+
bypass_max_entries_per_day_on_profit: z.boolean().optional(),
|
|
34
|
+
max_consecutive_losses: z.number().int().min(1).optional(),
|
|
35
|
+
cooldown_minutes: z.number().min(1).optional(),
|
|
36
|
+
drawdown_halt_pct: z.number().min(0).max(100).optional(),
|
|
37
|
+
drawdown_reset_on_day_rollover: z.boolean().optional(),
|
|
38
|
+
per_asset_cooldown_minutes: z.number().min(5).optional(),
|
|
39
|
+
}).passthrough();
|
|
14
40
|
const strategyEntrySchema = z.object({
|
|
15
41
|
wallet: z.string().min(1, "strategy must have a wallet (e.g. wallet: \"your-address\")"),
|
|
16
|
-
budget: z.union([z.number(), z.string()]).optional(),
|
|
17
42
|
slots: z.number().optional(),
|
|
18
43
|
margin_per_slot: z.number().optional(),
|
|
44
|
+
margin_pct: z.number().positive().max(100).optional(),
|
|
19
45
|
trading_risk: z.enum(['conservative', 'moderate', 'aggressive']).optional(),
|
|
20
46
|
default_leverage: z.number().optional(),
|
|
21
47
|
leverage_multipliers: z.object({
|
|
@@ -31,9 +57,74 @@ const scannerEntrySchema = z.object({
|
|
|
31
57
|
interval: z.string().optional(),
|
|
32
58
|
depends_on: z.array(scannerDependencySchema).optional(),
|
|
33
59
|
blocked_assets: z.array(z.string()).optional(),
|
|
60
|
+
outputs: scannerOutputsSchema.optional(),
|
|
61
|
+
retention: retentionPolicySchema.optional(),
|
|
62
|
+
retention_max_runs: z.number().int().positive().optional(),
|
|
34
63
|
config: z.record(z.string(), z.unknown()).optional(),
|
|
35
64
|
advanced: z.record(z.string(), z.unknown()).optional(),
|
|
36
|
-
}).passthrough()
|
|
65
|
+
}).passthrough().superRefine((data, ctx) => {
|
|
66
|
+
if (data.type !== "external_scanner") {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (data.interval !== undefined) {
|
|
70
|
+
ctx.addIssue({
|
|
71
|
+
code: z.ZodIssueCode.custom,
|
|
72
|
+
path: ["interval"],
|
|
73
|
+
message: "external_scanner does not allow interval; it is push-driven.",
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (Array.isArray(data.depends_on) && data.depends_on.length > 0) {
|
|
77
|
+
ctx.addIssue({
|
|
78
|
+
code: z.ZodIssueCode.custom,
|
|
79
|
+
path: ["depends_on"],
|
|
80
|
+
message: "external_scanner does not support depends_on; push-driven scanners do not consume upstream artifacts. Declare depends_on on the consuming scanner instead.",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (!data.outputs) {
|
|
84
|
+
ctx.addIssue({
|
|
85
|
+
code: z.ZodIssueCode.custom,
|
|
86
|
+
path: ["outputs"],
|
|
87
|
+
message: "external_scanner requires outputs.signals and outputs.context.",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
if (!data.outputs.signals && !data.outputs.context) {
|
|
92
|
+
ctx.addIssue({
|
|
93
|
+
code: z.ZodIssueCode.custom,
|
|
94
|
+
path: ["outputs"],
|
|
95
|
+
message: "external_scanner must enable at least one of outputs.signals or outputs.context.",
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!isRecord(data.config)) {
|
|
100
|
+
ctx.addIssue({
|
|
101
|
+
code: z.ZodIssueCode.custom,
|
|
102
|
+
path: ["config"],
|
|
103
|
+
message: "external_scanner requires config.fields.",
|
|
104
|
+
});
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const fields = data.config.fields;
|
|
108
|
+
if (!isRecord(fields) || Object.keys(fields).length === 0) {
|
|
109
|
+
ctx.addIssue({
|
|
110
|
+
code: z.ZodIssueCode.custom,
|
|
111
|
+
path: ["config", "fields"],
|
|
112
|
+
message: "external_scanner requires a non-empty config.fields map.",
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
for (const [fieldName, rawField] of Object.entries(fields)) {
|
|
117
|
+
const parsed = externalFieldSchema.safeParse(rawField);
|
|
118
|
+
if (!parsed.success) {
|
|
119
|
+
for (const issue of parsed.error.issues) {
|
|
120
|
+
ctx.addIssue({
|
|
121
|
+
...issue,
|
|
122
|
+
path: ["config", "fields", fieldName, ...issue.path],
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
});
|
|
37
128
|
const signalContextEntrySchema = z.object({
|
|
38
129
|
type: z.literal("signal"),
|
|
39
130
|
scanner: z.string().min(1),
|
|
@@ -78,6 +169,11 @@ const exitBlockSchema = z.object({
|
|
|
78
169
|
/** Single DSL exit profile. Shape validated again in DSL parse / unknown-keys. */
|
|
79
170
|
dsl_preset: z.record(z.string(), z.unknown()).optional(),
|
|
80
171
|
sm_flip: z.unknown().optional(),
|
|
172
|
+
order_type: z.enum(['MARKET', 'FEE_OPTIMIZED_LIMIT']).optional(),
|
|
173
|
+
fee_optimized_limit_options: z.object({
|
|
174
|
+
ensure_execution_as_taker: z.boolean().optional(),
|
|
175
|
+
execution_timeout_seconds: z.number().int().min(1).max(300).optional(),
|
|
176
|
+
}).optional(),
|
|
81
177
|
}).passthrough();
|
|
82
178
|
export const runtimeConfigSchema = z.object({
|
|
83
179
|
name: z.string().min(1, "name is required at the top (e.g. name: my-recipe)"),
|
|
@@ -90,6 +186,10 @@ export const runtimeConfigSchema = z.object({
|
|
|
90
186
|
health: z.record(z.string(), z.unknown()).optional(),
|
|
91
187
|
hooks: z.array(z.unknown()).optional(),
|
|
92
188
|
notifications: z.record(z.string(), z.unknown()).optional(),
|
|
189
|
+
risk: z.object({
|
|
190
|
+
data_retention_hours: z.number().int().min(1).max(168).optional(),
|
|
191
|
+
guard_rails: guardRailsSchema.optional(),
|
|
192
|
+
}).optional(),
|
|
93
193
|
advanced: z.record(z.string(), z.unknown()).optional(),
|
|
94
194
|
})
|
|
95
195
|
.passthrough()
|
|
@@ -107,4 +207,7 @@ export const runtimeConfigSchema = z.object({
|
|
|
107
207
|
}, {
|
|
108
208
|
message: "when using actions that depend on scanners (e.g. OPEN_POSITION), you must also add a non-empty 'scanners:' block",
|
|
109
209
|
});
|
|
210
|
+
function isRecord(value) {
|
|
211
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
212
|
+
}
|
|
110
213
|
//# sourceMappingURL=runtime-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-schema.js","sourceRoot":"","sources":["../../src/runtime/runtime-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,0BAA0B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-schema.js","sourceRoot":"","sources":["../../src/runtime/runtime-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* Runtime: orchestrates trading recipe config, scanner module, actions, DSL, risk, health.
|
|
3
3
|
*/
|
|
4
4
|
import type { RuntimeConfig } from "./runtime-config.js";
|
|
5
|
+
import type { ExternalScannerIngestRequest, ExternalScannerIngestResult } from "../scanners/external-scanner-receiver.js";
|
|
5
6
|
import type { McpTransport } from "../senpi/types.js";
|
|
6
7
|
import type { ScannerDataProviders } from "../scanners/engine/data-providers.js";
|
|
7
8
|
import { DslPlugin as DslPluginClass } from "../dsl/plugin/index.js";
|
|
8
9
|
import type { RuntimeHealthStatus, RuntimeSystemState } from "../health/types.js";
|
|
10
|
+
import type { ActionExecutionRecord, ActionFilter, ActionLatestState, ReadActionHistoryOptions } from "../actions/store/types.js";
|
|
9
11
|
export interface RuntimeOptions {
|
|
10
12
|
stateDir: string;
|
|
11
13
|
mcpTransport?: McpTransport;
|
|
@@ -22,6 +24,7 @@ export declare class Runtime {
|
|
|
22
24
|
private dslPlugin;
|
|
23
25
|
private senpi;
|
|
24
26
|
private healthStateModule;
|
|
27
|
+
private trackingHandler;
|
|
25
28
|
private started;
|
|
26
29
|
private startedAt;
|
|
27
30
|
/** Serial signal processing: queue and consumer so only one signal is handled at a time. */
|
|
@@ -31,12 +34,35 @@ export declare class Runtime {
|
|
|
31
34
|
private signalConsumerDone;
|
|
32
35
|
private runActionsForSignal;
|
|
33
36
|
private strategyConfig;
|
|
37
|
+
private actionRuntimeModule;
|
|
34
38
|
/** Stored so we can call off() in stop() and avoid retaining Runtime via scanner EventEmitter. */
|
|
35
39
|
private onScannerRunComplete;
|
|
40
|
+
/** Action-layer Telegram subscriber (open submit / close); disposed in {@link Runtime.stop}. */
|
|
41
|
+
private actionNotificationSubscriber;
|
|
36
42
|
constructor(config: RuntimeConfig, options: RuntimeOptions);
|
|
37
43
|
get dsl(): DslPluginClass | null;
|
|
38
44
|
getHealthStatus(): Promise<RuntimeHealthStatus | null>;
|
|
39
45
|
getSystemState(): Promise<RuntimeSystemState | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Latest persisted snapshots for actions under this runtime's state directory
|
|
48
|
+
* (optionally filtered by wallet address and/or action name).
|
|
49
|
+
*/
|
|
50
|
+
listActionLatestStates(filter?: ActionFilter): Promise<ActionLatestState[]>;
|
|
51
|
+
/** Full `latest.json` for one action instance, or null when missing. */
|
|
52
|
+
getActionLatestState(address: string, actionName: string): Promise<ActionLatestState | null>;
|
|
53
|
+
/** Rolling JSONL execution history for one action. */
|
|
54
|
+
getActionExecutionHistory(address: string, actionName: string, opts?: ReadActionHistoryOptions): Promise<ActionExecutionRecord[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Accepts one external scanner ingest request for the runtime's configured
|
|
57
|
+
* strategy.
|
|
58
|
+
*
|
|
59
|
+
* The runtime stays intentionally thin here: scanner-specific validation,
|
|
60
|
+
* lifecycle emission, signal persistence, retained-context storage, and
|
|
61
|
+
* retention all remain owned by the
|
|
62
|
+
* scanner module so the ingest path cannot drift from normal scanner
|
|
63
|
+
* behavior.
|
|
64
|
+
*/
|
|
65
|
+
ingestExternalScannerData(request: ExternalScannerIngestRequest): Promise<ExternalScannerIngestResult>;
|
|
40
66
|
start(): Promise<void>;
|
|
41
67
|
/**
|
|
42
68
|
* Cancel exchange SLs and archive DSL state for the strategy, then log removal.
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/runtime.js
CHANGED
|
@@ -7,7 +7,9 @@ import { SenpiClient } from "../senpi/client.js";
|
|
|
7
7
|
import { createLlmDecision } from "../actions/llm-decision/index.js";
|
|
8
8
|
import { StateManager } from "../state/index.js";
|
|
9
9
|
import { createContextBuilder } from "../context/index.js";
|
|
10
|
-
import { createRiskGuard } from "./risk-guard.js";
|
|
10
|
+
import { createRiskGuard, createRiskGuardStub } from "./risk-guard.js";
|
|
11
|
+
// RiskGuardianService removed — gate decisions are now real-time in checkGate
|
|
12
|
+
import { createRiskAuditLog } from "../risk/risk-audit-log.js";
|
|
11
13
|
import { createNotificationService } from "./notifications.js";
|
|
12
14
|
import { resolveStrategyConfig } from "./map-strategies.js";
|
|
13
15
|
import { mapRuntimeExitToDslConfig } from "./map-exit-config.js";
|
|
@@ -15,6 +17,7 @@ import { buildActionScanPayload } from "./build-action-scan-payload.js";
|
|
|
15
17
|
import { createScannerModuleFromRuntimeConfig } from "./create-scanner-module.js";
|
|
16
18
|
import { createRuntimeContext, createStrategyStatesMap } from "./create-runtime-context.js";
|
|
17
19
|
import { createActions } from "./create-actions.js";
|
|
20
|
+
import { ActionRuntimeModule } from "../actions/action-runtime-module.js";
|
|
18
21
|
import { validateDslPositionTracking } from "./validate-dsl-position-tracking.js";
|
|
19
22
|
import { ScannerRegistry } from "./scanner-registry.js";
|
|
20
23
|
import { ActionRegistry } from "./action-registry.js";
|
|
@@ -22,9 +25,13 @@ import { initRisk } from "../risk/index.js";
|
|
|
22
25
|
import { createHealthStateModule, } from "../health/index.js";
|
|
23
26
|
import { DslPlugin as DslPluginClass } from "../dsl/plugin/index.js";
|
|
24
27
|
import { HOOK_EVENT } from "../types/hooks.js";
|
|
28
|
+
import { createActionNotificationSubscriber, isActionLifecycleNotificationsEnabled } from "../actions/notifications/index.js";
|
|
25
29
|
import { MaxLeverageCache } from "../leverage/max-leverage-cache.js";
|
|
26
30
|
import { buildStateLayout } from "./state-layout.js";
|
|
27
31
|
import { createLogger } from "../utils/logger.js";
|
|
32
|
+
import { createTrackingHandler, EventTracker, BatchingTransport, NoOpTransport, TRACKING_API_BASE_URL, } from "../tracking/index.js";
|
|
33
|
+
import { VERSION } from "../version.js";
|
|
34
|
+
import { randomUUID } from "node:crypto";
|
|
28
35
|
const logger = createLogger("[senpi-core][runtime]");
|
|
29
36
|
export class Runtime {
|
|
30
37
|
config;
|
|
@@ -34,8 +41,10 @@ export class Runtime {
|
|
|
34
41
|
stateManager;
|
|
35
42
|
scannerModule;
|
|
36
43
|
dslPlugin = null;
|
|
44
|
+
// riskGuardian removed — gate decisions are now real-time in checkGate
|
|
37
45
|
senpi = null;
|
|
38
46
|
healthStateModule = null;
|
|
47
|
+
trackingHandler = null;
|
|
39
48
|
started = false;
|
|
40
49
|
startedAt = null;
|
|
41
50
|
/** Serial signal processing: queue and consumer so only one signal is handled at a time. */
|
|
@@ -45,8 +54,11 @@ export class Runtime {
|
|
|
45
54
|
signalConsumerDone = null;
|
|
46
55
|
runActionsForSignal;
|
|
47
56
|
strategyConfig;
|
|
57
|
+
actionRuntimeModule;
|
|
48
58
|
/** Stored so we can call off() in stop() and avoid retaining Runtime via scanner EventEmitter. */
|
|
49
59
|
onScannerRunComplete = null;
|
|
60
|
+
/** Action-layer Telegram subscriber (open submit / close); disposed in {@link Runtime.stop}. */
|
|
61
|
+
actionNotificationSubscriber = null;
|
|
50
62
|
constructor(config, options) {
|
|
51
63
|
this.config = config;
|
|
52
64
|
this.options = options;
|
|
@@ -60,6 +72,37 @@ export class Runtime {
|
|
|
60
72
|
async getSystemState() {
|
|
61
73
|
return this.healthStateModule?.getSystemState() ?? null;
|
|
62
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Latest persisted snapshots for actions under this runtime's state directory
|
|
77
|
+
* (optionally filtered by wallet address and/or action name).
|
|
78
|
+
*/
|
|
79
|
+
listActionLatestStates(filter) {
|
|
80
|
+
return this.actionRuntimeModule.readAllLatest(filter);
|
|
81
|
+
}
|
|
82
|
+
/** Full `latest.json` for one action instance, or null when missing. */
|
|
83
|
+
getActionLatestState(address, actionName) {
|
|
84
|
+
return this.actionRuntimeModule.readLatest(address, actionName);
|
|
85
|
+
}
|
|
86
|
+
/** Rolling JSONL execution history for one action. */
|
|
87
|
+
getActionExecutionHistory(address, actionName, opts) {
|
|
88
|
+
return this.actionRuntimeModule.readHistory(address, actionName, opts);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Accepts one external scanner ingest request for the runtime's configured
|
|
92
|
+
* strategy.
|
|
93
|
+
*
|
|
94
|
+
* The runtime stays intentionally thin here: scanner-specific validation,
|
|
95
|
+
* lifecycle emission, signal persistence, retained-context storage, and
|
|
96
|
+
* retention all remain owned by the
|
|
97
|
+
* scanner module so the ingest path cannot drift from normal scanner
|
|
98
|
+
* behavior.
|
|
99
|
+
*/
|
|
100
|
+
async ingestExternalScannerData(request) {
|
|
101
|
+
if (!this.started) {
|
|
102
|
+
throw new Error("Runtime must be started before accepting external scanner ingests.");
|
|
103
|
+
}
|
|
104
|
+
return this.scannerModule.ingestExternalScannerData(this.strategyConfig.address, request);
|
|
105
|
+
}
|
|
63
106
|
async start() {
|
|
64
107
|
if (this.started)
|
|
65
108
|
return;
|
|
@@ -72,7 +115,7 @@ export class Runtime {
|
|
|
72
115
|
// Validation: every scanner type and action_type must be in registries
|
|
73
116
|
for (const sc of this.config.scanners ?? []) {
|
|
74
117
|
if (!ScannerRegistry.get(sc.type)) {
|
|
75
|
-
throw new Error(`
|
|
118
|
+
throw new Error(`Scanner '${sc.name}': ${ScannerRegistry.formatUnknownScannerTypeError(sc.type)}`);
|
|
76
119
|
}
|
|
77
120
|
}
|
|
78
121
|
for (const ac of this.config.actions ?? []) {
|
|
@@ -87,6 +130,14 @@ export class Runtime {
|
|
|
87
130
|
validateDslPositionTracking(this.config, hasDsl);
|
|
88
131
|
this.bus = createRuntimeBus();
|
|
89
132
|
this.hookSystem = createHookSystem(this.bus);
|
|
133
|
+
// Wire event tracking (passive bus subscriber — never blocks trading logic)
|
|
134
|
+
const trackingApiKey = apiKey ?? process.env.SENPI_API_KEY;
|
|
135
|
+
const trackingBaseUrl = process.env.SENPI_TRACKING_URL ?? TRACKING_API_BASE_URL;
|
|
136
|
+
const trackingTransport = trackingApiKey
|
|
137
|
+
? new BatchingTransport({ baseUrl: trackingBaseUrl, apiKey: trackingApiKey })
|
|
138
|
+
: new NoOpTransport();
|
|
139
|
+
const tracker = new EventTracker(trackingTransport, this.config.name, VERSION);
|
|
140
|
+
this.trackingHandler = createTrackingHandler(this.bus, tracker);
|
|
90
141
|
this.stateManager = new StateManager(stateDir);
|
|
91
142
|
await this.stateManager.hydrate();
|
|
92
143
|
const senpi = mcpTransport
|
|
@@ -105,11 +156,21 @@ export class Runtime {
|
|
|
105
156
|
// }
|
|
106
157
|
const llmDecision = createLlmDecision({});
|
|
107
158
|
const contextBuilder = createContextBuilder();
|
|
108
|
-
const riskGuard = createRiskGuard();
|
|
109
159
|
const notifications = createNotificationService({
|
|
110
160
|
...this.config.notifications,
|
|
111
161
|
mcpTransport: this.options.mcpTransport,
|
|
112
162
|
});
|
|
163
|
+
const riskBlock = this.config.risk;
|
|
164
|
+
const strategyAddress = this.strategyConfig.address;
|
|
165
|
+
const auditLog = riskBlock ? createRiskAuditLog(stateDir) : undefined;
|
|
166
|
+
const riskGuard = riskBlock && senpi
|
|
167
|
+
? createRiskGuard({
|
|
168
|
+
senpi,
|
|
169
|
+
notifications,
|
|
170
|
+
strategies: new Map([[strategyAddress, this.strategyConfig]]),
|
|
171
|
+
auditLog,
|
|
172
|
+
})
|
|
173
|
+
: createRiskGuardStub();
|
|
113
174
|
logger.info("Runtime.start() creating scanner module");
|
|
114
175
|
const layout = buildStateLayout(stateDir);
|
|
115
176
|
// Augment caller-supplied providers with StateManager-backed DSL state access
|
|
@@ -139,7 +200,8 @@ export class Runtime {
|
|
|
139
200
|
scannerModule: this.scannerModule,
|
|
140
201
|
maxLeverageCache,
|
|
141
202
|
});
|
|
142
|
-
|
|
203
|
+
this.actionRuntimeModule = new ActionRuntimeModule({ stateDir: layout.actionRoot });
|
|
204
|
+
const { runActionsForSignal } = await createActions(this.config, {
|
|
143
205
|
bus: this.bus,
|
|
144
206
|
senpi,
|
|
145
207
|
stateManager: this.stateManager,
|
|
@@ -149,10 +211,11 @@ export class Runtime {
|
|
|
149
211
|
riskGuard,
|
|
150
212
|
notifications,
|
|
151
213
|
runtimeContext,
|
|
214
|
+
actionModule: this.actionRuntimeModule,
|
|
152
215
|
});
|
|
153
216
|
this.runActionsForSignal = runActionsForSignal;
|
|
217
|
+
const notificationsConfig = this.config.notifications;
|
|
154
218
|
if (hasDsl) {
|
|
155
|
-
const notificationsConfig = this.config.notifications;
|
|
156
219
|
const dslNotificationsDisabled = notificationsConfig?.dsl_lifecycle === false;
|
|
157
220
|
const dslNotifySlUpdates = notificationsConfig?.dsl_notify_sl_updates === true;
|
|
158
221
|
this.dslPlugin = await DslPluginClass.create({
|
|
@@ -170,6 +233,14 @@ export class Runtime {
|
|
|
170
233
|
else {
|
|
171
234
|
this.dslPlugin = null;
|
|
172
235
|
}
|
|
236
|
+
if (isActionLifecycleNotificationsEnabled(notificationsConfig)) {
|
|
237
|
+
this.actionNotificationSubscriber = createActionNotificationSubscriber(this.bus, notifications, {
|
|
238
|
+
strategyName: this.config.name,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
this.actionNotificationSubscriber = null;
|
|
243
|
+
}
|
|
173
244
|
initRisk(this.bus);
|
|
174
245
|
this.healthStateModule = createHealthStateModule({
|
|
175
246
|
runtimeName: this.config.name,
|
|
@@ -178,6 +249,10 @@ export class Runtime {
|
|
|
178
249
|
providers: {
|
|
179
250
|
scanners: this.scannerModule,
|
|
180
251
|
dsl: this.dslPlugin ?? createDisabledDslProvider(),
|
|
252
|
+
actions: this.actionRuntimeModule,
|
|
253
|
+
risk: riskBlock
|
|
254
|
+
? createRiskHealthProvider(riskGuard, strategyAddress)
|
|
255
|
+
: undefined,
|
|
181
256
|
},
|
|
182
257
|
});
|
|
183
258
|
this.onScannerRunComplete = (event) => {
|
|
@@ -187,6 +262,12 @@ export class Runtime {
|
|
|
187
262
|
this.signalQueueWait = null;
|
|
188
263
|
w();
|
|
189
264
|
}
|
|
265
|
+
// Emit scanner run for tracking
|
|
266
|
+
this.bus.emit("tracking.scanner_run", {
|
|
267
|
+
address: event.result.address,
|
|
268
|
+
data: event.result,
|
|
269
|
+
timestamp: new Date().toISOString(),
|
|
270
|
+
});
|
|
190
271
|
// Forward scanner summary alerts (e.g. watchdog) to notification service
|
|
191
272
|
const alerts = event.result.summary?.alerts;
|
|
192
273
|
if (Array.isArray(alerts) && alerts.length > 0) {
|
|
@@ -201,6 +282,18 @@ export class Runtime {
|
|
|
201
282
|
await this.scannerModule.start();
|
|
202
283
|
logger.info("Runtime.start() scannerModule.start() returned");
|
|
203
284
|
this.started = true;
|
|
285
|
+
this.bus.emit("tracking.runtime_started", {
|
|
286
|
+
address: this.strategyConfig.address,
|
|
287
|
+
data: {
|
|
288
|
+
config: this.config,
|
|
289
|
+
strategyAddress: this.strategyConfig.address,
|
|
290
|
+
runtimeVersion: VERSION,
|
|
291
|
+
hasDsl: this.dslPlugin != null,
|
|
292
|
+
scannerCount: this.config.scanners?.length ?? 0,
|
|
293
|
+
actionCount: this.config.actions?.length ?? 0,
|
|
294
|
+
},
|
|
295
|
+
timestamp: new Date().toISOString(),
|
|
296
|
+
});
|
|
204
297
|
}
|
|
205
298
|
/**
|
|
206
299
|
* Cancel exchange SLs and archive DSL state for the strategy, then log removal.
|
|
@@ -237,11 +330,15 @@ export class Runtime {
|
|
|
237
330
|
usedSlotsByStrategy,
|
|
238
331
|
address: item.result.address,
|
|
239
332
|
});
|
|
333
|
+
const correlationId = randomUUID();
|
|
240
334
|
const hookEvent = {
|
|
241
335
|
type: HOOK_EVENT.ON_SIGNAL_DETECTED,
|
|
242
336
|
runtimeName: this.config.name,
|
|
243
337
|
address: item.result.address,
|
|
244
|
-
data:
|
|
338
|
+
data: {
|
|
339
|
+
...payload,
|
|
340
|
+
__correlationId: correlationId,
|
|
341
|
+
},
|
|
245
342
|
timestamp: new Date().toISOString(),
|
|
246
343
|
};
|
|
247
344
|
this.bus.emit(HOOK_EVENT.ON_SIGNAL_DETECTED, hookEvent);
|
|
@@ -264,6 +361,15 @@ export class Runtime {
|
|
|
264
361
|
if (!this.started)
|
|
265
362
|
return;
|
|
266
363
|
this.started = false;
|
|
364
|
+
this.bus.emit("tracking.runtime_stopped", {
|
|
365
|
+
address: this.strategyConfig.address,
|
|
366
|
+
data: {
|
|
367
|
+
uptimeMs: Date.now() - (this.startedAt ?? Date.now()),
|
|
368
|
+
runtimeVersion: VERSION,
|
|
369
|
+
strategyAddress: this.strategyConfig.address,
|
|
370
|
+
},
|
|
371
|
+
timestamp: new Date().toISOString(),
|
|
372
|
+
});
|
|
267
373
|
this.signalConsumerStopped = true;
|
|
268
374
|
if (this.signalQueueWait) {
|
|
269
375
|
const w = this.signalQueueWait;
|
|
@@ -274,10 +380,15 @@ export class Runtime {
|
|
|
274
380
|
await this.signalConsumerDone;
|
|
275
381
|
this.signalConsumerDone = null;
|
|
276
382
|
}
|
|
383
|
+
// riskGuardian cleanup removed — no background timer to stop
|
|
277
384
|
if (this.onScannerRunComplete != null) {
|
|
278
385
|
this.scannerModule.off("scanner:run:complete", this.onScannerRunComplete);
|
|
279
386
|
this.onScannerRunComplete = null;
|
|
280
387
|
}
|
|
388
|
+
if (this.actionNotificationSubscriber != null) {
|
|
389
|
+
this.actionNotificationSubscriber.dispose();
|
|
390
|
+
this.actionNotificationSubscriber = null;
|
|
391
|
+
}
|
|
281
392
|
await this.scannerModule.stop();
|
|
282
393
|
if (this.dslPlugin) {
|
|
283
394
|
this.dslPlugin.stop();
|
|
@@ -288,11 +399,86 @@ export class Runtime {
|
|
|
288
399
|
this.senpi = null;
|
|
289
400
|
}
|
|
290
401
|
this.healthStateModule = null;
|
|
402
|
+
if (this.trackingHandler) {
|
|
403
|
+
await this.trackingHandler.dispose();
|
|
404
|
+
this.trackingHandler = null;
|
|
405
|
+
}
|
|
291
406
|
if (this.bus.removeAllListeners) {
|
|
292
407
|
this.bus.removeAllListeners();
|
|
293
408
|
}
|
|
294
409
|
}
|
|
295
410
|
}
|
|
411
|
+
function deriveRiskHealth(gates) {
|
|
412
|
+
if (gates.some((g) => !g.evaluationOk))
|
|
413
|
+
return "unhealthy";
|
|
414
|
+
return "healthy";
|
|
415
|
+
}
|
|
416
|
+
function deriveEligibility(gates) {
|
|
417
|
+
for (const g of gates) {
|
|
418
|
+
if (g.status === "CLOSED")
|
|
419
|
+
return "CLOSED";
|
|
420
|
+
}
|
|
421
|
+
for (const g of gates) {
|
|
422
|
+
if (g.status === "COOLDOWN")
|
|
423
|
+
return "COOLDOWN";
|
|
424
|
+
}
|
|
425
|
+
return "OPEN";
|
|
426
|
+
}
|
|
427
|
+
function createRiskHealthProvider(riskGuard, strategyAddress) {
|
|
428
|
+
async function evaluate() {
|
|
429
|
+
const result = await riskGuard.checkGate(strategyAddress, {
|
|
430
|
+
evaluateAll: true,
|
|
431
|
+
source: "cli",
|
|
432
|
+
});
|
|
433
|
+
return result;
|
|
434
|
+
}
|
|
435
|
+
return {
|
|
436
|
+
async getHealthStatus() {
|
|
437
|
+
const result = await evaluate();
|
|
438
|
+
const gates = result.gates ?? [];
|
|
439
|
+
const health = deriveRiskHealth(gates);
|
|
440
|
+
const eligibility = deriveEligibility(gates);
|
|
441
|
+
return {
|
|
442
|
+
component: "risk",
|
|
443
|
+
health,
|
|
444
|
+
updatedAt: new Date().toISOString(),
|
|
445
|
+
summary: health === "healthy"
|
|
446
|
+
? `Risk gates evaluated (${eligibility})`
|
|
447
|
+
: `Risk gate evaluation failures detected (${eligibility})`,
|
|
448
|
+
enabled: true,
|
|
449
|
+
eligibility,
|
|
450
|
+
totals: {
|
|
451
|
+
gatesEvaluated: gates.length,
|
|
452
|
+
open: gates.filter((g) => g.status === "OPEN").length,
|
|
453
|
+
cooldown: gates.filter((g) => g.status === "COOLDOWN").length,
|
|
454
|
+
closed: gates.filter((g) => g.status === "CLOSED").length,
|
|
455
|
+
na: gates.filter((g) => g.status === "N_A").length,
|
|
456
|
+
fallbackCount: gates.filter((g) => g.fallbackApplied).length,
|
|
457
|
+
failedCount: gates.filter((g) => !g.evaluationOk).length,
|
|
458
|
+
},
|
|
459
|
+
gates,
|
|
460
|
+
};
|
|
461
|
+
},
|
|
462
|
+
async getSystemState() {
|
|
463
|
+
const result = await evaluate();
|
|
464
|
+
const gates = result.gates ?? [];
|
|
465
|
+
const health = deriveRiskHealth(gates);
|
|
466
|
+
const eligibility = deriveEligibility(gates);
|
|
467
|
+
return {
|
|
468
|
+
component: "risk",
|
|
469
|
+
health,
|
|
470
|
+
updatedAt: new Date().toISOString(),
|
|
471
|
+
state: {
|
|
472
|
+
enabled: true,
|
|
473
|
+
eligibility,
|
|
474
|
+
source: "cli",
|
|
475
|
+
checkedAt: new Date().toISOString(),
|
|
476
|
+
gates,
|
|
477
|
+
},
|
|
478
|
+
};
|
|
479
|
+
},
|
|
480
|
+
};
|
|
481
|
+
}
|
|
296
482
|
function createDisabledDslProvider() {
|
|
297
483
|
return {
|
|
298
484
|
async getHealthStatus() {
|