@pellux/goodvibes-sdk 0.21.29 → 0.21.33
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/_internal/contracts/zod-schemas/accounts.d.ts +9 -9
- package/dist/_internal/contracts/zod-schemas/auth.d.ts +1 -1
- package/dist/_internal/daemon/context.d.ts +1 -0
- package/dist/_internal/daemon/context.d.ts.map +1 -1
- package/dist/_internal/daemon/error-response.js +22 -22
- package/dist/_internal/daemon/integration-route-types.d.ts +2 -1
- package/dist/_internal/daemon/integration-route-types.d.ts.map +1 -1
- package/dist/_internal/daemon/knowledge-routes.js +5 -5
- package/dist/_internal/daemon/media-routes.d.ts.map +1 -1
- package/dist/_internal/daemon/media-routes.js +4 -3
- package/dist/_internal/daemon/operator.d.ts +1 -1
- package/dist/_internal/daemon/operator.d.ts.map +1 -1
- package/dist/_internal/daemon/operator.js +2 -0
- package/dist/_internal/daemon/runtime-route-types.d.ts +2 -1
- package/dist/_internal/daemon/runtime-route-types.d.ts.map +1 -1
- package/dist/_internal/daemon/runtime-routes.d.ts +1 -1
- package/dist/_internal/daemon/runtime-routes.d.ts.map +1 -1
- package/dist/_internal/daemon/runtime-routes.js +1 -0
- package/dist/_internal/daemon/telemetry-routes.d.ts.map +1 -1
- package/dist/_internal/daemon/telemetry-routes.js +13 -12
- package/dist/_internal/errors/daemon-error-contract.d.ts +17 -0
- package/dist/_internal/errors/daemon-error-contract.d.ts.map +1 -1
- package/dist/_internal/errors/daemon-error-contract.js +17 -1
- package/dist/_internal/errors/index.d.ts +2 -1
- package/dist/_internal/errors/index.d.ts.map +1 -1
- package/dist/_internal/errors/index.js +1 -0
- package/dist/_internal/platform/artifacts/store.d.ts.map +1 -1
- package/dist/_internal/platform/artifacts/store.js +2 -1
- package/dist/_internal/platform/automation/scheduler-capacity.d.ts +29 -0
- package/dist/_internal/platform/automation/scheduler-capacity.d.ts.map +1 -0
- package/dist/_internal/platform/automation/scheduler-capacity.js +31 -0
- package/dist/_internal/platform/channels/delivery/shared.d.ts.map +1 -1
- package/dist/_internal/platform/channels/delivery/shared.js +3 -2
- package/dist/_internal/platform/channels/delivery/strategies-bridge.d.ts.map +1 -1
- package/dist/_internal/platform/channels/delivery/strategies-bridge.js +3 -2
- package/dist/_internal/platform/channels/delivery/strategies-core.d.ts.map +1 -1
- package/dist/_internal/platform/channels/delivery/strategies-core.js +5 -4
- package/dist/_internal/platform/channels/delivery/strategies-enterprise.d.ts.map +1 -1
- package/dist/_internal/platform/channels/delivery/strategies-enterprise.js +4 -3
- package/dist/_internal/platform/companion/companion-chat-rate-limiter.d.ts +7 -0
- package/dist/_internal/platform/companion/companion-chat-rate-limiter.d.ts.map +1 -1
- package/dist/_internal/platform/companion/companion-chat-rate-limiter.js +16 -0
- package/dist/_internal/platform/config/manager.d.ts.map +1 -1
- package/dist/_internal/platform/config/manager.js +2 -1
- package/dist/_internal/platform/config/schema-domain-runtime.d.ts +6 -0
- package/dist/_internal/platform/config/schema-domain-runtime.d.ts.map +1 -1
- package/dist/_internal/platform/config/schema-domain-runtime.js +22 -0
- package/dist/_internal/platform/config/schema-types.d.ts +16 -2
- package/dist/_internal/platform/config/schema-types.d.ts.map +1 -1
- package/dist/_internal/platform/config/schema.d.ts.map +1 -1
- package/dist/_internal/platform/config/schema.js +1 -0
- package/dist/_internal/platform/config/service-registry.d.ts.map +1 -1
- package/dist/_internal/platform/config/service-registry.js +2 -1
- package/dist/_internal/platform/control-plane/gateway-web-ui.d.ts +0 -1
- package/dist/_internal/platform/control-plane/gateway-web-ui.d.ts.map +1 -1
- package/dist/_internal/platform/control-plane/gateway-web-ui.js +7 -6
- package/dist/_internal/platform/control-plane/gateway.d.ts.map +1 -1
- package/dist/_internal/platform/control-plane/gateway.js +7 -0
- package/dist/_internal/platform/control-plane/session-broker.d.ts.map +1 -1
- package/dist/_internal/platform/control-plane/session-broker.js +38 -5
- package/dist/_internal/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
- package/dist/_internal/platform/core/orchestrator-tool-runtime.js +6 -6
- package/dist/_internal/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
- package/dist/_internal/platform/core/orchestrator-turn-loop.js +10 -2
- package/dist/_internal/platform/core/orchestrator.d.ts.map +1 -1
- package/dist/_internal/platform/core/orchestrator.js +2 -0
- package/dist/_internal/platform/daemon/facade-composition.d.ts +4 -131
- package/dist/_internal/platform/daemon/facade-composition.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/facade-composition.js +9 -10
- package/dist/_internal/platform/daemon/facade-types.d.ts +141 -0
- package/dist/_internal/platform/daemon/facade-types.d.ts.map +1 -0
- package/dist/_internal/platform/daemon/facade-types.js +1 -0
- package/dist/_internal/platform/daemon/http/rate-limiter.d.ts +23 -0
- package/dist/_internal/platform/daemon/http/rate-limiter.d.ts.map +1 -0
- package/dist/_internal/platform/daemon/http/rate-limiter.js +71 -0
- package/dist/_internal/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/http/router-route-contexts.js +2 -1
- package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/http/router.js +90 -66
- package/dist/_internal/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/http-listener.d.ts +14 -0
- package/dist/_internal/platform/daemon/http-listener.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/http-listener.js +92 -86
- package/dist/_internal/platform/daemon/surface-delivery.d.ts.map +1 -1
- package/dist/_internal/platform/daemon/surface-delivery.js +6 -5
- package/dist/_internal/platform/discovery/mcp-scanner.d.ts.map +1 -1
- package/dist/_internal/platform/discovery/mcp-scanner.js +28 -22
- package/dist/_internal/platform/discovery/scanner.d.ts.map +1 -1
- package/dist/_internal/platform/discovery/scanner.js +38 -22
- package/dist/_internal/platform/export/session-export.d.ts +0 -1
- package/dist/_internal/platform/export/session-export.d.ts.map +1 -1
- package/dist/_internal/platform/export/session-export.js +1 -33
- package/dist/_internal/platform/hooks/runners/http.d.ts.map +1 -1
- package/dist/_internal/platform/hooks/runners/http.js +15 -1
- package/dist/_internal/platform/hooks/types.d.ts +7 -0
- package/dist/_internal/platform/hooks/types.d.ts.map +1 -1
- package/dist/_internal/platform/integrations/delivery.d.ts +3 -1
- package/dist/_internal/platform/integrations/delivery.d.ts.map +1 -1
- package/dist/_internal/platform/integrations/delivery.js +3 -2
- package/dist/_internal/platform/integrations/discord.d.ts.map +1 -1
- package/dist/_internal/platform/integrations/discord.js +6 -5
- package/dist/_internal/platform/integrations/ntfy.d.ts.map +1 -1
- package/dist/_internal/platform/integrations/ntfy.js +3 -2
- package/dist/_internal/platform/integrations/webhooks.d.ts.map +1 -1
- package/dist/_internal/platform/integrations/webhooks.js +12 -1
- package/dist/_internal/platform/intelligence/lsp/binary-downloader.d.ts.map +1 -1
- package/dist/_internal/platform/intelligence/lsp/binary-downloader.js +4 -3
- package/dist/_internal/platform/knowledge/store.d.ts.map +1 -1
- package/dist/_internal/platform/knowledge/store.js +50 -25
- package/dist/_internal/platform/mcp/client.d.ts.map +1 -1
- package/dist/_internal/platform/mcp/client.js +3 -2
- package/dist/_internal/platform/media/builtin-generation-providers.d.ts.map +1 -1
- package/dist/_internal/platform/media/builtin-generation-providers.js +4 -3
- package/dist/_internal/platform/media/builtin-image-understanding.d.ts.map +1 -1
- package/dist/_internal/platform/media/builtin-image-understanding.js +5 -4
- package/dist/_internal/platform/providers/anthropic-compat.d.ts.map +1 -1
- package/dist/_internal/platform/providers/anthropic-compat.js +5 -3
- package/dist/_internal/platform/providers/anthropic.d.ts.map +1 -1
- package/dist/_internal/platform/providers/anthropic.js +10 -7
- package/dist/_internal/platform/providers/builtin-catalog.d.ts.map +1 -1
- package/dist/_internal/platform/providers/builtin-catalog.js +3 -2
- package/dist/_internal/platform/providers/catalogue.d.ts +56 -0
- package/dist/_internal/platform/providers/catalogue.d.ts.map +1 -0
- package/dist/_internal/platform/providers/catalogue.js +111 -0
- package/dist/_internal/platform/providers/context-discovery.d.ts.map +1 -1
- package/dist/_internal/platform/providers/context-discovery.js +2 -1
- package/dist/_internal/platform/providers/credentials.d.ts +12 -0
- package/dist/_internal/platform/providers/credentials.d.ts.map +1 -0
- package/dist/_internal/platform/providers/credentials.js +54 -0
- package/dist/_internal/platform/providers/gemini.d.ts.map +1 -1
- package/dist/_internal/platform/providers/gemini.js +6 -5
- package/dist/_internal/platform/providers/github-copilot.d.ts.map +1 -1
- package/dist/_internal/platform/providers/github-copilot.js +2 -1
- package/dist/_internal/platform/providers/health.d.ts +15 -0
- package/dist/_internal/platform/providers/health.d.ts.map +1 -0
- package/dist/_internal/platform/providers/health.js +32 -0
- package/dist/_internal/platform/providers/llama-cpp.d.ts.map +1 -1
- package/dist/_internal/platform/providers/llama-cpp.js +5 -3
- package/dist/_internal/platform/providers/lm-studio.d.ts.map +1 -1
- package/dist/_internal/platform/providers/lm-studio.js +5 -3
- package/dist/_internal/platform/providers/model-benchmarks.d.ts.map +1 -1
- package/dist/_internal/platform/providers/model-benchmarks.js +2 -1
- package/dist/_internal/platform/providers/model-catalog-cache.d.ts.map +1 -1
- package/dist/_internal/platform/providers/model-catalog-cache.js +2 -1
- package/dist/_internal/platform/providers/model-limits.d.ts.map +1 -1
- package/dist/_internal/platform/providers/model-limits.js +2 -1
- package/dist/_internal/platform/providers/ollama.d.ts.map +1 -1
- package/dist/_internal/platform/providers/ollama.js +5 -3
- package/dist/_internal/platform/providers/openai-codex.d.ts.map +1 -1
- package/dist/_internal/platform/providers/openai-codex.js +4 -2
- package/dist/_internal/platform/providers/openai-compat.d.ts.map +1 -1
- package/dist/_internal/platform/providers/openai-compat.js +3 -2
- package/dist/_internal/platform/providers/provider-not-found-error.d.ts +3 -1
- package/dist/_internal/platform/providers/provider-not-found-error.d.ts.map +1 -1
- package/dist/_internal/platform/providers/provider-not-found-error.js +3 -4
- package/dist/_internal/platform/providers/well-known-endpoints.d.ts +53 -0
- package/dist/_internal/platform/providers/well-known-endpoints.d.ts.map +1 -0
- package/dist/_internal/platform/providers/well-known-endpoints.js +52 -0
- package/dist/_internal/platform/runtime/auth/oauth-core.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/auth/oauth-core.js +2 -1
- package/dist/_internal/platform/runtime/bootstrap-runtime-events.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/bootstrap-runtime-events.js +2 -0
- package/dist/_internal/platform/runtime/contracts/index.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/contracts/index.js +1 -5
- package/dist/_internal/platform/runtime/contracts/migrations/schemas.d.ts +57 -0
- package/dist/_internal/platform/runtime/contracts/migrations/schemas.d.ts.map +1 -0
- package/dist/_internal/platform/runtime/contracts/migrations/schemas.js +157 -0
- package/dist/_internal/platform/runtime/correlation.d.ts +44 -0
- package/dist/_internal/platform/runtime/correlation.d.ts.map +1 -0
- package/dist/_internal/platform/runtime/correlation.js +40 -0
- package/dist/_internal/platform/runtime/emitters/security.d.ts +32 -0
- package/dist/_internal/platform/runtime/emitters/security.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/emitters/security.js +26 -0
- package/dist/_internal/platform/runtime/emitters/tools.d.ts +11 -2
- package/dist/_internal/platform/runtime/emitters/tools.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/emitters/tools.js +27 -0
- package/dist/_internal/platform/runtime/emitters/transport.d.ts +27 -0
- package/dist/_internal/platform/runtime/emitters/transport.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/emitters/transport.js +19 -0
- package/dist/_internal/platform/runtime/emitters/turn.d.ts +22 -1
- package/dist/_internal/platform/runtime/emitters/turn.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/emitters/turn.js +9 -0
- package/dist/_internal/platform/runtime/events/index.d.ts +45 -0
- package/dist/_internal/platform/runtime/events/index.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/events/index.js +130 -22
- package/dist/_internal/platform/runtime/events/ops.d.ts +8 -0
- package/dist/_internal/platform/runtime/events/ops.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/events/security.d.ts +47 -0
- package/dist/_internal/platform/runtime/events/security.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/events/tools.d.ts +14 -2
- package/dist/_internal/platform/runtime/events/tools.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/events/transport.d.ts +31 -0
- package/dist/_internal/platform/runtime/events/transport.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/events/turn.d.ts +25 -1
- package/dist/_internal/platform/runtime/events/turn.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/events/workspace.d.ts +16 -0
- package/dist/_internal/platform/runtime/events/workspace.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/integration/helpers.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/integration/helpers.js +5 -0
- package/dist/_internal/platform/runtime/llm-observability.d.ts +43 -0
- package/dist/_internal/platform/runtime/llm-observability.d.ts.map +1 -0
- package/dist/_internal/platform/runtime/llm-observability.js +107 -0
- package/dist/_internal/platform/runtime/metrics.d.ts +49 -0
- package/dist/_internal/platform/runtime/metrics.d.ts.map +1 -0
- package/dist/_internal/platform/runtime/metrics.js +114 -0
- package/dist/_internal/platform/runtime/ops/control-plane.d.ts +5 -2
- package/dist/_internal/platform/runtime/ops/control-plane.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/ops/control-plane.js +5 -4
- package/dist/_internal/platform/runtime/perf/slo-collector.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/perf/slo-collector.js +2 -0
- package/dist/_internal/platform/runtime/permissions/divergence-dashboard.d.ts +3 -1
- package/dist/_internal/platform/runtime/permissions/divergence-dashboard.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/permissions/divergence-dashboard.js +3 -2
- package/dist/_internal/platform/runtime/permissions/policy-loader.d.ts +3 -1
- package/dist/_internal/platform/runtime/permissions/policy-loader.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/permissions/policy-loader.js +3 -2
- package/dist/_internal/platform/runtime/permissions/policy-signer.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/permissions/policy-signer.js +7 -2
- package/dist/_internal/platform/runtime/permissions/simulation.d.ts +3 -1
- package/dist/_internal/platform/runtime/permissions/simulation.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/permissions/simulation.js +3 -2
- package/dist/_internal/platform/runtime/remote/transport-contract.d.ts +14 -2
- package/dist/_internal/platform/runtime/remote/transport-contract.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/remote/transport-contract.js +7 -5
- package/dist/_internal/platform/runtime/store/helpers/reducers/sync.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/store/helpers/reducers/sync.js +12 -1
- package/dist/_internal/platform/runtime/tasks/manager.d.ts +7 -3
- package/dist/_internal/platform/runtime/tasks/manager.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/tasks/manager.js +7 -6
- package/dist/_internal/platform/runtime/telemetry/api-helpers.d.ts +14 -0
- package/dist/_internal/platform/runtime/telemetry/api-helpers.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/telemetry/api-helpers.js +59 -0
- package/dist/_internal/platform/runtime/telemetry/api.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/telemetry/api.js +19 -4
- package/dist/_internal/platform/runtime/telemetry/exporters/otlp.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/telemetry/exporters/otlp.js +19 -6
- package/dist/_internal/platform/runtime/telemetry/exporters/queue.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/telemetry/exporters/queue.js +11 -4
- package/dist/_internal/platform/runtime/telemetry/meter.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/telemetry/meter.js +7 -3
- package/dist/_internal/platform/runtime/telemetry/redaction-config.d.ts +9 -0
- package/dist/_internal/platform/runtime/telemetry/redaction-config.d.ts.map +1 -0
- package/dist/_internal/platform/runtime/telemetry/redaction-config.js +52 -0
- package/dist/_internal/platform/runtime/tools/phases/budget.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/tools/phases/budget.js +3 -2
- package/dist/_internal/platform/runtime/transports/daemon-http-client.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/transports/daemon-http-client.js +138 -17
- package/dist/_internal/platform/scheduler/scheduler.d.ts +19 -2
- package/dist/_internal/platform/scheduler/scheduler.d.ts.map +1 -1
- package/dist/_internal/platform/scheduler/scheduler.js +65 -25
- package/dist/_internal/platform/sessions/manager.d.ts.map +1 -1
- package/dist/_internal/platform/sessions/manager.js +6 -2
- package/dist/_internal/platform/state/memory-embedding-http.d.ts.map +1 -1
- package/dist/_internal/platform/state/memory-embedding-http.js +3 -2
- package/dist/_internal/platform/state/project-index.d.ts.map +1 -1
- package/dist/_internal/platform/state/project-index.js +6 -4
- package/dist/_internal/platform/tools/agent/index.d.ts.map +1 -1
- package/dist/_internal/platform/tools/agent/index.js +2 -1
- package/dist/_internal/platform/tools/analyze/git-modes.d.ts.map +1 -1
- package/dist/_internal/platform/tools/analyze/git-modes.js +2 -1
- package/dist/_internal/platform/tools/edit/core.d.ts.map +1 -1
- package/dist/_internal/platform/tools/edit/core.js +2 -1
- package/dist/_internal/platform/tools/exec/runtime.d.ts.map +1 -1
- package/dist/_internal/platform/tools/exec/runtime.js +3 -2
- package/dist/_internal/platform/tools/fetch/runtime.d.ts.map +1 -1
- package/dist/_internal/platform/tools/fetch/runtime.js +4 -2
- package/dist/_internal/platform/tools/read/index.d.ts.map +1 -1
- package/dist/_internal/platform/tools/read/index.js +2 -1
- package/dist/_internal/platform/tools/registry-tool/index.d.ts.map +1 -1
- package/dist/_internal/platform/tools/registry-tool/index.js +2 -1
- package/dist/_internal/platform/tools/state/index.d.ts.map +1 -1
- package/dist/_internal/platform/tools/state/index.js +2 -1
- package/dist/_internal/platform/tools/task/index.d.ts.map +1 -1
- package/dist/_internal/platform/tools/task/index.js +2 -1
- package/dist/_internal/platform/tools/team/index.d.ts.map +1 -1
- package/dist/_internal/platform/tools/team/index.js +2 -1
- package/dist/_internal/platform/tools/web-search/index.d.ts.map +1 -1
- package/dist/_internal/platform/tools/web-search/index.js +2 -1
- package/dist/_internal/platform/tools/worklist/index.d.ts.map +1 -1
- package/dist/_internal/platform/tools/worklist/index.js +2 -1
- package/dist/_internal/platform/types/errors.d.ts +12 -10
- package/dist/_internal/platform/types/errors.d.ts.map +1 -1
- package/dist/_internal/platform/types/errors.js +21 -20
- package/dist/_internal/platform/utils/error-display.d.ts.map +1 -1
- package/dist/_internal/platform/utils/error-display.js +6 -4
- package/dist/_internal/platform/utils/fetch-with-timeout.d.ts +17 -0
- package/dist/_internal/platform/utils/fetch-with-timeout.d.ts.map +1 -1
- package/dist/_internal/platform/utils/fetch-with-timeout.js +59 -0
- package/dist/_internal/platform/utils/record-coerce.d.ts +11 -0
- package/dist/_internal/platform/utils/record-coerce.d.ts.map +1 -0
- package/dist/_internal/platform/utils/record-coerce.js +12 -0
- package/dist/_internal/platform/utils/redaction.js +1 -1
- package/dist/_internal/platform/utils/ring-buffer.d.ts +54 -0
- package/dist/_internal/platform/utils/ring-buffer.d.ts.map +1 -0
- package/dist/_internal/platform/utils/ring-buffer.js +96 -0
- package/dist/_internal/platform/utils/shell-split.d.ts +11 -0
- package/dist/_internal/platform/utils/shell-split.d.ts.map +1 -0
- package/dist/_internal/platform/utils/shell-split.js +83 -0
- package/dist/_internal/platform/version.js +1 -1
- package/dist/_internal/platform/voice/providers/deepgram.d.ts.map +1 -1
- package/dist/_internal/platform/voice/providers/deepgram.js +2 -1
- package/dist/_internal/platform/voice/providers/elevenlabs.d.ts.map +1 -1
- package/dist/_internal/platform/voice/providers/elevenlabs.js +5 -4
- package/dist/_internal/platform/voice/providers/google.d.ts.map +1 -1
- package/dist/_internal/platform/voice/providers/google.js +5 -4
- package/dist/_internal/platform/voice/providers/microsoft.d.ts.map +1 -1
- package/dist/_internal/platform/voice/providers/microsoft.js +2 -1
- package/dist/_internal/platform/voice/providers/openai.d.ts.map +1 -1
- package/dist/_internal/platform/voice/providers/openai.js +4 -3
- package/dist/_internal/platform/voice/providers/shared.d.ts.map +1 -1
- package/dist/_internal/platform/voice/providers/shared.js +2 -1
- package/dist/_internal/platform/voice/providers/vydra.d.ts.map +1 -1
- package/dist/_internal/platform/voice/providers/vydra.js +3 -2
- package/dist/_internal/platform/watchers/registry.d.ts.map +1 -1
- package/dist/_internal/platform/watchers/registry.js +3 -2
- package/dist/_internal/platform/workflow/trigger-executor.d.ts.map +1 -1
- package/dist/_internal/platform/workflow/trigger-executor.js +5 -3
- package/dist/_internal/platform/workspace/daemon-home.d.ts.map +1 -1
- package/dist/_internal/platform/workspace/daemon-home.js +6 -2
- package/dist/_internal/platform/workspace/workspace-swap-manager.d.ts +1 -0
- package/dist/_internal/platform/workspace/workspace-swap-manager.d.ts.map +1 -1
- package/dist/_internal/platform/workspace/workspace-swap-manager.js +14 -2
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@ import { buildOperatorContract } from '../../control-plane/operator-contract.js'
|
|
|
5
5
|
import { getProviderRuntimeSnapshot, getProviderUsageSnapshot, listProviderRuntimeSnapshots, } from '../../providers/runtime-snapshot.js';
|
|
6
6
|
import { inspectKnowledgeGraphqlAccess } from '../../knowledge/index.js';
|
|
7
7
|
import { emitCompanionMessageReceived } from '../../runtime/emitters/session.js';
|
|
8
|
+
import { correlationCtx } from '../../runtime/correlation.js';
|
|
8
9
|
import { TelemetryApiService } from '../../runtime/telemetry/api.js';
|
|
9
10
|
import { inspectInboundTls, inspectOutboundTls } from '../../runtime/network/index.js';
|
|
10
11
|
import { dispatchDaemonApiRoutes } from '../../control-plane/routes/index.js';
|
|
@@ -13,6 +14,7 @@ import { createDaemonKnowledgeRouteHandlers } from './knowledge-routes.js';
|
|
|
13
14
|
import { createDaemonMediaRouteHandlers } from './media-routes.js';
|
|
14
15
|
import { createDaemonRemoteRouteHandlers, handleRemotePairRequest, handleRemotePairVerify, handleRemotePeerHeartbeat, handleRemotePeerWorkPull, handleRemotePeerWorkComplete, } from './remote-routes.js';
|
|
15
16
|
import { createDaemonRuntimeRouteHandlers } from './runtime-routes.js';
|
|
17
|
+
import { snapshotMetrics } from '../../runtime/metrics.js';
|
|
16
18
|
import { createDaemonControlRouteHandlers } from './control-routes.js';
|
|
17
19
|
import { createDaemonIntegrationRouteHandlers } from './integration-routes.js';
|
|
18
20
|
import { createDaemonTelemetryRouteHandlers } from './telemetry-routes.js';
|
|
@@ -40,75 +42,77 @@ export class DaemonHttpRouter {
|
|
|
40
42
|
this.telemetryApi?.dispose();
|
|
41
43
|
}
|
|
42
44
|
async handleRequest(req) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
45
|
+
return correlationCtx.run({ requestId: req.headers.get('x-request-id') ?? crypto.randomUUID() }, async () => {
|
|
46
|
+
const url = new URL(req.url);
|
|
47
|
+
if (url.pathname === '/login' && req.method === 'POST') {
|
|
48
|
+
return this.handleLogin(req);
|
|
49
|
+
}
|
|
50
|
+
if (url.pathname === '/api/remote/pair/request' && req.method === 'POST') {
|
|
51
|
+
return handleRemotePairRequest({
|
|
52
|
+
parseJsonBody: (request) => this.parseJsonBody(request),
|
|
53
|
+
distributedRuntime: this.context.distributedRuntime,
|
|
54
|
+
}, req);
|
|
55
|
+
}
|
|
56
|
+
if (url.pathname === '/api/remote/pair/verify' && req.method === 'POST') {
|
|
57
|
+
return handleRemotePairVerify({
|
|
58
|
+
parseJsonBody: (request) => this.parseJsonBody(request),
|
|
59
|
+
distributedRuntime: this.context.distributedRuntime,
|
|
60
|
+
}, req);
|
|
61
|
+
}
|
|
62
|
+
if (url.pathname === '/api/remote/heartbeat' && req.method === 'POST') {
|
|
63
|
+
return handleRemotePeerHeartbeat({
|
|
64
|
+
parseJsonBody: (request) => this.parseJsonBody(request),
|
|
65
|
+
requireRemotePeer: (request, scope) => this.context.requireRemotePeer(request, scope),
|
|
66
|
+
distributedRuntime: this.context.distributedRuntime,
|
|
67
|
+
}, req);
|
|
68
|
+
}
|
|
69
|
+
if (url.pathname === '/api/remote/work/pull' && req.method === 'POST') {
|
|
70
|
+
return handleRemotePeerWorkPull({
|
|
71
|
+
parseJsonBody: (request) => this.parseJsonBody(request),
|
|
72
|
+
requireRemotePeer: (request, scope) => this.context.requireRemotePeer(request, scope),
|
|
73
|
+
distributedRuntime: this.context.distributedRuntime,
|
|
74
|
+
}, req);
|
|
75
|
+
}
|
|
76
|
+
const remoteWorkCompleteMatch = url.pathname.match(/^\/api\/remote\/work\/([^/]+)\/complete$/);
|
|
77
|
+
if (remoteWorkCompleteMatch && req.method === 'POST') {
|
|
78
|
+
return handleRemotePeerWorkComplete({
|
|
79
|
+
parseJsonBody: (request) => this.parseJsonBody(request),
|
|
80
|
+
requireRemotePeer: (request, scope) => this.context.requireRemotePeer(request, scope),
|
|
81
|
+
distributedRuntime: this.context.distributedRuntime,
|
|
82
|
+
}, remoteWorkCompleteMatch[1], req);
|
|
83
|
+
}
|
|
84
|
+
if (url.pathname === '/webhook/github' && req.method === 'POST') {
|
|
85
|
+
return this.handleGitHubWebhook(req);
|
|
86
|
+
}
|
|
87
|
+
if (url.pathname.startsWith('/webhook/')) {
|
|
88
|
+
const pluginResponse = await this.context.channelPlugins.handleInbound(url.pathname, req);
|
|
89
|
+
if (pluginResponse)
|
|
90
|
+
return pluginResponse;
|
|
91
|
+
}
|
|
92
|
+
if (url.pathname === '/api/control-plane/web' && req.method === 'GET') {
|
|
93
|
+
return this.context.controlPlaneGateway.renderWebUi();
|
|
94
|
+
}
|
|
95
|
+
if ((url.pathname === '/api/control-plane/auth' || url.pathname === '/api/control-plane/whoami') && req.method === 'GET') {
|
|
96
|
+
const apiResponse = await this.dispatchApiRoutes(req);
|
|
97
|
+
if (apiResponse)
|
|
98
|
+
return apiResponse;
|
|
99
|
+
}
|
|
100
|
+
if (!this.context.checkAuth(req)) {
|
|
101
|
+
return jsonErrorResponse(new AppError('Authentication required', 'AUTH_REQUIRED', false, {
|
|
102
|
+
category: 'authentication',
|
|
103
|
+
source: 'runtime',
|
|
104
|
+
guidance: 'Authenticate with the operator shared token or an authenticated user session before calling daemon APIs.',
|
|
105
|
+
}), { status: 401 });
|
|
106
|
+
}
|
|
93
107
|
const apiResponse = await this.dispatchApiRoutes(req);
|
|
94
108
|
if (apiResponse)
|
|
95
109
|
return apiResponse;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return jsonErrorResponse(new AppError('Authentication required', 'AUTH_REQUIRED', false, {
|
|
99
|
-
category: 'authentication',
|
|
110
|
+
return jsonErrorResponse(new AppError(`Route not found: ${url.pathname}`, 'NOT_FOUND', false, {
|
|
111
|
+
category: 'not_found',
|
|
100
112
|
source: 'runtime',
|
|
101
|
-
guidance: '
|
|
102
|
-
}), { status:
|
|
103
|
-
}
|
|
104
|
-
const apiResponse = await this.dispatchApiRoutes(req);
|
|
105
|
-
if (apiResponse)
|
|
106
|
-
return apiResponse;
|
|
107
|
-
return jsonErrorResponse(new AppError(`Route not found: ${url.pathname}`, 'NOT_FOUND', false, {
|
|
108
|
-
category: 'not_found',
|
|
109
|
-
source: 'runtime',
|
|
110
|
-
guidance: 'Check the daemon API path and version. New SDK-facing routes are published under /api/v1.',
|
|
111
|
-
}), { status: 404 });
|
|
113
|
+
guidance: 'Check the daemon API path and version. New SDK-facing routes are published under /api/v1.',
|
|
114
|
+
}), { status: 404 });
|
|
115
|
+
});
|
|
112
116
|
}
|
|
113
117
|
async dispatchApiRoutes(req) {
|
|
114
118
|
// Companion chat routes — scoped to /api/companion/chat/..., session-isolated.
|
|
@@ -295,6 +299,7 @@ export class DaemonHttpRouter {
|
|
|
295
299
|
// subscribe and render the companion message in the conversation view.
|
|
296
300
|
emitCompanionMessageReceived(this.context.runtimeBus, { sessionId, traceId: `companion:${envelope.messageId}`, source: 'companion-followup' }, { sessionId, ...envelope });
|
|
297
301
|
},
|
|
302
|
+
snapshotMetrics: () => snapshotMetrics(),
|
|
298
303
|
openSessionEventStream: (req, sessionId) => {
|
|
299
304
|
// Create a session-scoped SSE stream for the companion app to receive
|
|
300
305
|
// turn events (STREAM_DELTA, TURN_COMPLETED, etc.) and agent events.
|
|
@@ -351,15 +356,34 @@ export class DaemonHttpRouter {
|
|
|
351
356
|
});
|
|
352
357
|
}
|
|
353
358
|
async parseJsonBody(req) {
|
|
359
|
+
// SEC-05: cap inbound JSON bodies at 1 MiB to prevent memory exhaustion.
|
|
360
|
+
const MAX_JSON_BYTES = 1 * 1024 * 1024; // 1 MiB
|
|
361
|
+
const contentLength = req.headers.get('content-length');
|
|
362
|
+
if (contentLength !== null && Number(contentLength) > MAX_JSON_BYTES) {
|
|
363
|
+
return Response.json({ error: 'Request body too large' }, { status: 413 });
|
|
364
|
+
}
|
|
354
365
|
try {
|
|
355
|
-
|
|
366
|
+
const text = await req.text();
|
|
367
|
+
if (text.length > MAX_JSON_BYTES) {
|
|
368
|
+
return Response.json({ error: 'Request body too large' }, { status: 413 });
|
|
369
|
+
}
|
|
370
|
+
return this.parseJsonText(text);
|
|
356
371
|
}
|
|
357
372
|
catch {
|
|
358
373
|
return Response.json({ error: 'Invalid JSON body' }, { status: 400 });
|
|
359
374
|
}
|
|
360
375
|
}
|
|
361
376
|
async parseOptionalJsonBody(req) {
|
|
377
|
+
// SEC-05: cap inbound JSON bodies at 1 MiB to prevent memory exhaustion.
|
|
378
|
+
const MAX_JSON_BYTES = 1 * 1024 * 1024; // 1 MiB
|
|
379
|
+
const contentLength = req.headers.get('content-length');
|
|
380
|
+
if (contentLength !== null && Number(contentLength) > MAX_JSON_BYTES) {
|
|
381
|
+
return Response.json({ error: 'Request body too large' }, { status: 413 });
|
|
382
|
+
}
|
|
362
383
|
const raw = await req.text();
|
|
384
|
+
if (raw.length > MAX_JSON_BYTES) {
|
|
385
|
+
return Response.json({ error: 'Request body too large' }, { status: 413 });
|
|
386
|
+
}
|
|
363
387
|
if (!raw.trim())
|
|
364
388
|
return null;
|
|
365
389
|
return this.parseJsonText(raw);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-route-types.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/daemon/http/runtime-route-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,KAAK,EAAE,yBAAyB,IAAI,4BAA4B,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-route-types.d.ts","sourceRoot":"","sources":["../../../../../src/_internal/platform/daemon/http/runtime-route-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,KAAK,EAAE,yBAAyB,IAAI,4BAA4B,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAU1E,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC3C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;CAC5C;AACD,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,KAAK,eAAe,GAAG;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AACF,KAAK,iBAAiB,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AACjD,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AACF,UAAU,eAAe;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,4BAA4B,EAAE,eAAe,CAAC;IACpG,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACvE,QAAQ,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;IACtF,QAAQ,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC;IACzF,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,IAAI,CAAC;IACzD,QAAQ,CAAC,aAAa,EAAE;QACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,aAAa,CAAC,KAAK,EAAE;YACnB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,qBAAqB,CAAC;YACnC,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,EAAE,0BAA0B,CAAC;SACtC,GAAG,OAAO,CAAC;YACV,IAAI,EAAE,gBAAgB,GAAG,OAAO,GAAG,kBAAkB,GAAG,UAAU,CAAC;YACnE,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,0BAA0B,CAAA;aAAE,CAAC;YAC5D,OAAO,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC;YACxC,YAAY,CAAC,EAAE,sBAAsB,CAAC;YACtC,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;SACvB,CAAC,CAAC;QACH,YAAY,CAAC,KAAK,EAAE;YAClB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,qBAAqB,CAAC;YACnC,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,EAAE,0BAA0B,CAAC;YACrC,kBAAkB,CAAC,EAAE,OAAO,CAAC;SAC9B,GAAG,OAAO,CAAC;YACV,IAAI,EAAE,gBAAgB,GAAG,OAAO,GAAG,kBAAkB,GAAG,UAAU,CAAC;YACnE,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,0BAA0B,CAAA;aAAE,CAAC;YAC3E,OAAO,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC;YACxC,YAAY,CAAC,EAAE,sBAAsB,CAAC;YACtC,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;SACvB,CAAC,CAAC;QACH,eAAe,CAAC,KAAK,EAAE;YACrB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,WAAW,EAAE,qBAAqB,CAAC;YACnC,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,EAAE,0BAA0B,CAAC;SACtC,GAAG,OAAO,CAAC;YACV,IAAI,EAAE,gBAAgB,GAAG,OAAO,GAAG,kBAAkB,GAAG,UAAU,CAAC;YACnE,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,0BAA0B,CAAA;aAAE,CAAC;YAC3E,OAAO,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC;YACxC,YAAY,CAAC,EAAE,sBAAsB,CAAC;YACtC,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;SACvB,CAAC,CAAC;QACH,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChE,aAAa,CAAC,KAAK,EAAE;YACnB,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnC,YAAY,CAAC,EAAE,sBAAsB,CAAC;YACtC,WAAW,CAAC,EAAE;gBACZ,WAAW,EAAE,qBAAqB,CAAC;gBACnC,SAAS,EAAE,MAAM,CAAC;gBAClB,UAAU,CAAC,EAAE,MAAM,CAAC;gBACpB,MAAM,CAAC,EAAE,MAAM,CAAC;gBAChB,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,UAAU,EAAE,MAAM,CAAC;aACpB,CAAC;SACH,GAAG,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC5B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,aAAa,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACnH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;QACzD,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;QACvD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC,CAAC;QAChE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC,CAAC;QACjE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACzE,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9H,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;YAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;YAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;YAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;SACzB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACtB,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE;QACrB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;QACnD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,iBAAiB,EAAE;QAC1B,QAAQ,IAAI,iBAAiB,EAAE,CAAC;QAChC,QAAQ,IAAI,iBAAiB,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC;QAC5D,gBAAgB,CAAC,KAAK,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAClE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1C,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACtE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;QAC5F,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;QAC/E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACjF,oBAAoB,IAAI;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC;KACjI,CAAC;IACF,QAAQ,CAAC,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACtD,QAAQ,CAAC,sBAAsB,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3F,QAAQ,CAAC,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IACxG,QAAQ,CAAC,aAAa,EAAE;QACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAAC;KAC5D,CAAC;IACF,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE;QAC9B,IAAI,EAAE,OAAO,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,eAAe,CAAC;KACnC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,eAAe,GAAG,QAAQ,CAAC;IACvE,QAAQ,CAAC,4BAA4B,EAAE,CACrC,OAAO,EAAE,sBAAsB,GAAG,SAAS,EAC3C,KAAK,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;KAAE,KACrF,IAAI,CAAC;IACV,QAAQ,CAAC,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,QAAQ,KAAK,OAAO,CAAC;IACxN,QAAQ,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrF,QAAQ,CAAC,qBAAqB,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAClE,QAAQ,CAAC,aAAa,EAAE;QACtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE;QAAE,QAAQ,IAAI;YAAE,KAAK,EAAE,oBAAoB,CAAA;SAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9E,QAAQ,CAAC,eAAe,EAAE;QACxB,qBAAqB,CACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,MAAM,GACb,IAAI,CAAC;KACT,GAAG,IAAI,CAAC;CACV;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,sBAAsB,EACpB,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,wBAAwB,GACxB,yBAAyB,GACzB,qBAAqB,GACrB,oBAAoB,GACpB,qBAAqB,GACrB,yBAAyB,GACzB,qBAAqB,GACrB,UAAU,GACV,kBAAkB,GAClB,oBAAoB,GACpB,qBAAqB,GACrB,0BAA0B,GAC1B,wBAAwB,GACxB,0BAA0B,GAC1B,wBAAwB,GACxB,2BAA2B,GAC3B,0BAA0B,GAC1B,gBAAgB,GAChB,mBAAmB,GACnB,eAAe,GACf,cAAc,GACd,cAAc,GACd,gBAAgB,GAChB,oBAAoB,GACpB,gBAAgB,GAChB,sBAAsB,CACzB,CAAC"}
|
|
@@ -18,6 +18,17 @@ interface HttpListenerConfig {
|
|
|
18
18
|
* reverse proxy. Overrides the httpListener.trustProxy config value when set.
|
|
19
19
|
*/
|
|
20
20
|
trustProxy?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* When true, CORS enforcement is active:
|
|
23
|
+
* - Constructor refuses to start when hostMode=network and allowedOrigins is empty
|
|
24
|
+
* - Requests carrying an Origin header are validated against allowedOrigins
|
|
25
|
+
* Default: false (permissive — no CORS enforcement). Opt-in for multi-user,
|
|
26
|
+
* internet-exposed, or enterprise deployments where browser-based CSRF is a
|
|
27
|
+
* concern. Home/single-user local deployments do not need this and the default
|
|
28
|
+
* behavior matches pre-0.21.29 semantics. When true, allowedOrigins must be
|
|
29
|
+
* configured (or hostMode must be local/loopback) — see SEC-07.
|
|
30
|
+
*/
|
|
31
|
+
enforceCors?: boolean;
|
|
21
32
|
/** Pre-configured UserAuthManager owned by the runtime service graph. */
|
|
22
33
|
userAuth: UserAuthManager;
|
|
23
34
|
}
|
|
@@ -40,6 +51,8 @@ export declare class HttpListener {
|
|
|
40
51
|
private port;
|
|
41
52
|
private host;
|
|
42
53
|
private allowedOrigins;
|
|
54
|
+
/** SEC-07: opt-in strict CORS enforcement. Default false (permissive). */
|
|
55
|
+
private enforceCors;
|
|
43
56
|
private hookDispatcher;
|
|
44
57
|
private authToken;
|
|
45
58
|
private userAuth;
|
|
@@ -90,6 +103,7 @@ export declare class HttpListener {
|
|
|
90
103
|
private checkAuth;
|
|
91
104
|
private parseJsonBody;
|
|
92
105
|
private handleRequest;
|
|
106
|
+
private _handleRequestInner;
|
|
93
107
|
private handleLogin;
|
|
94
108
|
private handleWebhook;
|
|
95
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-listener.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/http-listener.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-listener.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/http-listener.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMxD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAYrD,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IAChC,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yEAAyE;IACzE,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,UAAU,gBAAgB;IACxB,YAAY,EAAE,OAAO,CAAC;CACvB;AAMD;;;;;;;;GAQG;AACH,qBAAa,YAAY;IA4BX,OAAO,CAAC,MAAM;IA3B1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,cAAc,CAAW;IACjC,0EAA0E;IAC1E,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,WAAW,CAAc;IACjC,6DAA6D;IAC7D,OAAO,CAAC,gBAAgB,CAAc;IACtC,6EAA6E;IAC7E,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAA0C;IAC1D,4EAA4E;IAC5E,OAAO,CAAC,iBAAiB,CAA6B;IACtD,gFAAgF;IAChF,OAAO,CAAC,WAAW,CAAS;IAC5B,sEAAsE;IACtE,OAAO,CAAC,kBAAkB,CAA8B;IACxD,0FAA0F;IAC1F,OAAO,CAAC,aAAa,CAAS;gBAEV,MAAM,EAAE,kBAAkB;IAoC9C;;;;OAIG;IACH,MAAM,CAAC,YAAY,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAU/D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B;;;OAGG;IACH,OAAO,CAAC,gCAAgC;IAwDxC;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAMD,OAAO,CAAC,SAAS;YAOH,aAAa;YAsBb,aAAa;YAiCb,mBAAmB;YA4DnB,WAAW;YAiDX,aAAa;CAgD5B"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
1
2
|
import { logger } from '../utils/logger.js';
|
|
3
|
+
import { authFailureTotal, authSuccessTotal, httpRequestDurationMs, httpRequestsTotal, } from '../runtime/metrics.js';
|
|
2
4
|
import { HookDispatcher } from '../hooks/dispatcher.js';
|
|
3
5
|
import { authenticateOperatorRequest, buildOperatorSessionCookie, } from '../security/http-auth.js';
|
|
4
6
|
import { UserAuthManager } from '../security/user-auth.js';
|
|
@@ -8,68 +10,7 @@ import { summarizeError } from '../utils/error-display.js';
|
|
|
8
10
|
import { requirePortAvailable } from './port-check.js';
|
|
9
11
|
import { resolveHostBinding } from './host-resolver.js';
|
|
10
12
|
import { createHostModeRestartWatcher } from './host-mode-watcher.js';
|
|
11
|
-
|
|
12
|
-
// Rate limiter (sliding window per IP, in-memory)
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
const RATE_WINDOW_MS = 60_000;
|
|
15
|
-
/** Entries older than this are eligible for TTL eviction. Default: 10 minutes. */
|
|
16
|
-
const RATE_TTL_MS = 10 * 60_000;
|
|
17
|
-
/** Maximum number of IP entries kept in the limiter at any time (LRU eviction). */
|
|
18
|
-
const RATE_MAX_ENTRIES = 10_000;
|
|
19
|
-
/** How often the background sweep runs to evict expired entries (ms). */
|
|
20
|
-
const RATE_SWEEP_INTERVAL_MS = 60_000;
|
|
21
|
-
class RateLimiter {
|
|
22
|
-
limit;
|
|
23
|
-
/** hits[ip] = sorted ascending array of request timestamps within the window */
|
|
24
|
-
counts = new Map();
|
|
25
|
-
/** Insertion-order LRU: tracks which IP was most recently active */
|
|
26
|
-
accessOrder = [];
|
|
27
|
-
sweepInterval = null;
|
|
28
|
-
constructor(limit) {
|
|
29
|
-
this.limit = limit;
|
|
30
|
-
// Periodic sweep to evict entries whose TTL has expired (C5 fix)
|
|
31
|
-
this.sweepInterval = setInterval(() => this._sweep(), RATE_SWEEP_INTERVAL_MS);
|
|
32
|
-
}
|
|
33
|
-
/** Returns true if the request is allowed, false if rate-limited. */
|
|
34
|
-
check(ip) {
|
|
35
|
-
const now = Date.now();
|
|
36
|
-
const windowStart = now - RATE_WINDOW_MS;
|
|
37
|
-
const hits = (this.counts.get(ip) ?? []).filter((t) => t > windowStart);
|
|
38
|
-
hits.push(now);
|
|
39
|
-
this.counts.set(ip, hits);
|
|
40
|
-
// Maintain LRU access order
|
|
41
|
-
const idx = this.accessOrder.indexOf(ip);
|
|
42
|
-
if (idx !== -1)
|
|
43
|
-
this.accessOrder.splice(idx, 1);
|
|
44
|
-
this.accessOrder.push(ip);
|
|
45
|
-
// Evict oldest entry when cap is exceeded
|
|
46
|
-
if (this.accessOrder.length > RATE_MAX_ENTRIES) {
|
|
47
|
-
const evict = this.accessOrder.shift();
|
|
48
|
-
this.counts.delete(evict);
|
|
49
|
-
}
|
|
50
|
-
return hits.length <= this.limit;
|
|
51
|
-
}
|
|
52
|
-
/** Stop the background sweep interval. Call this when the listener stops. */
|
|
53
|
-
stop() {
|
|
54
|
-
if (this.sweepInterval !== null) {
|
|
55
|
-
clearInterval(this.sweepInterval);
|
|
56
|
-
this.sweepInterval = null;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/** Evict entries whose last-seen timestamp is older than RATE_TTL_MS. */
|
|
60
|
-
_sweep() {
|
|
61
|
-
const cutoff = Date.now() - RATE_TTL_MS;
|
|
62
|
-
for (const [ip, hits] of this.counts) {
|
|
63
|
-
// If the most recent hit is older than TTL, the entry is stale
|
|
64
|
-
if (hits.length === 0 || hits[hits.length - 1] < cutoff) {
|
|
65
|
-
this.counts.delete(ip);
|
|
66
|
-
const idx = this.accessOrder.indexOf(ip);
|
|
67
|
-
if (idx !== -1)
|
|
68
|
-
this.accessOrder.splice(idx, 1);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
13
|
+
import { RateLimiter } from './http/rate-limiter.js';
|
|
73
14
|
// ---------------------------------------------------------------------------
|
|
74
15
|
// HttpListener
|
|
75
16
|
// ---------------------------------------------------------------------------
|
|
@@ -89,6 +30,8 @@ export class HttpListener {
|
|
|
89
30
|
port;
|
|
90
31
|
host;
|
|
91
32
|
allowedOrigins;
|
|
33
|
+
/** SEC-07: opt-in strict CORS enforcement. Default false (permissive). */
|
|
34
|
+
enforceCors;
|
|
92
35
|
hookDispatcher;
|
|
93
36
|
authToken = null;
|
|
94
37
|
userAuth;
|
|
@@ -115,14 +58,17 @@ export class HttpListener {
|
|
|
115
58
|
this.port = config.port ?? resolvedHttpBinding.port;
|
|
116
59
|
this.host = config.host ?? resolvedHttpBinding.host;
|
|
117
60
|
this.allowedOrigins = config.allowedOrigins ?? [];
|
|
118
|
-
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
61
|
+
this.enforceCors = config.enforceCors ?? false;
|
|
62
|
+
// SEC-07: When enforceCors is true, refuse to construct with hostMode=network + empty allowedOrigins.
|
|
63
|
+
// Off by default — home and single-user local deployments don't need CORS enforcement.
|
|
64
|
+
// Enterprise / multi-user / internet-exposed deployments set enforceCors: true to gate against CSRF.
|
|
65
|
+
if (this.enforceCors) {
|
|
66
|
+
const effectiveHostMode = this.configManager.get('httpListener.hostMode') ?? 'local';
|
|
67
|
+
if (effectiveHostMode === 'network' && this.allowedOrigins.length === 0) {
|
|
68
|
+
throw new Error('SECURITY_UNSAFE_ORIGIN_CONFIG: hostMode=network with enforceCors=true requires non-empty allowedOrigins. '
|
|
69
|
+
+ 'Set config.httpListener.allowedOrigins to a list of trusted origins '
|
|
70
|
+
+ "(e.g. ['https://companion.example.com']), or leave enforceCors unset for permissive mode.");
|
|
71
|
+
}
|
|
126
72
|
}
|
|
127
73
|
this.hookDispatcher = config.hookDispatcher ?? null;
|
|
128
74
|
this.userAuth = config.userAuth;
|
|
@@ -288,8 +234,18 @@ export class HttpListener {
|
|
|
288
234
|
}) !== null;
|
|
289
235
|
}
|
|
290
236
|
async parseJsonBody(req) {
|
|
237
|
+
// SEC-05: cap inbound JSON bodies at 1 MiB to prevent memory exhaustion.
|
|
238
|
+
const MAX_JSON_BYTES = 1 * 1024 * 1024; // 1 MiB
|
|
239
|
+
const contentLength = req.headers.get('content-length');
|
|
240
|
+
if (contentLength !== null && Number(contentLength) > MAX_JSON_BYTES) {
|
|
241
|
+
return Response.json({ error: 'Request body too large' }, { status: 413 });
|
|
242
|
+
}
|
|
291
243
|
try {
|
|
292
|
-
|
|
244
|
+
const text = await req.text();
|
|
245
|
+
if (text.length > MAX_JSON_BYTES) {
|
|
246
|
+
return Response.json({ error: 'Request body too large' }, { status: 413 });
|
|
247
|
+
}
|
|
248
|
+
return JSON.parse(text);
|
|
293
249
|
}
|
|
294
250
|
catch {
|
|
295
251
|
return Response.json({ error: 'Invalid JSON body' }, { status: 400 });
|
|
@@ -299,23 +255,53 @@ export class HttpListener {
|
|
|
299
255
|
// Request handling
|
|
300
256
|
// -------------------------------------------------------------------------
|
|
301
257
|
async handleRequest(req) {
|
|
258
|
+
const requestId = randomUUID();
|
|
259
|
+
const startMs = Date.now();
|
|
302
260
|
const url = new URL(req.url);
|
|
303
261
|
const clientIp = extractForwardedClientIp(req, this.trustProxy || (this.tlsState?.trustProxy ?? false)) ?? 'unknown';
|
|
304
|
-
|
|
305
|
-
|
|
262
|
+
let response = null;
|
|
263
|
+
try {
|
|
264
|
+
response = await this._handleRequestInner(req, url, clientIp, requestId);
|
|
265
|
+
return response;
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
const status = response?.status ?? 500;
|
|
269
|
+
const latencyMs = Date.now() - startMs;
|
|
270
|
+
// OBS-01: structured HTTP access log — SIEM-ingestable
|
|
271
|
+
logger.info('HTTP_ACCESS_LOG', {
|
|
272
|
+
type: 'HTTP_ACCESS_LOG',
|
|
273
|
+
requestId,
|
|
274
|
+
method: req.method,
|
|
275
|
+
path: url.pathname,
|
|
276
|
+
status,
|
|
277
|
+
latencyMs,
|
|
278
|
+
clientIp,
|
|
279
|
+
});
|
|
280
|
+
// C-1: record HTTP metric instruments
|
|
281
|
+
const statusClass = status >= 500 ? '5xx' : status >= 400 ? '4xx' : '2xx';
|
|
282
|
+
const pathPattern = url.pathname.replace(/\/[0-9a-f-]{8,}(?=\/|$)/gi, '/:id');
|
|
283
|
+
httpRequestsTotal.add(1, { method: req.method, status_class: statusClass });
|
|
284
|
+
httpRequestDurationMs.record(latencyMs, { method: req.method, path_pattern: pathPattern, status_class: statusClass });
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async _handleRequestInner(req, url, clientIp, requestId) {
|
|
288
|
+
// SEC-07: CORS origin check is OPT-IN via enforceCors. Default is permissive
|
|
289
|
+
// (home/single-user deployments) — pre-0.21.29 behavior preserved. When
|
|
290
|
+
// enforceCors is true:
|
|
306
291
|
// - No Origin header → same-origin or non-browser request → allow.
|
|
307
|
-
// - Origin present + allowedOrigins empty → no allowlist configured;
|
|
308
|
-
//
|
|
309
|
-
//
|
|
310
|
-
// empty allowedOrigins at startup, but defence-in-depth covers the request path.
|
|
292
|
+
// - Origin present + allowedOrigins empty → no allowlist configured; 403 CORS_NOT_CONFIGURED.
|
|
293
|
+
// (Constructor already refuses hostMode=network + empty allowlist at startup; this is
|
|
294
|
+
// defence-in-depth for non-network modes configured with enforceCors.)
|
|
311
295
|
// - Origin present + allowedOrigins non-empty → check allowlist.
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
if (
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
296
|
+
if (this.enforceCors) {
|
|
297
|
+
const origin = req.headers.get('origin');
|
|
298
|
+
if (origin !== null) {
|
|
299
|
+
if (this.allowedOrigins.length === 0) {
|
|
300
|
+
return Response.json({ error: 'CORS_NOT_CONFIGURED: no allowedOrigins set' }, { status: 403 });
|
|
301
|
+
}
|
|
302
|
+
if (!this.allowedOrigins.includes(origin)) {
|
|
303
|
+
return Response.json({ error: 'ORIGIN_NOT_ALLOWED' }, { status: 403 });
|
|
304
|
+
}
|
|
319
305
|
}
|
|
320
306
|
}
|
|
321
307
|
// SEC-03: /login route handled AFTER origin check and under its own tight
|
|
@@ -325,7 +311,7 @@ export class HttpListener {
|
|
|
325
311
|
if (!this.loginRateLimiter.check(clientIp)) {
|
|
326
312
|
return Response.json({ error: 'Too many requests' }, { status: 429 });
|
|
327
313
|
}
|
|
328
|
-
return this.handleLogin(req);
|
|
314
|
+
return this.handleLogin(req, clientIp, requestId);
|
|
329
315
|
}
|
|
330
316
|
// General rate limiting for all other routes.
|
|
331
317
|
if (!this.rateLimiter.check(clientIp)) {
|
|
@@ -344,7 +330,7 @@ export class HttpListener {
|
|
|
344
330
|
}
|
|
345
331
|
return Response.json({ error: 'Not found' }, { status: 404 });
|
|
346
332
|
}
|
|
347
|
-
async handleLogin(req) {
|
|
333
|
+
async handleLogin(req, clientIp, requestId) {
|
|
348
334
|
const body = await this.parseJsonBody(req);
|
|
349
335
|
if (body instanceof Response)
|
|
350
336
|
return body;
|
|
@@ -352,9 +338,29 @@ export class HttpListener {
|
|
|
352
338
|
const password = typeof body.password === 'string' ? body.password : '';
|
|
353
339
|
const user = this.userAuth.authenticate(username, password);
|
|
354
340
|
if (!user) {
|
|
341
|
+
// OBS-02: AUTH_FAILED — never log credential values
|
|
342
|
+
logger.warn('AUTH_FAILED', {
|
|
343
|
+
type: 'AUTH_FAILED',
|
|
344
|
+
requestId,
|
|
345
|
+
usernameAttempted: username,
|
|
346
|
+
clientIp,
|
|
347
|
+
reason: 'invalid_credentials',
|
|
348
|
+
});
|
|
349
|
+
// C-1: record auth failure metric
|
|
350
|
+
authFailureTotal.add(1);
|
|
355
351
|
return Response.json({ error: 'Invalid credentials' }, { status: 401 });
|
|
356
352
|
}
|
|
357
353
|
const session = this.userAuth.createSession(user.username);
|
|
354
|
+
// OBS-02: AUTH_SUCCEEDED — never log credential values
|
|
355
|
+
// C-1: record auth success metric
|
|
356
|
+
authSuccessTotal.add(1);
|
|
357
|
+
logger.info('AUTH_SUCCEEDED', {
|
|
358
|
+
type: 'AUTH_SUCCEEDED',
|
|
359
|
+
requestId,
|
|
360
|
+
username: user.username,
|
|
361
|
+
clientIp,
|
|
362
|
+
method: 'password',
|
|
363
|
+
});
|
|
358
364
|
return Response.json({
|
|
359
365
|
authenticated: true,
|
|
360
366
|
token: session.token,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface-delivery.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/surface-delivery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAK7G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"surface-delivery.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/daemon/surface-delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { SlackIntegration, DiscordIntegration, NtfyIntegration } from '../integr
|
|
|
3
3
|
import { logger } from '../utils/logger.js';
|
|
4
4
|
import { validatePublicWebhookUrl } from '../utils/url-safety.js';
|
|
5
5
|
import { summarizeError } from '../utils/error-display.js';
|
|
6
|
+
import { instrumentedFetch } from '../utils/fetch-with-timeout.js';
|
|
6
7
|
function isSupportedDeliverySurface(surface) {
|
|
7
8
|
return surface === 'slack'
|
|
8
9
|
|| surface === 'discord'
|
|
@@ -116,7 +117,7 @@ export class DaemonSurfaceDeliveryHelper {
|
|
|
116
117
|
?? process.env.SLACK_BOT_TOKEN;
|
|
117
118
|
const slack = new SlackIntegration(webhookUrl ?? undefined, botToken ?? undefined);
|
|
118
119
|
if (pending.responseUrl) {
|
|
119
|
-
await
|
|
120
|
+
await instrumentedFetch(pending.responseUrl, {
|
|
120
121
|
method: 'POST',
|
|
121
122
|
headers: { 'Content-Type': 'application/json' },
|
|
122
123
|
body: JSON.stringify({
|
|
@@ -153,7 +154,7 @@ export class DaemonSurfaceDeliveryHelper {
|
|
|
153
154
|
?? process.env.SLACK_BOT_TOKEN;
|
|
154
155
|
const slack = new SlackIntegration(webhookUrl ?? undefined, botToken ?? undefined);
|
|
155
156
|
if (pending.responseUrl) {
|
|
156
|
-
await
|
|
157
|
+
await instrumentedFetch(pending.responseUrl, {
|
|
157
158
|
method: 'POST',
|
|
158
159
|
headers: { 'Content-Type': 'application/json' },
|
|
159
160
|
body: JSON.stringify({
|
|
@@ -237,7 +238,7 @@ export class DaemonSurfaceDeliveryHelper {
|
|
|
237
238
|
else if (secret && pending.callbackSignature === 'shared-secret') {
|
|
238
239
|
headers.set('X-Goodvibes-Webhook-Secret', secret);
|
|
239
240
|
}
|
|
240
|
-
await
|
|
241
|
+
await instrumentedFetch(validation.url, {
|
|
241
242
|
method: 'POST',
|
|
242
243
|
headers,
|
|
243
244
|
signal: AbortSignal.timeout(timeoutMs),
|
|
@@ -379,7 +380,7 @@ export class DaemonSurfaceDeliveryHelper {
|
|
|
379
380
|
]
|
|
380
381
|
: undefined;
|
|
381
382
|
if (typeof binding.metadata.responseUrl === 'string' && binding.metadata.responseUrl.startsWith('https://')) {
|
|
382
|
-
await
|
|
383
|
+
await instrumentedFetch(binding.metadata.responseUrl, {
|
|
383
384
|
method: 'POST',
|
|
384
385
|
headers: { 'Content-Type': 'application/json' },
|
|
385
386
|
body: JSON.stringify({
|
|
@@ -450,7 +451,7 @@ export class DaemonSurfaceDeliveryHelper {
|
|
|
450
451
|
if (secret) {
|
|
451
452
|
headers.set('X-Goodvibes-Signature', this.signWebhookPayload(payload, secret));
|
|
452
453
|
}
|
|
453
|
-
await
|
|
454
|
+
await instrumentedFetch(validation.url, {
|
|
454
455
|
method: 'POST',
|
|
455
456
|
headers,
|
|
456
457
|
body: payload,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-scanner.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/discovery/mcp-scanner.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAIlE,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,eAAe,CAAC,GAAG;IAC7F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AA4KF;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,iBAAiB,EACxB,eAAe,GAAE,GAAG,CAAC,MAAM,CAAa,GACvC,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"mcp-scanner.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/discovery/mcp-scanner.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAIlE,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,kCAAkC;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,eAAe,CAAC,GAAG;IAC7F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AA4KF;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,iBAAiB,EACxB,eAAe,GAAE,GAAG,CAAC,MAAM,CAAa,GACvC,OAAO,CAAC,kBAAkB,CAAC,CAwC7B"}
|