@evalops/maestro 0.10.8 → 0.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/agent/action-approval.d.ts +6 -0
- package/dist/agent/action-approval.d.ts.map +1 -1
- package/dist/agent/action-approval.js.map +1 -1
- package/dist/agent/agent.d.ts +13 -1
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +368 -1
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/auto-compaction.d.ts +4 -4
- package/dist/agent/auto-compaction.d.ts.map +1 -1
- package/dist/agent/auto-compaction.js.map +1 -1
- package/dist/agent/compaction-cleanup.d.ts +2 -0
- package/dist/agent/compaction-cleanup.d.ts.map +1 -1
- package/dist/agent/compaction-cleanup.js +17 -2
- package/dist/agent/compaction-cleanup.js.map +1 -1
- package/dist/agent/compaction.d.ts +3 -1
- package/dist/agent/compaction.d.ts.map +1 -1
- package/dist/agent/compaction.js +10 -2
- package/dist/agent/compaction.js.map +1 -1
- package/dist/agent/context-manager.d.ts +4 -0
- package/dist/agent/context-manager.d.ts.map +1 -1
- package/dist/agent/context-manager.js +8 -0
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/context-providers.d.ts +2 -0
- package/dist/agent/context-providers.d.ts.map +1 -1
- package/dist/agent/context-providers.js +3 -2
- package/dist/agent/context-providers.js.map +1 -1
- package/dist/agent/providers/google-gemini-cli.js +17 -5
- package/dist/agent/providers/google.js +174 -144
- package/dist/agent/providers/openai-codex-responses.d.ts +4 -0
- package/dist/agent/providers/openai-codex-responses.d.ts.map +1 -0
- package/dist/agent/providers/openai-codex-responses.js +637 -0
- package/dist/agent/providers/openai-codex-responses.js.map +1 -0
- package/dist/agent/providers/openai-codex-session.d.ts +18 -0
- package/dist/agent/providers/openai-codex-session.d.ts.map +1 -0
- package/dist/agent/providers/openai-codex-session.js +53 -0
- package/dist/agent/providers/openai-codex-session.js.map +1 -0
- package/dist/agent/providers/openai-responses-sdk.d.ts.map +1 -1
- package/dist/agent/providers/openai-responses-sdk.js +16 -6
- package/dist/agent/providers/openai-responses-sdk.js.map +1 -1
- package/dist/agent/providers/openai-shared.d.ts +12 -5
- package/dist/agent/providers/openai-shared.d.ts.map +1 -1
- package/dist/agent/providers/openai-shared.js +291 -2
- package/dist/agent/providers/openai-shared.js.map +1 -1
- package/dist/agent/providers/openai.d.ts +1 -1
- package/dist/agent/providers/openai.d.ts.map +1 -1
- package/dist/agent/providers/openai.js +48 -20
- package/dist/agent/providers/openai.js.map +1 -1
- package/dist/agent/providers/vertex.js +7 -0
- package/dist/agent/tracing.d.ts +16 -5
- package/dist/agent/tracing.d.ts.map +1 -1
- package/dist/agent/tracing.js +44 -2
- package/dist/agent/tracing.js.map +1 -1
- package/dist/agent/transport/create-provider-stream.d.ts.map +1 -1
- package/dist/agent/transport/create-provider-stream.js +9 -0
- package/dist/agent/transport/create-provider-stream.js.map +1 -1
- package/dist/agent/transport/tool-execution-bridge.d.ts +86 -0
- package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -0
- package/dist/agent/transport/tool-execution-bridge.js +665 -0
- package/dist/agent/transport/tool-execution-bridge.js.map +1 -0
- package/dist/agent/transport/tool-execution.d.ts +3 -0
- package/dist/agent/transport/tool-execution.d.ts.map +1 -1
- package/dist/agent/transport/tool-execution.js +16 -1
- package/dist/agent/transport/tool-execution.js.map +1 -1
- package/dist/agent/transport/tool-safety-pipeline.d.ts +7 -1
- package/dist/agent/transport/tool-safety-pipeline.d.ts.map +1 -1
- package/dist/agent/transport/tool-safety-pipeline.js +207 -40
- package/dist/agent/transport/tool-safety-pipeline.js.map +1 -1
- package/dist/agent/transport/tool-update-queue.d.ts +2 -0
- package/dist/agent/transport/tool-update-queue.d.ts.map +1 -1
- package/dist/agent/transport/tool-update-queue.js.map +1 -1
- package/dist/agent/transport.d.ts +3 -0
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +96 -16
- package/dist/agent/transport.js.map +1 -1
- package/dist/agent/types.d.ts +50 -2
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/approvals/platform-action-approval.d.ts +32 -0
- package/dist/approvals/platform-action-approval.d.ts.map +1 -0
- package/dist/approvals/platform-action-approval.js +210 -0
- package/dist/approvals/platform-action-approval.js.map +1 -0
- package/dist/approvals/service-client.d.ts +56 -0
- package/dist/approvals/service-client.d.ts.map +1 -0
- package/dist/approvals/service-client.js +316 -0
- package/dist/approvals/service-client.js.map +1 -0
- package/dist/audit/logger.d.ts +4 -4
- package/dist/bootstrap/auth-setup.d.ts +2 -2
- package/dist/bootstrap/auth-setup.d.ts.map +1 -1
- package/dist/bootstrap/auth-setup.js +4 -7
- package/dist/bootstrap/auth-setup.js.map +1 -1
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +29 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/codex.d.ts +2 -0
- package/dist/cli/commands/codex.d.ts.map +1 -0
- package/dist/cli/commands/codex.js +65 -0
- package/dist/cli/commands/codex.js.map +1 -0
- package/dist/cli/commands/config.js +1 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/evalops.d.ts +2 -0
- package/dist/cli/commands/evalops.d.ts.map +1 -0
- package/dist/cli/commands/evalops.js +74 -0
- package/dist/cli/commands/evalops.js.map +1 -0
- package/dist/cli/commands/hosted-runner.d.ts +23 -0
- package/dist/cli/commands/hosted-runner.d.ts.map +1 -0
- package/dist/cli/commands/hosted-runner.js +241 -0
- package/dist/cli/commands/hosted-runner.js.map +1 -0
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +140 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +23 -30
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/remote.d.ts +3 -0
- package/dist/cli/commands/remote.d.ts.map +1 -0
- package/dist/cli/commands/remote.js +631 -0
- package/dist/cli/commands/remote.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +7 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +167 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/headless-protocol.d.ts +16 -1
- package/dist/cli/headless-protocol.d.ts.map +1 -1
- package/dist/cli/headless-protocol.js +60 -4
- package/dist/cli/headless-protocol.js.map +1 -1
- package/dist/cli/headless.d.ts.map +1 -1
- package/dist/cli/headless.js +1 -0
- package/dist/cli/headless.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +44 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/jsonl-writer.d.ts.map +1 -1
- package/dist/cli/jsonl-writer.js +19 -6
- package/dist/cli/jsonl-writer.js.map +1 -1
- package/dist/cli-tui/client-tools/client-tool-controller.d.ts.map +1 -1
- package/dist/cli-tui/client-tools/client-tool-controller.js +17 -1
- package/dist/cli-tui/client-tools/client-tool-controller.js.map +1 -1
- package/dist/cli-tui/commands/access-command.js +1 -1
- package/dist/cli-tui/commands/access-command.js.map +1 -1
- package/dist/cli-tui/commands/audit-command.js +1 -1
- package/dist/cli-tui/commands/audit-command.js.map +1 -1
- package/dist/cli-tui/commands/command-catalog.d.ts +29 -0
- package/dist/cli-tui/commands/command-catalog.d.ts.map +1 -0
- package/dist/cli-tui/commands/command-catalog.js +645 -0
- package/dist/cli-tui/commands/command-catalog.js.map +1 -0
- package/dist/cli-tui/commands/command-registry-adapter.d.ts +12 -0
- package/dist/cli-tui/commands/command-registry-adapter.d.ts.map +1 -0
- package/dist/cli-tui/commands/command-registry-adapter.js +120 -0
- package/dist/cli-tui/commands/command-registry-adapter.js.map +1 -0
- package/dist/cli-tui/commands/command-suite-catalog.d.ts +14 -0
- package/dist/cli-tui/commands/command-suite-catalog.d.ts.map +1 -0
- package/dist/cli-tui/commands/command-suite-catalog.js +147 -0
- package/dist/cli-tui/commands/command-suite-catalog.js.map +1 -0
- package/dist/cli-tui/commands/{grouped-command-handlers.d.ts → command-suite-handlers.d.ts} +27 -26
- package/dist/cli-tui/commands/command-suite-handlers.d.ts.map +1 -0
- package/dist/cli-tui/commands/command-suite-handlers.js +110 -0
- package/dist/cli-tui/commands/command-suite-handlers.js.map +1 -0
- package/dist/cli-tui/commands/hotkeys-command.d.ts +1 -1
- package/dist/cli-tui/commands/hotkeys-command.d.ts.map +1 -1
- package/dist/cli-tui/commands/hotkeys-command.js +2 -2
- package/dist/cli-tui/commands/hotkeys-command.js.map +1 -1
- package/dist/cli-tui/commands/limits-command.js +1 -1
- package/dist/cli-tui/commands/limits-command.js.map +1 -1
- package/dist/cli-tui/commands/pii-command.js +1 -1
- package/dist/cli-tui/commands/pii-command.js.map +1 -1
- package/dist/cli-tui/commands/registry.d.ts +1 -1
- package/dist/cli-tui/commands/registry.d.ts.map +1 -1
- package/dist/cli-tui/commands/registry.js +29 -921
- package/dist/cli-tui/commands/registry.js.map +1 -1
- package/dist/cli-tui/commands/{grouped → subcommands}/auth-commands.d.ts +2 -1
- package/dist/cli-tui/commands/subcommands/auth-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/auth-commands.js +22 -6
- package/dist/cli-tui/commands/subcommands/auth-commands.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/config-commands.d.ts +0 -1
- package/dist/cli-tui/commands/subcommands/config-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/config-commands.js +2 -2
- package/dist/cli-tui/commands/subcommands/config-commands.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/diag-commands.d.ts +1 -2
- package/dist/cli-tui/commands/subcommands/diag-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/diag-commands.js +5 -7
- package/dist/cli-tui/commands/subcommands/diag-commands.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/git-commands.d.ts +0 -2
- package/dist/cli-tui/commands/subcommands/git-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/git-commands.js +2 -2
- package/dist/cli-tui/commands/subcommands/git-commands.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/index.d.ts +2 -2
- package/dist/cli-tui/commands/subcommands/index.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/index.js +2 -2
- package/dist/cli-tui/commands/subcommands/index.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/safety-commands.d.ts +0 -1
- package/dist/cli-tui/commands/subcommands/safety-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/safety-commands.js +12 -12
- package/dist/cli-tui/commands/subcommands/safety-commands.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/session-commands.d.ts +1 -2
- package/dist/cli-tui/commands/subcommands/session-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/session-commands.js +3 -3
- package/dist/cli-tui/commands/subcommands/session-commands.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/tools-commands.d.ts +0 -1
- package/dist/cli-tui/commands/subcommands/tools-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/tools-commands.js +2 -2
- package/dist/cli-tui/commands/subcommands/tools-commands.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/ui-commands.d.ts +0 -1
- package/dist/cli-tui/commands/subcommands/ui-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/ui-commands.js +5 -5
- package/dist/cli-tui/commands/subcommands/ui-commands.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/undo-commands.d.ts +1 -2
- package/dist/cli-tui/commands/subcommands/undo-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/undo-commands.js +6 -6
- package/dist/cli-tui/commands/subcommands/undo-commands.js.map +1 -0
- package/dist/cli-tui/commands/subcommands/usage-commands.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/usage-commands.js +2 -2
- package/dist/cli-tui/commands/subcommands/usage-commands.js.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/utils.d.ts +15 -15
- package/dist/cli-tui/commands/subcommands/utils.d.ts.map +1 -0
- package/dist/cli-tui/commands/{grouped → subcommands}/utils.js +13 -8
- package/dist/cli-tui/commands/subcommands/utils.js.map +1 -0
- package/dist/cli-tui/commands/types.d.ts +3 -3
- package/dist/cli-tui/commands/types.d.ts.map +1 -1
- package/dist/cli-tui/commands/types.js.map +1 -1
- package/dist/cli-tui/editor-view.d.ts +1 -1
- package/dist/cli-tui/editor-view.d.ts.map +1 -1
- package/dist/cli-tui/editor-view.js +1 -1
- package/dist/cli-tui/editor-view.js.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.d.ts +4 -0
- package/dist/cli-tui/oauth/oauth-flow-controller.d.ts.map +1 -1
- package/dist/cli-tui/oauth/oauth-flow-controller.js +76 -5
- package/dist/cli-tui/oauth/oauth-flow-controller.js.map +1 -1
- package/dist/cli-tui/run/run-controller.d.ts +2 -2
- package/dist/cli-tui/run/run-controller.d.ts.map +1 -1
- package/dist/cli-tui/run/run-controller.js +3 -2
- package/dist/cli-tui/run/run-controller.js.map +1 -1
- package/dist/cli-tui/run/run-shell-command.d.ts.map +1 -1
- package/dist/cli-tui/run/run-shell-command.js +11 -3
- package/dist/cli-tui/run/run-shell-command.js.map +1 -1
- package/dist/cli-tui/run/streaming-shell-command.d.ts.map +1 -1
- package/dist/cli-tui/run/streaming-shell-command.js +11 -3
- package/dist/cli-tui/run/streaming-shell-command.js.map +1 -1
- package/dist/cli-tui/selectors/model-selector.d.ts.map +1 -1
- package/dist/cli-tui/selectors/model-selector.js +1 -0
- package/dist/cli-tui/selectors/model-selector.js.map +1 -1
- package/dist/cli-tui/tui-renderer/agent-event-bridge.d.ts +8 -0
- package/dist/cli-tui/tui-renderer/agent-event-bridge.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/agent-event-bridge.js +23 -2
- package/dist/cli-tui/tui-renderer/agent-event-bridge.js.map +1 -1
- package/dist/cli-tui/tui-renderer/command-registry-options.d.ts +3 -3
- package/dist/cli-tui/tui-renderer/command-registry-options.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/command-registry-options.js +12 -2
- package/dist/cli-tui/tui-renderer/command-registry-options.js.map +1 -1
- package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts +32 -0
- package/dist/cli-tui/tui-renderer/command-suite-wiring.d.ts.map +1 -0
- package/dist/cli-tui/tui-renderer/command-suite-wiring.js +108 -0
- package/dist/cli-tui/tui-renderer/command-suite-wiring.js.map +1 -0
- package/dist/cli-tui/tui-renderer/input-controller.d.ts +2 -2
- package/dist/cli-tui/tui-renderer/input-controller.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer/input-controller.js +2 -2
- package/dist/cli-tui/tui-renderer/input-controller.js.map +1 -1
- package/dist/cli-tui/tui-renderer/ui-state-controller.d.ts +1 -1
- package/dist/cli-tui/tui-renderer/ui-state-controller.js +1 -1
- package/dist/cli-tui/tui-renderer/ui-state-controller.js.map +1 -1
- package/dist/cli-tui/tui-renderer.d.ts +1 -3
- package/dist/cli-tui/tui-renderer.d.ts.map +1 -1
- package/dist/cli-tui/tui-renderer.js +37 -83
- package/dist/cli-tui/tui-renderer.js.map +1 -1
- package/dist/cli-tui/utils/runtime-badges.d.ts +8 -0
- package/dist/cli-tui/utils/runtime-badges.d.ts.map +1 -1
- package/dist/cli-tui/utils/runtime-badges.js +58 -0
- package/dist/cli-tui/utils/runtime-badges.js.map +1 -1
- package/dist/cli.js +42555 -23133
- package/dist/cli.js.map +1 -1
- package/dist/config/env-vars.d.ts +4 -0
- package/dist/config/env-vars.d.ts.map +1 -1
- package/dist/config/env-vars.js +4 -0
- package/dist/config/env-vars.js.map +1 -1
- package/dist/config/feature-flags.d.ts +44 -0
- package/dist/config/feature-flags.d.ts.map +1 -1
- package/dist/config/feature-flags.js +214 -0
- package/dist/config/feature-flags.js.map +1 -1
- package/dist/connectors/service-client.d.ts +98 -0
- package/dist/connectors/service-client.d.ts.map +1 -0
- package/dist/connectors/service-client.js +459 -0
- package/dist/connectors/service-client.js.map +1 -0
- package/dist/conversation/render-model.d.ts.map +1 -1
- package/dist/conversation/render-model.js +53 -3
- package/dist/conversation/render-model.js.map +1 -1
- package/dist/db/health.d.ts +8 -0
- package/dist/db/health.d.ts.map +1 -0
- package/dist/db/health.js +64 -0
- package/dist/db/health.js.map +1 -0
- package/dist/db/migrate.d.ts +301 -0
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +186 -0
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/migrations/0000_initial.sql +308 -0
- package/dist/db/migrations/0001_shared_sessions.sql +18 -0
- package/dist/db/migrations/0002_usage_metrics.sql +28 -0
- package/dist/db/migrations/0003_execution_traces.sql +18 -0
- package/dist/db/migrations/0004_workspace_config.sql +11 -0
- package/dist/db/migrations/0005_revenue_attribution.sql +31 -0
- package/dist/db/migrations/0006_hosted_session_storage.sql +51 -0
- package/dist/db/migrations/0007_reconcile_legacy_audit_hash_cache.sql +24 -0
- package/dist/db/migrations/0008_reconcile_legacy_webhook_deliveries.sql +290 -0
- package/dist/db/migrations/meta/0000_snapshot.json +2438 -0
- package/dist/db/migrations/meta/_journal.json +69 -0
- package/dist/db/schema.d.ts +2232 -844
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +187 -1
- package/dist/db/schema.js.map +1 -1
- package/dist/evalops/agent-bootstrap.d.ts +73 -0
- package/dist/evalops/agent-bootstrap.d.ts.map +1 -0
- package/dist/evalops/agent-bootstrap.js +380 -0
- package/dist/evalops/agent-bootstrap.js.map +1 -0
- package/dist/export-html.d.ts.map +1 -1
- package/dist/export-html.js +7 -4
- package/dist/export-html.js.map +1 -1
- package/dist/headless/utility-command-manager.d.ts +2 -1
- package/dist/headless/utility-command-manager.d.ts.map +1 -1
- package/dist/headless/utility-command-manager.js +12 -6
- package/dist/headless/utility-command-manager.js.map +1 -1
- package/dist/headless/utility-file-read.d.ts +1 -0
- package/dist/headless/utility-file-read.d.ts.map +1 -1
- package/dist/headless/utility-file-read.js +5 -1
- package/dist/headless/utility-file-read.js.map +1 -1
- package/dist/headless/utility-file-search.d.ts +1 -0
- package/dist/headless/utility-file-search.d.ts.map +1 -1
- package/dist/headless/utility-file-search.js +4 -1
- package/dist/headless/utility-file-search.js.map +1 -1
- package/dist/headless/utility-file-watch-manager.d.ts +2 -1
- package/dist/headless/utility-file-watch-manager.d.ts.map +1 -1
- package/dist/headless/utility-file-watch-manager.js +6 -2
- package/dist/headless/utility-file-watch-manager.js.map +1 -1
- package/dist/headless/workspace-root.d.ts +8 -0
- package/dist/headless/workspace-root.d.ts.map +1 -0
- package/dist/headless/workspace-root.js +74 -0
- package/dist/headless/workspace-root.js.map +1 -0
- package/dist/hooks/notification-hooks.d.ts +5 -0
- package/dist/hooks/notification-hooks.d.ts.map +1 -1
- package/dist/hooks/notification-hooks.js +4 -0
- package/dist/hooks/notification-hooks.js.map +1 -1
- package/dist/lsp/diagnostic-deltas.d.ts +20 -0
- package/dist/lsp/diagnostic-deltas.d.ts.map +1 -0
- package/dist/lsp/diagnostic-deltas.js +92 -0
- package/dist/lsp/diagnostic-deltas.js.map +1 -0
- package/dist/lsp/diagnostic-repair.d.ts +48 -0
- package/dist/lsp/diagnostic-repair.d.ts.map +1 -0
- package/dist/lsp/diagnostic-repair.js +143 -0
- package/dist/lsp/diagnostic-repair.js.map +1 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +127 -37
- package/dist/main.js.map +1 -1
- package/dist/mcp/config.d.ts +4 -2
- package/dist/mcp/config.d.ts.map +1 -1
- package/dist/mcp/config.js +58 -14
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/manager.d.ts +1 -0
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +1 -0
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/platform-plugin.d.ts +3 -0
- package/dist/mcp/platform-plugin.d.ts.map +1 -0
- package/dist/mcp/platform-plugin.js +117 -0
- package/dist/mcp/platform-plugin.js.map +1 -0
- package/dist/mcp/tool-bridge.d.ts +15 -0
- package/dist/mcp/tool-bridge.d.ts.map +1 -1
- package/dist/mcp/tool-bridge.js +194 -6
- package/dist/mcp/tool-bridge.js.map +1 -1
- package/dist/memory/platform-memory-client.d.ts +130 -0
- package/dist/memory/platform-memory-client.d.ts.map +1 -0
- package/dist/memory/platform-memory-client.js +330 -0
- package/dist/memory/platform-memory-client.js.map +1 -0
- package/dist/memory/service-client.d.ts.map +1 -1
- package/dist/memory/service-client.js +1 -2
- package/dist/memory/service-client.js.map +1 -1
- package/dist/models/builtin.d.ts.map +1 -1
- package/dist/models/builtin.js +137 -0
- package/dist/models/builtin.js.map +1 -1
- package/dist/models/config-loader.d.ts +10 -10
- package/dist/models/config-loader.d.ts.map +1 -1
- package/dist/models/config-loader.js +1 -0
- package/dist/models/config-loader.js.map +1 -1
- package/dist/models/registry.d.ts +1 -0
- package/dist/models/registry.d.ts.map +1 -1
- package/dist/models/registry.js +1 -0
- package/dist/models/registry.js.map +1 -1
- package/dist/oauth/connectors.d.ts +25 -0
- package/dist/oauth/connectors.d.ts.map +1 -0
- package/dist/oauth/connectors.js +253 -0
- package/dist/oauth/connectors.js.map +1 -0
- package/dist/oauth/device-identity.d.ts +18 -0
- package/dist/oauth/device-identity.d.ts.map +1 -0
- package/dist/oauth/device-identity.js +193 -0
- package/dist/oauth/device-identity.js.map +1 -0
- package/dist/oauth/evalops.d.ts.map +1 -1
- package/dist/oauth/evalops.js +74 -15
- package/dist/oauth/evalops.js.map +1 -1
- package/dist/oauth/index.d.ts +1 -1
- package/dist/oauth/index.d.ts.map +1 -1
- package/dist/oauth/index.js +31 -1
- package/dist/oauth/index.js.map +1 -1
- package/dist/oauth/openai-codex.d.ts +16 -0
- package/dist/oauth/openai-codex.d.ts.map +1 -0
- package/dist/oauth/openai-codex.js +300 -0
- package/dist/oauth/openai-codex.js.map +1 -0
- package/dist/opentelemetry.d.ts.map +1 -1
- package/dist/opentelemetry.js +9 -2
- package/dist/opentelemetry.js.map +1 -1
- package/dist/platform/agent-runtime-client.d.ts +279 -0
- package/dist/platform/agent-runtime-client.d.ts.map +1 -0
- package/dist/platform/agent-runtime-client.js +515 -0
- package/dist/platform/agent-runtime-client.js.map +1 -0
- package/dist/platform/cerebro-facts-client.d.ts +56 -0
- package/dist/platform/cerebro-facts-client.d.ts.map +1 -0
- package/dist/platform/cerebro-facts-client.js +297 -0
- package/dist/platform/cerebro-facts-client.js.map +1 -0
- package/dist/platform/client.d.ts +2 -1
- package/dist/platform/client.d.ts.map +1 -1
- package/dist/platform/client.js +9 -26
- package/dist/platform/client.js.map +1 -1
- package/dist/platform/core-services.d.ts +128 -0
- package/dist/platform/core-services.d.ts.map +1 -1
- package/dist/platform/core-services.js +128 -0
- package/dist/platform/core-services.js.map +1 -1
- package/dist/platform/maestro-timeline-client.d.ts +22 -0
- package/dist/platform/maestro-timeline-client.d.ts.map +1 -0
- package/dist/platform/maestro-timeline-client.js +373 -0
- package/dist/platform/maestro-timeline-client.js.map +1 -0
- package/dist/platform/tool-execution-client.d.ts +104 -0
- package/dist/platform/tool-execution-client.d.ts.map +1 -0
- package/dist/platform/tool-execution-client.js +284 -0
- package/dist/platform/tool-execution-client.js.map +1 -0
- package/dist/prompts/service-client.d.ts.map +1 -1
- package/dist/prompts/service-client.js +5 -2
- package/dist/prompts/service-client.js.map +1 -1
- package/dist/providers/anthropic-auth.d.ts.map +1 -1
- package/dist/providers/anthropic-auth.js +8 -6
- package/dist/providers/anthropic-auth.js.map +1 -1
- package/dist/providers/api-keys.d.ts +1 -0
- package/dist/providers/api-keys.d.ts.map +1 -1
- package/dist/providers/api-keys.js +5 -0
- package/dist/providers/api-keys.js.map +1 -1
- package/dist/providers/auth.d.ts +2 -1
- package/dist/providers/auth.d.ts.map +1 -1
- package/dist/providers/auth.js +26 -3
- package/dist/providers/auth.js.map +1 -1
- package/dist/remote-runner/attach-client.d.ts +41 -0
- package/dist/remote-runner/attach-client.d.ts.map +1 -0
- package/dist/remote-runner/attach-client.js +692 -0
- package/dist/remote-runner/attach-client.js.map +1 -0
- package/dist/remote-runner/client.d.ts +205 -0
- package/dist/remote-runner/client.d.ts.map +1 -0
- package/dist/remote-runner/client.js +633 -0
- package/dist/remote-runner/client.js.map +1 -0
- package/dist/safety/action-firewall.d.ts +6 -1
- package/dist/safety/action-firewall.d.ts.map +1 -1
- package/dist/safety/action-firewall.js +62 -26
- package/dist/safety/action-firewall.js.map +1 -1
- package/dist/safety/governance-service-client.d.ts +36 -0
- package/dist/safety/governance-service-client.d.ts.map +1 -0
- package/dist/safety/governance-service-client.js +279 -0
- package/dist/safety/governance-service-client.js.map +1 -0
- package/dist/safety/policy.d.ts +13 -2
- package/dist/safety/policy.d.ts.map +1 -1
- package/dist/safety/policy.js +474 -52
- package/dist/safety/policy.js.map +1 -1
- package/dist/sdk-tools.d.ts +21 -0
- package/dist/sdk-tools.d.ts.map +1 -1
- package/dist/sdk-tools.js +16 -0
- package/dist/sdk-tools.js.map +1 -1
- package/dist/server/app-context.d.ts +25 -0
- package/dist/server/app-context.d.ts.map +1 -1
- package/dist/server/app-context.js.map +1 -1
- package/dist/server/approval-service.d.ts +7 -8
- package/dist/server/approval-service.d.ts.map +1 -1
- package/dist/server/approval-service.js +12 -24
- package/dist/server/approval-service.js.map +1 -1
- package/dist/server/authz.d.ts +23 -2
- package/dist/server/authz.d.ts.map +1 -1
- package/dist/server/authz.js +153 -17
- package/dist/server/authz.js.map +1 -1
- package/dist/server/handlers/approvals.d.ts.map +1 -1
- package/dist/server/handlers/approvals.js +3 -10
- package/dist/server/handlers/approvals.js.map +1 -1
- package/dist/server/handlers/branch.d.ts.map +1 -1
- package/dist/server/handlers/branch.js +29 -20
- package/dist/server/handlers/branch.js.map +1 -1
- package/dist/server/handlers/bridge.d.ts.map +1 -1
- package/dist/server/handlers/bridge.js +3 -2
- package/dist/server/handlers/bridge.js.map +1 -1
- package/dist/server/handlers/chat-ws.d.ts.map +1 -1
- package/dist/server/handlers/chat-ws.js +23 -31
- package/dist/server/handlers/chat-ws.js.map +1 -1
- package/dist/server/handlers/chat.d.ts.map +1 -1
- package/dist/server/handlers/chat.js +105 -46
- package/dist/server/handlers/chat.js.map +1 -1
- package/dist/server/handlers/compliance.d.ts +3 -0
- package/dist/server/handlers/compliance.d.ts.map +1 -0
- package/dist/server/handlers/compliance.js +53 -0
- package/dist/server/handlers/compliance.js.map +1 -0
- package/dist/server/handlers/context.d.ts.map +1 -1
- package/dist/server/handlers/context.js +3 -8
- package/dist/server/handlers/context.js.map +1 -1
- package/dist/server/handlers/fleet.d.ts +4 -0
- package/dist/server/handlers/fleet.d.ts.map +1 -0
- package/dist/server/handlers/fleet.js +9 -0
- package/dist/server/handlers/fleet.js.map +1 -0
- package/dist/server/handlers/headless-sessions.d.ts +4 -0
- package/dist/server/handlers/headless-sessions.d.ts.map +1 -1
- package/dist/server/handlers/headless-sessions.js +168 -3
- package/dist/server/handlers/headless-sessions.js.map +1 -1
- package/dist/server/handlers/health.d.ts +31 -2
- package/dist/server/handlers/health.d.ts.map +1 -1
- package/dist/server/handlers/health.js +82 -8
- package/dist/server/handlers/health.js.map +1 -1
- package/dist/server/handlers/hosted-runner-drain.d.ts +128 -0
- package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -0
- package/dist/server/handlers/hosted-runner-drain.js +373 -0
- package/dist/server/handlers/hosted-runner-drain.js.map +1 -0
- package/dist/server/handlers/hosted-runner-identity.d.ts +17 -0
- package/dist/server/handlers/hosted-runner-identity.d.ts.map +1 -0
- package/dist/server/handlers/hosted-runner-identity.js +39 -0
- package/dist/server/handlers/hosted-runner-identity.js.map +1 -0
- package/dist/server/handlers/intelligent-router.d.ts +3 -0
- package/dist/server/handlers/intelligent-router.d.ts.map +1 -0
- package/dist/server/handlers/intelligent-router.js +141 -0
- package/dist/server/handlers/intelligent-router.js.map +1 -0
- package/dist/server/handlers/models.d.ts.map +1 -1
- package/dist/server/handlers/models.js +14 -0
- package/dist/server/handlers/models.js.map +1 -1
- package/dist/server/handlers/pending-requests.d.ts +8 -0
- package/dist/server/handlers/pending-requests.d.ts.map +1 -0
- package/dist/server/handlers/pending-requests.js +149 -0
- package/dist/server/handlers/pending-requests.js.map +1 -0
- package/dist/server/handlers/revenue-attribution.d.ts +3 -0
- package/dist/server/handlers/revenue-attribution.d.ts.map +1 -0
- package/dist/server/handlers/revenue-attribution.js +45 -0
- package/dist/server/handlers/revenue-attribution.js.map +1 -0
- package/dist/server/handlers/runtime-app-server-ws.d.ts +10 -0
- package/dist/server/handlers/runtime-app-server-ws.d.ts.map +1 -0
- package/dist/server/handlers/runtime-app-server-ws.js +206 -0
- package/dist/server/handlers/runtime-app-server-ws.js.map +1 -0
- package/dist/server/handlers/session-artifacts.js +2 -2
- package/dist/server/handlers/session-artifacts.js.map +1 -1
- package/dist/server/handlers/session-attachments.js +3 -3
- package/dist/server/handlers/session-attachments.js.map +1 -1
- package/dist/server/handlers/session-timeline.d.ts +11 -0
- package/dist/server/handlers/session-timeline.d.ts.map +1 -0
- package/dist/server/handlers/session-timeline.js +77 -0
- package/dist/server/handlers/session-timeline.js.map +1 -0
- package/dist/server/handlers/sessions.d.ts +11 -0
- package/dist/server/handlers/sessions.d.ts.map +1 -1
- package/dist/server/handlers/sessions.js +68 -100
- package/dist/server/handlers/sessions.js.map +1 -1
- package/dist/server/handlers/traces.d.ts +3 -0
- package/dist/server/handlers/traces.d.ts.map +1 -0
- package/dist/server/handlers/traces.js +60 -0
- package/dist/server/handlers/traces.js.map +1 -0
- package/dist/server/handlers/usage-analytics.d.ts +3 -0
- package/dist/server/handlers/usage-analytics.d.ts.map +1 -0
- package/dist/server/handlers/usage-analytics.js +40 -0
- package/dist/server/handlers/usage-analytics.js.map +1 -0
- package/dist/server/handlers/workspace-config.d.ts +3 -0
- package/dist/server/handlers/workspace-config.d.ts.map +1 -0
- package/dist/server/handlers/workspace-config.js +62 -0
- package/dist/server/handlers/workspace-config.js.map +1 -0
- package/dist/server/headless-in-process-host.d.ts +8 -1
- package/dist/server/headless-in-process-host.d.ts.map +1 -1
- package/dist/server/headless-in-process-host.js +6 -0
- package/dist/server/headless-in-process-host.js.map +1 -1
- package/dist/server/headless-runtime-service.d.ts +99 -1
- package/dist/server/headless-runtime-service.d.ts.map +1 -1
- package/dist/server/headless-runtime-service.js +286 -23
- package/dist/server/headless-runtime-service.js.map +1 -1
- package/dist/server/hosted-session-manager.d.ts +103 -0
- package/dist/server/hosted-session-manager.d.ts.map +1 -0
- package/dist/server/hosted-session-manager.js +629 -0
- package/dist/server/hosted-session-manager.js.map +1 -0
- package/dist/server/pending-request-payload.d.ts +4 -0
- package/dist/server/pending-request-payload.d.ts.map +1 -0
- package/dist/server/pending-request-payload.js +107 -0
- package/dist/server/pending-request-payload.js.map +1 -0
- package/dist/server/request-context.d.ts +4 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +9 -0
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +149 -1
- package/dist/server/routes.js.map +1 -1
- package/dist/server/runtime-ws-access.d.ts +16 -0
- package/dist/server/runtime-ws-access.d.ts.map +1 -0
- package/dist/server/runtime-ws-access.js +21 -0
- package/dist/server/runtime-ws-access.js.map +1 -0
- package/dist/server/server-middlewares.d.ts +1 -1
- package/dist/server/server-middlewares.d.ts.map +1 -1
- package/dist/server/server-middlewares.js +35 -27
- package/dist/server/server-middlewares.js.map +1 -1
- package/dist/server/server-request-manager.d.ts +8 -27
- package/dist/server/server-request-manager.d.ts.map +1 -1
- package/dist/server/server-request-manager.js +7 -0
- package/dist/server/server-request-manager.js.map +1 -1
- package/dist/server/server-utils.d.ts +2 -1
- package/dist/server/server-utils.d.ts.map +1 -1
- package/dist/server/server-utils.js +11 -1
- package/dist/server/server-utils.js.map +1 -1
- package/dist/server/session-event-env.d.ts +2 -0
- package/dist/server/session-event-env.d.ts.map +1 -0
- package/dist/server/session-event-env.js +8 -0
- package/dist/server/session-event-env.js.map +1 -0
- package/dist/server/session-initialization.d.ts +25 -4
- package/dist/server/session-initialization.d.ts.map +1 -1
- package/dist/server/session-initialization.js +22 -5
- package/dist/server/session-initialization.js.map +1 -1
- package/dist/server/session-scope.d.ts +4 -0
- package/dist/server/session-scope.d.ts.map +1 -1
- package/dist/server/session-scope.js +44 -4
- package/dist/server/session-scope.js.map +1 -1
- package/dist/server/session-timeline.d.ts +13 -0
- package/dist/server/session-timeline.d.ts.map +1 -0
- package/dist/server/session-timeline.js +566 -0
- package/dist/server/session-timeline.js.map +1 -0
- package/dist/services/compliance/controls.d.ts +6 -0
- package/dist/services/compliance/controls.d.ts.map +1 -0
- package/dist/services/compliance/controls.js +113 -0
- package/dist/services/compliance/controls.js.map +1 -0
- package/dist/services/compliance/index.d.ts +6 -0
- package/dist/services/compliance/index.d.ts.map +1 -0
- package/dist/services/compliance/index.js +5 -0
- package/dist/services/compliance/index.js.map +1 -0
- package/dist/services/compliance/normalize.d.ts +23 -0
- package/dist/services/compliance/normalize.d.ts.map +1 -0
- package/dist/services/compliance/normalize.js +226 -0
- package/dist/services/compliance/normalize.js.map +1 -0
- package/dist/services/compliance/recorder.d.ts +22 -0
- package/dist/services/compliance/recorder.d.ts.map +1 -0
- package/dist/services/compliance/recorder.js +89 -0
- package/dist/services/compliance/recorder.js.map +1 -0
- package/dist/services/compliance/service.d.ts +24 -0
- package/dist/services/compliance/service.d.ts.map +1 -0
- package/dist/services/compliance/service.js +426 -0
- package/dist/services/compliance/service.js.map +1 -0
- package/dist/services/compliance/types.d.ts +185 -0
- package/dist/services/compliance/types.d.ts.map +1 -0
- package/dist/services/compliance/types.js +2 -0
- package/dist/services/compliance/types.js.map +1 -0
- package/dist/services/intelligent-router/index.d.ts +5 -0
- package/dist/services/intelligent-router/index.d.ts.map +1 -0
- package/dist/services/intelligent-router/index.js +5 -0
- package/dist/services/intelligent-router/index.js.map +1 -0
- package/dist/services/intelligent-router/normalize.d.ts +9 -0
- package/dist/services/intelligent-router/normalize.d.ts.map +1 -0
- package/dist/services/intelligent-router/normalize.js +169 -0
- package/dist/services/intelligent-router/normalize.js.map +1 -0
- package/dist/services/intelligent-router/recorder.d.ts +24 -0
- package/dist/services/intelligent-router/recorder.d.ts.map +1 -0
- package/dist/services/intelligent-router/recorder.js +98 -0
- package/dist/services/intelligent-router/recorder.js.map +1 -0
- package/dist/services/intelligent-router/service.d.ts +22 -0
- package/dist/services/intelligent-router/service.d.ts.map +1 -0
- package/dist/services/intelligent-router/service.js +328 -0
- package/dist/services/intelligent-router/service.js.map +1 -0
- package/dist/services/intelligent-router/types.d.ts +98 -0
- package/dist/services/intelligent-router/types.d.ts.map +1 -0
- package/dist/services/intelligent-router/types.js +7 -0
- package/dist/services/intelligent-router/types.js.map +1 -0
- package/dist/services/revenue-attribution/index.d.ts +4 -0
- package/dist/services/revenue-attribution/index.d.ts.map +1 -0
- package/dist/services/revenue-attribution/index.js +4 -0
- package/dist/services/revenue-attribution/index.js.map +1 -0
- package/dist/services/revenue-attribution/normalize.d.ts +13 -0
- package/dist/services/revenue-attribution/normalize.d.ts.map +1 -0
- package/dist/services/revenue-attribution/normalize.js +155 -0
- package/dist/services/revenue-attribution/normalize.js.map +1 -0
- package/dist/services/revenue-attribution/service.d.ts +21 -0
- package/dist/services/revenue-attribution/service.d.ts.map +1 -0
- package/dist/services/revenue-attribution/service.js +248 -0
- package/dist/services/revenue-attribution/service.js.map +1 -0
- package/dist/services/revenue-attribution/types.d.ts +96 -0
- package/dist/services/revenue-attribution/types.d.ts.map +1 -0
- package/dist/services/revenue-attribution/types.js +7 -0
- package/dist/services/revenue-attribution/types.js.map +1 -0
- package/dist/services/traces/index.d.ts +5 -0
- package/dist/services/traces/index.d.ts.map +1 -0
- package/dist/services/traces/index.js +4 -0
- package/dist/services/traces/index.js.map +1 -0
- package/dist/services/traces/normalize.d.ts +20 -0
- package/dist/services/traces/normalize.d.ts.map +1 -0
- package/dist/services/traces/normalize.js +261 -0
- package/dist/services/traces/normalize.js.map +1 -0
- package/dist/services/traces/otel.d.ts +3 -0
- package/dist/services/traces/otel.d.ts.map +1 -0
- package/dist/services/traces/otel.js +173 -0
- package/dist/services/traces/otel.js.map +1 -0
- package/dist/services/traces/service.d.ts +17 -0
- package/dist/services/traces/service.d.ts.map +1 -0
- package/dist/services/traces/service.js +197 -0
- package/dist/services/traces/service.js.map +1 -0
- package/dist/services/traces/types.d.ts +130 -0
- package/dist/services/traces/types.d.ts.map +1 -0
- package/dist/services/traces/types.js +8 -0
- package/dist/services/traces/types.js.map +1 -0
- package/dist/services/usage-analytics/aggregation.d.ts +18 -0
- package/dist/services/usage-analytics/aggregation.d.ts.map +1 -0
- package/dist/services/usage-analytics/aggregation.js +130 -0
- package/dist/services/usage-analytics/aggregation.js.map +1 -0
- package/dist/services/usage-analytics/index.d.ts +5 -0
- package/dist/services/usage-analytics/index.d.ts.map +1 -0
- package/dist/services/usage-analytics/index.js +4 -0
- package/dist/services/usage-analytics/index.js.map +1 -0
- package/dist/services/usage-analytics/recorder.d.ts +16 -0
- package/dist/services/usage-analytics/recorder.d.ts.map +1 -0
- package/dist/services/usage-analytics/recorder.js +128 -0
- package/dist/services/usage-analytics/recorder.js.map +1 -0
- package/dist/services/usage-analytics/service.d.ts +15 -0
- package/dist/services/usage-analytics/service.d.ts.map +1 -0
- package/dist/services/usage-analytics/service.js +210 -0
- package/dist/services/usage-analytics/service.js.map +1 -0
- package/dist/services/usage-analytics/types.d.ts +80 -0
- package/dist/services/usage-analytics/types.d.ts.map +1 -0
- package/dist/services/usage-analytics/types.js +2 -0
- package/dist/services/usage-analytics/types.js.map +1 -0
- package/dist/services/workspace-config/index.d.ts +6 -0
- package/dist/services/workspace-config/index.d.ts.map +1 -0
- package/dist/services/workspace-config/index.js +5 -0
- package/dist/services/workspace-config/index.js.map +1 -0
- package/dist/services/workspace-config/middleware.d.ts +5 -0
- package/dist/services/workspace-config/middleware.d.ts.map +1 -0
- package/dist/services/workspace-config/middleware.js +98 -0
- package/dist/services/workspace-config/middleware.js.map +1 -0
- package/dist/services/workspace-config/normalize.d.ts +17 -0
- package/dist/services/workspace-config/normalize.d.ts.map +1 -0
- package/dist/services/workspace-config/normalize.js +148 -0
- package/dist/services/workspace-config/normalize.js.map +1 -0
- package/dist/services/workspace-config/policy.d.ts +16 -0
- package/dist/services/workspace-config/policy.d.ts.map +1 -0
- package/dist/services/workspace-config/policy.js +77 -0
- package/dist/services/workspace-config/policy.js.map +1 -0
- package/dist/services/workspace-config/service.d.ts +20 -0
- package/dist/services/workspace-config/service.d.ts.map +1 -0
- package/dist/services/workspace-config/service.js +162 -0
- package/dist/services/workspace-config/service.js.map +1 -0
- package/dist/services/workspace-config/types.d.ts +71 -0
- package/dist/services/workspace-config/types.d.ts.map +1 -0
- package/dist/services/workspace-config/types.js +2 -0
- package/dist/services/workspace-config/types.js.map +1 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +10 -0
- package/dist/session/manager.js.map +1 -1
- package/dist/session/migration.d.ts.map +1 -1
- package/dist/session/migration.js +2 -1
- package/dist/session/migration.js.map +1 -1
- package/dist/session/session-memory.d.ts.map +1 -1
- package/dist/session/session-memory.js +7 -1
- package/dist/session/session-memory.js.map +1 -1
- package/dist/session/types.d.ts +1 -2
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js +1 -22
- package/dist/session/types.js.map +1 -1
- package/dist/session/wire-format.d.ts +7 -0
- package/dist/session/wire-format.d.ts.map +1 -0
- package/dist/session/wire-format.generated.d.ts +95 -0
- package/dist/session/wire-format.generated.d.ts.map +1 -0
- package/dist/session/wire-format.generated.js +111 -0
- package/dist/session/wire-format.generated.js.map +1 -0
- package/dist/session/wire-format.js +145 -0
- package/dist/session/wire-format.js.map +1 -0
- package/dist/shared-memory/client.d.ts.map +1 -1
- package/dist/shared-memory/client.js +22 -22
- package/dist/shared-memory/client.js.map +1 -1
- package/dist/skills/artifact-metadata.d.ts +16 -0
- package/dist/skills/artifact-metadata.d.ts.map +1 -0
- package/dist/skills/artifact-metadata.js +86 -0
- package/dist/skills/artifact-metadata.js.map +1 -0
- package/dist/skills/loader.d.ts +2 -2
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +1 -0
- package/dist/skills/loader.js.map +1 -1
- package/dist/skills/service-client.d.ts +42 -0
- package/dist/skills/service-client.d.ts.map +1 -0
- package/dist/skills/service-client.js +258 -0
- package/dist/skills/service-client.js.map +1 -0
- package/dist/skills/tool.d.ts +3 -0
- package/dist/skills/tool.d.ts.map +1 -1
- package/dist/skills/tool.js +67 -5
- package/dist/skills/tool.js.map +1 -1
- package/dist/telemetry/index.d.ts +4 -0
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +5 -0
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/maestro-event-bus.d.ts +440 -0
- package/dist/telemetry/maestro-event-bus.d.ts.map +1 -0
- package/dist/telemetry/maestro-event-bus.js +784 -0
- package/dist/telemetry/maestro-event-bus.js.map +1 -0
- package/dist/telemetry/maestro-event-catalog.d.ts +48 -0
- package/dist/telemetry/maestro-event-catalog.d.ts.map +1 -0
- package/dist/telemetry/maestro-event-catalog.js +69 -0
- package/dist/telemetry/maestro-event-catalog.js.map +1 -0
- package/dist/telemetry/maestro-platform-replay-fixture.d.ts +24 -0
- package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -0
- package/dist/telemetry/maestro-platform-replay-fixture.js +400 -0
- package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -0
- package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts +29 -0
- package/dist/telemetry/maestro-publisher-conformance-fixture.d.ts.map +1 -0
- package/dist/telemetry/maestro-publisher-conformance-fixture.js +240 -0
- package/dist/telemetry/maestro-publisher-conformance-fixture.js.map +1 -0
- package/dist/telemetry/meter-service-client.d.ts +0 -33
- package/dist/telemetry/meter-service-client.d.ts.map +1 -1
- package/dist/telemetry/meter-service-client.js +22 -50
- package/dist/telemetry/meter-service-client.js.map +1 -1
- package/dist/telemetry/turn-tracker.d.ts.map +1 -1
- package/dist/telemetry/turn-tracker.js +5 -5
- package/dist/telemetry/turn-tracker.js.map +1 -1
- package/dist/telemetry/wide-events.d.ts +8 -0
- package/dist/telemetry/wide-events.d.ts.map +1 -1
- package/dist/telemetry/wide-events.js +28 -0
- package/dist/telemetry/wide-events.js.map +1 -1
- package/dist/telemetry.d.ts +1 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +14 -4
- package/dist/telemetry.js.map +1 -1
- package/dist/timeline/redaction.d.ts +5 -0
- package/dist/timeline/redaction.d.ts.map +1 -0
- package/dist/timeline/redaction.js +119 -0
- package/dist/timeline/redaction.js.map +1 -0
- package/dist/tools/ask-user.d.ts +26 -0
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +33 -1
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/background/task-types.d.ts +1 -1
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +27 -7
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/pipeline.d.ts.map +1 -1
- package/dist/tools/pipeline.js +16 -7
- package/dist/tools/pipeline.js.map +1 -1
- package/dist/tools/write.d.ts +2 -0
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +24 -6
- package/dist/tools/write.js.map +1 -1
- package/dist/tracking/cost-tracker.d.ts +15 -12
- package/dist/tracking/cost-tracker.d.ts.map +1 -1
- package/dist/tracking/cost-tracker.js +29 -40
- package/dist/tracking/cost-tracker.js.map +1 -1
- package/dist/utils/checkpoint-profiler.d.ts +29 -0
- package/dist/utils/checkpoint-profiler.d.ts.map +1 -0
- package/dist/utils/checkpoint-profiler.js +118 -0
- package/dist/utils/checkpoint-profiler.js.map +1 -0
- package/dist/utils/downstream-http.d.ts +21 -0
- package/dist/utils/downstream-http.d.ts.map +1 -0
- package/dist/utils/downstream-http.js +151 -0
- package/dist/utils/downstream-http.js.map +1 -0
- package/dist/utils/downstream.d.ts +18 -0
- package/dist/utils/downstream.d.ts.map +1 -0
- package/dist/utils/downstream.js +47 -0
- package/dist/utils/downstream.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +12 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/oauth-http.d.ts +8 -0
- package/dist/utils/oauth-http.d.ts.map +1 -0
- package/dist/utils/oauth-http.js +41 -0
- package/dist/utils/oauth-http.js.map +1 -0
- package/dist/utils/path-utils.d.ts +2 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +12 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/utils/path-validation.d.ts +1 -1
- package/dist/utils/path-validation.d.ts.map +1 -1
- package/dist/utils/path-validation.js +3 -3
- package/dist/utils/path-validation.js.map +1 -1
- package/dist/version.json +2 -2
- package/dist/web-server.d.ts +7 -1
- package/dist/web-server.d.ts.map +1 -1
- package/dist/web-server.js +117 -15
- package/dist/web-server.js.map +1 -1
- package/dist/webhooks/delivery.d.ts.map +1 -1
- package/dist/webhooks/delivery.js +9 -12
- package/dist/webhooks/delivery.js.map +1 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/descriptors.d.ts +12 -5
- package/node_modules/@bufbuild/protobuf/dist/cjs/from-binary.js +7 -7
- package/node_modules/@bufbuild/protobuf/dist/cjs/from-json.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/from-json.js +1 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/reflect/path.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/registry.js +24 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/to-json.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/to-json.js +9 -10
- package/node_modules/@bufbuild/protobuf/dist/cjs/types.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/wire/binary-encoding.d.ts +9 -7
- package/node_modules/@bufbuild/protobuf/dist/cjs/wire/binary-encoding.js +18 -8
- package/node_modules/@bufbuild/protobuf/dist/cjs/wire/text-encoding.d.ts +4 -2
- package/node_modules/@bufbuild/protobuf/dist/cjs/wire/text-encoding.js +8 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/go_features_pb.js +38 -2
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/wrappers.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/wrappers.js +24 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/descriptors.d.ts +12 -5
- package/node_modules/@bufbuild/protobuf/dist/esm/from-binary.js +7 -7
- package/node_modules/@bufbuild/protobuf/dist/esm/from-json.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/esm/from-json.js +2 -2
- package/node_modules/@bufbuild/protobuf/dist/esm/reflect/path.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/esm/registry.js +24 -1
- package/node_modules/@bufbuild/protobuf/dist/esm/to-json.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/esm/to-json.js +10 -11
- package/node_modules/@bufbuild/protobuf/dist/esm/types.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.d.ts +9 -7
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.js +18 -8
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.d.ts +4 -2
- package/node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.js +8 -1
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/api_pb.d.ts +1 -1
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts +2 -2
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.d.ts +37 -23
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/descriptor_pb.js +1 -1
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/field_mask_pb.d.ts +32 -36
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.d.ts +65 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/go_features_pb.js +37 -1
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/timestamp_pb.d.ts +5 -5
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/gen/google/protobuf/type_pb.d.ts +3 -3
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.d.ts +10 -0
- package/node_modules/@bufbuild/protobuf/dist/esm/wkt/wrappers.js +23 -0
- package/node_modules/@bufbuild/protobuf/package.json +1 -1
- package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts +305 -2
- package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js +34 -4
- package/node_modules/@evalops/contracts/dist/headless-protocol-schemas.generated.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/index.d.ts +88 -0
- package/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/index.js +2 -0
- package/node_modules/@evalops/contracts/dist/index.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts +77 -77
- package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js +1 -1
- package/node_modules/@evalops/contracts/dist/proto/maestro/v1/headless_pb.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts +182 -0
- package/node_modules/@evalops/contracts/dist/runtime-app-server.d.ts.map +1 -0
- package/node_modules/@evalops/contracts/dist/runtime-app-server.js +83 -0
- package/node_modules/@evalops/contracts/dist/runtime-app-server.js.map +1 -0
- package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts +133 -0
- package/node_modules/@evalops/contracts/dist/runtime-server-request.d.ts.map +1 -0
- package/node_modules/@evalops/contracts/dist/runtime-server-request.js +68 -0
- package/node_modules/@evalops/contracts/dist/runtime-server-request.js.map +1 -0
- package/node_modules/@evalops/contracts/dist/schemas.d.ts +178 -0
- package/node_modules/@evalops/contracts/dist/schemas.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/schemas.js +165 -0
- package/node_modules/@evalops/contracts/dist/schemas.js.map +1 -1
- package/node_modules/@evalops/contracts/dist/typebox-utils.d.ts +2 -0
- package/node_modules/@evalops/contracts/dist/typebox-utils.d.ts.map +1 -0
- package/node_modules/@evalops/contracts/dist/typebox-utils.js +5 -0
- package/node_modules/@evalops/contracts/dist/typebox-utils.js.map +1 -0
- package/node_modules/@evalops/contracts/dist/validators.d.ts +4 -1
- package/node_modules/@evalops/contracts/dist/validators.d.ts.map +1 -1
- package/node_modules/@evalops/contracts/dist/validators.js +4 -1
- package/node_modules/@evalops/contracts/dist/validators.js.map +1 -1
- package/node_modules/@evalops/contracts/package.json +1 -1
- package/node_modules/@evalops/tui/package.json +1 -1
- package/node_modules/string-width/index.js +93 -9
- package/node_modules/string-width/package.json +1 -1
- package/package.json +32 -25
- package/dist/cli-tui/commands/grouped/auth-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/auth-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/config-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/config-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/diag-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/diag-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/git-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/git-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/index.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/index.js.map +0 -1
- package/dist/cli-tui/commands/grouped/safety-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/safety-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/session-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/session-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/tools-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/tools-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/ui-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/ui-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/undo-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/undo-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/usage-commands.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/usage-commands.js.map +0 -1
- package/dist/cli-tui/commands/grouped/utils.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped/utils.js.map +0 -1
- package/dist/cli-tui/commands/grouped-command-handlers.d.ts.map +0 -1
- package/dist/cli-tui/commands/grouped-command-handlers.js +0 -135
- package/dist/cli-tui/commands/grouped-command-handlers.js.map +0 -1
- package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.d.ts +0 -78
- package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.d.ts.map +0 -1
- package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.js +0 -129
- package/dist/cli-tui/tui-renderer/grouped-handlers-wiring.js.map +0 -1
- package/node_modules/@evalops/memory/dist/client.d.ts +0 -94
- package/node_modules/@evalops/memory/dist/client.js +0 -503
- package/node_modules/@evalops/memory/gen/proto/dist/memory/v1/memory_pb.d.ts +0 -608
- package/node_modules/@evalops/memory/gen/proto/dist/memory/v1/memory_pb.js +0 -187
- package/node_modules/@evalops/memory/package.json +0 -26
- /package/dist/cli-tui/commands/{grouped → subcommands}/usage-commands.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/webhooks/delivery.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Webhook Delivery Service\n *\n * Handles reliable webhook delivery with:\n * - HMAC signing for payload integrity\n * - Exponential backoff retries\n * - Database-backed delivery queue\n * - Delivery status tracking\n */\n\nimport crypto from \"node:crypto\";\nimport { and, count, eq, isNull, lt, lte, or } from \"drizzle-orm\";\nimport { getDb, isDbAvailable } from \"../db/client.js\";\nimport {\n\tdistributedLocks,\n\torganizations,\n\twebhookDeliveries,\n} from \"../db/schema.js\";\nimport { decryptOrgSettings } from \"../db/settings-encryption.js\";\nimport { createLogger } from \"../utils/logger.js\";\n\n// Unique identifier for this process instance\nconst INSTANCE_ID = `${process.pid}-${crypto.randomUUID().slice(0, 8)}`;\n\nconst logger = createLogger(\"webhooks:delivery\");\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface WebhookPayload {\n\tevent: string;\n\ttimestamp: string;\n\tdata: Record<string, unknown>;\n}\n\nexport interface WebhookDeliveryOptions {\n\torgId: string;\n\turl: string;\n\tpayload: WebhookPayload;\n\tsigningSecret?: string;\n\tmaxAttempts?: number;\n}\n\nexport interface DeliveryResult {\n\tsuccess: boolean;\n\tstatusCode?: number;\n\tresponseTimeMs?: number;\n\terror?: string;\n}\n\nexport function buildWebhookDeliveryHeaders(\n\tsignature?: string,\n): Record<string, string> {\n\tconst headers: Record<string, string> = {\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"User-Agent\": \"Maestro-Webhooks/1.0\",\n\t\t\"X-Webhook-Id\": crypto.randomUUID(),\n\t};\n\n\tif (signature) {\n\t\theaders[\"X-Composer-Signature\"] = signature;\n\t\theaders[\"X-Maestro-Signature\"] = signature;\n\t}\n\n\treturn headers;\n}\n\n// ============================================================================\n// HMAC SIGNING\n// ============================================================================\n\n/** Sign a webhook payload with HMAC-SHA256. Format: t=timestamp,v1=signature */\nexport function signPayload(\n\tpayload: string,\n\tsecret: string,\n\ttimestamp?: number,\n): { signature: string; timestamp: number } {\n\tconst ts = timestamp ?? Math.floor(Date.now() / 1000);\n\tconst signatureBase = `${ts}.${payload}`;\n\n\tconst signature = crypto\n\t\t.createHmac(\"sha256\", secret)\n\t\t.update(signatureBase)\n\t\t.digest(\"hex\");\n\n\treturn {\n\t\tsignature: `t=${ts},v1=${signature}`,\n\t\ttimestamp: ts,\n\t};\n}\n\nexport function verifySignature(\n\tpayload: string,\n\tsignature: string,\n\tsecret: string,\n\ttoleranceSeconds = 300,\n): { valid: boolean; error?: string } {\n\t// Parse signature: t=timestamp,v1=hash\n\tconst parts = signature.split(\",\");\n\tconst timestampPart = parts.find((p) => p.startsWith(\"t=\"));\n\tconst signaturePart = parts.find((p) => p.startsWith(\"v1=\"));\n\n\tif (!timestampPart || !signaturePart) {\n\t\treturn { valid: false, error: \"Invalid signature format\" };\n\t}\n\n\tconst timestamp = Number.parseInt(timestampPart.slice(2), 10);\n\tconst providedSig = signaturePart.slice(3);\n\n\tif (Number.isNaN(timestamp)) {\n\t\treturn { valid: false, error: \"Invalid timestamp\" };\n\t}\n\n\t// Check timestamp freshness\n\tconst now = Math.floor(Date.now() / 1000);\n\tif (Math.abs(now - timestamp) > toleranceSeconds) {\n\t\treturn { valid: false, error: \"Timestamp outside tolerance\" };\n\t}\n\n\t// Compute expected signature\n\tconst signatureBase = `${timestamp}.${payload}`;\n\tconst expected = crypto\n\t\t.createHmac(\"sha256\", secret)\n\t\t.update(signatureBase)\n\t\t.digest(\"hex\");\n\n\t// Timing-safe comparison\n\tconst providedBuf = Buffer.from(providedSig, \"hex\");\n\tconst expectedBuf = Buffer.from(expected, \"hex\");\n\n\tif (providedBuf.length !== expectedBuf.length) {\n\t\treturn { valid: false, error: \"Signature length mismatch\" };\n\t}\n\n\tif (!crypto.timingSafeEqual(providedBuf, expectedBuf)) {\n\t\treturn { valid: false, error: \"Signature mismatch\" };\n\t}\n\n\treturn { valid: true };\n}\n\n// ============================================================================\n// HTTP DELIVERY\n// ============================================================================\n\nasync function deliverHttp(\n\turl: string,\n\tpayload: string,\n\tsignature?: string,\n\ttimeoutMs = 30_000,\n): Promise<DeliveryResult> {\n\tconst startTime = Date.now();\n\tconst headers = buildWebhookDeliveryHeaders(signature);\n\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: payload,\n\t\t\tsignal: controller.signal,\n\t\t});\n\n\t\tclearTimeout(timeout);\n\n\t\tconst responseTimeMs = Date.now() - startTime;\n\n\t\tif (response.ok) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tstatusCode: response.status,\n\t\t\t\tresponseTimeMs,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tstatusCode: response.status,\n\t\t\tresponseTimeMs,\n\t\t\terror: `HTTP ${response.status}: ${response.statusText}`,\n\t\t};\n\t} catch (error) {\n\t\tconst responseTimeMs = Date.now() - startTime;\n\n\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tresponseTimeMs,\n\t\t\t\terror: \"Request timeout\",\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tresponseTimeMs,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n// ============================================================================\n// DISTRIBUTED LOCKING\n// ============================================================================\n\nconst LOCK_ID = \"webhook_processor\";\nconst LOCK_DURATION_MS = 60_000; // 1 minute lock duration\nconst LOCK_RENEWAL_MS = 30_000; // Renew every 30 seconds\nlet processorInFlight = false;\n\nasync function tryAcquireLock(): Promise<boolean> {\n\tif (!isDbAvailable()) {\n\t\treturn true; // No DB, no locking - just process\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tconst now = new Date();\n\t\tconst expiresAt = new Date(now.getTime() + LOCK_DURATION_MS);\n\n\t\t// Try to insert lock, or update if expired\n\t\tawait db\n\t\t\t.insert(distributedLocks)\n\t\t\t.values({\n\t\t\t\tid: LOCK_ID,\n\t\t\t\tholderId: INSTANCE_ID,\n\t\t\t\tacquiredAt: now,\n\t\t\t\texpiresAt,\n\t\t\t})\n\t\t\t.onConflictDoUpdate({\n\t\t\t\ttarget: distributedLocks.id,\n\t\t\t\tset: {\n\t\t\t\t\tholderId: INSTANCE_ID,\n\t\t\t\t\tacquiredAt: now,\n\t\t\t\t\texpiresAt,\n\t\t\t\t},\n\t\t\t\t// Only update if lock is expired or we already hold it\n\t\t\t\tsetWhere: or(\n\t\t\t\t\tlt(distributedLocks.expiresAt, now),\n\t\t\t\t\teq(distributedLocks.holderId, INSTANCE_ID),\n\t\t\t\t),\n\t\t\t});\n\n\t\t// Check if we got the lock\n\t\tconst [lock] = await db\n\t\t\t.select()\n\t\t\t.from(distributedLocks)\n\t\t\t.where(eq(distributedLocks.id, LOCK_ID))\n\t\t\t.limit(1);\n\n\t\treturn lock?.holderId === INSTANCE_ID;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to acquire lock\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\treturn false;\n\t}\n}\n\nasync function renewLock(): Promise<boolean> {\n\tif (!isDbAvailable()) {\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tconst now = new Date();\n\t\tconst expiresAt = new Date(now.getTime() + LOCK_DURATION_MS);\n\n\t\tconst result = await db\n\t\t\t.update(distributedLocks)\n\t\t\t.set({ expiresAt })\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\teq(distributedLocks.id, LOCK_ID),\n\t\t\t\t\teq(distributedLocks.holderId, INSTANCE_ID),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.returning({ id: distributedLocks.id });\n\n\t\treturn result.length > 0;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to renew lock\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\treturn false;\n\t}\n}\n\nasync function releaseLock(): Promise<void> {\n\tif (!isDbAvailable()) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tawait db\n\t\t\t.delete(distributedLocks)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\teq(distributedLocks.id, LOCK_ID),\n\t\t\t\t\teq(distributedLocks.holderId, INSTANCE_ID),\n\t\t\t\t),\n\t\t\t);\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to release lock\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t}\n}\n\n// ============================================================================\n// RETRY BACKOFF WITH JITTER\n// ============================================================================\n\nfunction calculateBackoffWithJitter(\n\tattempt: number,\n\tbaseMs = 1000,\n\tcapMs = 300_000,\n): number {\n\t// Exponential base: 2^attempt * baseMs\n\tconst exponential = Math.min(capMs, baseMs * 2 ** attempt);\n\t// Add jitter: random value between 50% and 150% of exponential\n\tconst jitter = exponential * (0.5 + Math.random());\n\treturn Math.min(capMs, Math.floor(jitter));\n}\n\n// ============================================================================\n// QUEUE OPERATIONS\n// ============================================================================\n\n/** Queue a webhook for delivery. Signature is generated at delivery time. */\nexport async function queueWebhook(\n\toptions: WebhookDeliveryOptions,\n): Promise<string | null> {\n\tif (!isDbAvailable()) {\n\t\tlogger.warn(\"Database unavailable, delivering webhook immediately\");\n\t\t// Fall back to immediate delivery without persistence\n\t\tconst payload = JSON.stringify(options.payload);\n\t\t// Sign at delivery time\n\t\tconst signature = options.signingSecret\n\t\t\t? signPayload(payload, options.signingSecret).signature\n\t\t\t: undefined;\n\n\t\tconst result = await deliverHttp(options.url, payload, signature);\n\t\tif (!result.success) {\n\t\t\tlogger.error(\"Immediate webhook delivery failed\", undefined, {\n\t\t\t\turl: options.url,\n\t\t\t\terror: result.error,\n\t\t\t});\n\t\t}\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\n\t\t// Don't pre-sign - signature will be generated at delivery time\n\t\t// This ensures the timestamp is fresh when the webhook is sent\n\t\tconst [delivery] = await db\n\t\t\t.insert(webhookDeliveries)\n\t\t\t.values({\n\t\t\t\torgId: options.orgId,\n\t\t\t\turl: options.url,\n\t\t\t\tpayload: options.payload,\n\t\t\t\t// Store the secret reference, not the pre-computed signature\n\t\t\t\tsignature: null,\n\t\t\t\tmaxAttempts: options.maxAttempts ?? 5,\n\t\t\t\tnextRetryAt: new Date(), // Immediate first attempt\n\t\t\t})\n\t\t\t.returning({ id: webhookDeliveries.id });\n\n\t\tif (!delivery) {\n\t\t\tlogger.error(\"Failed to queue webhook: no delivery returned\", undefined, {\n\t\t\t\turl: options.url,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\n\t\tlogger.debug(\"Webhook queued\", {\n\t\t\tid: delivery.id,\n\t\t\turl: options.url,\n\t\t\tevent: options.payload.event,\n\t\t});\n\n\t\treturn delivery.id;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to queue webhook\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t\t{ url: options.url },\n\t\t);\n\t\treturn null;\n\t}\n}\n\nexport async function processWebhookQueue(batchSize = 10): Promise<number> {\n\tif (!isDbAvailable()) {\n\t\treturn 0;\n\t}\n\tif (processorInFlight) {\n\t\treturn 0;\n\t}\n\ttry {\n\t\tprocessorInFlight = true;\n\n\t\t// Try to acquire the distributed lock\n\t\tconst hasLock = await tryAcquireLock();\n\t\tif (!hasLock) {\n\t\t\tlogger.debug(\"Another instance holds the webhook processor lock\");\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst db = getDb();\n\t\tconst now = new Date();\n\n\t\t// Fetch pending webhooks ready for delivery/retry\n\t\tconst pending = await db\n\t\t\t.select()\n\t\t\t.from(webhookDeliveries)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\tor(\n\t\t\t\t\t\teq(webhookDeliveries.status, \"pending\"),\n\t\t\t\t\t\teq(webhookDeliveries.status, \"retrying\"),\n\t\t\t\t\t),\n\t\t\t\t\tlte(webhookDeliveries.nextRetryAt, now),\n\t\t\t\t\tlt(webhookDeliveries.attempts, webhookDeliveries.maxAttempts),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.limit(batchSize);\n\n\t\tif (pending.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet processed = 0;\n\n\t\tfor (const delivery of pending) {\n\t\t\tconst payload = JSON.stringify(delivery.payload);\n\n\t\t\t// Sign at delivery time with fresh timestamp\n\t\t\tlet signature: string | undefined;\n\t\t\tif (delivery.orgId) {\n\t\t\t\t// Get the org's signing secret\n\t\t\t\tconst [org] = await db\n\t\t\t\t\t.select({ settings: organizations.settings })\n\t\t\t\t\t.from(organizations)\n\t\t\t\t\t.where(eq(organizations.id, delivery.orgId))\n\t\t\t\t\t.limit(1);\n\n\t\t\t\t// Decrypt settings to access the signing secret\n\t\t\t\tconst decryptedSettings = decryptOrgSettings(org?.settings);\n\t\t\t\tif (decryptedSettings?.webhookSigningSecret) {\n\t\t\t\t\tsignature = signPayload(\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t\tdecryptedSettings.webhookSigningSecret,\n\t\t\t\t\t).signature;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await deliverHttp(delivery.url, payload, signature);\n\n\t\t\tconst newAttempts = delivery.attempts + 1;\n\n\t\t\tif (result.success) {\n\t\t\t\t// Mark as delivered\n\t\t\t\tawait db\n\t\t\t\t\t.update(webhookDeliveries)\n\t\t\t\t\t.set({\n\t\t\t\t\t\tstatus: \"delivered\",\n\t\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\t\tlastStatusCode: result.statusCode,\n\t\t\t\t\t\tlastResponseTimeMs: result.responseTimeMs,\n\t\t\t\t\t\tdeliveredAt: new Date(),\n\t\t\t\t\t})\n\t\t\t\t\t.where(eq(webhookDeliveries.id, delivery.id));\n\n\t\t\t\tlogger.info(\"Webhook delivered\", {\n\t\t\t\t\tid: delivery.id,\n\t\t\t\t\turl: delivery.url,\n\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\tresponseTimeMs: result.responseTimeMs,\n\t\t\t\t});\n\t\t\t} else if (newAttempts >= delivery.maxAttempts) {\n\t\t\t\t// Max retries exceeded, mark as failed\n\t\t\t\tawait db\n\t\t\t\t\t.update(webhookDeliveries)\n\t\t\t\t\t.set({\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\t\tlastStatusCode: result.statusCode,\n\t\t\t\t\t\tlastResponseTimeMs: result.responseTimeMs,\n\t\t\t\t\t\tlastError: result.error,\n\t\t\t\t\t})\n\t\t\t\t\t.where(eq(webhookDeliveries.id, delivery.id));\n\n\t\t\t\tlogger.error(\"Webhook delivery failed permanently\", undefined, {\n\t\t\t\t\tid: delivery.id,\n\t\t\t\t\turl: delivery.url,\n\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\terror: result.error,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Schedule retry with exponential backoff + jitter\n\t\t\t\tconst backoffMs = calculateBackoffWithJitter(newAttempts);\n\t\t\t\tconst nextRetry = new Date(Date.now() + backoffMs);\n\n\t\t\t\tawait db\n\t\t\t\t\t.update(webhookDeliveries)\n\t\t\t\t\t.set({\n\t\t\t\t\t\tstatus: \"retrying\",\n\t\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\t\tlastStatusCode: result.statusCode,\n\t\t\t\t\t\tlastResponseTimeMs: result.responseTimeMs,\n\t\t\t\t\t\tlastError: result.error,\n\t\t\t\t\t\tnextRetryAt: nextRetry,\n\t\t\t\t\t})\n\t\t\t\t\t.where(eq(webhookDeliveries.id, delivery.id));\n\n\t\t\t\tlogger.warn(\"Webhook delivery failed, scheduling retry\", {\n\t\t\t\t\tid: delivery.id,\n\t\t\t\t\turl: delivery.url,\n\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\tnextRetryIn: `${Math.round(backoffMs / 1000)}s`,\n\t\t\t\t\terror: result.error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tprocessed++;\n\n\t\t\t// Renew lock if we're processing many webhooks\n\t\t\tif (processed % 5 === 0) {\n\t\t\t\tawait renewLock();\n\t\t\t}\n\t\t}\n\n\t\treturn processed;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to process webhook queue\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\treturn 0;\n\t} finally {\n\t\tprocessorInFlight = false;\n\t}\n}\n\nexport async function cleanupWebhookQueue(retentionDays = 7): Promise<number> {\n\tif (!isDbAvailable()) {\n\t\treturn 0;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tconst cutoff = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1000);\n\n\t\tconst result = await db\n\t\t\t.delete(webhookDeliveries)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\tor(\n\t\t\t\t\t\teq(webhookDeliveries.status, \"delivered\"),\n\t\t\t\t\t\teq(webhookDeliveries.status, \"failed\"),\n\t\t\t\t\t),\n\t\t\t\t\tlte(webhookDeliveries.createdAt, cutoff),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.returning({ id: webhookDeliveries.id });\n\n\t\tif (result.length > 0) {\n\t\t\tlogger.info(\"Cleaned up old webhook deliveries\", {\n\t\t\t\tcount: result.length,\n\t\t\t\tretentionDays,\n\t\t\t});\n\t\t}\n\n\t\treturn result.length;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to cleanup webhook queue\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\treturn 0;\n\t}\n}\n\n// ============================================================================\n// ALERT WEBHOOK INTEGRATION\n// ============================================================================\n\nexport async function sendAlertWebhooks(\n\torgId: string,\n\talert: {\n\t\ttype: string;\n\t\tseverity: string;\n\t\tmessage: string;\n\t\tmetadata?: Record<string, unknown>;\n\t},\n): Promise<void> {\n\tif (!isDbAvailable()) {\n\t\tlogger.warn(\"Database unavailable, skipping alert webhooks\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\n\t\t// Get org settings to find webhook URLs and signing secret\n\t\tconst [org] = await db\n\t\t\t.select({ settings: organizations.settings })\n\t\t\t.from(organizations)\n\t\t\t.where(eq(organizations.id, orgId))\n\t\t\t.limit(1);\n\n\t\t// Decrypt settings to access sensitive fields\n\t\tconst decryptedSettings = decryptOrgSettings(org?.settings);\n\n\t\tif (!decryptedSettings?.alertWebhooks?.length) {\n\t\t\treturn; // No webhooks configured\n\t\t}\n\n\t\tconst payload: WebhookPayload = {\n\t\t\tevent: `alert.${alert.type}`,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tdata: {\n\t\t\t\tseverity: alert.severity,\n\t\t\t\tmessage: alert.message,\n\t\t\t\t...alert.metadata,\n\t\t\t},\n\t\t};\n\n\t\t// Queue webhooks to all configured URLs\n\t\tfor (const url of decryptedSettings.alertWebhooks) {\n\t\t\tawait queueWebhook({\n\t\t\t\torgId,\n\t\t\t\turl,\n\t\t\t\tpayload,\n\t\t\t\tsigningSecret: decryptedSettings.webhookSigningSecret,\n\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\"Alert webhooks queued\", {\n\t\t\torgId,\n\t\t\talertType: alert.type,\n\t\t\twebhookCount: decryptedSettings.alertWebhooks.length,\n\t\t});\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to send alert webhooks\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t\t{ orgId, alertType: alert.type },\n\t\t);\n\t}\n}\n\n// ============================================================================\n// BACKGROUND PROCESSOR\n// ============================================================================\n\nlet processorInterval: ReturnType<typeof setInterval> | null = null;\nlet lockRenewalInterval: ReturnType<typeof setInterval> | null = null;\n\nexport function startWebhookProcessor(intervalMs = 10_000): void {\n\tif (processorInterval) {\n\t\treturn; // Already running\n\t}\n\n\tprocessorInterval = setInterval(() => {\n\t\tprocessWebhookQueue().catch((error) => {\n\t\t\tlogger.error(\n\t\t\t\t\"Webhook processor error\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t);\n\t\t});\n\t}, intervalMs);\n\n\t// Periodically renew the lock while we're running\n\tlockRenewalInterval = setInterval(() => {\n\t\trenewLock().catch((error) => {\n\t\t\tlogger.error(\n\t\t\t\t\"Lock renewal error\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t);\n\t\t});\n\t}, LOCK_RENEWAL_MS);\n\n\t// In test mode, unref intervals so they don't keep the process alive\n\tif (process.env.VITEST === \"true\" || process.env.NODE_ENV === \"test\") {\n\t\tprocessorInterval.unref();\n\t\tlockRenewalInterval.unref();\n\t}\n\n\tlogger.info(\"Webhook processor started\", {\n\t\tintervalMs,\n\t\tinstanceId: INSTANCE_ID,\n\t});\n}\n\nexport async function stopWebhookProcessor(): Promise<void> {\n\tif (processorInterval) {\n\t\tclearInterval(processorInterval);\n\t\tprocessorInterval = null;\n\t\t// Release the lock so another instance can take over\n\t\tawait releaseLock();\n\t\tlogger.info(\"Webhook processor stopped\");\n\t}\n\tif (lockRenewalInterval) {\n\t\tclearInterval(lockRenewalInterval);\n\t\tlockRenewalInterval = null;\n\t}\n}\n\n// ============================================================================\n// METRICS\n// ============================================================================\n\nexport interface WebhookQueueMetrics {\n\tpendingCount: number;\n\tfailedCount: number;\n\ttotalCount: number;\n}\n\nexport async function getWebhookQueueMetrics(): Promise<WebhookQueueMetrics> {\n\tif (!isDbAvailable()) {\n\t\treturn { pendingCount: 0, failedCount: 0, totalCount: 0 };\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tconst now = new Date();\n\n\t\tconst [pendingResult] = await db\n\t\t\t.select({ value: count() })\n\t\t\t.from(webhookDeliveries)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\teq(webhookDeliveries.status, \"pending\"),\n\t\t\t\t\tor(\n\t\t\t\t\t\tlte(webhookDeliveries.nextRetryAt, now),\n\t\t\t\t\t\tisNull(webhookDeliveries.nextRetryAt),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\tconst [failedResult] = await db\n\t\t\t.select({ value: count() })\n\t\t\t.from(webhookDeliveries)\n\t\t\t.where(eq(webhookDeliveries.status, \"failed\"));\n\n\t\tconst [totalResult] = await db\n\t\t\t.select({ value: count() })\n\t\t\t.from(webhookDeliveries);\n\n\t\treturn {\n\t\t\tpendingCount: pendingResult?.value ?? 0,\n\t\t\tfailedCount: failedResult?.value ?? 0,\n\t\t\ttotalCount: totalResult?.value ?? 0,\n\t\t};\n\t} catch {\n\t\treturn { pendingCount: 0, failedCount: 0, totalCount: 0 };\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/webhooks/delivery.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Webhook Delivery Service\n *\n * Handles reliable webhook delivery with:\n * - HMAC signing for payload integrity\n * - Exponential backoff retries\n * - Database-backed delivery queue\n * - Delivery status tracking\n */\n\nimport crypto from \"node:crypto\";\nimport { and, count, eq, isNull, lt, lte, or } from \"drizzle-orm\";\nimport { getDb, isDbAvailable } from \"../db/client.js\";\nimport {\n\tdistributedLocks,\n\torganizations,\n\twebhookDeliveries,\n} from \"../db/schema.js\";\nimport { decryptOrgSettings } from \"../db/settings-encryption.js\";\nimport { fetchDownstream } from \"../utils/downstream-http.js\";\nimport { createLogger } from \"../utils/logger.js\";\n\n// Unique identifier for this process instance\nconst INSTANCE_ID = `${process.pid}-${crypto.randomUUID().slice(0, 8)}`;\n\nconst logger = createLogger(\"webhooks:delivery\");\nconst WEBHOOK_DOWNSTREAM_MAX_ATTEMPTS = 1;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface WebhookPayload {\n\tevent: string;\n\ttimestamp: string;\n\tdata: Record<string, unknown>;\n}\n\nexport interface WebhookDeliveryOptions {\n\torgId: string;\n\turl: string;\n\tpayload: WebhookPayload;\n\tsigningSecret?: string;\n\tmaxAttempts?: number;\n}\n\nexport interface DeliveryResult {\n\tsuccess: boolean;\n\tstatusCode?: number;\n\tresponseTimeMs?: number;\n\terror?: string;\n}\n\nexport function buildWebhookDeliveryHeaders(\n\tsignature?: string,\n): Record<string, string> {\n\tconst headers: Record<string, string> = {\n\t\t\"Content-Type\": \"application/json\",\n\t\t\"User-Agent\": \"Maestro-Webhooks/1.0\",\n\t\t\"X-Webhook-Id\": crypto.randomUUID(),\n\t};\n\n\tif (signature) {\n\t\theaders[\"X-Composer-Signature\"] = signature;\n\t\theaders[\"X-Maestro-Signature\"] = signature;\n\t}\n\n\treturn headers;\n}\n\n// ============================================================================\n// HMAC SIGNING\n// ============================================================================\n\n/** Sign a webhook payload with HMAC-SHA256. Format: t=timestamp,v1=signature */\nexport function signPayload(\n\tpayload: string,\n\tsecret: string,\n\ttimestamp?: number,\n): { signature: string; timestamp: number } {\n\tconst ts = timestamp ?? Math.floor(Date.now() / 1000);\n\tconst signatureBase = `${ts}.${payload}`;\n\n\tconst signature = crypto\n\t\t.createHmac(\"sha256\", secret)\n\t\t.update(signatureBase)\n\t\t.digest(\"hex\");\n\n\treturn {\n\t\tsignature: `t=${ts},v1=${signature}`,\n\t\ttimestamp: ts,\n\t};\n}\n\nexport function verifySignature(\n\tpayload: string,\n\tsignature: string,\n\tsecret: string,\n\ttoleranceSeconds = 300,\n): { valid: boolean; error?: string } {\n\t// Parse signature: t=timestamp,v1=hash\n\tconst parts = signature.split(\",\");\n\tconst timestampPart = parts.find((p) => p.startsWith(\"t=\"));\n\tconst signaturePart = parts.find((p) => p.startsWith(\"v1=\"));\n\n\tif (!timestampPart || !signaturePart) {\n\t\treturn { valid: false, error: \"Invalid signature format\" };\n\t}\n\n\tconst timestamp = Number.parseInt(timestampPart.slice(2), 10);\n\tconst providedSig = signaturePart.slice(3);\n\n\tif (Number.isNaN(timestamp)) {\n\t\treturn { valid: false, error: \"Invalid timestamp\" };\n\t}\n\n\t// Check timestamp freshness\n\tconst now = Math.floor(Date.now() / 1000);\n\tif (Math.abs(now - timestamp) > toleranceSeconds) {\n\t\treturn { valid: false, error: \"Timestamp outside tolerance\" };\n\t}\n\n\t// Compute expected signature\n\tconst signatureBase = `${timestamp}.${payload}`;\n\tconst expected = crypto\n\t\t.createHmac(\"sha256\", secret)\n\t\t.update(signatureBase)\n\t\t.digest(\"hex\");\n\n\t// Timing-safe comparison\n\tconst providedBuf = Buffer.from(providedSig, \"hex\");\n\tconst expectedBuf = Buffer.from(expected, \"hex\");\n\n\tif (providedBuf.length !== expectedBuf.length) {\n\t\treturn { valid: false, error: \"Signature length mismatch\" };\n\t}\n\n\tif (!crypto.timingSafeEqual(providedBuf, expectedBuf)) {\n\t\treturn { valid: false, error: \"Signature mismatch\" };\n\t}\n\n\treturn { valid: true };\n}\n\n// ============================================================================\n// HTTP DELIVERY\n// ============================================================================\n\nasync function deliverHttp(\n\turl: string,\n\tpayload: string,\n\tsignature?: string,\n\ttimeoutMs = 30_000,\n): Promise<DeliveryResult> {\n\tconst startTime = Date.now();\n\tconst headers = buildWebhookDeliveryHeaders(signature);\n\n\ttry {\n\t\tconst response = await fetchDownstream(\n\t\t\turl,\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders,\n\t\t\t\tbody: payload,\n\t\t\t},\n\t\t\t{\n\t\t\t\tserviceName: \"webhook endpoint\",\n\t\t\t\tfailureMode: \"optional\",\n\t\t\t\ttimeoutMs,\n\t\t\t\t// The database queue owns webhook retry accounting.\n\t\t\t\tmaxAttempts: WEBHOOK_DOWNSTREAM_MAX_ATTEMPTS,\n\t\t\t},\n\t\t);\n\n\t\tconst responseTimeMs = Date.now() - startTime;\n\n\t\tif (response.ok) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tstatusCode: response.status,\n\t\t\t\tresponseTimeMs,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tstatusCode: response.status,\n\t\t\tresponseTimeMs,\n\t\t\terror: `HTTP ${response.status}: ${response.statusText}`,\n\t\t};\n\t} catch (error) {\n\t\tconst responseTimeMs = Date.now() - startTime;\n\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tresponseTimeMs,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n// ============================================================================\n// DISTRIBUTED LOCKING\n// ============================================================================\n\nconst LOCK_ID = \"webhook_processor\";\nconst LOCK_DURATION_MS = 60_000; // 1 minute lock duration\nconst LOCK_RENEWAL_MS = 30_000; // Renew every 30 seconds\nlet processorInFlight = false;\n\nasync function tryAcquireLock(): Promise<boolean> {\n\tif (!isDbAvailable()) {\n\t\treturn true; // No DB, no locking - just process\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tconst now = new Date();\n\t\tconst expiresAt = new Date(now.getTime() + LOCK_DURATION_MS);\n\n\t\t// Try to insert lock, or update if expired\n\t\tawait db\n\t\t\t.insert(distributedLocks)\n\t\t\t.values({\n\t\t\t\tid: LOCK_ID,\n\t\t\t\tholderId: INSTANCE_ID,\n\t\t\t\tacquiredAt: now,\n\t\t\t\texpiresAt,\n\t\t\t})\n\t\t\t.onConflictDoUpdate({\n\t\t\t\ttarget: distributedLocks.id,\n\t\t\t\tset: {\n\t\t\t\t\tholderId: INSTANCE_ID,\n\t\t\t\t\tacquiredAt: now,\n\t\t\t\t\texpiresAt,\n\t\t\t\t},\n\t\t\t\t// Only update if lock is expired or we already hold it\n\t\t\t\tsetWhere: or(\n\t\t\t\t\tlt(distributedLocks.expiresAt, now),\n\t\t\t\t\teq(distributedLocks.holderId, INSTANCE_ID),\n\t\t\t\t),\n\t\t\t});\n\n\t\t// Check if we got the lock\n\t\tconst [lock] = await db\n\t\t\t.select()\n\t\t\t.from(distributedLocks)\n\t\t\t.where(eq(distributedLocks.id, LOCK_ID))\n\t\t\t.limit(1);\n\n\t\treturn lock?.holderId === INSTANCE_ID;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to acquire lock\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\treturn false;\n\t}\n}\n\nasync function renewLock(): Promise<boolean> {\n\tif (!isDbAvailable()) {\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tconst now = new Date();\n\t\tconst expiresAt = new Date(now.getTime() + LOCK_DURATION_MS);\n\n\t\tconst result = await db\n\t\t\t.update(distributedLocks)\n\t\t\t.set({ expiresAt })\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\teq(distributedLocks.id, LOCK_ID),\n\t\t\t\t\teq(distributedLocks.holderId, INSTANCE_ID),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.returning({ id: distributedLocks.id });\n\n\t\treturn result.length > 0;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to renew lock\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\treturn false;\n\t}\n}\n\nasync function releaseLock(): Promise<void> {\n\tif (!isDbAvailable()) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tawait db\n\t\t\t.delete(distributedLocks)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\teq(distributedLocks.id, LOCK_ID),\n\t\t\t\t\teq(distributedLocks.holderId, INSTANCE_ID),\n\t\t\t\t),\n\t\t\t);\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to release lock\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t}\n}\n\n// ============================================================================\n// RETRY BACKOFF WITH JITTER\n// ============================================================================\n\nfunction calculateBackoffWithJitter(\n\tattempt: number,\n\tbaseMs = 1000,\n\tcapMs = 300_000,\n): number {\n\t// Exponential base: 2^attempt * baseMs\n\tconst exponential = Math.min(capMs, baseMs * 2 ** attempt);\n\t// Add jitter: random value between 50% and 150% of exponential\n\tconst jitter = exponential * (0.5 + Math.random());\n\treturn Math.min(capMs, Math.floor(jitter));\n}\n\n// ============================================================================\n// QUEUE OPERATIONS\n// ============================================================================\n\n/** Queue a webhook for delivery. Signature is generated at delivery time. */\nexport async function queueWebhook(\n\toptions: WebhookDeliveryOptions,\n): Promise<string | null> {\n\tif (!isDbAvailable()) {\n\t\tlogger.warn(\"Database unavailable, delivering webhook immediately\");\n\t\t// Fall back to immediate delivery without persistence\n\t\tconst payload = JSON.stringify(options.payload);\n\t\t// Sign at delivery time\n\t\tconst signature = options.signingSecret\n\t\t\t? signPayload(payload, options.signingSecret).signature\n\t\t\t: undefined;\n\n\t\tconst result = await deliverHttp(options.url, payload, signature);\n\t\tif (!result.success) {\n\t\t\tlogger.error(\"Immediate webhook delivery failed\", undefined, {\n\t\t\t\turl: options.url,\n\t\t\t\terror: result.error,\n\t\t\t});\n\t\t}\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\n\t\t// Don't pre-sign - signature will be generated at delivery time\n\t\t// This ensures the timestamp is fresh when the webhook is sent\n\t\tconst [delivery] = await db\n\t\t\t.insert(webhookDeliveries)\n\t\t\t.values({\n\t\t\t\torgId: options.orgId,\n\t\t\t\turl: options.url,\n\t\t\t\tpayload: options.payload,\n\t\t\t\t// Store the secret reference, not the pre-computed signature\n\t\t\t\tsignature: null,\n\t\t\t\tmaxAttempts: options.maxAttempts ?? 5,\n\t\t\t\tnextRetryAt: new Date(), // Immediate first attempt\n\t\t\t})\n\t\t\t.returning({ id: webhookDeliveries.id });\n\n\t\tif (!delivery) {\n\t\t\tlogger.error(\"Failed to queue webhook: no delivery returned\", undefined, {\n\t\t\t\turl: options.url,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\n\t\tlogger.debug(\"Webhook queued\", {\n\t\t\tid: delivery.id,\n\t\t\turl: options.url,\n\t\t\tevent: options.payload.event,\n\t\t});\n\n\t\treturn delivery.id;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to queue webhook\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t\t{ url: options.url },\n\t\t);\n\t\treturn null;\n\t}\n}\n\nexport async function processWebhookQueue(batchSize = 10): Promise<number> {\n\tif (!isDbAvailable()) {\n\t\treturn 0;\n\t}\n\tif (processorInFlight) {\n\t\treturn 0;\n\t}\n\ttry {\n\t\tprocessorInFlight = true;\n\n\t\t// Try to acquire the distributed lock\n\t\tconst hasLock = await tryAcquireLock();\n\t\tif (!hasLock) {\n\t\t\tlogger.debug(\"Another instance holds the webhook processor lock\");\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst db = getDb();\n\t\tconst now = new Date();\n\n\t\t// Fetch pending webhooks ready for delivery/retry\n\t\tconst pending = await db\n\t\t\t.select()\n\t\t\t.from(webhookDeliveries)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\tor(\n\t\t\t\t\t\teq(webhookDeliveries.status, \"pending\"),\n\t\t\t\t\t\teq(webhookDeliveries.status, \"retrying\"),\n\t\t\t\t\t),\n\t\t\t\t\tlte(webhookDeliveries.nextRetryAt, now),\n\t\t\t\t\tlt(webhookDeliveries.attempts, webhookDeliveries.maxAttempts),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.limit(batchSize);\n\n\t\tif (pending.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet processed = 0;\n\n\t\tfor (const delivery of pending) {\n\t\t\tconst payload = JSON.stringify(delivery.payload);\n\n\t\t\t// Sign at delivery time with fresh timestamp\n\t\t\tlet signature: string | undefined;\n\t\t\tif (delivery.orgId) {\n\t\t\t\t// Get the org's signing secret\n\t\t\t\tconst [org] = await db\n\t\t\t\t\t.select({ settings: organizations.settings })\n\t\t\t\t\t.from(organizations)\n\t\t\t\t\t.where(eq(organizations.id, delivery.orgId))\n\t\t\t\t\t.limit(1);\n\n\t\t\t\t// Decrypt settings to access the signing secret\n\t\t\t\tconst decryptedSettings = decryptOrgSettings(org?.settings);\n\t\t\t\tif (decryptedSettings?.webhookSigningSecret) {\n\t\t\t\t\tsignature = signPayload(\n\t\t\t\t\t\tpayload,\n\t\t\t\t\t\tdecryptedSettings.webhookSigningSecret,\n\t\t\t\t\t).signature;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await deliverHttp(delivery.url, payload, signature);\n\n\t\t\tconst newAttempts = delivery.attempts + 1;\n\n\t\t\tif (result.success) {\n\t\t\t\t// Mark as delivered\n\t\t\t\tawait db\n\t\t\t\t\t.update(webhookDeliveries)\n\t\t\t\t\t.set({\n\t\t\t\t\t\tstatus: \"delivered\",\n\t\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\t\tlastStatusCode: result.statusCode,\n\t\t\t\t\t\tlastResponseTimeMs: result.responseTimeMs,\n\t\t\t\t\t\tdeliveredAt: new Date(),\n\t\t\t\t\t})\n\t\t\t\t\t.where(eq(webhookDeliveries.id, delivery.id));\n\n\t\t\t\tlogger.info(\"Webhook delivered\", {\n\t\t\t\t\tid: delivery.id,\n\t\t\t\t\turl: delivery.url,\n\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\tresponseTimeMs: result.responseTimeMs,\n\t\t\t\t});\n\t\t\t} else if (newAttempts >= delivery.maxAttempts) {\n\t\t\t\t// Max retries exceeded, mark as failed\n\t\t\t\tawait db\n\t\t\t\t\t.update(webhookDeliveries)\n\t\t\t\t\t.set({\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\t\tlastStatusCode: result.statusCode,\n\t\t\t\t\t\tlastResponseTimeMs: result.responseTimeMs,\n\t\t\t\t\t\tlastError: result.error,\n\t\t\t\t\t})\n\t\t\t\t\t.where(eq(webhookDeliveries.id, delivery.id));\n\n\t\t\t\tlogger.error(\"Webhook delivery failed permanently\", undefined, {\n\t\t\t\t\tid: delivery.id,\n\t\t\t\t\turl: delivery.url,\n\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\terror: result.error,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Schedule retry with exponential backoff + jitter\n\t\t\t\tconst backoffMs = calculateBackoffWithJitter(newAttempts);\n\t\t\t\tconst nextRetry = new Date(Date.now() + backoffMs);\n\n\t\t\t\tawait db\n\t\t\t\t\t.update(webhookDeliveries)\n\t\t\t\t\t.set({\n\t\t\t\t\t\tstatus: \"retrying\",\n\t\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\t\tlastStatusCode: result.statusCode,\n\t\t\t\t\t\tlastResponseTimeMs: result.responseTimeMs,\n\t\t\t\t\t\tlastError: result.error,\n\t\t\t\t\t\tnextRetryAt: nextRetry,\n\t\t\t\t\t})\n\t\t\t\t\t.where(eq(webhookDeliveries.id, delivery.id));\n\n\t\t\t\tlogger.warn(\"Webhook delivery failed, scheduling retry\", {\n\t\t\t\t\tid: delivery.id,\n\t\t\t\t\turl: delivery.url,\n\t\t\t\t\tattempts: newAttempts,\n\t\t\t\t\tnextRetryIn: `${Math.round(backoffMs / 1000)}s`,\n\t\t\t\t\terror: result.error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tprocessed++;\n\n\t\t\t// Renew lock if we're processing many webhooks\n\t\t\tif (processed % 5 === 0) {\n\t\t\t\tawait renewLock();\n\t\t\t}\n\t\t}\n\n\t\treturn processed;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to process webhook queue\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\treturn 0;\n\t} finally {\n\t\tprocessorInFlight = false;\n\t}\n}\n\nexport async function cleanupWebhookQueue(retentionDays = 7): Promise<number> {\n\tif (!isDbAvailable()) {\n\t\treturn 0;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tconst cutoff = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1000);\n\n\t\tconst result = await db\n\t\t\t.delete(webhookDeliveries)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\tor(\n\t\t\t\t\t\teq(webhookDeliveries.status, \"delivered\"),\n\t\t\t\t\t\teq(webhookDeliveries.status, \"failed\"),\n\t\t\t\t\t),\n\t\t\t\t\tlte(webhookDeliveries.createdAt, cutoff),\n\t\t\t\t),\n\t\t\t)\n\t\t\t.returning({ id: webhookDeliveries.id });\n\n\t\tif (result.length > 0) {\n\t\t\tlogger.info(\"Cleaned up old webhook deliveries\", {\n\t\t\t\tcount: result.length,\n\t\t\t\tretentionDays,\n\t\t\t});\n\t\t}\n\n\t\treturn result.length;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to cleanup webhook queue\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t);\n\t\treturn 0;\n\t}\n}\n\n// ============================================================================\n// ALERT WEBHOOK INTEGRATION\n// ============================================================================\n\nexport async function sendAlertWebhooks(\n\torgId: string,\n\talert: {\n\t\ttype: string;\n\t\tseverity: string;\n\t\tmessage: string;\n\t\tmetadata?: Record<string, unknown>;\n\t},\n): Promise<void> {\n\tif (!isDbAvailable()) {\n\t\tlogger.warn(\"Database unavailable, skipping alert webhooks\");\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\n\t\t// Get org settings to find webhook URLs and signing secret\n\t\tconst [org] = await db\n\t\t\t.select({ settings: organizations.settings })\n\t\t\t.from(organizations)\n\t\t\t.where(eq(organizations.id, orgId))\n\t\t\t.limit(1);\n\n\t\t// Decrypt settings to access sensitive fields\n\t\tconst decryptedSettings = decryptOrgSettings(org?.settings);\n\n\t\tif (!decryptedSettings?.alertWebhooks?.length) {\n\t\t\treturn; // No webhooks configured\n\t\t}\n\n\t\tconst payload: WebhookPayload = {\n\t\t\tevent: `alert.${alert.type}`,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tdata: {\n\t\t\t\tseverity: alert.severity,\n\t\t\t\tmessage: alert.message,\n\t\t\t\t...alert.metadata,\n\t\t\t},\n\t\t};\n\n\t\t// Queue webhooks to all configured URLs\n\t\tfor (const url of decryptedSettings.alertWebhooks) {\n\t\t\tawait queueWebhook({\n\t\t\t\torgId,\n\t\t\t\turl,\n\t\t\t\tpayload,\n\t\t\t\tsigningSecret: decryptedSettings.webhookSigningSecret,\n\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\"Alert webhooks queued\", {\n\t\t\torgId,\n\t\t\talertType: alert.type,\n\t\t\twebhookCount: decryptedSettings.alertWebhooks.length,\n\t\t});\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t\"Failed to send alert webhooks\",\n\t\t\terror instanceof Error ? error : undefined,\n\t\t\t{ orgId, alertType: alert.type },\n\t\t);\n\t}\n}\n\n// ============================================================================\n// BACKGROUND PROCESSOR\n// ============================================================================\n\nlet processorInterval: ReturnType<typeof setInterval> | null = null;\nlet lockRenewalInterval: ReturnType<typeof setInterval> | null = null;\n\nexport function startWebhookProcessor(intervalMs = 10_000): void {\n\tif (processorInterval) {\n\t\treturn; // Already running\n\t}\n\n\tprocessorInterval = setInterval(() => {\n\t\tprocessWebhookQueue().catch((error) => {\n\t\t\tlogger.error(\n\t\t\t\t\"Webhook processor error\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t);\n\t\t});\n\t}, intervalMs);\n\n\t// Periodically renew the lock while we're running\n\tlockRenewalInterval = setInterval(() => {\n\t\trenewLock().catch((error) => {\n\t\t\tlogger.error(\n\t\t\t\t\"Lock renewal error\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t);\n\t\t});\n\t}, LOCK_RENEWAL_MS);\n\n\t// In test mode, unref intervals so they don't keep the process alive\n\tif (process.env.VITEST === \"true\" || process.env.NODE_ENV === \"test\") {\n\t\tprocessorInterval.unref();\n\t\tlockRenewalInterval.unref();\n\t}\n\n\tlogger.info(\"Webhook processor started\", {\n\t\tintervalMs,\n\t\tinstanceId: INSTANCE_ID,\n\t});\n}\n\nexport async function stopWebhookProcessor(): Promise<void> {\n\tif (processorInterval) {\n\t\tclearInterval(processorInterval);\n\t\tprocessorInterval = null;\n\t\t// Release the lock so another instance can take over\n\t\tawait releaseLock();\n\t\tlogger.info(\"Webhook processor stopped\");\n\t}\n\tif (lockRenewalInterval) {\n\t\tclearInterval(lockRenewalInterval);\n\t\tlockRenewalInterval = null;\n\t}\n}\n\n// ============================================================================\n// METRICS\n// ============================================================================\n\nexport interface WebhookQueueMetrics {\n\tpendingCount: number;\n\tfailedCount: number;\n\ttotalCount: number;\n}\n\nexport async function getWebhookQueueMetrics(): Promise<WebhookQueueMetrics> {\n\tif (!isDbAvailable()) {\n\t\treturn { pendingCount: 0, failedCount: 0, totalCount: 0 };\n\t}\n\n\ttry {\n\t\tconst db = getDb();\n\t\tconst now = new Date();\n\n\t\tconst [pendingResult] = await db\n\t\t\t.select({ value: count() })\n\t\t\t.from(webhookDeliveries)\n\t\t\t.where(\n\t\t\t\tand(\n\t\t\t\t\teq(webhookDeliveries.status, \"pending\"),\n\t\t\t\t\tor(\n\t\t\t\t\t\tlte(webhookDeliveries.nextRetryAt, now),\n\t\t\t\t\t\tisNull(webhookDeliveries.nextRetryAt),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\tconst [failedResult] = await db\n\t\t\t.select({ value: count() })\n\t\t\t.from(webhookDeliveries)\n\t\t\t.where(eq(webhookDeliveries.status, \"failed\"));\n\n\t\tconst [totalResult] = await db\n\t\t\t.select({ value: count() })\n\t\t\t.from(webhookDeliveries);\n\n\t\treturn {\n\t\t\tpendingCount: pendingResult?.value ?? 0,\n\t\t\tfailedCount: failedResult?.value ?? 0,\n\t\t\ttotalCount: totalResult?.value ?? 0,\n\t\t};\n\t} catch {\n\t\treturn { pendingCount: 0, failedCount: 0, totalCount: 0 };\n\t}\n}\n"]}
|
|
@@ -114,7 +114,7 @@ export interface DescEnum {
|
|
|
114
114
|
* A prefix shared by all enum values.
|
|
115
115
|
* For example, `my_enum_` for `enum MyEnum {MY_ENUM_A=0; MY_ENUM_B=1;}`
|
|
116
116
|
*/
|
|
117
|
-
readonly sharedPrefix?: string;
|
|
117
|
+
readonly sharedPrefix?: string | undefined;
|
|
118
118
|
/**
|
|
119
119
|
* Marked as deprecated in the protobuf source.
|
|
120
120
|
*/
|
|
@@ -192,8 +192,8 @@ export interface DescMessage {
|
|
|
192
192
|
*/
|
|
193
193
|
readonly oneofs: DescOneof[];
|
|
194
194
|
/**
|
|
195
|
-
*
|
|
196
|
-
* protobuf source.
|
|
195
|
+
* Standalone fields and oneof groups for this message, ordered by
|
|
196
|
+
* their appearance in the protobuf source.
|
|
197
197
|
*/
|
|
198
198
|
readonly members: (DescField | DescOneof)[];
|
|
199
199
|
/**
|
|
@@ -283,6 +283,13 @@ interface descFieldAndExtensionShared {
|
|
|
283
283
|
* See https://protobuf.dev/programming-guides/field_presence/
|
|
284
284
|
*/
|
|
285
285
|
readonly presence: SupportedFieldPresence;
|
|
286
|
+
/**
|
|
287
|
+
* Whether to reject invalid UTF-8 when reading this field from the binary
|
|
288
|
+
* wire format. Reflects the resolved `utf8_validation` feature: true for
|
|
289
|
+
* VERIFY (proto3 and editions 2023+ default), false for NONE (proto2
|
|
290
|
+
* default).
|
|
291
|
+
*/
|
|
292
|
+
readonly utf8Validation: boolean;
|
|
286
293
|
/**
|
|
287
294
|
* The compiler-generated descriptor.
|
|
288
295
|
*/
|
|
@@ -620,8 +627,8 @@ export interface DescMethod {
|
|
|
620
627
|
*/
|
|
621
628
|
export interface DescComments {
|
|
622
629
|
readonly leadingDetached: readonly string[];
|
|
623
|
-
readonly leading?: string;
|
|
624
|
-
readonly trailing?: string;
|
|
630
|
+
readonly leading?: string | undefined;
|
|
631
|
+
readonly trailing?: string | undefined;
|
|
625
632
|
readonly sourcePath: readonly number[];
|
|
626
633
|
}
|
|
627
634
|
export {};
|
|
@@ -94,7 +94,7 @@ function readField(message, reader, field, wireType, options) {
|
|
|
94
94
|
var _a;
|
|
95
95
|
switch (field.fieldKind) {
|
|
96
96
|
case "scalar":
|
|
97
|
-
message.set(field, readScalar(reader, field.scalar));
|
|
97
|
+
message.set(field, readScalar(reader, field.scalar, field.utf8Validation));
|
|
98
98
|
break;
|
|
99
99
|
case "enum":
|
|
100
100
|
const val = readScalar(reader, descriptors_js_1.ScalarType.INT32);
|
|
@@ -144,12 +144,12 @@ function readMapEntry(reader, map, options) {
|
|
|
144
144
|
const [fieldNo] = reader.tag();
|
|
145
145
|
switch (fieldNo) {
|
|
146
146
|
case 1:
|
|
147
|
-
key = readScalar(reader, field.mapKey);
|
|
147
|
+
key = readScalar(reader, field.mapKey, field.utf8Validation);
|
|
148
148
|
break;
|
|
149
149
|
case 2:
|
|
150
150
|
switch (field.mapKind) {
|
|
151
151
|
case "scalar":
|
|
152
|
-
val = readScalar(reader, field.scalar);
|
|
152
|
+
val = readScalar(reader, field.scalar, field.utf8Validation);
|
|
153
153
|
break;
|
|
154
154
|
case "enum":
|
|
155
155
|
val = reader.int32();
|
|
@@ -191,12 +191,12 @@ function readListField(reader, wireType, list, options) {
|
|
|
191
191
|
scalarType != descriptors_js_1.ScalarType.STRING &&
|
|
192
192
|
scalarType != descriptors_js_1.ScalarType.BYTES;
|
|
193
193
|
if (!packed) {
|
|
194
|
-
list.add(readScalar(reader, scalarType));
|
|
194
|
+
list.add(readScalar(reader, scalarType, field.utf8Validation));
|
|
195
195
|
return;
|
|
196
196
|
}
|
|
197
197
|
const e = reader.uint32() + reader.pos;
|
|
198
198
|
while (reader.pos < e) {
|
|
199
|
-
list.add(readScalar(reader, scalarType));
|
|
199
|
+
list.add(readScalar(reader, scalarType, field.utf8Validation));
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
function readMessageField(reader, options, field, mergeMessage) {
|
|
@@ -205,10 +205,10 @@ function readMessageField(reader, options, field, mergeMessage) {
|
|
|
205
205
|
readMessage(message, reader, options, delimited, delimited ? field.number : reader.uint32());
|
|
206
206
|
return message;
|
|
207
207
|
}
|
|
208
|
-
function readScalar(reader, type) {
|
|
208
|
+
function readScalar(reader, type, validateUtf8 = false) {
|
|
209
209
|
switch (type) {
|
|
210
210
|
case descriptors_js_1.ScalarType.STRING:
|
|
211
|
-
return reader.string();
|
|
211
|
+
return reader.string(validateUtf8);
|
|
212
212
|
case descriptors_js_1.ScalarType.BOOL:
|
|
213
213
|
return reader.bool();
|
|
214
214
|
case descriptors_js_1.ScalarType.DOUBLE:
|
|
@@ -491,7 +491,7 @@ function anyFromJson(any, json, opts) {
|
|
|
491
491
|
throw new Error(`cannot decode message ${any.$typeName} from JSON: ${typeUrl} is not in the type registry`);
|
|
492
492
|
}
|
|
493
493
|
const msg = (0, reflect_js_1.reflect)(desc);
|
|
494
|
-
if (
|
|
494
|
+
if ((0, index_js_1.hasCustomJsonRepresentation)(desc) &&
|
|
495
495
|
Object.prototype.hasOwnProperty.call(json, "value")) {
|
|
496
496
|
const value = json.value;
|
|
497
497
|
readMessage(msg, value, opts);
|
|
@@ -89,7 +89,7 @@ export declare function buildPath(schema: DescMessage): PathBuilder;
|
|
|
89
89
|
* paths that refer to an extension.
|
|
90
90
|
*/
|
|
91
91
|
export declare function parsePath(schema: DescMessage, path: string, options?: {
|
|
92
|
-
registry?: Registry;
|
|
92
|
+
registry?: Registry | undefined;
|
|
93
93
|
}): Path;
|
|
94
94
|
/**
|
|
95
95
|
* Stringify a path.
|
|
@@ -197,6 +197,8 @@ function initBaseRegistry(inputs) {
|
|
|
197
197
|
const EDITION_PROTO2 = 998;
|
|
198
198
|
// bootstrap-inject google.protobuf.Edition.EDITION_PROTO3: const $name: Edition.$localName = $number;
|
|
199
199
|
const EDITION_PROTO3 = 999;
|
|
200
|
+
// bootstrap-inject google.protobuf.Edition.EDITION_UNSTABLE: const $name: Edition.$localName = $number;
|
|
201
|
+
const EDITION_UNSTABLE = 9999;
|
|
200
202
|
// bootstrap-inject google.protobuf.FieldDescriptorProto.Type.TYPE_STRING: const $name: FieldDescriptorProto_Type.$localName = $number;
|
|
201
203
|
const TYPE_STRING = 9;
|
|
202
204
|
// bootstrap-inject google.protobuf.FieldDescriptorProto.Type.TYPE_GROUP: const $name: FieldDescriptorProto_Type.$localName = $number;
|
|
@@ -227,9 +229,11 @@ const PACKED = 1;
|
|
|
227
229
|
const DELIMITED = 2;
|
|
228
230
|
// bootstrap-inject google.protobuf.FeatureSet.EnumType.OPEN: const $name: FeatureSet_EnumType.$localName = $number;
|
|
229
231
|
const OPEN = 1;
|
|
232
|
+
// bootstrap-inject google.protobuf.FeatureSet.Utf8Validation.VERIFY: const $name: FeatureSet_Utf8Validation.$localName = $number;
|
|
233
|
+
const VERIFY = 2;
|
|
230
234
|
// biome-ignore format: want this to read well
|
|
231
235
|
// bootstrap-inject defaults: EDITION_PROTO2 to EDITION_2024: export const minimumEdition: SupportedEdition = $minimumEdition, maximumEdition: SupportedEdition = $maximumEdition;
|
|
232
|
-
// generated from protoc
|
|
236
|
+
// generated from protoc v34.0
|
|
233
237
|
exports.minimumEdition = 998, exports.maximumEdition = 1001;
|
|
234
238
|
const featureDefaults = {
|
|
235
239
|
// EDITION_PROTO2
|
|
@@ -568,6 +572,7 @@ function newField(proto, parentOrFile, reg, oneof, mapEntries) {
|
|
|
568
572
|
message: undefined,
|
|
569
573
|
enum: undefined,
|
|
570
574
|
presence: getFieldPresence(proto, oneof, isExtension, parentOrFile),
|
|
575
|
+
utf8Validation: isUtf8Validated(proto, parentOrFile),
|
|
571
576
|
listKind: undefined,
|
|
572
577
|
mapKind: undefined,
|
|
573
578
|
mapKey: undefined,
|
|
@@ -696,6 +701,12 @@ function getFileEdition(proto) {
|
|
|
696
701
|
case "proto3":
|
|
697
702
|
return EDITION_PROTO3;
|
|
698
703
|
case "editions":
|
|
704
|
+
// EDITION_UNSTABLE is a sandbox for in-development features. Collapse
|
|
705
|
+
// it to maximumEdition so SupportedEdition and feature resolution do
|
|
706
|
+
// not leak the test-only edition to users.
|
|
707
|
+
if (proto.edition === EDITION_UNSTABLE) {
|
|
708
|
+
return exports.maximumEdition;
|
|
709
|
+
}
|
|
699
710
|
if (proto.edition in featureDefaults) {
|
|
700
711
|
return proto.edition;
|
|
701
712
|
}
|
|
@@ -891,6 +902,18 @@ function isDelimitedEncoding(proto, parent) {
|
|
|
891
902
|
parent,
|
|
892
903
|
}));
|
|
893
904
|
}
|
|
905
|
+
/**
|
|
906
|
+
* Reject invalid UTF-8 when reading string fields from the binary wire format?
|
|
907
|
+
* Driven by the resolved `utf8_validation` feature: VERIFY (proto3 / editions
|
|
908
|
+
* 2023+ default) enforces; NONE (proto2 default) does not.
|
|
909
|
+
*/
|
|
910
|
+
function isUtf8Validated(proto, parent) {
|
|
911
|
+
return (VERIFY ==
|
|
912
|
+
resolveFeature("utf8Validation", {
|
|
913
|
+
proto,
|
|
914
|
+
parent,
|
|
915
|
+
}));
|
|
916
|
+
}
|
|
894
917
|
function resolveFeature(name, ref) {
|
|
895
918
|
var _a, _b;
|
|
896
919
|
const featureSet = (_a = ref.proto.options) === null || _a === void 0 ? void 0 : _a.features;
|
|
@@ -226,10 +226,12 @@ function scalarToJson(field, value) {
|
|
|
226
226
|
case descriptors_js_1.ScalarType.INT64:
|
|
227
227
|
case descriptors_js_1.ScalarType.SFIXED64:
|
|
228
228
|
case descriptors_js_1.ScalarType.SINT64:
|
|
229
|
-
if (typeof value
|
|
230
|
-
|
|
229
|
+
if (typeof value == "bigint" ||
|
|
230
|
+
typeof value == "string" ||
|
|
231
|
+
(typeof value == "number" && Number.isInteger(value))) {
|
|
232
|
+
return value.toString();
|
|
231
233
|
}
|
|
232
|
-
|
|
234
|
+
throw new Error(`cannot encode ${field} to JSON: ${(_e = (0, reflect_check_js_1.checkField)(field, value)) === null || _e === void 0 ? void 0 : _e.message}`);
|
|
233
235
|
// bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.
|
|
234
236
|
// Either standard or URL-safe base64 encoding with/without paddings are accepted.
|
|
235
237
|
case descriptors_js_1.ScalarType.BYTES:
|
|
@@ -286,13 +288,10 @@ function anyToJson(val, opts) {
|
|
|
286
288
|
if (!desc || !message) {
|
|
287
289
|
throw new Error(`cannot encode message ${val.$typeName} to JSON: "${val.typeUrl}" is not in the type registry`);
|
|
288
290
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
typeof json !== "object") {
|
|
294
|
-
json = { value: json };
|
|
295
|
-
}
|
|
291
|
+
const reflected = (0, reflect_js_1.reflect)(desc, message);
|
|
292
|
+
const json = (0, wrappers_js_1.hasCustomJsonRepresentation)(desc)
|
|
293
|
+
? { value: tryWktToJson(reflected, opts) }
|
|
294
|
+
: reflectToJson(reflected, opts);
|
|
296
295
|
json["@type"] = val.typeUrl;
|
|
297
296
|
return json;
|
|
298
297
|
}
|
|
@@ -15,7 +15,7 @@ export type Message<TypeName extends string = string> = {
|
|
|
15
15
|
/**
|
|
16
16
|
* Unknown fields and extensions stored on the message.
|
|
17
17
|
*/
|
|
18
|
-
$unknown?: UnknownField[];
|
|
18
|
+
$unknown?: UnknownField[] | undefined;
|
|
19
19
|
};
|
|
20
20
|
/**
|
|
21
21
|
* Extract the message type from a message descriptor.
|
|
@@ -63,7 +63,7 @@ export declare class BinaryWriter {
|
|
|
63
63
|
private readonly encodeUtf8;
|
|
64
64
|
/**
|
|
65
65
|
* We cannot allocate a buffer for the entire output
|
|
66
|
-
* because we don't know
|
|
66
|
+
* because we don't know its size.
|
|
67
67
|
*
|
|
68
68
|
* So we collect smaller chunks of known size and
|
|
69
69
|
* concat them later.
|
|
@@ -120,7 +120,7 @@ export declare class BinaryWriter {
|
|
|
120
120
|
*/
|
|
121
121
|
int32(value: number): this;
|
|
122
122
|
/**
|
|
123
|
-
* Write a `bool` value, a
|
|
123
|
+
* Write a `bool` value, a varint.
|
|
124
124
|
*/
|
|
125
125
|
bool(value: boolean): this;
|
|
126
126
|
/**
|
|
@@ -152,7 +152,7 @@ export declare class BinaryWriter {
|
|
|
152
152
|
*/
|
|
153
153
|
sint32(value: number): this;
|
|
154
154
|
/**
|
|
155
|
-
* Write a `
|
|
155
|
+
* Write a `sfixed64` value, a signed, fixed-length 64-bit integer.
|
|
156
156
|
*/
|
|
157
157
|
sfixed64(value: string | number | bigint): this;
|
|
158
158
|
/**
|
|
@@ -184,9 +184,10 @@ export declare class BinaryReader {
|
|
|
184
184
|
readonly len: number;
|
|
185
185
|
protected readonly buf: Uint8Array;
|
|
186
186
|
private readonly view;
|
|
187
|
-
constructor(buf: Uint8Array, decodeUtf8?: (bytes: Uint8Array) => string);
|
|
187
|
+
constructor(buf: Uint8Array, decodeUtf8?: (bytes: Uint8Array, strict?: boolean) => string);
|
|
188
188
|
/**
|
|
189
|
-
* Reads a tag - field number and wire type.
|
|
189
|
+
* Reads a tag - field number and wire type. Tags are uint32 varints; values
|
|
190
|
+
* that do not fit in uint32 are rejected.
|
|
190
191
|
*/
|
|
191
192
|
tag(): [number, WireType];
|
|
192
193
|
/**
|
|
@@ -258,7 +259,8 @@ export declare class BinaryReader {
|
|
|
258
259
|
*/
|
|
259
260
|
bytes(): Uint8Array;
|
|
260
261
|
/**
|
|
261
|
-
* Read a `string` field, length-delimited data converted to UTF-8 text.
|
|
262
|
+
* Read a `string` field, length-delimited data converted to UTF-8 text. If
|
|
263
|
+
* `strict` is true, throw on invalid UTF-8 instead of substituting U+FFFD.
|
|
262
264
|
*/
|
|
263
|
-
string(): string;
|
|
265
|
+
string(strict?: boolean): string;
|
|
264
266
|
}
|
|
@@ -181,7 +181,7 @@ class BinaryWriter {
|
|
|
181
181
|
return this;
|
|
182
182
|
}
|
|
183
183
|
/**
|
|
184
|
-
* Write a `bool` value, a
|
|
184
|
+
* Write a `bool` value, a varint.
|
|
185
185
|
*/
|
|
186
186
|
bool(value) {
|
|
187
187
|
this.buf.push(value ? 1 : 0);
|
|
@@ -248,7 +248,7 @@ class BinaryWriter {
|
|
|
248
248
|
return this;
|
|
249
249
|
}
|
|
250
250
|
/**
|
|
251
|
-
* Write a `
|
|
251
|
+
* Write a `sfixed64` value, a signed, fixed-length 64-bit integer.
|
|
252
252
|
*/
|
|
253
253
|
sfixed64(value) {
|
|
254
254
|
let chunk = new Uint8Array(8), view = new DataView(chunk.buffer), tc = proto_int64_js_1.protoInt64.enc(value);
|
|
@@ -307,12 +307,21 @@ class BinaryReader {
|
|
|
307
307
|
this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
308
308
|
}
|
|
309
309
|
/**
|
|
310
|
-
* Reads a tag - field number and wire type.
|
|
310
|
+
* Reads a tag - field number and wire type. Tags are uint32 varints; values
|
|
311
|
+
* that do not fit in uint32 are rejected.
|
|
311
312
|
*/
|
|
312
313
|
tag() {
|
|
313
|
-
|
|
314
|
-
|
|
314
|
+
const start = this.pos;
|
|
315
|
+
const tag = this.uint32();
|
|
316
|
+
const bytesRead = this.pos - start;
|
|
317
|
+
if (bytesRead > 5 || (bytesRead == 5 && this.buf[this.pos - 1] > 0x0f)) {
|
|
318
|
+
throw new Error("illegal tag: varint overflows uint32");
|
|
319
|
+
}
|
|
320
|
+
const fieldNo = tag >>> 3;
|
|
321
|
+
const wireType = tag & 7;
|
|
322
|
+
if (fieldNo <= 0 || wireType > 5) {
|
|
315
323
|
throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType);
|
|
324
|
+
}
|
|
316
325
|
return [fieldNo, wireType];
|
|
317
326
|
}
|
|
318
327
|
/**
|
|
@@ -458,10 +467,11 @@ class BinaryReader {
|
|
|
458
467
|
return this.buf.subarray(start, start + len);
|
|
459
468
|
}
|
|
460
469
|
/**
|
|
461
|
-
* Read a `string` field, length-delimited data converted to UTF-8 text.
|
|
470
|
+
* Read a `string` field, length-delimited data converted to UTF-8 text. If
|
|
471
|
+
* `strict` is true, throw on invalid UTF-8 instead of substituting U+FFFD.
|
|
462
472
|
*/
|
|
463
|
-
string() {
|
|
464
|
-
return this.decodeUtf8(this.bytes());
|
|
473
|
+
string(strict) {
|
|
474
|
+
return this.decodeUtf8(this.bytes(), strict);
|
|
465
475
|
}
|
|
466
476
|
}
|
|
467
477
|
exports.BinaryReader = BinaryReader;
|
|
@@ -8,9 +8,11 @@ interface TextEncoding {
|
|
|
8
8
|
*/
|
|
9
9
|
encodeUtf8: (text: string) => Uint8Array<ArrayBuffer>;
|
|
10
10
|
/**
|
|
11
|
-
* Decode UTF-8 text from binary.
|
|
11
|
+
* Decode UTF-8 text from binary. If `strict` is true, throw on invalid byte
|
|
12
|
+
* sequences instead of silently substituting U+FFFD. Implementations that
|
|
13
|
+
* do not support strict decoding may ignore the flag.
|
|
12
14
|
*/
|
|
13
|
-
decodeUtf8: (bytes: Uint8Array) => string;
|
|
15
|
+
decodeUtf8: (bytes: Uint8Array, strict?: boolean) => string;
|
|
14
16
|
}
|
|
15
17
|
/**
|
|
16
18
|
* Protobuf-ES requires the Text Encoding API to convert UTF-8 from and to
|
|
@@ -32,11 +32,18 @@ function getTextEncoding() {
|
|
|
32
32
|
if (globalThis[symbol] == undefined) {
|
|
33
33
|
const te = new globalThis.TextEncoder();
|
|
34
34
|
const td = new globalThis.TextDecoder();
|
|
35
|
+
let tdStrict;
|
|
35
36
|
globalThis[symbol] = {
|
|
36
37
|
encodeUtf8(text) {
|
|
37
38
|
return te.encode(text);
|
|
38
39
|
},
|
|
39
|
-
decodeUtf8(bytes) {
|
|
40
|
+
decodeUtf8(bytes, strict) {
|
|
41
|
+
if (strict) {
|
|
42
|
+
if (tdStrict === undefined) {
|
|
43
|
+
tdStrict = new globalThis.TextDecoder("utf-8", { fatal: true });
|
|
44
|
+
}
|
|
45
|
+
return tdStrict.decode(bytes);
|
|
46
|
+
}
|
|
40
47
|
return td.decode(bytes);
|
|
41
48
|
},
|
|
42
49
|
checkUtf8(text) {
|
|
@@ -75,7 +75,7 @@ export type Api = Message<"google.protobuf.Api"> & {
|
|
|
75
75
|
*
|
|
76
76
|
* @generated from field: google.protobuf.SourceContext source_context = 5;
|
|
77
77
|
*/
|
|
78
|
-
sourceContext?: SourceContext;
|
|
78
|
+
sourceContext?: SourceContext | undefined;
|
|
79
79
|
/**
|
|
80
80
|
* Included interfaces. See [Mixin][].
|
|
81
81
|
*
|
package/node_modules/@bufbuild/protobuf/dist/cjs/wkt/gen/google/protobuf/compiler/plugin_pb.d.ts
CHANGED
|
@@ -121,7 +121,7 @@ export type CodeGeneratorRequest = Message<"google.protobuf.compiler.CodeGenerat
|
|
|
121
121
|
*
|
|
122
122
|
* @generated from field: optional google.protobuf.compiler.Version compiler_version = 3;
|
|
123
123
|
*/
|
|
124
|
-
compilerVersion?: Version;
|
|
124
|
+
compilerVersion?: Version | undefined;
|
|
125
125
|
};
|
|
126
126
|
/**
|
|
127
127
|
* An encoded CodeGeneratorRequest is written to the plugin's stdin.
|
|
@@ -371,7 +371,7 @@ export type CodeGeneratorResponse_File = Message<"google.protobuf.compiler.CodeG
|
|
|
371
371
|
*
|
|
372
372
|
* @generated from field: optional google.protobuf.GeneratedCodeInfo generated_code_info = 16;
|
|
373
373
|
*/
|
|
374
|
-
generatedCodeInfo?: GeneratedCodeInfo;
|
|
374
|
+
generatedCodeInfo?: GeneratedCodeInfo | undefined;
|
|
375
375
|
};
|
|
376
376
|
/**
|
|
377
377
|
* Represents a single generated file.
|