@senpi/runtime 3.0.6-dev.skill-manager-v2.20260629194505 → 3.0.9-dev.runtime-phase-2.20260707070820
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/dist/actions/action-events.d.ts +67 -0
- package/dist/actions/action-events.d.ts.map +1 -0
- package/dist/actions/action-events.js +164 -0
- package/dist/actions/action-events.js.map +1 -0
- package/dist/actions/close-position/close-position.action.d.ts +1 -1
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
- package/dist/actions/close-position/close-position.action.js +108 -86
- 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 +40 -28
- package/dist/actions/decision-engine.js.map +1 -1
- package/dist/actions/event-derivation.d.ts +61 -0
- package/dist/actions/event-derivation.d.ts.map +1 -0
- package/dist/actions/event-derivation.js +180 -0
- package/dist/actions/event-derivation.js.map +1 -0
- package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +5 -9
- package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -1
- package/dist/actions/llm-decision/anthropic-llm-decision.js +6 -87
- package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -1
- package/dist/actions/llm-decision/factory.d.ts +0 -6
- package/dist/actions/llm-decision/factory.d.ts.map +1 -1
- package/dist/actions/llm-decision/factory.js +0 -2
- package/dist/actions/llm-decision/factory.js.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.js +26 -7
- package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -1
- package/dist/actions/open-position/open-position.action.d.ts +1 -1
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +282 -224
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +3 -6
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +61 -0
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/cli/senpi-commands.d.ts +14 -0
- package/dist/cli/senpi-commands.d.ts.map +1 -1
- package/dist/cli/senpi-commands.js +390 -2
- package/dist/cli/senpi-commands.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 -3
- package/dist/dsl/engine-client/event-mapping.js.map +1 -1
- package/dist/dsl/events/build-closed-event.d.ts.map +1 -1
- package/dist/dsl/events/build-closed-event.js +0 -1
- package/dist/dsl/events/build-closed-event.js.map +1 -1
- package/dist/dsl/events/handlers.d.ts.map +1 -1
- package/dist/dsl/events/handlers.js +2 -4
- package/dist/dsl/events/handlers.js.map +1 -1
- package/dist/dsl/events/initial-state.d.ts.map +1 -1
- package/dist/dsl/events/initial-state.js +1 -0
- package/dist/dsl/events/initial-state.js.map +1 -1
- package/dist/dsl/monitor/create-monitor.d.ts +3 -0
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
- package/dist/dsl/monitor/create-monitor.js +76 -58
- package/dist/dsl/monitor/create-monitor.js.map +1 -1
- package/dist/dsl/monitor/dsl-failure-events.d.ts +42 -0
- package/dist/dsl/monitor/dsl-failure-events.d.ts.map +1 -0
- package/dist/dsl/monitor/dsl-failure-events.js +73 -0
- package/dist/dsl/monitor/dsl-failure-events.js.map +1 -0
- package/dist/dsl/monitor/process-one-position.d.ts +2 -1
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
- package/dist/dsl/monitor/process-one-position.js +130 -196
- package/dist/dsl/monitor/process-one-position.js.map +1 -1
- package/dist/dsl/plugin/index.d.ts +10 -0
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js +48 -4
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/dsl/plugin/options.d.ts +3 -0
- package/dist/dsl/plugin/options.d.ts.map +1 -1
- package/dist/health/types.d.ts +14 -0
- package/dist/health/types.d.ts.map +1 -1
- package/dist/health/types.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +255 -77
- package/dist/index.js.map +1 -1
- package/dist/risk/risk-audit-log.d.ts +7 -0
- package/dist/risk/risk-audit-log.d.ts.map +1 -1
- package/dist/risk/risk-audit-log.js +48 -1
- package/dist/risk/risk-audit-log.js.map +1 -1
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts +2 -0
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.d.ts.map +1 -1
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js +24 -3
- package/dist/runtime/__tests__/helpers/runtime-gateway-harness.js.map +1 -1
- package/dist/runtime/auto-update/coordinator.js +2 -2
- package/dist/runtime/auto-update/coordinator.js.map +1 -1
- package/dist/runtime/create-actions.d.ts.map +1 -1
- package/dist/runtime/create-actions.js +40 -15
- package/dist/runtime/create-actions.js.map +1 -1
- package/dist/runtime/create-runtime-context.d.ts +1 -1
- package/dist/runtime/create-runtime-context.d.ts.map +1 -1
- package/dist/runtime/create-scanner-module.d.ts +2 -1
- package/dist/runtime/create-scanner-module.d.ts.map +1 -1
- package/dist/runtime/create-scanner-module.js +2 -1
- package/dist/runtime/create-scanner-module.js.map +1 -1
- package/dist/runtime/domain-events.d.ts +43 -0
- package/dist/runtime/domain-events.d.ts.map +1 -0
- package/dist/runtime/domain-events.js +181 -0
- package/dist/runtime/domain-events.js.map +1 -0
- package/dist/runtime/lifecycle-events.d.ts +86 -0
- package/dist/runtime/lifecycle-events.d.ts.map +1 -0
- package/dist/runtime/lifecycle-events.js +200 -0
- package/dist/runtime/lifecycle-events.js.map +1 -0
- package/dist/runtime/notifications.js +2 -2
- package/dist/runtime/notifications.js.map +1 -1
- package/dist/{tracking → runtime}/position-id-registry.d.ts +14 -1
- package/dist/runtime/position-id-registry.d.ts.map +1 -0
- package/dist/{tracking → runtime}/position-id-registry.js +20 -3
- package/dist/runtime/position-id-registry.js.map +1 -0
- package/dist/runtime/run.d.ts +2 -4
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runtime-schema.d.ts +276 -588
- package/dist/runtime/runtime-schema.d.ts.map +1 -1
- package/dist/runtime/runtime-schema.js +8 -28
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +23 -9
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +276 -248
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/strategy-lifecycle.d.ts.map +1 -1
- package/dist/runtime/strategy-lifecycle.js +13 -1
- package/dist/runtime/strategy-lifecycle.js.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.d.ts +3 -0
- package/dist/runtime/supervisor/long-running-supervisor.d.ts.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.js +27 -53
- package/dist/runtime/supervisor/long-running-supervisor.js.map +1 -1
- package/dist/runtime-api/intake/intake-events.d.ts +44 -0
- package/dist/runtime-api/intake/intake-events.d.ts.map +1 -0
- package/dist/runtime-api/intake/intake-events.js +131 -0
- package/dist/runtime-api/intake/intake-events.js.map +1 -0
- package/dist/runtime-api/intake/scanner-launcher.d.ts +2 -0
- package/dist/runtime-api/intake/scanner-launcher.d.ts.map +1 -1
- package/dist/runtime-api/intake/scanner-launcher.js +58 -15
- package/dist/runtime-api/intake/scanner-launcher.js.map +1 -1
- package/dist/runtime-api/intake/scanner-registry.d.ts +3 -0
- package/dist/runtime-api/intake/scanner-registry.d.ts.map +1 -1
- package/dist/runtime-api/intake/scanner-registry.js +3 -0
- package/dist/runtime-api/intake/scanner-registry.js.map +1 -1
- package/dist/runtime-api/intake/supervisor-events.d.ts +61 -0
- package/dist/runtime-api/intake/supervisor-events.d.ts.map +1 -0
- package/dist/runtime-api/intake/supervisor-events.js +173 -0
- package/dist/runtime-api/intake/supervisor-events.js.map +1 -0
- package/dist/runtime-api/routes/signals.d.ts +1 -1
- package/dist/runtime-api/routes/signals.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.js +121 -35
- package/dist/runtime-api/routes/signals.js.map +1 -1
- package/dist/runtime-api/server.d.ts.map +1 -1
- package/dist/runtime-api/server.js +10 -1
- package/dist/runtime-api/server.js.map +1 -1
- package/dist/scanners/engine/data-providers.d.ts +3 -0
- package/dist/scanners/engine/data-providers.d.ts.map +1 -1
- package/dist/scanners/engine/data-providers.js.map +1 -1
- package/dist/scanners/engine/engine.d.ts +18 -0
- package/dist/scanners/engine/engine.d.ts.map +1 -1
- package/dist/scanners/engine/engine.js +96 -2
- package/dist/scanners/engine/engine.js.map +1 -1
- package/dist/scanners/engine/input-resolver.d.ts.map +1 -1
- package/dist/scanners/engine/input-resolver.js +9 -7
- package/dist/scanners/engine/input-resolver.js.map +1 -1
- package/dist/scanners/runtime-module.d.ts +3 -0
- package/dist/scanners/runtime-module.d.ts.map +1 -1
- package/dist/scanners/runtime-module.js +7 -0
- package/dist/scanners/runtime-module.js.map +1 -1
- package/dist/senpi/client.d.ts +10 -0
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +113 -46
- package/dist/senpi/client.js.map +1 -1
- package/dist/skills-manager/bootstrap.d.ts.map +1 -1
- package/dist/skills-manager/bootstrap.js +22 -33
- package/dist/skills-manager/bootstrap.js.map +1 -1
- package/dist/skills-manager/clone-groups.d.ts +20 -0
- package/dist/skills-manager/clone-groups.d.ts.map +1 -0
- package/dist/skills-manager/clone-groups.js +45 -0
- package/dist/skills-manager/clone-groups.js.map +1 -0
- package/dist/skills-manager/coordinator.d.ts.map +1 -1
- package/dist/skills-manager/coordinator.js +111 -75
- package/dist/skills-manager/coordinator.js.map +1 -1
- package/dist/skills-manager/manifest.d.ts +24 -0
- package/dist/skills-manager/manifest.d.ts.map +1 -1
- package/dist/skills-manager/manifest.js +23 -10
- package/dist/skills-manager/manifest.js.map +1 -1
- package/dist/skills-manager/skills-manifest.json +12 -7
- package/dist/skills-manager/types.d.ts +12 -0
- package/dist/skills-manager/types.d.ts.map +1 -1
- package/dist/state/state-events.d.ts +13 -0
- package/dist/state/state-events.d.ts.map +1 -0
- package/dist/state/state-events.js +22 -0
- package/dist/state/state-events.js.map +1 -0
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +14 -1
- package/dist/state/state-manager.js.map +1 -1
- package/dist/telemetry/attributes.d.ts +13 -0
- package/dist/telemetry/attributes.d.ts.map +1 -0
- package/dist/telemetry/attributes.js +22 -0
- package/dist/telemetry/attributes.js.map +1 -0
- package/dist/{tracking → telemetry}/context.d.ts +12 -5
- package/dist/telemetry/context.d.ts.map +1 -0
- package/dist/{tracking → telemetry}/context.js +4 -4
- package/dist/telemetry/context.js.map +1 -0
- package/dist/{recording/records.d.ts → telemetry/event-builders.d.ts} +145 -33
- package/dist/telemetry/event-builders.d.ts.map +1 -0
- package/dist/{recording/wiring/record-builders.js → telemetry/event-builders.js} +94 -40
- package/dist/telemetry/event-builders.js.map +1 -0
- package/dist/telemetry/event-store.d.ts +66 -0
- package/dist/telemetry/event-store.d.ts.map +1 -0
- package/dist/telemetry/event-store.js +202 -0
- package/dist/telemetry/event-store.js.map +1 -0
- package/dist/telemetry/identity.d.ts +72 -0
- package/dist/telemetry/identity.d.ts.map +1 -0
- package/dist/{recording/wiring → telemetry}/identity.js +6 -2
- package/dist/telemetry/identity.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +169 -0
- package/dist/telemetry/metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics.js +437 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry/otel-sdk.d.ts +93 -0
- package/dist/telemetry/otel-sdk.d.ts.map +1 -0
- package/dist/telemetry/otel-sdk.js +297 -0
- package/dist/telemetry/otel-sdk.js.map +1 -0
- package/dist/telemetry/spans/constants.d.ts +12 -0
- package/dist/telemetry/spans/constants.d.ts.map +1 -0
- package/dist/telemetry/spans/constants.js +12 -0
- package/dist/telemetry/spans/constants.js.map +1 -0
- package/dist/telemetry/spans/gen-ai.d.ts +74 -0
- package/dist/telemetry/spans/gen-ai.d.ts.map +1 -0
- package/dist/telemetry/spans/gen-ai.js +339 -0
- package/dist/telemetry/spans/gen-ai.js.map +1 -0
- package/dist/telemetry/spans/index.d.ts +11 -0
- package/dist/telemetry/spans/index.d.ts.map +1 -0
- package/dist/telemetry/spans/index.js +11 -0
- package/dist/telemetry/spans/index.js.map +1 -0
- package/dist/{tracking → telemetry}/spans/redact-pii.d.ts +19 -21
- package/dist/telemetry/spans/redact-pii.d.ts.map +1 -0
- package/dist/{tracking → telemetry}/spans/redact-pii.js +35 -32
- package/dist/telemetry/spans/redact-pii.js.map +1 -0
- package/dist/telemetry/spans/sanitize-payload.d.ts.map +1 -0
- package/dist/telemetry/spans/sanitize-payload.js.map +1 -0
- package/dist/telemetry/spans/span-hooks.d.ts +18 -0
- package/dist/telemetry/spans/span-hooks.d.ts.map +1 -0
- package/dist/telemetry/spans/span-hooks.js +764 -0
- package/dist/telemetry/spans/span-hooks.js.map +1 -0
- package/dist/telemetry/tool-plane.d.ts +31 -0
- package/dist/telemetry/tool-plane.d.ts.map +1 -0
- package/dist/telemetry/tool-plane.js +70 -0
- package/dist/telemetry/tool-plane.js.map +1 -0
- package/dist/telemetry/trace-identity.d.ts +32 -0
- package/dist/telemetry/trace-identity.d.ts.map +1 -0
- package/dist/telemetry/trace-identity.js +62 -0
- package/dist/telemetry/trace-identity.js.map +1 -0
- package/dist/telemetry/tracing.d.ts +33 -0
- package/dist/telemetry/tracing.d.ts.map +1 -0
- package/dist/telemetry/tracing.js +70 -0
- package/dist/telemetry/tracing.js.map +1 -0
- package/dist/types/dsl/index.d.ts +8 -9
- package/dist/types/dsl/index.d.ts.map +1 -1
- package/dist/types/runtime.d.ts +1 -1
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/types/scanner.d.ts +2 -0
- package/dist/types/scanner.d.ts.map +1 -1
- package/dist/utils/event-catalog.d.ts +506 -0
- package/dist/utils/event-catalog.d.ts.map +1 -0
- package/dist/utils/event-catalog.js +142 -0
- package/dist/utils/event-catalog.js.map +1 -0
- package/dist/utils/logger.d.ts +63 -5
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +360 -27
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/wallet-address.d.ts +3 -0
- package/dist/utils/wallet-address.d.ts.map +1 -0
- package/dist/utils/wallet-address.js +17 -0
- package/dist/utils/wallet-address.js.map +1 -0
- package/openclaw.plugin.json +20 -6
- package/package.json +10 -2
- package/dist/actions/tracking-helpers.d.ts +0 -28
- package/dist/actions/tracking-helpers.d.ts.map +0 -1
- package/dist/actions/tracking-helpers.js +0 -93
- package/dist/actions/tracking-helpers.js.map +0 -1
- package/dist/recording/emitter.d.ts +0 -27
- package/dist/recording/emitter.d.ts.map +0 -1
- package/dist/recording/emitter.js +0 -2
- package/dist/recording/emitter.js.map +0 -1
- package/dist/recording/identity.d.ts +0 -34
- package/dist/recording/identity.d.ts.map +0 -1
- package/dist/recording/identity.js +0 -2
- package/dist/recording/identity.js.map +0 -1
- package/dist/recording/index.d.ts +0 -11
- package/dist/recording/index.d.ts.map +0 -1
- package/dist/recording/index.js +0 -2
- package/dist/recording/index.js.map +0 -1
- package/dist/recording/noop-emitter.d.ts +0 -23
- package/dist/recording/noop-emitter.d.ts.map +0 -1
- package/dist/recording/noop-emitter.js +0 -22
- package/dist/recording/noop-emitter.js.map +0 -1
- package/dist/recording/otel/attributes.d.ts +0 -35
- package/dist/recording/otel/attributes.d.ts.map +0 -1
- package/dist/recording/otel/attributes.js +0 -131
- package/dist/recording/otel/attributes.js.map +0 -1
- package/dist/recording/otel/constants.d.ts +0 -123
- package/dist/recording/otel/constants.d.ts.map +0 -1
- package/dist/recording/otel/constants.js +0 -172
- package/dist/recording/otel/constants.js.map +0 -1
- package/dist/recording/otel/ids.d.ts +0 -25
- package/dist/recording/otel/ids.d.ts.map +0 -1
- package/dist/recording/otel/ids.js +0 -37
- package/dist/recording/otel/ids.js.map +0 -1
- package/dist/recording/otel/index.d.ts +0 -13
- package/dist/recording/otel/index.d.ts.map +0 -1
- package/dist/recording/otel/index.js +0 -9
- package/dist/recording/otel/index.js.map +0 -1
- package/dist/recording/otel/mappers.d.ts +0 -100
- package/dist/recording/otel/mappers.d.ts.map +0 -1
- package/dist/recording/otel/mappers.js +0 -683
- package/dist/recording/otel/mappers.js.map +0 -1
- package/dist/recording/otel/otel-emitter.d.ts +0 -43
- package/dist/recording/otel/otel-emitter.d.ts.map +0 -1
- package/dist/recording/otel/otel-emitter.js +0 -99
- package/dist/recording/otel/otel-emitter.js.map +0 -1
- package/dist/recording/otel/redaction.d.ts +0 -47
- package/dist/recording/otel/redaction.d.ts.map +0 -1
- package/dist/recording/otel/redaction.js +0 -88
- package/dist/recording/otel/redaction.js.map +0 -1
- package/dist/recording/records.d.ts.map +0 -1
- package/dist/recording/records.js +0 -14
- package/dist/recording/records.js.map +0 -1
- package/dist/recording/transport/batcher.d.ts +0 -59
- package/dist/recording/transport/batcher.d.ts.map +0 -1
- package/dist/recording/transport/batcher.js +0 -234
- package/dist/recording/transport/batcher.js.map +0 -1
- package/dist/recording/transport/client.d.ts +0 -41
- package/dist/recording/transport/client.d.ts.map +0 -1
- package/dist/recording/transport/client.js +0 -69
- package/dist/recording/transport/client.js.map +0 -1
- package/dist/recording/transport/config.d.ts +0 -53
- package/dist/recording/transport/config.d.ts.map +0 -1
- package/dist/recording/transport/config.js +0 -41
- package/dist/recording/transport/config.js.map +0 -1
- package/dist/recording/transport/index.d.ts +0 -16
- package/dist/recording/transport/index.d.ts.map +0 -1
- package/dist/recording/transport/index.js +0 -12
- package/dist/recording/transport/index.js.map +0 -1
- package/dist/recording/transport/rows.d.ts +0 -88
- package/dist/recording/transport/rows.d.ts.map +0 -1
- package/dist/recording/transport/rows.js +0 -15
- package/dist/recording/transport/rows.js.map +0 -1
- package/dist/recording/wiring/emitter-factory.d.ts +0 -39
- package/dist/recording/wiring/emitter-factory.d.ts.map +0 -1
- package/dist/recording/wiring/emitter-factory.js +0 -62
- package/dist/recording/wiring/emitter-factory.js.map +0 -1
- package/dist/recording/wiring/identity.d.ts +0 -27
- package/dist/recording/wiring/identity.d.ts.map +0 -1
- package/dist/recording/wiring/identity.js.map +0 -1
- package/dist/recording/wiring/index.d.ts +0 -12
- package/dist/recording/wiring/index.d.ts.map +0 -1
- package/dist/recording/wiring/index.js +0 -9
- package/dist/recording/wiring/index.js.map +0 -1
- package/dist/recording/wiring/record-builders.d.ts +0 -107
- package/dist/recording/wiring/record-builders.d.ts.map +0 -1
- package/dist/recording/wiring/record-builders.js.map +0 -1
- package/dist/recording/wiring/subscriber.d.ts +0 -28
- package/dist/recording/wiring/subscriber.d.ts.map +0 -1
- package/dist/recording/wiring/subscriber.js +0 -173
- package/dist/recording/wiring/subscriber.js.map +0 -1
- package/dist/recording/wiring/values.d.ts +0 -19
- package/dist/recording/wiring/values.d.ts.map +0 -1
- package/dist/recording/wiring/values.js +0 -49
- package/dist/recording/wiring/values.js.map +0 -1
- package/dist/tracking/build-rehydrate-items.d.ts +0 -15
- package/dist/tracking/build-rehydrate-items.d.ts.map +0 -1
- package/dist/tracking/build-rehydrate-items.js +0 -19
- package/dist/tracking/build-rehydrate-items.js.map +0 -1
- package/dist/tracking/constants.d.ts +0 -24
- package/dist/tracking/constants.d.ts.map +0 -1
- package/dist/tracking/constants.js +0 -52
- package/dist/tracking/constants.js.map +0 -1
- package/dist/tracking/context.d.ts.map +0 -1
- package/dist/tracking/context.js.map +0 -1
- package/dist/tracking/index.d.ts +0 -16
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -11
- package/dist/tracking/index.js.map +0 -1
- package/dist/tracking/plugin-event-tracker.d.ts +0 -13
- package/dist/tracking/plugin-event-tracker.d.ts.map +0 -1
- package/dist/tracking/plugin-event-tracker.js +0 -27
- package/dist/tracking/plugin-event-tracker.js.map +0 -1
- package/dist/tracking/position-id-registry.d.ts.map +0 -1
- package/dist/tracking/position-id-registry.js.map +0 -1
- package/dist/tracking/spans/constants.d.ts +0 -19
- package/dist/tracking/spans/constants.d.ts.map +0 -1
- package/dist/tracking/spans/constants.js +0 -31
- package/dist/tracking/spans/constants.js.map +0 -1
- package/dist/tracking/spans/fan-out-span-transport.d.ts +0 -22
- package/dist/tracking/spans/fan-out-span-transport.d.ts.map +0 -1
- package/dist/tracking/spans/fan-out-span-transport.js +0 -49
- package/dist/tracking/spans/fan-out-span-transport.js.map +0 -1
- package/dist/tracking/spans/index.d.ts +0 -13
- package/dist/tracking/spans/index.d.ts.map +0 -1
- package/dist/tracking/spans/index.js +0 -16
- package/dist/tracking/spans/index.js.map +0 -1
- package/dist/tracking/spans/otel/fit-row-budget.d.ts +0 -22
- package/dist/tracking/spans/otel/fit-row-budget.d.ts.map +0 -1
- package/dist/tracking/spans/otel/fit-row-budget.js +0 -91
- package/dist/tracking/spans/otel/fit-row-budget.js.map +0 -1
- package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts +0 -16
- package/dist/tracking/spans/otel/map-span-to-trace-row.d.ts.map +0 -1
- package/dist/tracking/spans/otel/map-span-to-trace-row.js +0 -227
- package/dist/tracking/spans/otel/map-span-to-trace-row.js.map +0 -1
- package/dist/tracking/spans/otel/recording-span-transport.d.ts +0 -43
- package/dist/tracking/spans/otel/recording-span-transport.d.ts.map +0 -1
- package/dist/tracking/spans/otel/recording-span-transport.js +0 -67
- package/dist/tracking/spans/otel/recording-span-transport.js.map +0 -1
- package/dist/tracking/spans/otel/span-ids.d.ts +0 -22
- package/dist/tracking/spans/otel/span-ids.d.ts.map +0 -1
- package/dist/tracking/spans/otel/span-ids.js +0 -32
- package/dist/tracking/spans/otel/span-ids.js.map +0 -1
- package/dist/tracking/spans/plugin-span-tracker.d.ts +0 -9
- package/dist/tracking/spans/plugin-span-tracker.d.ts.map +0 -1
- package/dist/tracking/spans/plugin-span-tracker.js +0 -115
- package/dist/tracking/spans/plugin-span-tracker.js.map +0 -1
- package/dist/tracking/spans/redact-pii.d.ts.map +0 -1
- package/dist/tracking/spans/redact-pii.js.map +0 -1
- package/dist/tracking/spans/sanitize-payload.d.ts.map +0 -1
- package/dist/tracking/spans/sanitize-payload.js.map +0 -1
- package/dist/tracking/spans/span-hooks.d.ts +0 -28
- package/dist/tracking/spans/span-hooks.d.ts.map +0 -1
- package/dist/tracking/spans/span-hooks.js +0 -409
- package/dist/tracking/spans/span-hooks.js.map +0 -1
- package/dist/tracking/spans/span-tracker.d.ts +0 -133
- package/dist/tracking/spans/span-tracker.d.ts.map +0 -1
- package/dist/tracking/spans/span-tracker.js +0 -721
- package/dist/tracking/spans/span-tracker.js.map +0 -1
- package/dist/tracking/spans/span-transport.d.ts +0 -71
- package/dist/tracking/spans/span-transport.d.ts.map +0 -1
- package/dist/tracking/spans/span-transport.js +0 -240
- package/dist/tracking/spans/span-transport.js.map +0 -1
- package/dist/tracking/spans/types.d.ts +0 -101
- package/dist/tracking/spans/types.d.ts.map +0 -1
- package/dist/tracking/spans/types.js +0 -6
- package/dist/tracking/spans/types.js.map +0 -1
- package/dist/tracking/tracker.d.ts +0 -30
- package/dist/tracking/tracker.d.ts.map +0 -1
- package/dist/tracking/tracker.js +0 -66
- package/dist/tracking/tracker.js.map +0 -1
- package/dist/tracking/tracking-handler.d.ts +0 -12
- package/dist/tracking/tracking-handler.d.ts.map +0 -1
- package/dist/tracking/tracking-handler.js +0 -148
- package/dist/tracking/tracking-handler.js.map +0 -1
- package/dist/tracking/transport.d.ts +0 -35
- package/dist/tracking/transport.d.ts.map +0 -1
- package/dist/tracking/transport.js +0 -133
- package/dist/tracking/transport.js.map +0 -1
- package/dist/tracking/types.d.ts +0 -21
- package/dist/tracking/types.d.ts.map +0 -1
- package/dist/tracking/types.js +0 -6
- package/dist/tracking/types.js.map +0 -1
- /package/dist/{tracking → telemetry}/spans/sanitize-payload.d.ts +0 -0
- /package/dist/{tracking → telemetry}/spans/sanitize-payload.js +0 -0
|
@@ -1,683 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The mapper: `RecordingRecord → TraceRow[] | LogRow[]`. Pure functions given their deps (identity,
|
|
3
|
-
* an injected {@link IdGenerator}, scope) — that is what makes the golden `record → row` tests
|
|
4
|
-
* deterministic. No `@opentelemetry/*`: this builds wire rows, it is not a span SDK.
|
|
5
|
-
*
|
|
6
|
-
* Per-record key maps and the trace-vs-log routing are pinned in {@link ./constants} and appended
|
|
7
|
-
* to the Task 2 brief. Order within a row: redact (typed-field) → flatten → cap.
|
|
8
|
-
*/
|
|
9
|
-
import { AttrBuilder, durationNs, msToNs } from "./attributes.js";
|
|
10
|
-
import { EXCEPTION_EVENT_NAME, eventNameFor, ROUTING, severityFor, SPAN_NAME, TRACE_FLAGS_SAMPLED, } from "./constants.js";
|
|
11
|
-
import { deterministicSpanId, deterministicTraceId } from "./ids.js";
|
|
12
|
-
import { redactBody, redactRuntimeError, redactRuntimeState, redactSignalEvaluated, } from "./redaction.js";
|
|
13
|
-
import { createLogger } from "../../utils/logger.js";
|
|
14
|
-
const logger = createLogger("[recording][otel][mapper]");
|
|
15
|
-
/**
|
|
16
|
-
* Identity → `ResourceAttributes` (server-required `service.name` included) + the derived `address`.
|
|
17
|
-
* Built once per emitter and shared (frozen) across every row it produces. `address` is derived from
|
|
18
|
-
* `identity.strategyAddress` directly — not read back from the attribute map — so a future attr-budget
|
|
19
|
-
* edge can never silently empty the ownership/keying field.
|
|
20
|
-
*/
|
|
21
|
-
export function buildResource(identity) {
|
|
22
|
-
const resourceAttributes = new AttrBuilder()
|
|
23
|
-
.put("service.name", identity.service)
|
|
24
|
-
.put("strategy.address", identity.strategyAddress)
|
|
25
|
-
.put("recipe", identity.recipe)
|
|
26
|
-
.put("recipe.version", identity.recipeVersion)
|
|
27
|
-
.put("runtime", identity.runtime)
|
|
28
|
-
.put("boot.id", identity.bootId)
|
|
29
|
-
.put("config.hash", identity.configHash)
|
|
30
|
-
.build();
|
|
31
|
-
// Frozen: the single resource object is shared by reference across all of an emitter's rows, so
|
|
32
|
-
// any accidental mutation would corrupt every row at once.
|
|
33
|
-
Object.freeze(resourceAttributes);
|
|
34
|
-
return Object.freeze({
|
|
35
|
-
resourceAttributes,
|
|
36
|
-
address: (identity.strategyAddress ?? "").toLowerCase(),
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
function spanKindFor(type) {
|
|
40
|
-
const route = ROUTING[type];
|
|
41
|
-
return route.kind === "trace" ? route.spanKind : "Internal";
|
|
42
|
-
}
|
|
43
|
-
function makeTraceRow(deps, f) {
|
|
44
|
-
return {
|
|
45
|
-
Timestamp: msToNs(f.timestampMs),
|
|
46
|
-
TraceId: f.traceId,
|
|
47
|
-
SpanId: f.spanId,
|
|
48
|
-
ParentSpanId: f.parentSpanId ?? "",
|
|
49
|
-
TraceState: "",
|
|
50
|
-
SpanName: f.spanName,
|
|
51
|
-
SpanKind: f.spanKind,
|
|
52
|
-
ServiceName: deps.identity.service,
|
|
53
|
-
Duration: durationNs(f.startedAt, f.endedAt),
|
|
54
|
-
StatusCode: f.statusCode,
|
|
55
|
-
StatusMessage: f.statusMessage ?? "",
|
|
56
|
-
SpanAttributes: f.attrs,
|
|
57
|
-
ResourceAttributes: deps.resource.resourceAttributes,
|
|
58
|
-
Events: f.events ?? [],
|
|
59
|
-
ScopeName: deps.scopeName,
|
|
60
|
-
ScopeVersion: deps.scopeVersion,
|
|
61
|
-
TraceFlags: TRACE_FLAGS_SAMPLED,
|
|
62
|
-
address: deps.resource.address,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Build the single log row for a record: severity/event-name are derived from the record and the
|
|
67
|
-
* caller supplies the timestamp (`occurredAt` for the point-in-time records, `endedAt` for the
|
|
68
|
-
* skipped scanner run), so each log mapper only adds its `Body` and flattened attrs. Each log gets
|
|
69
|
-
* fresh, self-rooted ids (minimal per-record correlation; cross-record threading is deferred).
|
|
70
|
-
*/
|
|
71
|
-
function logRowFor(deps, record, timestampMs, body, attrs) {
|
|
72
|
-
const severity = severityFor(record);
|
|
73
|
-
return {
|
|
74
|
-
Timestamp: msToNs(timestampMs),
|
|
75
|
-
TraceId: deps.ids.traceId(),
|
|
76
|
-
SpanId: deps.ids.spanId(),
|
|
77
|
-
TraceFlags: TRACE_FLAGS_SAMPLED,
|
|
78
|
-
SeverityText: severity.text,
|
|
79
|
-
SeverityNumber: severity.number,
|
|
80
|
-
ServiceName: deps.identity.service,
|
|
81
|
-
Body: body,
|
|
82
|
-
ResourceAttributes: deps.resource.resourceAttributes,
|
|
83
|
-
ScopeName: deps.scopeName,
|
|
84
|
-
ScopeVersion: deps.scopeVersion,
|
|
85
|
-
LogAttributes: attrs,
|
|
86
|
-
EventName: eventNameFor(record),
|
|
87
|
-
address: deps.resource.address,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Clamp a child window into its parent: never negative, never outside `[lo, hi]`; a window
|
|
92
|
-
* entirely before the parent pins to its start.
|
|
93
|
-
*/
|
|
94
|
-
function clampWindow(start, end, lo, hi) {
|
|
95
|
-
if (start < lo)
|
|
96
|
-
start = lo;
|
|
97
|
-
if (end > hi)
|
|
98
|
-
end = hi;
|
|
99
|
-
if (end < lo)
|
|
100
|
-
end = lo; // window entirely before the parent → pin to its start
|
|
101
|
-
if (end < start)
|
|
102
|
-
start = end;
|
|
103
|
-
return { start, end };
|
|
104
|
-
}
|
|
105
|
-
/** OTEL `exception` span event — the idiomatic home for the error-grouping key on a span. */
|
|
106
|
-
function exceptionEvent(timestampMs, errorName, message) {
|
|
107
|
-
const attrs = new AttrBuilder()
|
|
108
|
-
.put("exception.type", errorName)
|
|
109
|
-
.put("exception.message", message)
|
|
110
|
-
.build();
|
|
111
|
-
return { Timestamp: msToNs(timestampMs), Name: EXCEPTION_EVENT_NAME, Attributes: attrs };
|
|
112
|
-
}
|
|
113
|
-
// ── scanner_run → one span (complete/error) or one skip log ───────────────────
|
|
114
|
-
/** Shared `scanner.*` attrs — identical keys whether the run routes to a span or to a skip log. */
|
|
115
|
-
function scannerRunAttrs(record) {
|
|
116
|
-
// Individual `signals[]` are omitted here — counts + summary capture the run's shape, and
|
|
117
|
-
// per-signal detail lives on `signal_evaluated` children (avoids re-flattening signal meta).
|
|
118
|
-
return new AttrBuilder()
|
|
119
|
-
.put("scanner.id", record.scannerId)
|
|
120
|
-
.put("scan.run_id", record.runId)
|
|
121
|
-
.put("scanner.outcome", record.outcome)
|
|
122
|
-
.put("scanner.status_detail", record.statusDetail)
|
|
123
|
-
.put("scanner.scanned_count", record.scannedCount)
|
|
124
|
-
.put("scanner.actionable_count", record.actionableCount)
|
|
125
|
-
.put("scanner.signal_count", record.signalCount)
|
|
126
|
-
.put("scanner.reason", record.reason)
|
|
127
|
-
.put("scanner.error", record.error)
|
|
128
|
-
.put("scanner.error_name", record.errorName)
|
|
129
|
-
.putBag("scanner.summary", record.summary)
|
|
130
|
-
.build();
|
|
131
|
-
}
|
|
132
|
-
/** A run that actually ran (`complete`/`error`) → one span. Skips go to {@link mapScannerRunSkipped}. */
|
|
133
|
-
export function mapScannerRun(record, deps) {
|
|
134
|
-
const attrs = scannerRunAttrs(record);
|
|
135
|
-
const isError = record.outcome === "error";
|
|
136
|
-
// Deterministic ids from the run id thread scan → pass into one trace; absent (older payloads)
|
|
137
|
-
// → fresh self-rooted ids as before.
|
|
138
|
-
return [
|
|
139
|
-
makeTraceRow(deps, {
|
|
140
|
-
timestampMs: record.startedAt,
|
|
141
|
-
traceId: record.runId !== undefined ? deterministicTraceId(record.runId) : deps.ids.traceId(),
|
|
142
|
-
spanId: record.runId !== undefined ? deterministicSpanId(record.runId) : deps.ids.spanId(),
|
|
143
|
-
spanName: SPAN_NAME.scannerRun,
|
|
144
|
-
spanKind: spanKindFor("scanner_run"),
|
|
145
|
-
startedAt: record.startedAt,
|
|
146
|
-
endedAt: record.endedAt,
|
|
147
|
-
statusCode: isError ? "Error" : "Ok",
|
|
148
|
-
statusMessage: isError ? (record.error ?? "") : "",
|
|
149
|
-
attrs,
|
|
150
|
-
events: isError ? [exceptionEvent(record.endedAt, record.errorName, record.error)] : [],
|
|
151
|
-
}),
|
|
152
|
-
];
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* The {@link ROUTING} exception: a skipped run (`outcome === "skipped"` — engine statuses
|
|
156
|
-
* skipped/disabled/halted) is a discrete "didn't run" fact, not work, so it becomes an INFO log
|
|
157
|
-
* (`scanner_run.skipped`) instead of a zero-duration span. Same `scanner.*` attrs as the span
|
|
158
|
-
* (counts are simply absent on skip payloads); `Timestamp` from `endedAt` (the builder synthesizes
|
|
159
|
-
* `startedAt = endedAt` for skips — only the end is observed).
|
|
160
|
-
*/
|
|
161
|
-
export function mapScannerRunSkipped(record, deps) {
|
|
162
|
-
const reason = record.reason ? `: ${record.reason}` : "";
|
|
163
|
-
const body = `scanner skipped ${record.scannerId}${reason}`;
|
|
164
|
-
return [logRowFor(deps, record, record.endedAt, body, scannerRunAttrs(record))];
|
|
165
|
-
}
|
|
166
|
-
// ── signal_evaluated → pass-span root + llm.decision child + one child span per evaluation ──
|
|
167
|
-
export function mapSignalEvaluated(record, deps) {
|
|
168
|
-
const red = redactSignalEvaluated(record);
|
|
169
|
-
// Deterministic ids from the scan run id thread the pass under its scanner.run span (same
|
|
170
|
-
// TraceId, ParentSpanId = the scanner.run SpanId); absent runId → fresh self-rooted ids as
|
|
171
|
-
// before. Intentional: the pass child starts after its parent ends (queue wait, visible as the
|
|
172
|
-
// gap) — never "fixed" by faking timestamps.
|
|
173
|
-
const traceId = red.runId !== undefined ? deterministicTraceId(red.runId) : deps.ids.traceId();
|
|
174
|
-
const rootSpanId = deps.ids.spanId();
|
|
175
|
-
const parentSpanId = red.runId !== undefined ? deterministicSpanId(red.runId) : undefined;
|
|
176
|
-
const errored = red.evaluations.filter((ev) => ev.outcome.result === "error");
|
|
177
|
-
const rootAttrs = new AttrBuilder()
|
|
178
|
-
.put("scanner.id", red.scannerId)
|
|
179
|
-
.put("scan.run_id", red.runId)
|
|
180
|
-
.put("signal.evaluation_count", red.evaluations.length)
|
|
181
|
-
.put("signal.error_count", errored.length);
|
|
182
|
-
const rows = [
|
|
183
|
-
makeTraceRow(deps, {
|
|
184
|
-
timestampMs: red.startedAt,
|
|
185
|
-
traceId,
|
|
186
|
-
spanId: rootSpanId,
|
|
187
|
-
parentSpanId,
|
|
188
|
-
spanName: SPAN_NAME.signalPass,
|
|
189
|
-
spanKind: spanKindFor("signal_evaluated"),
|
|
190
|
-
startedAt: red.startedAt,
|
|
191
|
-
endedAt: red.endedAt,
|
|
192
|
-
// Status propagates: any errored evaluation child fails the pass root (filterable even
|
|
193
|
-
// when the trace root is the always-Ok scanner.run span).
|
|
194
|
-
statusCode: errored.length > 0 ? "Error" : "Ok",
|
|
195
|
-
statusMessage: errored.length > 0 ? (errored[0].outcome.error ?? "") : "",
|
|
196
|
-
attrs: rootAttrs.build(),
|
|
197
|
-
}),
|
|
198
|
-
];
|
|
199
|
-
// The decision phase as its own child span (carries the decision.* attrs). Mapped defensively,
|
|
200
|
-
// like the evaluation children: a bad decision must not sink the pass span or its siblings.
|
|
201
|
-
if (red.decision) {
|
|
202
|
-
try {
|
|
203
|
-
rows.push(mapLlmDecisionChild(red.decision, deps, traceId, rootSpanId, red.startedAt, red.endedAt));
|
|
204
|
-
}
|
|
205
|
-
catch (err) {
|
|
206
|
-
logger.warn("dropping llm.decision child (mapping error)", {
|
|
207
|
-
err: err instanceof Error ? err.message : String(err),
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
// One child span per evaluation, sharing the root's TraceId (intra-record parenting). Each child
|
|
212
|
-
// is mapped defensively: a single bad evaluation must not sink the pass span or its siblings.
|
|
213
|
-
for (const ev of red.evaluations) {
|
|
214
|
-
try {
|
|
215
|
-
rows.push(mapEvaluationChild(ev, deps, traceId, rootSpanId, red.startedAt, red.endedAt));
|
|
216
|
-
}
|
|
217
|
-
catch (err) {
|
|
218
|
-
logger.warn("dropping signal evaluation child (mapping error)", {
|
|
219
|
-
err: err instanceof Error ? err.message : String(err),
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return rows;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* The `llm.decision` child span: the pass's decision phase, window
|
|
227
|
-
* `[decision.endedAt − durationMs, decision.endedAt]` — the gap after the pass start is context
|
|
228
|
-
* building, deliberately visible. Defensive fallback when `endedAt` is absent (older payloads):
|
|
229
|
-
* start at the pass start. The window is then clamped into the pass (`start` up to the pass start,
|
|
230
|
-
* `end` down to the pass end, and `start = end` when that inverts) so it is never negative and
|
|
231
|
-
* never outside the pass.
|
|
232
|
-
*/
|
|
233
|
-
function mapLlmDecisionChild(d, deps, traceId, parentSpanId, passStartedAt, passEndedAt) {
|
|
234
|
-
const attrs = new AttrBuilder()
|
|
235
|
-
.put("decision.execute", d.execute)
|
|
236
|
-
.put("decision.action_type", d.actionType)
|
|
237
|
-
.put("decision.action_name", d.actionName)
|
|
238
|
-
.put("decision.mode", d.mode)
|
|
239
|
-
.put("decision.confidence", d.confidence)
|
|
240
|
-
.put("decision.confidence_threshold", d.confidenceThreshold)
|
|
241
|
-
.put("decision.reasoning", d.reasoning) // kept (length-capped) — high-value agent rationale
|
|
242
|
-
.put("decision.model", d.model)
|
|
243
|
-
.put("decision.tokens_used", d.tokensUsed)
|
|
244
|
-
.put("decision.duration_ms", d.durationMs)
|
|
245
|
-
// The record no longer carries the raw LLM payload (dropped when the pass was single-sourced
|
|
246
|
-
// from `_decisionMeta`); its bounded content lands on the per-signal child spans.
|
|
247
|
-
.build();
|
|
248
|
-
const durationMs = d.durationMs ?? 0;
|
|
249
|
-
const rawEnd = d.endedAt ?? passStartedAt + durationMs;
|
|
250
|
-
const { start, end } = clampWindow(rawEnd - durationMs, rawEnd, passStartedAt, passEndedAt);
|
|
251
|
-
return makeTraceRow(deps, {
|
|
252
|
-
timestampMs: start,
|
|
253
|
-
traceId,
|
|
254
|
-
spanId: deps.ids.spanId(),
|
|
255
|
-
parentSpanId,
|
|
256
|
-
spanName: SPAN_NAME.llmDecision,
|
|
257
|
-
spanKind: "Internal",
|
|
258
|
-
startedAt: start,
|
|
259
|
-
endedAt: end,
|
|
260
|
-
statusCode: "Ok",
|
|
261
|
-
attrs,
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
function mapEvaluationChild(ev, deps, traceId, parentSpanId,
|
|
265
|
-
// The action loop stamps a real per-signal window (`startedAt`/`endedAt`) on each result entry;
|
|
266
|
-
// when present it is the child's measured extent, clamped into the pass like the llm.decision
|
|
267
|
-
// child. Absent (older payloads) → point-in-time at the pass start, Duration 0, as before.
|
|
268
|
-
passStartedAt, passEndedAt) {
|
|
269
|
-
const { signal, outcome } = ev;
|
|
270
|
-
// position.id is the flat cross-record group-by key (V2 read layer); TraceId stays
|
|
271
|
-
// per-pass — never derived from positionId.
|
|
272
|
-
const attrs = new AttrBuilder()
|
|
273
|
-
.put("position.id", outcome.positionId)
|
|
274
|
-
.put("signal.type", signal.signalType)
|
|
275
|
-
.put("signal.asset", signal.asset)
|
|
276
|
-
.put("signal.direction", signal.direction)
|
|
277
|
-
.put("signal.score", signal.score)
|
|
278
|
-
.put("signal.timestamp", signal.timestamp)
|
|
279
|
-
.putFactors("signal.factor", signal.factors)
|
|
280
|
-
// signal.meta is dropped by redaction upstream.
|
|
281
|
-
.put("outcome.result", outcome.result)
|
|
282
|
-
.put("outcome.summary", outcome.summary)
|
|
283
|
-
.put("outcome.reason_code", outcome.reasonCode)
|
|
284
|
-
.put("outcome.reason", outcome.reason)
|
|
285
|
-
.put("outcome.error", outcome.error)
|
|
286
|
-
.put("outcome.error_name", outcome.errorName)
|
|
287
|
-
.put("outcome.leverage", outcome.leverage)
|
|
288
|
-
.put("outcome.margin_amount", outcome.marginAmount)
|
|
289
|
-
.put("outcome.notional_value", outcome.notionalValue)
|
|
290
|
-
.put("outcome.order_id", outcome.orderId)
|
|
291
|
-
.put("outcome.entry_price", outcome.entryPrice)
|
|
292
|
-
.put("outcome.size", outcome.size)
|
|
293
|
-
.put("outcome.filled", outcome.filled)
|
|
294
|
-
.put("outcome.execution_as_maker", outcome.executionAsMaker)
|
|
295
|
-
.put("outcome.required_margin_amount", outcome.requiredMarginAmount)
|
|
296
|
-
.put("outcome.available_margin_amount", outcome.availableMarginAmount)
|
|
297
|
-
.build();
|
|
298
|
-
const hasWindow = ev.startedAt !== undefined && ev.endedAt !== undefined;
|
|
299
|
-
const { start, end } = clampWindow(hasWindow ? ev.startedAt : passStartedAt, hasWindow ? ev.endedAt : passStartedAt, passStartedAt, passEndedAt);
|
|
300
|
-
const isError = outcome.result === "error";
|
|
301
|
-
return makeTraceRow(deps, {
|
|
302
|
-
timestampMs: start,
|
|
303
|
-
traceId,
|
|
304
|
-
spanId: deps.ids.spanId(),
|
|
305
|
-
parentSpanId,
|
|
306
|
-
spanName: SPAN_NAME.signalEvaluation,
|
|
307
|
-
spanKind: spanKindFor("signal_evaluated"),
|
|
308
|
-
startedAt: start,
|
|
309
|
-
endedAt: end,
|
|
310
|
-
statusCode: isError ? "Error" : "Ok",
|
|
311
|
-
statusMessage: isError ? (outcome.error ?? "") : "",
|
|
312
|
-
attrs,
|
|
313
|
-
events: isError ? [exceptionEvent(end, outcome.errorName, outcome.error)] : [],
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
// ── position_lifecycle → one log ─────────────────────────────────────────────────
|
|
317
|
-
export function mapPositionLifecycle(record, deps) {
|
|
318
|
-
// No bag/PII to scrub here: `reasoning` is kept (length-capped) as high-value agent rationale.
|
|
319
|
-
const attrs = new AttrBuilder()
|
|
320
|
-
.put("position.id", record.positionId)
|
|
321
|
-
.put("position.event", record.event)
|
|
322
|
-
.put("position.asset", record.asset)
|
|
323
|
-
.put("position.dex", record.dex)
|
|
324
|
-
.put("position.direction", record.direction)
|
|
325
|
-
.put("position.entry_price", record.entryPrice)
|
|
326
|
-
.put("position.size", record.size)
|
|
327
|
-
.put("position.leverage", record.leverage)
|
|
328
|
-
.put("position.leverage_type", record.leverageType)
|
|
329
|
-
.put("position.margin", record.margin)
|
|
330
|
-
.put("position.unrealized_pnl", record.unrealizedPnl)
|
|
331
|
-
.put("position.roe", record.roe)
|
|
332
|
-
.put("position.liquidation_price", record.liquidationPrice)
|
|
333
|
-
.put("position.reason", record.reason)
|
|
334
|
-
.put("position.close_reason", record.closeReason)
|
|
335
|
-
.put("position.closed_price", record.closedPrice)
|
|
336
|
-
.put("position.closed_size", record.closedSize)
|
|
337
|
-
.put("position.execution_as_maker", record.executionAsMaker)
|
|
338
|
-
.put("position.previous_entry_price", record.previousEntryPrice)
|
|
339
|
-
.put("position.previous_size", record.previousSize)
|
|
340
|
-
.put("position.size_delta", record.sizeDelta)
|
|
341
|
-
.put("position.new_asset", record.newAsset)
|
|
342
|
-
.put("position.order_id", record.orderId)
|
|
343
|
-
.put("position.order_type", record.orderType)
|
|
344
|
-
.put("position.margin_amount", record.marginAmount)
|
|
345
|
-
.put("position.filled", record.filled)
|
|
346
|
-
.put("position.reasoning", record.reasoning) // kept (length-capped)
|
|
347
|
-
.put("position.reconciliation_source", record.reconciliationSource) // opened only; absent elsewhere
|
|
348
|
-
.build();
|
|
349
|
-
const dir = record.direction ? ` ${record.direction}` : "";
|
|
350
|
-
return [logRowFor(deps, record, record.occurredAt, `position ${record.event} ${record.asset}${dir}`, attrs)];
|
|
351
|
-
}
|
|
352
|
-
// ── dsl_transition → one log ─────────────────────────────────────────────────────
|
|
353
|
-
export function mapDslTransition(record, deps) {
|
|
354
|
-
const attrs = new AttrBuilder()
|
|
355
|
-
.put("position.id", record.positionId)
|
|
356
|
-
.put("dsl.transition", record.transition)
|
|
357
|
-
.put("dsl.asset", record.asset)
|
|
358
|
-
.put("dsl.dex", record.dex)
|
|
359
|
-
.put("dsl.trigger_reason", record.triggerReason)
|
|
360
|
-
.put("dsl.preset", record.preset)
|
|
361
|
-
.putJson("dsl.tiers", record.tiers)
|
|
362
|
-
.put("dsl.direction", record.direction)
|
|
363
|
-
.put("dsl.entry_price", record.entryPrice)
|
|
364
|
-
.put("dsl.leverage", record.leverage)
|
|
365
|
-
.put("dsl.margin", record.margin)
|
|
366
|
-
.put("dsl.size", record.size)
|
|
367
|
-
.put("dsl.floor_price", record.floorPrice)
|
|
368
|
-
.put("dsl.new_floor_price", record.newFloorPrice)
|
|
369
|
-
.put("dsl.phase", record.phase)
|
|
370
|
-
.put("dsl.tier_index", record.tierIndex)
|
|
371
|
-
.put("dsl.lock_hw_pct", record.lockHwPct)
|
|
372
|
-
.put("dsl.trigger_pct", record.triggerPct)
|
|
373
|
-
.put("dsl.locked_profit_pct", record.lockedProfitPct)
|
|
374
|
-
.put("dsl.new_sl_price", record.newSLPrice)
|
|
375
|
-
.put("dsl.sl_order_id", record.slOrderId)
|
|
376
|
-
.put("dsl.reason", record.reason)
|
|
377
|
-
.put("dsl.close_reason", record.closeReason)
|
|
378
|
-
.put("dsl.created_at", record.createdAt)
|
|
379
|
-
.put("dsl.current_roe", record.currentROE)
|
|
380
|
-
.put("dsl.high_water_roe", record.highWaterRoe)
|
|
381
|
-
.put("dsl.high_water_price", record.highWaterPrice)
|
|
382
|
-
.put("dsl.peak_roe", record.peakROE)
|
|
383
|
-
.put("dsl.last_price", record.lastPrice)
|
|
384
|
-
.put("dsl.attempt", record.attempt)
|
|
385
|
-
.putJson("dsl.updated", record.updated)
|
|
386
|
-
.put("dsl.backend_dsl_position_id", record.backendDslPositionId)
|
|
387
|
-
.build();
|
|
388
|
-
return [logRowFor(deps, record, record.occurredAt, `dsl ${record.transition} ${record.asset}`, attrs)];
|
|
389
|
-
}
|
|
390
|
-
// ── dsl_tick → one span per work unit (deterministic-id threaded tick family) ─────
|
|
391
|
-
/**
|
|
392
|
-
* Maps one DSL-tick work unit to its span. No buffering or pairing: each record maps
|
|
393
|
-
* independently, and the deterministic ids derived from `bootId:tickId` (and
|
|
394
|
-
* `bootId:tickId:positionKey`) thread the units into one trace — root `dsl.tick`, `dsl.position`
|
|
395
|
-
* children, and `dsl.close_attempt`/`dsl.sl_update` under their position. `tick.id` rides every
|
|
396
|
-
* span (the cross-store join key); `position.id` rides the position-grain spans. A child unit
|
|
397
|
-
* missing its `positionKey` (defensive) parents to the tick root so the row still joins the trace.
|
|
398
|
-
*/
|
|
399
|
-
export function mapDslTick(record, deps) {
|
|
400
|
-
// The seeds are scoped by the emitter's bootId: tickId is a ms-resolution wall-clock string, so
|
|
401
|
-
// two runtimes ticking in the same millisecond (or a restart re-deriving the same ms) would
|
|
402
|
-
// otherwise collide and merge unrelated tick families into one trace with duplicate span ids.
|
|
403
|
-
// The `tick.id` ATTRIBUTE stays the raw tickId — it is the join key to the monitor's logs.
|
|
404
|
-
const tickSeed = `${deps.identity.bootId}:${record.tickId}`;
|
|
405
|
-
const traceId = deterministicTraceId(tickSeed);
|
|
406
|
-
const rootSpanId = deterministicSpanId(tickSeed);
|
|
407
|
-
if (record.unit === "tick") {
|
|
408
|
-
const attrs = new AttrBuilder()
|
|
409
|
-
.put("tick.id", record.tickId)
|
|
410
|
-
.put("dsl.strategy_count", record.strategyCount)
|
|
411
|
-
.put("dsl.active_position_count", record.activePositionCount)
|
|
412
|
-
.put("dsl.positions_processed", record.positionsProcessed)
|
|
413
|
-
.build();
|
|
414
|
-
const rows = [
|
|
415
|
-
makeTraceRow(deps, {
|
|
416
|
-
timestampMs: record.startedAt,
|
|
417
|
-
traceId,
|
|
418
|
-
spanId: rootSpanId,
|
|
419
|
-
spanName: SPAN_NAME.dslTick,
|
|
420
|
-
spanKind: spanKindFor("dsl_tick"),
|
|
421
|
-
startedAt: record.startedAt,
|
|
422
|
-
endedAt: record.endedAt,
|
|
423
|
-
statusCode: "Ok",
|
|
424
|
-
attrs,
|
|
425
|
-
}),
|
|
426
|
-
];
|
|
427
|
-
// The batched price fetch as an intra-record child of the tick root — only when both stamps
|
|
428
|
-
// were observed (a half window is fabricated extent), clamped into the tick window like the
|
|
429
|
-
// other intra-record children.
|
|
430
|
-
if (record.pricesStartedAt !== undefined && record.pricesEndedAt !== undefined) {
|
|
431
|
-
const { start, end } = clampWindow(record.pricesStartedAt, record.pricesEndedAt, record.startedAt, record.endedAt);
|
|
432
|
-
rows.push(makeTraceRow(deps, {
|
|
433
|
-
timestampMs: start,
|
|
434
|
-
traceId,
|
|
435
|
-
spanId: deps.ids.spanId(),
|
|
436
|
-
parentSpanId: rootSpanId,
|
|
437
|
-
spanName: SPAN_NAME.dslPrices,
|
|
438
|
-
spanKind: spanKindFor("dsl_tick"),
|
|
439
|
-
startedAt: start,
|
|
440
|
-
endedAt: end,
|
|
441
|
-
statusCode: "Ok",
|
|
442
|
-
attrs: new AttrBuilder().put("tick.id", record.tickId).build(),
|
|
443
|
-
}));
|
|
444
|
-
}
|
|
445
|
-
return rows;
|
|
446
|
-
}
|
|
447
|
-
// The per-position span id is seeded from `bootId:tickId:positionKey`, so the position span and
|
|
448
|
-
// its close/SL children agree on it without any pairing state.
|
|
449
|
-
const positionSpanId = record.positionKey !== undefined
|
|
450
|
-
? deterministicSpanId(`${tickSeed}:${record.positionKey}`)
|
|
451
|
-
: undefined;
|
|
452
|
-
if (record.unit === "position") {
|
|
453
|
-
const attrs = new AttrBuilder()
|
|
454
|
-
.put("tick.id", record.tickId)
|
|
455
|
-
.put("position.id", record.positionId)
|
|
456
|
-
.put("dsl.asset", record.asset)
|
|
457
|
-
.put("dsl.dex", record.dex)
|
|
458
|
-
.build();
|
|
459
|
-
return [
|
|
460
|
-
makeTraceRow(deps, {
|
|
461
|
-
timestampMs: record.startedAt,
|
|
462
|
-
traceId,
|
|
463
|
-
spanId: positionSpanId ?? deps.ids.spanId(),
|
|
464
|
-
parentSpanId: rootSpanId,
|
|
465
|
-
spanName: SPAN_NAME.dslPosition,
|
|
466
|
-
spanKind: spanKindFor("dsl_tick"),
|
|
467
|
-
startedAt: record.startedAt,
|
|
468
|
-
endedAt: record.endedAt,
|
|
469
|
-
statusCode: "Ok",
|
|
470
|
-
attrs,
|
|
471
|
-
}),
|
|
472
|
-
];
|
|
473
|
-
}
|
|
474
|
-
// close_attempt / sl_update — the venue calls, nested under their position span.
|
|
475
|
-
const isError = record.outcome === "error";
|
|
476
|
-
const attrs = new AttrBuilder()
|
|
477
|
-
.put("tick.id", record.tickId)
|
|
478
|
-
.put("position.id", record.positionId)
|
|
479
|
-
.put("dsl.asset", record.asset)
|
|
480
|
-
.put("dsl.dex", record.dex)
|
|
481
|
-
.put("dsl.error", record.error);
|
|
482
|
-
if (record.unit === "close_attempt") {
|
|
483
|
-
attrs.put("dsl.close_reason", record.closeReason).put("dsl.attempt", record.attempt);
|
|
484
|
-
}
|
|
485
|
-
else {
|
|
486
|
-
attrs
|
|
487
|
-
.put("dsl.new_sl_price", record.newSLPrice)
|
|
488
|
-
.put("dsl.sl_order_id", record.slOrderId)
|
|
489
|
-
.put("dsl.sync_reason", record.syncReason);
|
|
490
|
-
}
|
|
491
|
-
return [
|
|
492
|
-
makeTraceRow(deps, {
|
|
493
|
-
timestampMs: record.startedAt,
|
|
494
|
-
traceId,
|
|
495
|
-
spanId: deps.ids.spanId(),
|
|
496
|
-
// Defensive fallback: no positionKey → parent to the tick root so the row still joins.
|
|
497
|
-
parentSpanId: positionSpanId ?? rootSpanId,
|
|
498
|
-
spanName: record.unit === "close_attempt" ? SPAN_NAME.dslCloseAttempt : SPAN_NAME.dslSlUpdate,
|
|
499
|
-
spanKind: spanKindFor("dsl_tick"),
|
|
500
|
-
startedAt: record.startedAt,
|
|
501
|
-
endedAt: record.endedAt,
|
|
502
|
-
statusCode: isError ? "Error" : "Ok",
|
|
503
|
-
statusMessage: isError ? (record.error ?? "") : "",
|
|
504
|
-
attrs: attrs.build(),
|
|
505
|
-
// No error class name at the emit site — exception.type is omitted, message kept.
|
|
506
|
-
events: isError ? [exceptionEvent(record.endedAt, undefined, record.error)] : [],
|
|
507
|
-
}),
|
|
508
|
-
];
|
|
509
|
-
}
|
|
510
|
-
// ── decision.made → one log (Task 8) ──────────────────────────────────────────────
|
|
511
|
-
/**
|
|
512
|
-
* The pass's judgment as a discrete log. Attributes are the queryable scalars; the **Body is the
|
|
513
|
-
* LLM reasoning prose, uncapped** (the catalog calls for full reasoning — no per-value cap applied
|
|
514
|
-
* to it) and routed through {@link redactBody}, which passes a flat string through verbatim (a
|
|
515
|
-
* string has no keys to scrub) while still keeping the redaction seam over both Bodies. When
|
|
516
|
-
* reasoning is absent, a short templated Body stands in. Market-context keys are reserved and
|
|
517
|
-
* absent in 8a (see the brief's impl notes).
|
|
518
|
-
*/
|
|
519
|
-
export function mapDecisionMade(record, deps) {
|
|
520
|
-
const attrs = new AttrBuilder()
|
|
521
|
-
.put("decision.mode", record.mode)
|
|
522
|
-
.put("decision.by_llm", record.byLlm)
|
|
523
|
-
.put("decision.model", record.model)
|
|
524
|
-
.put("decision.tokens_used", record.tokensUsed)
|
|
525
|
-
.put("decision.confidence", record.confidence)
|
|
526
|
-
.put("decision.confidence_threshold", record.confidenceThreshold)
|
|
527
|
-
.put("decision.duration_ms", record.durationMs)
|
|
528
|
-
.put("decision.action_intent", record.actionIntent)
|
|
529
|
-
.put("decision.funding_regime", record.fundingRegime)
|
|
530
|
-
.put("decision.market_regime", record.marketRegime)
|
|
531
|
-
.put("decision.mark_price", record.markPrice)
|
|
532
|
-
.build();
|
|
533
|
-
// Body = the reasoning prose (uncapped), through the Body redaction seam. A string has no
|
|
534
|
-
// sensitive keys, so it survives verbatim; the short fallback keeps a non-empty, useful Body.
|
|
535
|
-
const reasoning = record.reasoning ? String(redactBody(record.reasoning)) : "";
|
|
536
|
-
const body = reasoning || `decision ${record.actionIntent} (${record.mode ?? "none"})`;
|
|
537
|
-
return [logRowFor(deps, record, record.occurredAt, body, attrs)];
|
|
538
|
-
}
|
|
539
|
-
// ── signal.outcome → one log (Task 8) ──────────────────────────────────────────────
|
|
540
|
-
/**
|
|
541
|
-
* One considered signal's disposition as a discrete log. Attributes are the queryable raw-signal
|
|
542
|
-
* scalars, factors, disposition, and sizing; the **Body is the raw scanner evidence**
|
|
543
|
-
* (`JSON.stringify(redactBody(rawSignal))`) — the variable-shaped payload whose arbitrary scanner
|
|
544
|
-
* `meta` Task 2 dropped from attributes and Task 8 keeps here, scrubbed by key name. Empty Body when
|
|
545
|
-
* there is no rawSignal.
|
|
546
|
-
*/
|
|
547
|
-
export function mapSignalOutcome(record, deps) {
|
|
548
|
-
const attrs = new AttrBuilder()
|
|
549
|
-
.put("scanner.id", record.scannerId)
|
|
550
|
-
.put("signal.type", record.signalType)
|
|
551
|
-
.put("signal.asset", record.asset)
|
|
552
|
-
.put("signal.direction", record.direction)
|
|
553
|
-
.put("signal.score", record.score)
|
|
554
|
-
.put("signal.timestamp", record.signalTs)
|
|
555
|
-
.putFactors("signal.factor", record.factors)
|
|
556
|
-
.put("outcome.result", record.result)
|
|
557
|
-
.put("outcome.reason_code", record.reasonCode)
|
|
558
|
-
.put("position.id", record.positionId)
|
|
559
|
-
.put("outcome.margin_amount", record.marginAmount)
|
|
560
|
-
.put("outcome.leverage", record.leverage)
|
|
561
|
-
.put("outcome.notional_value", record.notionalValue)
|
|
562
|
-
.put("outcome.size", record.size)
|
|
563
|
-
.put("outcome.margin_source", record.marginSource)
|
|
564
|
-
.put("outcome.order_id", record.orderId)
|
|
565
|
-
.put("outcome.error_name", record.errorName)
|
|
566
|
-
.build();
|
|
567
|
-
const body = record.rawSignal ? JSON.stringify(redactBody(record.rawSignal)) : "";
|
|
568
|
-
return [logRowFor(deps, record, record.occurredAt, body, attrs)];
|
|
569
|
-
}
|
|
570
|
-
// ── scanner.summary → one log (Task 8 anti-spam funnel) ─────────────────────────────
|
|
571
|
-
/**
|
|
572
|
-
* One scan's funnel roll-up as a discrete log — ONE row, never one per drop. Attributes are the
|
|
573
|
-
* queryable aggregate surface (counts, per-reason counts via `putBag`, the survivors' assets as a
|
|
574
|
-
* single JSON array). The **Body is the dropped-candidate array**
|
|
575
|
-
* (`JSON.stringify(redactBody(droppedCandidates))`) — variable-shaped scanner data, scrubbed by
|
|
576
|
-
* key name, read only after the row is selected. Empty Body when nothing was dropped.
|
|
577
|
-
*/
|
|
578
|
-
export function mapScannerSummary(record, deps) {
|
|
579
|
-
const attrs = new AttrBuilder()
|
|
580
|
-
.put("scanner.id", record.scannerId)
|
|
581
|
-
.put("scanner.scanned_count", record.scannedCount)
|
|
582
|
-
.put("scanner.passed_count", record.passedCount)
|
|
583
|
-
.put("scanner.dropped_count", record.droppedCount)
|
|
584
|
-
.putBag("scanner.dropped_by_reason", record.droppedByReason)
|
|
585
|
-
.putJson("scanner.passed_assets", record.passedAssets)
|
|
586
|
-
.build();
|
|
587
|
-
const dropped = record.droppedCandidates;
|
|
588
|
-
const body = dropped && dropped.length > 0 ? JSON.stringify(redactBody(dropped)) : "";
|
|
589
|
-
return [
|
|
590
|
-
logRowFor(deps, record, record.occurredAt, body, attrs),
|
|
591
|
-
];
|
|
592
|
-
}
|
|
593
|
-
// ── dsl.close_attempt → one log (Task 8) ────────────────────────────────────────────
|
|
594
|
-
/**
|
|
595
|
-
* One DSL exit attempt as a discrete log (the second consumer of `tracking.dsl_close_attempt`,
|
|
596
|
-
* alongside the tick trace). No Body — the attempt is fully described by its scalars. No
|
|
597
|
-
* `error_name`: only `String(e)` is available at the producer emit site.
|
|
598
|
-
*/
|
|
599
|
-
export function mapDslCloseAttempt(record, deps) {
|
|
600
|
-
const attrs = new AttrBuilder()
|
|
601
|
-
.put("position.id", record.positionId)
|
|
602
|
-
.put("dsl.asset", record.asset)
|
|
603
|
-
.put("dsl.dex", record.dex)
|
|
604
|
-
.put("dsl.reason", record.reason)
|
|
605
|
-
.put("dsl.attempt", record.attempt)
|
|
606
|
-
.put("dsl.result", record.result)
|
|
607
|
-
.build();
|
|
608
|
-
return [logRowFor(deps, record, record.occurredAt, `dsl close_attempt ${record.asset ?? ""} ${record.result}`, attrs)];
|
|
609
|
-
}
|
|
610
|
-
/**
|
|
611
|
-
* One order-execution event as a discrete log under the `order.*` namespace — the execution
|
|
612
|
-
* granularity `position_lifecycle` can't carry. Null/undefined attrs are omitted by the builder, so
|
|
613
|
-
* each event subtype naturally carries only its own fields (placed: order/size; filled: fill; failed:
|
|
614
|
-
* reason/error_name). `position.id` is the cross-flow join key (coexists with `outcome.order_id` /
|
|
615
|
-
* `position.order_id`; 8b coalesces). **Body** = the venue raw response on `failed`
|
|
616
|
-
* (`JSON.stringify(redactBody(error))`); `placed`/`filled` carry no Body (short templated message).
|
|
617
|
-
*/
|
|
618
|
-
export function mapOrderEvent(record, deps) {
|
|
619
|
-
const attrs = new AttrBuilder()
|
|
620
|
-
.put("order.id", record.orderId)
|
|
621
|
-
.put("order.type", record.orderType)
|
|
622
|
-
.put("order.asset", record.asset)
|
|
623
|
-
.put("order.direction", record.direction)
|
|
624
|
-
.put("order.size", record.size)
|
|
625
|
-
.put("order.limit_price", record.limitPrice)
|
|
626
|
-
.put("order.reduce_only", record.reduceOnly)
|
|
627
|
-
.put("order.fill_price", record.fillPrice)
|
|
628
|
-
.put("order.fill_size", record.fillSize)
|
|
629
|
-
.put("order.execution_as_maker", record.executionAsMaker)
|
|
630
|
-
.put("order.fees", record.fees)
|
|
631
|
-
.put("order.partial", record.partial)
|
|
632
|
-
.put("order.reason", record.reason)
|
|
633
|
-
.put("order.error_name", record.errorName)
|
|
634
|
-
.put("position.id", record.positionId)
|
|
635
|
-
.build();
|
|
636
|
-
const body = record.event === "failed" && record.error ? JSON.stringify(redactBody(record.error)) : "";
|
|
637
|
-
const dir = record.direction ? ` ${record.direction}` : "";
|
|
638
|
-
const fallback = `order ${record.event} ${record.asset}${dir}`;
|
|
639
|
-
return [logRowFor(deps, record, record.occurredAt, body || fallback, attrs)];
|
|
640
|
-
}
|
|
641
|
-
// ── runtime_error → one log ───────────────────────────────────────────────────────
|
|
642
|
-
export function mapRuntimeError(record, deps) {
|
|
643
|
-
const red = redactRuntimeError(record);
|
|
644
|
-
const attrs = new AttrBuilder()
|
|
645
|
-
.put("runtime.phase", red.phase)
|
|
646
|
-
.put("runtime.message", red.message)
|
|
647
|
-
.put("runtime.error_name", red.errorName)
|
|
648
|
-
.put("runtime.asset", red.asset)
|
|
649
|
-
.put("runtime.scanner_id", red.scannerId)
|
|
650
|
-
.put("scan.run_id", red.runId)
|
|
651
|
-
.put("runtime.stack", red.stack)
|
|
652
|
-
.build();
|
|
653
|
-
return [logRowFor(deps, red, red.occurredAt, `${red.phase}: ${red.message}`, attrs)];
|
|
654
|
-
}
|
|
655
|
-
// ── runtime_lifecycle → one log ───────────────────────────────────────────────────
|
|
656
|
-
export function mapRuntimeLifecycle(record, deps) {
|
|
657
|
-
const attrs = new AttrBuilder()
|
|
658
|
-
.put("runtime.phase", record.phase)
|
|
659
|
-
.put("runtime.version", record.runtimeVersion)
|
|
660
|
-
.put("runtime.has_dsl", record.hasDsl)
|
|
661
|
-
.put("runtime.scanner_count", record.scannerCount)
|
|
662
|
-
.put("runtime.action_count", record.actionCount)
|
|
663
|
-
.put("runtime.uptime_ms", record.uptimeMs)
|
|
664
|
-
// Unresolved config blob: single JSON key, size-capped, never flattened (no secrets to scrub).
|
|
665
|
-
.putConfig("runtime.config", record.config)
|
|
666
|
-
.build();
|
|
667
|
-
return [logRowFor(deps, record, record.occurredAt, `runtime ${record.phase}`, attrs)];
|
|
668
|
-
}
|
|
669
|
-
// ── runtime_state → one log ───────────────────────────────────────────────────────
|
|
670
|
-
export function mapRuntimeState(record, deps) {
|
|
671
|
-
const red = redactRuntimeState(record);
|
|
672
|
-
const attrs = new AttrBuilder()
|
|
673
|
-
.put("runtime.phase", red.phase)
|
|
674
|
-
.put("runtime.gate_id", red.gateId)
|
|
675
|
-
.put("runtime.gate_name", red.gateName)
|
|
676
|
-
.put("runtime.source", red.source)
|
|
677
|
-
.put("runtime.reason", red.reason)
|
|
678
|
-
// runtime.metrics dropped by redaction upstream.
|
|
679
|
-
.build();
|
|
680
|
-
// `|| gateId` (not `??`): an empty-string gateName must still fall back to the stable id.
|
|
681
|
-
return [logRowFor(deps, red, red.occurredAt, `trading ${red.phase}: ${red.gateName || red.gateId}`, attrs)];
|
|
682
|
-
}
|
|
683
|
-
//# sourceMappingURL=mappers.js.map
|