@senpi/runtime 3.0.117 → 3.0.122
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 +16 -0
- package/dist/actions/action-events.d.ts +7 -21
- package/dist/actions/action-events.d.ts.map +1 -1
- package/dist/actions/action-events.js +26 -54
- package/dist/actions/action-events.js.map +1 -1
- package/dist/actions/action-runtime-module.d.ts.map +1 -1
- package/dist/actions/action-runtime-module.js +7 -38
- package/dist/actions/action-runtime-module.js.map +1 -1
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
- package/dist/actions/close-position/close-position.action.js +15 -122
- 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 +2 -15
- package/dist/actions/decision-engine.js.map +1 -1
- package/dist/actions/event-derivation.d.ts +2 -71
- package/dist/actions/event-derivation.d.ts.map +1 -1
- package/dist/actions/event-derivation.js +8 -251
- package/dist/actions/event-derivation.js.map +1 -1
- package/dist/actions/open-position/open-position.action.d.ts +2 -17
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +56 -162
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.d.ts +1 -2
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +17 -62
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/actions/store/types.d.ts +2 -9
- package/dist/actions/store/types.d.ts.map +1 -1
- package/dist/actions/store/types.js.map +1 -1
- package/dist/actions/types.d.ts +0 -13
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js +0 -13
- package/dist/actions/types.js.map +1 -1
- package/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +16 -11
- 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 +18 -7
- package/dist/cli/senpi-commands.js.map +1 -1
- package/dist/constants/dsl/index.d.ts +17 -6
- package/dist/constants/dsl/index.d.ts.map +1 -1
- package/dist/constants/dsl/index.js +17 -6
- package/dist/constants/dsl/index.js.map +1 -1
- package/dist/dsl/engine/floors.d.ts +25 -1
- package/dist/dsl/engine/floors.d.ts.map +1 -1
- package/dist/dsl/engine/floors.js +38 -6
- package/dist/dsl/engine/floors.js.map +1 -1
- package/dist/dsl/engine/index.d.ts +1 -1
- package/dist/dsl/engine/index.d.ts.map +1 -1
- package/dist/dsl/engine/index.js +1 -1
- package/dist/dsl/engine/index.js.map +1 -1
- package/dist/dsl/engine/round.d.ts +22 -2
- package/dist/dsl/engine/round.d.ts.map +1 -1
- package/dist/dsl/engine/round.js +78 -5
- package/dist/dsl/engine/round.js.map +1 -1
- package/dist/dsl/engine/tick.d.ts.map +1 -1
- package/dist/dsl/engine/tick.js +31 -16
- package/dist/dsl/engine/tick.js.map +1 -1
- package/dist/dsl/engine-client/event-mapping.d.ts.map +1 -1
- package/dist/dsl/engine-client/event-mapping.js +0 -14
- package/dist/dsl/engine-client/event-mapping.js.map +1 -1
- package/dist/dsl/events/build-closed-event.d.ts +1 -16
- package/dist/dsl/events/build-closed-event.d.ts.map +1 -1
- package/dist/dsl/events/build-closed-event.js +0 -6
- package/dist/dsl/events/build-closed-event.js.map +1 -1
- package/dist/dsl/events/handlers.d.ts +0 -7
- package/dist/dsl/events/handlers.d.ts.map +1 -1
- package/dist/dsl/events/handlers.js +7 -37
- package/dist/dsl/events/handlers.js.map +1 -1
- package/dist/dsl/events/initial-state.d.ts +1 -1
- package/dist/dsl/events/initial-state.d.ts.map +1 -1
- package/dist/dsl/events/initial-state.js +4 -7
- package/dist/dsl/events/initial-state.js.map +1 -1
- package/dist/dsl/monitor/create-monitor.d.ts +2 -6
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
- package/dist/dsl/monitor/create-monitor.js +9 -15
- package/dist/dsl/monitor/create-monitor.js.map +1 -1
- package/dist/dsl/monitor/dsl-failure-events.d.ts +0 -2
- package/dist/dsl/monitor/dsl-failure-events.d.ts.map +1 -1
- package/dist/dsl/monitor/dsl-failure-events.js +1 -2
- package/dist/dsl/monitor/dsl-failure-events.js.map +1 -1
- package/dist/dsl/monitor/exchange-sync.d.ts +8 -3
- package/dist/dsl/monitor/exchange-sync.d.ts.map +1 -1
- package/dist/dsl/monitor/exchange-sync.js +16 -4
- package/dist/dsl/monitor/exchange-sync.js.map +1 -1
- package/dist/dsl/monitor/process-one-position.d.ts +0 -1
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
- package/dist/dsl/monitor/process-one-position.js +113 -62
- package/dist/dsl/monitor/process-one-position.js.map +1 -1
- package/dist/dsl/plugin/index.d.ts +10 -12
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js +14 -12
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/health/types.d.ts +0 -13
- package/dist/health/types.d.ts.map +1 -1
- package/dist/health/types.js +0 -12
- package/dist/health/types.js.map +1 -1
- package/dist/index.d.ts +4 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +206 -257
- package/dist/index.js.map +1 -1
- package/dist/runtime/action-registry.d.ts.map +1 -1
- package/dist/runtime/action-registry.js +3 -4
- package/dist/runtime/action-registry.js.map +1 -1
- package/dist/runtime/auto-update/coordinator.d.ts +16 -0
- package/dist/runtime/auto-update/coordinator.d.ts.map +1 -1
- package/dist/runtime/auto-update/coordinator.js +129 -13
- package/dist/runtime/auto-update/coordinator.js.map +1 -1
- package/dist/runtime/auto-update/run-update-command.d.ts.map +1 -1
- package/dist/runtime/auto-update/run-update-command.js +18 -14
- package/dist/runtime/auto-update/run-update-command.js.map +1 -1
- package/dist/runtime/auto-update/types.d.ts +17 -1
- package/dist/runtime/auto-update/types.d.ts.map +1 -1
- package/dist/runtime/auto-update/types.js +11 -0
- package/dist/runtime/auto-update/types.js.map +1 -1
- package/dist/runtime/boot-skip.d.ts +73 -0
- package/dist/runtime/boot-skip.d.ts.map +1 -0
- package/dist/runtime/boot-skip.js +113 -0
- package/dist/runtime/boot-skip.js.map +1 -0
- package/dist/runtime/create-runtime-context.d.ts +2 -0
- package/dist/runtime/create-runtime-context.d.ts.map +1 -1
- package/dist/runtime/create-runtime-context.js +1 -0
- package/dist/runtime/create-runtime-context.js.map +1 -1
- package/dist/runtime/domain-events.d.ts.map +1 -1
- package/dist/runtime/domain-events.js +0 -7
- package/dist/runtime/domain-events.js.map +1 -1
- package/dist/runtime/lifecycle-events.d.ts +43 -10
- package/dist/runtime/lifecycle-events.d.ts.map +1 -1
- package/dist/runtime/lifecycle-events.js +83 -12
- package/dist/runtime/lifecycle-events.js.map +1 -1
- package/dist/runtime/lifecycle-reaper.d.ts +202 -0
- package/dist/runtime/lifecycle-reaper.d.ts.map +1 -0
- package/dist/runtime/lifecycle-reaper.js +390 -0
- package/dist/runtime/lifecycle-reaper.js.map +1 -0
- package/dist/runtime/reconcile-run.d.ts +3 -13
- package/dist/runtime/reconcile-run.d.ts.map +1 -1
- package/dist/runtime/reconcile-run.js +3 -4
- package/dist/runtime/reconcile-run.js.map +1 -1
- package/dist/runtime/reconcile-state.d.ts +0 -8
- package/dist/runtime/reconcile-state.d.ts.map +1 -1
- package/dist/runtime/reconcile-state.js +1 -4
- package/dist/runtime/reconcile-state.js.map +1 -1
- package/dist/runtime/run.d.ts +5 -1
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +1 -0
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runtime-schema.js +3 -3
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +2 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +4 -27
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.d.ts +0 -13
- package/dist/runtime/supervisor/long-running-supervisor.d.ts.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.js +0 -1
- package/dist/runtime/supervisor/long-running-supervisor.js.map +1 -1
- package/dist/runtime/update-apply-deps.d.ts +23 -2
- package/dist/runtime/update-apply-deps.d.ts.map +1 -1
- package/dist/runtime/update-apply-deps.js +11 -5
- package/dist/runtime/update-apply-deps.js.map +1 -1
- package/dist/runtime/validate-dsl-position-tracking.d.ts.map +1 -1
- package/dist/runtime/validate-dsl-position-tracking.js +1 -2
- package/dist/runtime/validate-dsl-position-tracking.js.map +1 -1
- package/dist/runtime-api/handlers/ingest-signals.d.ts.map +1 -1
- package/dist/runtime-api/handlers/ingest-signals.js +0 -1
- package/dist/runtime-api/handlers/ingest-signals.js.map +1 -1
- package/dist/runtime-api/handlers/types.d.ts +0 -5
- package/dist/runtime-api/handlers/types.d.ts.map +1 -1
- package/dist/runtime-api/intake/intake-events.d.ts +1 -1
- package/dist/runtime-api/intake/intake-events.d.ts.map +1 -1
- package/dist/runtime-api/intake/intake-events.js +3 -9
- package/dist/runtime-api/intake/intake-events.js.map +1 -1
- package/dist/runtime-api/intake/intake-mount.d.ts.map +1 -1
- package/dist/runtime-api/intake/intake-mount.js +19 -4
- package/dist/runtime-api/intake/intake-mount.js.map +1 -1
- package/dist/runtime-api/intake/process-error-post.d.ts +1 -6
- package/dist/runtime-api/intake/process-error-post.d.ts.map +1 -1
- package/dist/runtime-api/intake/process-error-post.js +1 -5
- package/dist/runtime-api/intake/process-error-post.js.map +1 -1
- package/dist/runtime-api/intake/process-signal-post.d.ts +1 -7
- package/dist/runtime-api/intake/process-signal-post.d.ts.map +1 -1
- package/dist/runtime-api/intake/process-signal-post.js +0 -5
- package/dist/runtime-api/intake/process-signal-post.js.map +1 -1
- package/dist/runtime-api/intake/scaffold-error-router.js.map +1 -1
- package/dist/runtime-api/intake/scanner-launcher.d.ts.map +1 -1
- package/dist/runtime-api/intake/scanner-launcher.js +0 -15
- package/dist/runtime-api/intake/scanner-launcher.js.map +1 -1
- package/dist/runtime-api/intake/types.d.ts +0 -55
- package/dist/runtime-api/intake/types.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.d.ts +0 -2
- package/dist/runtime-api/routes/signals.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.js +1 -5
- package/dist/runtime-api/routes/signals.js.map +1 -1
- package/dist/runtime-api/routes/signals.schema.d.ts +0 -43
- package/dist/runtime-api/routes/signals.schema.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.schema.js +0 -43
- package/dist/runtime-api/routes/signals.schema.js.map +1 -1
- package/dist/runtime-api/server.d.ts +1 -7
- package/dist/runtime-api/server.d.ts.map +1 -1
- package/dist/runtime-api/server.js +0 -1
- package/dist/runtime-api/server.js.map +1 -1
- package/dist/scanners/engine/engine.d.ts +1 -22
- package/dist/scanners/engine/engine.d.ts.map +1 -1
- package/dist/scanners/engine/engine.js +11 -78
- package/dist/scanners/engine/engine.js.map +1 -1
- package/dist/scanners/engine/lifecycle.d.ts +1 -7
- package/dist/scanners/engine/lifecycle.d.ts.map +1 -1
- package/dist/scanners/events.d.ts +0 -4
- package/dist/scanners/events.d.ts.map +1 -1
- package/dist/scanners/events.js +0 -2
- package/dist/scanners/events.js.map +1 -1
- package/dist/scanners/external/scaffold/delivery.py +25 -194
- package/dist/scanners/external/scaffold/scaffold.py +31 -172
- package/dist/scanners/external/scaffold/senpi_mcp.py +8 -150
- package/dist/scanners/external-scanner-receiver.d.ts +0 -17
- package/dist/scanners/external-scanner-receiver.d.ts.map +1 -1
- package/dist/scanners/external-scanner-receiver.js +0 -8
- package/dist/scanners/external-scanner-receiver.js.map +1 -1
- package/dist/scanners/runtime-module.d.ts +0 -1
- package/dist/scanners/runtime-module.d.ts.map +1 -1
- package/dist/scanners/runtime-module.js +9 -66
- package/dist/scanners/runtime-module.js.map +1 -1
- package/dist/skills-manager/manifest.d.ts.map +1 -1
- package/dist/skills-manager/manifest.js +1 -0
- package/dist/skills-manager/manifest.js.map +1 -1
- package/dist/skills-manager/skills-manifest.json +1 -0
- package/dist/telemetry/attributes.d.ts +0 -20
- package/dist/telemetry/attributes.d.ts.map +1 -1
- package/dist/telemetry/attributes.js +0 -24
- package/dist/telemetry/attributes.js.map +1 -1
- package/dist/telemetry/event-builders.d.ts +6 -81
- package/dist/telemetry/event-builders.d.ts.map +1 -1
- package/dist/telemetry/event-builders.js +17 -141
- package/dist/telemetry/event-builders.js.map +1 -1
- package/dist/telemetry/event-store.d.ts +0 -6
- package/dist/telemetry/event-store.d.ts.map +1 -1
- package/dist/telemetry/event-store.js +8 -12
- package/dist/telemetry/event-store.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +2 -14
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +4 -19
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/telemetry/spans/redact-pii.d.ts.map +1 -1
- package/dist/telemetry/spans/redact-pii.js +2 -18
- package/dist/telemetry/spans/redact-pii.js.map +1 -1
- package/dist/telemetry/tracing.d.ts +0 -9
- package/dist/telemetry/tracing.d.ts.map +1 -1
- package/dist/telemetry/tracing.js +0 -36
- package/dist/telemetry/tracing.js.map +1 -1
- package/dist/types/dsl/index.d.ts +1 -12
- package/dist/types/dsl/index.d.ts.map +1 -1
- package/dist/types/runtime.d.ts +8 -0
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/types/scanner.d.ts +0 -15
- package/dist/types/scanner.d.ts.map +1 -1
- package/dist/utils/event-catalog.d.ts +91 -166
- package/dist/utils/event-catalog.d.ts.map +1 -1
- package/dist/utils/event-catalog.js +13 -18
- package/dist/utils/event-catalog.js.map +1 -1
- package/dist/utils/keyed-mutex.d.ts +3 -2
- package/dist/utils/keyed-mutex.d.ts.map +1 -1
- package/dist/utils/keyed-mutex.js +3 -2
- package/dist/utils/keyed-mutex.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -4
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/validate/recipe-checks.d.ts.map +1 -1
- package/dist/validate/recipe-checks.js +2 -2
- package/dist/validate/recipe-checks.js.map +1 -1
- package/openclaw.plugin.json +5 -1
- package/package.json +1 -1
- package/dist/actions/skipped-signal-results.d.ts +0 -25
- package/dist/actions/skipped-signal-results.d.ts.map +0 -1
- package/dist/actions/skipped-signal-results.js +0 -71
- package/dist/actions/skipped-signal-results.js.map +0 -1
- package/dist/runtime-api/intake/ingest-request.d.ts +0 -17
- package/dist/runtime-api/intake/ingest-request.d.ts.map +0 -1
- package/dist/runtime-api/intake/ingest-request.js +0 -34
- package/dist/runtime-api/intake/ingest-request.js.map +0 -1
- package/dist/runtime-api/intake/scaffold-tick-router.d.ts +0 -39
- package/dist/runtime-api/intake/scaffold-tick-router.d.ts.map +0 -1
- package/dist/runtime-api/intake/scaffold-tick-router.js +0 -122
- package/dist/runtime-api/intake/scaffold-tick-router.js.map +0 -1
- package/dist/scanners/external/scaffold/tick_facts.py +0 -130
- package/dist/scanners/external/scaffold/ulid.py +0 -58
- package/dist/telemetry/live-telemetry.d.ts +0 -238
- package/dist/telemetry/live-telemetry.d.ts.map +0 -1
- package/dist/telemetry/live-telemetry.js +0 -853
- package/dist/telemetry/live-telemetry.js.map +0 -1
- package/dist/telemetry/scanner-stats.d.ts +0 -143
- package/dist/telemetry/scanner-stats.d.ts.map +0 -1
- package/dist/telemetry/scanner-stats.js +0 -426
- package/dist/telemetry/scanner-stats.js.map +0 -1
- package/dist/telemetry/scanner-tick-feed.d.ts +0 -87
- package/dist/telemetry/scanner-tick-feed.d.ts.map +0 -1
- package/dist/telemetry/scanner-tick-feed.js +0 -48
- package/dist/telemetry/scanner-tick-feed.js.map +0 -1
- package/dist/telemetry/strategy-topology.d.ts +0 -99
- package/dist/telemetry/strategy-topology.d.ts.map +0 -1
- package/dist/telemetry/strategy-topology.js +0 -93
- package/dist/telemetry/strategy-topology.js.map +0 -1
- package/dist/telemetry/telemetry-publisher.d.ts +0 -63
- package/dist/telemetry/telemetry-publisher.d.ts.map +0 -1
- package/dist/telemetry/telemetry-publisher.js +0 -229
- package/dist/telemetry/telemetry-publisher.js.map +0 -1
- package/dist/telemetry/tick-frame.d.ts +0 -212
- package/dist/telemetry/tick-frame.d.ts.map +0 -1
- package/dist/telemetry/tick-frame.js +0 -421
- package/dist/telemetry/tick-frame.js.map +0 -1
- package/dist/telemetry/timeline-buffer.d.ts +0 -95
- package/dist/telemetry/timeline-buffer.d.ts.map +0 -1
- package/dist/telemetry/timeline-buffer.js +0 -237
- package/dist/telemetry/timeline-buffer.js.map +0 -1
- package/dist/utils/telemetry-required-log.d.ts +0 -60
- package/dist/utils/telemetry-required-log.d.ts.map +0 -1
- package/dist/utils/telemetry-required-log.js +0 -105
- package/dist/utils/telemetry-required-log.js.map +0 -1
- package/dist/utils/ulid.d.ts +0 -9
- package/dist/utils/ulid.d.ts.map +0 -1
- package/dist/utils/ulid.js +0 -43
- package/dist/utils/ulid.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dsl/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dsl/engine/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Rounding for DSL protective price levels (stops).
|
|
3
3
|
*/
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Round a protective price level onto Hyperliquid's price grid, biased AWAY from the mark.
|
|
6
|
+
*
|
|
7
|
+
* A LONG's stop sits below the mark so it rounds down; a SHORT's sits above so it rounds up.
|
|
8
|
+
* THIS service's rounding may then only ever loosen a stop, never tighten it and never move it
|
|
9
|
+
* across the mark: the trading engine rejects `slTriggerPrice >= currentPrice` for a LONG (and
|
|
10
|
+
* `<=` for a SHORT) as "would execute immediately", and a rejected stop leaves the position with
|
|
11
|
+
* no exchange-side protection at all.
|
|
12
|
+
*
|
|
13
|
+
* It is not an end-to-end guarantee. The trading engine re-rounds what we send with
|
|
14
|
+
* `roundToDecimals(price, 6 - szDecimals)`, which is round-to-NEAREST (`utils.go:133-136`), so
|
|
15
|
+
* for an asset whose `szDecimals` forces fewer than 6 decimals it can still move a LONG floor
|
|
16
|
+
* back up by half a venue tick. Reading per-asset `szDecimals` is what would close that; until
|
|
17
|
+
* then the residual degrades to a rejection, which the phase-2 breach path now turns into an
|
|
18
|
+
* exit rather than a silent no-stop.
|
|
19
|
+
*
|
|
20
|
+
* Non-finite, zero and negative inputs are returned unchanged — there is no meaningful grid
|
|
21
|
+
* for them, and silently manufacturing a level would be worse than passing the caller's own
|
|
22
|
+
* value through to its validation.
|
|
23
|
+
*/
|
|
24
|
+
export declare function roundProtectiveLevel(value: number, direction: "LONG" | "SHORT"): number;
|
|
5
25
|
//# sourceMappingURL=round.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/round.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"round.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/round.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoDH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAIvF"}
|
package/dist/dsl/engine/round.js
CHANGED
|
@@ -1,9 +1,82 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Rounding for DSL protective price levels (stops).
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
/** Hyperliquid's price rule: significant figures, then a per-asset decimal cap. */
|
|
5
|
+
const SIG_FIGS = 5;
|
|
6
|
+
/**
|
|
7
|
+
* `6 - szDecimals` is the perp decimal cap; 6 is its loosest value and the runtime has no
|
|
8
|
+
* per-asset `szDecimals`, so this is the tightest bound we can assert without one.
|
|
9
|
+
*/
|
|
10
|
+
const MAX_DECIMALS = 6;
|
|
11
|
+
/** Decimal exponent of `value`, read off its shortest exponential form so no rounding can bump it. */
|
|
12
|
+
function decimalExponent(value) {
|
|
13
|
+
const s = value.toExponential();
|
|
14
|
+
return Number(s.slice(s.indexOf("e") + 1));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Quantise to `SIG_FIGS`, biased away from the mark.
|
|
18
|
+
*
|
|
19
|
+
* `Number(value.toPrecision(n))` is used rather than `Math.floor(value * 10 ** k)` because the
|
|
20
|
+
* latter carries binary floating-point artifacts (`8.29 * 1e4 === 82899.99999999999`) that
|
|
21
|
+
* silently drift the level by a tick. `toPrecision` gives the NEAREST grid value; we step one
|
|
22
|
+
* unit in the last place only when that landed on the wrong side.
|
|
23
|
+
*/
|
|
24
|
+
function toSignificantFigures(value, roundDown) {
|
|
25
|
+
const nearest = Number(value.toPrecision(SIG_FIGS));
|
|
26
|
+
if (nearest === value)
|
|
27
|
+
return value;
|
|
28
|
+
const ulp = 10 ** (decimalExponent(value) - (SIG_FIGS - 1));
|
|
29
|
+
if (roundDown && nearest > value)
|
|
30
|
+
return Number((nearest - ulp).toPrecision(SIG_FIGS));
|
|
31
|
+
if (!roundDown && nearest < value)
|
|
32
|
+
return Number((nearest + ulp).toPrecision(SIG_FIGS));
|
|
33
|
+
return nearest;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Quantise to `MAX_DECIMALS`, biased away from the mark. Same nearest-then-step approach.
|
|
37
|
+
*
|
|
38
|
+
* Below the 1e-6 grid there is no representable protective level at all: rounding down gives 0,
|
|
39
|
+
* which is no stop, and rounding up gives 1e-6, which for a SHORT can sit multiples above the
|
|
40
|
+
* level asked for. Both are worse than passing the significant-figure value through and letting
|
|
41
|
+
* the venue's own validation answer. No Hyperliquid perp trades there, so this is a deliberate
|
|
42
|
+
* decision about an unreachable input rather than a supported price range — and it is why the
|
|
43
|
+
* "at most 6 decimals" guarantee is stated for inputs at or above 1e-6.
|
|
44
|
+
*/
|
|
45
|
+
function toMaxDecimals(value, roundDown) {
|
|
46
|
+
const scale = 10 ** MAX_DECIMALS;
|
|
47
|
+
if (value < 1 / scale)
|
|
48
|
+
return value;
|
|
49
|
+
let units = Math.round(Number(value.toFixed(MAX_DECIMALS)) * scale);
|
|
50
|
+
if (roundDown && units / scale > value)
|
|
51
|
+
units -= 1;
|
|
52
|
+
if (!roundDown && units / scale < value)
|
|
53
|
+
units += 1;
|
|
54
|
+
return units / scale;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Round a protective price level onto Hyperliquid's price grid, biased AWAY from the mark.
|
|
58
|
+
*
|
|
59
|
+
* A LONG's stop sits below the mark so it rounds down; a SHORT's sits above so it rounds up.
|
|
60
|
+
* THIS service's rounding may then only ever loosen a stop, never tighten it and never move it
|
|
61
|
+
* across the mark: the trading engine rejects `slTriggerPrice >= currentPrice` for a LONG (and
|
|
62
|
+
* `<=` for a SHORT) as "would execute immediately", and a rejected stop leaves the position with
|
|
63
|
+
* no exchange-side protection at all.
|
|
64
|
+
*
|
|
65
|
+
* It is not an end-to-end guarantee. The trading engine re-rounds what we send with
|
|
66
|
+
* `roundToDecimals(price, 6 - szDecimals)`, which is round-to-NEAREST (`utils.go:133-136`), so
|
|
67
|
+
* for an asset whose `szDecimals` forces fewer than 6 decimals it can still move a LONG floor
|
|
68
|
+
* back up by half a venue tick. Reading per-asset `szDecimals` is what would close that; until
|
|
69
|
+
* then the residual degrades to a rejection, which the phase-2 breach path now turns into an
|
|
70
|
+
* exit rather than a silent no-stop.
|
|
71
|
+
*
|
|
72
|
+
* Non-finite, zero and negative inputs are returned unchanged — there is no meaningful grid
|
|
73
|
+
* for them, and silently manufacturing a level would be worse than passing the caller's own
|
|
74
|
+
* value through to its validation.
|
|
75
|
+
*/
|
|
76
|
+
export function roundProtectiveLevel(value, direction) {
|
|
77
|
+
if (!Number.isFinite(value) || value <= 0)
|
|
78
|
+
return value;
|
|
79
|
+
const roundDown = direction === "LONG";
|
|
80
|
+
return toMaxDecimals(toSignificantFigures(value, roundDown), roundDown);
|
|
8
81
|
}
|
|
9
82
|
//# sourceMappingURL=round.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"round.js","sourceRoot":"","sources":["../../../src/dsl/engine/round.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"round.js","sourceRoot":"","sources":["../../../src/dsl/engine/round.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mFAAmF;AACnF,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,sGAAsG;AACtG,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,KAAa,EAAE,SAAkB;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,SAAS,IAAI,OAAO,GAAG,KAAK;QAAE,OAAO,MAAM,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvF,IAAI,CAAC,SAAS,IAAI,OAAO,GAAG,KAAK;QAAE,OAAO,MAAM,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,aAAa,CAAC,KAAa,EAAE,SAAkB;IACtD,MAAM,KAAK,GAAG,EAAE,IAAI,YAAY,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACpE,IAAI,SAAS,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK;QAAE,KAAK,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,SAAS,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK;QAAE,KAAK,IAAI,CAAC,CAAC;IACpD,OAAO,KAAK,GAAG,KAAK,CAAC;AACvB,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,SAA2B;IAC7E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,SAAS,GAAG,SAAS,KAAK,MAAM,CAAC;IACvC,OAAO,aAAa,CAAC,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/tick.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine/tick.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAgBxE,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAwNlF"}
|
package/dist/dsl/engine/tick.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Pure DSL tick: state + price → next state and actions.
|
|
3
3
|
*/
|
|
4
4
|
import { CLOSE_REASON } from "../../constants/dsl/index.js";
|
|
5
|
-
import { computeCurrentROE, computeTierFloor, effectiveFloor, isBreach, resolveBreachesRequired, tierIndexFromPrice, } from "./floors.js";
|
|
5
|
+
import { computeCurrentROE, computeTierFloor, effectiveFloor, hasRestingStopAtFloor, isBreach, resolveBreachesRequired, tierIndexFromPrice, } from "./floors.js";
|
|
6
6
|
import { updateHighWater, writeDerivedFields } from "./state-updates.js";
|
|
7
7
|
import { createLogger } from "../../utils/logger.js";
|
|
8
8
|
const log = createLogger("[senpi-core][dsl-tick]");
|
|
@@ -25,23 +25,38 @@ export function dslTick(state, price, now) {
|
|
|
25
25
|
let closeReason;
|
|
26
26
|
const newTierIndexForBreach = tierIndexFromPrice(next, price);
|
|
27
27
|
const prevTierIndexForBreach = next.currentTierIndex ?? -1;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
28
|
+
// Breach detection runs in BOTH phases. In phase 2 the exchange stop is normally what exits,
|
|
29
|
+
// but a stop the venue rejected (a level rounded onto the mark, say) leaves the floor on the
|
|
30
|
+
// wrong side of the mark with nothing resting behind it — which is a breach by definition, and
|
|
31
|
+
// dsl-engine cannot close a position, so the runtime is the only thing that can. This sits
|
|
32
|
+
// ahead of the `handoffStatus === "ok"` early return so a backend-owned position surfaces a
|
|
33
|
+
// breach too; `consecutiveBreachesRequired` still gives a resting stop time to fill first.
|
|
34
|
+
//
|
|
35
|
+
// The breach is COUNTED either way; only the close is withheld when a stop is already resting
|
|
36
|
+
// at the floor. Raising a close there would return at the `action === "close"` early return
|
|
37
|
+
// below, which skips the time cuts, the tier advance and the floor recompute — and the whole
|
|
38
|
+
// downstream half of the monitor tick, SL sync and heartbeat included — on every tick the mark
|
|
39
|
+
// spends at or under the floor. A stale `slOrderId` (a stop cancelled at the venue is never
|
|
40
|
+
// cleared, since the tick's `getOrderStatus` check only clears on `filled`) would then take
|
|
41
|
+
// `hard_timeout` down with it.
|
|
42
|
+
if (isBreach(next, price)) {
|
|
43
|
+
const breachesRequired = resolveBreachesRequired(next);
|
|
44
|
+
// Clamped at the threshold. In phase 1 the close bounded this; in phase 2 a withheld close
|
|
45
|
+
// does not, and an unbounded counter renders as `18432/1` in `senpi dsl` and fires the
|
|
46
|
+
// `breach_detected` span event on every tick it grows.
|
|
47
|
+
const newCount = Math.min((next.currentBreachCount ?? 0) + 1, breachesRequired);
|
|
48
|
+
next = { ...next, currentBreachCount: newCount };
|
|
49
|
+
if (newCount >= breachesRequired && !hasRestingStopAtFloor(next)) {
|
|
50
|
+
action = "close";
|
|
51
|
+
closeReason = CLOSE_REASON.DSL_BREACH;
|
|
52
|
+
next = { ...next, floorPrice: prevFloorPrice };
|
|
43
53
|
}
|
|
44
54
|
}
|
|
55
|
+
else {
|
|
56
|
+
const advancingTier = newTierIndexForBreach > prevTierIndexForBreach;
|
|
57
|
+
if (!advancingTier)
|
|
58
|
+
next = { ...next, currentBreachCount: 0 };
|
|
59
|
+
}
|
|
45
60
|
if (action === "none") {
|
|
46
61
|
const currentROE = computeCurrentROE(next, price);
|
|
47
62
|
if (next.hardTimeout?.enabled) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tick.js","sourceRoot":"","sources":["../../../src/dsl/engine/tick.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,GAAG,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAEnD,MAAM,UAAU,OAAO,CAAC,KAAe,EAAE,KAAa,EAAE,GAAW;IACjE,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC;IACxC,IAAI,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAE9C,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,iBAAiB,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAChF,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE,CAAC;IAChD,CAAC;IACD,oGAAoG;IACpG,gGAAgG;IAChG,mGAAmG;IACnG,IAAI,IAAI,CAAC,aAAa,EAAE,OAAO,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;QACzD,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAEjC,IAAI,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,MAAM,GAA4B,MAAM,CAAC;IAC7C,IAAI,WAA+B,CAAC;IAEpC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9D,MAAM,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;IAE3D,
|
|
1
|
+
{"version":3,"file":"tick.js","sourceRoot":"","sources":["../../../src/dsl/engine/tick.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-mapping.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine-client/event-mapping.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,wFAAwF;IACxF,aAAa,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,aAAa,EAAE,uBAAuB,CAAC;IACvC,qGAAqG;IACrG,cAAc,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC3C;
|
|
1
|
+
{"version":3,"file":"event-mapping.d.ts","sourceRoot":"","sources":["../../../src/dsl/engine-client/event-mapping.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,wFAAwF;IACxF,aAAa,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,aAAa,EAAE,uBAAuB,CAAC;IACvC,qGAAqG;IACrG,cAAc,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC3C;AAkBD,iFAAiF;AACjF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,aAAa,GACrB,cAAc,GAAG,IAAI,CA6FvB"}
|
|
@@ -15,17 +15,6 @@ function pickString(details, ...keys) {
|
|
|
15
15
|
}
|
|
16
16
|
return null;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Provenance for a mapped event: the backend acted, and this is its own stamp of when. The stamp
|
|
20
|
-
* comes off the wire, so it is checked here; an unusable one drops out on its own and never costs
|
|
21
|
-
* the source, which is known from the call site rather than from the payload.
|
|
22
|
-
*/
|
|
23
|
-
function backendProvenance(createdAt) {
|
|
24
|
-
return {
|
|
25
|
-
__dslSource: "backend",
|
|
26
|
-
...(typeof createdAt === "string" && createdAt.length > 0 ? { __backendEventAt: createdAt } : {}),
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
18
|
/** Returns null for informational events or when required fields are missing. */
|
|
30
19
|
export function mapBackendEventToBusEvent(event, context) {
|
|
31
20
|
const details = event.details;
|
|
@@ -53,7 +42,6 @@ export function mapBackendEventToBusEvent(event, context) {
|
|
|
53
42
|
__positionId: context.positionId ?? context.correlationId,
|
|
54
43
|
timestamp: ts,
|
|
55
44
|
...(context.tierEnrichment ?? {}),
|
|
56
|
-
...backendProvenance(ts),
|
|
57
45
|
},
|
|
58
46
|
};
|
|
59
47
|
}
|
|
@@ -87,7 +75,6 @@ export function mapBackendEventToBusEvent(event, context) {
|
|
|
87
75
|
entryPrice: context.tierEnrichment?.entryPrice,
|
|
88
76
|
correlationId: context.correlationId,
|
|
89
77
|
timestamp: ts,
|
|
90
|
-
...backendProvenance(ts),
|
|
91
78
|
},
|
|
92
79
|
};
|
|
93
80
|
}
|
|
@@ -109,7 +96,6 @@ export function mapBackendEventToBusEvent(event, context) {
|
|
|
109
96
|
triggerReason: context.triggerReason,
|
|
110
97
|
__positionId: context.positionId ?? context.correlationId,
|
|
111
98
|
timestamp: ts,
|
|
112
|
-
...backendProvenance(ts),
|
|
113
99
|
},
|
|
114
100
|
};
|
|
115
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-mapping.js","sourceRoot":"","sources":["../../../src/dsl/engine-client/event-mapping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAyC1D,SAAS,UAAU,CAAC,OAAgC,EAAE,GAAG,IAAc;IACrE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,OAAgC,EAAE,GAAG,IAAc;IACrE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"event-mapping.js","sourceRoot":"","sources":["../../../src/dsl/engine-client/event-mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Build {@link DslClosedEvent} payloads from a full {@link DslState} snapshot at close time.
|
|
3
3
|
*/
|
|
4
|
-
import type { DslClosedEvent,
|
|
4
|
+
import type { DslClosedEvent, DslState } from "../../types/dsl/index.js";
|
|
5
5
|
export interface BuildDslClosedEventOptions {
|
|
6
6
|
reason: string;
|
|
7
7
|
closeReason: string;
|
|
8
8
|
timestamp: string;
|
|
9
|
-
/** The monitor tick emitting the close; omitted by a caller that has no tick in hand. */
|
|
10
|
-
tickId?: string;
|
|
11
|
-
/**
|
|
12
|
-
* Which side produced this transition: our own monitor tick, or a relay of one the backend made.
|
|
13
|
-
* Omitted by a caller that cannot attribute the close. It does NOT say whose stop was protecting
|
|
14
|
-
* the position — a close our poll detected is `runtime` even when the backend placed the stop
|
|
15
|
-
* that fired. The preceding `dsl.sl_updated` answers that.
|
|
16
|
-
*/
|
|
17
|
-
source?: DslEventSource;
|
|
18
|
-
/**
|
|
19
|
-
* The backend's own stamp of when it acted, on a backend-sourced close. Loosely typed because it
|
|
20
|
-
* reaches this builder from a wire payload; anything but a non-empty string drops out, and it
|
|
21
|
-
* drops out on its own — a stamp we cannot use never costs the source beside it.
|
|
22
|
-
*/
|
|
23
|
-
backendEventAt?: unknown;
|
|
24
9
|
}
|
|
25
10
|
/**
|
|
26
11
|
* Maps archived/live state to the bus `dsl.closed` payload (including fields for notification formatting
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-closed-event.d.ts","sourceRoot":"","sources":["../../../src/dsl/events/build-closed-event.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"build-closed-event.d.ts","sourceRoot":"","sources":["../../../src/dsl/events/build-closed-event.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzE,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,0BAA0B,GAC/B,cAAc,CAsBhB"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Build {@link DslClosedEvent} payloads from a full {@link DslState} snapshot at close time.
|
|
3
3
|
*/
|
|
4
|
-
import { PAYLOAD_KEY } from "../../utils/event-catalog.js";
|
|
5
4
|
/**
|
|
6
5
|
* Maps archived/live state to the bus `dsl.closed` payload (including fields for notification formatting
|
|
7
6
|
* and deferred trade-history enrichment).
|
|
@@ -16,11 +15,6 @@ export function buildDslClosedEventFromState(state, opts) {
|
|
|
16
15
|
closeReason: opts.closeReason,
|
|
17
16
|
triggerReason: state.triggerReason,
|
|
18
17
|
__positionId: state.positionId ?? state.correlationId,
|
|
19
|
-
[PAYLOAD_KEY.tickId]: opts.tickId,
|
|
20
|
-
__dslSource: opts.source,
|
|
21
|
-
...(typeof opts.backendEventAt === "string" && opts.backendEventAt.length > 0
|
|
22
|
-
? { __backendEventAt: opts.backendEventAt }
|
|
23
|
-
: {}),
|
|
24
18
|
timestamp: opts.timestamp,
|
|
25
19
|
direction: state.direction,
|
|
26
20
|
entryPrice: state.entryPrice,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-closed-event.js","sourceRoot":"","sources":["../../../src/dsl/events/build-closed-event.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"build-closed-event.js","sourceRoot":"","sources":["../../../src/dsl/events/build-closed-event.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAe,EACf,IAAgC;IAEhC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE;QACpB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,YAAY,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,aAAa;QACrD,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM;QACN,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -20,13 +20,6 @@ export interface HandlePositionOpenedOpts {
|
|
|
20
20
|
* on a flip (favorable polarity inverts).
|
|
21
21
|
*/
|
|
22
22
|
carryNotifiedStop?: NotifiedStopCarry;
|
|
23
|
-
/**
|
|
24
|
-
* The tick that observed the change, for a caller that normalizes its payload before re-entering
|
|
25
|
-
* the open path — the rebuild shapes (increase/decrease/flip) have no room for the id, so it is
|
|
26
|
-
* read from the original payload and passed here instead. The monitor-driven reconcile passes its
|
|
27
|
-
* tick here too; the boot reconcile runs before any tick exists and passes none.
|
|
28
|
-
*/
|
|
29
|
-
tickId?: string;
|
|
30
23
|
}
|
|
31
24
|
export declare function createEventHandlers(config: DslPluginConfig, stateManager: StateManager, strategyStates: Map<string, StrategyState>, bus: SenpiEventBus, _baseDir: string): {
|
|
32
25
|
handlePositionOpened: (payload: unknown, triggerReason?: DslCreatedTriggerReason, opts?: HandlePositionOpenedOpts) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/dsl/events/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EAGf,uBAAuB,EACvB,mBAAmB,EAGpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAqBzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/dsl/events/handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EACV,eAAe,EAGf,uBAAuB,EACvB,mBAAmB,EAGpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAqBzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAsC5D,MAAM,WAAW,wBAAwB;IACvC,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1C,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,MAAM,GACf;IACD,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,uBAAuB,EAAE,IAAI,CAAC,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpI,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,uBAAuB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,uBAAuB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,2FAA2F;IAC3F,qBAAqB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,uBAAuB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClD;;;;OAIG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChG;;;;OAIG;IACH,cAAc,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClG,CAmmBA"}
|
|
@@ -13,29 +13,10 @@ import { normalizePositionOpenedEvent } from "./normalize-position-opened.js";
|
|
|
13
13
|
import { stateKey } from "../../state/paths.js";
|
|
14
14
|
import { normalizeDslCoinDex } from "../../utils/perp-coin.js";
|
|
15
15
|
import { buildDslClosedEventFromState } from "./build-closed-event.js";
|
|
16
|
-
import { PAYLOAD_KEY } from "../../utils/event-catalog.js";
|
|
17
16
|
function now() {
|
|
18
17
|
return new Date().toISOString();
|
|
19
18
|
}
|
|
20
|
-
|
|
21
|
-
* A meta field on an incoming bus payload: under `data` on a hook event, at the root on a flat one.
|
|
22
|
-
* Anything but a non-empty string reads as absent.
|
|
23
|
-
*/
|
|
24
|
-
function incomingMeta(payload, key) {
|
|
25
|
-
if (!payload || typeof payload !== "object")
|
|
26
|
-
return undefined;
|
|
27
|
-
const p = payload;
|
|
28
|
-
const raw = typeof p.data?.[key] === "string" ? p.data[key] : p[key];
|
|
29
|
-
return typeof raw === "string" && raw.length > 0 ? raw : undefined;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* The tick id on an incoming bus payload. Absent on the boot reconcile, which runs before any tick
|
|
33
|
-
* exists — and none is invented for it.
|
|
34
|
-
*/
|
|
35
|
-
function incomingTickId(payload) {
|
|
36
|
-
return incomingMeta(payload, PAYLOAD_KEY.tickId);
|
|
37
|
-
}
|
|
38
|
-
function buildDslCreatedPayload(event, presetName, preset, state, ts, tickId) {
|
|
19
|
+
function buildDslCreatedPayload(event, presetName, preset, state, ts) {
|
|
39
20
|
const margin = (state.size * state.entryPrice) / state.leverage;
|
|
40
21
|
return {
|
|
41
22
|
address: event.address,
|
|
@@ -51,11 +32,6 @@ function buildDslCreatedPayload(event, presetName, preset, state, ts, tickId) {
|
|
|
51
32
|
margin,
|
|
52
33
|
triggerReason: state.triggerReason,
|
|
53
34
|
__positionId: state.positionId ?? state.correlationId,
|
|
54
|
-
[PAYLOAD_KEY.tickId]: tickId,
|
|
55
|
-
// Every path into `dsl.created` is local — a position-tracker lifecycle event or a reconcile
|
|
56
|
-
// adopt — so the runtime is always the actor. Said explicitly: absence has to keep meaning
|
|
57
|
-
// "we do not know".
|
|
58
|
-
__dslSource: "runtime",
|
|
59
35
|
timestamp: ts,
|
|
60
36
|
};
|
|
61
37
|
}
|
|
@@ -95,9 +71,6 @@ export function createEventHandlers(config, stateManager, strategyStates, bus, _
|
|
|
95
71
|
if (!event)
|
|
96
72
|
return;
|
|
97
73
|
event = normalizePositionOpenedEvent(event);
|
|
98
|
-
// A rebuild caller hands over a normalized event, which cannot hold the id — it passes the
|
|
99
|
-
// original payload's tick instead. A direct bus open reads it off the payload it received.
|
|
100
|
-
const tickId = opts?.tickId ?? incomingTickId(payload);
|
|
101
74
|
const dexKey = event.dex ?? "";
|
|
102
75
|
const posKey = stateKey(event.address, event.coin, dexKey);
|
|
103
76
|
// Serialize concurrent opens on the same (address,coin,dex) key.
|
|
@@ -149,7 +122,7 @@ export function createEventHandlers(config, stateManager, strategyStates, bus, _
|
|
|
149
122
|
state.lastError = state.lastSlSyncError;
|
|
150
123
|
state.lastErrorAt = now();
|
|
151
124
|
await stateManager.setDslState(event.address, event.coin, event.dex ?? "", state);
|
|
152
|
-
bus.emit(DSL_EVENTS.CREATED, buildDslCreatedPayload(event, presetName, preset, state, now()
|
|
125
|
+
bus.emit(DSL_EVENTS.CREATED, buildDslCreatedPayload(event, presetName, preset, state, now()));
|
|
153
126
|
return;
|
|
154
127
|
}
|
|
155
128
|
const shouldPlaceSl = opts?.placeSl !== false;
|
|
@@ -164,7 +137,7 @@ export function createEventHandlers(config, stateManager, strategyStates, bus, _
|
|
|
164
137
|
floor,
|
|
165
138
|
});
|
|
166
139
|
await stateManager.setDslState(event.address, event.coin, event.dex ?? "", state);
|
|
167
|
-
bus.emit(DSL_EVENTS.CREATED, buildDslCreatedPayload(event, presetName, preset, state, now()
|
|
140
|
+
bus.emit(DSL_EVENTS.CREATED, buildDslCreatedPayload(event, presetName, preset, state, now()));
|
|
168
141
|
return;
|
|
169
142
|
}
|
|
170
143
|
slPlacementInProgress.add(posKey);
|
|
@@ -216,7 +189,7 @@ export function createEventHandlers(config, stateManager, strategyStates, bus, _
|
|
|
216
189
|
key: posKey,
|
|
217
190
|
});
|
|
218
191
|
await stateManager.setDslState(event.address, event.coin, event.dex ?? "", state);
|
|
219
|
-
bus.emit(DSL_EVENTS.CREATED, buildDslCreatedPayload(event, presetName, preset, state, now()
|
|
192
|
+
bus.emit(DSL_EVENTS.CREATED, buildDslCreatedPayload(event, presetName, preset, state, now()));
|
|
220
193
|
}
|
|
221
194
|
finally {
|
|
222
195
|
slPlacementInProgress.delete(posKey);
|
|
@@ -296,9 +269,6 @@ export function createEventHandlers(config, stateManager, strategyStates, bus, _
|
|
|
296
269
|
reason: archiveCloseReason,
|
|
297
270
|
closeReason: archiveCloseReason,
|
|
298
271
|
timestamp: closedTs,
|
|
299
|
-
// A monitor-caused close carries the monitor tick; an action-caused one carries the
|
|
300
|
-
// scanner tick that drove the pass. Neither needs a branch — both ride the payload.
|
|
301
|
-
tickId: incomingTickId(payload),
|
|
302
272
|
}));
|
|
303
273
|
});
|
|
304
274
|
}
|
|
@@ -366,7 +336,7 @@ export function createEventHandlers(config, stateManager, strategyStates, bus, _
|
|
|
366
336
|
// it: the new direction is a different trade whose breakeven has not been
|
|
367
337
|
// crossed. The rebuild resets all three and the first raise in the new
|
|
368
338
|
// direction re-establishes them from scratch.
|
|
369
|
-
await handlePositionOpened(openedPayload, "flipped"
|
|
339
|
+
await handlePositionOpened(openedPayload, "flipped");
|
|
370
340
|
}
|
|
371
341
|
async function handlePositionIncreased(payload) {
|
|
372
342
|
let raw = null;
|
|
@@ -409,7 +379,7 @@ export function createEventHandlers(config, stateManager, strategyStates, bus, _
|
|
|
409
379
|
}
|
|
410
380
|
});
|
|
411
381
|
// archiveKey lock is released; handlePositionOpened re-acquires it safely.
|
|
412
|
-
await handlePositionOpened(event, "position_increased", { carryNotifiedStop
|
|
382
|
+
await handlePositionOpened(event, "position_increased", { carryNotifiedStop });
|
|
413
383
|
}
|
|
414
384
|
async function handlePositionDecreased(payload) {
|
|
415
385
|
let raw = null;
|
|
@@ -451,7 +421,7 @@ export function createEventHandlers(config, stateManager, strategyStates, bus, _
|
|
|
451
421
|
}
|
|
452
422
|
});
|
|
453
423
|
// archiveKey lock is released; handlePositionOpened re-acquires it safely.
|
|
454
|
-
await handlePositionOpened(event, "position_decreased", { carryNotifiedStop
|
|
424
|
+
await handlePositionOpened(event, "position_decreased", { carryNotifiedStop });
|
|
455
425
|
}
|
|
456
426
|
async function deleteDslsForStrategy(address) {
|
|
457
427
|
const keys = await stateManager.listDslKeys(`${address}/`);
|