@senpi/runtime 3.0.0-dev.runtime-phase-2.20260623210537 → 3.0.0-dev.runtime-phase-2.20260625112547
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 +10 -9
- package/dist/actions/action-runtime-module.d.ts.map +1 -1
- package/dist/actions/action-runtime-module.js +1 -1
- package/dist/actions/action-runtime-module.js.map +1 -1
- package/dist/actions/decision-engine.d.ts.map +1 -1
- package/dist/actions/decision-engine.js +3 -0
- package/dist/actions/decision-engine.js.map +1 -1
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +54 -14
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/types.d.ts +10 -2
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js +8 -0
- package/dist/actions/types.js.map +1 -1
- package/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +80 -74
- 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 +0 -108
- package/dist/cli/senpi-commands.js.map +1 -1
- package/dist/constants/dsl/index.d.ts +2 -0
- package/dist/constants/dsl/index.d.ts.map +1 -1
- package/dist/constants/dsl/index.js +2 -0
- package/dist/constants/dsl/index.js.map +1 -1
- package/dist/dsl/config/parse-tiers.d.ts.map +1 -1
- package/dist/dsl/config/parse-tiers.js +6 -2
- package/dist/dsl/config/parse-tiers.js.map +1 -1
- package/dist/dsl/engine-client/config-mapping.d.ts +7 -0
- package/dist/dsl/engine-client/config-mapping.d.ts.map +1 -1
- package/dist/dsl/engine-client/config-mapping.js +16 -2
- package/dist/dsl/engine-client/config-mapping.js.map +1 -1
- package/dist/dsl/events/handlers.d.ts +18 -2
- package/dist/dsl/events/handlers.d.ts.map +1 -1
- package/dist/dsl/events/handlers.js +302 -213
- package/dist/dsl/events/handlers.js.map +1 -1
- package/dist/dsl/monitor/create-monitor.d.ts +15 -0
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
- package/dist/dsl/monitor/create-monitor.js +46 -9
- package/dist/dsl/monitor/create-monitor.js.map +1 -1
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
- package/dist/dsl/monitor/process-one-position.js +138 -77
- package/dist/dsl/monitor/process-one-position.js.map +1 -1
- package/dist/dsl/plugin/index.d.ts +16 -1
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js +35 -4
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/dsl/plugin/options.d.ts +18 -0
- package/dist/dsl/plugin/options.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/create-scanner-module.d.ts +4 -3
- package/dist/runtime/create-scanner-module.d.ts.map +1 -1
- package/dist/runtime/create-scanner-module.js +14 -5
- package/dist/runtime/create-scanner-module.js.map +1 -1
- package/dist/runtime/create-scanner-providers-for-run.d.ts.map +1 -1
- package/dist/runtime/create-scanner-providers-for-run.js +12 -1
- package/dist/runtime/create-scanner-providers-for-run.js.map +1 -1
- package/dist/runtime/load-runtime-config.js +1 -1
- package/dist/runtime/load-runtime-config.js.map +1 -1
- package/dist/runtime/map-strategies-registration.js +7 -8
- package/dist/runtime/map-strategies-registration.js.map +1 -1
- package/dist/runtime/map-strategies.d.ts.map +1 -1
- package/dist/runtime/map-strategies.js +12 -3
- package/dist/runtime/map-strategies.js.map +1 -1
- package/dist/runtime/reconcile-decide.d.ts +73 -0
- package/dist/runtime/reconcile-decide.d.ts.map +1 -0
- package/dist/runtime/reconcile-decide.js +186 -0
- package/dist/runtime/reconcile-decide.js.map +1 -0
- package/dist/runtime/reconcile-run.d.ts +62 -0
- package/dist/runtime/reconcile-run.d.ts.map +1 -0
- package/dist/runtime/reconcile-run.js +173 -0
- package/dist/runtime/reconcile-run.js.map +1 -0
- package/dist/runtime/reconcile-state.d.ts +44 -0
- package/dist/runtime/reconcile-state.d.ts.map +1 -1
- package/dist/runtime/reconcile-state.js +80 -44
- package/dist/runtime/reconcile-state.js.map +1 -1
- package/dist/runtime/risk-guard.d.ts.map +1 -1
- package/dist/runtime/risk-guard.js +17 -12
- package/dist/runtime/risk-guard.js.map +1 -1
- package/dist/runtime/runtime-schema.d.ts +2912 -1052
- package/dist/runtime/runtime-schema.d.ts.map +1 -1
- package/dist/runtime/runtime-schema.js +136 -42
- 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 +254 -8
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/scanner-registry.d.ts +1 -1
- package/dist/runtime/scanner-registry.d.ts.map +1 -1
- package/dist/runtime/scanner-registry.js +3 -12
- package/dist/runtime/scanner-registry.js.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.d.ts.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.js +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.js.map +1 -1
- package/dist/runtime/supervisor/orphan-sweep.js +1 -1
- package/dist/runtime/supervisor/orphan-sweep.js.map +1 -1
- package/dist/runtime/supervisor/supervisor-utils.d.ts +1 -1
- package/dist/runtime/supervisor/supervisor-utils.d.ts.map +1 -1
- package/dist/runtime/supervisor/supervisor-utils.js +1 -1
- package/dist/runtime/supervisor/supervisor-utils.js.map +1 -1
- package/dist/runtime-api/intake/acceptance-record.d.ts +10 -0
- package/dist/runtime-api/intake/acceptance-record.d.ts.map +1 -1
- package/dist/runtime-api/intake/acceptance-record.js +28 -0
- package/dist/runtime-api/intake/acceptance-record.js.map +1 -1
- package/dist/runtime-api/intake/intake-mount.d.ts.map +1 -1
- package/dist/runtime-api/intake/intake-mount.js +28 -36
- package/dist/runtime-api/intake/intake-mount.js.map +1 -1
- package/dist/runtime-api/intake/process-signal-post.d.ts +20 -1
- package/dist/runtime-api/intake/process-signal-post.d.ts.map +1 -1
- package/dist/runtime-api/intake/process-signal-post.js +57 -6
- package/dist/runtime-api/intake/process-signal-post.js.map +1 -1
- package/dist/runtime-api/intake/scanner-launcher.d.ts +18 -4
- package/dist/runtime-api/intake/scanner-launcher.d.ts.map +1 -1
- package/dist/runtime-api/intake/scanner-launcher.js +24 -3
- package/dist/runtime-api/intake/scanner-launcher.js.map +1 -1
- package/dist/runtime-api/intake/types.d.ts +16 -0
- package/dist/runtime-api/intake/types.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.schema.d.ts +4 -0
- package/dist/runtime-api/routes/signals.schema.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.schema.js +12 -0
- package/dist/runtime-api/routes/signals.schema.js.map +1 -1
- package/dist/scanners/external/scaffold/__main__.py +65 -24
- package/dist/scanners/external/scaffold/ctx.py +78 -0
- package/dist/scanners/external/scaffold/delivery.py +56 -22
- package/dist/scanners/external/scaffold/entrypoint_loader.py +42 -48
- package/dist/scanners/external/scaffold/journal.py +13 -2
- package/dist/scanners/external/scaffold/requirements.txt +11 -0
- package/dist/scanners/external/scaffold/scaffold.py +159 -128
- package/dist/scanners/external/scaffold/senpi_mcp.py +250 -0
- package/dist/scanners/external/scaffold/signal_envelope.py +177 -34
- package/dist/scanners/external/scaffold/state_manager.py +175 -0
- package/dist/scanners/external-scanner-receiver.d.ts +6 -0
- package/dist/scanners/external-scanner-receiver.d.ts.map +1 -1
- package/dist/scanners/external-scanner-receiver.js +14 -1
- package/dist/scanners/external-scanner-receiver.js.map +1 -1
- package/dist/scripts/run-dsl-standalone-live.d.ts +1 -1
- package/dist/scripts/run-dsl-standalone-live.js +5 -3
- package/dist/scripts/run-dsl-standalone-live.js.map +1 -1
- package/dist/senpi/client.d.ts +37 -4
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +101 -24
- package/dist/senpi/client.js.map +1 -1
- package/dist/state/state-manager.d.ts +17 -0
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +50 -4
- package/dist/state/state-manager.js.map +1 -1
- package/dist/strategy/strategy-state.d.ts +9 -1
- package/dist/strategy/strategy-state.d.ts.map +1 -1
- package/dist/strategy/strategy-state.js +62 -9
- package/dist/strategy/strategy-state.js.map +1 -1
- package/dist/tracking/constants.d.ts.map +1 -1
- package/dist/tracking/constants.js +2 -0
- package/dist/tracking/constants.js.map +1 -1
- package/dist/types/dsl/index.d.ts +1 -1
- package/dist/types/dsl/index.d.ts.map +1 -1
- package/dist/types/scanner.d.ts +7 -0
- package/dist/types/scanner.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +3 -1
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/utils/keyed-mutex.d.ts +37 -0
- package/dist/utils/keyed-mutex.d.ts.map +1 -0
- package/dist/utils/keyed-mutex.js +77 -0
- package/dist/utils/keyed-mutex.js.map +1 -0
- package/examples/strategies/README.md +17 -12
- package/examples/strategies/iguana/README.md +135 -0
- package/examples/strategies/iguana/recipe.yaml +137 -0
- package/examples/strategies/iguana/scanners/scan.py +243 -0
- package/examples/strategies/iguana/scanners/scoring.py +152 -0
- package/examples/strategies/raptor/README.md +156 -0
- package/examples/strategies/raptor/recipe.yaml +154 -0
- package/examples/strategies/raptor/scanners/scan.py +349 -0
- package/examples/strategies/raptor/scanners/scoring.py +452 -0
- package/examples/strategies/spider/README.md +89 -0
- package/examples/strategies/spider/scalp/recipe.yaml +129 -0
- package/examples/strategies/spider/scalp/scanners/scan.py +219 -0
- package/examples/strategies/spider/scalp/scanners/scoring.py +179 -0
- package/examples/strategies/spider/swing/recipe.yaml +137 -0
- package/examples/strategies/spider/swing/scanners/scan.py +334 -0
- package/examples/strategies/spider/swing/scanners/scoring.py +184 -0
- package/examples/strategies/turbine/README.md +166 -0
- package/examples/strategies/turbine/recipe-runners.yaml +123 -0
- package/examples/strategies/turbine/recipe-volume.yaml +129 -0
- package/examples/strategies/turbine/scanners/scan.py +283 -0
- package/examples/strategies/turbine/scanners/scoring.py +190 -0
- package/package.json +1 -1
- package/dist/scanners/external/liquidation-watchdog/README.md +0 -107
- package/dist/scanners/external/liquidation-watchdog/liquidation-watchdog.yaml +0 -48
- package/dist/scanners/external/liquidation-watchdog/producer.mjs +0 -336
- package/dist/scanners/external/momentum/README.md +0 -148
- package/dist/scanners/external/momentum/momentum.yaml +0 -116
- package/dist/scanners/external/momentum/producer.mjs +0 -251
- package/dist/scanners/external/shared/ingest.mjs +0 -112
- package/examples/README.md +0 -89
- package/examples/scanners-consumer-quickstart.mjs +0 -134
- package/examples/scanners-emerging-movers-v4.mjs +0 -287
- package/examples/scanners-liquidation-watchdog.mjs +0 -341
- package/examples/scanners-live-mcp.mjs +0 -208
- package/examples/scanners-multi-strategy.mjs +0 -165
- package/examples/scanners-position-tracker-e2e.mjs +0 -225
- package/examples/scanners-scheduled-events.mjs +0 -96
- package/examples/scanners-senpi-provider-client.mjs +0 -182
- package/examples/scanners-single-strategy.mjs +0 -198
- package/examples/strategies/dsl-showcase.yaml +0 -68
- package/examples/strategies/dsl.yaml +0 -51
- package/examples/strategies/fox-minimal-loosened.yaml +0 -240
- package/examples/strategies/fox-minimal.yaml +0 -242
- package/examples/strategies/minimal.yaml +0 -46
- package/examples/strategies/momentum/how-it-works.md +0 -48
- package/examples/strategies/momentum/momentum-guarded.yaml +0 -161
- package/examples/strategies/risk-showcase.yaml +0 -93
- package/examples/strategies/viper.yaml +0 -67
- package/examples/strategies/wolf.yaml +0 -72
- package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +0 -123
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-runtime-config.js","sourceRoot":"","sources":["../../src/runtime/load-runtime-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAiB,MAAM,KAAK,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,wCAAwC,EAAE,MAAM,8BAA8B,CAAC;AAMxF;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;CAQzC,CAAC;AAEF,MAAM,KAAK,GAAqE;IAC9E;QACE,SAAS,EAAE,iBAAiB;QAC5B,YAAY,EAAE,oEAAoE;QAClF,IAAI,EAAE,uRAAuR;KAC9R;IACD;QACE,SAAS,EAAE,wCAAwC;QACnD,YAAY,EAAE,8BAA8B;QAC5C,IAAI,EAAE,6FAA6F;KACpG;IACD;QACE,SAAS,EAAE,0BAA0B;QACrC,YAAY,EAAE,yCAAyC;QACvD,IAAI,EAAE,uLAAuL;KAC9L;IACD;QACE,SAAS,EAAE,gBAAgB;QAC3B,YAAY,EAAE,mBAAmB;QACjC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"load-runtime-config.js","sourceRoot":"","sources":["../../src/runtime/load-runtime-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAiB,MAAM,KAAK,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,wCAAwC,EAAE,MAAM,8BAA8B,CAAC;AAMxF;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;CAQzC,CAAC;AAEF,MAAM,KAAK,GAAqE;IAC9E;QACE,SAAS,EAAE,iBAAiB;QAC5B,YAAY,EAAE,oEAAoE;QAClF,IAAI,EAAE,uRAAuR;KAC9R;IACD;QACE,SAAS,EAAE,wCAAwC;QACnD,YAAY,EAAE,8BAA8B;QAC5C,IAAI,EAAE,6FAA6F;KACpG;IACD;QACE,SAAS,EAAE,0BAA0B;QACrC,YAAY,EAAE,yCAAyC;QACvD,IAAI,EAAE,uLAAuL;KAC9L;IACD;QACE,SAAS,EAAE,gBAAgB;QAC3B,YAAY,EAAE,mBAAmB;QACjC,IAAI,EAAE,0TAA0T;KACjU;IACD;QACE,SAAS,EAAE,gBAAgB;QAC3B,YAAY,EAAE,0BAA0B;QACxC,IAAI,EAAE,qFAAqF;KAC5F;IACD;QACE,SAAS,EAAE,6BAA6B;QACxC,YAAY,EAAE,6BAA6B;QAC3C,IAAI,EAAE,wHAAwH;KAC/H;IACD;QACE,SAAS,EAAE,iBAAiB;QAC5B,YAAY,EAAE,mBAAmB;QACjC,IAAI,EAAE,2MAA2M;KAClN;CACF,CAAC;AAEF;;GAEG;AACH,SAAS,UAAU,CAAC,IAAyB;IAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,KAAkD;IACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAA2B,CAAC;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1D,IACE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC7B,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,2BAA2B,EACvD,CAAC;QACD,OAAO,gPAAgP,CAAC;IAC1P,CAAC;IACD,KAAK,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;QACtD,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,OAAO,GAAG,OAAO,KAAK,IAAI,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,OAAe,EACf,MAA0D;IAE1D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,OAAO,SAAS,KAAK,GAAG,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GACX,+HAA+H,CAAC;IAClI,OAAO,GAAG,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,OAAO,uCAAuC,0BAA0B,EAAE,CAAC;AAC1H,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,wBAAwB,CAAC,MAAqB;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE/C,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAElC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,QAAQ,IAAI,QAAQ,KAAK,EAAE,CAAC;IACrC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,IAAI,KAAK,CACb,gFAAgF,OAAO,EAAE,CAC1F,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,MAAqB;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE/C,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAElC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,OAAO,QAAQ,IAAI,QAAQ,KAAK,EAAE,CAAC;IACrC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,IAAI,KAAK,CACb,8EAA8E,OAAO,EAAE,CACxF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,aAAqB,EACrB,OAAkC;IAElC,OAAO,CAAC,MAAM,wBAAwB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,aAAqB,EACrB,OAAkC;IAElC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC5C,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACvD,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,OAAO,QAAQ,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/E,MAAM,IAAI,KAAK,CACb,gFAAgF,MAAM,oCAAoC,0BAA0B,EAAE,CACvJ,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,oHAAoH;YAClH,0BAA0B,CAC7B,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAA4B,CAAC;IACpE,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,iGAAiG;YAC/F,sCAAsC;YACtC,kCAAkC;YAClC,0BAA0B,CAC7B,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAC9B,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAC7B,wCAAwC,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACtB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,SAAS,GAAI,IAAgC,CAAC,UAAU,CAAC;YAC/D,IACE,SAAS,IAAI,IAAI;gBACjB,OAAO,SAAS,KAAK,QAAQ;gBAC7B,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EACzB,CAAC;gBACD,IAAI,CAAC;oBACH,oBAAoB,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;gBACxD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,MAAM,GACV,GAAG,YAAY,wBAAwB;wBACrC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC7E,CAAC,CAAC,GAAG,YAAY,KAAK;4BACpB,CAAC,CAAC,GAAG,CAAC,OAAO;4BACb,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACpB,MAAM,IAAI,KAAK,CACb,yCAAyC,MAAM,yEAAyE,0BAA0B,EAAE,CACrJ,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAA8B,EAAE,CAAC;IACrE,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,MAAM,OAAO,GAAG,cAAc,CAC5B,mCAAmC,EACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAA2B;QACvC,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC,CACJ,CAAC;IACF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolve recipe `strategy` to a single StrategyRegistration for the scanner module.
|
|
3
3
|
*/
|
|
4
|
-
import { parseInterval } from "./parse-interval.js";
|
|
5
4
|
function buildScannerOverrides(config) {
|
|
6
5
|
const scanners = config.scanners ?? [];
|
|
7
6
|
const overrides = {};
|
|
8
7
|
for (const sc of scanners) {
|
|
9
8
|
const entry = {};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
// v2.0.0: built-in scanner cadence is integer `interval_seconds` only (the legacy
|
|
10
|
+
// `interval` duration string is rejected at schema load). The four v2 examples configure
|
|
11
|
+
// position_tracker with interval_seconds; without this override it fell back to the
|
|
12
|
+
// definition default (bugbot #156). external_scanner's interval_seconds is the supervisor
|
|
13
|
+
// tick cadence, consumed elsewhere — it must not become an engine scheduler override.
|
|
14
|
+
if (sc.type !== "external_scanner" && typeof sc.interval_seconds === "number") {
|
|
15
|
+
entry.intervalSeconds = sc.interval_seconds;
|
|
17
16
|
}
|
|
18
17
|
if (sc.config !== undefined) {
|
|
19
18
|
entry.config = sc.config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-strategies-registration.js","sourceRoot":"","sources":["../../src/runtime/map-strategies-registration.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"map-strategies-registration.js","sourceRoot":"","sources":["../../src/runtime/map-strategies-registration.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,SAAS,qBAAqB,CAAC,MAAqB;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAmE,EAAE,CAAC;IACrF,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAmD,EAAE,CAAC;QACjE,kFAAkF;QAClF,yFAAyF;QACzF,oFAAoF;QACpF,0FAA0F;QAC1F,sFAAsF;QACtF,IAAI,EAAE,CAAC,IAAI,KAAK,kBAAkB,IAAI,OAAO,EAAE,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;YAC9E,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,gBAAgB,CAAC;QAC9C,CAAC;QACD,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAAqB;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC9B,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC;AACrD,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,kCAAkC,CAAC,MAAqB;IACtE,OAAO,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -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,
|
|
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,CA2FjF;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAG9F"}
|
|
@@ -81,15 +81,24 @@ export function resolveStrategyConfig(recipeConfig) {
|
|
|
81
81
|
bypassMaxEntriesPerDayOnProfit: gr.bypass_max_entries_per_day_on_profit ?? false,
|
|
82
82
|
drawdownHaltPct: gr.drawdown_halt_pct,
|
|
83
83
|
drawdownResetOnDayRollover: gr.drawdown_reset_on_day_rollover ?? false,
|
|
84
|
-
|
|
84
|
+
// v2.0.0: recipe carries integer seconds (per_asset_cooldown_seconds); the
|
|
85
|
+
// internal StrategyConfig + risk-guard still reason in minutes, so convert here.
|
|
86
|
+
perAssetCooldownMinutes: typeof gr.per_asset_cooldown_seconds === "number"
|
|
87
|
+
? gr.per_asset_cooldown_seconds / 60
|
|
88
|
+
: undefined,
|
|
85
89
|
...(typeof gr.max_entries_per_day === "number" ? { maxEntriesPerDay: gr.max_entries_per_day } : {}),
|
|
86
90
|
...(typeof gr.max_consecutive_losses === "number" ? { maxConsecutiveLosses: gr.max_consecutive_losses } : {}),
|
|
87
|
-
|
|
91
|
+
// v2.0.0: recipe carries cooldown_seconds; convert to the internal minutes unit.
|
|
92
|
+
...(typeof gr.cooldown_seconds === "number" ? { cooldownMinutes: gr.cooldown_seconds / 60 } : {}),
|
|
88
93
|
};
|
|
89
94
|
if (typeof strategyConfig.guardRails.dailyLossLimit === "number") {
|
|
90
95
|
strategyConfig.dailyLossLimit = strategyConfig.guardRails.dailyLossLimit;
|
|
91
96
|
}
|
|
92
|
-
|
|
97
|
+
// v2.0.0: recipe carries data_retention_seconds; the internal field is hours.
|
|
98
|
+
strategyConfig.dataRetentionHours =
|
|
99
|
+
typeof riskBlock.data_retention_seconds === "number"
|
|
100
|
+
? Math.min(168, Math.max(1, riskBlock.data_retention_seconds / 3600))
|
|
101
|
+
: 48;
|
|
93
102
|
}
|
|
94
103
|
return strategyConfig;
|
|
95
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-strategies.js","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"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
|
|
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,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;QAClC,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;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC;IACpC,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,SAAS,CAAC,WAAsC,CAAC;QAC5D,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,IAAI,CAAC,CAAC;QAE7C,cAAc,CAAC,UAAU,GAAG;YAC1B,cAAc,EACZ,OAAO,EAAE,CAAC,oBAAoB,KAAK,QAAQ;gBACzC,CAAC,CAAC,CAAC,EAAE,CAAC,oBAAoB,GAAG,GAAG,CAAC,GAAG,SAAS;gBAC7C,CAAC,CAAC,SAAS;YACf,iBAAiB,EAAE,EAAE,CAAC,oBAA0C;YAChE,8BAA8B,EAAG,EAAE,CAAC,oCAAgD,IAAI,KAAK;YAC7F,eAAe,EAAE,EAAE,CAAC,iBAAuC;YAC3D,0BAA0B,EAAG,EAAE,CAAC,8BAA0C,IAAI,KAAK;YACnF,2EAA2E;YAC3E,iFAAiF;YACjF,uBAAuB,EACrB,OAAO,EAAE,CAAC,0BAA0B,KAAK,QAAQ;gBAC/C,CAAC,CAAE,EAAE,CAAC,0BAAqC,GAAG,EAAE;gBAChD,CAAC,CAAC,SAAS;YACf,GAAG,CAAC,OAAO,EAAE,CAAC,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnG,GAAG,CAAC,OAAO,EAAE,CAAC,sBAAsB,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,EAAE,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7G,iFAAiF;YACjF,GAAG,CAAC,OAAO,EAAE,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAG,EAAE,CAAC,gBAA2B,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9G,CAAC;QACF,IAAI,OAAQ,cAAc,CAAC,UAA0C,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;YAClG,cAAc,CAAC,cAAc,GAAI,cAAc,CAAC,UAA0C,CAAC,cAAc,CAAC;QAC5G,CAAC;QACD,8EAA8E;QAC9E,cAAc,CAAC,kBAAkB;YAC/B,OAAO,SAAS,CAAC,sBAAsB,KAAK,QAAQ;gBAClD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAG,SAAS,CAAC,sBAAiC,GAAG,IAAI,CAAC,CAAC;gBACjF,CAAC,CAAC,EAAE,CAAC;IACX,CAAC;IAED,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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure decision function: given the exchange's truth (open positions) and the runtime's DSL state,
|
|
3
|
+
* returns the list of reconcile actions required to bring runtime state in sync.
|
|
4
|
+
*
|
|
5
|
+
* No I/O, no imports of SenpiClient, no disk access, no Date.now, no side effects.
|
|
6
|
+
*/
|
|
7
|
+
import type { OpenPosition } from "../senpi/types.js";
|
|
8
|
+
import type { DslState } from "../types/dsl/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* SIZE_EPS — absolute threshold below which a position size is treated as "flat" (no position).
|
|
11
|
+
* Mirrors position-tracker.ts `DEFAULT_SIZE_CHANGE_EPSILON = 1e-9`:
|
|
12
|
+
* sub-unit IEEE-754 drift on perp venues is typically < 1e-12; any real sub-unit trade
|
|
13
|
+
* is ≥ 0.001 on the smallest venues, so 1e-9 cleanly separates float noise from real size.
|
|
14
|
+
* Boundary: |szi| <= SIZE_EPS → flat (ignored); |size diff| > SIZE_EPS → resize trigger.
|
|
15
|
+
*/
|
|
16
|
+
export declare const SIZE_EPS = 1e-9;
|
|
17
|
+
/**
|
|
18
|
+
* ENTRY_EPS — relative tolerance for entry-price comparison.
|
|
19
|
+
* Entry prices can be large (BTC ~60 000, ETH ~3 000) so an absolute epsilon
|
|
20
|
+
* would need per-asset tuning. A relative tolerance of 1e-6 (0.0001%) is
|
|
21
|
+
* large enough to suppress harmless floating-point serialisation drift
|
|
22
|
+
* (e.g. 60000.000000001 vs 60000.0) while small enough to catch any real
|
|
23
|
+
* re-entry/average-down event. Formula: |a - b| / max(|b|, 1) > ENTRY_EPS → drift.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ENTRY_EPS = 0.000001;
|
|
26
|
+
export interface ReconcileInputs {
|
|
27
|
+
/** Strategy wallet address — used only for context in returned actions (not for filtering). */
|
|
28
|
+
address: string;
|
|
29
|
+
/** All positions from the exchange for this wallet (both DEXes; may include zero-size rows). */
|
|
30
|
+
exchangePositions: OpenPosition[];
|
|
31
|
+
/** All DSL states for this wallet — function filters to active ones internally. */
|
|
32
|
+
runtimeDslStates: DslState[];
|
|
33
|
+
}
|
|
34
|
+
export type ReconcileAction = {
|
|
35
|
+
kind: "adopt";
|
|
36
|
+
coin: string;
|
|
37
|
+
dex: string;
|
|
38
|
+
position: OpenPosition;
|
|
39
|
+
} | {
|
|
40
|
+
kind: "gone";
|
|
41
|
+
coin: string;
|
|
42
|
+
dex: string;
|
|
43
|
+
state: DslState;
|
|
44
|
+
} | {
|
|
45
|
+
kind: "resize";
|
|
46
|
+
coin: string;
|
|
47
|
+
dex: string;
|
|
48
|
+
position: OpenPosition;
|
|
49
|
+
state: DslState;
|
|
50
|
+
};
|
|
51
|
+
export interface ReconcileResult {
|
|
52
|
+
actions: ReconcileAction[];
|
|
53
|
+
counts: {
|
|
54
|
+
toAdopt: number;
|
|
55
|
+
toArchive: number;
|
|
56
|
+
toResize: number;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Pure, idempotent reconcile decision function.
|
|
61
|
+
*
|
|
62
|
+
* Exchange is the source of truth. Running this on a converged state
|
|
63
|
+
* (after all returned actions have been applied) yields an empty action list.
|
|
64
|
+
*
|
|
65
|
+
* Duplicate exchange rows for the same (coin, dex) key: last-wins (later index in the
|
|
66
|
+
* array wins). This matches typical clearing-house payloads where the last row is freshest.
|
|
67
|
+
*
|
|
68
|
+
* Malformed rows (missing coin, NaN/Infinity size or entry, negative coin string) are
|
|
69
|
+
* silently skipped without throwing. This prevents a single bad row from blocking all
|
|
70
|
+
* reconciliation.
|
|
71
|
+
*/
|
|
72
|
+
export declare function decideReconcile(inputs: ReconcileInputs): ReconcileResult;
|
|
73
|
+
//# sourceMappingURL=reconcile-decide.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-decide.d.ts","sourceRoot":"","sources":["../../src/runtime/reconcile-decide.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAQtD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,OAAO,CAAC;AAE7B;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,WAAO,CAAC;AAI9B,MAAM,WAAW,eAAe;IAC9B,+FAA+F;IAC/F,OAAO,EAAE,MAAM,CAAC;IAChB,gGAAgG;IAChG,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,mFAAmF;IACnF,gBAAgB,EAAE,QAAQ,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE3F,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AA2CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAiHxE"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure decision function: given the exchange's truth (open positions) and the runtime's DSL state,
|
|
3
|
+
* returns the list of reconcile actions required to bring runtime state in sync.
|
|
4
|
+
*
|
|
5
|
+
* No I/O, no imports of SenpiClient, no disk access, no Date.now, no side effects.
|
|
6
|
+
*/
|
|
7
|
+
import { normalizeDslCoinDex } from "../utils/perp-coin.js";
|
|
8
|
+
import { createLogger } from "../utils/logger.js";
|
|
9
|
+
const logger = createLogger("[reconcile][decide]");
|
|
10
|
+
// ─── Epsilon constants ────────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* SIZE_EPS — absolute threshold below which a position size is treated as "flat" (no position).
|
|
13
|
+
* Mirrors position-tracker.ts `DEFAULT_SIZE_CHANGE_EPSILON = 1e-9`:
|
|
14
|
+
* sub-unit IEEE-754 drift on perp venues is typically < 1e-12; any real sub-unit trade
|
|
15
|
+
* is ≥ 0.001 on the smallest venues, so 1e-9 cleanly separates float noise from real size.
|
|
16
|
+
* Boundary: |szi| <= SIZE_EPS → flat (ignored); |size diff| > SIZE_EPS → resize trigger.
|
|
17
|
+
*/
|
|
18
|
+
export const SIZE_EPS = 1e-9;
|
|
19
|
+
/**
|
|
20
|
+
* ENTRY_EPS — relative tolerance for entry-price comparison.
|
|
21
|
+
* Entry prices can be large (BTC ~60 000, ETH ~3 000) so an absolute epsilon
|
|
22
|
+
* would need per-asset tuning. A relative tolerance of 1e-6 (0.0001%) is
|
|
23
|
+
* large enough to suppress harmless floating-point serialisation drift
|
|
24
|
+
* (e.g. 60000.000000001 vs 60000.0) while small enough to catch any real
|
|
25
|
+
* re-entry/average-down event. Formula: |a - b| / max(|b|, 1) > ENTRY_EPS → drift.
|
|
26
|
+
*/
|
|
27
|
+
export const ENTRY_EPS = 1e-6;
|
|
28
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
29
|
+
/** Canonical key for matching exchange position vs DSL state. */
|
|
30
|
+
function makeKey(coin, dex) {
|
|
31
|
+
const n = normalizeDslCoinDex(coin, dex);
|
|
32
|
+
return `${n.coin}:${n.dex}`;
|
|
33
|
+
}
|
|
34
|
+
/** Absolute position size as a number; returns 0 for missing/NaN/Infinity. */
|
|
35
|
+
function safeAbsSize(v) {
|
|
36
|
+
if (v === undefined || v === null)
|
|
37
|
+
return 0;
|
|
38
|
+
if (!isFinite(v) || isNaN(v))
|
|
39
|
+
return 0;
|
|
40
|
+
return Math.abs(v);
|
|
41
|
+
}
|
|
42
|
+
/** Entry price as a number; returns NaN for missing/NaN/Infinity. */
|
|
43
|
+
function safeEntry(v) {
|
|
44
|
+
if (v === undefined || v === null)
|
|
45
|
+
return NaN;
|
|
46
|
+
if (!isFinite(v) || isNaN(v))
|
|
47
|
+
return NaN;
|
|
48
|
+
return v;
|
|
49
|
+
}
|
|
50
|
+
/** Relative entry-price comparison: true if prices differ beyond ENTRY_EPS. */
|
|
51
|
+
function entryDrifted(exchangeEntry, dslEntry) {
|
|
52
|
+
if (!isFinite(exchangeEntry) || !isFinite(dslEntry))
|
|
53
|
+
return false; // malformed: skip
|
|
54
|
+
const ref = Math.max(Math.abs(dslEntry), 1);
|
|
55
|
+
return Math.abs(exchangeEntry - dslEntry) / ref > ENTRY_EPS;
|
|
56
|
+
}
|
|
57
|
+
/** Direction derived from signed size (positive = LONG, negative = SHORT). */
|
|
58
|
+
function directionFromSzi(szi) {
|
|
59
|
+
return szi >= 0 ? "LONG" : "SHORT";
|
|
60
|
+
}
|
|
61
|
+
/** Deterministic sort comparator for actions. */
|
|
62
|
+
function actionSortKey(a) {
|
|
63
|
+
return `${a.coin}:${a.dex}:${a.kind}`;
|
|
64
|
+
}
|
|
65
|
+
// ─── Core decision function ───────────────────────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* Pure, idempotent reconcile decision function.
|
|
68
|
+
*
|
|
69
|
+
* Exchange is the source of truth. Running this on a converged state
|
|
70
|
+
* (after all returned actions have been applied) yields an empty action list.
|
|
71
|
+
*
|
|
72
|
+
* Duplicate exchange rows for the same (coin, dex) key: last-wins (later index in the
|
|
73
|
+
* array wins). This matches typical clearing-house payloads where the last row is freshest.
|
|
74
|
+
*
|
|
75
|
+
* Malformed rows (missing coin, NaN/Infinity size or entry, negative coin string) are
|
|
76
|
+
* silently skipped without throwing. This prevents a single bad row from blocking all
|
|
77
|
+
* reconciliation.
|
|
78
|
+
*/
|
|
79
|
+
export function decideReconcile(inputs) {
|
|
80
|
+
const { exchangePositions, runtimeDslStates } = inputs;
|
|
81
|
+
// ── 1. Build exchange map — last-wins on duplicate (coin, dex) ──────────────
|
|
82
|
+
// ambiguousKeys: rows with a valid coin but a MALFORMED size (NaN/Infinity/missing).
|
|
83
|
+
// We cannot tell whether such a row is a live position or not. Fail-safe:
|
|
84
|
+
// mark the key ambiguous so it NEITHER adopts (can't size it) NOR lets a matching
|
|
85
|
+
// DSL state be archived as "gone". Archiving a live position on bad data is the
|
|
86
|
+
// worst possible outcome — so a malformed row freezes that market's
|
|
87
|
+
// reconcile until clean data arrives, rather than acting on garbage.
|
|
88
|
+
const exchangeMap = new Map();
|
|
89
|
+
const ambiguousKeys = new Set();
|
|
90
|
+
for (const pos of exchangePositions) {
|
|
91
|
+
const coin = (pos.coin ?? "").trim();
|
|
92
|
+
if (!coin)
|
|
93
|
+
continue; // malformed coin: skip entirely
|
|
94
|
+
const dex = (pos.dex ?? "").trim();
|
|
95
|
+
const key = makeKey(coin, dex);
|
|
96
|
+
const szi = pos.szi;
|
|
97
|
+
if (szi === undefined || szi === null || !isFinite(szi) || isNaN(szi)) {
|
|
98
|
+
// Malformed size → ambiguous: do not adopt, do not let it archive a DSL state.
|
|
99
|
+
ambiguousKeys.add(key);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const absSize = Math.abs(szi);
|
|
103
|
+
// Genuinely flat (finite, near-zero) → treat as absence: allows "gone" archival.
|
|
104
|
+
if (absSize <= SIZE_EPS)
|
|
105
|
+
continue;
|
|
106
|
+
exchangeMap.set(key, pos); // last-wins for duplicates
|
|
107
|
+
}
|
|
108
|
+
// ── 2. Build active DSL state map ───────────────────────────────────────────
|
|
109
|
+
const dslMap = new Map();
|
|
110
|
+
for (const state of runtimeDslStates) {
|
|
111
|
+
if (!state.active)
|
|
112
|
+
continue; // only compare active states
|
|
113
|
+
const key = makeKey(state.asset, state.dex ?? "");
|
|
114
|
+
// If duplicate keys in DSL (shouldn't happen), last-wins
|
|
115
|
+
dslMap.set(key, state);
|
|
116
|
+
}
|
|
117
|
+
// ── 3. Compute actions ───────────────────────────────────────────────────────
|
|
118
|
+
const actions = [];
|
|
119
|
+
// Check exchange positions against DSL
|
|
120
|
+
for (const [key, pos] of exchangeMap) {
|
|
121
|
+
const { coin: normCoin, dex: normDex } = normalizeDslCoinDex(pos.coin ?? "", pos.dex ?? "");
|
|
122
|
+
const dslState = dslMap.get(key);
|
|
123
|
+
if (!dslState) {
|
|
124
|
+
// adopt: exchange has a live position, DSL has no active state for it.
|
|
125
|
+
// A floor cannot be anchored without a finite entry; with no DSL state there is
|
|
126
|
+
// no known-good entry to fall back to. A non-finite entry here is as untrustworthy
|
|
127
|
+
// as a malformed size → freeze the market (no adopt, and no archive below).
|
|
128
|
+
if (!isFinite(safeEntry(pos.entryPx))) {
|
|
129
|
+
ambiguousKeys.add(key);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
actions.push({ kind: "adopt", coin: normCoin, dex: normDex, position: pos });
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// Check for drift: size, entry, or direction
|
|
136
|
+
const exchAbsSize = safeAbsSize(pos.szi);
|
|
137
|
+
const dslAbsSize = Math.abs(dslState.size);
|
|
138
|
+
const sizeDrifted = Math.abs(exchAbsSize - dslAbsSize) > SIZE_EPS;
|
|
139
|
+
const exchEntry = safeEntry(pos.entryPx);
|
|
140
|
+
const dslEntry = safeEntry(dslState.entryPrice);
|
|
141
|
+
const _entryDrifted = isNaN(exchEntry) || isNaN(dslEntry)
|
|
142
|
+
? false // malformed: skip entry comparison
|
|
143
|
+
: entryDrifted(exchEntry, dslEntry);
|
|
144
|
+
const exchDir = pos.szi !== undefined && isFinite(pos.szi) && !isNaN(pos.szi)
|
|
145
|
+
? directionFromSzi(pos.szi)
|
|
146
|
+
: null;
|
|
147
|
+
const dirDrifted = exchDir !== null && exchDir !== dslState.direction;
|
|
148
|
+
if (sizeDrifted || _entryDrifted || dirDrifted) {
|
|
149
|
+
// On a size/direction resize whose exchange entry is untrustworthy, re-anchor to
|
|
150
|
+
// the DSL's known-good entry rather than forwarding NaN (a NaN entry would seed a
|
|
151
|
+
// NaN floor and drive a NaN exchange stop). Size still comes from the exchange row.
|
|
152
|
+
const resizePos = isNaN(exchEntry) ? { ...pos, entryPx: dslState.entryPrice } : pos;
|
|
153
|
+
actions.push({ kind: "resize", coin: normCoin, dex: normDex, position: resizePos, state: dslState });
|
|
154
|
+
}
|
|
155
|
+
// else: in-sync → no action
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Check DSL states against exchange (find gone positions)
|
|
159
|
+
for (const [key, state] of dslMap) {
|
|
160
|
+
if (exchangeMap.has(key))
|
|
161
|
+
continue; // matched → handled in resize/in-sync loop above
|
|
162
|
+
// Fail-safe: a malformed exchange row for this market means we cannot confirm the
|
|
163
|
+
// position is closed. Do NOT archive a possibly-live position on ambiguous data.
|
|
164
|
+
if (ambiguousKeys.has(key)) {
|
|
165
|
+
const { coin: ambCoin, dex: ambDex } = normalizeDslCoinDex(state.asset, state.dex ?? "");
|
|
166
|
+
logger.warn("cannot confirm exchange state; not archiving market (ambiguous exchange row)", {
|
|
167
|
+
address: inputs.address,
|
|
168
|
+
coin: ambCoin,
|
|
169
|
+
dex: ambDex,
|
|
170
|
+
});
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const { coin: normCoin, dex: normDex } = normalizeDslCoinDex(state.asset, state.dex ?? "");
|
|
174
|
+
actions.push({ kind: "gone", coin: normCoin, dex: normDex, state });
|
|
175
|
+
}
|
|
176
|
+
// ── 4. Sort deterministically (coin → dex → kind) ────────────────────────────
|
|
177
|
+
actions.sort((a, b) => actionSortKey(a).localeCompare(actionSortKey(b)));
|
|
178
|
+
// ── 5. Compute counts ────────────────────────────────────────────────────────
|
|
179
|
+
const counts = {
|
|
180
|
+
toAdopt: actions.filter((a) => a.kind === "adopt").length,
|
|
181
|
+
toArchive: actions.filter((a) => a.kind === "gone").length,
|
|
182
|
+
toResize: actions.filter((a) => a.kind === "resize").length,
|
|
183
|
+
};
|
|
184
|
+
return { actions, counts };
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=reconcile-decide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-decide.js","sourceRoot":"","sources":["../../src/runtime/reconcile-decide.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Impure reconcile executor: wires decideReconcile (pure) with the I/O side-effects
|
|
3
|
+
* (adoptPosition, resizePosition, archiveGoneState).
|
|
4
|
+
*
|
|
5
|
+
* Design contract:
|
|
6
|
+
* - decideReconcile is the SOLE decision source (no second gone-computation here).
|
|
7
|
+
* - CH fetch returning null/undefined → success:false, zero mutations (R7 fail-safe).
|
|
8
|
+
* - getOpenPositions undefined (CH never fetched) → success:false, zero mutations.
|
|
9
|
+
* - Execution order within the serialize pass: archive gone FIRST, then adopt/resize
|
|
10
|
+
* (frees state before re-adopting; mirrors monitor order).
|
|
11
|
+
* - Each action is individually try/caught; one failure does not abort the rest.
|
|
12
|
+
* - Only successfully applied actions count toward ReconcileCounts.
|
|
13
|
+
*/
|
|
14
|
+
import type { SenpiClient } from "../senpi/client.js";
|
|
15
|
+
import type { StrategyState } from "../types/strategy.js";
|
|
16
|
+
import type { StateManager } from "../state/index.js";
|
|
17
|
+
import type { SenpiEventBus } from "../types/event-bus.js";
|
|
18
|
+
import type { PositionOpenedEvent } from "../types/dsl/index.js";
|
|
19
|
+
import type { OpenPosition } from "../senpi/types.js";
|
|
20
|
+
export interface RunReconcileDeps {
|
|
21
|
+
address: string;
|
|
22
|
+
strategyState: StrategyState;
|
|
23
|
+
senpi: SenpiClient;
|
|
24
|
+
stateManager: StateManager;
|
|
25
|
+
/** adoptPosition + resizePosition — satisfied by DslPlugin or a compatible adopter. */
|
|
26
|
+
adopter: {
|
|
27
|
+
adoptPosition(p: PositionOpenedEvent): Promise<void>;
|
|
28
|
+
resizePosition(p: PositionOpenedEvent): Promise<void>;
|
|
29
|
+
};
|
|
30
|
+
bus?: SenpiEventBus;
|
|
31
|
+
/**
|
|
32
|
+
* Serializes the whole fetch+decide+execute pass against the trade loop / other reconciles.
|
|
33
|
+
* Default: run directly (T5 will pass a reconcileMutex-backed serializer).
|
|
34
|
+
*/
|
|
35
|
+
serialize?: <T>(fn: () => Promise<T>) => Promise<T>;
|
|
36
|
+
}
|
|
37
|
+
export interface ReconcileCounts {
|
|
38
|
+
adopted: number;
|
|
39
|
+
resized: number;
|
|
40
|
+
archived: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Map an OpenPosition (from clearinghouse) to the PositionOpenedEvent shape expected
|
|
44
|
+
* by adoptPosition / resizePosition.
|
|
45
|
+
*
|
|
46
|
+
* Field mapping:
|
|
47
|
+
* address → address (strategy wallet; same as deps.address)
|
|
48
|
+
* wallet → position.wallet if set, else address (clearinghouse rows rarely carry wallet)
|
|
49
|
+
* coin → position.coin
|
|
50
|
+
* szi → String(position.szi) — signed; positive=LONG, negative=SHORT
|
|
51
|
+
* entryPx → String(position.entryPx ?? 0)
|
|
52
|
+
* leverage → position.leverage ?? 1
|
|
53
|
+
* dex → position.dex if non-empty, else undefined (handlePositionOpened normalizes "")
|
|
54
|
+
*
|
|
55
|
+
* Note: PositionOpenedEvent.szi is a string (the handler parses it); OpenPosition.szi is a number.
|
|
56
|
+
*/
|
|
57
|
+
export declare function openPositionToPayload(pos: OpenPosition, address: string): PositionOpenedEvent;
|
|
58
|
+
export declare function runReconcile(deps: RunReconcileDeps): Promise<{
|
|
59
|
+
success: boolean;
|
|
60
|
+
counts: ReconcileCounts;
|
|
61
|
+
}>;
|
|
62
|
+
//# sourceMappingURL=reconcile-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-run.d.ts","sourceRoot":"","sources":["../../src/runtime/reconcile-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAStD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,uFAAuF;IACvF,OAAO,EAAE;QACP,aAAa,CAAC,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,cAAc,CAAC,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACvD,CAAC;IACF,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,MAAM,GACd,mBAAmB,CAWrB;AAID,wBAAsB,YAAY,CAChC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC,CA2IxD"}
|