@elie-laloum/outpost 4.2.0 → 6.0.1
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 +56 -0
- package/README.md +13 -11
- package/SECURITY.md +2 -0
- package/dist/adapters/agents/antigravity-adapter.d.ts +3 -0
- package/dist/adapters/agents/antigravity-adapter.js +39 -0
- package/dist/adapters/agents/antigravity-adapter.js.map +1 -0
- package/dist/adapters/agents/antigravity-authentication.d.ts +2 -0
- package/dist/adapters/agents/antigravity-authentication.js +27 -0
- package/dist/adapters/agents/antigravity-authentication.js.map +1 -0
- package/dist/adapters/agents/antigravity-diagnostics.d.ts +1 -0
- package/dist/adapters/agents/antigravity-diagnostics.js +6 -0
- package/dist/adapters/agents/antigravity-diagnostics.js.map +1 -0
- package/dist/adapters/agents/antigravity-events.d.ts +2 -0
- package/dist/adapters/agents/antigravity-events.js +66 -0
- package/dist/adapters/agents/antigravity-events.js.map +1 -0
- package/dist/adapters/agents/antigravity-request.d.ts +5 -0
- package/dist/adapters/agents/antigravity-request.js +29 -0
- package/dist/adapters/agents/antigravity-request.js.map +1 -0
- package/dist/adapters/agents/antigravity.types.d.ts +7 -0
- package/dist/adapters/agents/antigravity.types.js +2 -0
- package/dist/adapters/agents/antigravity.types.js.map +1 -0
- package/dist/adapters/agents/authentication.constants.d.ts +23 -0
- package/dist/adapters/agents/authentication.constants.js +13 -0
- package/dist/adapters/agents/authentication.constants.js.map +1 -0
- package/dist/adapters/agents/authentication.d.ts +11 -0
- package/dist/adapters/agents/authentication.js +75 -0
- package/dist/adapters/agents/authentication.js.map +1 -0
- package/dist/adapters/agents/authentication.types.d.ts +20 -0
- package/dist/adapters/agents/authentication.types.js +2 -0
- package/dist/adapters/agents/authentication.types.js.map +1 -0
- package/dist/adapters/agents/claude-adapter.d.ts +2 -2
- package/dist/adapters/agents/claude-adapter.js +32 -2
- package/dist/adapters/agents/claude-adapter.js.map +1 -1
- package/dist/adapters/agents/claude-authentication.d.ts +2 -0
- package/dist/adapters/agents/claude-authentication.js +34 -0
- package/dist/adapters/agents/claude-authentication.js.map +1 -0
- package/dist/adapters/agents/claude-request.d.ts +2 -2
- package/dist/adapters/agents/claude-request.js +3 -3
- package/dist/adapters/agents/claude-request.js.map +1 -1
- package/dist/adapters/agents/cli-diagnostics.constants.d.ts +6 -6
- package/dist/adapters/agents/cli-diagnostics.constants.js +6 -6
- package/dist/adapters/agents/cli-diagnostics.constants.js.map +1 -1
- package/dist/adapters/agents/cli-diagnostics.d.ts +1 -0
- package/dist/adapters/agents/cli-diagnostics.js +11 -0
- package/dist/adapters/agents/cli-diagnostics.js.map +1 -1
- package/dist/adapters/agents/codex-adapter.d.ts +2 -2
- package/dist/adapters/agents/codex-adapter.js +19 -1
- package/dist/adapters/agents/codex-adapter.js.map +1 -1
- package/dist/adapters/agents/codex-authentication.d.ts +3 -0
- package/dist/adapters/agents/codex-authentication.js +47 -0
- package/dist/adapters/agents/codex-authentication.js.map +1 -0
- package/dist/adapters/agents/codex-provider.d.ts +2 -2
- package/dist/adapters/agents/codex-provider.js +1 -1
- package/dist/adapters/agents/codex-provider.js.map +1 -1
- package/dist/adapters/agents/codex-request.d.ts +2 -2
- package/dist/adapters/agents/codex-request.js +3 -3
- package/dist/adapters/agents/codex-request.js.map +1 -1
- package/dist/adapters/agents/copilot-adapter.d.ts +3 -0
- package/dist/adapters/agents/copilot-adapter.js +39 -0
- package/dist/adapters/agents/copilot-adapter.js.map +1 -0
- package/dist/adapters/agents/copilot-authentication.d.ts +2 -0
- package/dist/adapters/agents/copilot-authentication.js +45 -0
- package/dist/adapters/agents/copilot-authentication.js.map +1 -0
- package/dist/adapters/agents/copilot-diagnostics.d.ts +1 -0
- package/dist/adapters/agents/copilot-diagnostics.js +6 -0
- package/dist/adapters/agents/copilot-diagnostics.js.map +1 -0
- package/dist/adapters/agents/copilot-events.d.ts +2 -0
- package/dist/adapters/agents/copilot-events.js +50 -0
- package/dist/adapters/agents/copilot-events.js.map +1 -0
- package/dist/adapters/agents/copilot-request.d.ts +5 -0
- package/dist/adapters/agents/copilot-request.js +19 -0
- package/dist/adapters/agents/copilot-request.js.map +1 -0
- package/dist/adapters/agents/copilot.types.d.ts +6 -0
- package/dist/adapters/agents/copilot.types.js +2 -0
- package/dist/adapters/agents/copilot.types.js.map +1 -0
- package/dist/adapters/agents/event-decoder.d.ts +2 -2
- package/dist/adapters/agents/event-decoder.js +6 -5
- package/dist/adapters/agents/event-decoder.js.map +1 -1
- package/dist/adapters/agents/kimi-adapter.d.ts +3 -0
- package/dist/adapters/agents/kimi-adapter.js +35 -0
- package/dist/adapters/agents/kimi-adapter.js.map +1 -0
- package/dist/adapters/agents/kimi-authentication.d.ts +2 -0
- package/dist/adapters/agents/kimi-authentication.js +48 -0
- package/dist/adapters/agents/kimi-authentication.js.map +1 -0
- package/dist/adapters/agents/kimi-diagnostics.d.ts +1 -0
- package/dist/adapters/agents/kimi-diagnostics.js +6 -0
- package/dist/adapters/agents/kimi-diagnostics.js.map +1 -0
- package/dist/adapters/agents/kimi-events.d.ts +2 -0
- package/dist/adapters/agents/kimi-events.js +51 -0
- package/dist/adapters/agents/kimi-events.js.map +1 -0
- package/dist/adapters/agents/kimi-request.d.ts +5 -0
- package/dist/adapters/agents/kimi-request.js +28 -0
- package/dist/adapters/agents/kimi-request.js.map +1 -0
- package/dist/adapters/agents/kimi.types.d.ts +6 -0
- package/dist/adapters/agents/kimi.types.js +2 -0
- package/dist/adapters/agents/kimi.types.js.map +1 -0
- package/dist/adapters/agents/model-support.constants.d.ts +8 -0
- package/dist/adapters/agents/model-support.constants.js +28 -0
- package/dist/adapters/agents/model-support.constants.js.map +1 -0
- package/dist/adapters/agents/model-support.d.ts +4 -0
- package/dist/adapters/agents/model-support.js +11 -0
- package/dist/adapters/agents/model-support.js.map +1 -0
- package/dist/adapters/agents/protocol-fixtures.constants.d.ts +2 -2
- package/dist/adapters/agents/protocol-fixtures.constants.js +135 -9
- package/dist/adapters/agents/protocol-fixtures.constants.js.map +1 -1
- package/dist/adapters/agents/protocol-fixtures.types.d.ts +1 -0
- package/dist/adapters/agents/protocol-fixtures.types.js.map +1 -1
- package/dist/adapters/agents/protocol.d.ts +1 -0
- package/dist/adapters/agents/protocol.js +9 -0
- package/dist/adapters/agents/protocol.js.map +1 -1
- package/dist/adapters/agents/settings.types.d.ts +11 -3
- package/dist/adapters/agents/settings.types.js.map +1 -1
- package/dist/adapters/models/anthropic-model-provider.constants.d.ts +3 -0
- package/dist/adapters/models/anthropic-model-provider.constants.js +17 -0
- package/dist/adapters/models/anthropic-model-provider.constants.js.map +1 -0
- package/dist/adapters/models/anthropic-model-provider.d.ts +3 -0
- package/dist/adapters/models/anthropic-model-provider.js +31 -0
- package/dist/adapters/models/anthropic-model-provider.js.map +1 -0
- package/dist/adapters/models/anthropic-model-provider.types.d.ts +7 -0
- package/dist/adapters/models/anthropic-model-provider.types.js +2 -0
- package/dist/adapters/models/anthropic-model-provider.types.js.map +1 -0
- package/dist/adapters/models/anthropic-request.d.ts +4 -0
- package/dist/adapters/models/anthropic-request.js +81 -0
- package/dist/adapters/models/anthropic-request.js.map +1 -0
- package/dist/adapters/models/anthropic-response.d.ts +3 -0
- package/dist/adapters/models/anthropic-response.js +55 -0
- package/dist/adapters/models/anthropic-response.js.map +1 -0
- package/dist/adapters/models/anthropic-stream.d.ts +2 -0
- package/dist/adapters/models/anthropic-stream.js +96 -0
- package/dist/adapters/models/anthropic-stream.js.map +1 -0
- package/dist/adapters/models/http-provider.d.ts +3 -0
- package/dist/adapters/models/http-provider.js +113 -0
- package/dist/adapters/models/http-provider.js.map +1 -0
- package/dist/adapters/models/{openai-http.js → model-http.js} +1 -1
- package/dist/adapters/models/model-http.js.map +1 -0
- package/dist/adapters/models/model-protocol.types.d.ts +41 -0
- package/dist/adapters/models/model-protocol.types.js +2 -0
- package/dist/adapters/models/model-protocol.types.js.map +1 -0
- package/dist/adapters/models/model-request.d.ts +2 -0
- package/dist/adapters/models/model-request.js +18 -0
- package/dist/adapters/models/model-request.js.map +1 -0
- package/dist/adapters/models/model-response.d.ts +7 -0
- package/dist/adapters/models/model-response.js +41 -0
- package/dist/adapters/models/model-response.js.map +1 -0
- package/dist/adapters/models/{openai-compatible.constants.js → model.constants.js} +6 -1
- package/dist/adapters/models/model.constants.js.map +1 -0
- package/dist/adapters/models/openai-chat-stream.d.ts +2 -0
- package/dist/adapters/models/openai-chat-stream.js +66 -0
- package/dist/adapters/models/openai-chat-stream.js.map +1 -0
- package/dist/adapters/models/openai-chat.d.ts +4 -0
- package/dist/adapters/models/openai-chat.js +108 -0
- package/dist/adapters/models/openai-chat.js.map +1 -0
- package/dist/adapters/models/openai-model-provider.d.ts +3 -0
- package/dist/adapters/models/openai-model-provider.js +13 -0
- package/dist/adapters/models/openai-model-provider.js.map +1 -0
- package/dist/adapters/models/openai-model-provider.types.d.ts +4 -0
- package/dist/adapters/models/openai-model-provider.types.js +2 -0
- package/dist/adapters/models/openai-model-provider.types.js.map +1 -0
- package/dist/adapters/models/openai-protocols.d.ts +2 -0
- package/dist/adapters/models/openai-protocols.js +22 -0
- package/dist/adapters/models/openai-protocols.js.map +1 -0
- package/dist/adapters/models/openai-responses-stream.d.ts +2 -0
- package/dist/adapters/models/openai-responses-stream.js +35 -0
- package/dist/adapters/models/openai-responses-stream.js.map +1 -0
- package/dist/adapters/models/openai-responses.d.ts +4 -0
- package/dist/adapters/models/openai-responses.js +107 -0
- package/dist/adapters/models/openai-responses.js.map +1 -0
- package/dist/adapters/models/openai-usage.d.ts +3 -0
- package/dist/adapters/models/openai-usage.js +20 -0
- package/dist/adapters/models/openai-usage.js.map +1 -0
- package/dist/adapters/models/stop-reasons.constants.d.ts +4 -0
- package/dist/adapters/models/stop-reasons.constants.js +19 -0
- package/dist/adapters/models/stop-reasons.constants.js.map +1 -0
- package/dist/adapters/models/stream-events.d.ts +3 -0
- package/dist/adapters/models/stream-events.js +22 -0
- package/dist/adapters/models/stream-events.js.map +1 -0
- package/dist/adapters/tools/edit-tools.d.ts +2 -0
- package/dist/adapters/tools/edit-tools.js +84 -0
- package/dist/adapters/tools/edit-tools.js.map +1 -0
- package/dist/adapters/tools/file-tools.d.ts +2 -0
- package/dist/adapters/tools/file-tools.js +97 -0
- package/dist/adapters/tools/file-tools.js.map +1 -0
- package/dist/adapters/tools/git-tools.d.ts +2 -0
- package/dist/adapters/tools/git-tools.js +54 -0
- package/dist/adapters/tools/git-tools.js.map +1 -0
- package/dist/adapters/tools/sandbox-files.d.ts +10 -0
- package/dist/adapters/tools/sandbox-files.js +60 -0
- package/dist/adapters/tools/sandbox-files.js.map +1 -0
- package/dist/adapters/tools/search-tools.d.ts +2 -0
- package/dist/adapters/tools/search-tools.js +65 -0
- package/dist/adapters/tools/search-tools.js.map +1 -0
- package/dist/adapters/tools/shell-tools.d.ts +3 -0
- package/dist/adapters/tools/shell-tools.js +38 -0
- package/dist/adapters/tools/shell-tools.js.map +1 -0
- package/dist/adapters/tools/tools.constants.d.ts +11 -0
- package/dist/adapters/tools/tools.constants.js +17 -0
- package/dist/adapters/tools/tools.constants.js.map +1 -0
- package/dist/adapters/tools/tools.types.d.ts +41 -0
- package/dist/adapters/tools/tools.types.js +2 -0
- package/dist/adapters/tools/tools.types.js.map +1 -0
- package/dist/application/activity-watchdog.js +15 -2
- package/dist/application/activity-watchdog.js.map +1 -1
- package/dist/application/agent-authentication.d.ts +4 -0
- package/dist/application/agent-authentication.js +32 -0
- package/dist/application/agent-authentication.js.map +1 -0
- package/dist/application/agent-bootstrap.constants.d.ts +2 -5
- package/dist/application/agent-bootstrap.constants.js +29 -4
- package/dist/application/agent-bootstrap.constants.js.map +1 -1
- package/dist/application/agent-bootstrap.d.ts +2 -2
- package/dist/application/agent-bootstrap.js +35 -12
- package/dist/application/agent-bootstrap.js.map +1 -1
- package/dist/application/agent-bootstrap.types.d.ts +20 -0
- package/dist/application/agent-bootstrap.types.js +2 -0
- package/dist/application/agent-bootstrap.types.js.map +1 -0
- package/dist/application/agent-storage.d.ts +3 -2
- package/dist/application/agent-storage.js +9 -2
- package/dist/application/agent-storage.js.map +1 -1
- package/dist/application/agent-turn.d.ts +3 -3
- package/dist/application/agent-turn.js +7 -1
- package/dist/application/agent-turn.js.map +1 -1
- package/dist/application/attach.js +1 -0
- package/dist/application/attach.js.map +1 -1
- package/dist/application/credential-installer.constants.d.ts +1 -0
- package/dist/application/credential-installer.constants.js +22 -0
- package/dist/application/credential-installer.constants.js.map +1 -0
- package/dist/application/custom-turn.d.ts +5 -0
- package/dist/application/custom-turn.js +190 -0
- package/dist/application/custom-turn.js.map +1 -0
- package/dist/application/dispatch-observation.d.ts +3 -0
- package/dist/application/dispatch-observation.js +51 -0
- package/dist/application/dispatch-observation.js.map +1 -0
- package/dist/application/dispatch-observation.types.d.ts +5 -0
- package/dist/application/dispatch-observation.types.js +2 -0
- package/dist/application/dispatch-observation.types.js.map +1 -0
- package/dist/application/dispatch-validation.d.ts +2 -2
- package/dist/application/dispatch-validation.js.map +1 -1
- package/dist/application/dispatch.js +8 -3
- package/dist/application/dispatch.js.map +1 -1
- package/dist/application/doctor-agent.constants.d.ts +2 -8
- package/dist/application/doctor-agent.constants.js +40 -6
- package/dist/application/doctor-agent.constants.js.map +1 -1
- package/dist/application/doctor-agent.d.ts +2 -1
- package/dist/application/doctor-agent.js +11 -3
- package/dist/application/doctor-agent.js.map +1 -1
- package/dist/application/doctor-image.js +7 -9
- package/dist/application/doctor-image.js.map +1 -1
- package/dist/application/doctor-protocol.js +6 -6
- package/dist/application/doctor-protocol.js.map +1 -1
- package/dist/application/doctor-protocol.types.d.ts +1 -1
- package/dist/application/doctor-protocol.types.js.map +1 -1
- package/dist/application/doctor-sandbox.js +6 -9
- package/dist/application/doctor-sandbox.js.map +1 -1
- package/dist/application/doctor-sandbox.types.d.ts +2 -2
- package/dist/application/doctor-sandbox.types.js.map +1 -1
- package/dist/application/doctor.constants.d.ts +1 -1
- package/dist/application/doctor.constants.js +1 -1
- package/dist/application/doctor.constants.js.map +1 -1
- package/dist/application/doctor.js +12 -13
- package/dist/application/doctor.js.map +1 -1
- package/dist/application/doctor.types.d.ts +12 -4
- package/dist/application/doctor.types.js.map +1 -1
- package/dist/application/execution.d.ts +2 -2
- package/dist/application/execution.js +1 -1
- package/dist/application/execution.js.map +1 -1
- package/dist/application/execution.types.d.ts +9 -2
- package/dist/application/execution.types.js.map +1 -1
- package/dist/application/harness-context.d.ts +2 -0
- package/dist/application/harness-context.js +54 -0
- package/dist/application/harness-context.js.map +1 -0
- package/dist/application/harness-history.d.ts +3 -0
- package/dist/application/harness-history.js +17 -0
- package/dist/application/harness-history.js.map +1 -0
- package/dist/application/harness-hooks.d.ts +9 -0
- package/dist/application/harness-hooks.js +90 -0
- package/dist/application/harness-hooks.js.map +1 -0
- package/dist/application/harness-loop.d.ts +2 -0
- package/dist/application/harness-loop.js +132 -0
- package/dist/application/harness-loop.js.map +1 -0
- package/dist/application/harness.types.d.ts +55 -0
- package/dist/application/harness.types.js +2 -0
- package/dist/application/harness.types.js.map +1 -0
- package/dist/application/lifecycle.constants.d.ts +1 -1
- package/dist/application/lifecycle.constants.js +1 -1
- package/dist/application/lifecycle.constants.js.map +1 -1
- package/dist/application/outpost.types.d.ts +6 -7
- package/dist/application/outpost.types.js.map +1 -1
- package/dist/application/recovery-retention.js +65 -24
- package/dist/application/recovery-retention.js.map +1 -1
- package/dist/application/remote-download.js +1 -1
- package/dist/application/remote-download.js.map +1 -1
- package/dist/application/sandbox-agents.js +14 -5
- package/dist/application/sandbox-agents.js.map +1 -1
- package/dist/application/sandbox-attach.js +5 -2
- package/dist/application/sandbox-attach.js.map +1 -1
- package/dist/application/sandbox-dispatch.js +3 -5
- package/dist/application/sandbox-dispatch.js.map +1 -1
- package/dist/application/sandbox-provision.js +13 -10
- package/dist/application/sandbox-provision.js.map +1 -1
- package/dist/application/sandbox-session.types.d.ts +13 -8
- package/dist/application/sandbox-session.types.js.map +1 -1
- package/dist/application/sandbox.js +6 -3
- package/dist/application/sandbox.js.map +1 -1
- package/dist/application/speculation.js +1 -1
- package/dist/application/speculation.js.map +1 -1
- package/dist/application/speculation.types.d.ts +3 -3
- package/dist/application/speculation.types.js.map +1 -1
- package/dist/application/startup-recovery.js +1 -1
- package/dist/application/startup-recovery.js.map +1 -1
- package/dist/application/storage-reservation.js +9 -2
- package/dist/application/storage-reservation.js.map +1 -1
- package/dist/application/tasks.types.d.ts +2 -2
- package/dist/application/tasks.types.js.map +1 -1
- package/dist/application/tool-execution.d.ts +3 -0
- package/dist/application/tool-execution.js +211 -0
- package/dist/application/tool-execution.js.map +1 -0
- package/dist/cli/commands.js +4 -2
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/doctor-command.js +11 -7
- package/dist/cli/doctor-command.js.map +1 -1
- package/dist/cli/init-authentication.d.ts +4 -1
- package/dist/cli/init-authentication.js +28 -34
- package/dist/cli/init-authentication.js.map +1 -1
- package/dist/cli/init-command.js +6 -6
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli/main.constants.d.ts +54 -17
- package/dist/cli/main.constants.js +74 -12
- package/dist/cli/main.constants.js.map +1 -1
- package/dist/cli/recovery-command.js +1 -1
- package/dist/cli/recovery-command.js.map +1 -1
- package/dist/cli/scaffold-files.js +6 -5
- package/dist/cli/scaffold-files.js.map +1 -1
- package/dist/cli/scaffold-validation.js +26 -16
- package/dist/cli/scaffold-validation.js.map +1 -1
- package/dist/cli/scaffold.constants.d.ts +0 -1
- package/dist/cli/scaffold.constants.js +5 -2
- package/dist/cli/scaffold.constants.js.map +1 -1
- package/dist/cli/scaffold.js +8 -4
- package/dist/cli/scaffold.js.map +1 -1
- package/dist/cli/scaffold.types.d.ts +9 -3
- package/dist/cli/scaffold.types.js.map +1 -1
- package/dist/cli/starters.js +8 -10
- package/dist/cli/starters.js.map +1 -1
- package/dist/domain/agent-model.d.ts +3 -0
- package/dist/domain/agent-model.js +22 -0
- package/dist/domain/agent-model.js.map +1 -0
- package/dist/domain/agent.d.ts +4 -0
- package/dist/domain/agent.js +32 -0
- package/dist/domain/agent.js.map +1 -0
- package/dist/domain/agent.types.d.ts +105 -2
- package/dist/domain/agent.types.js.map +1 -1
- package/dist/domain/authentication.constants.d.ts +3 -0
- package/dist/domain/authentication.constants.js +11 -0
- package/dist/domain/authentication.constants.js.map +1 -0
- package/dist/domain/authentication.d.ts +3 -0
- package/dist/domain/authentication.js +22 -0
- package/dist/domain/authentication.js.map +1 -0
- package/dist/domain/authentication.types.d.ts +5 -0
- package/dist/domain/authentication.types.js +2 -0
- package/dist/domain/authentication.types.js.map +1 -0
- package/dist/domain/context.constants.d.ts +7 -0
- package/dist/domain/context.constants.js +8 -0
- package/dist/domain/context.constants.js.map +1 -0
- package/dist/domain/context.d.ts +4 -0
- package/dist/domain/context.js +81 -0
- package/dist/domain/context.js.map +1 -0
- package/dist/domain/context.types.d.ts +26 -0
- package/dist/domain/context.types.js +2 -0
- package/dist/domain/context.types.js.map +1 -0
- package/dist/domain/dispatch-telemetry.types.d.ts +12 -0
- package/dist/domain/dispatch-telemetry.types.js +2 -0
- package/dist/domain/dispatch-telemetry.types.js.map +1 -0
- package/dist/domain/errors.types.d.ts +1 -1
- package/dist/domain/errors.types.js.map +1 -1
- package/dist/domain/glob.d.ts +2 -0
- package/dist/domain/glob.js +25 -0
- package/dist/domain/glob.js.map +1 -0
- package/dist/domain/glob.types.d.ts +1 -0
- package/dist/domain/glob.types.js +2 -0
- package/dist/domain/glob.types.js.map +1 -0
- package/dist/domain/harness.constants.d.ts +11 -0
- package/dist/domain/harness.constants.js +24 -0
- package/dist/domain/harness.constants.js.map +1 -0
- package/dist/domain/harness.d.ts +2 -0
- package/dist/domain/harness.js +89 -0
- package/dist/domain/harness.js.map +1 -0
- package/dist/domain/harness.types.d.ts +60 -0
- package/dist/domain/harness.types.js +2 -0
- package/dist/domain/harness.types.js.map +1 -0
- package/dist/domain/hook.constants.d.ts +3 -0
- package/dist/domain/hook.constants.js +10 -0
- package/dist/domain/hook.constants.js.map +1 -0
- package/dist/domain/hook.d.ts +3 -0
- package/dist/domain/hook.js +25 -0
- package/dist/domain/hook.js.map +1 -0
- package/dist/domain/hook.types.d.ts +66 -0
- package/dist/domain/hook.types.js +2 -0
- package/dist/domain/hook.types.js.map +1 -0
- package/dist/domain/instructions.d.ts +3 -0
- package/dist/domain/instructions.js +25 -0
- package/dist/domain/instructions.js.map +1 -0
- package/dist/domain/model-messages.d.ts +5 -0
- package/dist/domain/model-messages.js +81 -0
- package/dist/domain/model-messages.js.map +1 -0
- package/dist/domain/model-messages.types.d.ts +6 -0
- package/dist/domain/model-messages.types.js +2 -0
- package/dist/domain/model-messages.types.js.map +1 -0
- package/dist/domain/model.constants.d.ts +4 -0
- package/dist/domain/model.constants.js +16 -0
- package/dist/domain/model.constants.js.map +1 -0
- package/dist/domain/model.types.d.ts +59 -2
- package/dist/domain/model.types.js.map +1 -1
- package/dist/domain/permissions.d.ts +3 -0
- package/dist/domain/permissions.js +92 -0
- package/dist/domain/permissions.js.map +1 -0
- package/dist/domain/permissions.types.d.ts +34 -0
- package/dist/domain/permissions.types.js +2 -0
- package/dist/domain/permissions.types.js.map +1 -0
- package/dist/domain/response.js +3 -2
- package/dist/domain/response.js.map +1 -1
- package/dist/domain/response.types.d.ts +12 -0
- package/dist/domain/response.types.js.map +1 -1
- package/dist/domain/skill.constants.d.ts +2 -0
- package/dist/domain/skill.constants.js +8 -0
- package/dist/domain/skill.constants.js.map +1 -0
- package/dist/domain/skill.d.ts +8 -0
- package/dist/domain/skill.js +79 -0
- package/dist/domain/skill.js.map +1 -0
- package/dist/domain/skill.types.d.ts +18 -0
- package/dist/domain/skill.types.js +2 -0
- package/dist/domain/skill.types.js.map +1 -0
- package/dist/domain/standard-schema.d.ts +6 -0
- package/dist/domain/standard-schema.js +45 -0
- package/dist/domain/standard-schema.js.map +1 -0
- package/dist/domain/tool-schema.d.ts +3 -0
- package/dist/domain/tool-schema.js +109 -0
- package/dist/domain/tool-schema.js.map +1 -0
- package/dist/domain/tool.constants.d.ts +4 -0
- package/dist/domain/tool.constants.js +36 -0
- package/dist/domain/tool.constants.js.map +1 -0
- package/dist/domain/tool.d.ts +4 -0
- package/dist/domain/tool.js +66 -0
- package/dist/domain/tool.js.map +1 -0
- package/dist/domain/tool.types.d.ts +62 -0
- package/dist/domain/tool.types.js +2 -0
- package/dist/domain/tool.types.js.map +1 -0
- package/dist/domain/transcript.d.ts +4 -0
- package/dist/domain/transcript.js +48 -0
- package/dist/domain/transcript.js.map +1 -0
- package/dist/domain/transcript.types.d.ts +15 -0
- package/dist/domain/transcript.types.js +2 -0
- package/dist/domain/transcript.types.js.map +1 -0
- package/dist/domain/workflow/workflow-state.js +13 -6
- package/dist/domain/workflow/workflow-state.js.map +1 -1
- package/dist/domain/workflow.d.ts +1 -1
- package/dist/domain/workflow.js.map +1 -1
- package/dist/domain/workflow.types.d.ts +4 -0
- package/dist/domain/workflow.types.js.map +1 -1
- package/dist/index.d.ts +35 -13
- package/dist/index.js +19 -6
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/conversations/harness-store.d.ts +3 -0
- package/dist/infrastructure/conversations/harness-store.js +27 -0
- package/dist/infrastructure/conversations/harness-store.js.map +1 -0
- package/dist/infrastructure/conversations/harness-transcript.d.ts +2 -0
- package/dist/infrastructure/conversations/harness-transcript.js +50 -0
- package/dist/infrastructure/conversations/harness-transcript.js.map +1 -0
- package/dist/infrastructure/conversations/harness-transcript.types.d.ts +18 -0
- package/dist/infrastructure/conversations/harness-transcript.types.js +2 -0
- package/dist/infrastructure/conversations/harness-transcript.types.js.map +1 -0
- package/dist/infrastructure/conversations.d.ts +4 -1
- package/dist/infrastructure/conversations.js +3 -0
- package/dist/infrastructure/conversations.js.map +1 -1
- package/dist/infrastructure/conversations.types.d.ts +1 -0
- package/dist/infrastructure/conversations.types.js.map +1 -1
- package/dist/infrastructure/custom-reporter.d.ts +2 -0
- package/dist/infrastructure/custom-reporter.js +33 -0
- package/dist/infrastructure/custom-reporter.js.map +1 -0
- package/dist/infrastructure/custom-reporter.types.d.ts +13 -0
- package/dist/infrastructure/custom-reporter.types.js +2 -0
- package/dist/infrastructure/custom-reporter.types.js.map +1 -0
- package/dist/infrastructure/git/git.constants.d.ts +1 -1
- package/dist/infrastructure/git/git.constants.js +2 -0
- package/dist/infrastructure/git/git.constants.js.map +1 -1
- package/dist/infrastructure/host-credentials.constants.d.ts +1 -0
- package/dist/infrastructure/host-credentials.constants.js +2 -0
- package/dist/infrastructure/host-credentials.constants.js.map +1 -0
- package/dist/infrastructure/host-credentials.d.ts +4 -0
- package/dist/infrastructure/host-credentials.js +89 -0
- package/dist/infrastructure/host-credentials.js.map +1 -0
- package/dist/infrastructure/inspection-path.js +4 -3
- package/dist/infrastructure/inspection-path.js.map +1 -1
- package/dist/infrastructure/journal.constants.d.ts +1 -0
- package/dist/infrastructure/journal.constants.js +2 -0
- package/dist/infrastructure/journal.constants.js.map +1 -0
- package/dist/infrastructure/journal.js +7 -71
- package/dist/infrastructure/journal.js.map +1 -1
- package/dist/infrastructure/journal.types.d.ts +0 -2
- package/dist/infrastructure/journal.types.js.map +1 -1
- package/dist/infrastructure/local-transport.js +9 -4
- package/dist/infrastructure/local-transport.js.map +1 -1
- package/dist/infrastructure/opentelemetry-dispatch.d.ts +6 -0
- package/dist/infrastructure/opentelemetry-dispatch.js +70 -0
- package/dist/infrastructure/opentelemetry-dispatch.js.map +1 -0
- package/dist/infrastructure/opentelemetry.constants.d.ts +3 -0
- package/dist/infrastructure/opentelemetry.constants.js +3 -0
- package/dist/infrastructure/opentelemetry.constants.js.map +1 -1
- package/dist/infrastructure/opentelemetry.js +4 -0
- package/dist/infrastructure/opentelemetry.js.map +1 -1
- package/dist/infrastructure/opentelemetry.types.d.ts +3 -3
- package/dist/infrastructure/opentelemetry.types.js.map +1 -1
- package/dist/infrastructure/reporter.js +27 -2
- package/dist/infrastructure/reporter.js.map +1 -1
- package/dist/infrastructure/repository-transport.constants.d.ts +1 -0
- package/dist/infrastructure/repository-transport.constants.js +2 -0
- package/dist/infrastructure/repository-transport.constants.js.map +1 -0
- package/dist/infrastructure/repository-transport.d.ts +2 -0
- package/dist/infrastructure/repository-transport.js +9 -0
- package/dist/infrastructure/repository-transport.js.map +1 -0
- package/dist/infrastructure/resource-activity-inspection.js +22 -26
- package/dist/infrastructure/resource-activity-inspection.js.map +1 -1
- package/dist/infrastructure/resource-activity.constants.d.ts +0 -1
- package/dist/infrastructure/resource-activity.constants.js +0 -1
- package/dist/infrastructure/resource-activity.constants.js.map +1 -1
- package/dist/infrastructure/resource-activity.js +22 -85
- package/dist/infrastructure/resource-activity.js.map +1 -1
- package/dist/infrastructure/resource-activity.types.d.ts +2 -2
- package/dist/infrastructure/resource-activity.types.js.map +1 -1
- package/dist/infrastructure/settings.d.ts +1 -1
- package/dist/infrastructure/settings.js +3 -3
- package/dist/infrastructure/settings.js.map +1 -1
- package/dist/infrastructure/sse.d.ts +2 -0
- package/dist/infrastructure/sse.js +64 -0
- package/dist/infrastructure/sse.js.map +1 -0
- package/dist/infrastructure/sse.types.d.ts +4 -0
- package/dist/infrastructure/sse.types.js +2 -0
- package/dist/infrastructure/sse.types.js.map +1 -0
- package/dist/infrastructure/storage-inventory.constants.js +1 -0
- package/dist/infrastructure/storage-inventory.constants.js.map +1 -1
- package/dist/infrastructure/storage-inventory.types.d.ts +1 -1
- package/dist/infrastructure/storage-inventory.types.js.map +1 -1
- package/dist/infrastructure/storage-reservations.types.d.ts +0 -8
- package/dist/infrastructure/storage-reservations.types.js.map +1 -1
- package/dist/infrastructure/transport-conversations.d.ts +2 -2
- package/dist/infrastructure/transport-conversations.js +8 -1
- package/dist/infrastructure/transport-conversations.js.map +1 -1
- package/dist/infrastructure/transport-journal.js +2 -1
- package/dist/infrastructure/transport-journal.js.map +1 -1
- package/dist/infrastructure/transport-reservations.d.ts +1 -1
- package/dist/infrastructure/transport-reservations.js +14 -8
- package/dist/infrastructure/transport-reservations.js.map +1 -1
- package/dist/providers/agents.d.ts +9 -4
- package/dist/providers/agents.js +6 -3
- package/dist/providers/agents.js.map +1 -1
- package/dist/providers/daytona.d.ts +1 -1
- package/dist/providers/daytona.js +1 -1
- package/dist/providers/daytona.js.map +1 -1
- package/dist/providers/docker.d.ts +1 -1
- package/dist/providers/docker.js +1 -1
- package/dist/providers/docker.js.map +1 -1
- package/dist/providers/factories.d.ts +2 -2
- package/dist/providers/factories.js +3 -3
- package/dist/providers/factories.js.map +1 -1
- package/dist/providers/firecracker.d.ts +1 -1
- package/dist/providers/firecracker.js +1 -1
- package/dist/providers/firecracker.js.map +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/local.js +1 -1
- package/dist/providers/local.js.map +1 -1
- package/dist/providers/podman.d.ts +1 -1
- package/dist/providers/podman.js +1 -1
- package/dist/providers/podman.js.map +1 -1
- package/dist/providers/vercel.d.ts +1 -1
- package/dist/providers/vercel.js +1 -1
- package/dist/providers/vercel.js.map +1 -1
- package/dist/providers/versions.constants.d.ts +3 -1
- package/dist/providers/versions.constants.js +3 -1
- package/dist/providers/versions.constants.js.map +1 -1
- package/package.json +3 -3
- package/dist/adapters/agents/gemini-adapter.d.ts +0 -3
- package/dist/adapters/agents/gemini-adapter.js +0 -15
- package/dist/adapters/agents/gemini-adapter.js.map +0 -1
- package/dist/adapters/agents/gemini-diagnostics.d.ts +0 -2
- package/dist/adapters/agents/gemini-diagnostics.js +0 -15
- package/dist/adapters/agents/gemini-diagnostics.js.map +0 -1
- package/dist/adapters/agents/gemini-events.d.ts +0 -2
- package/dist/adapters/agents/gemini-events.js +0 -50
- package/dist/adapters/agents/gemini-events.js.map +0 -1
- package/dist/adapters/agents/gemini-request.d.ts +0 -4
- package/dist/adapters/agents/gemini-request.js +0 -23
- package/dist/adapters/agents/gemini-request.js.map +0 -1
- package/dist/adapters/agents/gemini.types.d.ts +0 -6
- package/dist/adapters/agents/gemini.types.js +0 -2
- package/dist/adapters/agents/gemini.types.js.map +0 -1
- package/dist/adapters/models/openai-compatible.constants.js.map +0 -1
- package/dist/adapters/models/openai-compatible.d.ts +0 -3
- package/dist/adapters/models/openai-compatible.js +0 -78
- package/dist/adapters/models/openai-compatible.js.map +0 -1
- package/dist/adapters/models/openai-compatible.types.d.ts +0 -14
- package/dist/adapters/models/openai-compatible.types.js +0 -2
- package/dist/adapters/models/openai-compatible.types.js.map +0 -1
- package/dist/adapters/models/openai-http.js.map +0 -1
- package/dist/adapters/models/openai-request.d.ts +0 -4
- package/dist/adapters/models/openai-request.js +0 -46
- package/dist/adapters/models/openai-request.js.map +0 -1
- package/dist/adapters/models/openai-response.d.ts +0 -3
- package/dist/adapters/models/openai-response.js +0 -65
- package/dist/adapters/models/openai-response.js.map +0 -1
- package/dist/cli/init-authentication.constants.d.ts +0 -13
- package/dist/cli/init-authentication.constants.js +0 -10
- package/dist/cli/init-authentication.constants.js.map +0 -1
- package/dist/infrastructure/artifact-store.d.ts +0 -3
- package/dist/infrastructure/artifact-store.js +0 -110
- package/dist/infrastructure/artifact-store.js.map +0 -1
- package/dist/infrastructure/artifact-store.types.d.ts +0 -6
- package/dist/infrastructure/artifact-store.types.js +0 -2
- package/dist/infrastructure/artifact-store.types.js.map +0 -1
- package/dist/infrastructure/journal-retention.constants.d.ts +0 -4
- package/dist/infrastructure/journal-retention.constants.js +0 -5
- package/dist/infrastructure/journal-retention.constants.js.map +0 -1
- package/dist/infrastructure/journal-retention.d.ts +0 -2
- package/dist/infrastructure/journal-retention.js +0 -51
- package/dist/infrastructure/journal-retention.js.map +0 -1
- package/dist/infrastructure/storage-mutation-lock.constants.d.ts +0 -5
- package/dist/infrastructure/storage-mutation-lock.constants.js +0 -6
- package/dist/infrastructure/storage-mutation-lock.constants.js.map +0 -1
- package/dist/infrastructure/storage-mutation-lock.d.ts +0 -1
- package/dist/infrastructure/storage-mutation-lock.js +0 -21
- package/dist/infrastructure/storage-mutation-lock.js.map +0 -1
- package/dist/infrastructure/storage-reservations.constants.d.ts +0 -4
- package/dist/infrastructure/storage-reservations.constants.js +0 -5
- package/dist/infrastructure/storage-reservations.constants.js.map +0 -1
- package/dist/infrastructure/storage-reservations.d.ts +0 -2
- package/dist/infrastructure/storage-reservations.js +0 -150
- package/dist/infrastructure/storage-reservations.js.map +0 -1
- package/dist/infrastructure/workflow-checkpoint.d.ts +0 -3
- package/dist/infrastructure/workflow-checkpoint.js +0 -84
- package/dist/infrastructure/workflow-checkpoint.js.map +0 -1
- package/dist/infrastructure/workflow-checkpoint.types.d.ts +0 -6
- package/dist/infrastructure/workflow-checkpoint.types.js +0 -2
- package/dist/infrastructure/workflow-checkpoint.types.js.map +0 -1
- /package/dist/adapters/models/{openai-http.d.ts → model-http.d.ts} +0 -0
- /package/dist/adapters/models/{openai-compatible.constants.d.ts → model.constants.d.ts} +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export function reporter(options = {}) {
|
|
2
2
|
const write = options.write ?? ((text) => process.stdout.write(text));
|
|
3
3
|
let streamed = false;
|
|
4
|
+
let deltas = false;
|
|
4
5
|
return (event) => {
|
|
5
6
|
if (options.quiet)
|
|
6
7
|
return;
|
|
@@ -8,13 +9,19 @@ export function reporter(options = {}) {
|
|
|
8
9
|
switch (event.kind) {
|
|
9
10
|
case "phase":
|
|
10
11
|
if (event.name === "running")
|
|
11
|
-
streamed = false;
|
|
12
|
+
streamed = deltas = false;
|
|
12
13
|
write(`${prefix} ${event.name}${event.agent ? ` · ${event.agent}` : ""}${event.branch ? ` · ${event.branch}` : ""}${options.verbose && event.directory ? ` · ${event.directory}` : ""}\n`);
|
|
13
14
|
break;
|
|
14
|
-
case "text":
|
|
15
|
+
case "text-delta":
|
|
15
16
|
streamed = true;
|
|
17
|
+
deltas = true;
|
|
16
18
|
write(event.text);
|
|
17
19
|
break;
|
|
20
|
+
case "text":
|
|
21
|
+
streamed = true;
|
|
22
|
+
if (!deltas)
|
|
23
|
+
write(event.text);
|
|
24
|
+
break;
|
|
18
25
|
case "result":
|
|
19
26
|
if (!streamed || options.verbose)
|
|
20
27
|
write(`\n${prefix} result: ${event.text}\n`);
|
|
@@ -22,6 +29,24 @@ export function reporter(options = {}) {
|
|
|
22
29
|
case "tool":
|
|
23
30
|
write(`\n${prefix} tool: ${event.name}${options.verbose ? ` ${JSON.stringify(event.input)}` : ""}\n`);
|
|
24
31
|
break;
|
|
32
|
+
case "tool-result":
|
|
33
|
+
write(`${prefix} tool ${event.isError ? "failed" : "done"}: ${event.name}${options.verbose ? ` ${event.preview}` : ""}\n`);
|
|
34
|
+
break;
|
|
35
|
+
case "tool-denied":
|
|
36
|
+
write(`${prefix} tool denied: ${event.name} · ${event.reason}\n`);
|
|
37
|
+
break;
|
|
38
|
+
case "stop-prevented":
|
|
39
|
+
write(`${prefix} stop prevented: ${event.message}\n`);
|
|
40
|
+
break;
|
|
41
|
+
case "compaction":
|
|
42
|
+
if (options.verbose)
|
|
43
|
+
write(`${prefix} context compacted by ${event.strategy} · ${event.messages} messages\n`);
|
|
44
|
+
break;
|
|
45
|
+
case "step":
|
|
46
|
+
deltas = false;
|
|
47
|
+
if (options.verbose)
|
|
48
|
+
write(`${prefix} step ${event.index}\n`);
|
|
49
|
+
break;
|
|
25
50
|
case "summary":
|
|
26
51
|
write(`\n${prefix} finished · ${(event.durationMs / 1000).toFixed(2)}s · status ${event.status} · input ${event.tokens.input} · cache read ${event.tokens.cached} · cache write ${event.tokens.cacheCreated ?? 0} · output ${event.tokens.output}\n`);
|
|
27
52
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/infrastructure/reporter.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,QAAQ,CACtB,UAA2B,EAAE;IAE7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO;QAC1B,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;QAC7F,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,OAAO;gBACV,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;oBAAE,QAAQ,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/infrastructure/reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentEvent } from \"../domain/agent.types.ts\";\nimport type { ReporterOptions, ReportPass } from \"./reporter.types.ts\";\n\nexport type { ReporterOptions } from \"./reporter.types.ts\";\n\nexport function reporter(\n options: ReporterOptions = {},\n): (event: AgentEvent & ReportPass) => void {\n const write = options.write ?? ((text) => process.stdout.write(text));\n let streamed = false;\n let deltas = false;\n return (event) => {\n if (options.quiet) return;\n const prefix = `[${options.label ?? \"outpost\"}${event.pass ? ` · pass ${event.pass}` : \"\"}]`;\n switch (event.kind) {\n case \"phase\":\n if (event.name === \"running\") streamed = deltas = false;\n write(\n `${prefix} ${event.name}${event.agent ? ` · ${event.agent}` : \"\"}${event.branch ? ` · ${event.branch}` : \"\"}${options.verbose && event.directory ? ` · ${event.directory}` : \"\"}\\n`,\n );\n break;\n case \"text-delta\":\n streamed = true;\n deltas = true;\n write(event.text);\n break;\n case \"text\":\n streamed = true;\n if (!deltas) write(event.text);\n break;\n case \"result\":\n if (!streamed || options.verbose)\n write(`\\n${prefix} result: ${event.text}\\n`);\n break;\n case \"tool\":\n write(\n `\\n${prefix} tool: ${event.name}${options.verbose ? ` ${JSON.stringify(event.input)}` : \"\"}\\n`,\n );\n break;\n case \"tool-result\":\n write(\n `${prefix} tool ${event.isError ? \"failed\" : \"done\"}: ${event.name}${options.verbose ? ` ${event.preview}` : \"\"}\\n`,\n );\n break;\n case \"tool-denied\":\n write(`${prefix} tool denied: ${event.name} · ${event.reason}\\n`);\n break;\n case \"stop-prevented\":\n write(`${prefix} stop prevented: ${event.message}\\n`);\n break;\n case \"compaction\":\n if (options.verbose)\n write(\n `${prefix} context compacted by ${event.strategy} · ${event.messages} messages\\n`,\n );\n break;\n case \"step\":\n deltas = false;\n if (options.verbose) write(`${prefix} step ${event.index}\\n`);\n break;\n case \"summary\":\n write(\n `\\n${prefix} finished · ${(event.durationMs / 1000).toFixed(2)}s · status ${event.status} · input ${event.tokens.input} · cache read ${event.tokens.cached} · cache write ${event.tokens.cacheCreated ?? 0} · output ${event.tokens.output}\\n`,\n );\n break;\n case \"failure\":\n case \"warning\":\n write(`\\n${prefix} ${event.kind}: ${event.message}\\n`);\n break;\n case \"conversation\":\n if (options.verbose) write(`\\n${prefix} conversation: ${event.id}\\n`);\n break;\n case \"prompt\":\n if (options.verbose) write(`${prefix} prompt:\\n${event.text}\\n`);\n break;\n case \"raw\":\n if (options.verbose)\n write(\n `${prefix} raw: ${typeof event.value === \"string\" ? event.value : JSON.stringify(event.value)}\\n`,\n );\n break;\n }\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const repositoryStorageDirectory = "storage";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-transport.constants.js","sourceRoot":"","sources":["../../src/infrastructure/repository-transport.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,SAAS,CAAC","sourcesContent":["export const repositoryStorageDirectory = \"storage\";\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { localTransport } from "./local-transport.js";
|
|
3
|
+
import { repositoryStorageDirectory } from "./repository-transport.constants.js";
|
|
4
|
+
export function repositoryTransport(repository) {
|
|
5
|
+
return localTransport({
|
|
6
|
+
directory: join(repository, ".outpost", repositoryStorageDirectory),
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=repository-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-transport.js","sourceRoot":"","sources":["../../src/infrastructure/repository-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,OAAO,cAAc,CAAC;QACpB,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,0BAA0B,CAAC;KACpE,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { join } from \"node:path\";\nimport { localTransport } from \"./local-transport.ts\";\nimport type { Transport } from \"../domain/transport.types.ts\";\nimport { repositoryStorageDirectory } from \"./repository-transport.constants.ts\";\n\nexport function repositoryTransport(repository: string): Transport {\n return localTransport({\n directory: join(repository, \".outpost\", repositoryStorageDirectory),\n });\n}\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { lstat, opendir, realpath } from "node:fs/promises";
|
|
2
1
|
import { join } from "node:path";
|
|
3
2
|
import { invariant, positive } from "../domain/errors.js";
|
|
4
3
|
import { observeOwnership } from "./git/process-identity.js";
|
|
5
|
-
import {
|
|
4
|
+
import { repositoryTransport } from "./repository-transport.js";
|
|
5
|
+
import { repositoryStorageDirectory } from "./repository-transport.constants.js";
|
|
6
|
+
import { jsonObject } from "./transport-json.js";
|
|
6
7
|
import { resourceActivityDefaults as defaults, resourceOperationKinds, resourcePhases, } from "./resource-activity.constants.js";
|
|
7
8
|
function object(value) {
|
|
8
9
|
invariant(!!value && typeof value === "object" && !Array.isArray(value), "Invalid activity object");
|
|
@@ -58,7 +59,8 @@ export function resourceRecord(value) {
|
|
|
58
59
|
object(value);
|
|
59
60
|
invariant(value.version === 1, "Unknown activity version");
|
|
60
61
|
text(value.id);
|
|
61
|
-
|
|
62
|
+
invariant(value.sandboxProvider !== undefined || value.provider === undefined, "Legacy activity record uses provider; sandboxProvider is required");
|
|
63
|
+
text(value.sandboxProvider);
|
|
62
64
|
text(value.workspace);
|
|
63
65
|
date(value.createdAt);
|
|
64
66
|
date(value.updatedAt);
|
|
@@ -79,7 +81,7 @@ export function resourceRecord(value) {
|
|
|
79
81
|
id: value.id,
|
|
80
82
|
pid: value.pid,
|
|
81
83
|
...(owner ? { identity: owner } : {}),
|
|
82
|
-
|
|
84
|
+
sandboxProvider: value.sandboxProvider,
|
|
83
85
|
placement: value.placement,
|
|
84
86
|
workspace: value.workspace,
|
|
85
87
|
createdAt: value.createdAt,
|
|
@@ -98,48 +100,42 @@ export async function inspectResourceActivity(repository, maxEntries = defaults.
|
|
|
98
100
|
positive(maxEntries, "maxEntries");
|
|
99
101
|
const entries = [];
|
|
100
102
|
const issues = [];
|
|
101
|
-
|
|
103
|
+
const transporter = repositoryTransport(repository);
|
|
104
|
+
const root = join(repository, ".outpost", repositoryStorageDirectory);
|
|
102
105
|
try {
|
|
103
|
-
for (const
|
|
104
|
-
path = join(
|
|
105
|
-
const info = await lstat(path);
|
|
106
|
-
invariant(info.isDirectory() &&
|
|
107
|
-
!info.isSymbolicLink() &&
|
|
108
|
-
(await realpath(path)) === path, "Unsafe activity directory");
|
|
109
|
-
}
|
|
110
|
-
for await (const entry of await opendir(path)) {
|
|
111
|
-
const file = join(path, entry.name);
|
|
106
|
+
for await (const entry of transporter.list("resources/")) {
|
|
107
|
+
const path = join(root, "objects", `${entry.key}.object`);
|
|
112
108
|
if (entries.length >= Math.min(maxEntries, defaults.maxRecords)) {
|
|
113
|
-
issues.push({ path, code: "RESOURCE_ENTRY_LIMIT" });
|
|
109
|
+
issues.push({ path: root, code: "RESOURCE_ENTRY_LIMIT" });
|
|
114
110
|
break;
|
|
115
111
|
}
|
|
116
112
|
try {
|
|
117
|
-
const
|
|
118
|
-
|
|
113
|
+
const current = await transporter.read(entry.key, {
|
|
114
|
+
maxBytes: defaults.maxRecordBytes,
|
|
115
|
+
});
|
|
116
|
+
invariant(current?.revision === entry.revision, "Resource changed during inspection");
|
|
117
|
+
const value = resourceRecord(jsonObject(current));
|
|
118
|
+
invariant(entry.key === `resources/${value.id}.json`, "Activity identity mismatch");
|
|
119
119
|
entries.push({
|
|
120
|
-
path
|
|
120
|
+
path,
|
|
121
121
|
record: value,
|
|
122
122
|
ownership: await observeOwnership(value.pid, value.identity),
|
|
123
123
|
});
|
|
124
124
|
}
|
|
125
125
|
catch {
|
|
126
126
|
entries.push({
|
|
127
|
-
path
|
|
127
|
+
path,
|
|
128
128
|
ownership: {
|
|
129
129
|
status: "unknown",
|
|
130
130
|
reason: "RESOURCE_RECORD_UNREADABLE",
|
|
131
131
|
},
|
|
132
132
|
});
|
|
133
|
-
issues.push({ path
|
|
133
|
+
issues.push({ path, code: "RESOURCE_RECORD_UNREADABLE" });
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
-
catch
|
|
138
|
-
|
|
139
|
-
typeof cause === "object" &&
|
|
140
|
-
"code" in cause &&
|
|
141
|
-
cause.code === "ENOENT"))
|
|
142
|
-
issues.push({ path, code: "RESOURCE_DIRECTORY_UNAVAILABLE" });
|
|
137
|
+
catch {
|
|
138
|
+
issues.push({ path: root, code: "RESOURCE_DIRECTORY_UNAVAILABLE" });
|
|
143
139
|
}
|
|
144
140
|
entries.sort((left, right) => left.path.localeCompare(right.path));
|
|
145
141
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-activity-inspection.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity-inspection.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, opendir, realpath } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { invariant, positive } from \"../domain/errors.ts\";\nimport { observeOwnership } from \"./git/process-identity.ts\";\nimport type { LocalProcessIdentity } from \"./git/process-identity.types.ts\";\nimport { readInspectionFile } from \"./inspection-file.ts\";\nimport {\n resourceActivityDefaults as defaults,\n resourceOperationKinds,\n resourcePhases,\n} from \"./resource-activity.constants.ts\";\nimport type {\n ResourceActivityRecord,\n ResourceInspection,\n ResourceInspectionEntry,\n ResourceOperation,\n ResourceOperationResult,\n} from \"./resource-activity.types.ts\";\nimport type { StorageIssue } from \"./storage-inventory.types.ts\";\n\nfunction object(value: unknown): asserts value is Record<string, unknown> {\n invariant(\n !!value && typeof value === \"object\" && !Array.isArray(value),\n \"Invalid activity object\",\n );\n}\nfunction text(value: unknown): asserts value is string {\n invariant(\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= defaults.maxText,\n \"Invalid activity text\",\n );\n}\nfunction date(value: unknown): asserts value is string {\n text(value);\n invariant(Number.isFinite(Date.parse(value)), \"Invalid activity time\");\n}\nfunction operation(value: unknown): ResourceOperation {\n object(value);\n invariant(\n typeof value.count === \"number\" &&\n Number.isSafeInteger(value.count) &&\n value.count > 0,\n \"Invalid activity count\",\n );\n date(value.startedAt);\n const kind = resourceOperationKinds.find((kind) => kind === value.kind);\n invariant(kind, \"Invalid activity operation\");\n return { count: value.count, startedAt: value.startedAt, kind };\n}\nfunction result(value: unknown): ResourceOperationResult {\n const base = operation(value);\n object(value);\n text(value.id);\n date(value.finishedAt);\n invariant(\n value.outcome === \"completed\" || value.outcome === \"failed\",\n \"Invalid activity outcome\",\n );\n return {\n ...base,\n id: value.id,\n finishedAt: value.finishedAt,\n outcome: value.outcome,\n };\n}\nfunction identity(value: unknown): LocalProcessIdentity | undefined {\n if (value === undefined) return undefined;\n object(value);\n text(value.host);\n text(value.boot);\n text(value.namespace);\n text(value.started);\n return {\n host: value.host,\n boot: value.boot,\n namespace: value.namespace,\n started: value.started,\n };\n}\nexport function resourceRecord(value: unknown): ResourceActivityRecord {\n object(value);\n invariant(value.version === 1, \"Unknown activity version\");\n text(value.id);\n text(value.provider);\n text(value.workspace);\n date(value.createdAt);\n date(value.updatedAt);\n invariant(\n typeof value.pid === \"number\" &&\n Number.isSafeInteger(value.pid) &&\n value.pid > 0 &&\n value.pid <= 2_147_483_647,\n \"Invalid activity owner\",\n );\n invariant(\n value.placement === \"host\" ||\n value.placement === \"mounted\" ||\n value.placement === \"remote\",\n \"Invalid activity placement\",\n );\n const phase = resourcePhases.find((phase) => phase === value.phase);\n invariant(phase, \"Invalid activity phase\");\n invariant(\n Array.isArray(value.operations) &&\n value.operations.length <= resourceOperationKinds.length,\n \"Invalid activity operations\",\n );\n const owner = identity(value.identity);\n return {\n version: 1,\n id: value.id,\n pid: value.pid,\n ...(owner ? { identity: owner } : {}),\n provider: value.provider,\n placement: value.placement,\n workspace: value.workspace,\n createdAt: value.createdAt,\n updatedAt: value.updatedAt,\n phase,\n operations: value.operations.map(operation),\n ...(value.lastOperation === undefined\n ? {}\n : { lastOperation: result(value.lastOperation) }),\n ...(value.lastFailure === undefined\n ? {}\n : { lastFailure: result(value.lastFailure) }),\n };\n}\n\nexport async function inspectResourceActivity(\n repository: string,\n maxEntries: number = defaults.maxRecords,\n): Promise<ResourceInspection> {\n positive(maxEntries, \"maxEntries\");\n const entries: ResourceInspectionEntry[] = [];\n const issues: StorageIssue[] = [];\n let path = repository;\n try {\n for (const part of [\".outpost\", \"locks\", defaults.directory]) {\n path = join(path, part);\n const info = await lstat(path);\n invariant(\n info.isDirectory() &&\n !info.isSymbolicLink() &&\n (await realpath(path)) === path,\n \"Unsafe activity directory\",\n );\n }\n for await (const entry of await opendir(path)) {\n const file = join(path, entry.name);\n if (entries.length >= Math.min(maxEntries, defaults.maxRecords)) {\n issues.push({ path, code: \"RESOURCE_ENTRY_LIMIT\" });\n break;\n }\n try {\n const value = resourceRecord(\n JSON.parse(\n (await readInspectionFile(file, defaults.maxRecordBytes)).toString(\n \"utf8\",\n ),\n ),\n );\n invariant(\n entry.name === `${value.id}.json`,\n \"Activity identity mismatch\",\n );\n entries.push({\n path: file,\n record: value,\n ownership: await observeOwnership(value.pid, value.identity),\n });\n } catch {\n entries.push({\n path: file,\n ownership: {\n status: \"unknown\",\n reason: \"RESOURCE_RECORD_UNREADABLE\",\n },\n });\n issues.push({ path: file, code: \"RESOURCE_RECORD_UNREADABLE\" });\n }\n }\n } catch (cause) {\n if (!(\n cause &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n cause.code === \"ENOENT\"\n ))\n issues.push({ path, code: \"RESOURCE_DIRECTORY_UNAVAILABLE\" });\n }\n entries.sort((left, right) => left.path.localeCompare(right.path));\n return {\n scope: \"recorded-sandboxes\",\n complete: issues.length === 0,\n entries,\n issues,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resource-activity-inspection.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity-inspection.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { invariant, positive } from \"../domain/errors.ts\";\nimport { observeOwnership } from \"./git/process-identity.ts\";\nimport type { LocalProcessIdentity } from \"./git/process-identity.types.ts\";\nimport { repositoryTransport } from \"./repository-transport.ts\";\nimport { repositoryStorageDirectory } from \"./repository-transport.constants.ts\";\nimport { jsonObject } from \"./transport-json.ts\";\nimport {\n resourceActivityDefaults as defaults,\n resourceOperationKinds,\n resourcePhases,\n} from \"./resource-activity.constants.ts\";\nimport type {\n ResourceActivityRecord,\n ResourceInspection,\n ResourceInspectionEntry,\n ResourceOperation,\n ResourceOperationResult,\n} from \"./resource-activity.types.ts\";\nimport type { StorageIssue } from \"./storage-inventory.types.ts\";\n\nfunction object(value: unknown): asserts value is Record<string, unknown> {\n invariant(\n !!value && typeof value === \"object\" && !Array.isArray(value),\n \"Invalid activity object\",\n );\n}\nfunction text(value: unknown): asserts value is string {\n invariant(\n typeof value === \"string\" &&\n value.length > 0 &&\n value.length <= defaults.maxText,\n \"Invalid activity text\",\n );\n}\nfunction date(value: unknown): asserts value is string {\n text(value);\n invariant(Number.isFinite(Date.parse(value)), \"Invalid activity time\");\n}\nfunction operation(value: unknown): ResourceOperation {\n object(value);\n invariant(\n typeof value.count === \"number\" &&\n Number.isSafeInteger(value.count) &&\n value.count > 0,\n \"Invalid activity count\",\n );\n date(value.startedAt);\n const kind = resourceOperationKinds.find((kind) => kind === value.kind);\n invariant(kind, \"Invalid activity operation\");\n return { count: value.count, startedAt: value.startedAt, kind };\n}\nfunction result(value: unknown): ResourceOperationResult {\n const base = operation(value);\n object(value);\n text(value.id);\n date(value.finishedAt);\n invariant(\n value.outcome === \"completed\" || value.outcome === \"failed\",\n \"Invalid activity outcome\",\n );\n return {\n ...base,\n id: value.id,\n finishedAt: value.finishedAt,\n outcome: value.outcome,\n };\n}\nfunction identity(value: unknown): LocalProcessIdentity | undefined {\n if (value === undefined) return undefined;\n object(value);\n text(value.host);\n text(value.boot);\n text(value.namespace);\n text(value.started);\n return {\n host: value.host,\n boot: value.boot,\n namespace: value.namespace,\n started: value.started,\n };\n}\nexport function resourceRecord(value: unknown): ResourceActivityRecord {\n object(value);\n invariant(value.version === 1, \"Unknown activity version\");\n text(value.id);\n invariant(\n value.sandboxProvider !== undefined || value.provider === undefined,\n \"Legacy activity record uses provider; sandboxProvider is required\",\n );\n text(value.sandboxProvider);\n text(value.workspace);\n date(value.createdAt);\n date(value.updatedAt);\n invariant(\n typeof value.pid === \"number\" &&\n Number.isSafeInteger(value.pid) &&\n value.pid > 0 &&\n value.pid <= 2_147_483_647,\n \"Invalid activity owner\",\n );\n invariant(\n value.placement === \"host\" ||\n value.placement === \"mounted\" ||\n value.placement === \"remote\",\n \"Invalid activity placement\",\n );\n const phase = resourcePhases.find((phase) => phase === value.phase);\n invariant(phase, \"Invalid activity phase\");\n invariant(\n Array.isArray(value.operations) &&\n value.operations.length <= resourceOperationKinds.length,\n \"Invalid activity operations\",\n );\n const owner = identity(value.identity);\n return {\n version: 1,\n id: value.id,\n pid: value.pid,\n ...(owner ? { identity: owner } : {}),\n sandboxProvider: value.sandboxProvider,\n placement: value.placement,\n workspace: value.workspace,\n createdAt: value.createdAt,\n updatedAt: value.updatedAt,\n phase,\n operations: value.operations.map(operation),\n ...(value.lastOperation === undefined\n ? {}\n : { lastOperation: result(value.lastOperation) }),\n ...(value.lastFailure === undefined\n ? {}\n : { lastFailure: result(value.lastFailure) }),\n };\n}\n\nexport async function inspectResourceActivity(\n repository: string,\n maxEntries: number = defaults.maxRecords,\n): Promise<ResourceInspection> {\n positive(maxEntries, \"maxEntries\");\n const entries: ResourceInspectionEntry[] = [];\n const issues: StorageIssue[] = [];\n const transporter = repositoryTransport(repository);\n const root = join(repository, \".outpost\", repositoryStorageDirectory);\n try {\n for await (const entry of transporter.list(\"resources/\")) {\n const path = join(root, \"objects\", `${entry.key}.object`);\n if (entries.length >= Math.min(maxEntries, defaults.maxRecords)) {\n issues.push({ path: root, code: \"RESOURCE_ENTRY_LIMIT\" });\n break;\n }\n try {\n const current = await transporter.read(entry.key, {\n maxBytes: defaults.maxRecordBytes,\n });\n invariant(\n current?.revision === entry.revision,\n \"Resource changed during inspection\",\n );\n const value = resourceRecord(jsonObject(current));\n invariant(\n entry.key === `resources/${value.id}.json`,\n \"Activity identity mismatch\",\n );\n entries.push({\n path,\n record: value,\n ownership: await observeOwnership(value.pid, value.identity),\n });\n } catch {\n entries.push({\n path,\n ownership: {\n status: \"unknown\",\n reason: \"RESOURCE_RECORD_UNREADABLE\",\n },\n });\n issues.push({ path, code: \"RESOURCE_RECORD_UNREADABLE\" });\n }\n }\n } catch {\n issues.push({ path: root, code: \"RESOURCE_DIRECTORY_UNAVAILABLE\" });\n }\n entries.sort((left, right) => left.path.localeCompare(right.path));\n return {\n scope: \"recorded-sandboxes\",\n complete: issues.length === 0,\n entries,\n issues,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-activity.constants.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,
|
|
1
|
+
{"version":3,"file":"resource-activity.constants.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,UAAU,EAAE,MAAM;IAClB,cAAc,EAAE,MAAM;IACtB,OAAO,EAAE,KAAK;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY;IACZ,OAAO;IACP,SAAS;IACT,gBAAgB;IAChB,sBAAsB;CACd,CAAC;AACX,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU;IACV,QAAQ;IACR,UAAU;IACV,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,UAAU;IACV,gBAAgB;IAChB,cAAc;CACN,CAAC","sourcesContent":["export const resourceActivityDefaults = {\n maxRecords: 10_000,\n maxRecordBytes: 65_536,\n maxText: 4_096,\n} as const;\n\nexport const resourcePhases = [\n \"allocating\",\n \"ready\",\n \"closing\",\n \"cleanup-failed\",\n \"allocation-uncertain\",\n] as const;\nexport const resourceOperationKinds = [\n \"dispatch\",\n \"attach\",\n \"diagnose\",\n \"command\",\n \"invoke\",\n \"upload\",\n \"download\",\n \"manifest\",\n \"download-batch\",\n \"upload-batch\",\n] as const;\n"]}
|
|
@@ -1,30 +1,17 @@
|
|
|
1
1
|
import { TransportConflict } from "../domain/transport.js";
|
|
2
2
|
import { jsonBytes } from "./transport-json.js";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
|
-
import { mkdir, open, realpath, rename, rm, opendir } from "node:fs/promises";
|
|
5
|
-
import { join } from "node:path";
|
|
6
4
|
import { invariant } from "../domain/errors.js";
|
|
7
5
|
import { localProcessIdentity } from "./git/process-identity.js";
|
|
8
|
-
import {
|
|
9
|
-
import { lockStorageMutation } from "./storage-mutation-lock.js";
|
|
6
|
+
import { repositoryTransport } from "./repository-transport.js";
|
|
10
7
|
import { resourceActivityDefaults as defaults } from "./resource-activity.constants.js";
|
|
11
|
-
async function activityDirectory(repository) {
|
|
12
|
-
let path = repository;
|
|
13
|
-
for (const part of [".outpost", "locks", defaults.directory]) {
|
|
14
|
-
path = join(path, part);
|
|
15
|
-
await mkdir(path, { recursive: true, mode: 0o700 });
|
|
16
|
-
invariant((await realpath(path)) === path, "Resource activity directory must not use symlinks");
|
|
17
|
-
}
|
|
18
|
-
return path;
|
|
19
|
-
}
|
|
20
8
|
export async function registerResourceActivity(options) {
|
|
21
|
-
for (const text of [options.workspace, options.
|
|
9
|
+
for (const text of [options.workspace, options.sandboxProvider])
|
|
22
10
|
invariant(text.length > 0 && text.length <= defaults.maxText, "Resource activity metadata exceeds its size limit");
|
|
23
|
-
const
|
|
24
|
-
const directory = remote ? "" : await activityDirectory(options.repository);
|
|
11
|
+
const transporter = options.transporter ?? repositoryTransport(options.repository);
|
|
25
12
|
let revision;
|
|
26
13
|
const id = randomUUID();
|
|
27
|
-
const path =
|
|
14
|
+
const path = `resources/${id}.json`;
|
|
28
15
|
const createdAt = new Date().toISOString();
|
|
29
16
|
const identity = await localProcessIdentity();
|
|
30
17
|
let record = {
|
|
@@ -32,7 +19,7 @@ export async function registerResourceActivity(options) {
|
|
|
32
19
|
id,
|
|
33
20
|
pid: process.pid,
|
|
34
21
|
...(identity ? { identity } : {}),
|
|
35
|
-
|
|
22
|
+
sandboxProvider: options.sandboxProvider,
|
|
36
23
|
placement: options.placement,
|
|
37
24
|
workspace: options.workspace,
|
|
38
25
|
createdAt,
|
|
@@ -40,30 +27,10 @@ export async function registerResourceActivity(options) {
|
|
|
40
27
|
phase: "allocating",
|
|
41
28
|
operations: [],
|
|
42
29
|
};
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (remote) {
|
|
48
|
-
revision = (await remote.write(path, jsonBytes(record), { ifRevision: null })).revision;
|
|
49
|
-
}
|
|
50
|
-
if (!remote) {
|
|
51
|
-
let count = 0;
|
|
52
|
-
for await (const _entry of await opendir(directory))
|
|
53
|
-
invariant(++count < defaults.maxRecords, "Too many resource activity records; inspect retained ownership before continuing");
|
|
54
|
-
const file = await open(path, "wx", 0o600);
|
|
55
|
-
try {
|
|
56
|
-
await file.writeFile(JSON.stringify(record));
|
|
57
|
-
await file.sync();
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
60
|
-
await file.close();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
finally {
|
|
65
|
-
await unlock();
|
|
66
|
-
}
|
|
30
|
+
let count = 0;
|
|
31
|
+
for await (const _entry of transporter.list("resources/"))
|
|
32
|
+
invariant(++count < defaults.maxRecords, "Too many resource activity records; inspect retained ownership before continuing");
|
|
33
|
+
revision = (await transporter.write(path, jsonBytes(record), { ifRevision: null })).revision;
|
|
67
34
|
let pending = Promise.resolve();
|
|
68
35
|
let removed = false;
|
|
69
36
|
function serialize(action) {
|
|
@@ -73,15 +40,8 @@ export async function registerResourceActivity(options) {
|
|
|
73
40
|
}
|
|
74
41
|
async function verify() {
|
|
75
42
|
invariant(!removed, "Resource activity is closed");
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
throw new TransportConflict(path);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
invariant(remote || (await realpath(directory)) === directory, "Resource activity directory changed");
|
|
82
|
-
invariant(!removed, "Resource activity is closed");
|
|
83
|
-
const current = (await readInspectionFile(path, defaults.maxRecordBytes)).toString("utf8");
|
|
84
|
-
invariant(current === JSON.stringify(record), "Resource activity identity changed; refusing mutation");
|
|
43
|
+
if ((await transporter.read(path))?.revision !== revision)
|
|
44
|
+
throw new TransportConflict(path);
|
|
85
45
|
}
|
|
86
46
|
function update(next) {
|
|
87
47
|
return serialize(async () => {
|
|
@@ -89,25 +49,11 @@ export async function registerResourceActivity(options) {
|
|
|
89
49
|
const value = { ...next(), updatedAt: new Date().toISOString() };
|
|
90
50
|
const data = JSON.stringify(value);
|
|
91
51
|
invariant(Buffer.byteLength(data) <= defaults.maxRecordBytes, "Resource activity record exceeds its size limit");
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
99
|
-
const file = await open(temporary, "wx", 0o600);
|
|
100
|
-
try {
|
|
101
|
-
await file.writeFile(data);
|
|
102
|
-
await file.sync();
|
|
103
|
-
await file.close();
|
|
104
|
-
await rename(temporary, path);
|
|
105
|
-
record = value;
|
|
106
|
-
}
|
|
107
|
-
finally {
|
|
108
|
-
await file.close();
|
|
109
|
-
await rm(temporary, { force: true });
|
|
110
|
-
}
|
|
52
|
+
invariant(revision, "Resource revision unavailable");
|
|
53
|
+
revision = (await transporter.write(path, jsonBytes(value), {
|
|
54
|
+
ifRevision: revision,
|
|
55
|
+
})).revision;
|
|
56
|
+
record = value;
|
|
111
57
|
});
|
|
112
58
|
}
|
|
113
59
|
return {
|
|
@@ -171,22 +117,13 @@ export async function registerResourceActivity(options) {
|
|
|
171
117
|
if (removed)
|
|
172
118
|
return;
|
|
173
119
|
invariant(record.operations.length === 0, "Resource operations remain unsettled; activity record retained");
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
invariant(revision, "Resource revision unavailable");
|
|
178
|
-
await remote.remove(path, { ifRevision: revision });
|
|
179
|
-
}
|
|
180
|
-
else
|
|
181
|
-
await rm(path);
|
|
182
|
-
}
|
|
183
|
-
catch (cause) {
|
|
184
|
-
if (!(cause &&
|
|
185
|
-
typeof cause === "object" &&
|
|
186
|
-
"code" in cause &&
|
|
187
|
-
cause.code === "ENOENT"))
|
|
188
|
-
throw cause;
|
|
120
|
+
if (!(await transporter.read(path))) {
|
|
121
|
+
removed = true;
|
|
122
|
+
return;
|
|
189
123
|
}
|
|
124
|
+
await verify();
|
|
125
|
+
invariant(revision, "Resource revision unavailable");
|
|
126
|
+
await transporter.remove(path, { ifRevision: revision });
|
|
190
127
|
removed = true;
|
|
191
128
|
}),
|
|
192
129
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-activity.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.ts"],"names":[],"mappings":"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","sourcesContent":["import { TransportConflict } from \"../domain/transport.ts\";\nimport { jsonBytes } from \"./transport-json.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, open, realpath, rename, rm, opendir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { localProcessIdentity } from \"./git/process-identity.ts\";\nimport { readInspectionFile } from \"./inspection-file.ts\";\nimport { lockStorageMutation } from \"./storage-mutation-lock.ts\";\nimport { resourceActivityDefaults as defaults } from \"./resource-activity.constants.ts\";\nimport type {\n ResourceActivity,\n ResourceActivityOptions,\n ResourceActivityRecord,\n ResourceOperationResult,\n} from \"./resource-activity.types.ts\";\n\nasync function activityDirectory(repository: string): Promise<string> {\n let path = repository;\n for (const part of [\".outpost\", \"locks\", defaults.directory]) {\n path = join(path, part);\n await mkdir(path, { recursive: true, mode: 0o700 });\n invariant(\n (await realpath(path)) === path,\n \"Resource activity directory must not use symlinks\",\n );\n }\n return path;\n}\n\nexport async function registerResourceActivity(\n options: ResourceActivityOptions,\n): Promise<ResourceActivity> {\n for (const text of [options.workspace, options.provider])\n invariant(\n text.length > 0 && text.length <= defaults.maxText,\n \"Resource activity metadata exceeds its size limit\",\n );\n const remote = options.transporter;\n const directory = remote ? \"\" : await activityDirectory(options.repository);\n let revision: string | undefined;\n const id = randomUUID();\n const path = remote ? `resources/${id}.json` : join(directory, `${id}.json`);\n const createdAt = new Date().toISOString();\n const identity = await localProcessIdentity();\n let record: ResourceActivityRecord = {\n version: 1,\n id,\n pid: process.pid,\n ...(identity ? { identity } : {}),\n provider: options.provider,\n placement: options.placement,\n workspace: options.workspace,\n createdAt,\n updatedAt: createdAt,\n phase: \"allocating\",\n operations: [],\n };\n const unlock = remote\n ? async () => {}\n : await lockStorageMutation(options.repository);\n try {\n if (remote) {\n revision = (\n await remote.write(path, jsonBytes(record), { ifRevision: null })\n ).revision;\n }\n if (!remote) {\n let count = 0;\n for await (const _entry of await opendir(directory))\n invariant(\n ++count < defaults.maxRecords,\n \"Too many resource activity records; inspect retained ownership before continuing\",\n );\n const file = await open(path, \"wx\", 0o600);\n try {\n await file.writeFile(JSON.stringify(record));\n await file.sync();\n } finally {\n await file.close();\n }\n }\n } finally {\n await unlock();\n }\n let pending = Promise.resolve();\n let removed = false;\n function serialize(action: () => Promise<void>): Promise<void> {\n const next = pending.then(action);\n pending = next.catch(() => undefined);\n return next;\n }\n async function verify(): Promise<void> {\n invariant(!removed, \"Resource activity is closed\");\n if (remote) {\n if ((await remote.read(path))?.revision !== revision)\n throw new TransportConflict(path);\n return;\n }\n invariant(\n remote || (await realpath(directory)) === directory,\n \"Resource activity directory changed\",\n );\n invariant(!removed, \"Resource activity is closed\");\n const current = (\n await readInspectionFile(path, defaults.maxRecordBytes)\n ).toString(\"utf8\");\n invariant(\n current === JSON.stringify(record),\n \"Resource activity identity changed; refusing mutation\",\n );\n }\n function update(next: () => ResourceActivityRecord): Promise<void> {\n return serialize(async () => {\n await verify();\n const value = { ...next(), updatedAt: new Date().toISOString() };\n const data = JSON.stringify(value);\n invariant(\n Buffer.byteLength(data) <= defaults.maxRecordBytes,\n \"Resource activity record exceeds its size limit\",\n );\n if (remote) {\n invariant(revision, \"Resource revision unavailable\");\n revision = (\n await remote.write(path, jsonBytes(value), { ifRevision: revision })\n ).revision;\n record = value;\n return;\n }\n const temporary = `${path}.${randomUUID()}.tmp`;\n const file = await open(temporary, \"wx\", 0o600);\n try {\n await file.writeFile(data);\n await file.sync();\n await file.close();\n await rename(temporary, path);\n record = value;\n } finally {\n await file.close();\n await rm(temporary, { force: true });\n }\n });\n }\n return {\n async idle() {\n await pending;\n return record.operations.length === 0;\n },\n phase: (phase) => update(() => ({ ...record, phase })),\n async run(kind, action) {\n const operation = {\n id: randomUUID(),\n kind,\n startedAt: new Date().toISOString(),\n };\n await update(() => {\n const active = record.operations.find((value) => value.kind === kind);\n const operations = record.operations.filter(\n (value) => value.kind !== kind,\n );\n operations.push({\n kind,\n startedAt: active?.startedAt ?? operation.startedAt,\n count: (active?.count ?? 0) + 1,\n });\n return { ...record, operations };\n });\n let outcome: ResourceOperationResult[\"outcome\"] = \"completed\";\n try {\n return await action();\n } catch (cause) {\n outcome = \"failed\";\n throw cause;\n } finally {\n const result = {\n ...operation,\n outcome,\n count: 1,\n finishedAt: new Date().toISOString(),\n };\n try {\n await update(() => ({\n ...record,\n operations: record.operations.flatMap((value) => {\n if (value.kind !== kind) return [value];\n if (value.count === 1) return [];\n return [{ ...value, count: value.count - 1 }];\n }),\n lastOperation: result,\n ...(outcome === \"failed\" ? { lastFailure: result } : {}),\n }));\n } catch (cause) {\n if (outcome !== \"failed\") throw cause;\n }\n }\n },\n remove: () =>\n serialize(async () => {\n if (removed) return;\n invariant(\n record.operations.length === 0,\n \"Resource operations remain unsettled; activity record retained\",\n );\n try {\n await verify();\n if (remote) {\n invariant(revision, \"Resource revision unavailable\");\n await remote.remove(path, { ifRevision: revision });\n } else await rm(path);\n } catch (cause) {\n if (!(\n cause &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n cause.code === \"ENOENT\"\n ))\n throw cause;\n }\n removed = true;\n }),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resource-activity.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.ts"],"names":[],"mappings":"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","sourcesContent":["import { TransportConflict } from \"../domain/transport.ts\";\nimport { jsonBytes } from \"./transport-json.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { invariant } from \"../domain/errors.ts\";\nimport { localProcessIdentity } from \"./git/process-identity.ts\";\nimport { repositoryTransport } from \"./repository-transport.ts\";\nimport { resourceActivityDefaults as defaults } from \"./resource-activity.constants.ts\";\nimport type {\n ResourceActivity,\n ResourceActivityOptions,\n ResourceActivityRecord,\n ResourceOperationResult,\n} from \"./resource-activity.types.ts\";\n\nexport async function registerResourceActivity(\n options: ResourceActivityOptions,\n): Promise<ResourceActivity> {\n for (const text of [options.workspace, options.sandboxProvider])\n invariant(\n text.length > 0 && text.length <= defaults.maxText,\n \"Resource activity metadata exceeds its size limit\",\n );\n const transporter =\n options.transporter ?? repositoryTransport(options.repository);\n let revision: string | undefined;\n const id = randomUUID();\n const path = `resources/${id}.json`;\n const createdAt = new Date().toISOString();\n const identity = await localProcessIdentity();\n let record: ResourceActivityRecord = {\n version: 1,\n id,\n pid: process.pid,\n ...(identity ? { identity } : {}),\n sandboxProvider: options.sandboxProvider,\n placement: options.placement,\n workspace: options.workspace,\n createdAt,\n updatedAt: createdAt,\n phase: \"allocating\",\n operations: [],\n };\n let count = 0;\n for await (const _entry of transporter.list(\"resources/\"))\n invariant(\n ++count < defaults.maxRecords,\n \"Too many resource activity records; inspect retained ownership before continuing\",\n );\n revision = (\n await transporter.write(path, jsonBytes(record), { ifRevision: null })\n ).revision;\n let pending = Promise.resolve();\n let removed = false;\n function serialize(action: () => Promise<void>): Promise<void> {\n const next = pending.then(action);\n pending = next.catch(() => undefined);\n return next;\n }\n async function verify(): Promise<void> {\n invariant(!removed, \"Resource activity is closed\");\n if ((await transporter.read(path))?.revision !== revision)\n throw new TransportConflict(path);\n }\n\n function update(next: () => ResourceActivityRecord): Promise<void> {\n return serialize(async () => {\n await verify();\n const value = { ...next(), updatedAt: new Date().toISOString() };\n const data = JSON.stringify(value);\n invariant(\n Buffer.byteLength(data) <= defaults.maxRecordBytes,\n \"Resource activity record exceeds its size limit\",\n );\n invariant(revision, \"Resource revision unavailable\");\n revision = (\n await transporter.write(path, jsonBytes(value), {\n ifRevision: revision,\n })\n ).revision;\n record = value;\n });\n }\n return {\n async idle() {\n await pending;\n return record.operations.length === 0;\n },\n phase: (phase) => update(() => ({ ...record, phase })),\n async run(kind, action) {\n const operation = {\n id: randomUUID(),\n kind,\n startedAt: new Date().toISOString(),\n };\n await update(() => {\n const active = record.operations.find((value) => value.kind === kind);\n const operations = record.operations.filter(\n (value) => value.kind !== kind,\n );\n operations.push({\n kind,\n startedAt: active?.startedAt ?? operation.startedAt,\n count: (active?.count ?? 0) + 1,\n });\n return { ...record, operations };\n });\n let outcome: ResourceOperationResult[\"outcome\"] = \"completed\";\n try {\n return await action();\n } catch (cause) {\n outcome = \"failed\";\n throw cause;\n } finally {\n const result = {\n ...operation,\n outcome,\n count: 1,\n finishedAt: new Date().toISOString(),\n };\n try {\n await update(() => ({\n ...record,\n operations: record.operations.flatMap((value) => {\n if (value.kind !== kind) return [value];\n if (value.count === 1) return [];\n return [{ ...value, count: value.count - 1 }];\n }),\n lastOperation: result,\n ...(outcome === \"failed\" ? { lastFailure: result } : {}),\n }));\n } catch (cause) {\n if (outcome !== \"failed\") throw cause;\n }\n }\n },\n remove: () =>\n serialize(async () => {\n if (removed) return;\n invariant(\n record.operations.length === 0,\n \"Resource operations remain unsettled; activity record retained\",\n );\n if (!(await transporter.read(path))) {\n removed = true;\n return;\n }\n await verify();\n invariant(revision, \"Resource revision unavailable\");\n await transporter.remove(path, { ifRevision: revision });\n removed = true;\n }),\n };\n}\n"]}
|
|
@@ -19,7 +19,7 @@ export interface ResourceActivityRecord {
|
|
|
19
19
|
readonly id: string;
|
|
20
20
|
readonly pid: number;
|
|
21
21
|
readonly identity?: LocalProcessIdentity;
|
|
22
|
-
readonly
|
|
22
|
+
readonly sandboxProvider: string;
|
|
23
23
|
readonly placement: "mounted" | "remote" | "host";
|
|
24
24
|
readonly workspace: string;
|
|
25
25
|
readonly createdAt: string;
|
|
@@ -39,7 +39,7 @@ export interface ResourceActivityOptions {
|
|
|
39
39
|
readonly transporter?: Transport;
|
|
40
40
|
readonly repository: string;
|
|
41
41
|
readonly workspace: string;
|
|
42
|
-
readonly
|
|
42
|
+
readonly sandboxProvider: string;
|
|
43
43
|
readonly placement: ResourceActivityRecord["placement"];
|
|
44
44
|
}
|
|
45
45
|
export interface ResourceInspectionEntry {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-activity.types.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Transport } from \"../domain/transport.types.ts\";\nimport type {\n LocalProcessIdentity,\n LockOwnership,\n} from \"./git/process-identity.types.ts\";\nimport type { StorageIssue } from \"./storage-inventory.types.ts\";\nimport type {\n resourceOperationKinds,\n resourcePhases,\n} from \"./resource-activity.constants.ts\";\n\nexport type ResourcePhase = (typeof resourcePhases)[number];\nexport type ResourceOperationKind = (typeof resourceOperationKinds)[number];\nexport interface ResourceOperation {\n readonly count: number;\n readonly kind: ResourceOperationKind;\n readonly startedAt: string;\n}\nexport interface ResourceOperationResult extends ResourceOperation {\n readonly id: string;\n readonly finishedAt: string;\n readonly outcome: \"completed\" | \"failed\";\n}\nexport interface ResourceActivityRecord {\n readonly version: 1;\n readonly id: string;\n readonly pid: number;\n readonly identity?: LocalProcessIdentity;\n readonly
|
|
1
|
+
{"version":3,"file":"resource-activity.types.js","sourceRoot":"","sources":["../../src/infrastructure/resource-activity.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Transport } from \"../domain/transport.types.ts\";\nimport type {\n LocalProcessIdentity,\n LockOwnership,\n} from \"./git/process-identity.types.ts\";\nimport type { StorageIssue } from \"./storage-inventory.types.ts\";\nimport type {\n resourceOperationKinds,\n resourcePhases,\n} from \"./resource-activity.constants.ts\";\n\nexport type ResourcePhase = (typeof resourcePhases)[number];\nexport type ResourceOperationKind = (typeof resourceOperationKinds)[number];\nexport interface ResourceOperation {\n readonly count: number;\n readonly kind: ResourceOperationKind;\n readonly startedAt: string;\n}\nexport interface ResourceOperationResult extends ResourceOperation {\n readonly id: string;\n readonly finishedAt: string;\n readonly outcome: \"completed\" | \"failed\";\n}\nexport interface ResourceActivityRecord {\n readonly version: 1;\n readonly id: string;\n readonly pid: number;\n readonly identity?: LocalProcessIdentity;\n readonly sandboxProvider: string;\n readonly placement: \"mounted\" | \"remote\" | \"host\";\n readonly workspace: string;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly phase: ResourcePhase;\n readonly operations: readonly ResourceOperation[];\n readonly lastOperation?: ResourceOperationResult;\n readonly lastFailure?: ResourceOperationResult;\n}\nexport interface ResourceActivity {\n idle(): Promise<boolean>;\n phase(phase: ResourcePhase): Promise<void>;\n run<T>(kind: ResourceOperationKind, action: () => Promise<T>): Promise<T>;\n remove(): Promise<void>;\n}\nexport interface ResourceActivityOptions {\n readonly transporter?: Transport;\n readonly repository: string;\n readonly workspace: string;\n readonly sandboxProvider: string;\n readonly placement: ResourceActivityRecord[\"placement\"];\n}\nexport interface ResourceInspectionEntry {\n readonly path: string;\n readonly record?: ResourceActivityRecord;\n readonly ownership: LockOwnership;\n}\nexport interface ResourceInspection {\n readonly scope: \"recorded-sandboxes\";\n readonly complete: boolean;\n readonly entries: readonly ResourceInspectionEntry[];\n readonly issues: readonly StorageIssue[];\n}\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Variables } from "../domain/command.types.ts";
|
|
2
2
|
export declare function parseEnvironment(text: string): Record<string, string>;
|
|
3
|
-
export declare function resolveVariables(repository: string, agent?: Variables,
|
|
3
|
+
export declare function resolveVariables(repository: string, agent?: Variables, sandboxProvider?: Variables, environment?: NodeJS.ProcessEnv): Promise<Variables>;
|
|
@@ -21,8 +21,8 @@ export function parseEnvironment(text) {
|
|
|
21
21
|
}
|
|
22
22
|
return result;
|
|
23
23
|
}
|
|
24
|
-
export async function resolveVariables(repository, agent = {},
|
|
25
|
-
const overlap = Object.keys(agent).filter((key) => Object.hasOwn(
|
|
24
|
+
export async function resolveVariables(repository, agent = {}, sandboxProvider = {}, environment = process.env) {
|
|
25
|
+
const overlap = Object.keys(agent).filter((key) => Object.hasOwn(sandboxProvider, key));
|
|
26
26
|
if (overlap.length)
|
|
27
27
|
throw new OutpostError("configuration", `Agent and sandbox variables overlap: ${overlap.join(", ")}`, { overlap });
|
|
28
28
|
const optional = async (path) => readFile(path, "utf8").catch((error) => {
|
|
@@ -36,6 +36,6 @@ export async function resolveVariables(repository, agent = {}, provider = {}, en
|
|
|
36
36
|
for (const key of Object.keys(variables))
|
|
37
37
|
if (!variables[key] && environment[key] !== undefined)
|
|
38
38
|
variables[key] = environment[key];
|
|
39
|
-
return Object.freeze({ ...variables, ...
|
|
39
|
+
return Object.freeze({ ...variables, ...sandboxProvider, ...agent });
|
|
40
40
|
}
|
|
41
41
|
//# sourceMappingURL=settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/infrastructure/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,4DAA4D,CAC7D,CAAC;QACF,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACtB,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,MAAM;gBACR,KAAK,GAAG,KAAK,CAAC,OAAO,CACnB,eAAe,EACf,CAAC,CAAC,EAAE,SAAiB,EAAE,EAAE,CACvB,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,CAAE,CACpE,CAAC;QACN,CAAC;;YAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,QAAmB,EAAE,EACrB,
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/infrastructure/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Variables } from \"../domain/command.types.ts\";\nimport { OutpostError } from \"../domain/errors.ts\";\n\nexport function parseEnvironment(text: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of text.split(/\\r?\\n/)) {\n const match = line.match(\n /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*?)\\s*$/,\n );\n if (!match) continue;\n let value = match[2]!;\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n const double = value.startsWith('\"');\n value = value.slice(1, -1);\n if (double)\n value = value.replace(\n /\\\\([nrt\"\\\\])/g,\n (_, character: string) =>\n ({ n: \"\\n\", r: \"\\r\", t: \"\\t\", '\"': '\"', \"\\\\\": \"\\\\\" })[character]!,\n );\n } else value = value.replace(/\\s+#.*$/, \"\").trim();\n result[match[1]!] = value;\n }\n return result;\n}\n\nexport async function resolveVariables(\n repository: string,\n agent: Variables = {},\n sandboxProvider: Variables = {},\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<Variables> {\n const overlap = Object.keys(agent).filter((key) =>\n Object.hasOwn(sandboxProvider, key),\n );\n if (overlap.length)\n throw new OutpostError(\n \"configuration\",\n `Agent and sandbox variables overlap: ${overlap.join(\", \")}`,\n { overlap },\n );\n const optional = async (path: string) =>\n readFile(path, \"utf8\").catch((error) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return \"\";\n throw error;\n });\n const variables = {\n ...parseEnvironment(await optional(join(repository, \".outpost\", \".env\"))),\n };\n for (const key of Object.keys(variables))\n if (!variables[key] && environment[key] !== undefined)\n variables[key] = environment[key]!;\n return Object.freeze({ ...variables, ...sandboxProvider, ...agent });\n}\n"]}
|