@elie-laloum/outpost 11.1.2 → 11.2.0
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/CHANGELOG.md +34 -0
- package/README.md +2 -1
- package/SECURITY.md +5 -1
- package/dist/adapters/agents/antigravity/antigravity-adapter.js +9 -0
- package/dist/adapters/agents/antigravity/antigravity-adapter.js.map +1 -1
- package/dist/adapters/agents/antigravity/antigravity-hook-plan.d.ts +3 -0
- package/dist/adapters/agents/antigravity/antigravity-hook-plan.js +39 -0
- package/dist/adapters/agents/antigravity/antigravity-hook-plan.js.map +1 -0
- package/dist/adapters/agents/antigravity/antigravity-hooks.constants.d.ts +3 -0
- package/dist/adapters/agents/antigravity/antigravity-hooks.constants.js +394 -0
- package/dist/adapters/agents/antigravity/antigravity-hooks.constants.js.map +1 -0
- package/dist/adapters/agents/antigravity/antigravity-hooks.d.ts +2 -0
- package/dist/adapters/agents/antigravity/antigravity-hooks.js +6 -0
- package/dist/adapters/agents/antigravity/antigravity-hooks.js.map +1 -0
- package/dist/adapters/agents/antigravity/antigravity-hooks.types.d.ts +114 -0
- package/dist/adapters/agents/antigravity/antigravity-hooks.types.js +2 -0
- package/dist/adapters/agents/antigravity/antigravity-hooks.types.js.map +1 -0
- package/dist/adapters/agents/antigravity/antigravity.types.d.ts +1 -0
- package/dist/adapters/agents/antigravity/antigravity.types.js.map +1 -1
- package/dist/adapters/agents/authentication.js +1 -0
- package/dist/adapters/agents/authentication.js.map +1 -1
- package/dist/adapters/agents/claude/claude-adapter.js +15 -0
- package/dist/adapters/agents/claude/claude-adapter.js.map +1 -1
- package/dist/adapters/agents/claude/claude-hook-plan.constants.d.ts +1 -0
- package/dist/adapters/agents/claude/claude-hook-plan.constants.js +20 -0
- package/dist/adapters/agents/claude/claude-hook-plan.constants.js.map +1 -0
- package/dist/adapters/agents/claude/claude-hook-plan.d.ts +4 -0
- package/dist/adapters/agents/claude/claude-hook-plan.js +60 -0
- package/dist/adapters/agents/claude/claude-hook-plan.js.map +1 -0
- package/dist/adapters/agents/claude/claude-hooks.constants.d.ts +3 -0
- package/dist/adapters/agents/claude/claude-hooks.constants.js +2968 -0
- package/dist/adapters/agents/claude/claude-hooks.constants.js.map +1 -0
- package/dist/adapters/agents/claude/claude-hooks.d.ts +2 -0
- package/dist/adapters/agents/claude/claude-hooks.js +6 -0
- package/dist/adapters/agents/claude/claude-hooks.js.map +1 -0
- package/dist/adapters/agents/claude/claude-hooks.types.d.ts +900 -0
- package/dist/adapters/agents/claude/claude-hooks.types.js +2 -0
- package/dist/adapters/agents/claude/claude-hooks.types.js.map +1 -0
- package/dist/adapters/agents/claude/claude-profile.d.ts +1 -0
- package/dist/adapters/agents/claude/claude-profile.js +23 -11
- package/dist/adapters/agents/claude/claude-profile.js.map +1 -1
- package/dist/adapters/agents/codex/codex-adapter.js +17 -1
- package/dist/adapters/agents/codex/codex-adapter.js.map +1 -1
- package/dist/adapters/agents/codex/codex-authentication.js +1 -0
- package/dist/adapters/agents/codex/codex-authentication.js.map +1 -1
- package/dist/adapters/agents/codex/codex-conversations.constants.d.ts +1 -0
- package/dist/adapters/agents/codex/codex-conversations.constants.js +2 -0
- package/dist/adapters/agents/codex/codex-conversations.constants.js.map +1 -0
- package/dist/adapters/agents/codex/codex-conversations.js +8 -5
- package/dist/adapters/agents/codex/codex-conversations.js.map +1 -1
- package/dist/adapters/agents/codex/codex-hook-plan.d.ts +3 -0
- package/dist/adapters/agents/codex/codex-hook-plan.js +72 -0
- package/dist/adapters/agents/codex/codex-hook-plan.js.map +1 -0
- package/dist/adapters/agents/codex/codex-hooks.constants.d.ts +3 -0
- package/dist/adapters/agents/codex/codex-hooks.constants.js +942 -0
- package/dist/adapters/agents/codex/codex-hooks.constants.js.map +1 -0
- package/dist/adapters/agents/codex/codex-hooks.d.ts +2 -0
- package/dist/adapters/agents/codex/codex-hooks.js +6 -0
- package/dist/adapters/agents/codex/codex-hooks.js.map +1 -0
- package/dist/adapters/agents/codex/codex-hooks.types.d.ts +255 -0
- package/dist/adapters/agents/codex/codex-hooks.types.js +2 -0
- package/dist/adapters/agents/codex/codex-hooks.types.js.map +1 -0
- package/dist/adapters/agents/codex/codex-provider.js +2 -2
- package/dist/adapters/agents/codex/codex-provider.js.map +1 -1
- package/dist/adapters/agents/copilot/copilot-adapter.js +14 -0
- package/dist/adapters/agents/copilot/copilot-adapter.js.map +1 -1
- package/dist/adapters/agents/copilot/copilot-hook-plan.d.ts +3 -0
- package/dist/adapters/agents/copilot/copilot-hook-plan.js +26 -0
- package/dist/adapters/agents/copilot/copilot-hook-plan.js.map +1 -0
- package/dist/adapters/agents/copilot/copilot-hooks.constants.d.ts +3 -0
- package/dist/adapters/agents/copilot/copilot-hooks.constants.js +528 -0
- package/dist/adapters/agents/copilot/copilot-hooks.constants.js.map +1 -0
- package/dist/adapters/agents/copilot/copilot-hooks.d.ts +2 -0
- package/dist/adapters/agents/copilot/copilot-hooks.js +6 -0
- package/dist/adapters/agents/copilot/copilot-hooks.js.map +1 -0
- package/dist/adapters/agents/copilot/copilot-hooks.types.d.ts +166 -0
- package/dist/adapters/agents/copilot/copilot-hooks.types.js +2 -0
- package/dist/adapters/agents/copilot/copilot-hooks.types.js.map +1 -0
- package/dist/adapters/agents/copilot/copilot.types.d.ts +1 -0
- package/dist/adapters/agents/copilot/copilot.types.js.map +1 -1
- package/dist/adapters/agents/hook-groups.d.ts +2 -0
- package/dist/adapters/agents/hook-groups.js +17 -0
- package/dist/adapters/agents/hook-groups.js.map +1 -0
- package/dist/adapters/agents/kimi/kimi-adapter.js +16 -1
- package/dist/adapters/agents/kimi/kimi-adapter.js.map +1 -1
- package/dist/adapters/agents/kimi/kimi-hook-plan.d.ts +3 -0
- package/dist/adapters/agents/kimi/kimi-hook-plan.js +33 -0
- package/dist/adapters/agents/kimi/kimi-hook-plan.js.map +1 -0
- package/dist/adapters/agents/kimi/kimi-hooks.constants.d.ts +3 -0
- package/dist/adapters/agents/kimi/kimi-hooks.constants.js +747 -0
- package/dist/adapters/agents/kimi/kimi-hooks.constants.js.map +1 -0
- package/dist/adapters/agents/kimi/kimi-hooks.d.ts +2 -0
- package/dist/adapters/agents/kimi/kimi-hooks.js +6 -0
- package/dist/adapters/agents/kimi/kimi-hooks.js.map +1 -0
- package/dist/adapters/agents/kimi/kimi-hooks.types.d.ts +226 -0
- package/dist/adapters/agents/kimi/kimi-hooks.types.js +2 -0
- package/dist/adapters/agents/kimi/kimi-hooks.types.js.map +1 -0
- package/dist/adapters/agents/kimi/kimi-request.js +2 -0
- package/dist/adapters/agents/kimi/kimi-request.js.map +1 -1
- package/dist/adapters/agents/kimi/kimi.constants.d.ts +1 -0
- package/dist/adapters/agents/kimi/kimi.constants.js +1 -0
- package/dist/adapters/agents/kimi/kimi.constants.js.map +1 -1
- package/dist/adapters/agents/kimi/kimi.types.d.ts +1 -0
- package/dist/adapters/agents/kimi/kimi.types.js.map +1 -1
- package/dist/adapters/agents/native-hooks.d.ts +4 -0
- package/dist/adapters/agents/native-hooks.js +63 -0
- package/dist/adapters/agents/native-hooks.js.map +1 -0
- package/dist/adapters/agents/native-hooks.types.d.ts +22 -0
- package/dist/adapters/agents/native-hooks.types.js +2 -0
- package/dist/adapters/agents/native-hooks.types.js.map +1 -0
- package/dist/adapters/agents/settings.types.d.ts +2 -0
- package/dist/adapters/agents/settings.types.js.map +1 -1
- package/dist/adapters/decisions/system-one-provider.constants.d.ts +1 -1
- package/dist/adapters/decisions/system-one-provider.constants.js +1 -1
- package/dist/adapters/decisions/system-one-provider.constants.js.map +1 -1
- package/dist/adapters/decisions/system-one-provider.js +8 -21
- package/dist/adapters/decisions/system-one-provider.js.map +1 -1
- package/dist/adapters/models/anthropic-model-provider.constants.d.ts +1 -0
- package/dist/adapters/models/anthropic-model-provider.constants.js +4 -0
- package/dist/adapters/models/anthropic-model-provider.constants.js.map +1 -1
- package/dist/adapters/models/anthropic-model-provider.js +7 -1
- package/dist/adapters/models/anthropic-model-provider.js.map +1 -1
- package/dist/adapters/models/http-failure.d.ts +3 -0
- package/dist/adapters/models/http-failure.js +43 -0
- package/dist/adapters/models/http-failure.js.map +1 -0
- package/dist/adapters/models/http-provider.js +14 -20
- package/dist/adapters/models/http-provider.js.map +1 -1
- package/dist/adapters/models/model-protocol.types.d.ts +1 -0
- package/dist/adapters/models/model-protocol.types.js.map +1 -1
- package/dist/adapters/models/model.constants.d.ts +2 -0
- package/dist/adapters/models/model.constants.js +17 -0
- package/dist/adapters/models/model.constants.js.map +1 -1
- package/dist/adapters/models/openai-chat-stream.js +3 -1
- package/dist/adapters/models/openai-chat-stream.js.map +1 -1
- package/dist/adapters/models/openai-responses.js +4 -0
- package/dist/adapters/models/openai-responses.js.map +1 -1
- package/dist/adapters/secrets/aws.js +5 -4
- package/dist/adapters/secrets/aws.js.map +1 -1
- package/dist/adapters/secrets/azure.constants.d.ts +1 -0
- package/dist/adapters/secrets/azure.constants.js +2 -0
- package/dist/adapters/secrets/azure.constants.js.map +1 -0
- package/dist/adapters/secrets/azure.js +2 -1
- package/dist/adapters/secrets/azure.js.map +1 -1
- package/dist/adapters/secrets/gcp.constants.d.ts +1 -0
- package/dist/adapters/secrets/gcp.constants.js +2 -0
- package/dist/adapters/secrets/gcp.constants.js.map +1 -0
- package/dist/adapters/secrets/gcp.js +11 -9
- package/dist/adapters/secrets/gcp.js.map +1 -1
- package/dist/adapters/secrets/infisical.js +3 -2
- package/dist/adapters/secrets/infisical.js.map +1 -1
- package/dist/adapters/secrets/onepassword.constants.d.ts +1 -0
- package/dist/adapters/secrets/onepassword.constants.js +2 -0
- package/dist/adapters/secrets/onepassword.constants.js.map +1 -0
- package/dist/adapters/secrets/onepassword.js +2 -1
- package/dist/adapters/secrets/onepassword.js.map +1 -1
- package/dist/adapters/secrets/secret-source.js +3 -1
- package/dist/adapters/secrets/secret-source.js.map +1 -1
- package/dist/adapters/secrets/vault-response.js +5 -5
- package/dist/adapters/secrets/vault-response.js.map +1 -1
- package/dist/adapters/secrets/vault.js +4 -3
- package/dist/adapters/secrets/vault.js.map +1 -1
- package/dist/adapters/testing/scripted-agent.d.ts +3 -1
- package/dist/adapters/testing/scripted-agent.js +3 -1
- package/dist/adapters/testing/scripted-agent.js.map +1 -1
- package/dist/adapters/tools/edit-tools.js +3 -3
- package/dist/adapters/tools/edit-tools.js.map +1 -1
- package/dist/adapters/tools/git-tools.js +16 -1
- package/dist/adapters/tools/git-tools.js.map +1 -1
- package/dist/adapters/tools/mcp-launcher.constants.d.ts +1 -1
- package/dist/adapters/tools/mcp-launcher.constants.js +29 -7
- package/dist/adapters/tools/mcp-launcher.constants.js.map +1 -1
- package/dist/adapters/tools/mcp-resources.js +5 -1
- package/dist/adapters/tools/mcp-resources.js.map +1 -1
- package/dist/adapters/tools/mcp.constants.d.ts +0 -6
- package/dist/adapters/tools/mcp.constants.js +0 -6
- package/dist/adapters/tools/mcp.constants.js.map +1 -1
- package/dist/adapters/tools/mcp.js +1 -0
- package/dist/adapters/tools/mcp.js.map +1 -1
- package/dist/adapters/tools/sandbox-files.constants.d.ts +1 -0
- package/dist/adapters/tools/sandbox-files.constants.js +17 -0
- package/dist/adapters/tools/sandbox-files.constants.js.map +1 -0
- package/dist/adapters/tools/sandbox-files.d.ts +1 -0
- package/dist/adapters/tools/sandbox-files.js +14 -1
- package/dist/adapters/tools/sandbox-files.js.map +1 -1
- package/dist/adapters/tools/tools.constants.js +1 -0
- package/dist/adapters/tools/tools.constants.js.map +1 -1
- package/dist/adapters/triggers/github-webhook.js +14 -11
- package/dist/adapters/triggers/github-webhook.js.map +1 -1
- package/dist/adapters/triggers/gitlab-webhook.js +16 -13
- package/dist/adapters/triggers/gitlab-webhook.js.map +1 -1
- package/dist/adapters/triggers/slack-request.js +10 -7
- package/dist/adapters/triggers/slack-request.js.map +1 -1
- package/dist/adapters/triggers/standard-webhook.js +10 -7
- package/dist/adapters/triggers/standard-webhook.js.map +1 -1
- package/dist/application/agent-authentication.js +4 -1
- package/dist/application/agent-authentication.js.map +1 -1
- package/dist/application/agent-turn.js +20 -5
- package/dist/application/agent-turn.js.map +1 -1
- package/dist/application/cli-hooks.constants.d.ts +2 -0
- package/dist/application/cli-hooks.constants.js +69 -0
- package/dist/application/cli-hooks.constants.js.map +1 -0
- package/dist/application/cli-hooks.d.ts +3 -0
- package/dist/application/cli-hooks.js +168 -0
- package/dist/application/cli-hooks.js.map +1 -0
- package/dist/application/cli-steering.js +33 -2
- package/dist/application/cli-steering.js.map +1 -1
- package/dist/application/custom-turn.js +10 -1
- package/dist/application/custom-turn.js.map +1 -1
- package/dist/application/diagnostic-probe.d.ts +1 -1
- package/dist/application/diagnostic-probe.js +7 -3
- package/dist/application/diagnostic-probe.js.map +1 -1
- package/dist/application/dispatch-observation.js +4 -0
- package/dist/application/dispatch-observation.js.map +1 -1
- package/dist/application/doctor-agent.d.ts +1 -1
- package/dist/application/doctor-agent.js +2 -2
- package/dist/application/doctor-agent.js.map +1 -1
- package/dist/application/doctor-deadline.d.ts +1 -0
- package/dist/application/doctor-deadline.js +10 -0
- package/dist/application/doctor-deadline.js.map +1 -0
- package/dist/application/doctor-image.js +9 -7
- package/dist/application/doctor-image.js.map +1 -1
- package/dist/application/doctor-sandbox.js +4 -4
- package/dist/application/doctor-sandbox.js.map +1 -1
- package/dist/application/doctor.constants.d.ts +2 -0
- package/dist/application/doctor.constants.js +2 -0
- package/dist/application/doctor.constants.js.map +1 -1
- package/dist/application/doctor.js +12 -8
- package/dist/application/doctor.js.map +1 -1
- package/dist/application/doctor.types.d.ts +2 -0
- package/dist/application/doctor.types.js.map +1 -1
- package/dist/application/file-sandbox.js +49 -11
- package/dist/application/file-sandbox.js.map +1 -1
- package/dist/application/harness-context.js +4 -2
- package/dist/application/harness-context.js.map +1 -1
- package/dist/application/harness-hook-transforms.d.ts +8 -0
- package/dist/application/harness-hook-transforms.js +115 -0
- package/dist/application/harness-hook-transforms.js.map +1 -0
- package/dist/application/harness-hooks.d.ts +5 -3
- package/dist/application/harness-hooks.js +37 -50
- package/dist/application/harness-hooks.js.map +1 -1
- package/dist/application/harness-loop.d.ts +2 -1
- package/dist/application/harness-loop.js +95 -21
- package/dist/application/harness-loop.js.map +1 -1
- package/dist/application/harness-subagent.d.ts +1 -1
- package/dist/application/harness-subagent.js +63 -12
- package/dist/application/harness-subagent.js.map +1 -1
- package/dist/application/harness.types.d.ts +3 -0
- package/dist/application/harness.types.js.map +1 -1
- package/dist/application/hook-invocation.d.ts +4 -0
- package/dist/application/hook-invocation.js +59 -0
- package/dist/application/hook-invocation.js.map +1 -0
- package/dist/application/queue-worker.js +51 -9
- package/dist/application/queue-worker.js.map +1 -1
- package/dist/application/queue-worker.types.d.ts +1 -0
- package/dist/application/queue-worker.types.js.map +1 -1
- package/dist/application/recipes/native-schemas.constants.js +1439 -218
- package/dist/application/recipes/native-schemas.constants.js.map +1 -1
- package/dist/application/recovery-inspection.js +4 -1
- package/dist/application/recovery-inspection.js.map +1 -1
- package/dist/application/remote-download.js +15 -5
- package/dist/application/remote-download.js.map +1 -1
- package/dist/application/remote-paths.d.ts +1 -0
- package/dist/application/remote-paths.js +7 -0
- package/dist/application/remote-paths.js.map +1 -0
- package/dist/application/remote-validation.js +40 -9
- package/dist/application/remote-validation.js.map +1 -1
- package/dist/application/remote-workspace.js +17 -2
- package/dist/application/remote-workspace.js.map +1 -1
- package/dist/application/repetition-watchdog.js +3 -1
- package/dist/application/repetition-watchdog.js.map +1 -1
- package/dist/application/sandbox-attach.js +38 -9
- package/dist/application/sandbox-attach.js.map +1 -1
- package/dist/application/sandbox-dispatch.js +7 -1
- package/dist/application/sandbox-dispatch.js.map +1 -1
- package/dist/application/schedules.js +2 -0
- package/dist/application/schedules.js.map +1 -1
- package/dist/application/secrets.js +4 -0
- package/dist/application/secrets.js.map +1 -1
- package/dist/application/tool-execution.js +28 -8
- package/dist/application/tool-execution.js.map +1 -1
- package/dist/application/transport-retention.js +3 -3
- package/dist/application/transport-retention.js.map +1 -1
- package/dist/application/workspace-fingerprint.d.ts +1 -0
- package/dist/application/workspace-fingerprint.js +19 -4
- package/dist/application/workspace-fingerprint.js.map +1 -1
- package/dist/cli/doctor-command.js +12 -2
- package/dist/cli/doctor-command.js.map +1 -1
- package/dist/cli/image.js +2 -0
- package/dist/cli/image.js.map +1 -1
- package/dist/cli/main.constants.d.ts +14 -2
- package/dist/cli/main.constants.js +27 -1
- package/dist/cli/main.constants.js.map +1 -1
- package/dist/cli/project-settings.js +7 -1
- package/dist/cli/project-settings.js.map +1 -1
- package/dist/cli/recipe-yaml.js +8 -0
- package/dist/cli/recipe-yaml.js.map +1 -1
- package/dist/cli/recovery-command.js +3 -0
- package/dist/cli/recovery-command.js.map +1 -1
- package/dist/cli/recovery-unlock-command.d.ts +2 -0
- package/dist/cli/recovery-unlock-command.js +19 -0
- package/dist/cli/recovery-unlock-command.js.map +1 -0
- package/dist/cli/scaffold-files.js +4 -1
- package/dist/cli/scaffold-files.js.map +1 -1
- package/dist/cli/scaffold-validation.js +3 -0
- package/dist/cli/scaffold-validation.js.map +1 -1
- package/dist/cli/scaffold.js +2 -0
- package/dist/cli/scaffold.js.map +1 -1
- package/dist/domain/agent-hook.types.d.ts +28 -0
- package/dist/domain/agent-hook.types.js +2 -0
- package/dist/domain/agent-hook.types.js.map +1 -0
- package/dist/domain/agent-profile-hooks.d.ts +2 -0
- package/dist/domain/agent-profile-hooks.js +52 -0
- package/dist/domain/agent-profile-hooks.js.map +1 -0
- package/dist/domain/agent-profile-permissions.js +11 -1
- package/dist/domain/agent-profile-permissions.js.map +1 -1
- package/dist/domain/agent-profile.constants.d.ts +1 -0
- package/dist/domain/agent-profile.constants.js +9 -0
- package/dist/domain/agent-profile.constants.js.map +1 -1
- package/dist/domain/agent-profile.js +6 -1
- package/dist/domain/agent-profile.js.map +1 -1
- package/dist/domain/agent-profile.types.d.ts +11 -0
- package/dist/domain/agent-profile.types.js.map +1 -1
- package/dist/domain/agent.types.d.ts +2 -0
- package/dist/domain/agent.types.js.map +1 -1
- package/dist/domain/container-image.d.ts +1 -0
- package/dist/domain/container-image.js +8 -0
- package/dist/domain/container-image.js.map +1 -0
- package/dist/domain/context.constants.d.ts +1 -0
- package/dist/domain/context.constants.js +1 -0
- package/dist/domain/context.constants.js.map +1 -1
- package/dist/domain/context.js +6 -1
- package/dist/domain/context.js.map +1 -1
- package/dist/domain/egress.js +6 -1
- package/dist/domain/egress.js.map +1 -1
- package/dist/domain/glob.js +1 -1
- package/dist/domain/glob.js.map +1 -1
- package/dist/domain/harness.js +4 -1
- package/dist/domain/harness.js.map +1 -1
- package/dist/domain/hook-command.d.ts +2 -0
- package/dist/domain/hook-command.js +26 -0
- package/dist/domain/hook-command.js.map +1 -0
- package/dist/domain/hook-command.types.d.ts +7 -0
- package/dist/domain/hook-command.types.js +2 -0
- package/dist/domain/hook-command.types.js.map +1 -0
- package/dist/domain/hook-decision.d.ts +2 -0
- package/dist/domain/hook-decision.js +38 -0
- package/dist/domain/hook-decision.js.map +1 -0
- package/dist/domain/hook.constants.d.ts +3 -0
- package/dist/domain/hook.constants.js +31 -1
- package/dist/domain/hook.constants.js.map +1 -1
- package/dist/domain/hook.js +49 -5
- package/dist/domain/hook.js.map +1 -1
- package/dist/domain/hook.types.d.ts +82 -5
- package/dist/domain/hook.types.js.map +1 -1
- package/dist/domain/mcp-server.constants.d.ts +6 -0
- package/dist/domain/mcp-server.constants.js +6 -0
- package/dist/domain/mcp-server.constants.js.map +1 -1
- package/dist/domain/mcp-server.js +1 -0
- package/dist/domain/mcp-server.js.map +1 -1
- package/dist/domain/permissions.types.d.ts +1 -0
- package/dist/domain/permissions.types.js.map +1 -1
- package/dist/domain/pricing.js +4 -2
- package/dist/domain/pricing.js.map +1 -1
- package/dist/domain/redaction.js +6 -3
- package/dist/domain/redaction.js.map +1 -1
- package/dist/domain/secret-fault.d.ts +4 -0
- package/dist/domain/secret-fault.js +11 -0
- package/dist/domain/secret-fault.js.map +1 -0
- package/dist/domain/secrets.js +3 -2
- package/dist/domain/secrets.js.map +1 -1
- package/dist/domain/steering.js +2 -0
- package/dist/domain/steering.js.map +1 -1
- package/dist/domain/steering.types.d.ts +1 -1
- package/dist/domain/steering.types.js.map +1 -1
- package/dist/domain/transport.js +5 -1
- package/dist/domain/transport.js.map +1 -1
- package/dist/domain/trigger-payload.d.ts +4 -0
- package/dist/domain/trigger-payload.js +15 -0
- package/dist/domain/trigger-payload.js.map +1 -0
- package/dist/domain/workflow/checkpoint.js +19 -2
- package/dist/domain/workflow/checkpoint.js.map +1 -1
- package/dist/domain/workflow/retry.constants.d.ts +1 -0
- package/dist/domain/workflow/retry.constants.js +1 -0
- package/dist/domain/workflow/retry.constants.js.map +1 -1
- package/dist/domain/workflow/retry.js +6 -2
- package/dist/domain/workflow/retry.js.map +1 -1
- package/dist/domain/workflow/task-runner.js +5 -3
- package/dist/domain/workflow/task-runner.js.map +1 -1
- package/dist/domain/workflow/workflow-state.js +2 -1
- package/dist/domain/workflow/workflow-state.js.map +1 -1
- package/dist/domain/workflow.types.d.ts +1 -0
- package/dist/domain/workflow.types.js.map +1 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/conversations/transcript-store.js +32 -5
- package/dist/infrastructure/conversations/transcript-store.js.map +1 -1
- package/dist/infrastructure/files.d.ts +1 -0
- package/dist/infrastructure/files.js +8 -4
- package/dist/infrastructure/files.js.map +1 -1
- package/dist/infrastructure/git/integration-candidate.js +3 -2
- package/dist/infrastructure/git/integration-candidate.js.map +1 -1
- package/dist/infrastructure/git/lock-recovery.d.ts +3 -0
- package/dist/infrastructure/git/lock-recovery.js +58 -0
- package/dist/infrastructure/git/lock-recovery.js.map +1 -0
- package/dist/infrastructure/git/lock-recovery.types.d.ts +11 -0
- package/dist/infrastructure/git/lock-recovery.types.js +2 -0
- package/dist/infrastructure/git/lock-recovery.types.js.map +1 -0
- package/dist/infrastructure/git/managed-worktree.js +5 -8
- package/dist/infrastructure/git/managed-worktree.js.map +1 -1
- package/dist/infrastructure/git/verification-command.js +35 -30
- package/dist/infrastructure/git/verification-command.js.map +1 -1
- package/dist/infrastructure/git/workspace-lease.js +12 -5
- package/dist/infrastructure/git/workspace-lease.js.map +1 -1
- package/dist/infrastructure/hook-configuration.constants.d.ts +1 -0
- package/dist/infrastructure/hook-configuration.constants.js +59 -0
- package/dist/infrastructure/hook-configuration.constants.js.map +1 -0
- package/dist/infrastructure/hook-configuration.d.ts +3 -0
- package/dist/infrastructure/hook-configuration.js +16 -0
- package/dist/infrastructure/hook-configuration.js.map +1 -0
- package/dist/infrastructure/hook-configuration.types.d.ts +14 -0
- package/dist/infrastructure/hook-configuration.types.js +2 -0
- package/dist/infrastructure/hook-configuration.types.js.map +1 -0
- package/dist/infrastructure/http-transport.constants.d.ts +1 -0
- package/dist/infrastructure/http-transport.constants.js +14 -0
- package/dist/infrastructure/http-transport.constants.js.map +1 -0
- package/dist/infrastructure/http-transport.d.ts +7 -0
- package/dist/infrastructure/http-transport.js +19 -0
- package/dist/infrastructure/http-transport.js.map +1 -0
- package/dist/infrastructure/input-failure.d.ts +4 -0
- package/dist/infrastructure/input-failure.js +14 -0
- package/dist/infrastructure/input-failure.js.map +1 -0
- package/dist/infrastructure/inspection-file.d.ts +1 -0
- package/dist/infrastructure/inspection-file.js +8 -2
- package/dist/infrastructure/inspection-file.js.map +1 -1
- package/dist/infrastructure/local-transport.js +16 -11
- package/dist/infrastructure/local-transport.js.map +1 -1
- package/dist/infrastructure/process.constants.d.ts +1 -0
- package/dist/infrastructure/process.constants.js +1 -0
- package/dist/infrastructure/process.constants.js.map +1 -1
- package/dist/infrastructure/process.d.ts +1 -0
- package/dist/infrastructure/process.js +48 -8
- package/dist/infrastructure/process.js.map +1 -1
- package/dist/infrastructure/reservation-ledger.d.ts +2 -0
- package/dist/infrastructure/reservation-ledger.js +84 -0
- package/dist/infrastructure/reservation-ledger.js.map +1 -0
- package/dist/infrastructure/reservation-recovery.d.ts +4 -0
- package/dist/infrastructure/reservation-recovery.js +28 -0
- package/dist/infrastructure/reservation-recovery.js.map +1 -0
- package/dist/infrastructure/s3-tombstones.d.ts +3 -0
- package/dist/infrastructure/s3-tombstones.js +46 -0
- package/dist/infrastructure/s3-tombstones.js.map +1 -0
- package/dist/infrastructure/s3-tombstones.types.d.ts +6 -0
- package/dist/infrastructure/s3-tombstones.types.js +2 -0
- package/dist/infrastructure/s3-tombstones.types.js.map +1 -0
- package/dist/infrastructure/s3-transport.d.ts +2 -0
- package/dist/infrastructure/s3-transport.js +4 -2
- package/dist/infrastructure/s3-transport.js.map +1 -1
- package/dist/infrastructure/sse.js +6 -3
- package/dist/infrastructure/sse.js.map +1 -1
- package/dist/infrastructure/task-queue-bullmq-connection.d.ts +3 -0
- package/dist/infrastructure/task-queue-bullmq-connection.js +32 -0
- package/dist/infrastructure/task-queue-bullmq-connection.js.map +1 -0
- package/dist/infrastructure/task-queue-bullmq-connection.types.d.ts +8 -0
- package/dist/infrastructure/task-queue-bullmq-connection.types.js +2 -0
- package/dist/infrastructure/task-queue-bullmq-connection.types.js.map +1 -0
- package/dist/infrastructure/task-queue-bullmq-resources.js +21 -15
- package/dist/infrastructure/task-queue-bullmq-resources.js.map +1 -1
- package/dist/infrastructure/task-queue-bullmq-state.d.ts +1 -0
- package/dist/infrastructure/task-queue-bullmq-state.js +1 -0
- package/dist/infrastructure/task-queue-bullmq-state.js.map +1 -1
- package/dist/infrastructure/task-queue-bullmq.constants.d.ts +2 -1
- package/dist/infrastructure/task-queue-bullmq.constants.js +2 -1
- package/dist/infrastructure/task-queue-bullmq.constants.js.map +1 -1
- package/dist/infrastructure/task-queue-bullmq.js +10 -1
- package/dist/infrastructure/task-queue-bullmq.js.map +1 -1
- package/dist/infrastructure/task-queue.js +13 -4
- package/dist/infrastructure/task-queue.js.map +1 -1
- package/dist/infrastructure/transfer-copy.d.ts +1 -0
- package/dist/infrastructure/transfer-copy.js +16 -1
- package/dist/infrastructure/transfer-copy.js.map +1 -1
- package/dist/infrastructure/transport-archive.d.ts +3 -3
- package/dist/infrastructure/transport-archive.js +71 -48
- package/dist/infrastructure/transport-archive.js.map +1 -1
- package/dist/infrastructure/transport-archive.types.d.ts +3 -0
- package/dist/infrastructure/transport-archive.types.js.map +1 -1
- package/dist/infrastructure/transport-checkpoint.js +14 -4
- package/dist/infrastructure/transport-checkpoint.js.map +1 -1
- package/dist/infrastructure/transport-envelope.d.ts +1 -0
- package/dist/infrastructure/transport-envelope.js +22 -5
- package/dist/infrastructure/transport-envelope.js.map +1 -1
- package/dist/infrastructure/transport-reservations.constants.d.ts +2 -0
- package/dist/infrastructure/transport-reservations.constants.js +3 -0
- package/dist/infrastructure/transport-reservations.constants.js.map +1 -0
- package/dist/infrastructure/transport-reservations.d.ts +1 -2
- package/dist/infrastructure/transport-reservations.js +18 -22
- package/dist/infrastructure/transport-reservations.js.map +1 -1
- package/dist/infrastructure/transport-reservations.types.d.ts +23 -2
- package/dist/infrastructure/transport-reservations.types.js.map +1 -1
- package/dist/infrastructure/trigger-server.js +12 -9
- package/dist/infrastructure/trigger-server.js.map +1 -1
- package/dist/infrastructure/trigger-server.types.d.ts +1 -1
- package/dist/infrastructure/trigger-server.types.js.map +1 -1
- package/dist/infrastructure/workflow-checkpoint.constants.d.ts +1 -0
- package/dist/infrastructure/workflow-checkpoint.constants.js +1 -0
- package/dist/infrastructure/workflow-checkpoint.constants.js.map +1 -1
- package/dist/infrastructure/workspace-lock.constants.d.ts +2 -1
- package/dist/infrastructure/workspace-lock.constants.js +2 -1
- package/dist/infrastructure/workspace-lock.constants.js.map +1 -1
- package/dist/infrastructure/workspace-lock.js +48 -10
- package/dist/infrastructure/workspace-lock.js.map +1 -1
- package/dist/providers/cloud-cache.js +14 -9
- package/dist/providers/cloud-cache.js.map +1 -1
- package/dist/providers/cloud-cache.types.d.ts +1 -0
- package/dist/providers/cloud-cache.types.js.map +1 -1
- package/dist/providers/cloud-files.js +3 -4
- package/dist/providers/cloud-files.js.map +1 -1
- package/dist/providers/cloud-input.constants.d.ts +2 -2
- package/dist/providers/cloud-input.constants.js +2 -1
- package/dist/providers/cloud-input.constants.js.map +1 -1
- package/dist/providers/cloud-input.d.ts +2 -2
- package/dist/providers/cloud-input.js +14 -3
- package/dist/providers/cloud-input.js.map +1 -1
- package/dist/providers/container-command.js +30 -5
- package/dist/providers/container-command.js.map +1 -1
- package/dist/providers/container-egress.constants.d.ts +7 -0
- package/dist/providers/container-egress.constants.js +8 -0
- package/dist/providers/container-egress.constants.js.map +1 -0
- package/dist/providers/container-egress.d.ts +7 -0
- package/dist/providers/container-egress.js +101 -0
- package/dist/providers/container-egress.js.map +1 -0
- package/dist/providers/container-files.js +10 -11
- package/dist/providers/container-files.js.map +1 -1
- package/dist/providers/container-mounts.js +3 -0
- package/dist/providers/container-mounts.js.map +1 -1
- package/dist/providers/container-network.js +16 -1
- package/dist/providers/container-network.js.map +1 -1
- package/dist/providers/container-plan.js +7 -10
- package/dist/providers/container-plan.js.map +1 -1
- package/dist/providers/container-recovery.js +8 -3
- package/dist/providers/container-recovery.js.map +1 -1
- package/dist/providers/container.js +36 -5
- package/dist/providers/container.js.map +1 -1
- package/dist/providers/container.types.d.ts +1 -0
- package/dist/providers/container.types.js.map +1 -1
- package/dist/providers/daytona-command.constants.js +4 -1
- package/dist/providers/daytona-command.constants.js.map +1 -1
- package/dist/providers/daytona-command.js +39 -16
- package/dist/providers/daytona-command.js.map +1 -1
- package/dist/providers/daytona-files.js +5 -5
- package/dist/providers/daytona-files.js.map +1 -1
- package/dist/providers/daytona-output.js +11 -3
- package/dist/providers/daytona-output.js.map +1 -1
- package/dist/providers/daytona.js +11 -9
- package/dist/providers/daytona.js.map +1 -1
- package/dist/providers/egress/address.d.ts +3 -0
- package/dist/providers/egress/address.js +26 -0
- package/dist/providers/egress/address.js.map +1 -0
- package/dist/providers/egress/egress.constants.d.ts +22 -0
- package/dist/providers/egress/egress.constants.js +23 -0
- package/dist/providers/egress/egress.constants.js.map +1 -0
- package/dist/providers/egress/egress.types.d.ts +11 -0
- package/dist/providers/egress/egress.types.js +2 -0
- package/dist/providers/egress/egress.types.js.map +1 -0
- package/dist/providers/egress/firewall.d.ts +3 -0
- package/dist/providers/egress/firewall.js +29 -0
- package/dist/providers/egress/firewall.js.map +1 -0
- package/dist/providers/egress/main.d.ts +1 -0
- package/dist/providers/egress/main.js +90 -0
- package/dist/providers/egress/main.js.map +1 -0
- package/dist/providers/egress/policy.d.ts +5 -0
- package/dist/providers/egress/policy.js +54 -0
- package/dist/providers/egress/policy.js.map +1 -0
- package/dist/providers/egress/proxy.d.ts +2 -0
- package/dist/providers/egress/proxy.js +129 -0
- package/dist/providers/egress/proxy.js.map +1 -0
- package/dist/providers/egress/tls-hello.d.ts +1 -0
- package/dist/providers/egress/tls-hello.js +75 -0
- package/dist/providers/egress/tls-hello.js.map +1 -0
- package/dist/providers/firecracker-command.js +12 -6
- package/dist/providers/firecracker-command.js.map +1 -1
- package/dist/providers/local-files.d.ts +2 -0
- package/dist/providers/local-files.js +24 -0
- package/dist/providers/local-files.js.map +1 -0
- package/dist/providers/local.js +2 -20
- package/dist/providers/local.js.map +1 -1
- package/dist/providers/vercel-command.js +33 -9
- package/dist/providers/vercel-command.js.map +1 -1
- package/dist/providers/vercel.js +11 -9
- package/dist/providers/vercel.js.map +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +1 -1
- package/dist/testing.js.map +1 -1
- package/package.json +2 -2
- package/recipe-configuration.schema.json +2164 -35
- package/recipe.schema.json +2512 -404
|
@@ -71,6 +71,7 @@ function httpServer(name, server) {
|
|
|
71
71
|
}
|
|
72
72
|
if (value.oauth !== undefined) {
|
|
73
73
|
invariant(value.oauth === "login" || clientCredentials(name, value.oauth), `MCP server ${name} oauth must be "login" or client credentials`);
|
|
74
|
+
invariant(value.oauth === "login" || (url.protocol === "https:" && !url.hash), `MCP server ${name} OAuth client credentials require an HTTPS URL without a fragment`);
|
|
74
75
|
invariant(value.bearerTokenVariable === undefined &&
|
|
75
76
|
Object.keys(headers).every((key) => key.toLowerCase() !== "authorization"), `MCP server ${name} uses OAuth; remove bearerTokenVariable and the Authorization header`);
|
|
76
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/domain/mcp-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from \"./errors.ts\";\nimport {\n MCP_HEADER_PATTERN,\n MCP_CLIENT_CREDENTIAL_FIELDS,\n MCP_HTTP_FIELDS,\n MCP_MAX_TIMEOUT_MS,\n MCP_SCOPE_PATTERN,\n MCP_SERVER_NAME_PATTERN,\n MCP_STDIO_FIELDS,\n MCP_TOOL_FILTER_FIELDS,\n MCP_TOOL_NAME_PATTERN,\n MCP_URL_PROTOCOLS,\n MCP_VARIABLE_PATTERN,\n} from \"./mcp-server.constants.ts\";\nimport type {\n McpClientCredentials,\n McpHttpServer,\n McpServer,\n McpServers,\n McpStdioServer,\n McpToolFilter,\n} from \"./mcp-server.types.ts\";\n\nexport function mcpServers(value: unknown): McpServers {\n invariant(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"mcpServers must be an object keyed by server name\",\n );\n const servers = Object.entries(value).map(([name, server]) => {\n invariant(\n MCP_SERVER_NAME_PATTERN.test(name),\n `MCP server names use 1 to 32 letters, digits, underscores or hyphens: ${name}`,\n );\n invariant(\n server !== null && typeof server === \"object\" && !Array.isArray(server),\n `MCP server ${name} must be an object`,\n );\n invariant(\n \"command\" in server !== \"url\" in server,\n `MCP server ${name} requires either command or url`,\n );\n return [\n name,\n \"command\" in server\n ? stdioServer(name, server)\n : httpServer(name, server),\n ] as const;\n });\n return Object.freeze(Object.fromEntries(servers));\n}\n\nexport function mcpLoginServers(\n servers: McpServers | undefined,\n): readonly (readonly [name: string, server: McpHttpServer])[] {\n return Object.entries(servers ?? {}).flatMap(([name, server]) =>\n !isMcpStdioServer(server) && server.oauth === \"login\"\n ? [[name, server] as const]\n : [],\n );\n}\n\nexport function isMcpStdioServer(server: McpServer): server is McpStdioServer {\n return \"command\" in server;\n}\n\nexport function mcpServerVariables(servers: McpServers): readonly string[] {\n return [\n ...new Set(\n Object.values(servers).flatMap((server) =>\n isMcpStdioServer(server)\n ? (server.variables ?? [])\n : httpVariables(server),\n ),\n ),\n ];\n}\n\nfunction stdioServer(name: string, server: object): McpStdioServer {\n fields(name, server, MCP_STDIO_FIELDS);\n const value = server as McpStdioServer;\n invariant(\n typeof value.command === \"string\" && value.command.trim() !== \"\",\n `MCP server ${name} command must be nonempty text`,\n );\n literal(name, value.command);\n const argumentsList = value.arguments ?? [];\n invariant(\n Array.isArray(argumentsList) &&\n argumentsList.every((entry) => typeof entry === \"string\"),\n `MCP server ${name} arguments must be an array of strings`,\n );\n argumentsList.forEach((entry) => literal(name, entry));\n const environment = record(name, \"environment\", value.environment);\n for (const key of Object.keys(environment))\n invariant(\n MCP_VARIABLE_PATTERN.test(key),\n `MCP server ${name} has an invalid environment name: ${key}`,\n );\n const variables = variableNames(name, value.variables);\n invariant(\n variables.every((variable) => !(variable in environment)),\n `MCP server ${name} declares a variable and an environment value with the same name`,\n );\n return Object.freeze({\n command: value.command,\n ...(value.arguments\n ? { arguments: Object.freeze([...argumentsList]) }\n : {}),\n ...(value.environment ? { environment } : {}),\n ...(value.variables ? { variables: Object.freeze(variables) } : {}),\n ...common(name, value),\n });\n}\n\nfunction httpServer(name: string, server: object): McpHttpServer {\n fields(name, server, MCP_HTTP_FIELDS);\n const value = server as McpHttpServer;\n invariant(\n typeof value.url === \"string\" && URL.canParse(value.url),\n `MCP server ${name} url must be an absolute URL`,\n );\n literal(name, value.url);\n const url = new URL(value.url);\n invariant(\n MCP_URL_PROTOCOLS.has(url.protocol),\n `MCP server ${name} url must use http or https`,\n );\n invariant(\n url.username === \"\" && url.password === \"\",\n `MCP server ${name} url cannot embed credentials; use bearerTokenVariable`,\n );\n const headers = record(name, \"headers\", value.headers);\n for (const [key, header] of Object.entries(headers))\n invariant(\n MCP_HEADER_PATTERN.test(key) && !/[\\r\\n]/.test(header),\n `MCP server ${name} has an invalid header: ${key}`,\n );\n if (value.bearerTokenVariable !== undefined) {\n variableNames(name, [value.bearerTokenVariable]);\n invariant(\n Object.keys(headers).every(\n (key) => key.toLowerCase() !== \"authorization\",\n ),\n `MCP server ${name} sets both an Authorization header and bearerTokenVariable`,\n );\n }\n if (value.oauth !== undefined) {\n invariant(\n value.oauth === \"login\" || clientCredentials(name, value.oauth),\n `MCP server ${name} oauth must be \"login\" or client credentials`,\n );\n invariant(\n value.bearerTokenVariable === undefined &&\n Object.keys(headers).every(\n (key) => key.toLowerCase() !== \"authorization\",\n ),\n `MCP server ${name} uses OAuth; remove bearerTokenVariable and the Authorization header`,\n );\n }\n return Object.freeze({\n url: value.url,\n ...(value.headers ? { headers } : {}),\n ...(value.oauth === undefined\n ? {}\n : {\n oauth:\n value.oauth === \"login\"\n ? value.oauth\n : Object.freeze({\n ...value.oauth,\n ...(value.oauth.scopes\n ? { scopes: Object.freeze([...value.oauth.scopes]) }\n : {}),\n }),\n }),\n ...(value.bearerTokenVariable\n ? { bearerTokenVariable: value.bearerTokenVariable }\n : {}),\n ...common(name, value),\n });\n}\n\nexport function mcpToolFilter(\n filter: McpToolFilter | undefined,\n): (tool: string) => boolean {\n const { include, exclude = [] } = filter ?? {};\n return (tool) =>\n (include === undefined || include.includes(tool)) &&\n !exclude.includes(tool);\n}\n\nfunction common(\n name: string,\n value: McpServer,\n): Pick<McpServer, \"tools\" | \"startupTimeoutMs\"> {\n invariant(\n value.startupTimeoutMs === undefined ||\n (Number.isSafeInteger(value.startupTimeoutMs) &&\n value.startupTimeoutMs > 0 &&\n value.startupTimeoutMs <= MCP_MAX_TIMEOUT_MS),\n `MCP server ${name} startupTimeoutMs must be a positive integer of at most ${MCP_MAX_TIMEOUT_MS}`,\n );\n return {\n ...(value.tools === undefined\n ? {}\n : { tools: toolFilter(name, value.tools) }),\n ...(value.startupTimeoutMs === undefined\n ? {}\n : { startupTimeoutMs: value.startupTimeoutMs }),\n };\n}\n\nfunction toolFilter(name: string, value: unknown): McpToolFilter {\n invariant(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n `MCP server ${name} tools must be an object with include or exclude`,\n );\n fields(name, value, MCP_TOOL_FILTER_FIELDS);\n const filter = value as McpToolFilter;\n invariant(\n filter.include !== undefined || filter.exclude !== undefined,\n `MCP server ${name} tools requires include or exclude`,\n );\n return Object.freeze({\n ...(filter.include === undefined\n ? {}\n : { include: toolNames(name, \"include\", filter.include) }),\n ...(filter.exclude === undefined\n ? {}\n : { exclude: toolNames(name, \"exclude\", filter.exclude) }),\n });\n}\n\nfunction toolNames(\n name: string,\n label: string,\n value: unknown,\n): readonly string[] {\n invariant(\n Array.isArray(value) &&\n value.length > 0 &&\n value.every(\n (entry) =>\n typeof entry === \"string\" && MCP_TOOL_NAME_PATTERN.test(entry),\n ) &&\n new Set(value).size === value.length,\n `MCP server ${name} tools.${label} must list distinct tool names of letters, digits, _, . or -`,\n );\n return Object.freeze([...(value as string[])]);\n}\n\nfunction fields(name: string, server: object, allowed: ReadonlySet<string>) {\n const unsupported = Object.keys(server).filter((key) => !allowed.has(key));\n invariant(\n unsupported.length === 0,\n `Unsupported MCP server ${name} option: ${unsupported.join(\", \")}`,\n );\n}\n\nfunction record(\n name: string,\n label: string,\n value: unknown,\n): Readonly<Record<string, string>> {\n if (value === undefined) return Object.freeze({});\n invariant(\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.values(value).every((entry) => typeof entry === \"string\"),\n `MCP server ${name} ${label} must map names to strings`,\n );\n Object.values(value).forEach((entry: string) => literal(name, entry));\n return Object.freeze({ ...(value as Record<string, string>) });\n}\n\nfunction variableNames(name: string, value: unknown): string[] {\n if (value === undefined) return [];\n invariant(\n Array.isArray(value) &&\n value.every(\n (entry) =>\n typeof entry === \"string\" && MCP_VARIABLE_PATTERN.test(entry),\n ),\n `MCP server ${name} variables must be environment variable names`,\n );\n return [...new Set<string>(value)];\n}\n\n// Each CLI expands ${NAME} differently, so literal values stay verbatim everywhere.\nfunction literal(name: string, value: string): void {\n invariant(\n !value.includes(\"${\") && !value.includes(\"\\0\"),\n `MCP server ${name} literal values cannot contain \\${ or NUL; reference secrets with variables or bearerTokenVariable`,\n );\n}\n\nfunction clientCredentials(name: string, value: unknown): boolean {\n if (value === null || typeof value !== \"object\" || Array.isArray(value))\n return false;\n fields(name, value, MCP_CLIENT_CREDENTIAL_FIELDS);\n const credentials = value as McpClientCredentials;\n variableNames(name, [\n credentials.clientIdVariable,\n credentials.clientSecretVariable,\n ]);\n invariant(\n credentials.scopes === undefined ||\n (Array.isArray(credentials.scopes) &&\n credentials.scopes.length > 0 &&\n credentials.scopes.every(\n (scope) => typeof scope === \"string\" && MCP_SCOPE_PATTERN.test(scope),\n )),\n `MCP server ${name} oauth scopes must be nonempty OAuth scope tokens`,\n );\n return true;\n}\n\nexport function httpVariables(server: McpHttpServer): readonly string[] {\n return [\n ...(server.bearerTokenVariable ? [server.bearerTokenVariable] : []),\n ...(typeof server.oauth === \"object\"\n ? [server.oauth.clientIdVariable, server.oauth.clientSecretVariable]\n : []),\n ];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/domain/mcp-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from \"./errors.ts\";\nimport {\n MCP_HEADER_PATTERN,\n MCP_CLIENT_CREDENTIAL_FIELDS,\n MCP_HTTP_FIELDS,\n MCP_MAX_TIMEOUT_MS,\n MCP_SCOPE_PATTERN,\n MCP_SERVER_NAME_PATTERN,\n MCP_STDIO_FIELDS,\n MCP_TOOL_FILTER_FIELDS,\n MCP_TOOL_NAME_PATTERN,\n MCP_URL_PROTOCOLS,\n MCP_VARIABLE_PATTERN,\n} from \"./mcp-server.constants.ts\";\nimport type {\n McpClientCredentials,\n McpHttpServer,\n McpServer,\n McpServers,\n McpStdioServer,\n McpToolFilter,\n} from \"./mcp-server.types.ts\";\n\nexport function mcpServers(value: unknown): McpServers {\n invariant(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n \"mcpServers must be an object keyed by server name\",\n );\n const servers = Object.entries(value).map(([name, server]) => {\n invariant(\n MCP_SERVER_NAME_PATTERN.test(name),\n `MCP server names use 1 to 32 letters, digits, underscores or hyphens: ${name}`,\n );\n invariant(\n server !== null && typeof server === \"object\" && !Array.isArray(server),\n `MCP server ${name} must be an object`,\n );\n invariant(\n \"command\" in server !== \"url\" in server,\n `MCP server ${name} requires either command or url`,\n );\n return [\n name,\n \"command\" in server\n ? stdioServer(name, server)\n : httpServer(name, server),\n ] as const;\n });\n return Object.freeze(Object.fromEntries(servers));\n}\n\nexport function mcpLoginServers(\n servers: McpServers | undefined,\n): readonly (readonly [name: string, server: McpHttpServer])[] {\n return Object.entries(servers ?? {}).flatMap(([name, server]) =>\n !isMcpStdioServer(server) && server.oauth === \"login\"\n ? [[name, server] as const]\n : [],\n );\n}\n\nexport function isMcpStdioServer(server: McpServer): server is McpStdioServer {\n return \"command\" in server;\n}\n\nexport function mcpServerVariables(servers: McpServers): readonly string[] {\n return [\n ...new Set(\n Object.values(servers).flatMap((server) =>\n isMcpStdioServer(server)\n ? (server.variables ?? [])\n : httpVariables(server),\n ),\n ),\n ];\n}\n\nfunction stdioServer(name: string, server: object): McpStdioServer {\n fields(name, server, MCP_STDIO_FIELDS);\n const value = server as McpStdioServer;\n invariant(\n typeof value.command === \"string\" && value.command.trim() !== \"\",\n `MCP server ${name} command must be nonempty text`,\n );\n literal(name, value.command);\n const argumentsList = value.arguments ?? [];\n invariant(\n Array.isArray(argumentsList) &&\n argumentsList.every((entry) => typeof entry === \"string\"),\n `MCP server ${name} arguments must be an array of strings`,\n );\n argumentsList.forEach((entry) => literal(name, entry));\n const environment = record(name, \"environment\", value.environment);\n for (const key of Object.keys(environment))\n invariant(\n MCP_VARIABLE_PATTERN.test(key),\n `MCP server ${name} has an invalid environment name: ${key}`,\n );\n const variables = variableNames(name, value.variables);\n invariant(\n variables.every((variable) => !(variable in environment)),\n `MCP server ${name} declares a variable and an environment value with the same name`,\n );\n return Object.freeze({\n command: value.command,\n ...(value.arguments\n ? { arguments: Object.freeze([...argumentsList]) }\n : {}),\n ...(value.environment ? { environment } : {}),\n ...(value.variables ? { variables: Object.freeze(variables) } : {}),\n ...common(name, value),\n });\n}\n\nfunction httpServer(name: string, server: object): McpHttpServer {\n fields(name, server, MCP_HTTP_FIELDS);\n const value = server as McpHttpServer;\n invariant(\n typeof value.url === \"string\" && URL.canParse(value.url),\n `MCP server ${name} url must be an absolute URL`,\n );\n literal(name, value.url);\n const url = new URL(value.url);\n invariant(\n MCP_URL_PROTOCOLS.has(url.protocol),\n `MCP server ${name} url must use http or https`,\n );\n invariant(\n url.username === \"\" && url.password === \"\",\n `MCP server ${name} url cannot embed credentials; use bearerTokenVariable`,\n );\n const headers = record(name, \"headers\", value.headers);\n for (const [key, header] of Object.entries(headers))\n invariant(\n MCP_HEADER_PATTERN.test(key) && !/[\\r\\n]/.test(header),\n `MCP server ${name} has an invalid header: ${key}`,\n );\n if (value.bearerTokenVariable !== undefined) {\n variableNames(name, [value.bearerTokenVariable]);\n invariant(\n Object.keys(headers).every(\n (key) => key.toLowerCase() !== \"authorization\",\n ),\n `MCP server ${name} sets both an Authorization header and bearerTokenVariable`,\n );\n }\n if (value.oauth !== undefined) {\n invariant(\n value.oauth === \"login\" || clientCredentials(name, value.oauth),\n `MCP server ${name} oauth must be \"login\" or client credentials`,\n );\n invariant(\n value.oauth === \"login\" || (url.protocol === \"https:\" && !url.hash),\n `MCP server ${name} OAuth client credentials require an HTTPS URL without a fragment`,\n );\n invariant(\n value.bearerTokenVariable === undefined &&\n Object.keys(headers).every(\n (key) => key.toLowerCase() !== \"authorization\",\n ),\n `MCP server ${name} uses OAuth; remove bearerTokenVariable and the Authorization header`,\n );\n }\n return Object.freeze({\n url: value.url,\n ...(value.headers ? { headers } : {}),\n ...(value.oauth === undefined\n ? {}\n : {\n oauth:\n value.oauth === \"login\"\n ? value.oauth\n : Object.freeze({\n ...value.oauth,\n ...(value.oauth.scopes\n ? { scopes: Object.freeze([...value.oauth.scopes]) }\n : {}),\n }),\n }),\n ...(value.bearerTokenVariable\n ? { bearerTokenVariable: value.bearerTokenVariable }\n : {}),\n ...common(name, value),\n });\n}\n\nexport function mcpToolFilter(\n filter: McpToolFilter | undefined,\n): (tool: string) => boolean {\n const { include, exclude = [] } = filter ?? {};\n return (tool) =>\n (include === undefined || include.includes(tool)) &&\n !exclude.includes(tool);\n}\n\nfunction common(\n name: string,\n value: McpServer,\n): Pick<McpServer, \"tools\" | \"startupTimeoutMs\"> {\n invariant(\n value.startupTimeoutMs === undefined ||\n (Number.isSafeInteger(value.startupTimeoutMs) &&\n value.startupTimeoutMs > 0 &&\n value.startupTimeoutMs <= MCP_MAX_TIMEOUT_MS),\n `MCP server ${name} startupTimeoutMs must be a positive integer of at most ${MCP_MAX_TIMEOUT_MS}`,\n );\n return {\n ...(value.tools === undefined\n ? {}\n : { tools: toolFilter(name, value.tools) }),\n ...(value.startupTimeoutMs === undefined\n ? {}\n : { startupTimeoutMs: value.startupTimeoutMs }),\n };\n}\n\nfunction toolFilter(name: string, value: unknown): McpToolFilter {\n invariant(\n value !== null && typeof value === \"object\" && !Array.isArray(value),\n `MCP server ${name} tools must be an object with include or exclude`,\n );\n fields(name, value, MCP_TOOL_FILTER_FIELDS);\n const filter = value as McpToolFilter;\n invariant(\n filter.include !== undefined || filter.exclude !== undefined,\n `MCP server ${name} tools requires include or exclude`,\n );\n return Object.freeze({\n ...(filter.include === undefined\n ? {}\n : { include: toolNames(name, \"include\", filter.include) }),\n ...(filter.exclude === undefined\n ? {}\n : { exclude: toolNames(name, \"exclude\", filter.exclude) }),\n });\n}\n\nfunction toolNames(\n name: string,\n label: string,\n value: unknown,\n): readonly string[] {\n invariant(\n Array.isArray(value) &&\n value.length > 0 &&\n value.every(\n (entry) =>\n typeof entry === \"string\" && MCP_TOOL_NAME_PATTERN.test(entry),\n ) &&\n new Set(value).size === value.length,\n `MCP server ${name} tools.${label} must list distinct tool names of letters, digits, _, . or -`,\n );\n return Object.freeze([...(value as string[])]);\n}\n\nfunction fields(name: string, server: object, allowed: ReadonlySet<string>) {\n const unsupported = Object.keys(server).filter((key) => !allowed.has(key));\n invariant(\n unsupported.length === 0,\n `Unsupported MCP server ${name} option: ${unsupported.join(\", \")}`,\n );\n}\n\nfunction record(\n name: string,\n label: string,\n value: unknown,\n): Readonly<Record<string, string>> {\n if (value === undefined) return Object.freeze({});\n invariant(\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.values(value).every((entry) => typeof entry === \"string\"),\n `MCP server ${name} ${label} must map names to strings`,\n );\n Object.values(value).forEach((entry: string) => literal(name, entry));\n return Object.freeze({ ...(value as Record<string, string>) });\n}\n\nfunction variableNames(name: string, value: unknown): string[] {\n if (value === undefined) return [];\n invariant(\n Array.isArray(value) &&\n value.every(\n (entry) =>\n typeof entry === \"string\" && MCP_VARIABLE_PATTERN.test(entry),\n ),\n `MCP server ${name} variables must be environment variable names`,\n );\n return [...new Set<string>(value)];\n}\n\n// Each CLI expands ${NAME} differently, so literal values stay verbatim everywhere.\nfunction literal(name: string, value: string): void {\n invariant(\n !value.includes(\"${\") && !value.includes(\"\\0\"),\n `MCP server ${name} literal values cannot contain \\${ or NUL; reference secrets with variables or bearerTokenVariable`,\n );\n}\n\nfunction clientCredentials(name: string, value: unknown): boolean {\n if (value === null || typeof value !== \"object\" || Array.isArray(value))\n return false;\n fields(name, value, MCP_CLIENT_CREDENTIAL_FIELDS);\n const credentials = value as McpClientCredentials;\n variableNames(name, [\n credentials.clientIdVariable,\n credentials.clientSecretVariable,\n ]);\n invariant(\n credentials.scopes === undefined ||\n (Array.isArray(credentials.scopes) &&\n credentials.scopes.length > 0 &&\n credentials.scopes.every(\n (scope) => typeof scope === \"string\" && MCP_SCOPE_PATTERN.test(scope),\n )),\n `MCP server ${name} oauth scopes must be nonempty OAuth scope tokens`,\n );\n return true;\n}\n\nexport function httpVariables(server: McpHttpServer): readonly string[] {\n return [\n ...(server.bearerTokenVariable ? [server.bearerTokenVariable] : []),\n ...(typeof server.oauth === \"object\"\n ? [server.oauth.clientIdVariable, server.oauth.clientSecretVariable]\n : []),\n ];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.types.js","sourceRoot":"","sources":["../../src/domain/permissions.types.ts"],"names":[],"mappings":"","sourcesContent":["export type PermissionEffect = \"allow\" | \"deny\";\n\nexport interface HarnessPermissionRule {\n readonly effect: PermissionEffect;\n readonly tools?: readonly string[];\n readonly paths?: readonly string[];\n readonly commands?: readonly string[];\n readonly reason?: string;\n}\n\nexport interface HarnessPermissionsOptions {\n readonly rules: readonly HarnessPermissionRule[];\n readonly default?: PermissionEffect;\n}\n\nexport interface ToolResources {\n readonly paths?: readonly string[];\n readonly command?: string;\n}\n\nexport type PermissionDecision =\n | { readonly allowed: true }\n | { readonly allowed: false; readonly reason: string };\n\nexport interface HarnessPermissions {\n readonly kind: \"permissions\";\n readonly rules: readonly HarnessPermissionRule[];\n readonly default: PermissionEffect;\n evaluate(tool: string, resources: ToolResources): PermissionDecision;\n}\n\nexport interface CompiledRule {\n readonly rule: HarnessPermissionRule;\n readonly tools?: readonly RegExp[];\n readonly paths?: readonly RegExp[];\n readonly commands?: readonly RegExp[];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"permissions.types.js","sourceRoot":"","sources":["../../src/domain/permissions.types.ts"],"names":[],"mappings":"","sourcesContent":["export type PermissionEffect = \"allow\" | \"deny\";\n\nexport interface HarnessPermissionRule {\n readonly effect: PermissionEffect;\n readonly tools?: readonly string[];\n readonly paths?: readonly string[];\n readonly commands?: readonly string[];\n readonly reason?: string;\n}\n\nexport interface HarnessPermissionsOptions {\n readonly rules: readonly HarnessPermissionRule[];\n readonly default?: PermissionEffect;\n}\n\nexport interface ToolResources {\n readonly paths?: readonly string[];\n readonly command?: string;\n readonly mcpServer?: string;\n}\n\nexport type PermissionDecision =\n | { readonly allowed: true }\n | { readonly allowed: false; readonly reason: string };\n\nexport interface HarnessPermissions {\n readonly kind: \"permissions\";\n readonly rules: readonly HarnessPermissionRule[];\n readonly default: PermissionEffect;\n evaluate(tool: string, resources: ToolResources): PermissionDecision;\n}\n\nexport interface CompiledRule {\n readonly rule: HarnessPermissionRule;\n readonly tools?: readonly RegExp[];\n readonly paths?: readonly RegExp[];\n readonly commands?: readonly RegExp[];\n}\n"]}
|
package/dist/domain/pricing.js
CHANGED
|
@@ -38,8 +38,10 @@ export function calculateUsageCost(usage, prices) {
|
|
|
38
38
|
complete &&= tokens.complete !== false;
|
|
39
39
|
const created = tokens.cacheCreated ?? 0;
|
|
40
40
|
if (tokens.inputIncludesCache !== false &&
|
|
41
|
-
tokens.cached + created > tokens.input)
|
|
42
|
-
|
|
41
|
+
tokens.cached + created > tokens.input) {
|
|
42
|
+
complete = false;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
43
45
|
amount +=
|
|
44
46
|
((tokens.inputIncludesCache === false
|
|
45
47
|
? tokens.input
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/domain/pricing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,UAAU,cAAc,CAAC,MAAuB;IACpD,IACE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC5C,CAAC,MAAM,CAAC,MAAM;QACd,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QAEjC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YACtD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI;YACjB,KAAK,CAAC,KAAK;YACX,KAAK,CAAC,MAAM;YACZ,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK;YAC3B,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK;SAClC;YACC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;gBAChE,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACR,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAY,EACZ,MAAuB;IAEvB,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC;IACxC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;QAC5E,QAAQ,IAAI,KAAK,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;YAC/C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YACtB,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,KAAK,GAAG,CAAC;gBAAE,QAAQ,GAAG,KAAK,CAAC;YAChC,SAAS;QACX,CAAC;QACD,QAAQ,KAAK,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QACzC,IACE,MAAM,CAAC,kBAAkB,KAAK,KAAK;YACnC,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/domain/pricing.ts"],"names":[],"mappings":"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","sourcesContent":["import { pricingCurrencies } from \"./pricing.constants.ts\";\nimport type { Usage } from \"./agent.types.ts\";\nimport type { ModelPriceTable, UsageCost } from \"./pricing.types.ts\";\nimport { validateUsage } from \"./usage.ts\";\n\nexport function validatePrices(prices: ModelPriceTable): void {\n if (\n !pricingCurrencies.includes(prices.currency) ||\n !prices.models ||\n typeof prices.models !== \"object\"\n )\n throw new Error(\"Prices require EUR or USD and a model table\");\n for (const [model, price] of Object.entries(prices.models)) {\n if (!model.trim() || !price || typeof price !== \"object\")\n throw new Error(\"Invalid model price\");\n for (const rate of [\n price.input,\n price.output,\n price.cached ?? price.input,\n price.cacheCreated ?? price.input,\n ])\n if (typeof rate !== \"number\" || !Number.isFinite(rate) || rate < 0)\n throw new Error(\n \"Model prices must be finite nonnegative amounts per million tokens\",\n );\n }\n}\n\nexport function calculateUsageCost(\n usage: Usage,\n prices: ModelPriceTable,\n): UsageCost {\n validatePrices(prices);\n validateUsage(usage);\n let amount = 0;\n let complete = usage.complete !== false;\n let measured = 0;\n for (const [model, tokens] of Object.entries(usage.models ?? {})) {\n const count =\n tokens.input + tokens.output + tokens.cached + (tokens.cacheCreated ?? 0);\n measured += count;\n const price = Object.hasOwn(prices.models, model)\n ? prices.models[model]\n : undefined;\n if (!price) {\n if (count > 0) complete = false;\n continue;\n }\n complete &&= tokens.complete !== false;\n const created = tokens.cacheCreated ?? 0;\n if (\n tokens.inputIncludesCache !== false &&\n tokens.cached + created > tokens.input\n ) {\n complete = false;\n continue;\n }\n amount +=\n ((tokens.inputIncludesCache === false\n ? tokens.input\n : tokens.input - tokens.cached - created) *\n price.input +\n tokens.cached * (price.cached ?? price.input) +\n created * (price.cacheCreated ?? price.input) +\n tokens.output * price.output) /\n 1_000_000;\n }\n if (\n measured <\n usage.input + usage.output + usage.cached + (usage.cacheCreated ?? 0)\n )\n complete = false;\n if (!Number.isFinite(amount))\n throw new Error(\"Calculated cost exceeds the supported numeric range\");\n return Object.freeze({ currency: prices.currency, amount, complete });\n}\n"]}
|
package/dist/domain/redaction.js
CHANGED
|
@@ -8,14 +8,17 @@ export function redactValue(value, patterns) {
|
|
|
8
8
|
return new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, "") + "g");
|
|
9
9
|
});
|
|
10
10
|
const seen = new WeakMap();
|
|
11
|
+
function mask(value) {
|
|
12
|
+
return rules.reduce((result, pattern) => result.replace(pattern, () => redactionReplacement), value);
|
|
13
|
+
}
|
|
11
14
|
function text(value) {
|
|
12
|
-
const masked =
|
|
13
|
-
if (
|
|
15
|
+
const masked = mask(value);
|
|
16
|
+
if (!/^[\[{]/.test(value.trim()))
|
|
14
17
|
return masked;
|
|
15
18
|
try {
|
|
16
19
|
const parsed = JSON.parse(value);
|
|
17
20
|
const cleaned = JSON.stringify(visit(parsed));
|
|
18
|
-
return cleaned === JSON.stringify(parsed) ?
|
|
21
|
+
return cleaned === JSON.stringify(parsed) ? masked : mask(cleaned);
|
|
19
22
|
}
|
|
20
23
|
catch {
|
|
21
24
|
return masked;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/domain/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,UAAU,WAAW,CAAI,KAAQ,EAAE,QAA2B;IAClE,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACrC,IAAI,CAAC,CAAC,OAAO,YAAY,MAAM,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,OAAO,EAAmB,CAAC;IAC5C,SAAS,IAAI,CAAC,KAAa;QACzB,
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/domain/redaction.ts"],"names":[],"mappings":"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","sourcesContent":["import { redactionReplacement } from \"./redaction.constants.ts\";\n\nexport function redactValue<T>(value: T, patterns: readonly RegExp[]): T {\n if (!patterns.length) return structuredClone(value);\n const rules = patterns.map((pattern) => {\n if (!(pattern instanceof RegExp))\n throw new Error(\"Redaction patterns must be regular expressions\");\n return new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, \"\") + \"g\");\n });\n const seen = new WeakMap<object, unknown>();\n function mask(value: string): string {\n return rules.reduce(\n (result, pattern) => result.replace(pattern, () => redactionReplacement),\n value,\n );\n }\n function text(value: string): string {\n const masked = mask(value);\n if (!/^[\\[{]/.test(value.trim())) return masked;\n try {\n const parsed: unknown = JSON.parse(value);\n const cleaned = JSON.stringify(visit(parsed));\n return cleaned === JSON.stringify(parsed) ? masked : mask(cleaned);\n } catch {\n return masked;\n }\n }\n function visit(value: unknown): unknown {\n if (typeof value === \"string\") return text(value);\n if (!value || typeof value !== \"object\") return value;\n if (seen.has(value)) return seen.get(value);\n if (value instanceof Error) {\n const result = new Error(text(value.message));\n seen.set(value, result);\n result.name = text(value.name);\n if (value.stack) result.stack = text(value.stack);\n if (value.cause !== undefined) result.cause = visit(value.cause);\n return result;\n }\n if (value instanceof Date) return new Date(value);\n if (value instanceof RegExp) return new RegExp(value);\n if (value instanceof Map) {\n const result = new Map<unknown, unknown>();\n seen.set(value, result);\n for (const [key, item] of value) result.set(visit(key), visit(item));\n return result;\n }\n if (value instanceof Set) {\n const result = new Set<unknown>();\n seen.set(value, result);\n for (const item of value) result.add(visit(item));\n return result;\n }\n const result: unknown[] | Record<string, unknown> = Array.isArray(value)\n ? []\n : {};\n seen.set(value, result);\n for (const [key, item] of Object.entries(value))\n Object.defineProperty(result, text(key), {\n value: visit(item),\n enumerable: true,\n writable: true,\n configurable: true,\n });\n return result;\n }\n return visit(value) as T;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { OutpostError } from "./errors.js";
|
|
2
|
+
const diagnostics = new WeakMap();
|
|
3
|
+
export function secretFault(code, message) {
|
|
4
|
+
const error = new OutpostError(code, message);
|
|
5
|
+
diagnostics.set(error, () => new OutpostError(code, message));
|
|
6
|
+
return error;
|
|
7
|
+
}
|
|
8
|
+
export function safeSecretFault(error) {
|
|
9
|
+
return error instanceof Error ? diagnostics.get(error)?.() : undefined;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=secret-fault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-fault.js","sourceRoot":"","sources":["../../src/domain/secret-fault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,GAAG,IAAI,OAAO,EAA8B,CAAC;AAE9D,MAAM,UAAU,WAAW,CAAC,IAAe,EAAE,OAAe;IAC1D,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC","sourcesContent":["import { OutpostError } from \"./errors.ts\";\nimport type { FaultCode } from \"./errors.types.ts\";\n\nconst diagnostics = new WeakMap<object, () => OutpostError>();\n\nexport function secretFault(code: FaultCode, message: string): OutpostError {\n const error = new OutpostError(code, message);\n diagnostics.set(error, () => new OutpostError(code, message));\n return error;\n}\n\nexport function safeSecretFault(error: unknown): OutpostError | undefined {\n return error instanceof Error ? diagnostics.get(error)?.() : undefined;\n}\n"]}
|
package/dist/domain/secrets.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { secretFault } from "./secret-fault.js";
|
|
2
|
+
import { invariant } from "./errors.js";
|
|
2
3
|
import { SECRET_MAX_BYTES, SECRET_VARIABLE_NAME } from "./secrets.constants.js";
|
|
3
4
|
export function secretNames(names) {
|
|
4
5
|
invariant(Array.isArray(names), "Secret names must be an array");
|
|
@@ -12,7 +13,7 @@ export function secretValue(value) {
|
|
|
12
13
|
!value.length ||
|
|
13
14
|
value.includes("\0") ||
|
|
14
15
|
new TextEncoder().encode(value).byteLength > SECRET_MAX_BYTES)
|
|
15
|
-
throw
|
|
16
|
+
throw secretFault("provider", "Secret value must be nonempty text without NUL, at most 1 MiB");
|
|
16
17
|
return value;
|
|
17
18
|
}
|
|
18
19
|
//# sourceMappingURL=secrets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/domain/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/domain/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,MAAM,UAAU,WAAW,CAAC,KAAwB;IAClD,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,+BAA+B,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC5B,SAAS,CACP,QAAQ,CAAC,KAAK,CACZ,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CACtE,EACD,uDAAuD,CACxD,CAAC;IACF,SAAS,CACP,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,EAC1C,6BAA6B,CAC9B,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,KAAK,CAAC,MAAM;QACb,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,gBAAgB;QAE7D,MAAM,WAAW,CACf,UAAU,EACV,+DAA+D,CAChE,CAAC;IACJ,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { secretFault } from \"./secret-fault.ts\";\nimport { invariant } from \"./errors.ts\";\nimport { SECRET_MAX_BYTES, SECRET_VARIABLE_NAME } from \"./secrets.constants.ts\";\n\nexport function secretNames(names: readonly string[]): readonly string[] {\n invariant(Array.isArray(names), \"Secret names must be an array\");\n const selected = [...names];\n invariant(\n selected.every(\n (name) => typeof name === \"string\" && SECRET_VARIABLE_NAME.test(name),\n ),\n \"Secret names must be environment variable identifiers\",\n );\n invariant(\n new Set(selected).size === selected.length,\n \"Secret names must be unique\",\n );\n return Object.freeze(selected);\n}\n\nexport function secretValue(value: unknown): string {\n if (\n typeof value !== \"string\" ||\n !value.length ||\n value.includes(\"\\0\") ||\n new TextEncoder().encode(value).byteLength > SECRET_MAX_BYTES\n )\n throw secretFault(\n \"provider\",\n \"Secret value must be nonempty text without NUL, at most 1 MiB\",\n );\n return value;\n}\n"]}
|
package/dist/domain/steering.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"steering.js","sourceRoot":"","sources":["../../src/domain/steering.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"steering.js","sourceRoot":"","sources":["../../src/domain/steering.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant, OutpostError } from \"./errors.ts\";\nimport type {\n PendingSteeringMessage,\n Steering,\n SteeringChannel,\n SteeringDelivery,\n SteeringFilter,\n SteeringInbox,\n SteeringSendOptions,\n SteeringState,\n} from \"./steering.types.ts\";\n\nexport type {\n Steering,\n SteeringDelivery,\n SteeringMode,\n SteeringSendOptions,\n SteeringState,\n} from \"./steering.types.ts\";\n\n/** Messages any loop may take: untargeted or for the main loop. */\nexport const mainLoopSteering: SteeringFilter = (message) =>\n message.subagent === undefined || message.subagent === null;\n\n/** Messages targeting a built-in subagent run. */\nexport const subagentSteering: SteeringFilter = (message) =>\n typeof message.subagent === \"string\";\n\nconst channels = new WeakMap<Steering, SteeringChannel>();\n\n/** Creates a controller that sends instructions to a running dispatch. */\nexport function createSteering(): Steering {\n let state: SteeringState = \"idle\";\n let pending: PendingSteeringMessage[] = [];\n const listeners = new Set<() => void>();\n const all: SteeringFilter = () => true;\n const take = (accept: SteeringFilter) => {\n const taken = pending.filter(accept);\n pending = pending.filter((entry) => !accept(entry));\n return taken;\n };\n const rejectPending = (message: string, accept = all) => {\n for (const entry of take(accept))\n entry.reject(\n new OutpostError(\"steering\", message, {\n text: entry.text,\n ...(entry.subagent === undefined ? {} : { subagent: entry.subagent }),\n }),\n );\n };\n const inbox: SteeringInbox = {\n count: (accept = all) => pending.filter(accept).length,\n take: (accept = all) => take(accept),\n reject: (accept, reason) => rejectPending(reason, accept),\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n const steering: Steering = Object.freeze({\n get state() {\n return state;\n },\n send(\n text: string,\n options: SteeringSendOptions = {},\n ): Promise<SteeringDelivery> {\n if (typeof text !== \"string\" || !text.trim())\n return Promise.reject(\n new OutpostError(\n \"configuration\",\n \"Steering text must be a nonempty string\",\n ),\n );\n const subagent = options.subagent;\n if (\n subagent !== undefined &&\n subagent !== null &&\n (typeof subagent !== \"string\" || !subagent)\n )\n return Promise.reject(\n new OutpostError(\n \"configuration\",\n \"Steering subagent must be a subagent run id or null\",\n ),\n );\n if (state === \"closed\")\n return Promise.reject(\n new OutpostError(\"steering\", \"Steering is closed\", { text }),\n );\n return new Promise<SteeringDelivery>((resolve, reject) => {\n pending.push({\n text,\n ...(subagent === undefined ? {} : { subagent }),\n deliver: (delivery) => resolve(Object.freeze({ ...delivery })),\n reject,\n });\n for (const listener of [...listeners]) listener();\n });\n },\n close() {\n state = \"closed\";\n rejectPending(\"Steering was closed before the message was delivered\");\n for (const listener of [...listeners]) listener();\n },\n });\n channels.set(steering, {\n inbox,\n open() {\n invariant(state !== \"closed\", \"Steering is closed\");\n invariant(\n state === \"idle\",\n \"Steering is already attached to a running dispatch\",\n );\n state = \"active\";\n return () => {\n if (state !== \"active\") return;\n state = \"idle\";\n rejectPending(\"The dispatch ended before the message was delivered\");\n };\n },\n });\n return steering;\n}\n\nexport function steeringChannel(steering: Steering): SteeringChannel {\n const channel = channels.get(steering);\n invariant(channel, \"steering must be created by createSteering()\");\n return channel;\n}\n\nexport function steeringInbox(\n steering: Steering | undefined,\n): SteeringInbox | undefined {\n return steering ? steeringChannel(steering).inbox : undefined;\n}\n"]}
|
|
@@ -31,7 +31,7 @@ export interface PendingSteeringMessage extends SteeringMessage {
|
|
|
31
31
|
}
|
|
32
32
|
export interface SteeringInbox {
|
|
33
33
|
count(accept?: SteeringFilter): number;
|
|
34
|
-
take(accept?: SteeringFilter): readonly
|
|
34
|
+
take(accept?: SteeringFilter): readonly PendingSteeringMessage[];
|
|
35
35
|
/** Rejects matching messages with a steering error describing why. */
|
|
36
36
|
reject(accept: SteeringFilter, reason: string): void;
|
|
37
37
|
subscribe(listener: () => void): () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"steering.types.js","sourceRoot":"","sources":["../../src/domain/steering.types.ts"],"names":[],"mappings":"","sourcesContent":["/** How a steering message reached the agent. */\nexport type SteeringMode = \"injected\" | \"resumed\";\n\n/** Lifecycle of a steering controller. */\nexport type SteeringState = \"idle\" | \"active\" | \"closed\";\n\nexport interface SteeringDelivery {\n /** `injected` joined the running turn; `resumed` continued the conversation in a new turn. */\n readonly mode: SteeringMode;\n}\n\nexport interface SteeringSendOptions {\n /** Built-in subagent run id from its `subagent` event; `null` targets only the main loop. */\n readonly subagent?: string | null;\n}\n\n/** Sends instructions to the agent of the dispatch it is attached to. */\nexport interface Steering {\n /** `active` while a dispatch uses the controller, `closed` after close(). */\n readonly state: SteeringState;\n /** Resolves when the agent receives the text; rejects when no dispatch can deliver it. */\n send(text: string, options?: SteeringSendOptions): Promise<SteeringDelivery>;\n /** Rejects undelivered messages and every later send. */\n close(): void;\n}\n\nexport interface SteeringMessage {\n readonly text: string;\n /** Undefined for any loop, null for the main loop, or a subagent run id. */\n readonly subagent?: string | null;\n deliver(delivery: SteeringDelivery): void;\n}\n\nexport type SteeringFilter = (message: SteeringMessage) => boolean;\n\nexport interface PendingSteeringMessage extends SteeringMessage {\n reject(error: Error): void;\n}\n\nexport interface SteeringInbox {\n count(accept?: SteeringFilter): number;\n take(accept?: SteeringFilter): readonly
|
|
1
|
+
{"version":3,"file":"steering.types.js","sourceRoot":"","sources":["../../src/domain/steering.types.ts"],"names":[],"mappings":"","sourcesContent":["/** How a steering message reached the agent. */\nexport type SteeringMode = \"injected\" | \"resumed\";\n\n/** Lifecycle of a steering controller. */\nexport type SteeringState = \"idle\" | \"active\" | \"closed\";\n\nexport interface SteeringDelivery {\n /** `injected` joined the running turn; `resumed` continued the conversation in a new turn. */\n readonly mode: SteeringMode;\n}\n\nexport interface SteeringSendOptions {\n /** Built-in subagent run id from its `subagent` event; `null` targets only the main loop. */\n readonly subagent?: string | null;\n}\n\n/** Sends instructions to the agent of the dispatch it is attached to. */\nexport interface Steering {\n /** `active` while a dispatch uses the controller, `closed` after close(). */\n readonly state: SteeringState;\n /** Resolves when the agent receives the text; rejects when no dispatch can deliver it. */\n send(text: string, options?: SteeringSendOptions): Promise<SteeringDelivery>;\n /** Rejects undelivered messages and every later send. */\n close(): void;\n}\n\nexport interface SteeringMessage {\n readonly text: string;\n /** Undefined for any loop, null for the main loop, or a subagent run id. */\n readonly subagent?: string | null;\n deliver(delivery: SteeringDelivery): void;\n}\n\nexport type SteeringFilter = (message: SteeringMessage) => boolean;\n\nexport interface PendingSteeringMessage extends SteeringMessage {\n reject(error: Error): void;\n}\n\nexport interface SteeringInbox {\n count(accept?: SteeringFilter): number;\n take(accept?: SteeringFilter): readonly PendingSteeringMessage[];\n /** Rejects matching messages with a steering error describing why. */\n reject(accept: SteeringFilter, reason: string): void;\n subscribe(listener: () => void): () => void;\n}\n\nexport interface SteeringChannel {\n readonly inbox: SteeringInbox;\n open(): () => void;\n}\n"]}
|
package/dist/domain/transport.js
CHANGED
|
@@ -10,7 +10,11 @@ export class TransportConflict extends Error {
|
|
|
10
10
|
export function transportKey(key) {
|
|
11
11
|
if (!key ||
|
|
12
12
|
key.length > transportKeyMaxLength ||
|
|
13
|
-
key
|
|
13
|
+
key
|
|
14
|
+
.split("/")
|
|
15
|
+
.some((part) => !transportSegmentPattern.test(part) ||
|
|
16
|
+
part.endsWith(".") ||
|
|
17
|
+
/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(part)))
|
|
14
18
|
throw new Error("Invalid transport key");
|
|
15
19
|
return key;
|
|
16
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/domain/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,GAAG,CAAS;IACrB,YAAY,GAAW;QACrB,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IACE,CAAC,GAAG;QACJ,GAAG,CAAC,MAAM,GAAG,qBAAqB;QAClC,GAAG,
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/domain/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,GAAG,CAAS;IACrB,YAAY,GAAW;QACrB,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IACE,CAAC,GAAG;QACJ,GAAG,CAAC,MAAM,GAAG,qBAAqB;QAClC,GAAG;aACA,KAAK,CAAC,GAAG,CAAC;aACV,IAAI,CACH,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAClB,iDAAiD,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/D;QAEH,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAc;IAEd,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;AACN,CAAC","sourcesContent":["import {\n transportKeyMaxLength,\n transportSegmentPattern,\n} from \"./transport.constants.ts\";\n\nexport class TransportConflict extends Error {\n readonly key: string;\n constructor(key: string) {\n super(`Transport revision conflict: ${key}`);\n this.name = \"TransportConflict\";\n this.key = key;\n }\n}\n\nexport function transportKey(key: string): string {\n if (\n !key ||\n key.length > transportKeyMaxLength ||\n key\n .split(\"/\")\n .some(\n (part) =>\n !transportSegmentPattern.test(part) ||\n part.endsWith(\".\") ||\n /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\.|$)/i.test(part),\n )\n )\n throw new Error(\"Invalid transport key\");\n return key;\n}\n\nexport function transportCondition(\n value: unknown,\n): asserts value is string | null {\n if (value !== null && (typeof value !== \"string\" || !value.trim()))\n throw new Error(\n \"A transport mutation requires an explicit revision condition\",\n );\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class TriggerPayloadError extends Error {
|
|
2
|
+
constructor() {
|
|
3
|
+
super("Verified webhook payload is invalid");
|
|
4
|
+
this.name = "TriggerPayloadError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export function decodeTriggerPayload(decode) {
|
|
8
|
+
try {
|
|
9
|
+
return decode();
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
throw new TriggerPayloadError();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=trigger-payload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-payload.js","sourceRoot":"","sources":["../../src/domain/trigger-payload.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C;QACE,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAI,MAAe;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,mBAAmB,EAAE,CAAC;IAClC,CAAC;AACH,CAAC","sourcesContent":["export class TriggerPayloadError extends Error {\n constructor() {\n super(\"Verified webhook payload is invalid\");\n this.name = \"TriggerPayloadError\";\n }\n}\n\nexport function decodeTriggerPayload<T>(decode: () => T): T {\n try {\n return decode();\n } catch {\n throw new TriggerPayloadError();\n }\n}\n"]}
|
|
@@ -19,6 +19,9 @@ export async function openCheckpoint(name, tasks, options) {
|
|
|
19
19
|
delayMs: item.retry?.delayMs,
|
|
20
20
|
backoff: item.retry?.backoff,
|
|
21
21
|
maxDelayMs: item.retry?.maxDelayMs,
|
|
22
|
+
...(item.retry?.maxRetryAfterMs === undefined
|
|
23
|
+
? {}
|
|
24
|
+
: { maxRetryAfterMs: item.retry.maxRetryAfterMs }),
|
|
22
25
|
jitter: item.retry?.jitter,
|
|
23
26
|
condition: !!item.condition,
|
|
24
27
|
accepts: !!item.retry?.accepts,
|
|
@@ -28,7 +31,7 @@ export async function openCheckpoint(name, tasks, options) {
|
|
|
28
31
|
return 0;
|
|
29
32
|
return a.key < b.key ? -1 : 1;
|
|
30
33
|
});
|
|
31
|
-
const
|
|
34
|
+
const identify = () => createHash("sha256")
|
|
32
35
|
.update(JSON.stringify({
|
|
33
36
|
name,
|
|
34
37
|
version: options.version,
|
|
@@ -36,12 +39,26 @@ export async function openCheckpoint(name, tasks, options) {
|
|
|
36
39
|
...(options.workspaces ? { workspaceFormat: 1 } : {}),
|
|
37
40
|
}))
|
|
38
41
|
.digest("hex");
|
|
42
|
+
const legacyIdentity = identify();
|
|
43
|
+
for (const item of graph) {
|
|
44
|
+
if (item.interaction)
|
|
45
|
+
item.interaction = {
|
|
46
|
+
actors: item.interaction.actors,
|
|
47
|
+
identity: item.interaction.identity,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const identity = identify();
|
|
39
51
|
const lease = await options.store.acquire(options.runId);
|
|
40
52
|
try {
|
|
41
53
|
const saved = await lease.read();
|
|
42
54
|
let initial;
|
|
43
55
|
if (saved !== undefined) {
|
|
44
|
-
validateCheckpoint(saved,
|
|
56
|
+
validateCheckpoint(saved, saved !== null &&
|
|
57
|
+
typeof saved === "object" &&
|
|
58
|
+
"identity" in saved &&
|
|
59
|
+
saved.identity === legacyIdentity
|
|
60
|
+
? legacyIdentity
|
|
61
|
+
: identity, tasks);
|
|
45
62
|
initial = saved;
|
|
46
63
|
if (options.workspaces && !saved.workspaces)
|
|
47
64
|
throw new Error("Workflow store did not preserve workspace checkpoint metadata");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../../src/domain/workflow/checkpoint.ts"],"names":[],"mappings":"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","sourcesContent":["import { loopDefinition } from \"./loop-task.ts\";\nimport { createHash } from \"node:crypto\";\nimport type { Task, WorkflowExecutionState } from \"../workflow.types.ts\";\nimport type {\n WorkflowCheckpoint,\n WorkflowCheckpointOptions,\n WorkflowCheckpointSession,\n} from \"./checkpoint.types.ts\";\nimport { checkpointValue } from \"./checkpoint-value.ts\";\nimport { validateCheckpoint } from \"./checkpoint-validation.ts\";\n\nexport async function openCheckpoint(\n name: string,\n tasks: readonly Task[],\n options: WorkflowCheckpointOptions,\n): Promise<WorkflowCheckpointSession> {\n if (!options.runId.trim() || !options.version.trim())\n throw new Error(\"Checkpoint runId and version must not be empty\");\n const graph = tasks\n .map((item) => ({\n key: item.key,\n ...(item.interaction ? { interaction: item.interaction } : {}),\n ...(loopDefinition(item)\n ? { maxRounds: loopDefinition(item)!.maxRounds }\n : {}),\n ...(item.gate ? { gate: item.gate } : {}),\n after: item.after.map((dependency) => dependency.key).sort(),\n timeoutMs: item.timeoutMs,\n retry: item.retry?.attempts,\n delayMs: item.retry?.delayMs,\n backoff: item.retry?.backoff,\n maxDelayMs: item.retry?.maxDelayMs,\n jitter: item.retry?.jitter,\n condition: !!item.condition,\n accepts: !!item.retry?.accepts,\n }))\n .sort((a, b) => {\n if (a.key === b.key) return 0;\n return a.key < b.key ? -1 : 1;\n });\n const identity = createHash(\"sha256\")\n .update(\n JSON.stringify({\n name,\n version: options.version,\n graph,\n ...(options.workspaces ? { workspaceFormat: 1 } : {}),\n }),\n )\n .digest(\"hex\");\n const lease = await options.store.acquire(options.runId);\n try {\n const saved = await lease.read();\n let initial: WorkflowCheckpoint | undefined;\n if (saved !== undefined) {\n validateCheckpoint(saved, identity, tasks);\n initial = saved;\n if (options.workspaces && !saved.workspaces)\n throw new Error(\n \"Workflow store did not preserve workspace checkpoint metadata\",\n );\n if (saved.workspaces) {\n if (\n !options.workspaces ||\n saved.workspaces.format !== 1 ||\n !saved.workspaces.resources ||\n typeof saved.workspaces.resources !== \"object\"\n )\n throw new Error(\"Unsupported workflow workspace checkpoint metadata\");\n checkpointValue(saved.workspaces.resources);\n }\n const settledGate = saved.records.some((record) =>\n [\"paused\", \"rejected\", \"waiting-input\"].includes(record.status),\n );\n if (\n saved.records.some(\n (record) =>\n ![\n \"done\",\n \"skipped\",\n \"paused\",\n \"rejected\",\n \"waiting-input\",\n ].includes(record.status) &&\n !(\n settledGate &&\n record.status === \"waiting\" &&\n record.attempts === 0\n ),\n ) &&\n options.resume !== \"retry-incomplete\"\n )\n throw new Error(\n \"Incomplete workflow checkpoint: resume retry-incomplete must explicitly authorize replay\",\n );\n }\n let writes = Promise.resolve();\n const workspaceResources = options.workspaces\n ? new Map(Object.entries(initial?.workspaces?.resources ?? {}))\n : undefined;\n return {\n initial,\n ...(workspaceResources ? { workspaceResources } : {}),\n save(state: WorkflowExecutionState) {\n const snapshot: WorkflowCheckpoint = {\n format: 1,\n identity,\n executionId: state.executionId,\n records: [...state.records.values()].map((record) => ({ ...record })),\n values: Object.fromEntries(\n [...state.values].map(([item, value]) => [\n item.key,\n checkpointValue(value),\n ]),\n ),\n usage: state.accounting.snapshot(),\n ...(workspaceResources\n ? {\n workspaces: {\n format: 1 as const,\n resources: Object.fromEntries(workspaceResources),\n },\n }\n : {}),\n };\n writes = writes.then(() => lease.write(snapshot));\n return writes;\n },\n async release() {\n await writes.catch(() => {});\n await lease.release();\n },\n };\n } catch (error) {\n await lease.release();\n throw error;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../../src/domain/workflow/checkpoint.ts"],"names":[],"mappings":"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","sourcesContent":["import { loopDefinition } from \"./loop-task.ts\";\nimport { createHash } from \"node:crypto\";\nimport type { Task, WorkflowExecutionState } from \"../workflow.types.ts\";\nimport type {\n WorkflowCheckpoint,\n WorkflowCheckpointOptions,\n WorkflowCheckpointSession,\n} from \"./checkpoint.types.ts\";\nimport { checkpointValue } from \"./checkpoint-value.ts\";\nimport { validateCheckpoint } from \"./checkpoint-validation.ts\";\n\nexport async function openCheckpoint(\n name: string,\n tasks: readonly Task[],\n options: WorkflowCheckpointOptions,\n): Promise<WorkflowCheckpointSession> {\n if (!options.runId.trim() || !options.version.trim())\n throw new Error(\"Checkpoint runId and version must not be empty\");\n const graph = tasks\n .map((item) => ({\n key: item.key,\n ...(item.interaction ? { interaction: item.interaction } : {}),\n ...(loopDefinition(item)\n ? { maxRounds: loopDefinition(item)!.maxRounds }\n : {}),\n ...(item.gate ? { gate: item.gate } : {}),\n after: item.after.map((dependency) => dependency.key).sort(),\n timeoutMs: item.timeoutMs,\n retry: item.retry?.attempts,\n delayMs: item.retry?.delayMs,\n backoff: item.retry?.backoff,\n maxDelayMs: item.retry?.maxDelayMs,\n ...(item.retry?.maxRetryAfterMs === undefined\n ? {}\n : { maxRetryAfterMs: item.retry.maxRetryAfterMs }),\n jitter: item.retry?.jitter,\n condition: !!item.condition,\n accepts: !!item.retry?.accepts,\n }))\n .sort((a, b) => {\n if (a.key === b.key) return 0;\n return a.key < b.key ? -1 : 1;\n });\n const identify = () =>\n createHash(\"sha256\")\n .update(\n JSON.stringify({\n name,\n version: options.version,\n graph,\n ...(options.workspaces ? { workspaceFormat: 1 } : {}),\n }),\n )\n .digest(\"hex\");\n const legacyIdentity = identify();\n for (const item of graph) {\n if (item.interaction)\n item.interaction = {\n actors: item.interaction.actors,\n identity: item.interaction.identity,\n };\n }\n const identity = identify();\n const lease = await options.store.acquire(options.runId);\n try {\n const saved = await lease.read();\n let initial: WorkflowCheckpoint | undefined;\n if (saved !== undefined) {\n validateCheckpoint(\n saved,\n saved !== null &&\n typeof saved === \"object\" &&\n \"identity\" in saved &&\n saved.identity === legacyIdentity\n ? legacyIdentity\n : identity,\n tasks,\n );\n initial = saved;\n if (options.workspaces && !saved.workspaces)\n throw new Error(\n \"Workflow store did not preserve workspace checkpoint metadata\",\n );\n if (saved.workspaces) {\n if (\n !options.workspaces ||\n saved.workspaces.format !== 1 ||\n !saved.workspaces.resources ||\n typeof saved.workspaces.resources !== \"object\"\n )\n throw new Error(\"Unsupported workflow workspace checkpoint metadata\");\n checkpointValue(saved.workspaces.resources);\n }\n const settledGate = saved.records.some((record) =>\n [\"paused\", \"rejected\", \"waiting-input\"].includes(record.status),\n );\n if (\n saved.records.some(\n (record) =>\n ![\n \"done\",\n \"skipped\",\n \"paused\",\n \"rejected\",\n \"waiting-input\",\n ].includes(record.status) &&\n !(\n settledGate &&\n record.status === \"waiting\" &&\n record.attempts === 0\n ),\n ) &&\n options.resume !== \"retry-incomplete\"\n )\n throw new Error(\n \"Incomplete workflow checkpoint: resume retry-incomplete must explicitly authorize replay\",\n );\n }\n let writes = Promise.resolve();\n const workspaceResources = options.workspaces\n ? new Map(Object.entries(initial?.workspaces?.resources ?? {}))\n : undefined;\n return {\n initial,\n ...(workspaceResources ? { workspaceResources } : {}),\n save(state: WorkflowExecutionState) {\n const snapshot: WorkflowCheckpoint = {\n format: 1,\n identity,\n executionId: state.executionId,\n records: [...state.records.values()].map((record) => ({ ...record })),\n values: Object.fromEntries(\n [...state.values].map(([item, value]) => [\n item.key,\n checkpointValue(value),\n ]),\n ),\n usage: state.accounting.snapshot(),\n ...(workspaceResources\n ? {\n workspaces: {\n format: 1 as const,\n resources: Object.fromEntries(workspaceResources),\n },\n }\n : {}),\n };\n writes = writes.then(() => lease.write(snapshot));\n return writes;\n },\n async release() {\n await writes.catch(() => {});\n await lease.release();\n },\n };\n } catch (error) {\n await lease.release();\n throw error;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.constants.js","sourceRoot":"","sources":["../../../src/domain/workflow/retry.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC","sourcesContent":["export const maxTimerMs = 2 ** 31 - 1;\nexport const defaultMaxRetryDelayMs = 30_000;\n"]}
|
|
1
|
+
{"version":3,"file":"retry.constants.js","sourceRoot":"","sources":["../../../src/domain/workflow/retry.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC","sourcesContent":["export const maxTimerMs = 2 ** 31 - 1;\nexport const defaultMaxRetryDelayMs = 30_000;\n\nexport const defaultMaxRetryAfterMs = 24 * 60 * 60 * 1000;\n"]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import timers from "node:timers/promises";
|
|
2
2
|
import { OutpostError } from "../errors.js";
|
|
3
|
-
import { defaultMaxRetryDelayMs, maxTimerMs } from "./retry.constants.js";
|
|
3
|
+
import { defaultMaxRetryDelayMs, defaultMaxRetryAfterMs, maxTimerMs, } from "./retry.constants.js";
|
|
4
4
|
import { positive } from "./validation.js";
|
|
5
5
|
export function validateRetry(retry) {
|
|
6
6
|
positive(retry.attempts, "retry.attempts");
|
|
7
7
|
for (const [name, value] of [
|
|
8
8
|
["delayMs", retry.delayMs],
|
|
9
9
|
["maxDelayMs", retry.maxDelayMs],
|
|
10
|
+
["maxRetryAfterMs", retry.maxRetryAfterMs],
|
|
10
11
|
]) {
|
|
11
12
|
if (value !== undefined &&
|
|
12
13
|
(!Number.isFinite(value) || value < 0 || value > Number.MAX_SAFE_INTEGER))
|
|
@@ -33,8 +34,11 @@ export function retryDelay(retry, cycle, error, random = Math.random) {
|
|
|
33
34
|
if (typeof server === "number" &&
|
|
34
35
|
Number.isFinite(server) &&
|
|
35
36
|
server >= 0 &&
|
|
36
|
-
server <= Number.MAX_SAFE_INTEGER)
|
|
37
|
+
server <= Number.MAX_SAFE_INTEGER) {
|
|
38
|
+
if (server > (retry?.maxRetryAfterMs ?? defaultMaxRetryAfterMs))
|
|
39
|
+
throw error;
|
|
37
40
|
duration = Math.max(duration, server);
|
|
41
|
+
}
|
|
38
42
|
return Math.ceil(duration);
|
|
39
43
|
}
|
|
40
44
|
export async function waitForRetry(duration, signal) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/domain/workflow/retry.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/domain/workflow/retry.ts"],"names":[],"mappings":"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","sourcesContent":["import timers from \"node:timers/promises\";\nimport { OutpostError } from \"../errors.ts\";\nimport type { Retry } from \"../workflow.types.ts\";\nimport {\n defaultMaxRetryDelayMs,\n defaultMaxRetryAfterMs,\n maxTimerMs,\n} from \"./retry.constants.ts\";\nimport { positive } from \"./validation.ts\";\n\nexport function validateRetry(retry: Retry): void {\n positive(retry.attempts, \"retry.attempts\");\n for (const [name, value] of [\n [\"delayMs\", retry.delayMs],\n [\"maxDelayMs\", retry.maxDelayMs],\n [\"maxRetryAfterMs\", retry.maxRetryAfterMs],\n ] as const) {\n if (\n value !== undefined &&\n (!Number.isFinite(value) || value < 0 || value > Number.MAX_SAFE_INTEGER)\n )\n throw new Error(`retry.${name} must be nonnegative and safely bounded`);\n }\n if (\n retry.backoff !== undefined &&\n ![\"fixed\", \"exponential\"].includes(retry.backoff)\n )\n throw new Error(\"retry.backoff must be fixed or exponential\");\n if (retry.jitter !== undefined && ![\"none\", \"full\"].includes(retry.jitter))\n throw new Error(\"retry.jitter must be none or full\");\n}\n\nexport function retryDelay(\n retry: Retry | undefined,\n cycle: number,\n error: unknown,\n random = Math.random,\n): number {\n let duration = retry?.delayMs ?? 0;\n if (retry?.backoff === \"exponential\" && duration > 0)\n duration *= 2 ** Math.min(cycle - 1, 1024);\n const cap =\n retry?.maxDelayMs ??\n (retry?.backoff === \"exponential\"\n ? defaultMaxRetryDelayMs\n : Number.MAX_SAFE_INTEGER);\n duration = Math.min(duration, cap);\n if (retry?.jitter === \"full\") duration *= random();\n const server =\n error instanceof OutpostError ? error.details.retryAfterMs : undefined;\n if (\n typeof server === \"number\" &&\n Number.isFinite(server) &&\n server >= 0 &&\n server <= Number.MAX_SAFE_INTEGER\n ) {\n if (server > (retry?.maxRetryAfterMs ?? defaultMaxRetryAfterMs))\n throw error;\n duration = Math.max(duration, server);\n }\n return Math.ceil(duration);\n}\n\nexport async function waitForRetry(\n duration: number,\n signal: AbortSignal,\n): Promise<void> {\n signal.throwIfAborted();\n let remaining = duration;\n do {\n const chunk = Math.min(remaining, maxTimerMs);\n await timers.setTimeout(chunk, undefined, { signal });\n remaining -= chunk;\n } while (remaining > 0);\n}\n"]}
|