@invinite-org/chartlang-runtime 1.1.1 → 1.2.0
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/CHANGELOG.md +236 -0
- package/dist/barPoint.d.ts +20 -0
- package/dist/barPoint.d.ts.map +1 -0
- package/dist/barPoint.js +72 -0
- package/dist/barPoint.js.map +1 -0
- package/dist/bufferSnapshot.d.ts +102 -0
- package/dist/bufferSnapshot.d.ts.map +1 -0
- package/dist/bufferSnapshot.js +119 -0
- package/dist/bufferSnapshot.js.map +1 -0
- package/dist/createScriptRunner.d.ts +6 -3
- package/dist/createScriptRunner.d.ts.map +1 -1
- package/dist/createScriptRunner.js +29 -5
- package/dist/createScriptRunner.js.map +1 -1
- package/dist/dep/DepRunner.d.ts.map +1 -1
- package/dist/dep/DepRunner.js +1 -0
- package/dist/dep/DepRunner.js.map +1 -1
- package/dist/emit/draw/boxes/fillBetween.d.ts +45 -0
- package/dist/emit/draw/boxes/fillBetween.d.ts.map +1 -0
- package/dist/emit/draw/boxes/fillBetween.js +36 -0
- package/dist/emit/draw/boxes/fillBetween.js.map +1 -0
- package/dist/emit/draw/handle.d.ts +9 -0
- package/dist/emit/draw/handle.d.ts.map +1 -1
- package/dist/emit/draw/handle.js +65 -10
- package/dist/emit/draw/handle.js.map +1 -1
- package/dist/emit/draw/namespace.d.ts +4 -3
- package/dist/emit/draw/namespace.d.ts.map +1 -1
- package/dist/emit/draw/namespace.js +6 -3
- package/dist/emit/draw/namespace.js.map +1 -1
- package/dist/emit/plot.d.ts +7 -0
- package/dist/emit/plot.d.ts.map +1 -1
- package/dist/emit/plot.js +13 -0
- package/dist/emit/plot.js.map +1 -1
- package/dist/execution/dispose.d.ts.map +1 -1
- package/dist/execution/dispose.js +16 -0
- package/dist/execution/dispose.js.map +1 -1
- package/dist/execution/runComputeStep.d.ts.map +1 -1
- package/dist/execution/runComputeStep.js +10 -1
- package/dist/execution/runComputeStep.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/persistentStateStore.runtime.d.ts.map +1 -1
- package/dist/persistentStateStore.runtime.js +21 -7
- package/dist/persistentStateStore.runtime.js.map +1 -1
- package/dist/request/index.d.ts +2 -1
- package/dist/request/index.d.ts.map +1 -1
- package/dist/request/index.js +2 -1
- package/dist/request/index.js.map +1 -1
- package/dist/request/requestNamespace.d.ts.map +1 -1
- package/dist/request/requestNamespace.js +16 -3
- package/dist/request/requestNamespace.js.map +1 -1
- package/dist/request/security.d.ts +20 -1
- package/dist/request/security.d.ts.map +1 -1
- package/dist/request/security.js +62 -23
- package/dist/request/security.js.map +1 -1
- package/dist/request/securityExprRunner.d.ts +133 -0
- package/dist/request/securityExprRunner.d.ts.map +1 -0
- package/dist/request/securityExprRunner.js +235 -0
- package/dist/request/securityExprRunner.js.map +1 -0
- package/dist/request/streamBars.d.ts +14 -1
- package/dist/request/streamBars.d.ts.map +1 -1
- package/dist/request/streamBars.js +39 -1
- package/dist/request/streamBars.js.map +1 -1
- package/dist/runtimeContext.d.ts +48 -0
- package/dist/runtimeContext.d.ts.map +1 -1
- package/dist/runtimeContext.js.map +1 -1
- package/dist/seriesView.d.ts +42 -17
- package/dist/seriesView.d.ts.map +1 -1
- package/dist/seriesView.js +65 -42
- package/dist/seriesView.js.map +1 -1
- package/dist/state/index.d.ts +2 -1
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +2 -1
- package/dist/state/index.js.map +1 -1
- package/dist/state/lifecycle.d.ts +40 -0
- package/dist/state/lifecycle.d.ts.map +1 -1
- package/dist/state/lifecycle.js +53 -0
- package/dist/state/lifecycle.js.map +1 -1
- package/dist/state/seriesPersistence.d.ts +48 -0
- package/dist/state/seriesPersistence.d.ts.map +1 -0
- package/dist/state/seriesPersistence.js +87 -0
- package/dist/state/seriesPersistence.js.map +1 -0
- package/dist/state/seriesSlot.d.ts +105 -0
- package/dist/state/seriesSlot.d.ts.map +1 -0
- package/dist/state/seriesSlot.js +123 -0
- package/dist/state/seriesSlot.js.map +1 -0
- package/dist/state/stateNamespace.d.ts.map +1 -1
- package/dist/state/stateNamespace.js +28 -0
- package/dist/state/stateNamespace.js.map +1 -1
- package/dist/streamState.d.ts +25 -19
- package/dist/streamState.d.ts.map +1 -1
- package/dist/streamState.js +40 -66
- package/dist/streamState.js.map +1 -1
- package/dist/ta/adx.d.ts +3 -2
- package/dist/ta/adx.d.ts.map +1 -1
- package/dist/ta/adx.js +3 -2
- package/dist/ta/adx.js.map +1 -1
- package/dist/ta/alma.d.ts +6 -4
- package/dist/ta/alma.d.ts.map +1 -1
- package/dist/ta/alma.js +19 -6
- package/dist/ta/alma.js.map +1 -1
- package/dist/ta/atr.d.ts +3 -2
- package/dist/ta/atr.d.ts.map +1 -1
- package/dist/ta/atr.js +3 -2
- package/dist/ta/atr.js.map +1 -1
- package/dist/ta/bb.d.ts +3 -2
- package/dist/ta/bb.d.ts.map +1 -1
- package/dist/ta/bb.js +3 -2
- package/dist/ta/bb.js.map +1 -1
- package/dist/ta/chaikinOsc.d.ts +3 -2
- package/dist/ta/chaikinOsc.d.ts.map +1 -1
- package/dist/ta/chaikinOsc.js +3 -2
- package/dist/ta/chaikinOsc.js.map +1 -1
- package/dist/ta/crossover.d.ts +3 -2
- package/dist/ta/crossover.d.ts.map +1 -1
- package/dist/ta/crossover.js +3 -2
- package/dist/ta/crossover.js.map +1 -1
- package/dist/ta/crossunder.d.ts +3 -2
- package/dist/ta/crossunder.d.ts.map +1 -1
- package/dist/ta/crossunder.js +3 -2
- package/dist/ta/crossunder.js.map +1 -1
- package/dist/ta/dmi.d.ts +4 -3
- package/dist/ta/dmi.d.ts.map +1 -1
- package/dist/ta/dmi.js +4 -3
- package/dist/ta/dmi.js.map +1 -1
- package/dist/ta/ema.d.ts +3 -2
- package/dist/ta/ema.d.ts.map +1 -1
- package/dist/ta/ema.js +3 -2
- package/dist/ta/ema.js.map +1 -1
- package/dist/ta/eom.d.ts +3 -1
- package/dist/ta/eom.d.ts.map +1 -1
- package/dist/ta/eom.js +3 -1
- package/dist/ta/eom.js.map +1 -1
- package/dist/ta/highestbars.d.ts +25 -0
- package/dist/ta/highestbars.d.ts.map +1 -0
- package/dist/ta/highestbars.js +106 -0
- package/dist/ta/highestbars.js.map +1 -0
- package/dist/ta/historicalVolatility.d.ts +3 -2
- package/dist/ta/historicalVolatility.d.ts.map +1 -1
- package/dist/ta/historicalVolatility.js +3 -2
- package/dist/ta/historicalVolatility.js.map +1 -1
- package/dist/ta/ichimoku.d.ts +3 -1
- package/dist/ta/ichimoku.d.ts.map +1 -1
- package/dist/ta/ichimoku.js +3 -1
- package/dist/ta/ichimoku.js.map +1 -1
- package/dist/ta/lowestbars.d.ts +25 -0
- package/dist/ta/lowestbars.d.ts.map +1 -0
- package/dist/ta/lowestbars.js +102 -0
- package/dist/ta/lowestbars.js.map +1 -0
- package/dist/ta/macd.d.ts +3 -2
- package/dist/ta/macd.d.ts.map +1 -1
- package/dist/ta/macd.js +3 -2
- package/dist/ta/macd.js.map +1 -1
- package/dist/ta/massIndex.d.ts +3 -2
- package/dist/ta/massIndex.d.ts.map +1 -1
- package/dist/ta/massIndex.js +3 -2
- package/dist/ta/massIndex.js.map +1 -1
- package/dist/ta/mfi.d.ts +3 -1
- package/dist/ta/mfi.d.ts.map +1 -1
- package/dist/ta/mfi.js +3 -1
- package/dist/ta/mfi.js.map +1 -1
- package/dist/ta/netVolume.d.ts +3 -1
- package/dist/ta/netVolume.d.ts.map +1 -1
- package/dist/ta/netVolume.js +3 -1
- package/dist/ta/netVolume.js.map +1 -1
- package/dist/ta/nvi.d.ts +3 -1
- package/dist/ta/nvi.d.ts.map +1 -1
- package/dist/ta/nvi.js +3 -1
- package/dist/ta/nvi.js.map +1 -1
- package/dist/ta/persistence.d.ts.map +1 -1
- package/dist/ta/persistence.js +1 -40
- package/dist/ta/persistence.js.map +1 -1
- package/dist/ta/ppo.d.ts +3 -2
- package/dist/ta/ppo.d.ts.map +1 -1
- package/dist/ta/ppo.js +3 -2
- package/dist/ta/ppo.js.map +1 -1
- package/dist/ta/pvi.d.ts +3 -1
- package/dist/ta/pvi.d.ts.map +1 -1
- package/dist/ta/pvi.js +3 -1
- package/dist/ta/pvi.js.map +1 -1
- package/dist/ta/pvo.d.ts +3 -1
- package/dist/ta/pvo.d.ts.map +1 -1
- package/dist/ta/pvo.js +3 -1
- package/dist/ta/pvo.js.map +1 -1
- package/dist/ta/pvt.d.ts +3 -1
- package/dist/ta/pvt.d.ts.map +1 -1
- package/dist/ta/pvt.js +3 -1
- package/dist/ta/pvt.js.map +1 -1
- package/dist/ta/registry.d.ts +7 -1
- package/dist/ta/registry.d.ts.map +1 -1
- package/dist/ta/registry.js +4 -0
- package/dist/ta/registry.js.map +1 -1
- package/dist/ta/rsi.d.ts +3 -2
- package/dist/ta/rsi.d.ts.map +1 -1
- package/dist/ta/rsi.js +3 -2
- package/dist/ta/rsi.js.map +1 -1
- package/dist/ta/rvi.d.ts +3 -2
- package/dist/ta/rvi.d.ts.map +1 -1
- package/dist/ta/rvi.js +3 -2
- package/dist/ta/rvi.js.map +1 -1
- package/dist/ta/sma.d.ts +6 -3
- package/dist/ta/sma.d.ts.map +1 -1
- package/dist/ta/sma.js +6 -3
- package/dist/ta/sma.js.map +1 -1
- package/dist/ta/stdev.d.ts +3 -2
- package/dist/ta/stdev.d.ts.map +1 -1
- package/dist/ta/stdev.js +3 -2
- package/dist/ta/stdev.js.map +1 -1
- package/dist/ta/trendStrengthIndex.d.ts +3 -2
- package/dist/ta/trendStrengthIndex.d.ts.map +1 -1
- package/dist/ta/trendStrengthIndex.js +3 -2
- package/dist/ta/trendStrengthIndex.js.map +1 -1
- package/dist/ta/trix.d.ts +4 -3
- package/dist/ta/trix.d.ts.map +1 -1
- package/dist/ta/trix.js +4 -3
- package/dist/ta/trix.js.map +1 -1
- package/dist/ta/vortex.d.ts +3 -2
- package/dist/ta/vortex.d.ts.map +1 -1
- package/dist/ta/vortex.js +3 -2
- package/dist/ta/vortex.js.map +1 -1
- package/package.json +3 -3
- package/dist/ta/lib/applyOffset.d.ts +0 -19
- package/dist/ta/lib/applyOffset.d.ts.map +0 -1
- package/dist/ta/lib/applyOffset.js +0 -38
- package/dist/ta/lib/applyOffset.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistentStateStore.runtime.js","sourceRoot":"","sources":["../src/persistentStateStore.runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type {\n JsonValue,\n RunnerSnapshot,\n StateSnapshot,\n StreamSnapshot,\n} from \"@invinite-org/chartlang-core\";\n\nimport type { RunnerState } from \"./createScriptRunner.js\";\nimport { pushDiagnostic } from \"./emit/index.js\";\nimport { validateSnapshot } from \"./persistentStateStore.validate.js\";\nimport type { RuntimeContext } from \"./runtimeContext.js\";\nimport { restoreStateSlots, serialiseStateSlots } from \"./state/index.js\";\nimport { isTaSlotSnapshotKey, restoreTaSlots, serialiseTaSlots } from \"./ta/persistence.js\";\n\n/**\n * Default PLAN §6.9 write cadence for persistent snapshots.\n *\n * @since 0.5\n * @internal\n * @example\n * const stale = Date.now() - PERSISTENCE_INTERVAL_MS;\n * void stale;\n */\nexport const PERSISTENCE_INTERVAL_MS = 60_000;\n\nfunction firstStreamKey(snapshot: StateSnapshot): string | null {\n const entries = Object.entries(snapshot.streams);\n const first = entries[0];\n return first === undefined ? null : first[0];\n}\n\nfunction captureStreams(state: RunnerState): Readonly<Record<string, StreamSnapshot>> {\n const main = state.mainStream.serialiseSnapshot();\n const streams: Record<string, StreamSnapshot> = {\n [main.interval === \"\" ? \"main\" : main.interval]: main,\n };\n for (const [key, stream] of state.runtimeContext.secondaryStreams) {\n streams[key] = stream.serialiseSnapshot();\n }\n return Object.freeze(streams);\n}\n\nfunction primarySectionSlots(state: RunnerState): Readonly<Record<string, JsonValue>> {\n return Object.freeze({\n ...serialiseStateSlots(state.runtimeContext),\n ...serialiseTaSlots(state.mainStream),\n } as Record<string, JsonValue>);\n}\n\nfunction runnerSection(ctx: RuntimeContext): RunnerSnapshot {\n return Object.freeze({\n slots: Object.freeze({ ...serialiseStateSlots(ctx) } as Record<string, JsonValue>),\n });\n}\n\nfunction captureSiblings(state: RunnerState): Readonly<Record<string, RunnerSnapshot>> | undefined {\n if (state.siblingRunners.length === 0) return undefined;\n const out: Record<string, RunnerSnapshot> = {};\n for (const sibling of state.siblingRunners) {\n out[sibling.exportName] = runnerSection(sibling.state.runtimeContext);\n }\n return Object.freeze(out);\n}\n\nfunction captureDependencies(\n state: RunnerState,\n): Readonly<Record<string, RunnerSnapshot>> | undefined {\n if (state.depRunners.length === 0) return undefined;\n const out: Record<string, RunnerSnapshot> = {};\n for (const dep of state.depRunners) {\n out[dep.localId] = runnerSection(dep.state.runtimeContext);\n }\n return Object.freeze(out);\n}\n\n/**\n * Capture the runner's current stream + per-runner state-slot snapshot.\n *\n * Returns the structured shape carrying `primary.slots`, optional\n * `siblings[exportName].slots`, and optional `dependencies[localId].slots`.\n * TA slots live in `primary.slots` because the bundle's deps and siblings\n * share the primary's `mainStream` (Task-4 invariant).\n *\n * @since 0.5 — widened to per-runner sections in 0.7.\n * @internal\n * @example\n * // const snapshot = captureStateSnapshot(state, Date.now());\n * const captured = true;\n * void captured;\n */\nexport function captureStateSnapshot(state: RunnerState, savedAt: number): StateSnapshot | null {\n const streams = captureStreams(state);\n const siblings = captureSiblings(state);\n const dependencies = captureDependencies(state);\n const candidate: StateSnapshot = {\n lastBarTime: state.mainStream.bar.time,\n streams,\n savedAt,\n snapshotVersion: 1,\n primary: { slots: primarySectionSlots(state) },\n ...(siblings === undefined ? {} : { siblings }),\n ...(dependencies === undefined ? {} : { dependencies }),\n };\n if (!validateSnapshot(candidate)) return null;\n return candidate;\n}\n\n// Phase-1 mounts have `bar.interval === \"\"` until the first bar lands; in that\n// window the snapshot is keyed by whatever captureStreams used (\"main\" or the\n// explicit interval). Fall back to the snapshot's first-entered stream so warm\n// restart still finds the buffer.\nfunction resolveMainStreamSnapshot(\n snapshot: StateSnapshot,\n mainInterval: string,\n): StreamSnapshot | undefined {\n const direct = mainInterval === \"\" ? undefined : snapshot.streams[mainInterval];\n if (direct !== undefined) return direct;\n const fallback = firstStreamKey(snapshot);\n return fallback === null ? undefined : snapshot.streams[fallback];\n}\n\nfunction nonTaSlots(slots: Readonly<Record<string, JsonValue>>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [slotKey, value] of Object.entries(slots)) {\n if (!isTaSlotSnapshotKey(slotKey)) {\n out[slotKey] = value;\n }\n }\n return out;\n}\n\nfunction pushMalformedSection(state: RunnerState, message: string): void {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-malformed\",\n message,\n slotId: null,\n bar: state.barIndex,\n });\n}\n\nfunction restoreSiblingSections(\n state: RunnerState,\n siblings: Readonly<Record<string, RunnerSnapshot>>,\n): void {\n const lookup = new Map(state.siblingRunners.map((sib) => [sib.exportName, sib]));\n for (const [exportName, section] of Object.entries(siblings)) {\n const sibling = lookup.get(exportName);\n if (sibling === undefined) {\n pushMalformedSection(\n state,\n `persistent state snapshot referenced unknown sibling \"${exportName}\"`,\n );\n continue;\n }\n restoreStateSlots(sibling.state.runtimeContext, section.slots);\n }\n}\n\nfunction restoreDependencySections(\n state: RunnerState,\n dependencies: Readonly<Record<string, RunnerSnapshot>>,\n): void {\n const lookup = new Map(state.depRunners.map((dep) => [dep.localId, dep]));\n for (const [localId, section] of Object.entries(dependencies)) {\n const dep = lookup.get(localId);\n if (dep === undefined) {\n pushMalformedSection(\n state,\n `persistent state snapshot referenced unknown dependency \"${localId}\"`,\n );\n continue;\n }\n restoreStateSlots(dep.state.runtimeContext, section.slots);\n }\n}\n\n/**\n * Restore a validated snapshot into the runner's stream + slot stores.\n *\n * Walks every per-runner section: `primary.slots` rehydrates the\n * primary's `state.*` slots (and TA slots on the shared mainStream);\n * `siblings[exportName].slots` and `dependencies[localId].slots`\n * rehydrate each matching sub-runner. Snapshot sections whose id is not\n * declared by the current bundle are skipped with a\n * `state-snapshot-malformed` diagnostic.\n *\n * Legacy flat-shape snapshots (pre-0.7) restore into the primary only.\n *\n * @since 0.5 — widened to per-runner sections in 0.7.\n * @internal\n * @example\n * // restoreStateSnapshot(state, snapshot);\n * const restored = true;\n * void restored;\n */\nexport function restoreStateSnapshot(state: RunnerState, snapshot: StateSnapshot): void {\n const stream = resolveMainStreamSnapshot(snapshot, state.mainStream.bar.interval);\n if (stream !== undefined) {\n state.mainStream.restoreFromSnapshot(stream);\n state.barIndex = Math.max(state.barIndex, stream.filled);\n }\n for (const [secondaryKey, secondary] of state.runtimeContext.secondaryStreams) {\n const secondarySnapshot = snapshot.streams[secondaryKey];\n if (secondarySnapshot !== undefined) {\n secondary.restoreFromSnapshot(secondarySnapshot);\n }\n }\n\n const primarySlots = primarySlotsOf(snapshot);\n restoreTaSlots(state.mainStream, primarySlots);\n restoreStateSlots(state.runtimeContext, nonTaSlots(primarySlots));\n\n if (snapshot.siblings !== undefined) {\n restoreSiblingSections(state, snapshot.siblings);\n }\n if (snapshot.dependencies !== undefined) {\n restoreDependencySections(state, snapshot.dependencies);\n }\n}\n\n/**\n * Resolve the primary runner's slot map from either the structured shape\n * (`snapshot.primary.slots`) or the legacy flat shape (`snapshot.slots`).\n * The validator accepts both but the strict `StateSnapshot` type only\n * mirrors the structured shape; the dual shape is read through this\n * legacy-aware view. {@link validateSnapshot} guarantees at least one of\n * the two shapes is present so we never fall through.\n *\n * @internal\n */\ntype LegacySnapshotView = Readonly<{\n readonly primary?: RunnerSnapshot;\n readonly slots?: Readonly<Record<string, JsonValue>>;\n}>;\n\nconst EMPTY_SLOTS: Readonly<Record<string, JsonValue>> = Object.freeze({});\n\nfunction primarySlotsOf(snapshot: StateSnapshot): Readonly<Record<string, JsonValue>> {\n const view = snapshot as LegacySnapshotView;\n if (view.primary !== undefined) return view.primary.slots;\n /* c8 ignore next 2 — validateSnapshot guarantees one of primary/slots is present. */\n if (view.slots === undefined) return EMPTY_SLOTS;\n return view.slots;\n}\n\n/**\n * Save one snapshot and convert malformed/save failures into diagnostics.\n *\n * @since 0.5\n * @internal\n * @example\n * // await saveStateSnapshot(state, Date.now());\n * const saved = true;\n * void saved;\n */\nexport async function saveStateSnapshot(state: RunnerState, savedAt: number): Promise<boolean> {\n const store = state.runtimeContext.persistentStateStore;\n if (store === undefined) return false;\n const snapshot = captureStateSnapshot(state, savedAt);\n if (snapshot === null) {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-malformed\",\n message: \"persistent state snapshot was not JSON-clean\",\n slotId: null,\n bar: state.barIndex,\n });\n return false;\n }\n try {\n await store.save(snapshot);\n state.runtimeContext.lastPersistTime = savedAt;\n return true;\n } catch (err) {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-save-failed\",\n message: err instanceof Error ? err.message : String(err),\n slotId: null,\n bar: state.barIndex,\n });\n return false;\n }\n}\n\n/**\n * Save when the configured PLAN §6.9 wall-clock cadence is stale.\n *\n * @since 0.5\n * @internal\n * @example\n * // await maybeSaveStateSnapshot(state, Date.now(), 60_000);\n * const maybe = true;\n * void maybe;\n */\nexport async function maybeSaveStateSnapshot(\n state: RunnerState,\n savedAt: number,\n intervalMs: number,\n): Promise<void> {\n if (state.runtimeContext.persistentStateStore === undefined) return;\n if (savedAt - state.runtimeContext.lastPersistTime >= intervalMs) {\n await saveStateSnapshot(state, savedAt);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"persistentStateStore.runtime.js","sourceRoot":"","sources":["../src/persistentStateStore.runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type {\n JsonValue,\n RunnerSnapshot,\n StateSnapshot,\n StreamSnapshot,\n} from \"@invinite-org/chartlang-core\";\n\nimport type { RunnerState } from \"./createScriptRunner.js\";\nimport { pushDiagnostic } from \"./emit/index.js\";\nimport { validateSnapshot } from \"./persistentStateStore.validate.js\";\nimport type { RuntimeContext } from \"./runtimeContext.js\";\nimport {\n isSeriesSlotSnapshotKey,\n restoreSeriesSlots,\n restoreStateSlots,\n serialiseSeriesSlots,\n serialiseStateSlots,\n} from \"./state/index.js\";\nimport { isTaSlotSnapshotKey, restoreTaSlots, serialiseTaSlots } from \"./ta/persistence.js\";\n\n/**\n * Default PLAN §6.9 write cadence for persistent snapshots.\n *\n * @since 0.5\n * @internal\n * @example\n * const stale = Date.now() - PERSISTENCE_INTERVAL_MS;\n * void stale;\n */\nexport const PERSISTENCE_INTERVAL_MS = 60_000;\n\nfunction firstStreamKey(snapshot: StateSnapshot): string | null {\n const entries = Object.entries(snapshot.streams);\n const first = entries[0];\n return first === undefined ? null : first[0];\n}\n\nfunction captureStreams(state: RunnerState): Readonly<Record<string, StreamSnapshot>> {\n const main = state.mainStream.serialiseSnapshot();\n const streams: Record<string, StreamSnapshot> = {\n [main.interval === \"\" ? \"main\" : main.interval]: main,\n };\n for (const [key, stream] of state.runtimeContext.secondaryStreams) {\n streams[key] = stream.serialiseSnapshot();\n }\n return Object.freeze(streams);\n}\n\nfunction primarySectionSlots(state: RunnerState): Readonly<Record<string, JsonValue>> {\n return Object.freeze({\n ...serialiseStateSlots(state.runtimeContext),\n ...serialiseSeriesSlots(state.runtimeContext),\n ...serialiseTaSlots(state.mainStream),\n } as Record<string, JsonValue>);\n}\n\nfunction runnerSection(ctx: RuntimeContext): RunnerSnapshot {\n return Object.freeze({\n slots: Object.freeze({\n ...serialiseStateSlots(ctx),\n ...serialiseSeriesSlots(ctx),\n } as Record<string, JsonValue>),\n });\n}\n\nfunction captureSiblings(state: RunnerState): Readonly<Record<string, RunnerSnapshot>> | undefined {\n if (state.siblingRunners.length === 0) return undefined;\n const out: Record<string, RunnerSnapshot> = {};\n for (const sibling of state.siblingRunners) {\n out[sibling.exportName] = runnerSection(sibling.state.runtimeContext);\n }\n return Object.freeze(out);\n}\n\nfunction captureDependencies(\n state: RunnerState,\n): Readonly<Record<string, RunnerSnapshot>> | undefined {\n if (state.depRunners.length === 0) return undefined;\n const out: Record<string, RunnerSnapshot> = {};\n for (const dep of state.depRunners) {\n out[dep.localId] = runnerSection(dep.state.runtimeContext);\n }\n return Object.freeze(out);\n}\n\n/**\n * Capture the runner's current stream + per-runner state-slot snapshot.\n *\n * Returns the structured shape carrying `primary.slots`, optional\n * `siblings[exportName].slots`, and optional `dependencies[localId].slots`.\n * TA slots live in `primary.slots` because the bundle's deps and siblings\n * share the primary's `mainStream` (Task-4 invariant).\n *\n * @since 0.5 — widened to per-runner sections in 0.7.\n * @internal\n * @example\n * // const snapshot = captureStateSnapshot(state, Date.now());\n * const captured = true;\n * void captured;\n */\nexport function captureStateSnapshot(state: RunnerState, savedAt: number): StateSnapshot | null {\n const streams = captureStreams(state);\n const siblings = captureSiblings(state);\n const dependencies = captureDependencies(state);\n const candidate: StateSnapshot = {\n lastBarTime: state.mainStream.bar.time,\n streams,\n savedAt,\n snapshotVersion: 1,\n primary: { slots: primarySectionSlots(state) },\n ...(siblings === undefined ? {} : { siblings }),\n ...(dependencies === undefined ? {} : { dependencies }),\n };\n if (!validateSnapshot(candidate)) return null;\n return candidate;\n}\n\n// Phase-1 mounts have `bar.interval === \"\"` until the first bar lands; in that\n// window the snapshot is keyed by whatever captureStreams used (\"main\" or the\n// explicit interval). Fall back to the snapshot's first-entered stream so warm\n// restart still finds the buffer.\nfunction resolveMainStreamSnapshot(\n snapshot: StateSnapshot,\n mainInterval: string,\n): StreamSnapshot | undefined {\n const direct = mainInterval === \"\" ? undefined : snapshot.streams[mainInterval];\n if (direct !== undefined) return direct;\n const fallback = firstStreamKey(snapshot);\n return fallback === null ? undefined : snapshot.streams[fallback];\n}\n\n// Scalar `state.*` keys only — strip both `ta:` (restored onto the stream)\n// and `:series` (restored into `ctx.seriesSlots`) so the scalar slot store\n// receives neither.\nfunction scalarStateSlots(slots: Readonly<Record<string, unknown>>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [slotKey, value] of Object.entries(slots)) {\n if (!isTaSlotSnapshotKey(slotKey) && !isSeriesSlotSnapshotKey(slotKey)) {\n out[slotKey] = value;\n }\n }\n return out;\n}\n\n// Restore a runner's scalar `state.*` slots and `state.series` slots from\n// one merged `slots` record. Series rings are sized to the runner's current\n// ring capacity (the close buffer's capacity).\nfunction restoreRunnerSlots(\n ctx: RuntimeContext,\n slots: Readonly<Record<string, unknown>>,\n capacity: number,\n): void {\n restoreStateSlots(ctx, scalarStateSlots(slots));\n restoreSeriesSlots(ctx, slots, capacity);\n}\n\nfunction pushMalformedSection(state: RunnerState, message: string): void {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-malformed\",\n message,\n slotId: null,\n bar: state.barIndex,\n });\n}\n\nfunction restoreSiblingSections(\n state: RunnerState,\n siblings: Readonly<Record<string, RunnerSnapshot>>,\n): void {\n const lookup = new Map(state.siblingRunners.map((sib) => [sib.exportName, sib]));\n for (const [exportName, section] of Object.entries(siblings)) {\n const sibling = lookup.get(exportName);\n if (sibling === undefined) {\n pushMalformedSection(\n state,\n `persistent state snapshot referenced unknown sibling \"${exportName}\"`,\n );\n continue;\n }\n restoreRunnerSlots(\n sibling.state.runtimeContext,\n section.slots,\n state.mainStream.ohlcv.close.capacity,\n );\n }\n}\n\nfunction restoreDependencySections(\n state: RunnerState,\n dependencies: Readonly<Record<string, RunnerSnapshot>>,\n): void {\n const lookup = new Map(state.depRunners.map((dep) => [dep.localId, dep]));\n for (const [localId, section] of Object.entries(dependencies)) {\n const dep = lookup.get(localId);\n if (dep === undefined) {\n pushMalformedSection(\n state,\n `persistent state snapshot referenced unknown dependency \"${localId}\"`,\n );\n continue;\n }\n restoreRunnerSlots(\n dep.state.runtimeContext,\n section.slots,\n state.mainStream.ohlcv.close.capacity,\n );\n }\n}\n\n/**\n * Restore a validated snapshot into the runner's stream + slot stores.\n *\n * Walks every per-runner section: `primary.slots` rehydrates the\n * primary's `state.*` slots (and TA slots on the shared mainStream);\n * `siblings[exportName].slots` and `dependencies[localId].slots`\n * rehydrate each matching sub-runner. Snapshot sections whose id is not\n * declared by the current bundle are skipped with a\n * `state-snapshot-malformed` diagnostic.\n *\n * Legacy flat-shape snapshots (pre-0.7) restore into the primary only.\n *\n * @since 0.5 — widened to per-runner sections in 0.7.\n * @internal\n * @example\n * // restoreStateSnapshot(state, snapshot);\n * const restored = true;\n * void restored;\n */\nexport function restoreStateSnapshot(state: RunnerState, snapshot: StateSnapshot): void {\n const stream = resolveMainStreamSnapshot(snapshot, state.mainStream.bar.interval);\n if (stream !== undefined) {\n state.mainStream.restoreFromSnapshot(stream);\n state.barIndex = Math.max(state.barIndex, stream.filled);\n }\n for (const [secondaryKey, secondary] of state.runtimeContext.secondaryStreams) {\n const secondarySnapshot = snapshot.streams[secondaryKey];\n if (secondarySnapshot !== undefined) {\n secondary.restoreFromSnapshot(secondarySnapshot);\n }\n }\n\n const primarySlots = primarySlotsOf(snapshot);\n restoreTaSlots(state.mainStream, primarySlots);\n restoreRunnerSlots(state.runtimeContext, primarySlots, state.mainStream.ohlcv.close.capacity);\n\n if (snapshot.siblings !== undefined) {\n restoreSiblingSections(state, snapshot.siblings);\n }\n if (snapshot.dependencies !== undefined) {\n restoreDependencySections(state, snapshot.dependencies);\n }\n}\n\n/**\n * Resolve the primary runner's slot map from either the structured shape\n * (`snapshot.primary.slots`) or the legacy flat shape (`snapshot.slots`).\n * The validator accepts both but the strict `StateSnapshot` type only\n * mirrors the structured shape; the dual shape is read through this\n * legacy-aware view. {@link validateSnapshot} guarantees at least one of\n * the two shapes is present so we never fall through.\n *\n * @internal\n */\ntype LegacySnapshotView = Readonly<{\n readonly primary?: RunnerSnapshot;\n readonly slots?: Readonly<Record<string, JsonValue>>;\n}>;\n\nconst EMPTY_SLOTS: Readonly<Record<string, JsonValue>> = Object.freeze({});\n\nfunction primarySlotsOf(snapshot: StateSnapshot): Readonly<Record<string, JsonValue>> {\n const view = snapshot as LegacySnapshotView;\n if (view.primary !== undefined) return view.primary.slots;\n /* c8 ignore next 2 — validateSnapshot guarantees one of primary/slots is present. */\n if (view.slots === undefined) return EMPTY_SLOTS;\n return view.slots;\n}\n\n/**\n * Save one snapshot and convert malformed/save failures into diagnostics.\n *\n * @since 0.5\n * @internal\n * @example\n * // await saveStateSnapshot(state, Date.now());\n * const saved = true;\n * void saved;\n */\nexport async function saveStateSnapshot(state: RunnerState, savedAt: number): Promise<boolean> {\n const store = state.runtimeContext.persistentStateStore;\n if (store === undefined) return false;\n const snapshot = captureStateSnapshot(state, savedAt);\n if (snapshot === null) {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-malformed\",\n message: \"persistent state snapshot was not JSON-clean\",\n slotId: null,\n bar: state.barIndex,\n });\n return false;\n }\n try {\n await store.save(snapshot);\n state.runtimeContext.lastPersistTime = savedAt;\n return true;\n } catch (err) {\n pushDiagnostic(state.emissions, {\n kind: \"diagnostic\",\n severity: \"warning\",\n code: \"state-snapshot-save-failed\",\n message: err instanceof Error ? err.message : String(err),\n slotId: null,\n bar: state.barIndex,\n });\n return false;\n }\n}\n\n/**\n * Save when the configured PLAN §6.9 wall-clock cadence is stale.\n *\n * @since 0.5\n * @internal\n * @example\n * // await maybeSaveStateSnapshot(state, Date.now(), 60_000);\n * const maybe = true;\n * void maybe;\n */\nexport async function maybeSaveStateSnapshot(\n state: RunnerState,\n savedAt: number,\n intervalMs: number,\n): Promise<void> {\n if (state.runtimeContext.persistentStateStore === undefined) return;\n if (savedAt - state.runtimeContext.lastPersistTime >= intervalMs) {\n await saveStateSnapshot(state, savedAt);\n }\n}\n"]}
|
package/dist/request/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { buildRequestNamespace } from "./requestNamespace.js";
|
|
2
2
|
export { makeLowerTfSeries } from "./lowerTf.js";
|
|
3
|
-
export { makeNanSecurityBar, makeSecurityBar } from "./security.js";
|
|
3
|
+
export { makeNanSecurityBar, makeSecurityBar, makeSecurityExprSeries } from "./security.js";
|
|
4
|
+
export { type SecurityExprRegistry, type SecurityExprRunner, ascendingValues, buildSecurityExprRunners, captureAndCatchUp, createSecurityExprRunner, driveSecurityExpressions, } from "./securityExprRunner.js";
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,eAAe,EACf,wBAAwB,EACxB,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,GAC3B,MAAM,yBAAyB,CAAC"}
|
package/dist/request/index.js
CHANGED
|
@@ -2,5 +2,6 @@
|
|
|
2
2
|
// See the LICENSE file in the repo root for full license text.
|
|
3
3
|
export { buildRequestNamespace } from "./requestNamespace.js";
|
|
4
4
|
export { makeLowerTfSeries } from "./lowerTf.js";
|
|
5
|
-
export { makeNanSecurityBar, makeSecurityBar } from "./security.js";
|
|
5
|
+
export { makeNanSecurityBar, makeSecurityBar, makeSecurityExprSeries } from "./security.js";
|
|
6
|
+
export { ascendingValues, buildSecurityExprRunners, captureAndCatchUp, createSecurityExprRunner, driveSecurityExpressions, } from "./securityExprRunner.js";
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nexport { buildRequestNamespace } from \"./requestNamespace.js\";\nexport { makeLowerTfSeries } from \"./lowerTf.js\";\nexport { makeNanSecurityBar, makeSecurityBar } from \"./security.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/request/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAGH,eAAe,EACf,wBAAwB,EACxB,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,GAC3B,MAAM,yBAAyB,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nexport { buildRequestNamespace } from \"./requestNamespace.js\";\nexport { makeLowerTfSeries } from \"./lowerTf.js\";\nexport { makeNanSecurityBar, makeSecurityBar, makeSecurityExprSeries } from \"./security.js\";\nexport {\n type SecurityExprRegistry,\n type SecurityExprRunner,\n ascendingValues,\n buildSecurityExprRunners,\n captureAndCatchUp,\n createSecurityExprRunner,\n driveSecurityExpressions,\n} from \"./securityExprRunner.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestNamespace.d.ts","sourceRoot":"","sources":["../../src/request/requestNamespace.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGR,gBAAgB,
|
|
1
|
+
{"version":3,"file":"requestNamespace.d.ts","sourceRoot":"","sources":["../../src/request/requestNamespace.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGR,gBAAgB,EAKnB,MAAM,8BAA8B,CAAC;AAwCtC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,IAAI,gBAAgB,CAGxD"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// See the LICENSE file in the repo root for full license text.
|
|
3
3
|
import { ACTIVE_RUNTIME_CONTEXT } from "../runtimeContext.js";
|
|
4
4
|
import { makeLowerTfSeries } from "./lowerTf.js";
|
|
5
|
-
import { makeSecurityBar } from "./security.js";
|
|
5
|
+
import { makeSecurityBar, makeSecurityExprSeries } from "./security.js";
|
|
6
|
+
import { captureAndCatchUp } from "./securityExprRunner.js";
|
|
6
7
|
function getCtx(name) {
|
|
7
8
|
const ctx = ACTIVE_RUNTIME_CONTEXT.current;
|
|
8
9
|
if (ctx === null) {
|
|
@@ -10,9 +11,21 @@ function getCtx(name) {
|
|
|
10
11
|
}
|
|
11
12
|
return ctx;
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
+
// Dispatch off the runner registry (not `expr !== undefined`) so compiled
|
|
15
|
+
// output stays robust if the emitted call shape changes: a slotId the compiler
|
|
16
|
+
// recorded in `manifest.securityExpressions` is always an expression unit.
|
|
17
|
+
function security(slotId, opts, expr) {
|
|
14
18
|
const ctx = getCtx("request.security");
|
|
15
|
-
|
|
19
|
+
const runner = ctx.securityExprRunners?.get(slotId);
|
|
20
|
+
if (runner === undefined) {
|
|
21
|
+
return makeSecurityBar(ctx, slotId, opts.interval);
|
|
22
|
+
}
|
|
23
|
+
if (expr !== undefined) {
|
|
24
|
+
const secondary = ctx.secondaryStreams.get(opts.interval);
|
|
25
|
+
if (secondary !== undefined)
|
|
26
|
+
captureAndCatchUp(runner, expr, secondary);
|
|
27
|
+
}
|
|
28
|
+
return makeSecurityExprSeries(ctx, runner, opts.interval);
|
|
16
29
|
}
|
|
17
30
|
function lowerTf(slotId, opts) {
|
|
18
31
|
const ctx = getCtx("request.lowerTf");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestNamespace.js","sourceRoot":"","sources":["../../src/request/requestNamespace.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;
|
|
1
|
+
{"version":3,"file":"requestNamespace.js","sourceRoot":"","sources":["../../src/request/requestNamespace.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAY/D,OAAO,EAAE,sBAAsB,EAAuB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,SAAS,MAAM,CAAC,IAAY;IACxB,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC;IAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,uCAAuC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,0EAA0E;AAC1E,+EAA+E;AAC/E,2EAA2E;AAC3E,SAAS,QAAQ,CACb,MAAc,EACd,IAAyB,EACzB,IAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,SAAS,KAAK,SAAS;YAAE,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,OAAO,CAAC,MAAc,EAAE,IAAwB;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtC,OAAO,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB;IACjC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,OAAO,EAAiC,CAAC;AAC7C,CAAC","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type {\n Bar,\n RequestLowerTfOpts,\n RequestNamespace,\n RequestSecurityOpts,\n SecurityBar,\n SecurityExpr,\n Series,\n} from \"@invinite-org/chartlang-core\";\n\nimport { ACTIVE_RUNTIME_CONTEXT, type RuntimeContext } from \"../runtimeContext.js\";\nimport { makeLowerTfSeries } from \"./lowerTf.js\";\nimport { makeSecurityBar, makeSecurityExprSeries } from \"./security.js\";\nimport { captureAndCatchUp } from \"./securityExprRunner.js\";\n\nfunction getCtx(name: string): RuntimeContext {\n const ctx = ACTIVE_RUNTIME_CONTEXT.current;\n if (ctx === null) {\n throw new Error(`${name} called outside an active script step`);\n }\n return ctx;\n}\n\n// Dispatch off the runner registry (not `expr !== undefined`) so compiled\n// output stays robust if the emitted call shape changes: a slotId the compiler\n// recorded in `manifest.securityExpressions` is always an expression unit.\nfunction security(\n slotId: string,\n opts: RequestSecurityOpts,\n expr?: SecurityExpr,\n): SecurityBar | Series<number> {\n const ctx = getCtx(\"request.security\");\n const runner = ctx.securityExprRunners?.get(slotId);\n if (runner === undefined) {\n return makeSecurityBar(ctx, slotId, opts.interval);\n }\n if (expr !== undefined) {\n const secondary = ctx.secondaryStreams.get(opts.interval);\n if (secondary !== undefined) captureAndCatchUp(runner, expr, secondary);\n }\n return makeSecurityExprSeries(ctx, runner, opts.interval);\n}\n\nfunction lowerTf(slotId: string, opts: RequestLowerTfOpts): Series<ReadonlyArray<Bar>> {\n const ctx = getCtx(\"request.lowerTf\");\n return makeLowerTfSeries(ctx, slotId, opts.interval);\n}\n\n/**\n * Build the runtime `request` namespace installed on `ComputeContext`.\n *\n * The implementation accepts the compiler-injected `slotId` as its first\n * parameter even though the public core type is script-facing\n * `request.security(opts)`. This mirrors the existing slot-aware `state.*`\n * runtime namespace.\n *\n * @since 0.4\n * @stable\n * @example\n * const ns = buildRequestNamespace();\n * void ns.security;\n */\nexport function buildRequestNamespace(): RequestNamespace {\n const ns = Object.freeze({ security, lowerTf });\n return ns as unknown as RequestNamespace;\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { SecurityBar } from "@invinite-org/chartlang-core";
|
|
1
|
+
import type { SecurityBar, Series } from "@invinite-org/chartlang-core";
|
|
2
2
|
import type { RuntimeContext } from "../runtimeContext.js";
|
|
3
|
+
import { type SecurityExprRunner } from "./securityExprRunner.js";
|
|
3
4
|
/**
|
|
4
5
|
* Build the all-NaN `SecurityBar` fallback for unsupported MTF paths.
|
|
5
6
|
*
|
|
@@ -22,4 +23,22 @@ export declare function makeNanSecurityBar(): SecurityBar;
|
|
|
22
23
|
* void requested;
|
|
23
24
|
*/
|
|
24
25
|
export declare function makeSecurityBar(ctx: RuntimeContext, slotId: string, interval: string): SecurityBar;
|
|
26
|
+
/**
|
|
27
|
+
* Return the main-aligned output series for an HTF expression callsite. The
|
|
28
|
+
* runner's `output` buffer holds one sampled value per HTF bar; this aligns it
|
|
29
|
+
* no-lookahead to the main timeline against the real secondary stream's
|
|
30
|
+
* timestamps (so `output[i]` pairs with secondary ascending bar `i`). Reuses
|
|
31
|
+
* the OHLCV alignment kernel via {@link getOrAlign}. Capability / interval /
|
|
32
|
+
* stream fallbacks return an all-NaN series and push a deduped diagnostic,
|
|
33
|
+
* matching {@link makeSecurityBar}. The returned Proxy identity is cached per
|
|
34
|
+
* `slotId|interval` for the bar.
|
|
35
|
+
*
|
|
36
|
+
* @since 0.7
|
|
37
|
+
* @stable
|
|
38
|
+
* @example
|
|
39
|
+
* // const trend = makeSecurityExprSeries(ctx, runner, "1W");
|
|
40
|
+
* const requested = "1W";
|
|
41
|
+
* void requested;
|
|
42
|
+
*/
|
|
43
|
+
export declare function makeSecurityExprSeries(ctx: RuntimeContext, runner: SecurityExprRunner, interval: string): Series<number>;
|
|
25
44
|
//# sourceMappingURL=security.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/request/security.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/request/security.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,OAAO,EAAE,KAAK,kBAAkB,EAAmB,MAAM,yBAAyB,CAAC;AAgCnF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,CAiBhD;AAwHD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACjB,WAAW,CA2Cb;AA+CD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAClC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,CAAC,CAmBhB"}
|
package/dist/request/security.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// See the LICENSE file in the repo root for full license text.
|
|
3
3
|
import { getOrAlign } from "./alignHtfSeriesCache.js";
|
|
4
4
|
import { pushOnce } from "./pushOnce.js";
|
|
5
|
-
import {
|
|
5
|
+
import { ascendingValues } from "./securityExprRunner.js";
|
|
6
|
+
import { ascendingBarsFor, makeConstantStringSeries } from "./streamBars.js";
|
|
6
7
|
const NUMERIC_SOURCE_KEYS = Object.freeze([
|
|
7
8
|
"time",
|
|
8
9
|
"open",
|
|
@@ -68,10 +69,17 @@ function alignedSeries(ctx, slotId, interval, sourceKey, secondary) {
|
|
|
68
69
|
ctx.requestSecurityAlignments.set(key, aligned);
|
|
69
70
|
return aligned;
|
|
70
71
|
}
|
|
71
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Wrap a producer of the latest main-aligned array in the head-relative
|
|
74
|
+
* `Series<number>` Proxy shape. `current` / `[n]` re-run `produce` (cheap —
|
|
75
|
+
* `getOrAlign` memoises per bar) and read from the tail; `length` is the main
|
|
76
|
+
* stream's bar count. Shared by the OHLCV `SecurityBar` fields and the
|
|
77
|
+
* expression-output series so both walk the identical no-lookahead alignment.
|
|
78
|
+
*/
|
|
79
|
+
function makeAlignedSeriesProxy(ctx, produce) {
|
|
72
80
|
const target = {
|
|
73
81
|
get current() {
|
|
74
|
-
const aligned =
|
|
82
|
+
const aligned = produce();
|
|
75
83
|
const value = aligned[aligned.length - 1];
|
|
76
84
|
return value === undefined ? Number.NaN : value;
|
|
77
85
|
},
|
|
@@ -84,7 +92,7 @@ function makeAlignedNumberSeries(ctx, slotId, interval, sourceKey, secondary) {
|
|
|
84
92
|
if (typeof prop === "string") {
|
|
85
93
|
const n = Number(prop);
|
|
86
94
|
if (Number.isInteger(n) && n >= 0) {
|
|
87
|
-
const aligned =
|
|
95
|
+
const aligned = produce();
|
|
88
96
|
const value = aligned[aligned.length - 1 - n];
|
|
89
97
|
return value === undefined ? Number.NaN : value;
|
|
90
98
|
}
|
|
@@ -93,25 +101,8 @@ function makeAlignedNumberSeries(ctx, slotId, interval, sourceKey, secondary) {
|
|
|
93
101
|
},
|
|
94
102
|
});
|
|
95
103
|
}
|
|
96
|
-
function
|
|
97
|
-
|
|
98
|
-
get current() {
|
|
99
|
-
return value;
|
|
100
|
-
},
|
|
101
|
-
get length() {
|
|
102
|
-
return 0;
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
return new Proxy(Object.freeze(target), {
|
|
106
|
-
get(obj, prop, receiver) {
|
|
107
|
-
if (typeof prop === "string") {
|
|
108
|
-
const n = Number(prop);
|
|
109
|
-
if (Number.isInteger(n) && n >= 0)
|
|
110
|
-
return value;
|
|
111
|
-
}
|
|
112
|
-
return Reflect.get(obj, prop, receiver);
|
|
113
|
-
},
|
|
114
|
-
});
|
|
104
|
+
function makeAlignedNumberSeries(ctx, slotId, interval, sourceKey, secondary) {
|
|
105
|
+
return makeAlignedSeriesProxy(ctx, () => alignedSeries(ctx, slotId, interval, sourceKey, secondary));
|
|
115
106
|
}
|
|
116
107
|
function makeLiveSecurityBar(ctx, slotId, interval, secondary) {
|
|
117
108
|
const numeric = new Map();
|
|
@@ -169,4 +160,52 @@ export function makeSecurityBar(ctx, slotId, interval) {
|
|
|
169
160
|
ctx.requestSecurityBars.set(cacheKey, bar);
|
|
170
161
|
return bar;
|
|
171
162
|
}
|
|
163
|
+
function makeNanNumberSeries() {
|
|
164
|
+
return makeSeries(Number.NaN);
|
|
165
|
+
}
|
|
166
|
+
function resolveSecondaryOrDiagnose(ctx, slotId, interval) {
|
|
167
|
+
if (!ctx.capabilities.multiTimeframe) {
|
|
168
|
+
pushOnce(ctx, "multi-timeframe-not-supported", slotId, interval, "security", "Adapter declares multiTimeframe: false; request.security returns NaN");
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
if (!ctx.capabilities.intervals.some((descriptor) => descriptor.value === interval)) {
|
|
172
|
+
pushOnce(ctx, "unsupported-interval", slotId, interval, "security", `Requested interval "${interval}" is not in Capabilities.intervals`);
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
const secondary = ctx.secondaryStreams.get(interval);
|
|
176
|
+
if (secondary === undefined) {
|
|
177
|
+
pushOnce(ctx, "unknown-secondary-stream", slotId, interval, "security", `Requested interval "${interval}" has no registered secondary stream`);
|
|
178
|
+
}
|
|
179
|
+
return secondary;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Return the main-aligned output series for an HTF expression callsite. The
|
|
183
|
+
* runner's `output` buffer holds one sampled value per HTF bar; this aligns it
|
|
184
|
+
* no-lookahead to the main timeline against the real secondary stream's
|
|
185
|
+
* timestamps (so `output[i]` pairs with secondary ascending bar `i`). Reuses
|
|
186
|
+
* the OHLCV alignment kernel via {@link getOrAlign}. Capability / interval /
|
|
187
|
+
* stream fallbacks return an all-NaN series and push a deduped diagnostic,
|
|
188
|
+
* matching {@link makeSecurityBar}. The returned Proxy identity is cached per
|
|
189
|
+
* `slotId|interval` for the bar.
|
|
190
|
+
*
|
|
191
|
+
* @since 0.7
|
|
192
|
+
* @stable
|
|
193
|
+
* @example
|
|
194
|
+
* // const trend = makeSecurityExprSeries(ctx, runner, "1W");
|
|
195
|
+
* const requested = "1W";
|
|
196
|
+
* void requested;
|
|
197
|
+
*/
|
|
198
|
+
export function makeSecurityExprSeries(ctx, runner, interval) {
|
|
199
|
+
const cacheKey = `${runner.slotId}|${interval}`;
|
|
200
|
+
const cache = ctx.requestSecurityExprSeries;
|
|
201
|
+
const existing = cache?.get(cacheKey);
|
|
202
|
+
if (existing !== undefined)
|
|
203
|
+
return existing;
|
|
204
|
+
const secondary = resolveSecondaryOrDiagnose(ctx, runner.slotId, interval);
|
|
205
|
+
const series = secondary === undefined
|
|
206
|
+
? makeNanNumberSeries()
|
|
207
|
+
: makeAlignedSeriesProxy(ctx, () => getOrAlign(ascendingBarsFor(ctx, secondary), ascendingValues(runner.output), ascendingBarsFor(ctx, ctx.stream)));
|
|
208
|
+
cache?.set(cacheKey, series);
|
|
209
|
+
return series;
|
|
210
|
+
}
|
|
172
211
|
//# sourceMappingURL=security.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/request/security.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { SecurityBar, Series } from \"@invinite-org/chartlang-core\";\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\nimport type { StreamState } from \"../streamState.js\";\nimport { getOrAlign } from \"./alignHtfSeriesCache.js\";\nimport { pushOnce } from \"./pushOnce.js\";\nimport { ascendingBarsFor } from \"./streamBars.js\";\n\ntype NumericSourceKey =\n | \"time\"\n | \"open\"\n | \"high\"\n | \"low\"\n | \"close\"\n | \"volume\"\n | \"hl2\"\n | \"hlc3\"\n | \"ohlc4\"\n | \"hlcc4\";\n\nconst NUMERIC_SOURCE_KEYS: ReadonlyArray<NumericSourceKey> = Object.freeze([\n \"time\",\n \"open\",\n \"high\",\n \"low\",\n \"close\",\n \"volume\",\n \"hl2\",\n \"hlc3\",\n \"ohlc4\",\n \"hlcc4\",\n]);\n\nfunction makeSeries<T>(current: T): Series<T> {\n return Object.freeze({ current, length: 0 }) as Series<T>;\n}\n\n/**\n * Build the all-NaN `SecurityBar` fallback for unsupported MTF paths.\n *\n * @since 0.4\n * @stable\n * @example\n * const bar = makeNanSecurityBar();\n * const close = bar.close.current;\n * void close;\n */\nexport function makeNanSecurityBar(): SecurityBar {\n const nanNumberSeries = makeSeries(Number.NaN);\n const nanStringSeries = makeSeries(\"\");\n return Object.freeze({\n time: nanNumberSeries,\n open: nanNumberSeries,\n high: nanNumberSeries,\n low: nanNumberSeries,\n close: nanNumberSeries,\n volume: nanNumberSeries,\n hl2: nanNumberSeries,\n hlc3: nanNumberSeries,\n ohlc4: nanNumberSeries,\n hlcc4: nanNumberSeries,\n symbol: nanStringSeries,\n interval: nanStringSeries,\n });\n}\n\nfunction seriesAscending(stream: StreamState, sourceKey: NumericSourceKey): ReadonlyArray<number> {\n const values: number[] = [];\n const source = stream.ohlcv[sourceKey];\n for (let age = source.length - 1; age >= 0; age -= 1) {\n values.push(source.at(age));\n }\n return values;\n}\n\nfunction alignmentKey(slotId: string, interval: string, sourceKey: NumericSourceKey): string {\n return `${slotId}|${interval}|${sourceKey}`;\n}\n\nfunction alignedSeries(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n sourceKey: NumericSourceKey,\n secondary: StreamState,\n): ReadonlyArray<number> {\n const key = alignmentKey(slotId, interval, sourceKey);\n const existing = ctx.requestSecurityAlignments.get(key);\n if (existing !== undefined) return existing;\n const htfBars = ascendingBarsFor(ctx, secondary);\n const ltfBars = ascendingBarsFor(ctx, ctx.stream);\n const aligned = getOrAlign(htfBars, seriesAscending(secondary, sourceKey), ltfBars);\n ctx.requestSecurityAlignments.set(key, aligned);\n return aligned;\n}\n\nfunction makeAlignedNumberSeries(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n sourceKey: NumericSourceKey,\n secondary: StreamState,\n): Series<number> {\n const target = {\n get current() {\n const aligned = alignedSeries(ctx, slotId, interval, sourceKey, secondary);\n const value = aligned[aligned.length - 1];\n return value === undefined ? Number.NaN : value;\n },\n get length() {\n return ctx.stream.ohlcv.close.length;\n },\n };\n return new Proxy(Object.freeze(target), {\n get(obj, prop, receiver) {\n if (typeof prop === \"string\") {\n const n = Number(prop);\n if (Number.isInteger(n) && n >= 0) {\n const aligned = alignedSeries(ctx, slotId, interval, sourceKey, secondary);\n const value = aligned[aligned.length - 1 - n];\n return value === undefined ? Number.NaN : value;\n }\n }\n return Reflect.get(obj, prop, receiver);\n },\n }) as Series<number>;\n}\n\nfunction makeConstantStringSeries(value: string): Series<string> {\n const target = {\n get current() {\n return value;\n },\n get length() {\n return 0;\n },\n };\n return new Proxy(Object.freeze(target), {\n get(obj, prop, receiver) {\n if (typeof prop === \"string\") {\n const n = Number(prop);\n if (Number.isInteger(n) && n >= 0) return value;\n }\n return Reflect.get(obj, prop, receiver);\n },\n }) as Series<string>;\n}\n\nfunction makeLiveSecurityBar(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n secondary: StreamState,\n): SecurityBar {\n const numeric = new Map<NumericSourceKey, Series<number>>();\n for (const key of NUMERIC_SOURCE_KEYS) {\n numeric.set(key, makeAlignedNumberSeries(ctx, slotId, interval, key, secondary));\n }\n return Object.freeze({\n time: numeric.get(\"time\") ?? makeSeries(Number.NaN),\n open: numeric.get(\"open\") ?? makeSeries(Number.NaN),\n high: numeric.get(\"high\") ?? makeSeries(Number.NaN),\n low: numeric.get(\"low\") ?? makeSeries(Number.NaN),\n close: numeric.get(\"close\") ?? makeSeries(Number.NaN),\n volume: numeric.get(\"volume\") ?? makeSeries(Number.NaN),\n hl2: numeric.get(\"hl2\") ?? makeSeries(Number.NaN),\n hlc3: numeric.get(\"hlc3\") ?? makeSeries(Number.NaN),\n ohlc4: numeric.get(\"ohlc4\") ?? makeSeries(Number.NaN),\n hlcc4: numeric.get(\"hlcc4\") ?? makeSeries(Number.NaN),\n symbol: makeConstantStringSeries(secondary.bar.symbol),\n interval: makeConstantStringSeries(interval),\n });\n}\n\nfunction fallbackNaN(\n ctx: RuntimeContext,\n cacheKey: string,\n slotId: string,\n interval: string,\n code: \"unsupported-interval\" | \"multi-timeframe-not-supported\" | \"unknown-secondary-stream\",\n message: string,\n): SecurityBar {\n pushOnce(ctx, code, slotId, interval, \"security\", message);\n const bar = makeNanSecurityBar();\n ctx.requestSecurityBars.set(cacheKey, bar);\n return bar;\n}\n\n/**\n * Return the runtime `request.security` bar for a callsite and interval.\n *\n * @since 0.5\n * @stable\n * @example\n * // const bar = makeSecurityBar(ctx, \"slot#0\", \"1D\");\n * const requested = \"1D\";\n * void requested;\n */\nexport function makeSecurityBar(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n): SecurityBar {\n const cacheKey = `${slotId}|${interval}`;\n const existing = ctx.requestSecurityBars.get(cacheKey);\n if (existing !== undefined) return existing;\n\n if (!ctx.capabilities.multiTimeframe) {\n return fallbackNaN(\n ctx,\n cacheKey,\n slotId,\n interval,\n \"multi-timeframe-not-supported\",\n \"Adapter declares multiTimeframe: false; request.security returns NaN\",\n );\n }\n\n const known = ctx.capabilities.intervals.some((descriptor) => descriptor.value === interval);\n if (!known) {\n return fallbackNaN(\n ctx,\n cacheKey,\n slotId,\n interval,\n \"unsupported-interval\",\n `Requested interval \"${interval}\" is not in Capabilities.intervals`,\n );\n }\n\n const secondary = ctx.secondaryStreams.get(interval);\n if (secondary === undefined) {\n return fallbackNaN(\n ctx,\n cacheKey,\n slotId,\n interval,\n \"unknown-secondary-stream\",\n `Requested interval \"${interval}\" has no registered secondary stream`,\n );\n }\n\n const bar = makeLiveSecurityBar(ctx, slotId, interval, secondary);\n ctx.requestSecurityBars.set(cacheKey, bar);\n return bar;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/request/security.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2026 Invinite. Licensed under the MIT License.\n// See the LICENSE file in the repo root for full license text.\n\nimport type { SecurityBar, Series } from \"@invinite-org/chartlang-core\";\n\nimport type { RuntimeContext } from \"../runtimeContext.js\";\nimport type { StreamState } from \"../streamState.js\";\nimport { getOrAlign } from \"./alignHtfSeriesCache.js\";\nimport { pushOnce } from \"./pushOnce.js\";\nimport { type SecurityExprRunner, ascendingValues } from \"./securityExprRunner.js\";\nimport { ascendingBarsFor, makeConstantStringSeries } from \"./streamBars.js\";\n\ntype NumericSourceKey =\n | \"time\"\n | \"open\"\n | \"high\"\n | \"low\"\n | \"close\"\n | \"volume\"\n | \"hl2\"\n | \"hlc3\"\n | \"ohlc4\"\n | \"hlcc4\";\n\nconst NUMERIC_SOURCE_KEYS: ReadonlyArray<NumericSourceKey> = Object.freeze([\n \"time\",\n \"open\",\n \"high\",\n \"low\",\n \"close\",\n \"volume\",\n \"hl2\",\n \"hlc3\",\n \"ohlc4\",\n \"hlcc4\",\n]);\n\nfunction makeSeries<T>(current: T): Series<T> {\n return Object.freeze({ current, length: 0 }) as Series<T>;\n}\n\n/**\n * Build the all-NaN `SecurityBar` fallback for unsupported MTF paths.\n *\n * @since 0.4\n * @stable\n * @example\n * const bar = makeNanSecurityBar();\n * const close = bar.close.current;\n * void close;\n */\nexport function makeNanSecurityBar(): SecurityBar {\n const nanNumberSeries = makeSeries(Number.NaN);\n const nanStringSeries = makeSeries(\"\");\n return Object.freeze({\n time: nanNumberSeries,\n open: nanNumberSeries,\n high: nanNumberSeries,\n low: nanNumberSeries,\n close: nanNumberSeries,\n volume: nanNumberSeries,\n hl2: nanNumberSeries,\n hlc3: nanNumberSeries,\n ohlc4: nanNumberSeries,\n hlcc4: nanNumberSeries,\n symbol: nanStringSeries,\n interval: nanStringSeries,\n });\n}\n\nfunction seriesAscending(stream: StreamState, sourceKey: NumericSourceKey): ReadonlyArray<number> {\n const values: number[] = [];\n const source = stream.ohlcv[sourceKey];\n for (let age = source.length - 1; age >= 0; age -= 1) {\n values.push(source.at(age));\n }\n return values;\n}\n\nfunction alignmentKey(slotId: string, interval: string, sourceKey: NumericSourceKey): string {\n return `${slotId}|${interval}|${sourceKey}`;\n}\n\nfunction alignedSeries(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n sourceKey: NumericSourceKey,\n secondary: StreamState,\n): ReadonlyArray<number> {\n const key = alignmentKey(slotId, interval, sourceKey);\n const existing = ctx.requestSecurityAlignments.get(key);\n if (existing !== undefined) return existing;\n const htfBars = ascendingBarsFor(ctx, secondary);\n const ltfBars = ascendingBarsFor(ctx, ctx.stream);\n const aligned = getOrAlign(htfBars, seriesAscending(secondary, sourceKey), ltfBars);\n ctx.requestSecurityAlignments.set(key, aligned);\n return aligned;\n}\n\n/**\n * Wrap a producer of the latest main-aligned array in the head-relative\n * `Series<number>` Proxy shape. `current` / `[n]` re-run `produce` (cheap —\n * `getOrAlign` memoises per bar) and read from the tail; `length` is the main\n * stream's bar count. Shared by the OHLCV `SecurityBar` fields and the\n * expression-output series so both walk the identical no-lookahead alignment.\n */\nfunction makeAlignedSeriesProxy(\n ctx: RuntimeContext,\n produce: () => ReadonlyArray<number>,\n): Series<number> {\n const target = {\n get current() {\n const aligned = produce();\n const value = aligned[aligned.length - 1];\n return value === undefined ? Number.NaN : value;\n },\n get length() {\n return ctx.stream.ohlcv.close.length;\n },\n };\n return new Proxy(Object.freeze(target), {\n get(obj, prop, receiver) {\n if (typeof prop === \"string\") {\n const n = Number(prop);\n if (Number.isInteger(n) && n >= 0) {\n const aligned = produce();\n const value = aligned[aligned.length - 1 - n];\n return value === undefined ? Number.NaN : value;\n }\n }\n return Reflect.get(obj, prop, receiver);\n },\n }) as Series<number>;\n}\n\nfunction makeAlignedNumberSeries(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n sourceKey: NumericSourceKey,\n secondary: StreamState,\n): Series<number> {\n return makeAlignedSeriesProxy(ctx, () =>\n alignedSeries(ctx, slotId, interval, sourceKey, secondary),\n );\n}\n\nfunction makeLiveSecurityBar(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n secondary: StreamState,\n): SecurityBar {\n const numeric = new Map<NumericSourceKey, Series<number>>();\n for (const key of NUMERIC_SOURCE_KEYS) {\n numeric.set(key, makeAlignedNumberSeries(ctx, slotId, interval, key, secondary));\n }\n return Object.freeze({\n time: numeric.get(\"time\") ?? makeSeries(Number.NaN),\n open: numeric.get(\"open\") ?? makeSeries(Number.NaN),\n high: numeric.get(\"high\") ?? makeSeries(Number.NaN),\n low: numeric.get(\"low\") ?? makeSeries(Number.NaN),\n close: numeric.get(\"close\") ?? makeSeries(Number.NaN),\n volume: numeric.get(\"volume\") ?? makeSeries(Number.NaN),\n hl2: numeric.get(\"hl2\") ?? makeSeries(Number.NaN),\n hlc3: numeric.get(\"hlc3\") ?? makeSeries(Number.NaN),\n ohlc4: numeric.get(\"ohlc4\") ?? makeSeries(Number.NaN),\n hlcc4: numeric.get(\"hlcc4\") ?? makeSeries(Number.NaN),\n symbol: makeConstantStringSeries(secondary.bar.symbol),\n interval: makeConstantStringSeries(interval),\n });\n}\n\nfunction fallbackNaN(\n ctx: RuntimeContext,\n cacheKey: string,\n slotId: string,\n interval: string,\n code: \"unsupported-interval\" | \"multi-timeframe-not-supported\" | \"unknown-secondary-stream\",\n message: string,\n): SecurityBar {\n pushOnce(ctx, code, slotId, interval, \"security\", message);\n const bar = makeNanSecurityBar();\n ctx.requestSecurityBars.set(cacheKey, bar);\n return bar;\n}\n\n/**\n * Return the runtime `request.security` bar for a callsite and interval.\n *\n * @since 0.5\n * @stable\n * @example\n * // const bar = makeSecurityBar(ctx, \"slot#0\", \"1D\");\n * const requested = \"1D\";\n * void requested;\n */\nexport function makeSecurityBar(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n): SecurityBar {\n const cacheKey = `${slotId}|${interval}`;\n const existing = ctx.requestSecurityBars.get(cacheKey);\n if (existing !== undefined) return existing;\n\n if (!ctx.capabilities.multiTimeframe) {\n return fallbackNaN(\n ctx,\n cacheKey,\n slotId,\n interval,\n \"multi-timeframe-not-supported\",\n \"Adapter declares multiTimeframe: false; request.security returns NaN\",\n );\n }\n\n const known = ctx.capabilities.intervals.some((descriptor) => descriptor.value === interval);\n if (!known) {\n return fallbackNaN(\n ctx,\n cacheKey,\n slotId,\n interval,\n \"unsupported-interval\",\n `Requested interval \"${interval}\" is not in Capabilities.intervals`,\n );\n }\n\n const secondary = ctx.secondaryStreams.get(interval);\n if (secondary === undefined) {\n return fallbackNaN(\n ctx,\n cacheKey,\n slotId,\n interval,\n \"unknown-secondary-stream\",\n `Requested interval \"${interval}\" has no registered secondary stream`,\n );\n }\n\n const bar = makeLiveSecurityBar(ctx, slotId, interval, secondary);\n ctx.requestSecurityBars.set(cacheKey, bar);\n return bar;\n}\n\nfunction makeNanNumberSeries(): Series<number> {\n return makeSeries(Number.NaN);\n}\n\nfunction resolveSecondaryOrDiagnose(\n ctx: RuntimeContext,\n slotId: string,\n interval: string,\n): StreamState | undefined {\n if (!ctx.capabilities.multiTimeframe) {\n pushOnce(\n ctx,\n \"multi-timeframe-not-supported\",\n slotId,\n interval,\n \"security\",\n \"Adapter declares multiTimeframe: false; request.security returns NaN\",\n );\n return undefined;\n }\n if (!ctx.capabilities.intervals.some((descriptor) => descriptor.value === interval)) {\n pushOnce(\n ctx,\n \"unsupported-interval\",\n slotId,\n interval,\n \"security\",\n `Requested interval \"${interval}\" is not in Capabilities.intervals`,\n );\n return undefined;\n }\n const secondary = ctx.secondaryStreams.get(interval);\n if (secondary === undefined) {\n pushOnce(\n ctx,\n \"unknown-secondary-stream\",\n slotId,\n interval,\n \"security\",\n `Requested interval \"${interval}\" has no registered secondary stream`,\n );\n }\n return secondary;\n}\n\n/**\n * Return the main-aligned output series for an HTF expression callsite. The\n * runner's `output` buffer holds one sampled value per HTF bar; this aligns it\n * no-lookahead to the main timeline against the real secondary stream's\n * timestamps (so `output[i]` pairs with secondary ascending bar `i`). Reuses\n * the OHLCV alignment kernel via {@link getOrAlign}. Capability / interval /\n * stream fallbacks return an all-NaN series and push a deduped diagnostic,\n * matching {@link makeSecurityBar}. The returned Proxy identity is cached per\n * `slotId|interval` for the bar.\n *\n * @since 0.7\n * @stable\n * @example\n * // const trend = makeSecurityExprSeries(ctx, runner, \"1W\");\n * const requested = \"1W\";\n * void requested;\n */\nexport function makeSecurityExprSeries(\n ctx: RuntimeContext,\n runner: SecurityExprRunner,\n interval: string,\n): Series<number> {\n const cacheKey = `${runner.slotId}|${interval}`;\n const cache = ctx.requestSecurityExprSeries;\n const existing = cache?.get(cacheKey);\n if (existing !== undefined) return existing;\n\n const secondary = resolveSecondaryOrDiagnose(ctx, runner.slotId, interval);\n const series =\n secondary === undefined\n ? makeNanNumberSeries()\n : makeAlignedSeriesProxy(ctx, () =>\n getOrAlign(\n ascendingBarsFor(ctx, secondary),\n ascendingValues(runner.output),\n ascendingBarsFor(ctx, ctx.stream),\n ),\n );\n cache?.set(cacheKey, series);\n return series;\n}\n"]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { Bar, ScriptManifest, SecurityBar, SecurityExpr } from "@invinite-org/chartlang-core";
|
|
2
|
+
import { type RuntimeContext } from "../runtimeContext.js";
|
|
3
|
+
import { Float64RingBuffer } from "../ringBuffer.js";
|
|
4
|
+
import { type StreamState } from "../streamState.js";
|
|
5
|
+
/**
|
|
6
|
+
* One mounted higher-timeframe expression unit. The compiler records each
|
|
7
|
+
* `request.security({ interval }, (bar) => …)` callsite in
|
|
8
|
+
* `manifest.securityExpressions`; the runtime mounts one runner per entry.
|
|
9
|
+
*
|
|
10
|
+
* The runner owns a dedicated fold {@link StreamState} clocked on the HTF
|
|
11
|
+
* `interval`, a `Float64RingBuffer` output buffer (one sampled value per HTF
|
|
12
|
+
* bar), a fold {@link SecurityBar} view backed by the fold stream's head, and
|
|
13
|
+
* a private {@link RuntimeContext} (`stream = foldStream`,
|
|
14
|
+
* `slotIdPrefix = "security:<slotId>/"`) so `ta.*` inside the callback
|
|
15
|
+
* accumulate on the HTF clock without colliding with the main stream.
|
|
16
|
+
*
|
|
17
|
+
* `callback` is captured lazily the first time the main compute body calls
|
|
18
|
+
* `request.security(slotId, opts, expr)`. `processedHtfCount` tracks how many
|
|
19
|
+
* HTF bars have already been folded into `output` so replay catches up history
|
|
20
|
+
* exactly once.
|
|
21
|
+
*
|
|
22
|
+
* @since 0.7
|
|
23
|
+
* @stable
|
|
24
|
+
* @example
|
|
25
|
+
* // const runner = createSecurityExprRunner({ slotId: "s#0", interval: "1W",
|
|
26
|
+
* // capacity: 64, parent });
|
|
27
|
+
* const slotId = "s#0";
|
|
28
|
+
* void slotId;
|
|
29
|
+
*/
|
|
30
|
+
export type SecurityExprRunner = {
|
|
31
|
+
readonly slotId: string;
|
|
32
|
+
readonly interval: string;
|
|
33
|
+
readonly foldStream: StreamState;
|
|
34
|
+
readonly foldBar: SecurityBar;
|
|
35
|
+
readonly ctx: RuntimeContext;
|
|
36
|
+
readonly output: Float64RingBuffer;
|
|
37
|
+
callback?: SecurityExpr;
|
|
38
|
+
processedHtfCount: number;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* The pair of lookup maps the runtime threads onto its {@link RuntimeContext}:
|
|
42
|
+
* `bySlot` keyed by `slotId` (overload dispatch + capture) and `byInterval`
|
|
43
|
+
* keyed by `IntervalDescriptor.value` (the fan-out from a secondary close).
|
|
44
|
+
*
|
|
45
|
+
* @since 0.7
|
|
46
|
+
* @stable
|
|
47
|
+
* @example
|
|
48
|
+
* const registry: SecurityExprRegistry = {
|
|
49
|
+
* bySlot: new Map(),
|
|
50
|
+
* byInterval: new Map(),
|
|
51
|
+
* };
|
|
52
|
+
* void registry;
|
|
53
|
+
*/
|
|
54
|
+
export type SecurityExprRegistry = {
|
|
55
|
+
readonly bySlot: Map<string, SecurityExprRunner>;
|
|
56
|
+
readonly byInterval: ReadonlyMap<string, ReadonlyArray<SecurityExprRunner>>;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Construct one {@link SecurityExprRunner}. The fold stream and output buffer
|
|
60
|
+
* share the secondary stream's `capacity` so a deep-lookback callback
|
|
61
|
+
* (`ta.sma(bar.close, 50)`) has enough HTF history to warm up.
|
|
62
|
+
*
|
|
63
|
+
* @since 0.7
|
|
64
|
+
* @stable
|
|
65
|
+
* @example
|
|
66
|
+
* // const runner = createSecurityExprRunner({ slotId: "s#0",
|
|
67
|
+
* // interval: "1W", capacity: 64, parent });
|
|
68
|
+
* const interval = "1W";
|
|
69
|
+
* void interval;
|
|
70
|
+
*/
|
|
71
|
+
export declare function createSecurityExprRunner(args: {
|
|
72
|
+
readonly slotId: string;
|
|
73
|
+
readonly interval: string;
|
|
74
|
+
readonly capacity: number;
|
|
75
|
+
readonly parent: RuntimeContext;
|
|
76
|
+
}): SecurityExprRunner;
|
|
77
|
+
/**
|
|
78
|
+
* Mount one runner per `manifest.securityExpressions` entry and return the
|
|
79
|
+
* `bySlot` / `byInterval` lookup maps. Returns empty maps when the manifest
|
|
80
|
+
* declares no expression callsites (the common single-timeframe case), so the
|
|
81
|
+
* secondary-close drive pays a single empty-map check.
|
|
82
|
+
*
|
|
83
|
+
* @since 0.7
|
|
84
|
+
* @stable
|
|
85
|
+
* @example
|
|
86
|
+
* // const registry = buildSecurityExprRunners(manifest, ctx, 64);
|
|
87
|
+
* const built = "bySlot + byInterval";
|
|
88
|
+
* void built;
|
|
89
|
+
*/
|
|
90
|
+
export declare function buildSecurityExprRunners(manifest: ScriptManifest, parent: RuntimeContext, capacity: number): SecurityExprRegistry;
|
|
91
|
+
/**
|
|
92
|
+
* Drive every runner registered on `interval` for one secondary event. A
|
|
93
|
+
* `"close"` folds the bar into the fold stream and appends one sampled output;
|
|
94
|
+
* a `"tick"` replaces the fold head and the output head without advancing
|
|
95
|
+
* length. Runners whose callback is not yet captured are skipped — the first
|
|
96
|
+
* main compute replays their backlog via {@link captureAndCatchUp}.
|
|
97
|
+
*
|
|
98
|
+
* @since 0.7
|
|
99
|
+
* @stable
|
|
100
|
+
* @example
|
|
101
|
+
* // driveSecurityExpressions(ctx, "1W", "close", weeklyBar);
|
|
102
|
+
* const mode = "close";
|
|
103
|
+
* void mode;
|
|
104
|
+
*/
|
|
105
|
+
export declare function driveSecurityExpressions(parent: RuntimeContext, interval: string, mode: "close" | "tick", bar: Bar): void;
|
|
106
|
+
/**
|
|
107
|
+
* Store the callback the first time main compute provides it, then replay the
|
|
108
|
+
* real secondary stream oldest→newest through the runner's fold stream until
|
|
109
|
+
* `processedHtfCount === secondary.length`. Idempotent once the backlog is
|
|
110
|
+
* drained, so later calls in the same bar are no-ops.
|
|
111
|
+
*
|
|
112
|
+
* @since 0.7
|
|
113
|
+
* @stable
|
|
114
|
+
* @example
|
|
115
|
+
* // captureAndCatchUp(runner, expr, secondaryStream);
|
|
116
|
+
* const replayed = "oldest -> newest";
|
|
117
|
+
* void replayed;
|
|
118
|
+
*/
|
|
119
|
+
export declare function captureAndCatchUp(runner: SecurityExprRunner, expr: SecurityExpr, secondary: StreamState): void;
|
|
120
|
+
/**
|
|
121
|
+
* Materialise a `Float64RingBuffer`'s values oldest→newest. Used as the
|
|
122
|
+
* `htfSeries` source when aligning a runner's output buffer to the main
|
|
123
|
+
* timeline.
|
|
124
|
+
*
|
|
125
|
+
* @since 0.7
|
|
126
|
+
* @stable
|
|
127
|
+
* @example
|
|
128
|
+
* // const values = ascendingValues(runner.output);
|
|
129
|
+
* const order = "oldest -> newest";
|
|
130
|
+
* void order;
|
|
131
|
+
*/
|
|
132
|
+
export declare function ascendingValues(buffer: Float64RingBuffer): ReadonlyArray<number>;
|
|
133
|
+
//# sourceMappingURL=securityExprRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityExprRunner.d.ts","sourceRoot":"","sources":["../../src/request/securityExprRunner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,GAAG,EACH,cAAc,EACd,WAAW,EACX,YAAY,EAEf,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EACH,KAAK,WAAW,EAInB,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC;CAC/E,CAAC;AAoEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACnC,GAAG,kBAAkB,CAYrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GACjB,oBAAoB,CAmBtB;AAqCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,GAAG,MAAM,EACtB,GAAG,EAAE,GAAG,GACT,IAAI,CAUN;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,WAAW,GACvB,IAAI,CAON;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,CAMhF"}
|