@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
|
@@ -2,17 +2,15 @@
|
|
|
2
2
|
* Fastify route wiring for the supervised intake /signals and /errors routes.
|
|
3
3
|
* The route IS mounted via createApi when intakeContext is present.
|
|
4
4
|
*/
|
|
5
|
+
import { trace } from "@opentelemetry/api";
|
|
5
6
|
import { Value } from "@sinclair/typebox/value";
|
|
6
7
|
import { SignalsBodySchema, ErrorsBodySchema } from "./signals.schema.js";
|
|
7
8
|
import { processSignalPost } from "../intake/process-signal-post.js";
|
|
8
9
|
import { processErrorPost } from "../intake/process-error-post.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
warn: () => { },
|
|
14
|
-
error: () => { },
|
|
15
|
-
};
|
|
10
|
+
import { noopLogger } from "../../utils/logger.js";
|
|
11
|
+
import { emitEvent } from "../../actions/event-derivation.js";
|
|
12
|
+
import { recordSignalIntake } from "../../telemetry/metrics.js";
|
|
13
|
+
import { buildSignalDispositionEvent, buildSignalRejectedEvent, buildScaffoldErrorEvent, } from "../intake/intake-events.js";
|
|
16
14
|
/**
|
|
17
15
|
* Register the supervised intake /signals and /errors routes.
|
|
18
16
|
*/
|
|
@@ -26,7 +24,47 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
26
24
|
const onAccepted = opts.onAccepted ?? (() => { });
|
|
27
25
|
const onError = opts.onError ?? (() => { });
|
|
28
26
|
const maxItems = opts.maxItemsPerSignalsRequest;
|
|
29
|
-
const logger = opts.logger ??
|
|
27
|
+
const logger = opts.logger ?? noopLogger;
|
|
28
|
+
// Enrich the inbound HTTP server span (created by `http` auto-instrumentation) with the intake
|
|
29
|
+
// disposition. A rejected/expired/superseded signal returns a structured 2xx/4xx that auto-instr
|
|
30
|
+
// can't flag as notable, so without this the span is silent on what the boundary decided. Guarded:
|
|
31
|
+
// span enrichment must never break request handling. No new span is created.
|
|
32
|
+
const enrichIntakeSpan = (attrs) => {
|
|
33
|
+
// Metric plane: count the disposition at request grain, riding the same disposition the span
|
|
34
|
+
// enrichment carries (a heterogeneous batch counts once as `mixed`). Per-signal granularity lives
|
|
35
|
+
// on the `signal.*` event log; this counter is the alertable per-request trend.
|
|
36
|
+
const disposition = attrs["senpi.intake.disposition"];
|
|
37
|
+
if (disposition !== undefined) {
|
|
38
|
+
// Dimension by the stable registry name, not the ephemeral reminted id on the span — a
|
|
39
|
+
// crash-looping scanner rotates its id every relaunch and would explode counter cardinality.
|
|
40
|
+
recordSignalIntake({
|
|
41
|
+
scannerName: registry.resolve(attrs["senpi.scanner.id"] ?? "")?.scannerName ?? "unknown",
|
|
42
|
+
disposition,
|
|
43
|
+
reasonCode: attrs["senpi.intake.reason_code"],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const span = trace.getActiveSpan();
|
|
48
|
+
if (!span)
|
|
49
|
+
return;
|
|
50
|
+
const defined = {};
|
|
51
|
+
for (const [k, v] of Object.entries(attrs))
|
|
52
|
+
if (v !== undefined)
|
|
53
|
+
defined[k] = v;
|
|
54
|
+
span.setAttributes(defined);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
/* never break request handling */
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
// Best-effort scanner context from an unvalidated body: the envelope schema failed, but a usable
|
|
61
|
+
// scanner_id may still let the reject be grouped by scanner.
|
|
62
|
+
const bestEffortCtx = (body) => {
|
|
63
|
+
const id = body?.scanner_id;
|
|
64
|
+
const scannerId = typeof id === "string" && id ? id : "unknown";
|
|
65
|
+
const resolved = registry.resolve(scannerId);
|
|
66
|
+
return { scannerId, scannerName: resolved?.scannerName, wallet: resolved?.wallet };
|
|
67
|
+
};
|
|
30
68
|
// POST /signals
|
|
31
69
|
fastify.post("/signals", async (request, reply) => {
|
|
32
70
|
if (!Value.Check(SignalsBodySchema, request.body)) {
|
|
@@ -38,17 +76,36 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
38
76
|
.slice(0, 10)
|
|
39
77
|
.map((e) => `path=${e.path} msg=${e.message} got=${JSON.stringify(e.value)?.slice(0, 120)}`);
|
|
40
78
|
logger.warn(`[intake] INVALID_SHAPE scanner_id=${String(body?.scanner_id ?? "?")} errors=${JSON.stringify(errors)}`);
|
|
79
|
+
const ctx = bestEffortCtx(request.body);
|
|
80
|
+
emitEvent(logger, () => buildSignalRejectedEvent("invalid_shape", ctx));
|
|
81
|
+
enrichIntakeSpan({
|
|
82
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
83
|
+
"senpi.intake.disposition": "rejected",
|
|
84
|
+
"senpi.intake.reason_code": "invalid_shape",
|
|
85
|
+
});
|
|
41
86
|
return reply.status(400).send({
|
|
42
87
|
success: false,
|
|
43
88
|
error: { code: "INVALID_SHAPE", message: "Invalid request body" },
|
|
44
89
|
});
|
|
45
90
|
}
|
|
46
91
|
const body = request.body;
|
|
92
|
+
// Resolve the scanner once so every disposition event carries its name + wallet.
|
|
93
|
+
const resolved = registry.resolve(body.scanner_id);
|
|
94
|
+
const ctx = {
|
|
95
|
+
scannerId: body.scanner_id,
|
|
96
|
+
scannerName: resolved?.scannerName,
|
|
97
|
+
wallet: resolved?.wallet,
|
|
98
|
+
};
|
|
47
99
|
// Enforce the configured per-request item cap before any work — matches the
|
|
48
|
-
// legacy address-routed route's 400 / INVALID_REQUEST. Checked before
|
|
49
|
-
//
|
|
100
|
+
// legacy address-routed route's 400 / INVALID_REQUEST. Checked before the
|
|
101
|
+
// per-signal pipeline so an oversized batch is one request-level reject.
|
|
50
102
|
if (maxItems !== undefined && body.signals.length > maxItems) {
|
|
51
|
-
logger
|
|
103
|
+
emitEvent(logger, () => buildSignalRejectedEvent("max_items_exceeded", ctx));
|
|
104
|
+
enrichIntakeSpan({
|
|
105
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
106
|
+
"senpi.intake.disposition": "rejected",
|
|
107
|
+
"senpi.intake.reason_code": "max_items_exceeded",
|
|
108
|
+
});
|
|
52
109
|
return reply.status(400).send({
|
|
53
110
|
success: false,
|
|
54
111
|
error: {
|
|
@@ -57,9 +114,6 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
57
114
|
},
|
|
58
115
|
});
|
|
59
116
|
}
|
|
60
|
-
// Resolve scannerName once for use in log lines.
|
|
61
|
-
const resolved = registry.resolve(body.scanner_id);
|
|
62
|
-
const scannerName = resolved?.scannerName ?? "";
|
|
63
117
|
const result = await processSignalPost(body, {
|
|
64
118
|
registry,
|
|
65
119
|
record,
|
|
@@ -69,41 +123,47 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
69
123
|
onAccepted,
|
|
70
124
|
});
|
|
71
125
|
if (!result.ok) {
|
|
72
|
-
|
|
126
|
+
// The sole POST-level reject from processSignalPost is an unknown scanner_id (an oversized
|
|
127
|
+
// batch already returned above). Emit it as a coded request-level signal.rejected.
|
|
128
|
+
emitEvent(logger, () => buildSignalRejectedEvent("unknown_scanner", ctx));
|
|
129
|
+
enrichIntakeSpan({
|
|
130
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
131
|
+
"senpi.intake.disposition": "rejected",
|
|
132
|
+
"senpi.intake.reason_code": "unknown_scanner",
|
|
133
|
+
});
|
|
73
134
|
return reply.status(404).send({
|
|
74
135
|
success: false,
|
|
75
136
|
error: { code: result.reason, message: result.reason },
|
|
76
137
|
});
|
|
77
138
|
}
|
|
78
|
-
// Empty signals list — no-op
|
|
79
|
-
//
|
|
139
|
+
// Empty signals list — a no-op liveness ping (a watch-only scanner POSTs empty
|
|
140
|
+
// every tick), not a catalogued disposition. Log at debug so it doesn't drown
|
|
141
|
+
// the real per-signal outcome events emitted below.
|
|
80
142
|
if (result.signals.length === 0) {
|
|
81
143
|
logger.debug(`[intake] no-op scanner_id=${body.scanner_id}`);
|
|
144
|
+
enrichIntakeSpan({ "senpi.scanner.id": ctx.scannerId, "senpi.intake.disposition": "noop" });
|
|
82
145
|
return reply.send({
|
|
83
146
|
success: true,
|
|
84
147
|
data: { signals: result.signals },
|
|
85
148
|
});
|
|
86
149
|
}
|
|
87
|
-
//
|
|
150
|
+
// One signal.* event per disposition — the pre-decision acceptance fact at the boundary.
|
|
88
151
|
for (let i = 0; i < result.signals.length; i++) {
|
|
89
152
|
const status = result.signals[i];
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
switch (status.status) {
|
|
93
|
-
case "accepted":
|
|
94
|
-
logger.info(`[intake] accepted asset=${asset} scanner=${scannerName} correlationId=${status.correlationId} scanner_id=${body.scanner_id}`);
|
|
95
|
-
break;
|
|
96
|
-
case "rejected":
|
|
97
|
-
logger.info(`[intake] rejected asset=${asset} scanner_id=${body.scanner_id} reason=${status.reason}`);
|
|
98
|
-
break;
|
|
99
|
-
case "expired":
|
|
100
|
-
logger.info(`[intake] expired asset=${asset} scanner_id=${body.scanner_id}`);
|
|
101
|
-
break;
|
|
102
|
-
case "superseded":
|
|
103
|
-
logger.info(`[intake] superseded asset=${asset} scanner_id=${body.scanner_id}`);
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
153
|
+
const asset = body.signals[i]?.asset ?? "unknown";
|
|
154
|
+
emitEvent(logger, () => buildSignalDispositionEvent(status, asset, ctx));
|
|
106
155
|
}
|
|
156
|
+
// Summarize the batch onto the server span (signal-bearing POSTs are effectively single-signal):
|
|
157
|
+
// the disposition, plus the minted correlation id when exactly one was accepted.
|
|
158
|
+
const statuses = result.signals;
|
|
159
|
+
const acceptedIds = statuses.flatMap((s) => (s.status === "accepted" ? [s.correlationId] : []));
|
|
160
|
+
enrichIntakeSpan({
|
|
161
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
162
|
+
"senpi.intake.disposition": statuses.every((s) => s.status === statuses[0].status)
|
|
163
|
+
? statuses[0].status
|
|
164
|
+
: "mixed",
|
|
165
|
+
"senpi.signal.correlation_id": acceptedIds.length === 1 ? acceptedIds[0] : undefined,
|
|
166
|
+
});
|
|
107
167
|
return reply.send({
|
|
108
168
|
success: true,
|
|
109
169
|
data: { signals: result.signals },
|
|
@@ -112,23 +172,49 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
112
172
|
// POST /errors
|
|
113
173
|
fastify.post("/errors", async (request, reply) => {
|
|
114
174
|
if (!Value.Check(ErrorsBodySchema, request.body)) {
|
|
175
|
+
const ctx = bestEffortCtx(request.body);
|
|
176
|
+
emitEvent(logger, () => buildSignalRejectedEvent("invalid_shape", ctx));
|
|
177
|
+
enrichIntakeSpan({
|
|
178
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
179
|
+
"senpi.intake.disposition": "rejected",
|
|
180
|
+
"senpi.intake.reason_code": "invalid_shape",
|
|
181
|
+
});
|
|
115
182
|
return reply.status(400).send({
|
|
116
183
|
success: false,
|
|
117
184
|
error: { code: "INVALID_SHAPE", message: "Invalid request body" },
|
|
118
185
|
});
|
|
119
186
|
}
|
|
120
|
-
const
|
|
187
|
+
const body = request.body;
|
|
188
|
+
const result = await processErrorPost(body, {
|
|
121
189
|
registry,
|
|
122
190
|
now,
|
|
123
191
|
updateLiveness,
|
|
124
192
|
onError,
|
|
125
193
|
});
|
|
126
194
|
if (!result.ok) {
|
|
195
|
+
enrichIntakeSpan({
|
|
196
|
+
"senpi.scanner.id": body.scanner_id,
|
|
197
|
+
"senpi.intake.disposition": "rejected",
|
|
198
|
+
"senpi.intake.reason_code": "unknown_scanner",
|
|
199
|
+
});
|
|
127
200
|
return reply.status(404).send({
|
|
128
201
|
success: false,
|
|
129
202
|
error: { code: result.reason, message: result.reason },
|
|
130
203
|
});
|
|
131
204
|
}
|
|
205
|
+
// A scanner tick that errored or timed out — it produced no signal this tick. The /errors
|
|
206
|
+
// boundary is otherwise untelemetered (onError is a no-op in production).
|
|
207
|
+
const resolved = registry.resolve(body.scanner_id);
|
|
208
|
+
const ctx = {
|
|
209
|
+
scannerId: body.scanner_id,
|
|
210
|
+
scannerName: resolved?.scannerName,
|
|
211
|
+
wallet: resolved?.wallet,
|
|
212
|
+
};
|
|
213
|
+
emitEvent(logger, () => buildScaffoldErrorEvent(body.error, ctx));
|
|
214
|
+
enrichIntakeSpan({
|
|
215
|
+
"senpi.scanner.id": body.scanner_id,
|
|
216
|
+
"senpi.intake.disposition": "scaffold_error",
|
|
217
|
+
});
|
|
132
218
|
return reply.send({ success: true });
|
|
133
219
|
});
|
|
134
220
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../../src/runtime-api/routes/signals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../../src/runtime-api/routes/signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime-api/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAKxD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime-api/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAKxD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,4EAA4E;IAC5E,SAAS,EAAE,SAAS,CAAC;IACrB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACvF;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAqF3D"}
|
|
@@ -19,6 +19,8 @@ import { registerAuditRoute } from "./routes/audit.js";
|
|
|
19
19
|
import { registerHealthRoute } from "./routes/health.js";
|
|
20
20
|
import { registerStateRoute } from "./routes/state.js";
|
|
21
21
|
import { createReadiness } from "./readiness.js";
|
|
22
|
+
import { emitEvent } from "../actions/event-derivation.js";
|
|
23
|
+
import { buildSignalRejectedEvent } from "./intake/intake-events.js";
|
|
22
24
|
/**
|
|
23
25
|
* Create and configure the Fastify HTTP server.
|
|
24
26
|
*
|
|
@@ -58,13 +60,20 @@ export function createApi(deps) {
|
|
|
58
60
|
});
|
|
59
61
|
// Custom error handler — normalises Fastify validation / payload errors into
|
|
60
62
|
// the senpi-stack envelope `{ success: false, error: { code, message } }`.
|
|
61
|
-
fastify.setErrorHandler((error,
|
|
63
|
+
fastify.setErrorHandler((error, req, reply) => {
|
|
62
64
|
// Fastify v5 types setErrorHandler with `unknown`; cast once for the handler.
|
|
63
65
|
const err = error;
|
|
64
66
|
const statusCode = err.statusCode;
|
|
65
67
|
if (statusCode === 400 ||
|
|
66
68
|
statusCode === 413 ||
|
|
67
69
|
statusCode === 415) {
|
|
70
|
+
// A malformed-JSON / oversized / wrong-content-type body throws before the intake handler runs,
|
|
71
|
+
// so the envelope reject is otherwise untelemetered. Emit it at request grain (scanner unknown —
|
|
72
|
+
// the body never parsed), scoped to the intake routes. Strip any query string before matching.
|
|
73
|
+
const path = req.url.split("?")[0];
|
|
74
|
+
if (deps.intakeContext && (path === "/signals" || path === "/errors")) {
|
|
75
|
+
emitEvent(deps.logger, () => buildSignalRejectedEvent("invalid_request", { scannerId: "unknown" }));
|
|
76
|
+
}
|
|
68
77
|
return reply.status(statusCode).send({
|
|
69
78
|
success: false,
|
|
70
79
|
error: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/runtime-api/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,OAAiC,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/runtime-api/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import type { CandlesByAsset, ScannerLogger, SharedArtifactAccessor } from "../p
|
|
|
6
6
|
import type { Instrument, ScannerId, SmMarket } from "../types.js";
|
|
7
7
|
import type { ClearingHouseState } from "../implementations/liquidation-watchdog.js";
|
|
8
8
|
import type { DslState } from "../../types/dsl/index.js";
|
|
9
|
+
import type { IdentityEnvelope } from "../../telemetry/identity.js";
|
|
9
10
|
import type { ScannerEngineLifecycle } from "./lifecycle.js";
|
|
10
11
|
/** Minimal active-position shape consumed by scanner contexts. */
|
|
11
12
|
export type ActivePosition = Record<string, unknown>;
|
|
@@ -42,6 +43,8 @@ export interface ScannerEngineDependencies {
|
|
|
42
43
|
logger?: ScannerLogger;
|
|
43
44
|
lifecycle?: ScannerEngineLifecycle;
|
|
44
45
|
now?: () => number;
|
|
46
|
+
/** Lazy runtime identity builder; used to stamp per-trace identity at the scanner.run seam. */
|
|
47
|
+
identity?: () => IdentityEnvelope;
|
|
45
48
|
}
|
|
46
49
|
/** Shared-artifact store accessors exposed through scanner init/run contexts. */
|
|
47
50
|
export declare function createSharedArtifactAccessor(address: string, scannerId: ScannerId, producedContract: SharedArtifactContract | undefined, sharedArtifactStore: SharedArtifactStore, resolveSourceScannerId: (artifactKey: string) => ScannerId | undefined): SharedArtifactAccessor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-providers.d.ts","sourceRoot":"","sources":["../../../src/scanners/engine/data-providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,sBAAsB,EACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,QAAQ,EACT,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,kEAAkE;AAClE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,+FAA+F;IAC/F,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5D,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,UAAU,EAAE,EACzB,OAAO,CAAC,EAAE,qBAAqB,KAC5B,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IAChG,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrD,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACpE,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAChF,uBAAuB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;CACpE;AAED,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,mBAAmB,EAAE,mBAAmB,CAAC;CAC1C;AAED,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"data-providers.d.ts","sourceRoot":"","sources":["../../../src/scanners/engine/data-providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-providers.js","sourceRoot":"","sources":["../../../src/scanners/engine/data-providers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data-providers.js","sourceRoot":"","sources":["../../../src/scanners/engine/data-providers.ts"],"names":[],"mappings":"AAqEA,iFAAiF;AACjF,MAAM,UAAU,4BAA4B,CAC1C,OAAe,EACf,SAAoB,EACpB,gBAAoD,EACpD,mBAAwC,EACxC,sBAAsE;IAEtE,OAAO;QACL,kBAAkB,EAAE,CAClB,QAA2C,EAC3C,IAA4B,EACc,EAAE,CAC5C,mBAAmB,CAAC,aAAa,CAC/B,OAAO,EACP,8BAA8B,CAAC,QAAQ,EAAE,sBAAsB,CAAC,EAChE;YACE,QAAQ,EAAE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YAC7D,QAAQ,EAAE,IAAI,EAAE,QAAQ;SACzB,CAC0C;QAC/C,kBAAkB,EAAE,CAClB,QAA2C,EAC3C,KAA+B,EAChB,EAAE;YACjB,MAAM,QAAQ,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5E,MAAM,WAAW,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC3E,IAAI,gBAAgB,IAAI,WAAW,KAAK,gBAAgB,CAAC,GAAG,EAAE,CAAC;gBAC7D,MAAM,IAAI,KAAK,CACb,YAAY,SAAS,kDAAkD,gBAAgB,CAAC,GAAG,yBAAyB,WAAW,IAAI,CACpI,CAAC;YACJ,CAAC;YACD,OAAO,mBAAmB,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;gBAClE,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CACrC,QAAyC,EACzC,sBAAsE;IAEtE,MAAM,GAAG,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;IACnE,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yDAAyD,GAAG,IAAI,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -27,7 +27,10 @@ export declare class ScannerEngine {
|
|
|
27
27
|
private readonly registry;
|
|
28
28
|
private started;
|
|
29
29
|
private readonly inFlight;
|
|
30
|
+
private identity;
|
|
31
|
+
private identityResolved;
|
|
30
32
|
constructor(deps: ScannerEngineDependencies, composition: ScannerComposition, registry?: StrategyRegistry);
|
|
33
|
+
private resolveIdentity;
|
|
31
34
|
/** Registers one scanner for one strategy runtime. */
|
|
32
35
|
register<Cfg = unknown, St = unknown>(strategy: StrategyRegistration, scanner: Scanner<Cfg, St>): void;
|
|
33
36
|
/** Enables scanner execution for one strategy + scanner key. */
|
|
@@ -51,6 +54,15 @@ export declare class ScannerEngine {
|
|
|
51
54
|
* Flow: overlap-guard -> runtime/config -> beforeScan -> scan -> normalize -> persist.
|
|
52
55
|
*/
|
|
53
56
|
runOnce(address: string, scannerId: ScannerId): Promise<ScanResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Runs the interval-scan body under the scanner.run span. Identity stamping sits inside the
|
|
59
|
+
* try so the `finally` always clears the in-flight marker, even if the stamp ever throws.
|
|
60
|
+
* runOnce swallows errors into a failure ScanResult, so withSpan's auto-record never fires —
|
|
61
|
+
* the span is painted explicitly here.
|
|
62
|
+
*/
|
|
63
|
+
private runScan;
|
|
64
|
+
/** Stamps the scanner.run span attributes from a terminal interval-scan result. */
|
|
65
|
+
private stampRunSpan;
|
|
54
66
|
/**
|
|
55
67
|
* Accepts one externally supplied signal/context payload for a push-driven
|
|
56
68
|
* scanner.
|
|
@@ -65,6 +77,12 @@ export declare class ScannerEngine {
|
|
|
65
77
|
* when two gateway ingests arrive in the same event-loop turn.
|
|
66
78
|
*/
|
|
67
79
|
ingestExternalScannerData(address: string, request: ExternalScannerIngestRequest): Promise<ExternalScannerIngestResult>;
|
|
80
|
+
/**
|
|
81
|
+
* Runs the external-ingest body under the reduced scanner.run span. Identity stamping sits
|
|
82
|
+
* inside the try so the `finally` always clears the in-flight marker. This path rethrows on
|
|
83
|
+
* failure, so withSpan's auto-record paints ERROR; outcome=error is set for symmetry.
|
|
84
|
+
*/
|
|
85
|
+
private runExternalIngest;
|
|
68
86
|
commitRunResult(address: string, scannerId: ScannerId, result: ScanResult): Promise<ScanResult>;
|
|
69
87
|
/** Executes one scanner plus its dependency chain immediately in topological order. */
|
|
70
88
|
runChain(address: string, scannerId: ScannerId): Promise<ScanResult[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/scanners/engine/engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAGV,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EAET,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAEjC,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EACL,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/scanners/engine/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,21 @@ import { createSharedArtifactAccessor, } from "./data-providers.js";
|
|
|
6
6
|
import { resolveScanInputs } from "./input-resolver.js";
|
|
7
7
|
import { buildExternalIngestResult, buildResult, buildRunResult, formatError, shouldPersist, } from "./result-builder.js";
|
|
8
8
|
import { StrategyRegistry, } from "./strategy-registry.js";
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
10
|
+
import { SpanStatusCode } from "@opentelemetry/api";
|
|
11
|
+
import { withSpan } from "../../telemetry/tracing.js";
|
|
12
|
+
import { setTraceIdentityAttributes } from "../../telemetry/trace-identity.js";
|
|
13
|
+
/** Maps a terminal scan status to the coarse span outcome attribute. */
|
|
14
|
+
function scanOutcome(status) {
|
|
15
|
+
if (status === ScanStatusEnum.ERROR)
|
|
16
|
+
return "error";
|
|
17
|
+
if (status === ScanStatusEnum.SKIPPED ||
|
|
18
|
+
status === ScanStatusEnum.HALTED ||
|
|
19
|
+
status === ScanStatusEnum.DISABLED) {
|
|
20
|
+
return "skipped";
|
|
21
|
+
}
|
|
22
|
+
return "ok";
|
|
23
|
+
}
|
|
9
24
|
/** Runtime engine for scanner registration, scheduling, and one-off execution. */
|
|
10
25
|
export class ScannerEngine {
|
|
11
26
|
deps;
|
|
@@ -15,6 +30,10 @@ export class ScannerEngine {
|
|
|
15
30
|
registry;
|
|
16
31
|
started = false;
|
|
17
32
|
inFlight = new Set();
|
|
33
|
+
// Identity is immutable per boot, so resolve it once and reuse across runs. The build is
|
|
34
|
+
// guarded: a failing identity builder must never abort a scan.
|
|
35
|
+
identity;
|
|
36
|
+
identityResolved = false;
|
|
18
37
|
constructor(deps, composition, registry) {
|
|
19
38
|
this.deps = deps;
|
|
20
39
|
this.composition = composition;
|
|
@@ -22,6 +41,20 @@ export class ScannerEngine {
|
|
|
22
41
|
this.now = deps.now ?? Date.now;
|
|
23
42
|
this.registry = registry ?? new StrategyRegistry();
|
|
24
43
|
}
|
|
44
|
+
resolveIdentity() {
|
|
45
|
+
if (!this.identityResolved) {
|
|
46
|
+
this.identityResolved = true;
|
|
47
|
+
try {
|
|
48
|
+
this.identity = this.deps.identity?.();
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
this.deps.logger?.warn?.("Failed to build trace identity; continuing without it.", {
|
|
52
|
+
error,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return this.identity;
|
|
57
|
+
}
|
|
25
58
|
/** Registers one scanner for one strategy runtime. */
|
|
26
59
|
register(strategy, scanner) {
|
|
27
60
|
this.registry.registerStrategy(strategy);
|
|
@@ -160,16 +193,47 @@ export class ScannerEngine {
|
|
|
160
193
|
timestamp: attemptTimestamp,
|
|
161
194
|
});
|
|
162
195
|
this.registry.setLastScanTime(address, scannerId, attemptTimestamp);
|
|
196
|
+
return withSpan("scanner.run", {}, (span) => this.runScan(entry, address, scannerId, attemptTimestamp, span));
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Runs the interval-scan body under the scanner.run span. Identity stamping sits inside the
|
|
200
|
+
* try so the `finally` always clears the in-flight marker, even if the stamp ever throws.
|
|
201
|
+
* runOnce swallows errors into a failure ScanResult, so withSpan's auto-record never fires —
|
|
202
|
+
* the span is painted explicitly here.
|
|
203
|
+
*/
|
|
204
|
+
async runScan(entry, address, scannerId, attemptTimestamp, span) {
|
|
205
|
+
const runId = randomUUID();
|
|
163
206
|
try {
|
|
207
|
+
span.setAttribute("senpi.run.id", runId);
|
|
208
|
+
// The scanner kind (signal type), so a trace shows which scanner ran, not just its instance id.
|
|
209
|
+
span.setAttribute("senpi.scanner.type", entry.scanner.definition.signalType);
|
|
210
|
+
const id = this.resolveIdentity();
|
|
211
|
+
if (id)
|
|
212
|
+
await setTraceIdentityAttributes(id);
|
|
164
213
|
const runtime = await this.ensureInitializedRuntime(entry);
|
|
165
214
|
const context = await this.buildPreparedContext(entry, runtime, attemptTimestamp);
|
|
166
|
-
const output = await entry.scanner.scan(context)
|
|
215
|
+
const output = await withSpan("scanner.scan", {}, () => entry.scanner.scan(context),
|
|
216
|
+
// SkipScan is a control signal, not a failure — propagate it without painting the span.
|
|
217
|
+
{ expected: (err) => err instanceof SkipScan });
|
|
167
218
|
const result = buildRunResult(entry, context, output, this.now, this.deps.logger);
|
|
219
|
+
result.runId = runId;
|
|
220
|
+
this.stampRunSpan(span, result);
|
|
168
221
|
return this.commitRunResult(entry.address, entry.scanner.definition.id, result);
|
|
169
222
|
}
|
|
170
223
|
catch (error) {
|
|
171
224
|
const result = this.buildFailureResult(entry, error);
|
|
172
|
-
|
|
225
|
+
result.runId = runId;
|
|
226
|
+
this.stampRunSpan(span, result);
|
|
227
|
+
// SkipScan is an expected control signal, not an error.
|
|
228
|
+
if (error instanceof SkipScan) {
|
|
229
|
+
span.setAttribute("senpi.scanner.outcome", "skipped");
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
span.recordException(error);
|
|
233
|
+
span.setStatus({
|
|
234
|
+
code: SpanStatusCode.ERROR,
|
|
235
|
+
message: error instanceof Error ? error.message : String(error),
|
|
236
|
+
});
|
|
173
237
|
this.deps.logger?.error?.("Scanner run failed.", {
|
|
174
238
|
address,
|
|
175
239
|
scannerId,
|
|
@@ -182,6 +246,14 @@ export class ScannerEngine {
|
|
|
182
246
|
this.registry.setLastScanTime(address, scannerId, null);
|
|
183
247
|
}
|
|
184
248
|
}
|
|
249
|
+
/** Stamps the scanner.run span attributes from a terminal interval-scan result. */
|
|
250
|
+
stampRunSpan(span, result) {
|
|
251
|
+
span.setAttribute("senpi.scanner.id", result.scannerId);
|
|
252
|
+
span.setAttribute("senpi.scanner.outcome", scanOutcome(result.status));
|
|
253
|
+
span.setAttribute("senpi.scanner.scanned_count", result.scannedCount);
|
|
254
|
+
span.setAttribute("senpi.scanner.actionable_count", result.actionableCount);
|
|
255
|
+
span.setAttribute("senpi.scanner.signal_count", result.signals.length);
|
|
256
|
+
}
|
|
185
257
|
/**
|
|
186
258
|
* Accepts one externally supplied signal/context payload for a push-driven
|
|
187
259
|
* scanner.
|
|
@@ -202,8 +274,25 @@ export class ScannerEngine {
|
|
|
202
274
|
}
|
|
203
275
|
const attemptTimestamp = this.now();
|
|
204
276
|
this.registry.setLastScanTime(address, request.scanner, attemptTimestamp);
|
|
277
|
+
// Reduced scanner.run variant: external ingests have no input.* children and no scanned_count.
|
|
278
|
+
return withSpan("scanner.run", {}, (span) => this.runExternalIngest(entry, address, request, attemptTimestamp, span));
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Runs the external-ingest body under the reduced scanner.run span. Identity stamping sits
|
|
282
|
+
* inside the try so the `finally` always clears the in-flight marker. This path rethrows on
|
|
283
|
+
* failure, so withSpan's auto-record paints ERROR; outcome=error is set for symmetry.
|
|
284
|
+
*/
|
|
285
|
+
async runExternalIngest(entry, address, request, attemptTimestamp, span) {
|
|
286
|
+
const runId = randomUUID();
|
|
205
287
|
let emittedRunStart = false;
|
|
206
288
|
try {
|
|
289
|
+
span.setAttribute("senpi.run.id", runId);
|
|
290
|
+
span.setAttribute("senpi.scanner.id", request.scanner);
|
|
291
|
+
span.setAttribute("senpi.scanner.type", entry.scanner.definition.signalType);
|
|
292
|
+
span.setAttribute("senpi.scanner.origin", "external");
|
|
293
|
+
const id = this.resolveIdentity();
|
|
294
|
+
if (id)
|
|
295
|
+
await setTraceIdentityAttributes(id);
|
|
207
296
|
const runtimeConfig = (await this.getConfig(address, request.scanner));
|
|
208
297
|
const prepared = prepareExternalScannerIngest({
|
|
209
298
|
address,
|
|
@@ -222,6 +311,9 @@ export class ScannerEngine {
|
|
|
222
311
|
await this.ensureInitializedRuntime(entry);
|
|
223
312
|
await this.persistExternalContextIfNeeded(entry, prepared);
|
|
224
313
|
const result = buildExternalIngestResult(entry, prepared, () => attemptTimestamp, this.deps.logger);
|
|
314
|
+
result.runId = runId;
|
|
315
|
+
span.setAttribute("senpi.scanner.signal_count", result.signals.length);
|
|
316
|
+
span.setAttribute("senpi.scanner.outcome", "ok");
|
|
225
317
|
await this.commitRunResult(address, request.scanner, result);
|
|
226
318
|
return {
|
|
227
319
|
accepted: true,
|
|
@@ -233,10 +325,12 @@ export class ScannerEngine {
|
|
|
233
325
|
};
|
|
234
326
|
}
|
|
235
327
|
catch (error) {
|
|
328
|
+
span.setAttribute("senpi.scanner.outcome", "error");
|
|
236
329
|
if (!emittedRunStart) {
|
|
237
330
|
throw error;
|
|
238
331
|
}
|
|
239
332
|
const failure = this.buildFailureResult(entry, error);
|
|
333
|
+
failure.runId = runId;
|
|
240
334
|
this.emitRunResult(failure);
|
|
241
335
|
if (error instanceof ExternalScannerIngestError) {
|
|
242
336
|
throw error;
|