@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/providers/container.ts"],"names":[],"mappings":"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","sourcesContent":["import { recoverContainer } from \"./container-recovery.ts\";\nimport { execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { basename } from \"node:path\";\nimport type { Command } from \"../domain/command.types.ts\";\nimport { containerNetworks } from \"./container-network.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport type { SandboxProvider } from \"../domain/sandbox.types.ts\";\nimport {\n executeProcess,\n quote,\n requireSuccess,\n} from \"../infrastructure/process.ts\";\nimport type { Executor } from \"../infrastructure/process.types.ts\";\nimport { registerCleanup } from \"../infrastructure/shutdown.ts\";\nimport { cacheMounts, validateCaches } from \"./container-cache.ts\";\nimport {\n cacheCreateOptions,\n cacheDefaults,\n} from \"./container-cache.constants.ts\";\nimport { containerCommand } from \"./container-command.ts\";\nimport { containerFiles } from \"./container-files.ts\";\nimport { containerMounts } from \"./container-mounts.ts\";\nimport { containerPlan } from \"./container-plan.ts\";\nimport { containerPreflight } from \"./container-preflight.ts\";\nimport { containerDefaults } from \"./container.constants.ts\";\nimport type { ContainerEngine, ContainerOptions } from \"./container.types.ts\";\nimport { fileProviderContext } from \"./workspace-context.ts\";\n\nexport type { ContainerOptions } from \"./container.types.ts\";\n\nexport function imageName(repository: string): string {\n return `outpost:${\n basename(repository)\n .toLowerCase()\n .replace(/[^a-z0-9_.-]/g, \"-\") || \"workspace\"\n }`;\n}\n\nexport function containerProvider(\n engine: ContainerEngine,\n options: ContainerOptions = {},\n executor: Executor = executeProcess,\n platform: NodeJS.Platform = process.platform,\n): SandboxProvider {\n const config = {\n ...options,\n networks: containerNetworks(options),\n caches: (options.caches ?? []).map((cache) => ({ ...cache })),\n };\n invariant(\n config.repositoryMode === undefined ||\n config.repositoryMode === \"mounted\" ||\n config.repositoryMode === \"isolated\",\n \"repositoryMode must be mounted or isolated\",\n );\n validateCaches(config);\n if (config.cpus !== undefined)\n invariant(\n Number.isFinite(config.cpus) && config.cpus > 0,\n \"cpus must be positive\",\n );\n if (config.memoryMb !== undefined)\n invariant(\n Number.isSafeInteger(config.memoryMb) &&\n config.memoryMb >= containerDefaults.minimumMemoryMb,\n \"memoryMb must be at least 64\",\n );\n const provider: SandboxProvider = {\n name: engine,\n placement: config.repositoryMode === \"isolated\" ? \"remote\" : \"mounted\",\n variables: { ...config.variables },\n ...(config.repositoryMode !== \"isolated\"\n ? {\n recover: (resourceId, recoveryOptions) =>\n recoverContainer(engine, executor, resourceId, recoveryOptions),\n }\n : {}),\n async acquire(context) {\n context.signal?.throwIfAborted();\n const name = `outpost-${randomUUID()}`;\n const image = config.image ?? imageName(context.repository);\n const user = config.user ?? {\n uid: process.getuid?.() ?? containerDefaults.uid,\n gid: process.getgid?.() ?? containerDefaults.gid,\n };\n invariant(\n Number.isInteger(user.uid) &&\n user.uid >= 0 &&\n Number.isInteger(user.gid) &&\n user.gid >= 0,\n \"Invalid container user\",\n );\n const call = (args: readonly string[], extra: Partial<Command> = {}) =>\n requireSuccess(\n {\n executable: engine,\n arguments: args,\n deadlineMs: containerDefaults.deadlineMs,\n ...extra,\n },\n executor,\n );\n await containerPreflight(engine, platform, call, config, image, user);\n const root =\n config.repositoryMode === \"isolated\"\n ? containerDefaults.isolatedRoot\n : containerDefaults.root,\n home = containerDefaults.home;\n const { env, volumes, fileParents } = await containerMounts(\n context,\n config,\n platform,\n root,\n home,\n );\n const caches = await cacheMounts(\n config.caches ?? [],\n context.repository,\n image,\n user,\n context.workspaceIdentity,\n );\n for (const cache of caches)\n volumes.push(\"--volume\", `${cache.volume}:${cache.target}:nocopy`);\n const args = containerPlan({\n config,\n engine,\n user,\n root,\n name,\n image,\n volumes,\n fileParents,\n });\n let closed = false,\n releasing: Promise<void> | undefined;\n let unregister = () => {};\n const release = (): Promise<void> => {\n closed = true;\n releasing ??= call([\"rm\", \"--force\", name])\n .then(() => {\n unregister();\n })\n .catch((error) => {\n releasing = undefined;\n throw error;\n });\n return releasing;\n };\n try {\n for (const cache of caches)\n await call(\n [\n \"volume\",\n \"create\",\n ...cacheCreateOptions[engine],\n \"--label\",\n `${cacheDefaults.label}=true`,\n cache.volume,\n ],\n context.signal ? { signal: context.signal } : {},\n );\n await context.registerRecovery?.(name);\n context.signal?.throwIfAborted();\n await call(args, {\n ...(context.signal ? { signal: context.signal } : {}),\n });\n await call(\n [\"start\", name],\n context.signal ? { signal: context.signal } : {},\n );\n for (const cache of caches) {\n await call(\n [\n \"exec\",\n \"--user\",\n \"0:0\",\n name,\n \"chown\",\n `${user.uid}:${user.gid}`,\n cache.target,\n ],\n context.signal ? { signal: context.signal } : {},\n );\n await call(\n [\"exec\", name, \"chmod\", \"700\", cache.target],\n context.signal ? { signal: context.signal } : {},\n );\n }\n for (const parent of fileParents)\n await call([\n \"exec\",\n \"--user\",\n \"0:0\",\n name,\n \"sh\",\n \"-c\",\n `mkdir -p ${quote(parent)} && chown ${user.uid}:${user.gid} ${quote(parent)}`,\n ]);\n if (fileParents.size)\n await call([\n \"exec\",\n \"--user\",\n \"0:0\",\n name,\n \"chown\",\n `${user.uid}:${user.gid}`,\n home,\n ]);\n if (config.repositoryMode === \"isolated\")\n await call(\n [\n \"exec\",\n \"--user\",\n \"0:0\",\n name,\n \"sh\",\n \"-c\",\n `mkdir -p ${quote(root)} && chmod 700 ${quote(root)} /tmp/outpost && chown ${user.uid}:${user.gid} ${quote(root)} /tmp/outpost`,\n ],\n context.signal ? { signal: context.signal } : {},\n );\n await call([\n \"exec\",\n name,\n \"sh\",\n \"-c\",\n \"command -v setsid >/dev/null && command -v kill >/dev/null && command -v tar >/dev/null && command -v cp >/dev/null\",\n ]);\n } catch (cause) {\n try {\n await release();\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Sandbox provisioning and cleanup failed\",\n );\n }\n throw cause;\n }\n unregister = registerCleanup(release, () => {\n if (!closed)\n execFileSync(engine, [\"rm\", \"--force\", name], {\n timeout: containerDefaults.cleanupMs,\n stdio: \"ignore\",\n windowsHide: true,\n });\n });\n return {\n root,\n home,\n liveInput: true,\n invoke: containerCommand({\n engine,\n config,\n executor,\n root,\n name,\n env,\n call,\n isClosed: () => closed,\n }),\n ...containerFiles({\n engine,\n config,\n executor,\n root,\n name,\n env,\n call,\n isClosed: () => closed,\n }),\n release,\n };\n },\n };\n return {\n ...provider,\n workspaces: {\n bindings:\n config.repositoryMode === \"isolated\"\n ? [\"copy\", \"ephemeral\"]\n : [\"copy\", \"ephemeral\", \"mount-readonly\", \"mount-write\"],\n async acquire(context) {\n invariant(\n config.image,\n \"File workspaces require an explicit container image\",\n );\n const source = context.workspace.source;\n const volumes = [...(config.volumes ?? [])];\n if (source.kind === \"directory\" && source.access.mode === \"mount\") {\n invariant(\n config.repositoryMode !== \"isolated\",\n \"Isolated containers cannot mount workspace sources\",\n );\n volumes.push({\n source: source.directory,\n target: source.access.target,\n readOnly: source.access.readOnly,\n });\n }\n const selected = containerProvider(\n engine,\n { ...config, volumes },\n executor,\n platform,\n );\n return selected.acquire(fileProviderContext(context));\n },\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/providers/container.ts"],"names":[],"mappings":"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","sourcesContent":["import { validateContainerImage } from \"../domain/container-image.ts\";\nimport { recoverContainer } from \"./container-recovery.ts\";\nimport { execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { basename } from \"node:path\";\nimport type { Command } from \"../domain/command.types.ts\";\nimport { containerNetworks } from \"./container-network.ts\";\nimport { validateEgress } from \"../domain/egress.ts\";\nimport { createContainerEgress } from \"./container-egress.ts\";\nimport { egressVariables } from \"./egress/egress.constants.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport type { SandboxProvider } from \"../domain/sandbox.types.ts\";\nimport {\n executeProcess,\n quote,\n requireSuccess,\n} from \"../infrastructure/process.ts\";\nimport type { Executor } from \"../infrastructure/process.types.ts\";\nimport { registerCleanup } from \"../infrastructure/shutdown.ts\";\nimport { cacheMounts, validateCaches } from \"./container-cache.ts\";\nimport {\n cacheCreateOptions,\n cacheDefaults,\n} from \"./container-cache.constants.ts\";\nimport { containerCommand } from \"./container-command.ts\";\nimport { containerFiles } from \"./container-files.ts\";\nimport { containerMounts } from \"./container-mounts.ts\";\nimport { containerPlan } from \"./container-plan.ts\";\nimport { containerPreflight } from \"./container-preflight.ts\";\nimport { containerDefaults } from \"./container.constants.ts\";\nimport type { ContainerEngine, ContainerOptions } from \"./container.types.ts\";\nimport { fileProviderContext } from \"./workspace-context.ts\";\n\nexport type { ContainerOptions } from \"./container.types.ts\";\n\nexport function imageName(repository: string): string {\n return `outpost:${\n basename(repository)\n .toLowerCase()\n .replace(/[^a-z0-9_.-]/g, \"-\") || \"workspace\"\n }`;\n}\n\nexport function containerProvider(\n engine: ContainerEngine,\n options: ContainerOptions = {},\n executor: Executor = executeProcess,\n platform: NodeJS.Platform = process.platform,\n): SandboxProvider {\n if (options.image !== undefined) validateContainerImage(options.image);\n const policy = validateEgress(options.egress);\n const config = {\n ...options,\n ...(policy ? { egress: policy } : {}),\n networks: containerNetworks(options),\n caches: (options.caches ?? []).map((cache) => ({ ...cache })),\n };\n if (config.egressImage !== undefined) {\n invariant(\n config.egress?.mode === \"allowlist\",\n \"egressImage requires an egress allowlist\",\n );\n invariant(\n typeof config.egressImage === \"string\" &&\n config.egressImage.length > 0 &&\n !config.egressImage.startsWith(\"-\") &&\n !/\\s/.test(config.egressImage),\n \"Invalid egressImage reference\",\n );\n }\n invariant(\n config.repositoryMode === undefined ||\n config.repositoryMode === \"mounted\" ||\n config.repositoryMode === \"isolated\",\n \"repositoryMode must be mounted or isolated\",\n );\n validateCaches(config);\n if (config.cpus !== undefined)\n invariant(\n Number.isFinite(config.cpus) && config.cpus > 0,\n \"cpus must be positive\",\n );\n if (config.memoryMb !== undefined)\n invariant(\n Number.isSafeInteger(config.memoryMb) &&\n config.memoryMb >= containerDefaults.minimumMemoryMb,\n \"memoryMb must be at least 64\",\n );\n const provider: SandboxProvider = {\n name: engine,\n placement: config.repositoryMode === \"isolated\" ? \"remote\" : \"mounted\",\n variables: { ...config.variables },\n ...(config.repositoryMode !== \"isolated\"\n ? {\n recover: (resourceId, recoveryOptions) =>\n recoverContainer(engine, executor, resourceId, recoveryOptions),\n }\n : {}),\n async acquire(context) {\n context.signal?.throwIfAborted();\n const name = `outpost-${randomUUID()}`;\n const image = config.image ?? imageName(context.repository);\n const user = config.user ?? {\n uid: process.getuid?.() ?? containerDefaults.uid,\n gid: process.getgid?.() ?? containerDefaults.gid,\n };\n invariant(\n Number.isInteger(user.uid) &&\n user.uid >= 0 &&\n Number.isInteger(user.gid) &&\n user.gid >= 0,\n \"Invalid container user\",\n );\n const call = (args: readonly string[], extra: Partial<Command> = {}) =>\n requireSuccess(\n {\n executable: engine,\n arguments: args,\n deadlineMs: containerDefaults.deadlineMs,\n ...extra,\n },\n executor,\n );\n await containerPreflight(engine, platform, call, config, image, user);\n const root =\n config.repositoryMode === \"isolated\"\n ? containerDefaults.isolatedRoot\n : containerDefaults.root,\n home = containerDefaults.home;\n const { env, volumes, fileParents } = await containerMounts(\n context,\n config,\n platform,\n root,\n home,\n );\n const egress =\n config.egress?.mode === \"allowlist\"\n ? createContainerEgress(call, name, config, engine, user)\n : undefined;\n if (egress) Object.assign(env, egressVariables);\n const caches = await cacheMounts(\n config.caches ?? [],\n context.repository,\n image,\n user,\n context.workspaceIdentity,\n );\n for (const cache of caches)\n volumes.push(\"--volume\", `${cache.volume}:${cache.target}:nocopy`);\n const args = containerPlan({\n config: egress\n ? { ...config, networks: [`container:${egress.name}`] }\n : config,\n engine,\n user,\n root,\n name,\n image,\n volumes,\n fileParents,\n });\n let closed = false,\n releasing: Promise<void> | undefined;\n let attempted = false;\n let unregister = () => {};\n const release = (): Promise<void> => {\n closed = true;\n releasing ??= (async () => {\n if (attempted) {\n await call([\"rm\", \"--force\", name]);\n attempted = false;\n }\n await egress?.release();\n })()\n .then(() => {\n unregister();\n })\n .catch((error) => {\n releasing = undefined;\n throw error;\n });\n return releasing;\n };\n try {\n for (const cache of caches)\n await call(\n [\n \"volume\",\n \"create\",\n ...cacheCreateOptions[engine],\n \"--label\",\n `${cacheDefaults.label}=true`,\n cache.volume,\n ],\n context.signal ? { signal: context.signal } : {},\n );\n await context.registerRecovery?.(name);\n context.signal?.throwIfAborted();\n await egress?.start(context.signal);\n attempted = true;\n await call(args, {\n ...(context.signal ? { signal: context.signal } : {}),\n });\n await call(\n [\"start\", name],\n context.signal ? { signal: context.signal } : {},\n );\n for (const cache of caches) {\n await call(\n [\n \"exec\",\n \"--user\",\n \"0:0\",\n name,\n \"chown\",\n `${user.uid}:${user.gid}`,\n cache.target,\n ],\n context.signal ? { signal: context.signal } : {},\n );\n await call(\n [\"exec\", name, \"chmod\", \"700\", cache.target],\n context.signal ? { signal: context.signal } : {},\n );\n }\n for (const parent of fileParents)\n await call([\n \"exec\",\n \"--user\",\n \"0:0\",\n name,\n \"sh\",\n \"-c\",\n `mkdir -p ${quote(parent)} && chown ${user.uid}:${user.gid} ${quote(parent)}`,\n ]);\n if (engine === \"podman\" || fileParents.size)\n await call([\n \"exec\",\n \"--user\",\n \"0:0\",\n name,\n \"chown\",\n `${user.uid}:${user.gid}`,\n home,\n ]);\n if (config.repositoryMode === \"isolated\")\n await call(\n [\n \"exec\",\n \"--user\",\n \"0:0\",\n name,\n \"sh\",\n \"-c\",\n `mkdir -p ${quote(root)} && chmod 700 ${quote(root)} /tmp/outpost && chown ${user.uid}:${user.gid} ${quote(root)} /tmp/outpost`,\n ],\n context.signal ? { signal: context.signal } : {},\n );\n await call([\n \"exec\",\n name,\n \"sh\",\n \"-c\",\n \"command -v setsid >/dev/null && command -v kill >/dev/null && command -v tar >/dev/null && command -v cp >/dev/null\",\n ]);\n } catch (cause) {\n try {\n await release();\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Sandbox provisioning and cleanup failed\",\n );\n }\n throw cause;\n }\n unregister = registerCleanup(release, () => {\n if (attempted)\n execFileSync(\n engine,\n [\"rm\", \"--force\", name, ...(egress ? [egress.name] : [])],\n {\n timeout: containerDefaults.cleanupMs,\n stdio: \"ignore\",\n windowsHide: true,\n },\n );\n });\n return {\n root,\n home,\n liveInput: true,\n invoke: containerCommand({\n engine,\n config,\n executor,\n root,\n name,\n env,\n call,\n isClosed: () => closed,\n }),\n ...containerFiles({\n engine,\n config,\n executor,\n root,\n name,\n env,\n call,\n isClosed: () => closed,\n }),\n release,\n };\n },\n };\n return {\n ...provider,\n workspaces: {\n bindings:\n config.repositoryMode === \"isolated\"\n ? [\"copy\", \"ephemeral\"]\n : [\"copy\", \"ephemeral\", \"mount-readonly\", \"mount-write\"],\n async acquire(context) {\n invariant(\n config.image,\n \"File workspaces require an explicit container image\",\n );\n const source = context.workspace.source;\n const volumes = [...(config.volumes ?? [])];\n if (source.kind === \"directory\" && source.access.mode === \"mount\") {\n invariant(\n config.repositoryMode !== \"isolated\",\n \"Isolated containers cannot mount workspace sources\",\n );\n volumes.push({\n source: source.directory,\n target: source.access.target,\n readOnly: source.access.readOnly,\n });\n }\n const selected = containerProvider(\n engine,\n { ...config, volumes },\n executor,\n platform,\n );\n return selected.acquire(fileProviderContext(context));\n },\n },\n };\n}\n"]}
|
|
@@ -5,6 +5,7 @@ import type { Executor } from "../infrastructure/process.types.ts";
|
|
|
5
5
|
import type { DependencyCache } from "./container-cache.types.ts";
|
|
6
6
|
export interface ContainerOptions {
|
|
7
7
|
readonly egress?: EgressPolicy;
|
|
8
|
+
readonly egressImage?: string;
|
|
8
9
|
readonly repositoryMode?: "mounted" | "isolated";
|
|
9
10
|
readonly caches?: readonly DependencyCache[];
|
|
10
11
|
readonly image?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.types.js","sourceRoot":"","sources":["../../src/providers/container.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { EgressPolicy } from \"../domain/egress.types.ts\";\nimport type {\n Command,\n CommandResult,\n Variables,\n} from \"../domain/command.types.ts\";\nimport type { Volume } from \"../domain/sandbox.types.ts\";\nimport type { Executor } from \"../infrastructure/process.types.ts\";\nimport type { DependencyCache } from \"./container-cache.types.ts\";\n\nexport interface ContainerOptions {\n readonly egress?: EgressPolicy;\n readonly repositoryMode?: \"mounted\" | \"isolated\";\n readonly caches?: readonly DependencyCache[];\n readonly image?: string;\n readonly user?: { readonly uid: number; readonly gid: number };\n readonly volumes?: readonly Volume[];\n readonly variables?: Variables;\n readonly networks?: string | readonly string[];\n readonly groups?: readonly (string | number)[];\n readonly devices?: readonly string[];\n readonly cpus?: number;\n readonly memoryMb?: number;\n readonly label?: \"z\" | \"Z\" | false;\n readonly retain?: number;\n readonly userns?: \"keep-id\" | false;\n}\n\nexport type ContainerEngine = \"docker\" | \"podman\";\nexport type ContainerCall = (\n args: readonly string[],\n extra?: Partial<Command>,\n) => Promise<CommandResult>;\nexport interface ContainerRuntime {\n readonly engine: ContainerEngine;\n readonly config: ContainerOptions;\n readonly executor: Executor;\n readonly root: string;\n readonly name: string;\n readonly env: Record<string, string>;\n readonly call: ContainerCall;\n readonly isClosed: () => boolean;\n}\nexport interface ContainerMounts {\n readonly env: Record<string, string>;\n readonly volumes: string[];\n readonly fileParents: Set<string>;\n}\n\nexport interface ContainerUser {\n readonly uid: number;\n readonly gid: number;\n}\nexport interface ContainerPlanOptions {\n readonly config: ContainerOptions;\n readonly engine: ContainerEngine;\n readonly user: ContainerUser;\n readonly root: string;\n readonly name: string;\n readonly image: string;\n readonly volumes: readonly string[];\n readonly fileParents: ReadonlySet<string>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"container.types.js","sourceRoot":"","sources":["../../src/providers/container.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { EgressPolicy } from \"../domain/egress.types.ts\";\nimport type {\n Command,\n CommandResult,\n Variables,\n} from \"../domain/command.types.ts\";\nimport type { Volume } from \"../domain/sandbox.types.ts\";\nimport type { Executor } from \"../infrastructure/process.types.ts\";\nimport type { DependencyCache } from \"./container-cache.types.ts\";\n\nexport interface ContainerOptions {\n readonly egress?: EgressPolicy;\n readonly egressImage?: string;\n readonly repositoryMode?: \"mounted\" | \"isolated\";\n readonly caches?: readonly DependencyCache[];\n readonly image?: string;\n readonly user?: { readonly uid: number; readonly gid: number };\n readonly volumes?: readonly Volume[];\n readonly variables?: Variables;\n readonly networks?: string | readonly string[];\n readonly groups?: readonly (string | number)[];\n readonly devices?: readonly string[];\n readonly cpus?: number;\n readonly memoryMb?: number;\n readonly label?: \"z\" | \"Z\" | false;\n readonly retain?: number;\n readonly userns?: \"keep-id\" | false;\n}\n\nexport type ContainerEngine = \"docker\" | \"podman\";\nexport type ContainerCall = (\n args: readonly string[],\n extra?: Partial<Command>,\n) => Promise<CommandResult>;\nexport interface ContainerRuntime {\n readonly engine: ContainerEngine;\n readonly config: ContainerOptions;\n readonly executor: Executor;\n readonly root: string;\n readonly name: string;\n readonly env: Record<string, string>;\n readonly call: ContainerCall;\n readonly isClosed: () => boolean;\n}\nexport interface ContainerMounts {\n readonly env: Record<string, string>;\n readonly volumes: string[];\n readonly fileParents: Set<string>;\n}\n\nexport interface ContainerUser {\n readonly uid: number;\n readonly gid: number;\n}\nexport interface ContainerPlanOptions {\n readonly config: ContainerOptions;\n readonly engine: ContainerEngine;\n readonly user: ContainerUser;\n readonly root: string;\n readonly name: string;\n readonly image: string;\n readonly volumes: readonly string[];\n readonly fileParents: ReadonlySet<string>;\n}\n"]}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
export const daytonaOutputPrefix = "outpost-output:";
|
|
2
2
|
export const daytonaCommandScript = `const {spawn}=require("node:child_process");
|
|
3
|
+
const {readFileSync,unlinkSync}=require("node:fs");
|
|
4
|
+
const variables=JSON.parse(readFileSync(process.argv[1],"utf8"));
|
|
5
|
+
unlinkSync(process.argv[1]);
|
|
3
6
|
const {constants}=require("node:os");
|
|
4
7
|
const {Transform}=require("node:stream");
|
|
5
8
|
const frame=data=>${JSON.stringify(daytonaOutputPrefix)}+data.toString("base64")+"\\n";
|
|
6
9
|
const encode=()=>new Transform({transform(data,encoding,done){done(null,frame(data))}});
|
|
7
|
-
const child=spawn(process.argv[
|
|
10
|
+
const child=spawn(process.argv[2],process.argv.slice(3),{env:{...process.env,...variables},stdio:["inherit","pipe","pipe"]});
|
|
8
11
|
let failed;
|
|
9
12
|
child.stdout.pipe(encode()).pipe(process.stdout);
|
|
10
13
|
child.stderr.pipe(encode()).pipe(process.stderr);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daytona-command.constants.js","sourceRoot":"","sources":["../../src/providers/daytona-command.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG
|
|
1
|
+
{"version":3,"file":"daytona-command.constants.js","sourceRoot":"","sources":["../../src/providers/daytona-command.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;oBAMhB,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC;;;;;;;mHAO4D,CAAC","sourcesContent":["export const daytonaOutputPrefix = \"outpost-output:\";\nexport const daytonaCommandScript = `const {spawn}=require(\"node:child_process\");\nconst {readFileSync,unlinkSync}=require(\"node:fs\");\nconst variables=JSON.parse(readFileSync(process.argv[1],\"utf8\"));\nunlinkSync(process.argv[1]);\nconst {constants}=require(\"node:os\");\nconst {Transform}=require(\"node:stream\");\nconst frame=data=>${JSON.stringify(daytonaOutputPrefix)}+data.toString(\"base64\")+\"\\\\n\";\nconst encode=()=>new Transform({transform(data,encoding,done){done(null,frame(data))}});\nconst child=spawn(process.argv[2],process.argv.slice(3),{env:{...process.env,...variables},stdio:[\"inherit\",\"pipe\",\"pipe\"]});\nlet failed;\nchild.stdout.pipe(encode()).pipe(process.stdout);\nchild.stderr.pipe(encode()).pipe(process.stderr);\nchild.on(\"error\",error=>{failed=error.code===\"ENOENT\"?127:126;process.stderr.write(frame(Buffer.from(error.message)))});\nchild.on(\"close\",(code,signal)=>{process.exitCode=failed??code??(signal?128+(constants.signals[signal]??0):127)});`;\n"]}
|
|
@@ -3,6 +3,7 @@ import { randomUUID } from "node:crypto";
|
|
|
3
3
|
import { OutpostError } from "../domain/errors.js";
|
|
4
4
|
import { interruptible } from "../infrastructure/abort.js";
|
|
5
5
|
import { quote } from "../infrastructure/process.js";
|
|
6
|
+
import { reportInputFailure } from "../infrastructure/input-failure.js";
|
|
6
7
|
import { cloudDefaults } from "./cloud.constants.js";
|
|
7
8
|
import { cloudInputFeed, cloudInputFrames, cloudInputProgram, } from "./cloud-input.js";
|
|
8
9
|
import { daytonaCommandScript } from "./daytona-command.constants.js";
|
|
@@ -27,10 +28,8 @@ export function daytonaCommand(runtime) {
|
|
|
27
28
|
const pid = `/tmp/${id}.pid`;
|
|
28
29
|
const live = command.input;
|
|
29
30
|
const staged = live ? cloudInputFrames(command.stdin) : command.stdin;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const failure = new AbortController();
|
|
33
|
-
const stopped = AbortSignal.any([signal, failure.signal]);
|
|
31
|
+
const stopped = signal;
|
|
32
|
+
let inputFailure;
|
|
34
33
|
const variables = { ...context.variables, ...command.variables };
|
|
35
34
|
const quoted = [
|
|
36
35
|
...(command.elevated ? ["sudo", "-n", "--"] : []),
|
|
@@ -41,18 +40,25 @@ export function daytonaCommand(runtime) {
|
|
|
41
40
|
.join(" ");
|
|
42
41
|
const program = live ? cloudInputProgram(input, quoted) : quoted;
|
|
43
42
|
const redirect = !live && command.stdin !== undefined ? ` < ${quote(input)}` : "";
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
const secrets = `/tmp/${id}.secrets`;
|
|
44
|
+
const environment = `${secrets}/environment.json`;
|
|
45
|
+
const script = `cd ${quote(command.directory ?? root)} && setsid --wait sh -c ${quote(`echo $$ > ${quote(pid)}; test ! -f ${quote(pid + ".cancel")} || exit 130; exec node -e ${quote(daytonaCommandScript)} -- ${quote(environment)} ${program}${redirect}`)}`;
|
|
47
46
|
const output = { stdout: "", stderr: "" };
|
|
48
47
|
let feed;
|
|
49
48
|
let cancellation;
|
|
50
49
|
const cancel = () => {
|
|
51
|
-
cancellation ??= sandbox.process.executeCommand(`touch ${quote(pid + ".cancel")}; if [ -f ${quote(pid)} ]; then kill -KILL -$(cat ${quote(pid)}) 2>/dev/null || true; fi`);
|
|
50
|
+
cancellation ??= sandbox.process.executeCommand(`touch ${quote(pid + ".cancel")}; if [ -f ${quote(pid)} ]; then ${command.elevated ? "sudo -n -- " : ""}kill -KILL -$(cat ${quote(pid)}) 2>/dev/null || true; fi`);
|
|
52
51
|
void cancellation.catch(() => undefined);
|
|
53
52
|
};
|
|
54
|
-
|
|
53
|
+
let sessionCreated = false;
|
|
55
54
|
try {
|
|
55
|
+
await sandbox.fs.createFolder(secrets, "700");
|
|
56
|
+
await sandbox.fs.uploadFile(Buffer.from(JSON.stringify(variables)), environment);
|
|
57
|
+
if (staged !== undefined)
|
|
58
|
+
await sandbox.fs.uploadFile(Buffer.from(staged), input);
|
|
59
|
+
stopped.throwIfAborted();
|
|
60
|
+
await sandbox.process.createSession(id);
|
|
61
|
+
sessionCreated = true;
|
|
56
62
|
stopped.addEventListener("abort", cancel, { once: true });
|
|
57
63
|
if (stopped.aborted)
|
|
58
64
|
cancel();
|
|
@@ -66,10 +72,16 @@ export function daytonaCommand(runtime) {
|
|
|
66
72
|
const commandId = response.cmdId;
|
|
67
73
|
if (live)
|
|
68
74
|
feed = cloudInputFeed(live, async (line) => {
|
|
69
|
-
|
|
75
|
+
await sandbox.fs.uploadFile(Buffer.from(line), input + ".chunk");
|
|
76
|
+
const appended = await sandbox.process.executeCommand(`cat ${quote(input + ".chunk")} >> ${quote(input)}`);
|
|
70
77
|
if (appended.exitCode !== 0)
|
|
71
78
|
throw new OutpostError("provider", "Cloud live input could not be appended");
|
|
72
|
-
}, (cause) =>
|
|
79
|
+
}, (cause) => {
|
|
80
|
+
if (!reportInputFailure(live, cause))
|
|
81
|
+
inputFailure = new OutpostError("steering", "Cloud live input delivery failed", {}, cause);
|
|
82
|
+
}, () => sandbox.fs
|
|
83
|
+
.uploadFile(Buffer.alloc(0), input + ".closed")
|
|
84
|
+
.then(() => undefined));
|
|
73
85
|
const consume = (channel) => (chunk) => {
|
|
74
86
|
output[channel] = (output[channel] + chunk).slice(-(command.retain ?? options.retain ?? cloudDefaults.retainBytes));
|
|
75
87
|
command.observe?.(channel, chunk);
|
|
@@ -84,14 +96,20 @@ export function daytonaCommand(runtime) {
|
|
|
84
96
|
stopped.throwIfAborted();
|
|
85
97
|
while (true) {
|
|
86
98
|
const result = await interruptible(sandbox.process.getSessionCommand(id, commandId), stopped);
|
|
87
|
-
if (result.exitCode !== undefined)
|
|
99
|
+
if (result.exitCode !== undefined) {
|
|
100
|
+
await feed?.finish();
|
|
101
|
+
if (inputFailure)
|
|
102
|
+
throw inputFailure;
|
|
88
103
|
return { status: result.exitCode, ...output };
|
|
104
|
+
}
|
|
89
105
|
await setTimeout(cloudDefaults.pollMs, undefined, {
|
|
90
106
|
signal: stopped,
|
|
91
107
|
});
|
|
92
108
|
}
|
|
93
109
|
}
|
|
94
110
|
catch (cause) {
|
|
111
|
+
if (inputFailure && cause === inputFailure)
|
|
112
|
+
throw cause;
|
|
95
113
|
cancel();
|
|
96
114
|
try {
|
|
97
115
|
await interruptible(cancellation, AbortSignal.timeout(cloudDefaults.cancellationMs));
|
|
@@ -104,10 +122,15 @@ export function daytonaCommand(runtime) {
|
|
|
104
122
|
finally {
|
|
105
123
|
stopped.removeEventListener("abort", cancel);
|
|
106
124
|
await feed?.finish();
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
125
|
+
try {
|
|
126
|
+
if (sessionCreated)
|
|
127
|
+
await sandbox.process.deleteSession(id);
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
await sandbox.process
|
|
131
|
+
.executeCommand(`rm -f ${quote(input)} ${quote(input + ".chunk")} ${quote(input + ".closed")} ${quote(pid)} ${quote(pid + ".cancel")}; rm -rf ${quote(secrets)}`)
|
|
132
|
+
.catch(() => undefined);
|
|
133
|
+
}
|
|
111
134
|
}
|
|
112
135
|
};
|
|
113
136
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daytona-command.js","sourceRoot":"","sources":["../../src/providers/daytona-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout } from \"node:timers/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport type { SandboxLease } from \"../domain/sandbox.types.ts\";\nimport { interruptible } from \"../infrastructure/abort.ts\";\nimport { quote } from \"../infrastructure/process.ts\";\nimport { cloudDefaults } from \"./cloud.constants.ts\";\nimport {\n cloudInputFeed,\n cloudInputFrames,\n cloudInputProgram,\n} from \"./cloud-input.ts\";\nimport type { CloudInputFeed } from \"./cloud-input.types.ts\";\nimport { daytonaCommandScript } from \"./daytona-command.constants.ts\";\nimport { daytonaOutput } from \"./daytona-output.ts\";\nimport { daytonaTerminal } from \"./daytona-terminal.ts\";\nimport type { DaytonaRuntime } from \"./daytona.types.ts\";\n\nexport function daytonaCommand(\n runtime: DaytonaRuntime,\n): SandboxLease[\"invoke\"] {\n const { sandbox, root, options, context, isClosed } = runtime;\n return async (command) => {\n if (isClosed())\n throw new OutpostError(\"provider\", \"Cloud sandbox is closed\");\n const signal = command.signal\n ? AbortSignal.any([\n command.signal,\n AbortSignal.timeout(command.deadlineMs ?? cloudDefaults.deadlineMs),\n ])\n : AbortSignal.timeout(command.deadlineMs ?? cloudDefaults.deadlineMs);\n signal.throwIfAborted();\n if (command.interactive) return daytonaTerminal(runtime, command, signal);\n const id = `outpost-${randomUUID()}`;\n const input = `/tmp/${id}.stdin`;\n const pid = `/tmp/${id}.pid`;\n const live = command.input;\n const staged = live ? cloudInputFrames(command.stdin) : command.stdin;\n if (staged !== undefined)\n await sandbox.fs.uploadFile(Buffer.from(staged), input);\n const failure = new AbortController();\n const stopped = AbortSignal.any([signal, failure.signal]);\n const variables = { ...context.variables, ...command.variables };\n const quoted = [\n ...(command.elevated ? [\"sudo\", \"-n\", \"--\"] : []),\n command.executable,\n ...(command.arguments ?? []),\n ]\n .map(quote)\n .join(\" \");\n const program = live ? cloudInputProgram(input, quoted) : quoted;\n const redirect =\n !live && command.stdin !== undefined ? ` < ${quote(input)}` : \"\";\n const script = `cd ${quote(command.directory ?? root)} && env ${Object.entries(\n variables,\n )\n .map(([key, value]) => quote(`${key}=${value}`))\n .join(\n \" \",\n )} setsid --wait sh -c ${quote(`echo $$ > ${quote(pid)}; test ! -f ${quote(pid + \".cancel\")} || exit 130; exec node -e ${quote(daytonaCommandScript)} -- ${program}${redirect}`)}`;\n const output = { stdout: \"\", stderr: \"\" };\n let feed: CloudInputFeed | undefined;\n let cancellation: Promise<unknown> | undefined;\n const cancel = () => {\n cancellation ??= sandbox.process.executeCommand(\n `touch ${quote(pid + \".cancel\")}; if [ -f ${quote(pid)} ]; then kill -KILL -$(cat ${quote(pid)}) 2>/dev/null || true; fi`,\n );\n void cancellation.catch(() => undefined);\n };\n await sandbox.process.createSession(id);\n try {\n stopped.addEventListener(\"abort\", cancel, { once: true });\n if (stopped.aborted) cancel();\n stopped.throwIfAborted();\n const response = await interruptible(\n sandbox.process.executeSessionCommand(id, {\n command: script,\n async: true,\n }),\n stopped,\n );\n if (!response.cmdId)\n throw new OutpostError(\n \"provider\",\n \"Cloud provider returned no command identifier\",\n );\n const commandId = response.cmdId;\n if (live)\n feed = cloudInputFeed(\n live,\n async (line) => {\n const appended = await sandbox.process.executeCommand(\n `printf '%s' ${quote(line)} >> ${quote(input)}`,\n );\n if (appended.exitCode !== 0)\n throw new OutpostError(\n \"provider\",\n \"Cloud live input could not be appended\",\n );\n },\n (cause) => failure.abort(cause),\n );\n const consume = (channel: \"stdout\" | \"stderr\") => (chunk: string) => {\n output[channel] = (output[channel] + chunk).slice(\n -(command.retain ?? options.retain ?? cloudDefaults.retainBytes),\n );\n command.observe?.(channel, chunk);\n };\n const stdout = daytonaOutput(consume(\"stdout\"));\n const stderr = daytonaOutput(consume(\"stderr\"));\n await interruptible(\n sandbox.process.getSessionCommandLogs(\n id,\n commandId,\n stdout.write,\n stderr.write,\n ),\n stopped,\n );\n stdout.close();\n stderr.close();\n if (cancellation) await cancellation;\n stopped.throwIfAborted();\n while (true) {\n const result = await interruptible(\n sandbox.process.getSessionCommand(id, commandId),\n stopped,\n );\n if (result.exitCode !== undefined)\n return { status: result.exitCode, ...output };\n await setTimeout(cloudDefaults.pollMs, undefined, {\n signal: stopped,\n });\n }\n } catch (cause) {\n cancel();\n try {\n await interruptible(\n cancellation!,\n AbortSignal.timeout(cloudDefaults.cancellationMs),\n );\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Cloud cancellation could not be confirmed\",\n );\n }\n throw cause;\n } finally {\n stopped.removeEventListener(\"abort\", cancel);\n await feed?.finish();\n await sandbox.process.deleteSession(id);\n await sandbox.process\n .executeCommand(`rm -f ${quote(input)} ${quote(pid)}`)\n .catch(() => undefined);\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"daytona-command.js","sourceRoot":"","sources":["../../src/providers/daytona-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout } from \"node:timers/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport type { SandboxLease } from \"../domain/sandbox.types.ts\";\nimport { interruptible } from \"../infrastructure/abort.ts\";\nimport { quote } from \"../infrastructure/process.ts\";\nimport { reportInputFailure } from \"../infrastructure/input-failure.ts\";\nimport { cloudDefaults } from \"./cloud.constants.ts\";\nimport {\n cloudInputFeed,\n cloudInputFrames,\n cloudInputProgram,\n} from \"./cloud-input.ts\";\nimport type { CloudInputFeed } from \"./cloud-input.types.ts\";\nimport { daytonaCommandScript } from \"./daytona-command.constants.ts\";\nimport { daytonaOutput } from \"./daytona-output.ts\";\nimport { daytonaTerminal } from \"./daytona-terminal.ts\";\nimport type { DaytonaRuntime } from \"./daytona.types.ts\";\n\nexport function daytonaCommand(\n runtime: DaytonaRuntime,\n): SandboxLease[\"invoke\"] {\n const { sandbox, root, options, context, isClosed } = runtime;\n return async (command) => {\n if (isClosed())\n throw new OutpostError(\"provider\", \"Cloud sandbox is closed\");\n const signal = command.signal\n ? AbortSignal.any([\n command.signal,\n AbortSignal.timeout(command.deadlineMs ?? cloudDefaults.deadlineMs),\n ])\n : AbortSignal.timeout(command.deadlineMs ?? cloudDefaults.deadlineMs);\n signal.throwIfAborted();\n if (command.interactive) return daytonaTerminal(runtime, command, signal);\n const id = `outpost-${randomUUID()}`;\n const input = `/tmp/${id}.stdin`;\n const pid = `/tmp/${id}.pid`;\n const live = command.input;\n const staged = live ? cloudInputFrames(command.stdin) : command.stdin;\n const stopped = signal;\n let inputFailure: OutpostError | undefined;\n const variables = { ...context.variables, ...command.variables };\n const quoted = [\n ...(command.elevated ? [\"sudo\", \"-n\", \"--\"] : []),\n command.executable,\n ...(command.arguments ?? []),\n ]\n .map(quote)\n .join(\" \");\n const program = live ? cloudInputProgram(input, quoted) : quoted;\n const redirect =\n !live && command.stdin !== undefined ? ` < ${quote(input)}` : \"\";\n const secrets = `/tmp/${id}.secrets`;\n const environment = `${secrets}/environment.json`;\n const script = `cd ${quote(command.directory ?? root)} && setsid --wait sh -c ${quote(`echo $$ > ${quote(pid)}; test ! -f ${quote(pid + \".cancel\")} || exit 130; exec node -e ${quote(daytonaCommandScript)} -- ${quote(environment)} ${program}${redirect}`)}`;\n const output = { stdout: \"\", stderr: \"\" };\n let feed: CloudInputFeed | undefined;\n let cancellation: Promise<unknown> | undefined;\n const cancel = () => {\n cancellation ??= sandbox.process.executeCommand(\n `touch ${quote(pid + \".cancel\")}; if [ -f ${quote(pid)} ]; then ${command.elevated ? \"sudo -n -- \" : \"\"}kill -KILL -$(cat ${quote(pid)}) 2>/dev/null || true; fi`,\n );\n void cancellation.catch(() => undefined);\n };\n let sessionCreated = false;\n try {\n await sandbox.fs.createFolder(secrets, \"700\");\n await sandbox.fs.uploadFile(\n Buffer.from(JSON.stringify(variables)),\n environment,\n );\n if (staged !== undefined)\n await sandbox.fs.uploadFile(Buffer.from(staged), input);\n stopped.throwIfAborted();\n await sandbox.process.createSession(id);\n sessionCreated = true;\n stopped.addEventListener(\"abort\", cancel, { once: true });\n if (stopped.aborted) cancel();\n stopped.throwIfAborted();\n const response = await interruptible(\n sandbox.process.executeSessionCommand(id, {\n command: script,\n async: true,\n }),\n stopped,\n );\n if (!response.cmdId)\n throw new OutpostError(\n \"provider\",\n \"Cloud provider returned no command identifier\",\n );\n const commandId = response.cmdId;\n if (live)\n feed = cloudInputFeed(\n live,\n async (line) => {\n await sandbox.fs.uploadFile(Buffer.from(line), input + \".chunk\");\n const appended = await sandbox.process.executeCommand(\n `cat ${quote(input + \".chunk\")} >> ${quote(input)}`,\n );\n if (appended.exitCode !== 0)\n throw new OutpostError(\n \"provider\",\n \"Cloud live input could not be appended\",\n );\n },\n (cause) => {\n if (!reportInputFailure(live, cause))\n inputFailure = new OutpostError(\n \"steering\",\n \"Cloud live input delivery failed\",\n {},\n cause,\n );\n },\n () =>\n sandbox.fs\n .uploadFile(Buffer.alloc(0), input + \".closed\")\n .then(() => undefined),\n );\n const consume = (channel: \"stdout\" | \"stderr\") => (chunk: string) => {\n output[channel] = (output[channel] + chunk).slice(\n -(command.retain ?? options.retain ?? cloudDefaults.retainBytes),\n );\n command.observe?.(channel, chunk);\n };\n const stdout = daytonaOutput(consume(\"stdout\"));\n const stderr = daytonaOutput(consume(\"stderr\"));\n await interruptible(\n sandbox.process.getSessionCommandLogs(\n id,\n commandId,\n stdout.write,\n stderr.write,\n ),\n stopped,\n );\n stdout.close();\n stderr.close();\n if (cancellation) await cancellation;\n stopped.throwIfAborted();\n while (true) {\n const result = await interruptible(\n sandbox.process.getSessionCommand(id, commandId),\n stopped,\n );\n if (result.exitCode !== undefined) {\n await feed?.finish();\n if (inputFailure) throw inputFailure;\n return { status: result.exitCode, ...output };\n }\n await setTimeout(cloudDefaults.pollMs, undefined, {\n signal: stopped,\n });\n }\n } catch (cause) {\n if (inputFailure && cause === inputFailure) throw cause;\n cancel();\n try {\n await interruptible(\n cancellation!,\n AbortSignal.timeout(cloudDefaults.cancellationMs),\n );\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Cloud cancellation could not be confirmed\",\n );\n }\n throw cause;\n } finally {\n stopped.removeEventListener(\"abort\", cancel);\n await feed?.finish();\n try {\n if (sessionCreated) await sandbox.process.deleteSession(id);\n } finally {\n await sandbox.process\n .executeCommand(\n `rm -f ${quote(input)} ${quote(input + \".chunk\")} ${quote(input + \".closed\")} ${quote(pid)} ${quote(pid + \".cancel\")}; rm -rf ${quote(secrets)}`,\n )\n .catch(() => undefined);\n }\n }\n };\n}\n"]}
|
|
@@ -16,13 +16,13 @@ export function daytonaFiles(sandbox) {
|
|
|
16
16
|
if (result.exitCode !== 0)
|
|
17
17
|
throw new OutpostError("provider", "Symlink upload failed");
|
|
18
18
|
}, async (path, directory, mode) => {
|
|
19
|
-
if (directory)
|
|
19
|
+
if (directory) {
|
|
20
20
|
await sandbox.fs.createFolder(path, mode.toString(8));
|
|
21
|
-
|
|
22
|
-
const result = await sandbox.process.executeCommand(`chmod ${mode.toString(8)} ${quote(path)}`);
|
|
23
|
-
if (result.exitCode !== 0)
|
|
24
|
-
throw new OutpostError("provider", "Transfer permissions could not be set");
|
|
21
|
+
return;
|
|
25
22
|
}
|
|
23
|
+
const result = await sandbox.process.executeCommand(`chmod ${mode.toString(8)} ${quote(path)}`);
|
|
24
|
+
if (result.exitCode !== 0)
|
|
25
|
+
throw new OutpostError("provider", "Transfer permissions could not be set");
|
|
26
26
|
}, signal);
|
|
27
27
|
});
|
|
28
28
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daytona-files.js","sourceRoot":"","sources":["../../src/providers/daytona-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG5D,MAAM,UAAU,YAAY,CAC1B,OAAkC;IAElC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,EAAE;YAC5C,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACxC,MAAM,UAAU,CACd,MAAM,EACN,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;oBACtB,MAAM,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;oBAC1D,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC,EACD,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;oBACrB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,CACjD,YAAY,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,gBAAgB,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;oBACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;wBACvB,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;gBAChE,CAAC,EACD,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;oBAC9B,IAAI,SAAS;
|
|
1
|
+
{"version":3,"file":"daytona-files.js","sourceRoot":"","sources":["../../src/providers/daytona-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG5D,MAAM,UAAU,YAAY,CAC1B,OAAkC;IAElC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,EAAE;YAC5C,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACxC,MAAM,UAAU,CACd,MAAM,EACN,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;oBACtB,MAAM,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;oBAC1D,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC,EACD,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;oBACrB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,CACjD,YAAY,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,gBAAgB,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;oBACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;wBACvB,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;gBAChE,CAAC,EACD,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;oBAC9B,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;wBACtD,OAAO;oBACT,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,CACjD,SAAS,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAC3C,CAAC;oBACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;wBACvB,MAAM,IAAI,YAAY,CACpB,UAAU,EACV,uCAAuC,CACxC,CAAC;gBACN,CAAC,EACD,MAAM,CACP,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,EAAE;YAC9C,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,CAClD,WAAW,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CACpD,CAAC;gBACF,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC;oBACxB,MAAM,IAAI,YAAY,CACpB,UAAU,EACV,uCAAuC,CACxC,CAAC;gBACJ,MAAM,YAAY,CAChB,MAAM,EACN,WAAW,EACX,OAAO,CAAC,MAAM,EACd,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EACvC,MAAM,CACP,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { posix } from \"node:path\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport type { SandboxLease } from \"../domain/sandbox.types.ts\";\nimport { quote } from \"../infrastructure/process.ts\";\nimport { transfer } from \"../infrastructure/transfer.ts\";\nimport { manifestScript } from \"./cloud-files.constants.ts\";\nimport { downloadTree, uploadTree } from \"./cloud-files.ts\";\nimport type { DaytonaRuntime } from \"./daytona.types.ts\";\n\nexport function daytonaFiles(\n sandbox: DaytonaRuntime[\"sandbox\"],\n): Pick<SandboxLease, \"upload\" | \"download\"> {\n return {\n async upload(source, destination, options = {}) {\n return transfer(options, async (signal) => {\n await uploadTree(\n source,\n destination,\n async (path, content) => {\n await sandbox.fs.createFolder(posix.dirname(path), \"755\");\n await sandbox.fs.uploadFile(content, path);\n },\n async (target, path) => {\n const result = await sandbox.process.executeCommand(\n `mkdir -p ${quote(posix.dirname(path))} && ln -s -- ${quote(target)} ${quote(path)}`,\n );\n if (result.exitCode !== 0)\n throw new OutpostError(\"provider\", \"Symlink upload failed\");\n },\n async (path, directory, mode) => {\n if (directory) {\n await sandbox.fs.createFolder(path, mode.toString(8));\n return;\n }\n const result = await sandbox.process.executeCommand(\n `chmod ${mode.toString(8)} ${quote(path)}`,\n );\n if (result.exitCode !== 0)\n throw new OutpostError(\n \"provider\",\n \"Transfer permissions could not be set\",\n );\n },\n signal,\n );\n });\n },\n async download(source, destination, options = {}) {\n return transfer(options, async (signal) => {\n const listing = await sandbox.process.executeCommand(\n `node -e ${quote(manifestScript)} ${quote(source)}`,\n );\n if (listing.exitCode !== 0)\n throw new OutpostError(\n \"provider\",\n \"Remote transfer source is unavailable\",\n );\n await downloadTree(\n source,\n destination,\n listing.result,\n (path) => sandbox.fs.downloadFile(path),\n signal,\n );\n });\n },\n };\n}\n"]}
|
|
@@ -3,16 +3,24 @@ import { daytonaOutputPrefix } from "./daytona-command.constants.js";
|
|
|
3
3
|
export function daytonaOutput(emit) {
|
|
4
4
|
const decoder = new StringDecoder("utf8");
|
|
5
5
|
let pending = "";
|
|
6
|
+
let raw = false;
|
|
6
7
|
return {
|
|
7
8
|
write(chunk) {
|
|
8
9
|
pending += chunk;
|
|
9
10
|
while (pending) {
|
|
11
|
+
if (raw) {
|
|
12
|
+
const end = pending.indexOf("\n");
|
|
13
|
+
const length = end === -1 ? pending.length : end + 1;
|
|
14
|
+
emit(pending.slice(0, length));
|
|
15
|
+
pending = pending.slice(length);
|
|
16
|
+
raw = end === -1;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
10
19
|
if (daytonaOutputPrefix.startsWith(pending))
|
|
11
20
|
return;
|
|
12
21
|
if (!pending.startsWith(daytonaOutputPrefix)) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return;
|
|
22
|
+
raw = true;
|
|
23
|
+
continue;
|
|
16
24
|
}
|
|
17
25
|
const end = pending.indexOf("\n");
|
|
18
26
|
if (end === -1)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daytona-output.js","sourceRoot":"","sources":["../../src/providers/daytona-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,UAAU,aAAa,CAAC,IAA4B;IACxD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,OAAO;QACL,KAAK,CAAC,KAAa;YACjB,OAAO,IAAI,KAAK,CAAC;YACjB,OAAO,OAAO,EAAE,CAAC;gBACf,IAAI,
|
|
1
|
+
{"version":3,"file":"daytona-output.js","sourceRoot":"","sources":["../../src/providers/daytona-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,UAAU,aAAa,CAAC,IAA4B;IACxD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,OAAO;QACL,KAAK,CAAC,KAAa;YACjB,OAAO,IAAI,KAAK,CAAC;YACjB,OAAO,OAAO,EAAE,CAAC;gBACf,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAClC,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;oBACrD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC/B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAChC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;oBACjB,SAAS;gBACX,CAAC;gBACD,IAAI,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC;oBAAE,OAAO;gBACpD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC7C,GAAG,GAAG,IAAI,CAAC;oBACX,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,OAAO;gBACvB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC3D,IAAI,IAAI;oBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,KAAK;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC3B,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { StringDecoder } from \"node:string_decoder\";\nimport { daytonaOutputPrefix } from \"./daytona-command.constants.ts\";\n\nexport function daytonaOutput(emit: (text: string) => void) {\n const decoder = new StringDecoder(\"utf8\");\n let pending = \"\";\n let raw = false;\n return {\n write(chunk: string) {\n pending += chunk;\n while (pending) {\n if (raw) {\n const end = pending.indexOf(\"\\n\");\n const length = end === -1 ? pending.length : end + 1;\n emit(pending.slice(0, length));\n pending = pending.slice(length);\n raw = end === -1;\n continue;\n }\n if (daytonaOutputPrefix.startsWith(pending)) return;\n if (!pending.startsWith(daytonaOutputPrefix)) {\n raw = true;\n continue;\n }\n const end = pending.indexOf(\"\\n\");\n if (end === -1) return;\n const payload = pending.slice(daytonaOutputPrefix.length, end);\n const text = decoder.write(Buffer.from(payload, \"base64\"));\n if (text) emit(text);\n pending = pending.slice(end + 1);\n }\n },\n close() {\n const text = decoder.end();\n if (text) emit(text);\n if (pending) emit(pending);\n pending = \"\";\n },\n };\n}\n"]}
|
|
@@ -26,15 +26,17 @@ export function createDaytonaSandboxProvider(options = {}, connect = async (conf
|
|
|
26
26
|
let closed = false, releasing;
|
|
27
27
|
let saveCaches = async () => { };
|
|
28
28
|
let unregister = () => { };
|
|
29
|
-
const release = () =>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
29
|
+
const release = () => closed
|
|
30
|
+
? Promise.resolve()
|
|
31
|
+
: (releasing ??= releaseCloudSandbox(() => saveCaches(), async () => {
|
|
32
|
+
await client.delete(sandbox);
|
|
33
|
+
closed = true;
|
|
34
|
+
unregister();
|
|
35
|
+
}).catch((error) => {
|
|
36
|
+
if (!closed)
|
|
37
|
+
releasing = undefined;
|
|
38
|
+
throw error;
|
|
39
|
+
}));
|
|
38
40
|
unregister = registerCleanup(release);
|
|
39
41
|
let home;
|
|
40
42
|
let root;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daytona.js","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAMnE,MAAM,UAAU,4BAA4B,CAC1C,UAA0B,EAAE,EAC5B,UAEmD,KAAK,EAAE,MAAM,EAAE,EAAE,CAClE,IAAI,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAEpD,SAAS,CACP,OAAO,CAAC,cAAc,KAAK,SAAS;QAClC,OAAO,CAAC,cAAc,KAAK,UAAU,EACvC,yCAAyC,CAC1C,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;IACrE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IACvD,OAAO,yBAAyB,CAAC;QAC/B,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE;QACnC,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACnD,IAAI,MAAM,GAAG,KAAK,EAChB,SAAoC,CAAC;YACvC,IAAI,UAAU,GAAwB,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;YACrD,IAAI,UAAU,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,GAAG,EAAE,CACnB,CAAC,SAAS,KAAK,mBAAmB,CAChC,GAAG,EAAE,CAAC,UAAU,EAAE,EAClB,KAAK,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"daytona.js","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n prepareCloudCaches,\n validateCloudCaches,\n releaseCloudSandbox,\n} from \"./cloud-cache.ts\";\nimport type { Daytona, DaytonaConfig } from \"@daytona/sdk\";\nimport { posix } from \"node:path\";\nimport { invariant } from \"../domain/errors.ts\";\nimport type { SandboxProvider } from \"../domain/sandbox.types.ts\";\nimport { fileBatches } from \"./file-batches.ts\";\nimport { registerCleanup } from \"../infrastructure/shutdown.ts\";\nimport { cloudRoots } from \"./cloud.constants.ts\";\nimport {\n daytonaNetworkPolicy,\n confirmDaytonaNetworkPolicy,\n} from \"./daytona-network.ts\";\nimport { daytonaCommand } from \"./daytona-command.ts\";\nimport { daytonaFiles } from \"./daytona-files.ts\";\nimport type { DaytonaOptions } from \"./daytona.types.ts\";\nimport { withTransferredWorkspaces } from \"./workspace-context.ts\";\n\nexport type { CloudDependencyCache } from \"./cloud-cache.types.ts\";\n\nexport type { DaytonaOptions } from \"./daytona.types.ts\";\n\nexport function createDaytonaSandboxProvider(\n options: DaytonaOptions = {},\n connect: (\n config?: DaytonaConfig,\n ) => Promise<Pick<Daytona, \"create\" | \"delete\">> = async (config) =>\n new (await import(\"@daytona/sdk\")).Daytona(config),\n): SandboxProvider {\n invariant(\n options.repositoryMode === undefined ||\n options.repositoryMode === \"isolated\",\n \"Daytona repositoryMode must be isolated\",\n );\n const caches = (options.caches ?? []).map((cache) => ({ ...cache }));\n validateCloudCaches(caches);\n const networkPolicy = daytonaNetworkPolicy(options);\n const create = { ...options.create, ...networkPolicy };\n return withTransferredWorkspaces({\n name: \"daytona\",\n placement: \"remote\",\n variables: { ...options.variables },\n async acquire(context) {\n context.signal?.throwIfAborted();\n const client = await connect(options.connection);\n const sandbox = await client.create({ ...create });\n let closed = false,\n releasing: Promise<void> | undefined;\n let saveCaches: () => Promise<void> = async () => {};\n let unregister = () => {};\n const release = () =>\n closed\n ? Promise.resolve()\n : (releasing ??= releaseCloudSandbox(\n () => saveCaches(),\n async () => {\n await client.delete(sandbox);\n closed = true;\n unregister();\n },\n ).catch((error) => {\n if (!closed) releasing = undefined;\n throw error;\n }));\n unregister = registerCleanup(release);\n let home: string;\n let root: string;\n try {\n context.signal?.throwIfAborted();\n if (networkPolicy) {\n await confirmDaytonaNetworkPolicy(sandbox, networkPolicy);\n context.signal?.throwIfAborted();\n }\n home = (await sandbox.getUserHomeDir()) ?? cloudRoots.daytonaHome;\n root = options.root ?? posix.join(home, \"outpost\");\n await sandbox.fs.createFolder(root, \"755\");\n } catch (cause) {\n try {\n await release();\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Cloud setup and cleanup failed\",\n );\n }\n throw cause;\n }\n const lease = {\n root,\n home,\n invoke: daytonaCommand({\n sandbox,\n root,\n options,\n context,\n isClosed: () => closed,\n }),\n ...daytonaFiles(sandbox),\n release,\n };\n try {\n saveCaches = await prepareCloudCaches(\n lease,\n caches,\n context,\n JSON.stringify([\n \"daytona\",\n \"image\" in create ? create.image : null,\n \"snapshot\" in create ? create.snapshot : null,\n ]),\n );\n } catch (cause) {\n try {\n await release();\n } catch (cleanup) {\n throw new AggregateError(\n [cause, cleanup],\n \"Cloud cache setup and cleanup failed\",\n );\n }\n throw cause;\n }\n return { ...lease, liveInput: true, fileTransfers: fileBatches(lease) };\n },\n });\n}\n\nexport type { EgressPolicy } from \"../domain/egress.types.ts\";\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { isIP } from "node:net";
|
|
2
|
+
export function egressAddress(address) {
|
|
3
|
+
const family = isIP(address);
|
|
4
|
+
if (family !== 6)
|
|
5
|
+
return { address, family };
|
|
6
|
+
const canonical = new URL(`http://[${address}]/`).hostname;
|
|
7
|
+
const mapped = /^\[::ffff:([a-f0-9]+):([a-f0-9]+)\]$/.exec(canonical);
|
|
8
|
+
if (!mapped)
|
|
9
|
+
return { address, family };
|
|
10
|
+
const high = Number.parseInt(mapped[1], 16);
|
|
11
|
+
const low = Number.parseInt(mapped[2], 16);
|
|
12
|
+
return {
|
|
13
|
+
address: `${high >> 8}.${high & 255}.${low >> 8}.${low & 255}`,
|
|
14
|
+
family: 4,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function egressCidr(value) {
|
|
18
|
+
const [address, prefix] = value.split("/");
|
|
19
|
+
const normalized = egressAddress(address);
|
|
20
|
+
if (isIP(address) !== 6 || normalized.family !== 4)
|
|
21
|
+
return value;
|
|
22
|
+
if (Number(prefix) < 96)
|
|
23
|
+
throw new Error("IPv4-mapped CIDRs require a prefix of at least 96");
|
|
24
|
+
return `${normalized.address}/${Number(prefix) - 96}`;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/providers/egress/address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGhC,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC;IAC3D,MAAM,MAAM,GAAG,sCAAsC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,OAAO;QACL,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE;QAC9D,MAAM,EAAE,CAAC;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,OAAQ,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,OAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,OAAO,GAAG,UAAU,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;AACxD,CAAC","sourcesContent":["import { isIP } from \"node:net\";\nimport type { EgressAddress } from \"./egress.types.ts\";\n\nexport function egressAddress(address: string): EgressAddress {\n const family = isIP(address);\n if (family !== 6) return { address, family };\n const canonical = new URL(`http://[${address}]/`).hostname;\n const mapped = /^\\[::ffff:([a-f0-9]+):([a-f0-9]+)\\]$/.exec(canonical);\n if (!mapped) return { address, family };\n const high = Number.parseInt(mapped[1]!, 16);\n const low = Number.parseInt(mapped[2]!, 16);\n return {\n address: `${high >> 8}.${high & 255}.${low >> 8}.${low & 255}`,\n family: 4,\n };\n}\n\nexport function egressCidr(value: string): string {\n const [address, prefix] = value.split(\"/\");\n const normalized = egressAddress(address!);\n if (isIP(address!) !== 6 || normalized.family !== 4) return value;\n if (Number(prefix) < 96)\n throw new Error(\"IPv4-mapped CIDRs require a prefix of at least 96\");\n return `${normalized.address}/${Number(prefix) - 96}`;\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const egressRuntime: Readonly<{
|
|
2
|
+
version: 1;
|
|
3
|
+
uid: 65532;
|
|
4
|
+
port: 18080;
|
|
5
|
+
ready: "/run/outpost/ready";
|
|
6
|
+
maxHelloBytes: 65536;
|
|
7
|
+
maxHelloRecords: 32;
|
|
8
|
+
maxHeaderBytes: 16384;
|
|
9
|
+
maxConnections: 256;
|
|
10
|
+
connectMs: 10000;
|
|
11
|
+
idleMs: 120000;
|
|
12
|
+
heartbeatMs: 1000;
|
|
13
|
+
}>;
|
|
14
|
+
export declare const egressVariables: Readonly<{
|
|
15
|
+
HTTP_PROXY: "http://127.0.0.1:18080";
|
|
16
|
+
HTTPS_PROXY: "http://127.0.0.1:18080";
|
|
17
|
+
http_proxy: "http://127.0.0.1:18080";
|
|
18
|
+
https_proxy: "http://127.0.0.1:18080";
|
|
19
|
+
NO_PROXY: "localhost,127.0.0.1,::1";
|
|
20
|
+
no_proxy: "localhost,127.0.0.1,::1";
|
|
21
|
+
NODE_USE_ENV_PROXY: "1";
|
|
22
|
+
}>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const egressRuntime = Object.freeze({
|
|
2
|
+
version: 1,
|
|
3
|
+
uid: 65532,
|
|
4
|
+
port: 18080,
|
|
5
|
+
ready: "/run/outpost/ready",
|
|
6
|
+
maxHelloBytes: 65_536,
|
|
7
|
+
maxHelloRecords: 32,
|
|
8
|
+
maxHeaderBytes: 16_384,
|
|
9
|
+
maxConnections: 256,
|
|
10
|
+
connectMs: 10_000,
|
|
11
|
+
idleMs: 120_000,
|
|
12
|
+
heartbeatMs: 1_000,
|
|
13
|
+
});
|
|
14
|
+
export const egressVariables = Object.freeze({
|
|
15
|
+
HTTP_PROXY: "http://127.0.0.1:18080",
|
|
16
|
+
HTTPS_PROXY: "http://127.0.0.1:18080",
|
|
17
|
+
http_proxy: "http://127.0.0.1:18080",
|
|
18
|
+
https_proxy: "http://127.0.0.1:18080",
|
|
19
|
+
NO_PROXY: "localhost,127.0.0.1,::1",
|
|
20
|
+
no_proxy: "localhost,127.0.0.1,::1",
|
|
21
|
+
NODE_USE_ENV_PROXY: "1",
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=egress.constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"egress.constants.js","sourceRoot":"","sources":["../../../src/providers/egress/egress.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC;IACV,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;IACX,KAAK,EAAE,oBAAoB;IAC3B,aAAa,EAAE,MAAM;IACrB,eAAe,EAAE,EAAE;IACnB,cAAc,EAAE,MAAM;IACtB,cAAc,EAAE,GAAG;IACnB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,OAAO;IACf,WAAW,EAAE,KAAK;CACnB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,wBAAwB;IACpC,WAAW,EAAE,wBAAwB;IACrC,UAAU,EAAE,wBAAwB;IACpC,WAAW,EAAE,wBAAwB;IACrC,QAAQ,EAAE,yBAAyB;IACnC,QAAQ,EAAE,yBAAyB;IACnC,kBAAkB,EAAE,GAAG;CACxB,CAAC,CAAC","sourcesContent":["export const egressRuntime = Object.freeze({\n version: 1,\n uid: 65532,\n port: 18080,\n ready: \"/run/outpost/ready\",\n maxHelloBytes: 65_536,\n maxHelloRecords: 32,\n maxHeaderBytes: 16_384,\n maxConnections: 256,\n connectMs: 10_000,\n idleMs: 120_000,\n heartbeatMs: 1_000,\n});\n\nexport const egressVariables = Object.freeze({\n HTTP_PROXY: \"http://127.0.0.1:18080\",\n HTTPS_PROXY: \"http://127.0.0.1:18080\",\n http_proxy: \"http://127.0.0.1:18080\",\n https_proxy: \"http://127.0.0.1:18080\",\n NO_PROXY: \"localhost,127.0.0.1,::1\",\n no_proxy: \"localhost,127.0.0.1,::1\",\n NODE_USE_ENV_PROXY: \"1\",\n});\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { EgressPolicy } from "../../domain/egress.types.ts";
|
|
2
|
+
export type Allowlist = Extract<EgressPolicy, {
|
|
3
|
+
mode: "allowlist";
|
|
4
|
+
}>;
|
|
5
|
+
export interface EgressAddress {
|
|
6
|
+
readonly address: string;
|
|
7
|
+
readonly family: number;
|
|
8
|
+
}
|
|
9
|
+
export interface EgressResolver {
|
|
10
|
+
(hostname: string): Promise<readonly EgressAddress[]>;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"egress.types.js","sourceRoot":"","sources":["../../../src/providers/egress/egress.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { EgressPolicy } from \"../../domain/egress.types.ts\";\n\nexport type Allowlist = Extract<EgressPolicy, { mode: \"allowlist\" }>;\nexport interface EgressAddress {\n readonly address: string;\n readonly family: number;\n}\nexport interface EgressResolver {\n (hostname: string): Promise<readonly EgressAddress[]>;\n}\n"]}
|