@evalops/maestro 0.10.8 → 0.10.10
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 +28 -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 +69 -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/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 +36 -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 +41771 -22892
- 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/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 +122 -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 +83 -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 +73 -14
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/remote-runner/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n\ttype PlatformServiceConfig,\n\tgetEnvValue,\n\tnormalizeBaseUrl,\n\tpostPlatformConnect,\n\tresolvePlatformServiceConfig,\n\ttrimString,\n} from \"../platform/client.js\";\nimport {\n\tPLATFORM_CONNECT_METHODS,\n\tPLATFORM_CONNECT_SERVICES,\n\tplatformConnectMethodPath,\n\tplatformConnectServicePath,\n} from \"../platform/core-services.js\";\nimport { fetchDownstream } from \"../utils/downstream-http.js\";\n\nexport const DEFAULT_REMOTE_RUNNER_BASE_URL = \"https://runner.evalops.dev\";\nconst DEFAULT_TIMEOUT_MS = 5_000;\nconst DEFAULT_MAX_ATTEMPTS = 2;\nexport const DEFAULT_REMOTE_RUNNER_WAIT_TIMEOUT_MS = 5 * 60 * 1000;\nexport const DEFAULT_REMOTE_RUNNER_WAIT_POLL_INTERVAL_MS = 5_000;\n\nconst CREATE_RUNNER_SESSION_PATH = platformConnectMethodPath(\n\tPLATFORM_CONNECT_METHODS.remoteRunner.createRunnerSession,\n);\nconst GET_RUNNER_SESSION_PATH = platformConnectMethodPath(\n\tPLATFORM_CONNECT_METHODS.remoteRunner.getRunnerSession,\n);\nconst LIST_RUNNER_SESSIONS_PATH = platformConnectMethodPath(\n\tPLATFORM_CONNECT_METHODS.remoteRunner.listRunnerSessions,\n);\nconst STOP_RUNNER_SESSION_PATH = platformConnectMethodPath(\n\tPLATFORM_CONNECT_METHODS.remoteRunner.stopRunnerSession,\n);\nconst EXTEND_RUNNER_SESSION_PATH = platformConnectMethodPath(\n\tPLATFORM_CONNECT_METHODS.remoteRunner.extendRunnerSession,\n);\nconst MINT_ATTACH_TOKEN_PATH = platformConnectMethodPath(\n\tPLATFORM_CONNECT_METHODS.remoteRunner.mintAttachToken,\n);\nconst REVOKE_ATTACH_TOKEN_PATH = platformConnectMethodPath(\n\tPLATFORM_CONNECT_METHODS.remoteRunner.revokeAttachToken,\n);\nconst LIST_RUNNER_SESSION_EVENTS_PATH = platformConnectMethodPath(\n\tPLATFORM_CONNECT_METHODS.remoteRunner.listRunnerSessionEvents,\n);\nconst GET_REMOTE_RUNNER_STATUS_PATH = platformConnectMethodPath(\n\tPLATFORM_CONNECT_METHODS.remoteRunner.getStatus,\n);\n\nexport const RUNNER_SESSION_STATES = {\n\tUNSPECIFIED: \"RUNNER_SESSION_STATE_UNSPECIFIED\",\n\tREQUESTED: \"RUNNER_SESSION_STATE_REQUESTED\",\n\tPROVISIONING: \"RUNNER_SESSION_STATE_PROVISIONING\",\n\tRUNNING: \"RUNNER_SESSION_STATE_RUNNING\",\n\tIDLE: \"RUNNER_SESSION_STATE_IDLE\",\n\tSTOPPING: \"RUNNER_SESSION_STATE_STOPPING\",\n\tSTOPPED: \"RUNNER_SESSION_STATE_STOPPED\",\n\tEXPIRED: \"RUNNER_SESSION_STATE_EXPIRED\",\n\tFAILED: \"RUNNER_SESSION_STATE_FAILED\",\n\tLOST: \"RUNNER_SESSION_STATE_LOST\",\n} as const;\n\nexport type RunnerSessionState =\n\t(typeof RUNNER_SESSION_STATES)[keyof typeof RUNNER_SESSION_STATES];\n\nexport const RUNNER_ATTACH_ROLES = {\n\tUNSPECIFIED: \"RUNNER_ATTACH_ROLE_UNSPECIFIED\",\n\tVIEWER: \"RUNNER_ATTACH_ROLE_VIEWER\",\n\tCONTROLLER: \"RUNNER_ATTACH_ROLE_CONTROLLER\",\n\tADMIN: \"RUNNER_ATTACH_ROLE_ADMIN\",\n} as const;\n\nexport type RunnerAttachRole =\n\t(typeof RUNNER_ATTACH_ROLES)[keyof typeof RUNNER_ATTACH_ROLES];\n\nconst REMOTE_RUNNER_BASE_URL_ENV_VARS = [\n\t\"MAESTRO_REMOTE_RUNNER_URL\",\n\t\"REMOTE_RUNNER_SERVICE_URL\",\n\t\"EVALOPS_REMOTE_RUNNER_URL\",\n] as const;\n\nconst REMOTE_RUNNER_TOKEN_ENV_VARS = [\n\t\"MAESTRO_REMOTE_RUNNER_TOKEN\",\n\t\"REMOTE_RUNNER_SERVICE_TOKEN\",\n\t\"MAESTRO_EVALOPS_ACCESS_TOKEN\",\n\t\"EVALOPS_TOKEN\",\n] as const;\n\nconst REMOTE_RUNNER_ORGANIZATION_ENV_VARS = [\n\t\"MAESTRO_REMOTE_RUNNER_ORG_ID\",\n\t\"REMOTE_RUNNER_ORGANIZATION_ID\",\n\t\"MAESTRO_EVALOPS_ORG_ID\",\n\t\"EVALOPS_ORGANIZATION_ID\",\n\t\"MAESTRO_ENTERPRISE_ORG_ID\",\n] as const;\n\nconst REMOTE_RUNNER_WORKSPACE_ENV_VARS = [\n\t\"MAESTRO_REMOTE_RUNNER_WORKSPACE_ID\",\n\t\"REMOTE_RUNNER_WORKSPACE_ID\",\n\t\"MAESTRO_WORKSPACE_ID\",\n\t\"EVALOPS_WORKSPACE_ID\",\n] as const;\n\nconst REMOTE_RUNNER_TIMEOUT_ENV_VARS = [\n\t\"MAESTRO_REMOTE_RUNNER_TIMEOUT_MS\",\n\t\"REMOTE_RUNNER_SERVICE_TIMEOUT_MS\",\n] as const;\n\nconst REMOTE_RUNNER_MAX_ATTEMPTS_ENV_VARS = [\n\t\"MAESTRO_REMOTE_RUNNER_MAX_ATTEMPTS\",\n\t\"REMOTE_RUNNER_SERVICE_MAX_ATTEMPTS\",\n] as const;\n\nconst REMOTE_RUNNER_BASE_URL_SUFFIXES = [\n\tCREATE_RUNNER_SESSION_PATH,\n\tGET_RUNNER_SESSION_PATH,\n\tLIST_RUNNER_SESSIONS_PATH,\n\tSTOP_RUNNER_SESSION_PATH,\n\tEXTEND_RUNNER_SESSION_PATH,\n\tMINT_ATTACH_TOKEN_PATH,\n\tREVOKE_ATTACH_TOKEN_PATH,\n\tLIST_RUNNER_SESSION_EVENTS_PATH,\n\tGET_REMOTE_RUNNER_STATUS_PATH,\n\tplatformConnectServicePath(PLATFORM_CONNECT_SERVICES.remoteRunner),\n\t\"/v1/runner-sessions\",\n\t\"/v1/runner-sessions/\",\n] as const;\n\nexport interface RemoteRunnerServiceConfig extends PlatformServiceConfig {\n\torganizationId: string;\n\ttoken: string;\n}\n\nexport interface RemoteRunnerClientOptions {\n\tbaseUrl?: string;\n\ttoken?: string;\n\torganizationId?: string;\n\tworkspaceId?: string;\n\ttimeoutMs?: number;\n\tmaxAttempts?: number;\n}\n\nexport interface RunnerSession {\n\tid: string;\n\torganizationId?: string;\n\tworkspaceId?: string;\n\tuserId?: string;\n\tagentRunId?: string;\n\tmaestroSessionId?: string;\n\tstate?: RunnerSessionState | string;\n\trunnerProfile?: string;\n\trunnerImage?: string;\n\tworkspaceSource?: string;\n\trepoUrl?: string;\n\tbranch?: string;\n\tmodel?: string;\n\townerInstanceId?: string;\n\trunnerPodNamespace?: string;\n\trunnerPodName?: string;\n\trunnerServiceName?: string;\n\tcreatedAt?: string;\n\tstartedAt?: string;\n\texpiresAt?: string;\n\tidleExpiresAt?: string;\n\tstoppedAt?: string;\n\tstopReason?: string;\n\tlastHeartbeatAt?: string;\n\tusedRunnerSeconds?: number;\n\tusedIdleSeconds?: number;\n\testimatedCostMicros?: number;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface RunnerSessionEvent {\n\tid?: string;\n\tsessionId?: string;\n\tsequence?: number;\n\teventType?: string;\n\toccurredAt?: string;\n\tpayload?: Record<string, unknown>;\n}\n\nexport interface RunnerAttachToken {\n\tid: string;\n\tsessionId?: string;\n\tsubjectId?: string;\n\troles?: Array<RunnerAttachRole | string>;\n\tcreatedAt?: string;\n\texpiresAt?: string;\n\trevokedAt?: string;\n}\n\nexport interface CreateRunnerSessionInput {\n\tworkspaceId?: string;\n\tuserId?: string;\n\tagentRunId?: string;\n\tmaestroSessionId?: string;\n\tidempotencyKey?: string;\n\trunnerProfile: string;\n\trunnerImage?: string;\n\tworkspaceSource?: string;\n\trepoUrl?: string;\n\tbranch?: string;\n\tmodel?: string;\n\tttlMinutes: number;\n\tidleTtlMinutes?: number;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface ListRunnerSessionsInput {\n\tworkspaceId?: string;\n\tstate?: RunnerSessionState | string;\n\tlimit?: number;\n\toffset?: number;\n}\n\nexport interface ExtendRunnerSessionInput {\n\tsessionId: string;\n\tadditionalMinutes: number;\n\tadditionalIdleMinutes?: number;\n\treason?: string;\n}\n\nexport interface MintAttachTokenInput {\n\tsessionId: string;\n\tsubjectId?: string;\n\troles?: Array<RunnerAttachRole | string>;\n\tttlMinutes?: number;\n}\n\nexport interface RevokeAttachTokenInput {\n\tsessionId: string;\n\ttokenId: string;\n}\n\nexport interface ListRunnerSessionEventsInput {\n\tsessionId: string;\n\tafterSequence?: number;\n\tlimit?: number;\n}\n\nexport interface RemoteRunnerStatus {\n\tservice?: string;\n\tworkspaceId?: string;\n\tdownstreamPolicy?: string;\n}\n\nexport interface WaitForRunnerSessionReadyOptions\n\textends Omit<RemoteRunnerClientOptions, \"timeoutMs\"> {\n\ttimeoutMs?: number;\n\tpollIntervalMs?: number;\n\trequestTimeoutMs?: number;\n}\n\nexport class WaitForRunnerSessionReadyError extends Error {\n\treadonly code: \"timeout\" | \"terminal_state\";\n\treadonly elapsedMs: number;\n\treadonly attempts: number;\n\treadonly session?: RunnerSession;\n\n\tconstructor(input: {\n\t\tmessage: string;\n\t\tcode: \"timeout\" | \"terminal_state\";\n\t\telapsedMs: number;\n\t\tattempts: number;\n\t\tsession?: RunnerSession;\n\t}) {\n\t\tsuper(input.message);\n\t\tthis.name = \"WaitForRunnerSessionReadyError\";\n\t\tthis.code = input.code;\n\t\tthis.elapsedMs = input.elapsedMs;\n\t\tthis.attempts = input.attempts;\n\t\tthis.session = input.session;\n\t}\n}\n\nfunction runnerSessionReadyRequestOptions(\n\toptions: WaitForRunnerSessionReadyOptions,\n): RemoteRunnerClientOptions {\n\treturn {\n\t\tbaseUrl: options.baseUrl,\n\t\ttoken: options.token,\n\t\torganizationId: options.organizationId,\n\t\tworkspaceId: options.workspaceId,\n\t\tmaxAttempts: options.maxAttempts,\n\t\ttimeoutMs: options.requestTimeoutMs,\n\t};\n}\n\nfunction firstString(\n\trecord: Record<string, unknown> | undefined,\n\t...names: string[]\n): string | undefined {\n\tfor (const name of names) {\n\t\tconst value = record?.[name];\n\t\tif (typeof value === \"string\" && value.trim().length > 0) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction firstNumber(\n\trecord: Record<string, unknown> | undefined,\n\t...names: string[]\n): number | undefined {\n\tfor (const name of names) {\n\t\tconst value = record?.[name];\n\t\tif (typeof value === \"number\" && Number.isFinite(value)) {\n\t\t\treturn value;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\tconst parsed = Number(value);\n\t\t\tif (Number.isFinite(parsed)) {\n\t\t\t\treturn parsed;\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction firstRecord(\n\trecord: Record<string, unknown> | undefined,\n\t...names: string[]\n): Record<string, unknown> | undefined {\n\tfor (const name of names) {\n\t\tconst value = record?.[name];\n\t\tif (value && typeof value === \"object\" && !Array.isArray(value)) {\n\t\t\treturn value as Record<string, unknown>;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction firstArray(\n\trecord: Record<string, unknown> | undefined,\n\t...names: string[]\n): unknown[] | undefined {\n\tfor (const name of names) {\n\t\tconst value = record?.[name];\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction stripUndefinedValues(\n\tbody: Record<string, unknown>,\n): Record<string, unknown> {\n\treturn Object.fromEntries(\n\t\tObject.entries(body).filter((entry): entry is [string, unknown] => {\n\t\t\treturn entry[1] !== undefined;\n\t\t}),\n\t);\n}\n\nfunction normalizeRunnerSession(value: unknown): RunnerSession | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\tconst record = value as Record<string, unknown>;\n\tconst id = firstString(record, \"id\");\n\tif (!id) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tid,\n\t\torganizationId: firstString(record, \"organizationId\", \"organization_id\"),\n\t\tworkspaceId: firstString(record, \"workspaceId\", \"workspace_id\"),\n\t\tuserId: firstString(record, \"userId\", \"user_id\"),\n\t\tagentRunId: firstString(record, \"agentRunId\", \"agent_run_id\"),\n\t\tmaestroSessionId: firstString(\n\t\t\trecord,\n\t\t\t\"maestroSessionId\",\n\t\t\t\"maestro_session_id\",\n\t\t),\n\t\tstate: firstString(record, \"state\"),\n\t\trunnerProfile: firstString(record, \"runnerProfile\", \"runner_profile\"),\n\t\trunnerImage: firstString(record, \"runnerImage\", \"runner_image\"),\n\t\tworkspaceSource: firstString(record, \"workspaceSource\", \"workspace_source\"),\n\t\trepoUrl: firstString(record, \"repoUrl\", \"repo_url\"),\n\t\tbranch: firstString(record, \"branch\"),\n\t\tmodel: firstString(record, \"model\"),\n\t\townerInstanceId: firstString(\n\t\t\trecord,\n\t\t\t\"ownerInstanceId\",\n\t\t\t\"owner_instance_id\",\n\t\t),\n\t\trunnerPodNamespace: firstString(\n\t\t\trecord,\n\t\t\t\"runnerPodNamespace\",\n\t\t\t\"runner_pod_namespace\",\n\t\t),\n\t\trunnerPodName: firstString(record, \"runnerPodName\", \"runner_pod_name\"),\n\t\trunnerServiceName: firstString(\n\t\t\trecord,\n\t\t\t\"runnerServiceName\",\n\t\t\t\"runner_service_name\",\n\t\t),\n\t\tcreatedAt: firstString(record, \"createdAt\", \"created_at\"),\n\t\tstartedAt: firstString(record, \"startedAt\", \"started_at\"),\n\t\texpiresAt: firstString(record, \"expiresAt\", \"expires_at\"),\n\t\tidleExpiresAt: firstString(record, \"idleExpiresAt\", \"idle_expires_at\"),\n\t\tstoppedAt: firstString(record, \"stoppedAt\", \"stopped_at\"),\n\t\tstopReason: firstString(record, \"stopReason\", \"stop_reason\"),\n\t\tlastHeartbeatAt: firstString(\n\t\t\trecord,\n\t\t\t\"lastHeartbeatAt\",\n\t\t\t\"last_heartbeat_at\",\n\t\t),\n\t\tusedRunnerSeconds: firstNumber(\n\t\t\trecord,\n\t\t\t\"usedRunnerSeconds\",\n\t\t\t\"used_runner_seconds\",\n\t\t),\n\t\tusedIdleSeconds: firstNumber(\n\t\t\trecord,\n\t\t\t\"usedIdleSeconds\",\n\t\t\t\"used_idle_seconds\",\n\t\t),\n\t\testimatedCostMicros: firstNumber(\n\t\t\trecord,\n\t\t\t\"estimatedCostMicros\",\n\t\t\t\"estimated_cost_micros\",\n\t\t),\n\t\tmetadata: firstRecord(record, \"metadata\"),\n\t};\n}\n\nfunction normalizeRunnerSessionEvent(\n\tvalue: unknown,\n): RunnerSessionEvent | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\tconst record = value as Record<string, unknown>;\n\treturn {\n\t\tid: firstString(record, \"id\"),\n\t\tsessionId: firstString(record, \"sessionId\", \"session_id\"),\n\t\tsequence: firstNumber(record, \"sequence\"),\n\t\teventType: firstString(record, \"eventType\", \"event_type\"),\n\t\toccurredAt: firstString(record, \"occurredAt\", \"occurred_at\"),\n\t\tpayload: firstRecord(record, \"payload\"),\n\t};\n}\n\nfunction normalizeRunnerAttachToken(\n\tvalue: unknown,\n): RunnerAttachToken | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\tconst record = value as Record<string, unknown>;\n\tconst id = firstString(record, \"id\");\n\tif (!id) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tid,\n\t\tsessionId: firstString(record, \"sessionId\", \"session_id\"),\n\t\tsubjectId: firstString(record, \"subjectId\", \"subject_id\"),\n\t\troles: firstArray(record, \"roles\")?.filter(\n\t\t\t(value): value is RunnerAttachRole | string => typeof value === \"string\",\n\t\t),\n\t\tcreatedAt: firstString(record, \"createdAt\", \"created_at\"),\n\t\texpiresAt: firstString(record, \"expiresAt\", \"expires_at\"),\n\t\trevokedAt: firstString(record, \"revokedAt\", \"revoked_at\"),\n\t};\n}\n\nfunction requireSession(\n\tpayload: Record<string, unknown>,\n\tserviceName: string,\n): RunnerSession {\n\tconst session = normalizeRunnerSession(payload.session);\n\tif (!session) {\n\t\tthrow new Error(`${serviceName} returned no runner session`);\n\t}\n\treturn session;\n}\n\nfunction requireAttachToken(\n\tpayload: Record<string, unknown>,\n\tserviceName: string,\n): RunnerAttachToken {\n\tconst token = normalizeRunnerAttachToken(payload.token);\n\tif (!token) {\n\t\tthrow new Error(`${serviceName} returned no attach token`);\n\t}\n\treturn token;\n}\n\nfunction ensurePositiveMinutes(\n\tvalue: number,\n\tfield: string,\n\tmax = 1440,\n): number {\n\tif (!Number.isInteger(value) || value < 1 || value > max) {\n\t\tthrow new Error(`${field} must be an integer between 1 and ${max}`);\n\t}\n\treturn value;\n}\n\nfunction ensureNonNegativeMinutes(\n\tvalue: number | undefined,\n\tfield: string,\n\tmax = 1440,\n): number | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tif (!Number.isInteger(value) || value < 0 || value > max) {\n\t\tthrow new Error(`${field} must be an integer between 0 and ${max}`);\n\t}\n\treturn value;\n}\n\nfunction normalizeRole(role: RunnerAttachRole | string): RunnerAttachRole {\n\tconst normalized = role\n\t\t.trim()\n\t\t.toUpperCase()\n\t\t.replace(/^RUNNER_ATTACH_ROLE_/u, \"\");\n\tconst matched =\n\t\tRUNNER_ATTACH_ROLES[normalized as keyof typeof RUNNER_ATTACH_ROLES];\n\tif (!matched || matched === RUNNER_ATTACH_ROLES.UNSPECIFIED) {\n\t\tthrow new Error(`Unknown runner attach role: ${role}`);\n\t}\n\treturn matched;\n}\n\nfunction normalizeState(\n\tstate: RunnerSessionState | string,\n): RunnerSessionState {\n\tconst normalized = state\n\t\t.trim()\n\t\t.toUpperCase()\n\t\t.replace(/^RUNNER_SESSION_STATE_/u, \"\");\n\tconst matched =\n\t\tRUNNER_SESSION_STATES[normalized as keyof typeof RUNNER_SESSION_STATES];\n\tif (!matched || matched === RUNNER_SESSION_STATES.UNSPECIFIED) {\n\t\tthrow new Error(`Unknown runner session state: ${state}`);\n\t}\n\treturn matched;\n}\n\nfunction stateMatches(\n\tstate: RunnerSessionState | string | undefined,\n\texpected: readonly RunnerSessionState[],\n): boolean {\n\tif (!state) {\n\t\treturn false;\n\t}\n\ttry {\n\t\treturn expected.includes(normalizeState(state));\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction describeState(state: RunnerSessionState | string | undefined): string {\n\treturn (\n\t\tstate\n\t\t\t?.replace(/^RUNNER_SESSION_STATE_/u, \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replaceAll(\"_\", \"-\") ?? \"unknown\"\n\t);\n}\n\nfunction waitDelay(ms: number): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(resolve, ms);\n\t});\n}\n\nfunction normalizeConfig(\n\tconfig: PlatformServiceConfig,\n\toverrides: RemoteRunnerClientOptions,\n): RemoteRunnerServiceConfig | null {\n\tconst organizationId = trimString(\n\t\toverrides.organizationId ?? config.organizationId,\n\t);\n\tconst token = trimString(overrides.token ?? config.token);\n\tif (!organizationId || !token) {\n\t\treturn null;\n\t}\n\tconst explicitBaseUrl = trimString(overrides.baseUrl ?? config.baseUrl);\n\tconst baseUrl = normalizeBaseUrl(\n\t\texplicitBaseUrl ?? DEFAULT_REMOTE_RUNNER_BASE_URL,\n\t\tREMOTE_RUNNER_BASE_URL_SUFFIXES,\n\t);\n\treturn {\n\t\t...config,\n\t\tbaseUrl,\n\t\ttoken,\n\t\torganizationId,\n\t\tworkspaceId: trimString(overrides.workspaceId ?? config.workspaceId),\n\t\ttimeoutMs: overrides.timeoutMs ?? config.timeoutMs,\n\t\tmaxAttempts: overrides.maxAttempts ?? config.maxAttempts,\n\t};\n}\n\nexport async function resolveRemoteRunnerConfig(\n\toverrides: RemoteRunnerClientOptions = {},\n): Promise<RemoteRunnerServiceConfig | null> {\n\tconst config = await resolvePlatformServiceConfig({\n\t\tbaseUrlEnvVars: REMOTE_RUNNER_BASE_URL_ENV_VARS,\n\t\ttokenEnvVars: REMOTE_RUNNER_TOKEN_ENV_VARS,\n\t\torganizationEnvVars: REMOTE_RUNNER_ORGANIZATION_ENV_VARS,\n\t\tworkspaceEnvVars: REMOTE_RUNNER_WORKSPACE_ENV_VARS,\n\t\ttimeoutEnvVars: REMOTE_RUNNER_TIMEOUT_ENV_VARS,\n\t\tmaxAttemptsEnvVars: REMOTE_RUNNER_MAX_ATTEMPTS_ENV_VARS,\n\t\tbaseUrlSuffixes: REMOTE_RUNNER_BASE_URL_SUFFIXES,\n\t\tdefaultTimeoutMs: DEFAULT_TIMEOUT_MS,\n\t\tdefaultMaxAttempts: DEFAULT_MAX_ATTEMPTS,\n\t\trequireBaseUrl: false,\n\t\trequireOrganizationId: true,\n\t\trequireToken: true,\n\t});\n\tif (!config) {\n\t\treturn null;\n\t}\n\treturn normalizeConfig(config, overrides);\n}\n\nexport function hasRemoteRunnerDestination(): boolean {\n\tconst organizationId = getEnvValue(REMOTE_RUNNER_ORGANIZATION_ENV_VARS);\n\tconst token = getEnvValue(REMOTE_RUNNER_TOKEN_ENV_VARS);\n\treturn Boolean(organizationId && token);\n}\n\nexport function remoteRunnerGatewayBaseUrl(\n\tconfig: Pick<RemoteRunnerServiceConfig, \"baseUrl\">,\n\tsessionId: string,\n): string {\n\treturn `${config.baseUrl}/v1/runner-sessions/${encodeURIComponent(\n\t\tsessionId,\n\t)}/headless`;\n}\n\nasync function postRemoteRunner<T>(\n\tconfig: RemoteRunnerServiceConfig,\n\tpath: string,\n\tbody: Record<string, unknown>,\n\tnormalize: (payload: Record<string, unknown>) => T,\n): Promise<T> {\n\tconst response = await postPlatformConnect(\n\t\tconfig,\n\t\tpath,\n\t\tstripUndefinedValues(body),\n\t\t{\n\t\t\tserviceName: \"remote runner service\",\n\t\t\tfailureMode: \"required\",\n\t\t\ttimeoutMs: config.timeoutMs,\n\t\t\tmaxAttempts: config.maxAttempts,\n\t\t},\n\t);\n\tif (!response.ok) {\n\t\tconst text = await response.text();\n\t\tthrow new Error(\n\t\t\t`remote runner service returned ${response.status}: ${\n\t\t\t\ttext || response.statusText\n\t\t\t}`,\n\t\t);\n\t}\n\tconst text = await response.text();\n\tif (!text.trim()) {\n\t\tthrow new Error(\"remote runner service returned empty response\");\n\t}\n\treturn normalize(JSON.parse(text) as Record<string, unknown>);\n}\n\nasync function requireRemoteRunnerConfig(\n\toverrides: RemoteRunnerClientOptions,\n): Promise<RemoteRunnerServiceConfig> {\n\tconst config = await resolveRemoteRunnerConfig(overrides);\n\tif (!config) {\n\t\tthrow new Error(\n\t\t\t\"Remote runner requires EvalOps organization and access token. Set MAESTRO_REMOTE_RUNNER_ORG_ID/MAESTRO_EVALOPS_ORG_ID and MAESTRO_REMOTE_RUNNER_TOKEN/MAESTRO_EVALOPS_ACCESS_TOKEN, or run EvalOps login.\",\n\t\t);\n\t}\n\treturn config;\n}\n\nexport async function createRunnerSession(\n\tinput: CreateRunnerSessionInput,\n\toptions: RemoteRunnerClientOptions = {},\n): Promise<{\n\tsession: RunnerSession;\n\tevents: RunnerSessionEvent[];\n\treplayed: boolean;\n}> {\n\tconst config = await requireRemoteRunnerConfig(options);\n\tconst workspaceId = trimString(input.workspaceId ?? config.workspaceId);\n\tif (!workspaceId) {\n\t\tthrow new Error(\n\t\t\t\"Remote runner start requires a workspace id. Pass --workspace or set MAESTRO_REMOTE_RUNNER_WORKSPACE_ID.\",\n\t\t);\n\t}\n\tconst ttlMinutes = ensurePositiveMinutes(input.ttlMinutes, \"ttlMinutes\");\n\tconst idleTtlMinutes = ensureNonNegativeMinutes(\n\t\tinput.idleTtlMinutes,\n\t\t\"idleTtlMinutes\",\n\t);\n\treturn postRemoteRunner(\n\t\tconfig,\n\t\tCREATE_RUNNER_SESSION_PATH,\n\t\t{\n\t\t\torganizationId: config.organizationId,\n\t\t\tworkspaceId,\n\t\t\tuserId: trimString(input.userId),\n\t\t\tagentRunId: trimString(input.agentRunId),\n\t\t\tmaestroSessionId: trimString(input.maestroSessionId),\n\t\t\tidempotencyKey: trimString(input.idempotencyKey) ?? randomUUID(),\n\t\t\trunnerProfile: trimString(input.runnerProfile),\n\t\t\trunnerImage: trimString(input.runnerImage),\n\t\t\tworkspaceSource: trimString(input.workspaceSource),\n\t\t\trepoUrl: trimString(input.repoUrl),\n\t\t\tbranch: trimString(input.branch),\n\t\t\tmodel: trimString(input.model),\n\t\t\tttlMinutes,\n\t\t\tidleTtlMinutes,\n\t\t\tmetadata: input.metadata,\n\t\t},\n\t\t(payload) => ({\n\t\t\tsession: requireSession(payload, \"remote runner service\"),\n\t\t\tevents:\n\t\t\t\tfirstArray(payload, \"events\")\n\t\t\t\t\t?.map(normalizeRunnerSessionEvent)\n\t\t\t\t\t.filter((event): event is RunnerSessionEvent => Boolean(event)) ?? [],\n\t\t\treplayed: payload.replayed === true,\n\t\t}),\n\t);\n}\n\nexport async function getRunnerSession(\n\tsessionId: string,\n\toptions: RemoteRunnerClientOptions = {},\n): Promise<RunnerSession> {\n\tconst config = await requireRemoteRunnerConfig(options);\n\treturn postRemoteRunner(\n\t\tconfig,\n\t\tGET_RUNNER_SESSION_PATH,\n\t\t{ sessionId: trimString(sessionId) },\n\t\t(payload) => requireSession(payload, \"remote runner service\"),\n\t);\n}\n\nexport async function listRunnerSessions(\n\tinput: ListRunnerSessionsInput = {},\n\toptions: RemoteRunnerClientOptions = {},\n): Promise<{ sessions: RunnerSession[]; nextOffset?: number }> {\n\tconst config = await requireRemoteRunnerConfig(options);\n\tconst workspaceId = trimString(input.workspaceId ?? config.workspaceId);\n\tif (!workspaceId) {\n\t\tthrow new Error(\n\t\t\t\"Remote runner list requires a workspace id. Pass --workspace or set MAESTRO_REMOTE_RUNNER_WORKSPACE_ID.\",\n\t\t);\n\t}\n\treturn postRemoteRunner(\n\t\tconfig,\n\t\tLIST_RUNNER_SESSIONS_PATH,\n\t\t{\n\t\t\torganizationId: config.organizationId,\n\t\t\tworkspaceId,\n\t\t\tstate: input.state ? normalizeState(input.state) : undefined,\n\t\t\tlimit: input.limit,\n\t\t\toffset: input.offset,\n\t\t},\n\t\t(payload) => ({\n\t\t\tsessions:\n\t\t\t\tfirstArray(payload, \"sessions\")\n\t\t\t\t\t?.map(normalizeRunnerSession)\n\t\t\t\t\t.filter((session): session is RunnerSession => Boolean(session)) ??\n\t\t\t\t[],\n\t\t\tnextOffset: firstNumber(payload, \"nextOffset\", \"next_offset\"),\n\t\t}),\n\t);\n}\n\nexport async function stopRunnerSession(\n\tsessionId: string,\n\treason?: string,\n\toptions: RemoteRunnerClientOptions = {},\n): Promise<{ session: RunnerSession; event?: RunnerSessionEvent }> {\n\tconst config = await requireRemoteRunnerConfig(options);\n\treturn postRemoteRunner(\n\t\tconfig,\n\t\tSTOP_RUNNER_SESSION_PATH,\n\t\t{ sessionId: trimString(sessionId), reason: trimString(reason) },\n\t\t(payload) => ({\n\t\t\tsession: requireSession(payload, \"remote runner service\"),\n\t\t\tevent: normalizeRunnerSessionEvent(payload.event),\n\t\t}),\n\t);\n}\n\nexport async function extendRunnerSession(\n\tinput: ExtendRunnerSessionInput,\n\toptions: RemoteRunnerClientOptions = {},\n): Promise<{ session: RunnerSession; event?: RunnerSessionEvent }> {\n\tconst config = await requireRemoteRunnerConfig(options);\n\treturn postRemoteRunner(\n\t\tconfig,\n\t\tEXTEND_RUNNER_SESSION_PATH,\n\t\t{\n\t\t\tsessionId: trimString(input.sessionId),\n\t\t\tadditionalMinutes: ensurePositiveMinutes(\n\t\t\t\tinput.additionalMinutes,\n\t\t\t\t\"additionalMinutes\",\n\t\t\t),\n\t\t\tadditionalIdleMinutes: ensureNonNegativeMinutes(\n\t\t\t\tinput.additionalIdleMinutes,\n\t\t\t\t\"additionalIdleMinutes\",\n\t\t\t),\n\t\t\treason: trimString(input.reason),\n\t\t},\n\t\t(payload) => ({\n\t\t\tsession: requireSession(payload, \"remote runner service\"),\n\t\t\tevent: normalizeRunnerSessionEvent(payload.event),\n\t\t}),\n\t);\n}\n\nexport async function mintRunnerAttachToken(\n\tinput: MintAttachTokenInput,\n\toptions: RemoteRunnerClientOptions = {},\n): Promise<{\n\ttoken: RunnerAttachToken;\n\ttokenSecret: string;\n\tgatewayBaseUrl: string;\n}> {\n\tconst config = await requireRemoteRunnerConfig(options);\n\tconst sessionId = trimString(input.sessionId);\n\tif (!sessionId) {\n\t\tthrow new Error(\"Attach token requires a runner session id\");\n\t}\n\tconst roles = (\n\t\tinput.roles?.length ? input.roles : [RUNNER_ATTACH_ROLES.CONTROLLER]\n\t).map(normalizeRole);\n\tconst ttlMinutes = ensureNonNegativeMinutes(\n\t\tinput.ttlMinutes ?? 30,\n\t\t\"ttlMinutes\",\n\t\t60,\n\t);\n\tconst result = await postRemoteRunner(\n\t\tconfig,\n\t\tMINT_ATTACH_TOKEN_PATH,\n\t\t{\n\t\t\tsessionId,\n\t\t\tsubjectId: trimString(input.subjectId),\n\t\t\troles,\n\t\t\tttlMinutes,\n\t\t},\n\t\t(payload) => {\n\t\t\tconst tokenSecret = firstString(payload, \"tokenSecret\", \"token_secret\");\n\t\t\tif (!tokenSecret) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"remote runner service returned no attach token secret\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttoken: requireAttachToken(payload, \"remote runner service\"),\n\t\t\t\ttokenSecret,\n\t\t\t};\n\t\t},\n\t);\n\treturn {\n\t\t...result,\n\t\tgatewayBaseUrl: remoteRunnerGatewayBaseUrl(config, sessionId),\n\t};\n}\n\nexport async function revokeRunnerAttachToken(\n\tinput: RevokeAttachTokenInput,\n\toptions: RemoteRunnerClientOptions = {},\n): Promise<{ token: RunnerAttachToken; event?: RunnerSessionEvent }> {\n\tconst config = await requireRemoteRunnerConfig(options);\n\treturn postRemoteRunner(\n\t\tconfig,\n\t\tREVOKE_ATTACH_TOKEN_PATH,\n\t\t{\n\t\t\tsessionId: trimString(input.sessionId),\n\t\t\ttokenId: trimString(input.tokenId),\n\t\t},\n\t\t(payload) => ({\n\t\t\ttoken: requireAttachToken(payload, \"remote runner service\"),\n\t\t\tevent: normalizeRunnerSessionEvent(payload.event),\n\t\t}),\n\t);\n}\n\nexport async function listRunnerSessionEvents(\n\tinput: ListRunnerSessionEventsInput,\n\toptions: RemoteRunnerClientOptions = {},\n): Promise<{ events: RunnerSessionEvent[]; nextSequence?: number }> {\n\tconst config = await requireRemoteRunnerConfig(options);\n\treturn postRemoteRunner(\n\t\tconfig,\n\t\tLIST_RUNNER_SESSION_EVENTS_PATH,\n\t\t{\n\t\t\tsessionId: trimString(input.sessionId),\n\t\t\tafterSequence: input.afterSequence,\n\t\t\tlimit: input.limit,\n\t\t},\n\t\t(payload) => ({\n\t\t\tevents:\n\t\t\t\tfirstArray(payload, \"events\")\n\t\t\t\t\t?.map(normalizeRunnerSessionEvent)\n\t\t\t\t\t.filter((event): event is RunnerSessionEvent => Boolean(event)) ?? [],\n\t\t\tnextSequence: firstNumber(payload, \"nextSequence\", \"next_sequence\"),\n\t\t}),\n\t);\n}\n\nexport async function getRemoteRunnerStatus(\n\tworkspaceId?: string,\n\toptions: RemoteRunnerClientOptions = {},\n): Promise<RemoteRunnerStatus> {\n\tconst config = await requireRemoteRunnerConfig(options);\n\tconst resolvedWorkspaceId = trimString(workspaceId ?? config.workspaceId);\n\tif (!resolvedWorkspaceId) {\n\t\tthrow new Error(\n\t\t\t\"Remote runner status requires a workspace id. Pass --workspace or set MAESTRO_REMOTE_RUNNER_WORKSPACE_ID.\",\n\t\t);\n\t}\n\treturn postRemoteRunner(\n\t\tconfig,\n\t\tGET_REMOTE_RUNNER_STATUS_PATH,\n\t\t{\n\t\t\tworkspaceId: resolvedWorkspaceId,\n\t\t},\n\t\t(payload) => ({\n\t\t\tservice: firstString(payload, \"service\"),\n\t\t\tworkspaceId: firstString(payload, \"workspaceId\", \"workspace_id\"),\n\t\t\tdownstreamPolicy: firstString(\n\t\t\t\tpayload,\n\t\t\t\t\"downstreamPolicy\",\n\t\t\t\t\"downstream_policy\",\n\t\t\t),\n\t\t}),\n\t);\n}\n\nexport async function waitForRunnerSessionReady(\n\tsessionId: string,\n\toptions: WaitForRunnerSessionReadyOptions = {},\n): Promise<{\n\tsession: RunnerSession;\n\tattempts: number;\n\telapsedMs: number;\n}> {\n\tconst timeoutMs = options.timeoutMs ?? DEFAULT_REMOTE_RUNNER_WAIT_TIMEOUT_MS;\n\tconst pollIntervalMs =\n\t\toptions.pollIntervalMs ?? DEFAULT_REMOTE_RUNNER_WAIT_POLL_INTERVAL_MS;\n\tif (!Number.isFinite(timeoutMs) || timeoutMs < 1) {\n\t\tthrow new Error(\"Remote runner wait timeout must be at least 1ms\");\n\t}\n\tif (!Number.isFinite(pollIntervalMs) || pollIntervalMs < 0) {\n\t\tthrow new Error(\"Remote runner poll interval must be 0ms or greater\");\n\t}\n\n\tconst readyStates = [\n\t\tRUNNER_SESSION_STATES.RUNNING,\n\t\tRUNNER_SESSION_STATES.IDLE,\n\t] as const;\n\tconst terminalStates = [\n\t\tRUNNER_SESSION_STATES.STOPPED,\n\t\tRUNNER_SESSION_STATES.EXPIRED,\n\t\tRUNNER_SESSION_STATES.FAILED,\n\t\tRUNNER_SESSION_STATES.LOST,\n\t] as const;\n\n\tconst startedAt = Date.now();\n\tlet attempts = 0;\n\tlet lastSession: RunnerSession | undefined;\n\tconst requestOptions = runnerSessionReadyRequestOptions(options);\n\n\twhile (true) {\n\t\tattempts += 1;\n\t\tlastSession = await getRunnerSession(sessionId, requestOptions);\n\t\tconst elapsedMs = Date.now() - startedAt;\n\n\t\tif (stateMatches(lastSession.state, readyStates)) {\n\t\t\treturn {\n\t\t\t\tsession: lastSession,\n\t\t\t\tattempts,\n\t\t\t\telapsedMs,\n\t\t\t};\n\t\t}\n\n\t\tif (stateMatches(lastSession.state, terminalStates)) {\n\t\t\tconst stopReason = lastSession.stopReason?.trim();\n\t\t\tthrow new WaitForRunnerSessionReadyError({\n\t\t\t\tmessage: stopReason\n\t\t\t\t\t? `Remote runner session ${sessionId} entered terminal state ${describeState(lastSession.state)}: ${stopReason}`\n\t\t\t\t\t: `Remote runner session ${sessionId} entered terminal state ${describeState(lastSession.state)}`,\n\t\t\t\tcode: \"terminal_state\",\n\t\t\t\telapsedMs,\n\t\t\t\tattempts,\n\t\t\t\tsession: lastSession,\n\t\t\t});\n\t\t}\n\n\t\tif (elapsedMs >= timeoutMs) {\n\t\t\tthrow new WaitForRunnerSessionReadyError({\n\t\t\t\tmessage: `Timed out after ${timeoutMs}ms waiting for remote runner session ${sessionId} to become ready (last state: ${describeState(lastSession.state)})`,\n\t\t\t\tcode: \"timeout\",\n\t\t\t\telapsedMs,\n\t\t\t\tattempts,\n\t\t\t\tsession: lastSession,\n\t\t\t});\n\t\t}\n\n\t\tconst remainingMs = timeoutMs - elapsedMs;\n\t\tconst sleepMs = Math.min(pollIntervalMs, remainingMs);\n\t\tif (sleepMs > 0) {\n\t\t\tawait waitDelay(sleepMs);\n\t\t}\n\t}\n}\n\nexport async function verifyRunnerHeadlessAttach(input: {\n\tgatewayBaseUrl: string;\n\ttokenId: string;\n\ttokenSecret: string;\n\tsessionId: string;\n\tprotocolVersion: string;\n\tclientVersion?: string;\n\ttakeControl?: boolean;\n\ttimeoutMs?: number;\n}): Promise<{\n\tsessionId?: string;\n\tconnectionId?: string;\n\theartbeatIntervalMs?: number;\n\trole?: string;\n}> {\n\tconst headers = {\n\t\tAuthorization: `Bearer ${input.tokenSecret}`,\n\t\t\"Content-Type\": \"application/json\",\n\t\tAccept: \"application/json\",\n\t\t\"X-EvalOps-Runner-Attach-Token-Id\": input.tokenId,\n\t};\n\tconst body = {\n\t\tsessionId: input.sessionId,\n\t\tprotocolVersion: input.protocolVersion,\n\t\tclientInfo: {\n\t\t\tname: \"maestro-remote-cli\",\n\t\t\tversion: input.clientVersion,\n\t\t},\n\t\trole: \"controller\",\n\t\ttakeControl: input.takeControl ?? false,\n\t\toptOutNotifications: [\"heartbeat\"],\n\t\tcapabilities: {\n\t\t\tserverRequests: [\"approval\", \"user_input\", \"tool_retry\"],\n\t\t\tutilityOperations: [\n\t\t\t\t\"command_exec\",\n\t\t\t\t\"file_search\",\n\t\t\t\t\"file_read\",\n\t\t\t\t\"file_watch\",\n\t\t\t],\n\t\t},\n\t};\n\tconst response = await fetchDownstream(\n\t\t`${input.gatewayBaseUrl}/api/headless/connections`,\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(body),\n\t\t},\n\t\t{\n\t\t\tserviceName: \"remote runner headless gateway\",\n\t\t\tfailureMode: \"required\",\n\t\t\ttimeoutMs: input.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n\t\t\tmaxAttempts: 1,\n\t\t},\n\t);\n\tconst text = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(\n\t\t\t`remote runner headless gateway returned ${response.status}: ${\n\t\t\t\ttext || response.statusText\n\t\t\t}`,\n\t\t);\n\t}\n\tconst payload = text.trim()\n\t\t? (JSON.parse(text) as Record<string, unknown>)\n\t\t: {};\n\tconst connectionId = firstString(payload, \"connection_id\", \"connectionId\");\n\tconst runtimeSessionId = firstString(payload, \"session_id\", \"sessionId\");\n\tif (connectionId || runtimeSessionId) {\n\t\tvoid fetchDownstream(\n\t\t\t`${input.gatewayBaseUrl}/api/headless/sessions/${encodeURIComponent(\n\t\t\t\truntimeSessionId ?? input.sessionId,\n\t\t\t)}/disconnect`,\n\t\t\t{\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders,\n\t\t\t\tbody: JSON.stringify({ connectionId }),\n\t\t\t},\n\t\t\t{\n\t\t\t\tserviceName: \"remote runner headless gateway\",\n\t\t\t\tfailureMode: \"required\",\n\t\t\t\ttimeoutMs: input.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n\t\t\t\tmaxAttempts: 1,\n\t\t\t},\n\t\t).catch(() => undefined);\n\t}\n\treturn {\n\t\tsessionId: runtimeSessionId,\n\t\tconnectionId,\n\t\theartbeatIntervalMs: firstNumber(\n\t\t\tpayload,\n\t\t\t\"heartbeat_interval_ms\",\n\t\t\t\"heartbeatIntervalMs\",\n\t\t),\n\t\trole: firstString(payload, \"role\"),\n\t};\n}\n"]}
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
*/
|
|
49
49
|
import type { ActionApprovalContext, ActionFirewallVerdict } from "../agent/action-approval.js";
|
|
50
50
|
export type { ActionApprovalContext } from "../agent/action-approval.js";
|
|
51
|
+
import { type ActionFirewallGovernanceServiceConfig } from "./governance-service-client.js";
|
|
51
52
|
import type { SemanticJudge } from "./semantic-judge.js";
|
|
52
53
|
/**
|
|
53
54
|
* Action Firewall Rule Interface
|
|
@@ -134,9 +135,13 @@ export declare const defaultFirewallRules: ActionFirewallRule[];
|
|
|
134
135
|
export declare class ActionFirewall {
|
|
135
136
|
private readonly rules;
|
|
136
137
|
private semanticJudge?;
|
|
137
|
-
|
|
138
|
+
private readonly governanceService;
|
|
139
|
+
constructor(rules?: ActionFirewallRule[], options?: {
|
|
140
|
+
governanceService?: ActionFirewallGovernanceServiceConfig | false;
|
|
141
|
+
});
|
|
138
142
|
setSemanticJudge(judge: SemanticJudge): void;
|
|
139
143
|
evaluate(context: ActionApprovalContext): Promise<ActionFirewallVerdict>;
|
|
144
|
+
private evaluateWithGovernanceService;
|
|
140
145
|
}
|
|
141
146
|
export declare const defaultActionFirewall: ActionFirewall;
|
|
142
147
|
//# sourceMappingURL=action-firewall.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-firewall.d.ts","sourceRoot":"","sources":["../../src/safety/action-firewall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,KAAK,EACX,qBAAqB,EACrB,qBAAqB,EAErB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"action-firewall.d.ts","sourceRoot":"","sources":["../../src/safety/action-firewall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,KAAK,EACX,qBAAqB,EACrB,qBAAqB,EAErB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAczE,OAAO,EACN,KAAK,qCAAqC,EAG1C,MAAM,gCAAgC,CAAC;AAMxC,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,qBAAqB,CAAC;AA+C/E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,KAAK,WAAW,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IAClC,6DAA6D;IAC7D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,MAAM,CAAC,EAAE,OAAO,GAAG,kBAAkB,GAAG,OAAO,CAAC;IAChD,yCAAyC;IACzC,QAAQ,CAAC,EAAE,CACV,OAAO,EAAE,qBAAqB,KAC1B,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,kCAAkC;IAClC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3E,gEAAgE;IAChE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtE;AAGD,eAAO,MAAM,wBAAwB,sCAAsC,CAAC;AA+Q5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,EAoNpD,CAAC;AAEF,qBAAa,cAAc;IAQzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPvB,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAGrB;gBAGK,KAAK,GAAE,kBAAkB,EAAyB,EACnE,OAAO,CAAC,EAAE;QACT,iBAAiB,CAAC,EAAE,qCAAqC,GAAG,KAAK,CAAC;KAClE;IAKF,gBAAgB,CAAC,KAAK,EAAE,aAAa;IAI/B,QAAQ,CACb,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;YAoFnB,6BAA6B;CAoC3C;AAED,eAAO,MAAM,qBAAqB,gBAAuB,CAAC"}
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
import { createLogger } from "../utils/logger.js";
|
|
50
50
|
import { isCommandAllowlisted } from "./bash-allowlist.js";
|
|
51
51
|
import { analyzeCommandSafety, dangerousPatternDescriptions, dangerousPatterns, hasEgressPrimitives, isDestructiveSimpleCommand, isParserAvailable, isSimpleBenignBash, tokenizeSimple, unwrapShellCommand, } from "./bash-safety-analyzer.js";
|
|
52
|
+
import { evaluateActionWithActionFirewallGovernanceService, resolveActionFirewallGovernanceServiceConfig, } from "./governance-service-client.js";
|
|
52
53
|
import { isContainedInWorkspace, isSystemPath } from "./path-containment.js";
|
|
53
54
|
import { checkPolicy } from "./policy.js";
|
|
54
55
|
import { RuleCache } from "./rule-cache.js";
|
|
@@ -531,45 +532,55 @@ export const defaultFirewallRules = [
|
|
|
531
532
|
},
|
|
532
533
|
];
|
|
533
534
|
export class ActionFirewall {
|
|
534
|
-
constructor(rules = defaultFirewallRules) {
|
|
535
|
+
constructor(rules = defaultFirewallRules, options) {
|
|
535
536
|
this.rules = rules;
|
|
537
|
+
this.governanceService = options?.governanceService;
|
|
536
538
|
}
|
|
537
539
|
setSemanticJudge(judge) {
|
|
538
540
|
this.semanticJudge = judge;
|
|
539
541
|
}
|
|
540
542
|
async evaluate(context) {
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
543
|
+
const governanceServiceVerdict = await this.evaluateWithGovernanceService(context);
|
|
544
|
+
if (governanceServiceVerdict?.action === "block") {
|
|
545
|
+
return governanceServiceVerdict;
|
|
546
|
+
}
|
|
547
|
+
if (governanceServiceVerdict?.action === "require_approval") {
|
|
548
|
+
return governanceServiceVerdict;
|
|
549
|
+
}
|
|
550
|
+
if (!governanceServiceVerdict) {
|
|
551
|
+
for (const rule of this.rules) {
|
|
552
|
+
const evaluation = rule.evaluate
|
|
553
|
+
? await rule.evaluate(context)
|
|
554
|
+
: (await rule.match?.(context))
|
|
555
|
+
? {
|
|
556
|
+
allowed: false,
|
|
557
|
+
reason: (await rule.reason?.(context)) ??
|
|
558
|
+
`Action matched rule: ${rule.description}`,
|
|
559
|
+
}
|
|
560
|
+
: { allowed: true };
|
|
561
|
+
if (!evaluation.allowed) {
|
|
562
|
+
const action = rule.action ?? "require_approval";
|
|
563
|
+
const reason = evaluation.reason ??
|
|
564
|
+
`Action matched rule: ${rule.description ?? rule.name}`;
|
|
565
|
+
const remediation = evaluation.remediation ?? (await rule.remediation?.(context));
|
|
566
|
+
const ruleId = rule.id ?? rule.name ?? "unknown-rule";
|
|
567
|
+
if (action === "allow") {
|
|
568
|
+
return { action: "allow" };
|
|
569
|
+
}
|
|
570
|
+
if (action === "block") {
|
|
571
|
+
return {
|
|
572
|
+
action,
|
|
573
|
+
ruleId,
|
|
574
|
+
reason,
|
|
575
|
+
remediation,
|
|
576
|
+
};
|
|
549
577
|
}
|
|
550
|
-
: { allowed: true };
|
|
551
|
-
if (!evaluation.allowed) {
|
|
552
|
-
const action = rule.action ?? "require_approval";
|
|
553
|
-
const reason = evaluation.reason ??
|
|
554
|
-
`Action matched rule: ${rule.description ?? rule.name}`;
|
|
555
|
-
const remediation = evaluation.remediation ?? (await rule.remediation?.(context));
|
|
556
|
-
const ruleId = rule.id ?? rule.name ?? "unknown-rule";
|
|
557
|
-
if (action === "allow") {
|
|
558
|
-
return { action: "allow" };
|
|
559
|
-
}
|
|
560
|
-
if (action === "block") {
|
|
561
578
|
return {
|
|
562
579
|
action,
|
|
563
580
|
ruleId,
|
|
564
581
|
reason,
|
|
565
|
-
remediation,
|
|
566
582
|
};
|
|
567
583
|
}
|
|
568
|
-
return {
|
|
569
|
-
action,
|
|
570
|
-
ruleId,
|
|
571
|
-
reason,
|
|
572
|
-
};
|
|
573
584
|
}
|
|
574
585
|
}
|
|
575
586
|
// 2. Run semantic judge if available (slow path)
|
|
@@ -598,6 +609,31 @@ export class ActionFirewall {
|
|
|
598
609
|
}
|
|
599
610
|
return { action: "allow" };
|
|
600
611
|
}
|
|
612
|
+
async evaluateWithGovernanceService(context) {
|
|
613
|
+
const config = resolveActionFirewallGovernanceServiceConfig(this.governanceService, context);
|
|
614
|
+
if (!config) {
|
|
615
|
+
return null;
|
|
616
|
+
}
|
|
617
|
+
try {
|
|
618
|
+
const verdict = await evaluateActionWithActionFirewallGovernanceService(config, context);
|
|
619
|
+
return verdict;
|
|
620
|
+
}
|
|
621
|
+
catch (error) {
|
|
622
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
623
|
+
if (config.failureMode === "required") {
|
|
624
|
+
return {
|
|
625
|
+
action: "block",
|
|
626
|
+
ruleId: "governance-service-unavailable",
|
|
627
|
+
reason: `Governance service unavailable: ${message}`,
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
logger.warn("Failed to evaluate action with governance service; falling back to local firewall rules", {
|
|
631
|
+
error: message,
|
|
632
|
+
toolName: context.toolName,
|
|
633
|
+
});
|
|
634
|
+
return null;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
601
637
|
}
|
|
602
638
|
export const defaultActionFirewall = new ActionFirewall();
|
|
603
639
|
//# sourceMappingURL=action-firewall.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-firewall.js","sourceRoot":"","sources":["../../src/safety/action-firewall.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Action Firewall - Rule-based safety enforcement for tool execution\n *\n * The action firewall is the central decision point for tool safety. Before\n * any tool executes, it passes through the firewall which evaluates a series\n * of rules and returns a verdict: allow, require_approval, or block.\n *\n * ## Architecture\n *\n * ```\n * Tool Call → ActionFirewall.evaluate() → Rules (sequential) → Verdict\n * ↓ ↓\n * Context Object Match + Reason + Remediation\n * ```\n *\n * ## Verdict Types\n *\n * - **allow**: Tool executes immediately without user interaction\n * - **require_approval**: User must explicitly approve before execution\n * - **block**: Tool is prevented from executing entirely (hard block)\n *\n * ## Rule Evaluation Order\n *\n * Rules are evaluated sequentially in priority order. The first matching\n * rule determines the verdict. This means:\n *\n * 1. Enterprise policy rules (hard blocks) come first\n * 2. System path protection (hard blocks) second\n * 3. Workspace containment (soft approval) third\n * 4. Dangerous command patterns (soft approval) later\n *\n * ## Caching Strategy\n *\n * Policy checks and tree-sitter analysis can be expensive. We use WeakMaps\n * keyed by the context object to cache results within a single evaluation.\n * The WeakMap ensures entries are garbage collected when the context is\n * no longer referenced.\n *\n * ## Integration Points\n *\n * The firewall integrates with:\n * - **Enterprise Policy**: Organizational restrictions on tools/paths\n * - **Workflow State**: PII tracking for egress prevention\n * - **Bash Parser**: Structured command analysis\n * - **Semantic Judge**: LLM-based intent analysis (optional, slow path)\n *\n * @module safety/action-firewall\n */\n\nimport type {\n\tActionApprovalContext,\n\tActionFirewallVerdict,\n\tWorkflowStateSnapshot,\n} from \"../agent/action-approval.js\";\nexport type { ActionApprovalContext } from \"../agent/action-approval.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { isCommandAllowlisted } from \"./bash-allowlist.js\";\nimport {\n\tanalyzeCommandSafety,\n\tdangerousPatternDescriptions,\n\tdangerousPatterns,\n\thasEgressPrimitives,\n\tisDestructiveSimpleCommand,\n\tisParserAvailable,\n\tisSimpleBenignBash,\n\ttokenizeSimple,\n\tunwrapShellCommand,\n} from \"./bash-safety-analyzer.js\";\nimport { isContainedInWorkspace, isSystemPath } from \"./path-containment.js\";\nimport { checkPolicy } from \"./policy.js\";\nimport { RuleCache } from \"./rule-cache.js\";\nimport { TOOL_TAGS, looksLikeEgress } from \"./workflow-state.js\";\n\nimport type { SemanticJudge, SemanticJudgeContext } from \"./semantic-judge.js\";\n\nconst logger = createLogger(\"safety:action-firewall\");\n// Evaluate env flags lazily to honor profile overrides set after initial import.\nconst isStrictUntaggedEgress = () =>\n\tprocess.env.MAESTRO_FAIL_UNTAGGED_EGRESS === \"1\";\nconst isBackgroundShellBlocked = () =>\n\tprocess.env.MAESTRO_BACKGROUND_SHELL_DISABLE === \"1\";\nconst isSafeModeEnabled = () => process.env.MAESTRO_SAFE_MODE === \"1\";\nconst isProdProfile = () =>\n\tprocess.env.MAESTRO_PROFILE === \"prod\" ||\n\tprocess.env.MAESTRO_WEB_PROFILE === \"prod\";\nconst isNoEgressShellEnabled = () =>\n\t[\"1\", \"true\", \"on\"].includes(\n\t\t(process.env.MAESTRO_NO_EGRESS_SHELL ?? \"\").toLowerCase(),\n\t);\nconst isEgressOverrideAllowed = () =>\n\t[\"1\", \"true\", \"on\"].includes(\n\t\t(process.env.MAESTRO_ALLOW_EGRESS_SHELL ?? \"\").toLowerCase(),\n\t);\n\n/**\n * Policy Check Result - Cached result of enterprise policy evaluation\n */\ninterface PolicyCheckResult {\n\tallowed: boolean;\n\treason?: string;\n}\n\n/**\n * Policy Check Cache - Avoids redundant policy evaluations\n *\n * The firewall evaluation flow calls match() to check if a rule applies,\n * then reason() to get the human-readable explanation. For policy checks,\n * both need the same expensive async evaluation.\n *\n * We cache the result on match() and reuse it in reason(). The WeakMap\n * key is the context object itself, ensuring:\n * 1. Each context gets its own cached result\n * 2. Cache entries are automatically garbage collected when context is freed\n * 3. No memory leaks from long-running processes\n */\nconst policyCheckCache = new RuleCache<\n\tActionApprovalContext,\n\tPolicyCheckResult\n>();\n\n/**\n * Action Firewall Rule Interface\n *\n * Defines the structure of a firewall rule. Rules are the building blocks\n * of the firewall; each rule checks for a specific condition and returns\n * a verdict if matched.\n *\n * ## Rule Anatomy\n *\n * - **id**: Unique identifier for logging and debugging\n * - **description**: Human-readable explanation of what the rule checks\n * - **action**: What happens if rule matches (default: require_approval)\n * - **match()**: Predicate that returns true if rule applies\n * - **reason()**: Optional function returning why rule matched\n * - **remediation()**: Optional function suggesting how to fix the issue\n *\n * ## Match Evaluation\n *\n * The match function receives the full tool context including:\n * - toolName: Name of the tool being called\n * - args: Arguments passed to the tool\n * - metadata: Additional context (workflow state, annotations)\n * - user/session: Authentication context\n *\n * Rules can be sync or async. Async rules are awaited during evaluation.\n */\ntype RuleOutcome = { allowed: boolean; reason?: string; remediation?: string };\n\nexport interface ActionFirewallRule {\n\t/** Optional legacy identifier used in existing logs/tests */\n\tid?: string;\n\t/** Optional name for logging */\n\tname?: string;\n\t/** Human-readable description */\n\tdescription: string;\n\t/** Verdict override */\n\taction?: \"allow\" | \"require_approval\" | \"block\";\n\t/** Modern evaluation hook (preferred) */\n\tevaluate?: (\n\t\tcontext: ActionApprovalContext,\n\t) => RuleOutcome | Promise<RuleOutcome>;\n\t/** Optional remediation helper */\n\tremediation?: (context: ActionApprovalContext) => string | Promise<string>;\n\t/** Legacy match/reason hooks kept for backward compatibility */\n\tmatch?: (context: ActionApprovalContext) => boolean | Promise<boolean>;\n\treason?: (context: ActionApprovalContext) => string | Promise<string>;\n}\n\nconst untaggedEgressWarnings = new Set<string>();\nexport const HUMAN_EGRESS_PII_RULE_ID = \"pii-redaction-before-human-egress\";\n\nfunction getArgsObject(\n\tcontext: ActionApprovalContext,\n): Record<string, unknown> | null {\n\treturn context.args && typeof context.args === \"object\"\n\t\t? (context.args as Record<string, unknown>)\n\t\t: null;\n}\n\nfunction getStringArg(\n\tcontext: ActionApprovalContext,\n\tkey: string,\n): string | null {\n\tconst args = getArgsObject(context);\n\tif (!args) {\n\t\treturn null;\n\t}\n\tconst value = args[key];\n\treturn typeof value === \"string\" ? value : null;\n}\n\nfunction getBooleanArg(\n\tcontext: ActionApprovalContext,\n\tkey: string,\n): boolean | null {\n\tconst args = getArgsObject(context);\n\tif (!args) {\n\t\treturn null;\n\t}\n\tconst value = args[key];\n\treturn typeof value === \"boolean\" ? value : null;\n}\n\nfunction getCommandArg(context: ActionApprovalContext): string | null {\n\treturn getStringArg(context, \"command\");\n}\n\nfunction isBackgroundTaskShellStart(context: ActionApprovalContext): boolean {\n\tif (context.toolName !== \"background_tasks\") {\n\t\treturn false;\n\t}\n\tconst action = getStringArg(context, \"action\");\n\tif (action !== \"start\") {\n\t\treturn false;\n\t}\n\treturn getBooleanArg(context, \"shell\") === true;\n}\n\nfunction getWorkflowState(\n\tcontext: ActionApprovalContext,\n): WorkflowStateSnapshot | null {\n\treturn context.metadata?.workflowState ?? null;\n}\n\nfunction getPendingUnredactedPii(\n\tcontext: ActionApprovalContext,\n): WorkflowStateSnapshot[\"pendingPii\"] {\n\tconst snapshot = getWorkflowState(context);\n\tif (!snapshot) {\n\t\treturn [];\n\t}\n\treturn snapshot.pendingPii.filter((artifact) => artifact.redacted !== true);\n}\n\nfunction warnUntaggedEgress(toolName: string): void {\n\tif (untaggedEgressWarnings.has(toolName)) {\n\t\treturn;\n\t}\n\tuntaggedEgressWarnings.add(toolName);\n\tlogger.warn(\n\t\t\"Untagged egress-like tool encountered; treating as human-facing until TOOL_TAGS is updated\",\n\t\t{ toolName },\n\t);\n}\n\nfunction isHumanFacingTool(toolName: string): boolean {\n\tconst toolTags = TOOL_TAGS[toolName];\n\tif (toolTags?.egress === \"human\") {\n\t\treturn true;\n\t}\n\tif (!toolTags && looksLikeEgress(toolName)) {\n\t\twarnUntaggedEgress(toolName);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction getAnnotations(context: ActionApprovalContext) {\n\treturn context.metadata?.annotations;\n}\n\nfunction isMcpTool(toolName: string): boolean {\n\treturn toolName.startsWith(\"mcp_\");\n}\n\n/**\n * Generate rules from dangerous patterns (regex-based)\n */\nconst dangerousCommandRules: ActionFirewallRule[] = Object.entries(\n\tdangerousPatterns,\n).map(([key, pattern]) => ({\n\tname: `command-${key}`,\n\tdescription:\n\t\tdangerousPatternDescriptions[\n\t\t\tkey as keyof typeof dangerousPatternDescriptions\n\t\t],\n\taction: \"require_approval\",\n\tevaluate: (ctx) => {\n\t\tif (!isBashGuardEnabled()) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\tconst command = getCommandArg(ctx);\n\t\tif (!command) return { allowed: true };\n\t\tconst unwrapped = unwrapShellCommand(command) ?? command;\n\t\tif (isCommandAllowlisted(unwrapped)) return { allowed: true };\n\t\tif (!pattern.test(unwrapped)) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\treturn {\n\t\t\tallowed: false,\n\t\t\treason: `Detected ${dangerousPatternDescriptions[key as keyof typeof dangerousPatternDescriptions]}: ${unwrapped.trim()}`,\n\t\t};\n\t},\n}));\n\nconst isBashStrict = () => process.env.MAESTRO_BASH_STRICT === \"1\";\nconst isBashGuardEnabled = () => {\n\tconst flag = process.env.MAESTRO_BASH_GUARD?.toLowerCase?.();\n\tif (flag) {\n\t\treturn ![\"0\", \"off\", \"false\", \"disabled\", \"no\"].includes(flag);\n\t}\n\t// Default: guard ON (previous behavior). Explicitly set MAESTRO_BASH_GUARD=0 to YOLO.\n\tif (isSafeModeEnabled() || isProdProfile()) {\n\t\treturn true;\n\t}\n\treturn true;\n};\n\n/**\n * Tree-sitter based command safety rule.\n * Provides more accurate analysis than regex patterns.\n */\nconst treeSitterCommandRule: ActionFirewallRule = {\n\tname: \"command-treesitter-analysis\",\n\tdescription: \"Tree-sitter based command safety analysis\",\n\taction: \"require_approval\",\n\tevaluate: (ctx) => {\n\t\tif (!isBashGuardEnabled()) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\tif (ctx.toolName !== \"bash\" && !isBackgroundTaskShellStart(ctx)) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\tlet command = getCommandArg(ctx);\n\t\tif (!command) return { allowed: true };\n\n\t\t// Try to unwrap bash -c \"...\" style commands\n\t\tconst unwrapped = unwrapShellCommand(command);\n\t\tif (unwrapped) {\n\t\t\tcommand = unwrapped;\n\t\t}\n\n\t\tif (isCommandAllowlisted(command)) {\n\t\t\treturn { allowed: true };\n\t\t}\n\n\t\tconst simpleTokens = tokenizeSimple(command);\n\t\tif (isDestructiveSimpleCommand(simpleTokens)) {\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason:\n\t\t\t\t\t\"Command requires approval (destructive or mutating operation detected)\",\n\t\t\t};\n\t\t}\n\n\t\tif (!isBashStrict() && isSimpleBenignBash(command)) {\n\t\t\treturn { allowed: true };\n\t\t}\n\n\t\t// Only run tree-sitter if the parser is available; otherwise fall back to approval\n\t\tif (!isParserAvailable()) {\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason:\n\t\t\t\t\t\"Command requires approval (bash parser unavailable; unable to fully analyze)\",\n\t\t\t};\n\t\t}\n\n\t\tconst analysis = analyzeCommandSafety(command);\n\t\tif (analysis.safe) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\treturn {\n\t\t\tallowed: false,\n\t\t\treason: analysis.reason ?? \"Command failed tree-sitter safety analysis\",\n\t\t};\n\t},\n};\n\n/**\n * Critical System Paths - Directories that should never be modified\n *\n * These paths are protected with a HARD BLOCK (not just approval required).\n * Modifying files in these directories can:\n * - Break the operating system\n * - Compromise system security\n * - Affect other users on the system\n *\n * ## Linux Paths\n *\n * - /etc: System configuration\n * - /usr: System programs and libraries\n * - /var: Variable data (logs, databases)\n * - /boot: Bootloader and kernel\n * - /sys, /proc: Kernel virtual filesystems\n * - /dev: Device files\n * - /bin, /sbin: Essential system binaries\n * - /lib, /lib64: Shared libraries\n * - /opt: Optional/third-party software\n *\n * ## macOS Paths\n *\n * - /System: System files\n * - /Library: System libraries\n * - /private/etc, /private/var: Private system configuration/data\n * - /dev: Device files\n *\n * ## Windows Paths\n *\n * - C:\\Windows: Operating system\n * - C:\\Program Files: Installed applications\n *\n * Note: /var/folders (macOS temp) and /tmp are explicitly allowed\n * through the isContainedInWorkspace check before system path blocking.\n */\nfunction extractFilePaths(context: ActionApprovalContext): string[] {\n\tconst args = getArgsObject(context);\n\tif (!args) return [];\n\tconst paths: string[] = [];\n\n\t// Simple extraction for standard file tools\n\t// Note: deeper extraction is done in policy.ts, this is for quick system protection\n\tif (context.toolName === \"write\" || context.toolName === \"edit\") {\n\t\tconst p =\n\t\t\tgetStringArg(context, \"file_path\") || getStringArg(context, \"path\");\n\t\tif (p) paths.push(p);\n\t}\n\tif (context.toolName === \"delete_file\") {\n\t\tconst p =\n\t\t\tgetStringArg(context, \"file_path\") ||\n\t\t\tgetStringArg(context, \"target_file\");\n\t\tif (p) paths.push(p);\n\t}\n\t// Handle move_file and copy_file - extract both source and destination\n\tif (context.toolName === \"move_file\" || context.toolName === \"copy_file\") {\n\t\tconst source =\n\t\t\tgetStringArg(context, \"source\") ||\n\t\t\tgetStringArg(context, \"source_path\") ||\n\t\t\tgetStringArg(context, \"from\");\n\t\tconst dest =\n\t\t\tgetStringArg(context, \"destination\") ||\n\t\t\tgetStringArg(context, \"destination_path\") ||\n\t\t\tgetStringArg(context, \"dest\") ||\n\t\t\tgetStringArg(context, \"to\");\n\t\tif (source) paths.push(source);\n\t\tif (dest) paths.push(dest);\n\t}\n\treturn paths;\n}\n\n/**\n * Workspace Containment Check - Determines if a path is in a \"safe zone\"\n *\n * The firewall uses containment to prevent accidental writes outside the\n * project directory. This function checks if a file path is within one of\n * the allowed zones.\n *\n * ## Safe Zones (in order of check)\n *\n * 1. **Workspace root**: Current working directory and subdirectories\n * 2. **System temp directory**: /tmp, /var/folders, etc.\n * 3. **Trusted paths**: User-configured paths in firewall.json\n *\n * ## Path Resolution Complexity\n *\n * We must handle several path edge cases:\n *\n * - **Symlinks**: macOS /tmp → /private/tmp, so we resolve real paths\n * - **Non-existent files**: Can't realpath a file being created, use logical path\n * - **Relative paths**: Convert to absolute before comparison\n * - **Path traversal**: Detect ../ escapes using relative() output\n *\n * ## Detection Method\n *\n * For each safe zone, we compute relative(zone, targetPath). If the result:\n * - Starts with \"..\" → path escapes the zone (unsafe)\n * - Is an absolute path → completely outside (unsafe)\n * - Otherwise → contained within zone (safe)\n *\n * @param filePath - The path to check (may be relative or absolute)\n * @returns true if path is contained in a safe zone, false otherwise\n */\n\nexport const defaultFirewallRules: ActionFirewallRule[] = [\n\t{\n\t\tname: \"enterprise-policy\",\n\t\tdescription: \"Enforce enterprise policies on tools and dependencies\",\n\t\taction: \"block\", // HARD BLOCK for policy violations\n\t\tevaluate: async (ctx) => {\n\t\t\tconst cached = policyCheckCache.get(ctx);\n\t\t\tif (cached) {\n\t\t\t\treturn cached.allowed\n\t\t\t\t\t? { allowed: true }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\t\treason: cached.reason ?? \"Action blocked by enterprise policy\",\n\t\t\t\t\t\t};\n\t\t\t}\n\t\t\tconst result = await checkPolicy(ctx);\n\t\t\tpolicyCheckCache.set(ctx, result);\n\t\t\tif (result.allowed) return { allowed: true };\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason: result.reason ?? \"Action blocked by enterprise policy\",\n\t\t\t};\n\t\t},\n\t},\n\t{\n\t\tname: \"system-path-protection\",\n\t\tdescription: \"Prevent modification of critical system directories\",\n\t\taction: \"block\", // HARD BLOCK for system paths\n\t\tevaluate: (ctx) => {\n\t\t\t// Only check file mutation tools\n\t\t\tif (\n\t\t\t\t![\"write\", \"edit\", \"delete_file\", \"move_file\", \"copy_file\"].includes(\n\t\t\t\t\tctx.toolName,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn { allowed: true };\n\t\t\t}\n\t\t\tconst paths = extractFilePaths(ctx);\n\t\t\t// We check system paths first, but if it's in workspace, temp, or a trusted path (safe), we should allow it.\n\t\t\t// System paths like /var include /var/folders (temp on mac), so we need to exclude safe temp paths from system path blocking.\n\n\t\t\t// Filter out paths that are inside the workspace, temp, or trusted paths (which are safe)\n\t\t\tconst unsafePaths = paths.filter((p) => !isContainedInWorkspace(p));\n\n\t\t\t// Only check remaining paths against system blocklist\n\t\t\tif (unsafePaths.some(isSystemPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason:\n\t\t\t\t\t\t\"Modification of critical system directories is blocked for safety.\",\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { allowed: true };\n\t\t},\n\t\tremediation: () =>\n\t\t\t\"Do not modify critical system paths. If you need to write a file, use the current workspace directory or a temporary folder.\",\n\t},\n\t{\n\t\tname: \"workspace-containment\",\n\t\tdescription:\n\t\t\t\"Require approval for file modifications outside the workspace\",\n\t\taction: \"require_approval\",\n\t\tevaluate: (ctx) => {\n\t\t\t// Only check file mutation tools\n\t\t\tif (\n\t\t\t\t![\"write\", \"edit\", \"delete_file\", \"move_file\", \"copy_file\"].includes(\n\t\t\t\t\tctx.toolName,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn { allowed: true };\n\t\t\t}\n\t\t\tconst paths = extractFilePaths(ctx);\n\t\t\t// Return true (match rule) if ANY path is NOT contained\n\t\t\tconst outsidePaths = paths.filter((p) => !isContainedInWorkspace(p));\n\t\t\tif (outsidePaths.length === 0) return { allowed: true };\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason: `File modification outside workspace detected: ${outsidePaths.join(\", \")}. This requires explicit approval.`,\n\t\t\t};\n\t\t},\n\t\tremediation: () =>\n\t\t\t\"The file path is outside the allowed workspace. Please use a path within the current project or a temporary directory, or ask the user to add this path to 'containment.trustedPaths' in ~/.maestro/firewall.json.\",\n\t},\n\t{\n\t\tid: \"untagged-human-egress\",\n\t\tdescription:\n\t\t\t\"Block human-facing tool calls without explicit TOOL_TAGS annotations when strict mode is enabled\",\n\t\taction: \"block\",\n\t\tmatch: (ctx) => {\n\t\t\tif (!isStrictUntaggedEgress()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!isHumanFacingTool(ctx.toolName)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn TOOL_TAGS[ctx.toolName] === undefined;\n\t\t},\n\t\treason: () =>\n\t\t\t\"Human-facing tool is missing TOOL_TAGS; annotate the tool or disable strict mode via MAESTRO_FAIL_UNTAGGED_EGRESS=0.\",\n\t\tremediation: () =>\n\t\t\t\"Add TOOL_TAGS entry marking egress intent (human/http) before invoking the tool.\",\n\t},\n\t{\n\t\tid: \"background-shell-block\",\n\t\tdescription: \"Block shell-based background tasks when disabled by policy\",\n\t\taction: \"block\",\n\t\tmatch: (ctx) =>\n\t\t\tisBackgroundShellBlocked() && isBackgroundTaskShellStart(ctx) === true,\n\t\treason: () =>\n\t\t\t\"Starting background_tasks with shell=true is disabled by policy. Set MAESTRO_BACKGROUND_SHELL_DISABLE=0 to allow.\",\n\t},\n\t{\n\t\tid: \"mcp-destructive-tool\",\n\t\tdescription: \"MCP tools marked as destructive require approval\",\n\t\taction: \"require_approval\",\n\t\tmatch: (ctx) => {\n\t\t\tif (!isMcpTool(ctx.toolName)) return false;\n\t\t\tconst annotations = getAnnotations(ctx);\n\t\t\t// Require approval if destructiveHint is true and readOnlyHint is not true\n\t\t\treturn (\n\t\t\t\tannotations?.destructiveHint === true && !annotations?.readOnlyHint\n\t\t\t);\n\t\t},\n\t\treason: (ctx) =>\n\t\t\t`MCP tool \"${ctx.toolName}\" is marked as destructive and requires approval`,\n\t},\n\t{\n\t\tid: \"plan-mode-confirm\",\n\t\tdescription:\n\t\t\t\"When plan mode is enabled, require approval before mutating commands\",\n\t\taction: \"require_approval\",\n\t\tmatch: (ctx) => {\n\t\t\tif (process.env.MAESTRO_PLAN_MODE !== \"1\") return false;\n\t\t\tconst name = ctx.toolName;\n\t\t\tif (name === \"write\" || name === \"edit\" || name === \"bash\") return true;\n\t\t\tif (name === \"todo\") return true;\n\t\t\tif (name === \"gh_pr\") {\n\t\t\t\tconst action = getStringArg(ctx, \"action\");\n\t\t\t\treturn !action || ![\"list\", \"view\", \"checks\", \"diff\"].includes(action);\n\t\t\t}\n\t\t\tif (name === \"gh_issue\") {\n\t\t\t\tconst action = getStringArg(ctx, \"action\");\n\t\t\t\treturn !action || ![\"list\", \"view\"].includes(action);\n\t\t\t}\n\t\t\tif (name === \"background_tasks\") {\n\t\t\t\tconst args = getArgsObject(ctx);\n\t\t\t\tconst action = args?.action;\n\t\t\t\tconst shell = args?.shell === true;\n\t\t\t\treturn action === \"start\" && shell;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\treason: (ctx) =>\n\t\t\t`Plan mode requires confirmation before executing ${ctx.toolName}. Toggle with /plan-mode or MAESTRO_PLAN_MODE=0.`,\n\t},\n\t{\n\t\tid: \"no-egress-shell\",\n\t\tdescription:\n\t\t\t\"Require approval when shell egress is disabled via MAESTRO_NO_EGRESS_SHELL\",\n\t\taction: \"require_approval\",\n\t\tevaluate: (ctx) => {\n\t\t\tif (!isNoEgressShellEnabled() || isEgressOverrideAllowed()) {\n\t\t\t\treturn { allowed: true };\n\t\t\t}\n\t\t\tif (ctx.toolName !== \"bash\" && !isBackgroundTaskShellStart(ctx)) {\n\t\t\t\treturn { allowed: true };\n\t\t\t}\n\t\t\tconst raw = getCommandArg(ctx);\n\t\t\tif (!raw) return { allowed: true };\n\t\t\tconst unwrapped = unwrapShellCommand(raw) ?? raw;\n\t\t\tif (isCommandAllowlisted(unwrapped)) return { allowed: true };\n\t\t\tif (!hasEgressPrimitives(unwrapped)) return { allowed: true };\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason:\n\t\t\t\t\t\"Shell egress (curl/wget/ssh/nc/dev/tcp) requires approval because MAESTRO_NO_EGRESS_SHELL=1. Allow temporarily with MAESTRO_ALLOW_EGRESS_SHELL=1 or add a bash allowlist entry.\",\n\t\t\t};\n\t\t},\n\t},\n\t...dangerousCommandRules,\n\ttreeSitterCommandRule,\n\t{\n\t\tid: \"background-shell-mode\",\n\t\tdescription: \"Shell mode background tasks\",\n\t\taction: \"require_approval\",\n\t\tmatch: (ctx) => isBackgroundTaskShellStart(ctx),\n\t\treason: () =>\n\t\t\t\"Background task shell mode requires manual approval (pipes, redirects, and globbing are high risk)\",\n\t},\n\t{\n\t\tid: HUMAN_EGRESS_PII_RULE_ID,\n\t\tdescription: \"PII must be redacted before human-facing tools execute\",\n\t\taction: \"require_approval\",\n\t\tmatch: (ctx) => {\n\t\t\tif (!isHumanFacingTool(ctx.toolName)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst pending = getPendingUnredactedPii(ctx);\n\t\t\treturn pending.length > 0;\n\t\t},\n\t\treason: (ctx) => {\n\t\t\tconst pending = getPendingUnredactedPii(ctx);\n\t\t\tconst offenders =\n\t\t\t\tpending\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(artifact) =>\n\t\t\t\t\t\t\t`${artifact.label} (artifact: ${artifact.id}, source: ${artifact.sourceToolCallId})`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"; \") || \"unredacted artifacts\";\n\t\t\treturn `Unredacted PII (${offenders}) detected before executing human-facing tool \"${ctx.toolName}\". Run your redaction tool on the listed artifacts, then retry.`;\n\t\t},\n\t},\n];\n\nexport class ActionFirewall {\n\tprivate semanticJudge?: SemanticJudge;\n\n\tconstructor(\n\t\tprivate readonly rules: ActionFirewallRule[] = defaultFirewallRules,\n\t) {}\n\n\tsetSemanticJudge(judge: SemanticJudge) {\n\t\tthis.semanticJudge = judge;\n\t}\n\n\tasync evaluate(\n\t\tcontext: ActionApprovalContext,\n\t): Promise<ActionFirewallVerdict> {\n\t\tfor (const rule of this.rules) {\n\t\t\tconst evaluation: RuleOutcome = rule.evaluate\n\t\t\t\t? await rule.evaluate(context)\n\t\t\t\t: (await rule.match?.(context))\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\t\treason:\n\t\t\t\t\t\t\t\t(await rule.reason?.(context)) ??\n\t\t\t\t\t\t\t\t`Action matched rule: ${rule.description}`,\n\t\t\t\t\t\t}\n\t\t\t\t\t: { allowed: true };\n\n\t\t\tif (!evaluation.allowed) {\n\t\t\t\tconst action = rule.action ?? \"require_approval\";\n\t\t\t\tconst reason =\n\t\t\t\t\tevaluation.reason ??\n\t\t\t\t\t`Action matched rule: ${rule.description ?? rule.name}`;\n\t\t\t\tconst remediation =\n\t\t\t\t\tevaluation.remediation ?? (await rule.remediation?.(context));\n\t\t\t\tconst ruleId =\n\t\t\t\t\t(rule as { id?: string }).id ?? rule.name ?? \"unknown-rule\";\n\n\t\t\t\tif (action === \"allow\") {\n\t\t\t\t\treturn { action: \"allow\" };\n\t\t\t\t}\n\n\t\t\t\tif (action === \"block\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\taction,\n\t\t\t\t\t\truleId,\n\t\t\t\t\t\treason,\n\t\t\t\t\t\tremediation,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\taction,\n\t\t\t\t\truleId,\n\t\t\t\t\treason,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// 2. Run semantic judge if available (slow path)\n\t\tif (this.semanticJudge && context.userIntent) {\n\t\t\tconst SENSITIVE_TOOLS = [\n\t\t\t\t\"bash\",\n\t\t\t\t\"write\",\n\t\t\t\t\"edit\",\n\t\t\t\t\"delete_file\",\n\t\t\t\t\"background_tasks\",\n\t\t\t];\n\t\t\tif (SENSITIVE_TOOLS.includes(context.toolName)) {\n\t\t\t\tconst judgment = await this.semanticJudge.evaluate({\n\t\t\t\t\tuserIntent: context.userIntent,\n\t\t\t\t\ttoolName: context.toolName,\n\t\t\t\t\ttoolArgs: context.args,\n\t\t\t\t});\n\n\t\t\t\tif (!judgment.safe) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\taction: \"require_approval\",\n\t\t\t\t\t\truleId: \"semantic-judge\",\n\t\t\t\t\t\treason: judgment.reason,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { action: \"allow\" };\n\t}\n}\n\nexport const defaultActionFirewall = new ActionFirewall();\n"]}
|
|
1
|
+
{"version":3,"file":"action-firewall.js","sourceRoot":"","sources":["../../src/safety/action-firewall.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Action Firewall - Rule-based safety enforcement for tool execution\n *\n * The action firewall is the central decision point for tool safety. Before\n * any tool executes, it passes through the firewall which evaluates a series\n * of rules and returns a verdict: allow, require_approval, or block.\n *\n * ## Architecture\n *\n * ```\n * Tool Call → ActionFirewall.evaluate() → Rules (sequential) → Verdict\n * ↓ ↓\n * Context Object Match + Reason + Remediation\n * ```\n *\n * ## Verdict Types\n *\n * - **allow**: Tool executes immediately without user interaction\n * - **require_approval**: User must explicitly approve before execution\n * - **block**: Tool is prevented from executing entirely (hard block)\n *\n * ## Rule Evaluation Order\n *\n * Rules are evaluated sequentially in priority order. The first matching\n * rule determines the verdict. This means:\n *\n * 1. Enterprise policy rules (hard blocks) come first\n * 2. System path protection (hard blocks) second\n * 3. Workspace containment (soft approval) third\n * 4. Dangerous command patterns (soft approval) later\n *\n * ## Caching Strategy\n *\n * Policy checks and tree-sitter analysis can be expensive. We use WeakMaps\n * keyed by the context object to cache results within a single evaluation.\n * The WeakMap ensures entries are garbage collected when the context is\n * no longer referenced.\n *\n * ## Integration Points\n *\n * The firewall integrates with:\n * - **Enterprise Policy**: Organizational restrictions on tools/paths\n * - **Workflow State**: PII tracking for egress prevention\n * - **Bash Parser**: Structured command analysis\n * - **Semantic Judge**: LLM-based intent analysis (optional, slow path)\n *\n * @module safety/action-firewall\n */\n\nimport type {\n\tActionApprovalContext,\n\tActionFirewallVerdict,\n\tWorkflowStateSnapshot,\n} from \"../agent/action-approval.js\";\nexport type { ActionApprovalContext } from \"../agent/action-approval.js\";\nimport { createLogger } from \"../utils/logger.js\";\nimport { isCommandAllowlisted } from \"./bash-allowlist.js\";\nimport {\n\tanalyzeCommandSafety,\n\tdangerousPatternDescriptions,\n\tdangerousPatterns,\n\thasEgressPrimitives,\n\tisDestructiveSimpleCommand,\n\tisParserAvailable,\n\tisSimpleBenignBash,\n\ttokenizeSimple,\n\tunwrapShellCommand,\n} from \"./bash-safety-analyzer.js\";\nimport {\n\ttype ActionFirewallGovernanceServiceConfig,\n\tevaluateActionWithActionFirewallGovernanceService,\n\tresolveActionFirewallGovernanceServiceConfig,\n} from \"./governance-service-client.js\";\nimport { isContainedInWorkspace, isSystemPath } from \"./path-containment.js\";\nimport { checkPolicy } from \"./policy.js\";\nimport { RuleCache } from \"./rule-cache.js\";\nimport { TOOL_TAGS, looksLikeEgress } from \"./workflow-state.js\";\n\nimport type { SemanticJudge, SemanticJudgeContext } from \"./semantic-judge.js\";\n\nconst logger = createLogger(\"safety:action-firewall\");\n// Evaluate env flags lazily to honor profile overrides set after initial import.\nconst isStrictUntaggedEgress = () =>\n\tprocess.env.MAESTRO_FAIL_UNTAGGED_EGRESS === \"1\";\nconst isBackgroundShellBlocked = () =>\n\tprocess.env.MAESTRO_BACKGROUND_SHELL_DISABLE === \"1\";\nconst isSafeModeEnabled = () => process.env.MAESTRO_SAFE_MODE === \"1\";\nconst isProdProfile = () =>\n\tprocess.env.MAESTRO_PROFILE === \"prod\" ||\n\tprocess.env.MAESTRO_WEB_PROFILE === \"prod\";\nconst isNoEgressShellEnabled = () =>\n\t[\"1\", \"true\", \"on\"].includes(\n\t\t(process.env.MAESTRO_NO_EGRESS_SHELL ?? \"\").toLowerCase(),\n\t);\nconst isEgressOverrideAllowed = () =>\n\t[\"1\", \"true\", \"on\"].includes(\n\t\t(process.env.MAESTRO_ALLOW_EGRESS_SHELL ?? \"\").toLowerCase(),\n\t);\n\n/**\n * Policy Check Result - Cached result of enterprise policy evaluation\n */\ninterface PolicyCheckResult {\n\tallowed: boolean;\n\treason?: string;\n}\n\n/**\n * Policy Check Cache - Avoids redundant policy evaluations\n *\n * The firewall evaluation flow calls match() to check if a rule applies,\n * then reason() to get the human-readable explanation. For policy checks,\n * both need the same expensive async evaluation.\n *\n * We cache the result on match() and reuse it in reason(). The WeakMap\n * key is the context object itself, ensuring:\n * 1. Each context gets its own cached result\n * 2. Cache entries are automatically garbage collected when context is freed\n * 3. No memory leaks from long-running processes\n */\nconst policyCheckCache = new RuleCache<\n\tActionApprovalContext,\n\tPolicyCheckResult\n>();\n\n/**\n * Action Firewall Rule Interface\n *\n * Defines the structure of a firewall rule. Rules are the building blocks\n * of the firewall; each rule checks for a specific condition and returns\n * a verdict if matched.\n *\n * ## Rule Anatomy\n *\n * - **id**: Unique identifier for logging and debugging\n * - **description**: Human-readable explanation of what the rule checks\n * - **action**: What happens if rule matches (default: require_approval)\n * - **match()**: Predicate that returns true if rule applies\n * - **reason()**: Optional function returning why rule matched\n * - **remediation()**: Optional function suggesting how to fix the issue\n *\n * ## Match Evaluation\n *\n * The match function receives the full tool context including:\n * - toolName: Name of the tool being called\n * - args: Arguments passed to the tool\n * - metadata: Additional context (workflow state, annotations)\n * - user/session: Authentication context\n *\n * Rules can be sync or async. Async rules are awaited during evaluation.\n */\ntype RuleOutcome = { allowed: boolean; reason?: string; remediation?: string };\n\nexport interface ActionFirewallRule {\n\t/** Optional legacy identifier used in existing logs/tests */\n\tid?: string;\n\t/** Optional name for logging */\n\tname?: string;\n\t/** Human-readable description */\n\tdescription: string;\n\t/** Verdict override */\n\taction?: \"allow\" | \"require_approval\" | \"block\";\n\t/** Modern evaluation hook (preferred) */\n\tevaluate?: (\n\t\tcontext: ActionApprovalContext,\n\t) => RuleOutcome | Promise<RuleOutcome>;\n\t/** Optional remediation helper */\n\tremediation?: (context: ActionApprovalContext) => string | Promise<string>;\n\t/** Legacy match/reason hooks kept for backward compatibility */\n\tmatch?: (context: ActionApprovalContext) => boolean | Promise<boolean>;\n\treason?: (context: ActionApprovalContext) => string | Promise<string>;\n}\n\nconst untaggedEgressWarnings = new Set<string>();\nexport const HUMAN_EGRESS_PII_RULE_ID = \"pii-redaction-before-human-egress\";\n\nfunction getArgsObject(\n\tcontext: ActionApprovalContext,\n): Record<string, unknown> | null {\n\treturn context.args && typeof context.args === \"object\"\n\t\t? (context.args as Record<string, unknown>)\n\t\t: null;\n}\n\nfunction getStringArg(\n\tcontext: ActionApprovalContext,\n\tkey: string,\n): string | null {\n\tconst args = getArgsObject(context);\n\tif (!args) {\n\t\treturn null;\n\t}\n\tconst value = args[key];\n\treturn typeof value === \"string\" ? value : null;\n}\n\nfunction getBooleanArg(\n\tcontext: ActionApprovalContext,\n\tkey: string,\n): boolean | null {\n\tconst args = getArgsObject(context);\n\tif (!args) {\n\t\treturn null;\n\t}\n\tconst value = args[key];\n\treturn typeof value === \"boolean\" ? value : null;\n}\n\nfunction getCommandArg(context: ActionApprovalContext): string | null {\n\treturn getStringArg(context, \"command\");\n}\n\nfunction isBackgroundTaskShellStart(context: ActionApprovalContext): boolean {\n\tif (context.toolName !== \"background_tasks\") {\n\t\treturn false;\n\t}\n\tconst action = getStringArg(context, \"action\");\n\tif (action !== \"start\") {\n\t\treturn false;\n\t}\n\treturn getBooleanArg(context, \"shell\") === true;\n}\n\nfunction getWorkflowState(\n\tcontext: ActionApprovalContext,\n): WorkflowStateSnapshot | null {\n\treturn context.metadata?.workflowState ?? null;\n}\n\nfunction getPendingUnredactedPii(\n\tcontext: ActionApprovalContext,\n): WorkflowStateSnapshot[\"pendingPii\"] {\n\tconst snapshot = getWorkflowState(context);\n\tif (!snapshot) {\n\t\treturn [];\n\t}\n\treturn snapshot.pendingPii.filter((artifact) => artifact.redacted !== true);\n}\n\nfunction warnUntaggedEgress(toolName: string): void {\n\tif (untaggedEgressWarnings.has(toolName)) {\n\t\treturn;\n\t}\n\tuntaggedEgressWarnings.add(toolName);\n\tlogger.warn(\n\t\t\"Untagged egress-like tool encountered; treating as human-facing until TOOL_TAGS is updated\",\n\t\t{ toolName },\n\t);\n}\n\nfunction isHumanFacingTool(toolName: string): boolean {\n\tconst toolTags = TOOL_TAGS[toolName];\n\tif (toolTags?.egress === \"human\") {\n\t\treturn true;\n\t}\n\tif (!toolTags && looksLikeEgress(toolName)) {\n\t\twarnUntaggedEgress(toolName);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction getAnnotations(context: ActionApprovalContext) {\n\treturn context.metadata?.annotations;\n}\n\nfunction isMcpTool(toolName: string): boolean {\n\treturn toolName.startsWith(\"mcp_\");\n}\n\n/**\n * Generate rules from dangerous patterns (regex-based)\n */\nconst dangerousCommandRules: ActionFirewallRule[] = Object.entries(\n\tdangerousPatterns,\n).map(([key, pattern]) => ({\n\tname: `command-${key}`,\n\tdescription:\n\t\tdangerousPatternDescriptions[\n\t\t\tkey as keyof typeof dangerousPatternDescriptions\n\t\t],\n\taction: \"require_approval\",\n\tevaluate: (ctx) => {\n\t\tif (!isBashGuardEnabled()) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\tconst command = getCommandArg(ctx);\n\t\tif (!command) return { allowed: true };\n\t\tconst unwrapped = unwrapShellCommand(command) ?? command;\n\t\tif (isCommandAllowlisted(unwrapped)) return { allowed: true };\n\t\tif (!pattern.test(unwrapped)) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\treturn {\n\t\t\tallowed: false,\n\t\t\treason: `Detected ${dangerousPatternDescriptions[key as keyof typeof dangerousPatternDescriptions]}: ${unwrapped.trim()}`,\n\t\t};\n\t},\n}));\n\nconst isBashStrict = () => process.env.MAESTRO_BASH_STRICT === \"1\";\nconst isBashGuardEnabled = () => {\n\tconst flag = process.env.MAESTRO_BASH_GUARD?.toLowerCase?.();\n\tif (flag) {\n\t\treturn ![\"0\", \"off\", \"false\", \"disabled\", \"no\"].includes(flag);\n\t}\n\t// Default: guard ON (previous behavior). Explicitly set MAESTRO_BASH_GUARD=0 to YOLO.\n\tif (isSafeModeEnabled() || isProdProfile()) {\n\t\treturn true;\n\t}\n\treturn true;\n};\n\n/**\n * Tree-sitter based command safety rule.\n * Provides more accurate analysis than regex patterns.\n */\nconst treeSitterCommandRule: ActionFirewallRule = {\n\tname: \"command-treesitter-analysis\",\n\tdescription: \"Tree-sitter based command safety analysis\",\n\taction: \"require_approval\",\n\tevaluate: (ctx) => {\n\t\tif (!isBashGuardEnabled()) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\tif (ctx.toolName !== \"bash\" && !isBackgroundTaskShellStart(ctx)) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\tlet command = getCommandArg(ctx);\n\t\tif (!command) return { allowed: true };\n\n\t\t// Try to unwrap bash -c \"...\" style commands\n\t\tconst unwrapped = unwrapShellCommand(command);\n\t\tif (unwrapped) {\n\t\t\tcommand = unwrapped;\n\t\t}\n\n\t\tif (isCommandAllowlisted(command)) {\n\t\t\treturn { allowed: true };\n\t\t}\n\n\t\tconst simpleTokens = tokenizeSimple(command);\n\t\tif (isDestructiveSimpleCommand(simpleTokens)) {\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason:\n\t\t\t\t\t\"Command requires approval (destructive or mutating operation detected)\",\n\t\t\t};\n\t\t}\n\n\t\tif (!isBashStrict() && isSimpleBenignBash(command)) {\n\t\t\treturn { allowed: true };\n\t\t}\n\n\t\t// Only run tree-sitter if the parser is available; otherwise fall back to approval\n\t\tif (!isParserAvailable()) {\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason:\n\t\t\t\t\t\"Command requires approval (bash parser unavailable; unable to fully analyze)\",\n\t\t\t};\n\t\t}\n\n\t\tconst analysis = analyzeCommandSafety(command);\n\t\tif (analysis.safe) {\n\t\t\treturn { allowed: true };\n\t\t}\n\t\treturn {\n\t\t\tallowed: false,\n\t\t\treason: analysis.reason ?? \"Command failed tree-sitter safety analysis\",\n\t\t};\n\t},\n};\n\n/**\n * Critical System Paths - Directories that should never be modified\n *\n * These paths are protected with a HARD BLOCK (not just approval required).\n * Modifying files in these directories can:\n * - Break the operating system\n * - Compromise system security\n * - Affect other users on the system\n *\n * ## Linux Paths\n *\n * - /etc: System configuration\n * - /usr: System programs and libraries\n * - /var: Variable data (logs, databases)\n * - /boot: Bootloader and kernel\n * - /sys, /proc: Kernel virtual filesystems\n * - /dev: Device files\n * - /bin, /sbin: Essential system binaries\n * - /lib, /lib64: Shared libraries\n * - /opt: Optional/third-party software\n *\n * ## macOS Paths\n *\n * - /System: System files\n * - /Library: System libraries\n * - /private/etc, /private/var: Private system configuration/data\n * - /dev: Device files\n *\n * ## Windows Paths\n *\n * - C:\\Windows: Operating system\n * - C:\\Program Files: Installed applications\n *\n * Note: /var/folders (macOS temp) and /tmp are explicitly allowed\n * through the isContainedInWorkspace check before system path blocking.\n */\nfunction extractFilePaths(context: ActionApprovalContext): string[] {\n\tconst args = getArgsObject(context);\n\tif (!args) return [];\n\tconst paths: string[] = [];\n\n\t// Simple extraction for standard file tools\n\t// Note: deeper extraction is done in policy.ts, this is for quick system protection\n\tif (context.toolName === \"write\" || context.toolName === \"edit\") {\n\t\tconst p =\n\t\t\tgetStringArg(context, \"file_path\") || getStringArg(context, \"path\");\n\t\tif (p) paths.push(p);\n\t}\n\tif (context.toolName === \"delete_file\") {\n\t\tconst p =\n\t\t\tgetStringArg(context, \"file_path\") ||\n\t\t\tgetStringArg(context, \"target_file\");\n\t\tif (p) paths.push(p);\n\t}\n\t// Handle move_file and copy_file - extract both source and destination\n\tif (context.toolName === \"move_file\" || context.toolName === \"copy_file\") {\n\t\tconst source =\n\t\t\tgetStringArg(context, \"source\") ||\n\t\t\tgetStringArg(context, \"source_path\") ||\n\t\t\tgetStringArg(context, \"from\");\n\t\tconst dest =\n\t\t\tgetStringArg(context, \"destination\") ||\n\t\t\tgetStringArg(context, \"destination_path\") ||\n\t\t\tgetStringArg(context, \"dest\") ||\n\t\t\tgetStringArg(context, \"to\");\n\t\tif (source) paths.push(source);\n\t\tif (dest) paths.push(dest);\n\t}\n\treturn paths;\n}\n\n/**\n * Workspace Containment Check - Determines if a path is in a \"safe zone\"\n *\n * The firewall uses containment to prevent accidental writes outside the\n * project directory. This function checks if a file path is within one of\n * the allowed zones.\n *\n * ## Safe Zones (in order of check)\n *\n * 1. **Workspace root**: Current working directory and subdirectories\n * 2. **System temp directory**: /tmp, /var/folders, etc.\n * 3. **Trusted paths**: User-configured paths in firewall.json\n *\n * ## Path Resolution Complexity\n *\n * We must handle several path edge cases:\n *\n * - **Symlinks**: macOS /tmp → /private/tmp, so we resolve real paths\n * - **Non-existent files**: Can't realpath a file being created, use logical path\n * - **Relative paths**: Convert to absolute before comparison\n * - **Path traversal**: Detect ../ escapes using relative() output\n *\n * ## Detection Method\n *\n * For each safe zone, we compute relative(zone, targetPath). If the result:\n * - Starts with \"..\" → path escapes the zone (unsafe)\n * - Is an absolute path → completely outside (unsafe)\n * - Otherwise → contained within zone (safe)\n *\n * @param filePath - The path to check (may be relative or absolute)\n * @returns true if path is contained in a safe zone, false otherwise\n */\n\nexport const defaultFirewallRules: ActionFirewallRule[] = [\n\t{\n\t\tname: \"enterprise-policy\",\n\t\tdescription: \"Enforce enterprise policies on tools and dependencies\",\n\t\taction: \"block\", // HARD BLOCK for policy violations\n\t\tevaluate: async (ctx) => {\n\t\t\tconst cached = policyCheckCache.get(ctx);\n\t\t\tif (cached) {\n\t\t\t\treturn cached.allowed\n\t\t\t\t\t? { allowed: true }\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\t\treason: cached.reason ?? \"Action blocked by enterprise policy\",\n\t\t\t\t\t\t};\n\t\t\t}\n\t\t\tconst result = await checkPolicy(ctx);\n\t\t\tpolicyCheckCache.set(ctx, result);\n\t\t\tif (result.allowed) return { allowed: true };\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason: result.reason ?? \"Action blocked by enterprise policy\",\n\t\t\t};\n\t\t},\n\t},\n\t{\n\t\tname: \"system-path-protection\",\n\t\tdescription: \"Prevent modification of critical system directories\",\n\t\taction: \"block\", // HARD BLOCK for system paths\n\t\tevaluate: (ctx) => {\n\t\t\t// Only check file mutation tools\n\t\t\tif (\n\t\t\t\t![\"write\", \"edit\", \"delete_file\", \"move_file\", \"copy_file\"].includes(\n\t\t\t\t\tctx.toolName,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn { allowed: true };\n\t\t\t}\n\t\t\tconst paths = extractFilePaths(ctx);\n\t\t\t// We check system paths first, but if it's in workspace, temp, or a trusted path (safe), we should allow it.\n\t\t\t// System paths like /var include /var/folders (temp on mac), so we need to exclude safe temp paths from system path blocking.\n\n\t\t\t// Filter out paths that are inside the workspace, temp, or trusted paths (which are safe)\n\t\t\tconst unsafePaths = paths.filter((p) => !isContainedInWorkspace(p));\n\n\t\t\t// Only check remaining paths against system blocklist\n\t\t\tif (unsafePaths.some(isSystemPath)) {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\treason:\n\t\t\t\t\t\t\"Modification of critical system directories is blocked for safety.\",\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { allowed: true };\n\t\t},\n\t\tremediation: () =>\n\t\t\t\"Do not modify critical system paths. If you need to write a file, use the current workspace directory or a temporary folder.\",\n\t},\n\t{\n\t\tname: \"workspace-containment\",\n\t\tdescription:\n\t\t\t\"Require approval for file modifications outside the workspace\",\n\t\taction: \"require_approval\",\n\t\tevaluate: (ctx) => {\n\t\t\t// Only check file mutation tools\n\t\t\tif (\n\t\t\t\t![\"write\", \"edit\", \"delete_file\", \"move_file\", \"copy_file\"].includes(\n\t\t\t\t\tctx.toolName,\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn { allowed: true };\n\t\t\t}\n\t\t\tconst paths = extractFilePaths(ctx);\n\t\t\t// Return true (match rule) if ANY path is NOT contained\n\t\t\tconst outsidePaths = paths.filter((p) => !isContainedInWorkspace(p));\n\t\t\tif (outsidePaths.length === 0) return { allowed: true };\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason: `File modification outside workspace detected: ${outsidePaths.join(\", \")}. This requires explicit approval.`,\n\t\t\t};\n\t\t},\n\t\tremediation: () =>\n\t\t\t\"The file path is outside the allowed workspace. Please use a path within the current project or a temporary directory, or ask the user to add this path to 'containment.trustedPaths' in ~/.maestro/firewall.json.\",\n\t},\n\t{\n\t\tid: \"untagged-human-egress\",\n\t\tdescription:\n\t\t\t\"Block human-facing tool calls without explicit TOOL_TAGS annotations when strict mode is enabled\",\n\t\taction: \"block\",\n\t\tmatch: (ctx) => {\n\t\t\tif (!isStrictUntaggedEgress()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!isHumanFacingTool(ctx.toolName)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn TOOL_TAGS[ctx.toolName] === undefined;\n\t\t},\n\t\treason: () =>\n\t\t\t\"Human-facing tool is missing TOOL_TAGS; annotate the tool or disable strict mode via MAESTRO_FAIL_UNTAGGED_EGRESS=0.\",\n\t\tremediation: () =>\n\t\t\t\"Add TOOL_TAGS entry marking egress intent (human/http) before invoking the tool.\",\n\t},\n\t{\n\t\tid: \"background-shell-block\",\n\t\tdescription: \"Block shell-based background tasks when disabled by policy\",\n\t\taction: \"block\",\n\t\tmatch: (ctx) =>\n\t\t\tisBackgroundShellBlocked() && isBackgroundTaskShellStart(ctx) === true,\n\t\treason: () =>\n\t\t\t\"Starting background_tasks with shell=true is disabled by policy. Set MAESTRO_BACKGROUND_SHELL_DISABLE=0 to allow.\",\n\t},\n\t{\n\t\tid: \"mcp-destructive-tool\",\n\t\tdescription: \"MCP tools marked as destructive require approval\",\n\t\taction: \"require_approval\",\n\t\tmatch: (ctx) => {\n\t\t\tif (!isMcpTool(ctx.toolName)) return false;\n\t\t\tconst annotations = getAnnotations(ctx);\n\t\t\t// Require approval if destructiveHint is true and readOnlyHint is not true\n\t\t\treturn (\n\t\t\t\tannotations?.destructiveHint === true && !annotations?.readOnlyHint\n\t\t\t);\n\t\t},\n\t\treason: (ctx) =>\n\t\t\t`MCP tool \"${ctx.toolName}\" is marked as destructive and requires approval`,\n\t},\n\t{\n\t\tid: \"plan-mode-confirm\",\n\t\tdescription:\n\t\t\t\"When plan mode is enabled, require approval before mutating commands\",\n\t\taction: \"require_approval\",\n\t\tmatch: (ctx) => {\n\t\t\tif (process.env.MAESTRO_PLAN_MODE !== \"1\") return false;\n\t\t\tconst name = ctx.toolName;\n\t\t\tif (name === \"write\" || name === \"edit\" || name === \"bash\") return true;\n\t\t\tif (name === \"todo\") return true;\n\t\t\tif (name === \"gh_pr\") {\n\t\t\t\tconst action = getStringArg(ctx, \"action\");\n\t\t\t\treturn !action || ![\"list\", \"view\", \"checks\", \"diff\"].includes(action);\n\t\t\t}\n\t\t\tif (name === \"gh_issue\") {\n\t\t\t\tconst action = getStringArg(ctx, \"action\");\n\t\t\t\treturn !action || ![\"list\", \"view\"].includes(action);\n\t\t\t}\n\t\t\tif (name === \"background_tasks\") {\n\t\t\t\tconst args = getArgsObject(ctx);\n\t\t\t\tconst action = args?.action;\n\t\t\t\tconst shell = args?.shell === true;\n\t\t\t\treturn action === \"start\" && shell;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\treason: (ctx) =>\n\t\t\t`Plan mode requires confirmation before executing ${ctx.toolName}. Toggle with /plan-mode or MAESTRO_PLAN_MODE=0.`,\n\t},\n\t{\n\t\tid: \"no-egress-shell\",\n\t\tdescription:\n\t\t\t\"Require approval when shell egress is disabled via MAESTRO_NO_EGRESS_SHELL\",\n\t\taction: \"require_approval\",\n\t\tevaluate: (ctx) => {\n\t\t\tif (!isNoEgressShellEnabled() || isEgressOverrideAllowed()) {\n\t\t\t\treturn { allowed: true };\n\t\t\t}\n\t\t\tif (ctx.toolName !== \"bash\" && !isBackgroundTaskShellStart(ctx)) {\n\t\t\t\treturn { allowed: true };\n\t\t\t}\n\t\t\tconst raw = getCommandArg(ctx);\n\t\t\tif (!raw) return { allowed: true };\n\t\t\tconst unwrapped = unwrapShellCommand(raw) ?? raw;\n\t\t\tif (isCommandAllowlisted(unwrapped)) return { allowed: true };\n\t\t\tif (!hasEgressPrimitives(unwrapped)) return { allowed: true };\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\treason:\n\t\t\t\t\t\"Shell egress (curl/wget/ssh/nc/dev/tcp) requires approval because MAESTRO_NO_EGRESS_SHELL=1. Allow temporarily with MAESTRO_ALLOW_EGRESS_SHELL=1 or add a bash allowlist entry.\",\n\t\t\t};\n\t\t},\n\t},\n\t...dangerousCommandRules,\n\ttreeSitterCommandRule,\n\t{\n\t\tid: \"background-shell-mode\",\n\t\tdescription: \"Shell mode background tasks\",\n\t\taction: \"require_approval\",\n\t\tmatch: (ctx) => isBackgroundTaskShellStart(ctx),\n\t\treason: () =>\n\t\t\t\"Background task shell mode requires manual approval (pipes, redirects, and globbing are high risk)\",\n\t},\n\t{\n\t\tid: HUMAN_EGRESS_PII_RULE_ID,\n\t\tdescription: \"PII must be redacted before human-facing tools execute\",\n\t\taction: \"require_approval\",\n\t\tmatch: (ctx) => {\n\t\t\tif (!isHumanFacingTool(ctx.toolName)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst pending = getPendingUnredactedPii(ctx);\n\t\t\treturn pending.length > 0;\n\t\t},\n\t\treason: (ctx) => {\n\t\t\tconst pending = getPendingUnredactedPii(ctx);\n\t\t\tconst offenders =\n\t\t\t\tpending\n\t\t\t\t\t.map(\n\t\t\t\t\t\t(artifact) =>\n\t\t\t\t\t\t\t`${artifact.label} (artifact: ${artifact.id}, source: ${artifact.sourceToolCallId})`,\n\t\t\t\t\t)\n\t\t\t\t\t.join(\"; \") || \"unredacted artifacts\";\n\t\t\treturn `Unredacted PII (${offenders}) detected before executing human-facing tool \"${ctx.toolName}\". Run your redaction tool on the listed artifacts, then retry.`;\n\t\t},\n\t},\n];\n\nexport class ActionFirewall {\n\tprivate semanticJudge?: SemanticJudge;\n\tprivate readonly governanceService:\n\t\t| ActionFirewallGovernanceServiceConfig\n\t\t| false\n\t\t| undefined;\n\n\tconstructor(\n\t\tprivate readonly rules: ActionFirewallRule[] = defaultFirewallRules,\n\t\toptions?: {\n\t\t\tgovernanceService?: ActionFirewallGovernanceServiceConfig | false;\n\t\t},\n\t) {\n\t\tthis.governanceService = options?.governanceService;\n\t}\n\n\tsetSemanticJudge(judge: SemanticJudge) {\n\t\tthis.semanticJudge = judge;\n\t}\n\n\tasync evaluate(\n\t\tcontext: ActionApprovalContext,\n\t): Promise<ActionFirewallVerdict> {\n\t\tconst governanceServiceVerdict =\n\t\t\tawait this.evaluateWithGovernanceService(context);\n\t\tif (governanceServiceVerdict?.action === \"block\") {\n\t\t\treturn governanceServiceVerdict;\n\t\t}\n\t\tif (governanceServiceVerdict?.action === \"require_approval\") {\n\t\t\treturn governanceServiceVerdict;\n\t\t}\n\n\t\tif (!governanceServiceVerdict) {\n\t\t\tfor (const rule of this.rules) {\n\t\t\t\tconst evaluation: RuleOutcome = rule.evaluate\n\t\t\t\t\t? await rule.evaluate(context)\n\t\t\t\t\t: (await rule.match?.(context))\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tallowed: false,\n\t\t\t\t\t\t\t\treason:\n\t\t\t\t\t\t\t\t\t(await rule.reason?.(context)) ??\n\t\t\t\t\t\t\t\t\t`Action matched rule: ${rule.description}`,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: { allowed: true };\n\n\t\t\t\tif (!evaluation.allowed) {\n\t\t\t\t\tconst action = rule.action ?? \"require_approval\";\n\t\t\t\t\tconst reason =\n\t\t\t\t\t\tevaluation.reason ??\n\t\t\t\t\t\t`Action matched rule: ${rule.description ?? rule.name}`;\n\t\t\t\t\tconst remediation =\n\t\t\t\t\t\tevaluation.remediation ?? (await rule.remediation?.(context));\n\t\t\t\t\tconst ruleId =\n\t\t\t\t\t\t(rule as { id?: string }).id ?? rule.name ?? \"unknown-rule\";\n\n\t\t\t\t\tif (action === \"allow\") {\n\t\t\t\t\t\treturn { action: \"allow\" };\n\t\t\t\t\t}\n\n\t\t\t\t\tif (action === \"block\") {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\truleId,\n\t\t\t\t\t\t\treason,\n\t\t\t\t\t\t\tremediation,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\taction,\n\t\t\t\t\t\truleId,\n\t\t\t\t\t\treason,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 2. Run semantic judge if available (slow path)\n\t\tif (this.semanticJudge && context.userIntent) {\n\t\t\tconst SENSITIVE_TOOLS = [\n\t\t\t\t\"bash\",\n\t\t\t\t\"write\",\n\t\t\t\t\"edit\",\n\t\t\t\t\"delete_file\",\n\t\t\t\t\"background_tasks\",\n\t\t\t];\n\t\t\tif (SENSITIVE_TOOLS.includes(context.toolName)) {\n\t\t\t\tconst judgment = await this.semanticJudge.evaluate({\n\t\t\t\t\tuserIntent: context.userIntent,\n\t\t\t\t\ttoolName: context.toolName,\n\t\t\t\t\ttoolArgs: context.args,\n\t\t\t\t});\n\n\t\t\t\tif (!judgment.safe) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\taction: \"require_approval\",\n\t\t\t\t\t\truleId: \"semantic-judge\",\n\t\t\t\t\t\treason: judgment.reason,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { action: \"allow\" };\n\t}\n\n\tprivate async evaluateWithGovernanceService(\n\t\tcontext: ActionApprovalContext,\n\t): Promise<ActionFirewallVerdict | null> {\n\t\tconst config = resolveActionFirewallGovernanceServiceConfig(\n\t\t\tthis.governanceService,\n\t\t\tcontext,\n\t\t);\n\t\tif (!config) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst verdict = await evaluateActionWithActionFirewallGovernanceService(\n\t\t\t\tconfig,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\treturn verdict;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tif (config.failureMode === \"required\") {\n\t\t\t\treturn {\n\t\t\t\t\taction: \"block\",\n\t\t\t\t\truleId: \"governance-service-unavailable\",\n\t\t\t\t\treason: `Governance service unavailable: ${message}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tlogger.warn(\n\t\t\t\t\"Failed to evaluate action with governance service; falling back to local firewall rules\",\n\t\t\t\t{\n\t\t\t\t\terror: message,\n\t\t\t\t\ttoolName: context.toolName,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\nexport const defaultActionFirewall = new ActionFirewall();\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ActionApprovalContext, ActionFirewallVerdict } from "../agent/action-approval.js";
|
|
2
|
+
import { type DownstreamFailureMode as DownstreamHttpFailureMode } from "../utils/downstream-http.js";
|
|
3
|
+
export declare const GOVERNANCE_CALL_FAILURE_MODES: {
|
|
4
|
+
readonly evaluateAction: {
|
|
5
|
+
readonly optional: "fail-open";
|
|
6
|
+
readonly required: "fail-closed";
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
export interface ActionFirewallGovernanceServiceConfig {
|
|
10
|
+
baseUrl?: string;
|
|
11
|
+
token?: string;
|
|
12
|
+
workspaceId?: string;
|
|
13
|
+
agentId?: string;
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
maxAttempts?: number;
|
|
16
|
+
circuitFailureThreshold?: number;
|
|
17
|
+
circuitResetTimeoutMs?: number;
|
|
18
|
+
circuitSuccessThreshold?: number;
|
|
19
|
+
required?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ResolvedActionFirewallGovernanceServiceConfig {
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
token?: string;
|
|
24
|
+
workspaceId: string;
|
|
25
|
+
agentId: string;
|
|
26
|
+
timeoutMs: number;
|
|
27
|
+
maxAttempts: number;
|
|
28
|
+
circuitFailureThreshold: number;
|
|
29
|
+
circuitResetTimeoutMs: number;
|
|
30
|
+
circuitSuccessThreshold: number;
|
|
31
|
+
failureMode: DownstreamHttpFailureMode;
|
|
32
|
+
}
|
|
33
|
+
export declare function resolveActionFirewallGovernanceServiceConfig(config: ActionFirewallGovernanceServiceConfig | false | undefined, context: ActionApprovalContext): ResolvedActionFirewallGovernanceServiceConfig | null;
|
|
34
|
+
export declare function evaluateActionWithActionFirewallGovernanceService(config: ResolvedActionFirewallGovernanceServiceConfig, context: ActionApprovalContext): Promise<ActionFirewallVerdict | null>;
|
|
35
|
+
export declare function resetActionFirewallGovernanceDownstreamForTests(): void;
|
|
36
|
+
//# sourceMappingURL=governance-service-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"governance-service-client.d.ts","sourceRoot":"","sources":["../../src/safety/governance-service-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,qBAAqB,EACrB,qBAAqB,EACrB,MAAM,6BAA6B,CAAC;AASrC,OAAO,EACN,KAAK,qBAAqB,IAAI,yBAAyB,EAEvD,MAAM,6BAA6B,CAAC;AAUrC,eAAO,MAAM,6BAA6B;;;;;CAKhC,CAAC;AAIX,MAAM,WAAW,qCAAqC;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,6CAA6C;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB,EAAE,MAAM,CAAC;IAChC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,WAAW,EAAE,yBAAyB,CAAC;CACvC;AA+ED,wBAAgB,4CAA4C,CAC3D,MAAM,EAAE,qCAAqC,GAAG,KAAK,GAAG,SAAS,EACjE,OAAO,EAAE,qBAAqB,GAC5B,6CAA6C,GAAG,IAAI,CAmGtD;AAqID,wBAAsB,iDAAiD,CACtE,MAAM,EAAE,6CAA6C,EACrD,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CA0CvC;AAED,wBAAgB,+CAA+C,IAAI,IAAI,CAEtE"}
|