@elie-laloum/outpost 4.2.0 → 5.0.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 +27 -0
- package/README.md +5 -3
- package/dist/{cli/init-authentication.constants.js → adapters/agents/authentication.constants.js} +1 -1
- package/dist/adapters/agents/authentication.constants.js.map +1 -0
- package/dist/adapters/agents/authentication.d.ts +2 -0
- package/dist/adapters/agents/authentication.js +52 -0
- package/dist/adapters/agents/authentication.js.map +1 -0
- package/dist/adapters/agents/claude-adapter.d.ts +2 -2
- package/dist/adapters/agents/claude-adapter.js +30 -2
- package/dist/adapters/agents/claude-adapter.js.map +1 -1
- 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/codex-adapter.d.ts +2 -2
- package/dist/adapters/agents/codex-adapter.js +17 -1
- package/dist/adapters/agents/codex-adapter.js.map +1 -1
- 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/gemini-adapter.d.ts +2 -2
- package/dist/adapters/agents/gemini-adapter.js +20 -1
- package/dist/adapters/agents/gemini-adapter.js.map +1 -1
- package/dist/adapters/agents/gemini-request.d.ts +2 -1
- package/dist/adapters/agents/gemini-request.js +1 -1
- package/dist/adapters/agents/gemini-request.js.map +1 -1
- package/dist/adapters/agents/gemini.types.d.ts +2 -1
- package/dist/adapters/agents/gemini.types.js.map +1 -1
- package/dist/adapters/agents/model-support.constants.d.ts +6 -0
- package/dist/adapters/agents/model-support.constants.js +18 -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/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-bootstrap.d.ts +2 -2
- package/dist/application/agent-bootstrap.js +2 -0
- package/dist/application/agent-bootstrap.js.map +1 -1
- 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/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-image.js +3 -3
- package/dist/application/doctor-image.js.map +1 -1
- package/dist/application/doctor-protocol.js +9 -4
- package/dist/application/doctor-protocol.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-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 +10 -9
- package/dist/application/doctor.js.map +1 -1
- package/dist/application/doctor.types.d.ts +3 -3
- 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 -6
- package/dist/application/outpost.types.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 +12 -4
- 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 -3
- 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 +8 -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/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 +6 -6
- package/dist/cli/doctor-command.js.map +1 -1
- package/dist/cli/init-authentication.js +6 -7
- package/dist/cli/init-authentication.js.map +1 -1
- package/dist/cli/init-command.js +3 -3
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli/main.constants.d.ts +4 -4
- package/dist/cli/main.constants.js +4 -4
- 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 +5 -4
- package/dist/cli/scaffold-files.js.map +1 -1
- package/dist/cli/scaffold-validation.js +13 -10
- package/dist/cli/scaffold-validation.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 +1 -1
- package/dist/cli/scaffold.types.js.map +1 -1
- package/dist/cli/starters.js +8 -8
- 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 +69 -2
- package/dist/domain/agent.types.js.map +1 -1
- 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 +34 -8
- package/dist/index.js +19 -4
- 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 +1 -0
- package/dist/infrastructure/git/git.constants.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 +4 -1
- package/dist/infrastructure/journal.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/resource-activity-inspection.js +3 -2
- package/dist/infrastructure/resource-activity-inspection.js.map +1 -1
- package/dist/infrastructure/resource-activity.js +2 -2
- 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/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/providers/agents.d.ts +3 -3
- package/dist/providers/agents.js +3 -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/package.json +1 -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.js.map +0 -1
- /package/dist/{cli/init-authentication.constants.d.ts → adapters/agents/authentication.constants.d.ts} +0 -0
- /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,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Agent } from "../domain/agent.types.ts";
|
|
2
2
|
import type { Command } from "../domain/command.types.ts";
|
|
3
3
|
import type { TaskContext } from "../domain/workflow.types.ts";
|
|
4
4
|
import type { DispatchOptions } from "./execution.types.ts";
|
|
@@ -15,5 +15,5 @@ export type AgentTaskOptions<T> = {
|
|
|
15
15
|
request: (context: TaskContext) => DispatchOptions<T>;
|
|
16
16
|
};
|
|
17
17
|
export type IsolatedTaskRequest<T> = SandboxOptions & DispatchOptions<T> & {
|
|
18
|
-
readonly agent:
|
|
18
|
+
readonly agent: Agent;
|
|
19
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.types.js","sourceRoot":"","sources":["../../src/application/tasks.types.ts"],"names":[],"mappings":"","sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"tasks.types.js","sourceRoot":"","sources":["../../src/application/tasks.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Agent } from \"../domain/agent.types.ts\";\nimport type { Command } from \"../domain/command.types.ts\";\nimport type { TaskContext } from \"../domain/workflow.types.ts\";\nimport type { DispatchOptions } from \"./execution.types.ts\";\nimport type { Sandbox, SandboxOptions } from \"./outpost.types.ts\";\n\nexport type CommandTaskOptions = {\n sandbox: Sandbox;\n command: Command | ((context: TaskContext) => Command);\n};\n\nexport type IsolatedTaskOptions<T> = {\n request: (\n context: TaskContext,\n ) => IsolatedTaskRequest<T> | Promise<IsolatedTaskRequest<T>>;\n};\n\nexport type AgentTaskOptions<T> = {\n sandbox: Sandbox;\n request: (context: TaskContext) => DispatchOptions<T>;\n};\n\nexport type IsolatedTaskRequest<T> = SandboxOptions &\n DispatchOptions<T> & { readonly agent: Agent };\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ModelToolCallBlock, ModelToolResultBlock } from "../domain/model.types.ts";
|
|
2
|
+
import type { HarnessRuntime } from "./harness.types.ts";
|
|
3
|
+
export declare function executeToolCalls(runtime: HarnessRuntime, calls: readonly ModelToolCallBlock[], step: number, loaded: ReadonlySet<string>): Promise<readonly ModelToolResultBlock[]>;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { OutpostError } from "../domain/errors.js";
|
|
2
|
+
import { TOOL_PREVIEW_CHARACTERS, TOOL_RESULT_CHARACTERS, } from "../domain/harness.constants.js";
|
|
3
|
+
import { afterTool, beforeTool } from "./harness-hooks.js";
|
|
4
|
+
const toolEvents = new Set(["text", "warning", "raw"]);
|
|
5
|
+
export async function executeToolCalls(runtime, calls, step, loaded) {
|
|
6
|
+
const tools = new Map(runtime.tools.map((tool) => [tool.name, tool]));
|
|
7
|
+
const owners = new Map(runtime.agent.harness.skills.flatMap((skill) => skill.tools.map((tool) => [tool.name, skill.name])));
|
|
8
|
+
const locked = (name) => {
|
|
9
|
+
const skill = owners.get(name);
|
|
10
|
+
return skill === undefined || loaded.has(skill) ? undefined : skill;
|
|
11
|
+
};
|
|
12
|
+
const prepared = [];
|
|
13
|
+
for (const call of calls)
|
|
14
|
+
prepared.push(await prepareCall(runtime, tools, call, step, locked));
|
|
15
|
+
const outcomes = new Map();
|
|
16
|
+
for (const batch of batches(prepared)) {
|
|
17
|
+
const pending = [...batch.calls];
|
|
18
|
+
const limit = batch.concurrent
|
|
19
|
+
? runtime.agent.harness.toolExecution.concurrency
|
|
20
|
+
: 1;
|
|
21
|
+
await Promise.all(Array.from({ length: Math.min(limit, pending.length) }, async () => {
|
|
22
|
+
for (let next = pending.shift(); next; next = pending.shift())
|
|
23
|
+
outcomes.set(next.call.id, await executeCall(runtime, next));
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
const results = [];
|
|
27
|
+
for (const { call, outcome } of prepared)
|
|
28
|
+
results.push(await finish(runtime, call, outcome ?? outcomes.get(call.id), step));
|
|
29
|
+
return results;
|
|
30
|
+
}
|
|
31
|
+
async function prepareCall(runtime, tools, call, step, locked) {
|
|
32
|
+
runtime.signal.throwIfAborted();
|
|
33
|
+
runtime.emit({
|
|
34
|
+
kind: "tool",
|
|
35
|
+
name: call.name,
|
|
36
|
+
input: call.input,
|
|
37
|
+
callId: call.id,
|
|
38
|
+
});
|
|
39
|
+
const tool = tools.get(call.name);
|
|
40
|
+
if (!tool)
|
|
41
|
+
return { call, outcome: failed(`Unknown tool: ${call.name}`) };
|
|
42
|
+
const validated = await validate(tool, call.input, "Invalid input");
|
|
43
|
+
if ("outcome" in validated)
|
|
44
|
+
return { call, outcome: validated.outcome };
|
|
45
|
+
const skill = locked(tool.name);
|
|
46
|
+
if (skill)
|
|
47
|
+
return denied(runtime, call, `Load the ${skill} skill with load_skill before using ${tool.name}`);
|
|
48
|
+
const permitted = permission(runtime, tool, validated.value);
|
|
49
|
+
if (permitted)
|
|
50
|
+
return denied(runtime, call, permitted);
|
|
51
|
+
const decision = await beforeTool(runtime, { ...call, input: validated.value }, step);
|
|
52
|
+
if ("deny" in decision)
|
|
53
|
+
return denied(runtime, call, decision.deny);
|
|
54
|
+
if (decision.input === validated.value)
|
|
55
|
+
return { call, tool, input: validated.value };
|
|
56
|
+
const revised = await validate(tool, decision.input, "Hook produced invalid input");
|
|
57
|
+
if ("outcome" in revised)
|
|
58
|
+
return { call, outcome: revised.outcome };
|
|
59
|
+
const revisedPermission = permission(runtime, tool, revised.value);
|
|
60
|
+
if (revisedPermission)
|
|
61
|
+
return denied(runtime, call, revisedPermission);
|
|
62
|
+
return { call, tool, input: revised.value };
|
|
63
|
+
}
|
|
64
|
+
async function validate(tool, input, label) {
|
|
65
|
+
const validation = await tool.validate(input);
|
|
66
|
+
if ("issues" in validation)
|
|
67
|
+
return {
|
|
68
|
+
outcome: failed(`${label} for ${tool.name}: ${validation.issues}`),
|
|
69
|
+
};
|
|
70
|
+
return { value: validation.value };
|
|
71
|
+
}
|
|
72
|
+
function permission(runtime, tool, input) {
|
|
73
|
+
const permissions = runtime.agent.harness.permissions;
|
|
74
|
+
if (!permissions)
|
|
75
|
+
return undefined;
|
|
76
|
+
const decision = permissions.evaluate(tool.name, tool.resources(input));
|
|
77
|
+
return decision.allowed ? undefined : decision.reason;
|
|
78
|
+
}
|
|
79
|
+
function denied(runtime, call, reason) {
|
|
80
|
+
runtime.emit({
|
|
81
|
+
kind: "tool-denied",
|
|
82
|
+
callId: call.id,
|
|
83
|
+
name: call.name,
|
|
84
|
+
reason,
|
|
85
|
+
});
|
|
86
|
+
return { call, outcome: failed(`Denied: ${reason}`) };
|
|
87
|
+
}
|
|
88
|
+
async function finish(runtime, call, outcome, step) {
|
|
89
|
+
const final = await afterTool(runtime, call, outcome, step, normalized);
|
|
90
|
+
const content = final.content.length > TOOL_RESULT_CHARACTERS
|
|
91
|
+
? `${final.content.slice(0, TOOL_RESULT_CHARACTERS)}\n[truncated ${final.content.length - TOOL_RESULT_CHARACTERS} characters]`
|
|
92
|
+
: final.content;
|
|
93
|
+
runtime.emit({
|
|
94
|
+
kind: "tool-result",
|
|
95
|
+
callId: call.id,
|
|
96
|
+
name: call.name,
|
|
97
|
+
isError: final.isError,
|
|
98
|
+
preview: content.slice(0, TOOL_PREVIEW_CHARACTERS),
|
|
99
|
+
characters: final.content.length,
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
type: "tool-result",
|
|
103
|
+
callId: call.id,
|
|
104
|
+
content,
|
|
105
|
+
...(final.isError ? { isError: true } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function batches(calls) {
|
|
109
|
+
const grouped = [];
|
|
110
|
+
for (const prepared of calls) {
|
|
111
|
+
if (prepared.outcome)
|
|
112
|
+
continue;
|
|
113
|
+
const concurrent = prepared.tool.readOnly;
|
|
114
|
+
const last = grouped.at(-1);
|
|
115
|
+
if (last?.concurrent && concurrent) {
|
|
116
|
+
grouped[grouped.length - 1] = {
|
|
117
|
+
concurrent,
|
|
118
|
+
calls: [...last.calls, prepared],
|
|
119
|
+
};
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
grouped.push({ concurrent, calls: [prepared] });
|
|
123
|
+
}
|
|
124
|
+
return grouped;
|
|
125
|
+
}
|
|
126
|
+
async function executeCall(runtime, prepared) {
|
|
127
|
+
try {
|
|
128
|
+
return normalized(await runTool(runtime, prepared));
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
runtime.signal.throwIfAborted();
|
|
132
|
+
if (runtime.agent.harness.toolExecution.onError === "fail")
|
|
133
|
+
throw error;
|
|
134
|
+
return failed(error instanceof Error ? error.message : String(error));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async function runTool(runtime, { call, tool, input }) {
|
|
138
|
+
const { deadlineMs } = runtime.agent.harness.toolExecution;
|
|
139
|
+
const controller = new AbortController();
|
|
140
|
+
const signal = AbortSignal.any([runtime.signal, controller.signal]);
|
|
141
|
+
const timer = setTimeout(() => controller.abort(new OutpostError("timeout", `Tool ${call.name} timed out after ${deadlineMs} ms`)), deadlineMs);
|
|
142
|
+
const release = runtime.hold();
|
|
143
|
+
const aborted = new Promise((_, reject) => {
|
|
144
|
+
const fail = () => reject(signal.reason);
|
|
145
|
+
if (signal.aborted)
|
|
146
|
+
fail();
|
|
147
|
+
signal.addEventListener("abort", fail, { once: true });
|
|
148
|
+
});
|
|
149
|
+
const execution = Promise.resolve().then(() => tool.execute(input, {
|
|
150
|
+
sandbox: scopedLease(runtime.sandbox, signal),
|
|
151
|
+
signal,
|
|
152
|
+
callId: call.id,
|
|
153
|
+
model: runtime.agent.model,
|
|
154
|
+
observe(event) {
|
|
155
|
+
signal.throwIfAborted();
|
|
156
|
+
if (!toolEvents.has(event?.kind))
|
|
157
|
+
throw new OutpostError("configuration", "Tools may only report text, warning or raw events");
|
|
158
|
+
runtime.emit(event);
|
|
159
|
+
},
|
|
160
|
+
}));
|
|
161
|
+
execution.catch(() => undefined);
|
|
162
|
+
aborted.catch(() => undefined);
|
|
163
|
+
try {
|
|
164
|
+
return await Promise.race([execution, aborted]);
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
clearTimeout(timer);
|
|
168
|
+
controller.abort(new OutpostError("aborted", "Tool call ended"));
|
|
169
|
+
release();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function scopedLease(lease, signal) {
|
|
173
|
+
const combine = (own) => own ? AbortSignal.any([own, signal]) : signal;
|
|
174
|
+
return {
|
|
175
|
+
root: lease.root,
|
|
176
|
+
home: lease.home,
|
|
177
|
+
invoke: (command) => {
|
|
178
|
+
signal.throwIfAborted();
|
|
179
|
+
return lease.invoke({ ...command, signal: combine(command.signal) });
|
|
180
|
+
},
|
|
181
|
+
upload: (source, destination, settings = {}) => {
|
|
182
|
+
signal.throwIfAborted();
|
|
183
|
+
return lease.upload(source, destination, {
|
|
184
|
+
...settings,
|
|
185
|
+
signal: combine(settings.signal),
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
download: (source, destination, settings = {}) => {
|
|
189
|
+
signal.throwIfAborted();
|
|
190
|
+
return lease.download(source, destination, {
|
|
191
|
+
...settings,
|
|
192
|
+
signal: combine(settings.signal),
|
|
193
|
+
});
|
|
194
|
+
},
|
|
195
|
+
release: () => lease.release(),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function normalized(output) {
|
|
199
|
+
if (typeof output === "string")
|
|
200
|
+
return { content: output, isError: false };
|
|
201
|
+
if (output === null ||
|
|
202
|
+
typeof output !== "object" ||
|
|
203
|
+
typeof output.content !== "string" ||
|
|
204
|
+
(output.isError !== undefined && typeof output.isError !== "boolean"))
|
|
205
|
+
throw new OutpostError("configuration", "Tools must return text or { content, isError }");
|
|
206
|
+
return { content: output.content, isError: output.isError ?? false };
|
|
207
|
+
}
|
|
208
|
+
function failed(message) {
|
|
209
|
+
return { content: message, isError: true };
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=tool-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-execution.js","sourceRoot":"","sources":["../../src/application/tool-execution.ts"],"names":[],"mappings":"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","sourcesContent":["import { OutpostError } from \"../domain/errors.ts\";\nimport {\n TOOL_PREVIEW_CHARACTERS,\n TOOL_RESULT_CHARACTERS,\n} from \"../domain/harness.constants.ts\";\nimport type {\n ModelToolCallBlock,\n ModelToolResultBlock,\n} from \"../domain/model.types.ts\";\nimport type { SandboxLease } from \"../domain/sandbox.types.ts\";\nimport type {\n HarnessTool,\n HarnessToolEvent,\n ToolOutput,\n} from \"../domain/tool.types.ts\";\nimport { afterTool, beforeTool } from \"./harness-hooks.ts\";\nimport type {\n HarnessRuntime,\n PreparedCall,\n ToolCallBatch,\n ToolOutcome,\n ValidatedInput,\n} from \"./harness.types.ts\";\n\nconst toolEvents: ReadonlySet<string> = new Set([\"text\", \"warning\", \"raw\"]);\n\nexport async function executeToolCalls(\n runtime: HarnessRuntime,\n calls: readonly ModelToolCallBlock[],\n step: number,\n loaded: ReadonlySet<string>,\n): Promise<readonly ModelToolResultBlock[]> {\n const tools = new Map(runtime.tools.map((tool) => [tool.name, tool]));\n const owners = new Map(\n runtime.agent.harness.skills.flatMap((skill) =>\n skill.tools.map((tool) => [tool.name, skill.name] as const),\n ),\n );\n const locked = (name: string) => {\n const skill = owners.get(name);\n return skill === undefined || loaded.has(skill) ? undefined : skill;\n };\n const prepared: PreparedCall[] = [];\n for (const call of calls)\n prepared.push(await prepareCall(runtime, tools, call, step, locked));\n const outcomes = new Map<string, ToolOutcome>();\n for (const batch of batches(prepared)) {\n const pending = [...batch.calls];\n const limit = batch.concurrent\n ? runtime.agent.harness.toolExecution.concurrency\n : 1;\n await Promise.all(\n Array.from({ length: Math.min(limit, pending.length) }, async () => {\n for (let next = pending.shift(); next; next = pending.shift())\n outcomes.set(next.call.id, await executeCall(runtime, next));\n }),\n );\n }\n const results: ModelToolResultBlock[] = [];\n for (const { call, outcome } of prepared)\n results.push(\n await finish(runtime, call, outcome ?? outcomes.get(call.id)!, step),\n );\n return results;\n}\n\nasync function prepareCall(\n runtime: HarnessRuntime,\n tools: ReadonlyMap<string, HarnessTool>,\n call: ModelToolCallBlock,\n step: number,\n locked: (name: string) => string | undefined,\n): Promise<PreparedCall> {\n runtime.signal.throwIfAborted();\n runtime.emit({\n kind: \"tool\",\n name: call.name,\n input: call.input,\n callId: call.id,\n });\n const tool = tools.get(call.name);\n if (!tool) return { call, outcome: failed(`Unknown tool: ${call.name}`) };\n const validated = await validate(tool, call.input, \"Invalid input\");\n if (\"outcome\" in validated) return { call, outcome: validated.outcome };\n const skill = locked(tool.name);\n if (skill)\n return denied(\n runtime,\n call,\n `Load the ${skill} skill with load_skill before using ${tool.name}`,\n );\n const permitted = permission(runtime, tool, validated.value);\n if (permitted) return denied(runtime, call, permitted);\n const decision = await beforeTool(\n runtime,\n { ...call, input: validated.value },\n step,\n );\n if (\"deny\" in decision) return denied(runtime, call, decision.deny);\n if (decision.input === validated.value)\n return { call, tool, input: validated.value };\n const revised = await validate(\n tool,\n decision.input,\n \"Hook produced invalid input\",\n );\n if (\"outcome\" in revised) return { call, outcome: revised.outcome };\n const revisedPermission = permission(runtime, tool, revised.value);\n if (revisedPermission) return denied(runtime, call, revisedPermission);\n return { call, tool, input: revised.value };\n}\n\nasync function validate(\n tool: HarnessTool,\n input: unknown,\n label: string,\n): Promise<ValidatedInput> {\n const validation = await tool.validate(input);\n if (\"issues\" in validation)\n return {\n outcome: failed(`${label} for ${tool.name}: ${validation.issues}`),\n };\n return { value: validation.value };\n}\n\nfunction permission(\n runtime: HarnessRuntime,\n tool: HarnessTool,\n input: unknown,\n): string | undefined {\n const permissions = runtime.agent.harness.permissions;\n if (!permissions) return undefined;\n const decision = permissions.evaluate(tool.name, tool.resources(input));\n return decision.allowed ? undefined : decision.reason;\n}\n\nfunction denied(\n runtime: HarnessRuntime,\n call: ModelToolCallBlock,\n reason: string,\n): PreparedCall {\n runtime.emit({\n kind: \"tool-denied\",\n callId: call.id,\n name: call.name,\n reason,\n });\n return { call, outcome: failed(`Denied: ${reason}`) };\n}\n\nasync function finish(\n runtime: HarnessRuntime,\n call: ModelToolCallBlock,\n outcome: ToolOutcome,\n step: number,\n): Promise<ModelToolResultBlock> {\n const final = await afterTool(runtime, call, outcome, step, normalized);\n const content =\n final.content.length > TOOL_RESULT_CHARACTERS\n ? `${final.content.slice(0, TOOL_RESULT_CHARACTERS)}\\n[truncated ${final.content.length - TOOL_RESULT_CHARACTERS} characters]`\n : final.content;\n runtime.emit({\n kind: \"tool-result\",\n callId: call.id,\n name: call.name,\n isError: final.isError,\n preview: content.slice(0, TOOL_PREVIEW_CHARACTERS),\n characters: final.content.length,\n });\n return {\n type: \"tool-result\",\n callId: call.id,\n content,\n ...(final.isError ? { isError: true } : {}),\n };\n}\n\nfunction batches(calls: readonly PreparedCall[]): readonly ToolCallBatch[] {\n const grouped: ToolCallBatch[] = [];\n for (const prepared of calls) {\n if (prepared.outcome) continue;\n const concurrent = prepared.tool!.readOnly;\n const last = grouped.at(-1);\n if (last?.concurrent && concurrent) {\n grouped[grouped.length - 1] = {\n concurrent,\n calls: [...last.calls, prepared],\n };\n continue;\n }\n grouped.push({ concurrent, calls: [prepared] });\n }\n return grouped;\n}\n\nasync function executeCall(\n runtime: HarnessRuntime,\n prepared: PreparedCall,\n): Promise<ToolOutcome> {\n try {\n return normalized(await runTool(runtime, prepared));\n } catch (error) {\n runtime.signal.throwIfAborted();\n if (runtime.agent.harness.toolExecution.onError === \"fail\") throw error;\n return failed(error instanceof Error ? error.message : String(error));\n }\n}\n\nasync function runTool(\n runtime: HarnessRuntime,\n { call, tool, input }: PreparedCall,\n): Promise<ToolOutput> {\n const { deadlineMs } = runtime.agent.harness.toolExecution;\n const controller = new AbortController();\n const signal = AbortSignal.any([runtime.signal, controller.signal]);\n const timer = setTimeout(\n () =>\n controller.abort(\n new OutpostError(\n \"timeout\",\n `Tool ${call.name} timed out after ${deadlineMs} ms`,\n ),\n ),\n deadlineMs,\n );\n const release = runtime.hold();\n const aborted = new Promise<never>((_, reject) => {\n const fail = () => reject(signal.reason);\n if (signal.aborted) fail();\n signal.addEventListener(\"abort\", fail, { once: true });\n });\n const execution = Promise.resolve().then(() =>\n tool!.execute(input, {\n sandbox: scopedLease(runtime.sandbox, signal),\n signal,\n callId: call.id,\n model: runtime.agent.model,\n observe(event: HarnessToolEvent) {\n signal.throwIfAborted();\n if (!toolEvents.has(event?.kind))\n throw new OutpostError(\n \"configuration\",\n \"Tools may only report text, warning or raw events\",\n );\n runtime.emit(event);\n },\n }),\n );\n execution.catch(() => undefined);\n aborted.catch(() => undefined);\n try {\n return await Promise.race([execution, aborted]);\n } finally {\n clearTimeout(timer);\n controller.abort(new OutpostError(\"aborted\", \"Tool call ended\"));\n release();\n }\n}\n\nfunction scopedLease(lease: SandboxLease, signal: AbortSignal): SandboxLease {\n const combine = (own?: AbortSignal) =>\n own ? AbortSignal.any([own, signal]) : signal;\n return {\n root: lease.root,\n home: lease.home,\n invoke: (command) => {\n signal.throwIfAborted();\n return lease.invoke({ ...command, signal: combine(command.signal) });\n },\n upload: (source, destination, settings = {}) => {\n signal.throwIfAborted();\n return lease.upload(source, destination, {\n ...settings,\n signal: combine(settings.signal),\n });\n },\n download: (source, destination, settings = {}) => {\n signal.throwIfAborted();\n return lease.download(source, destination, {\n ...settings,\n signal: combine(settings.signal),\n });\n },\n release: () => lease.release(),\n };\n}\n\nfunction normalized(output: ToolOutput): ToolOutcome {\n if (typeof output === \"string\") return { content: output, isError: false };\n if (\n output === null ||\n typeof output !== \"object\" ||\n typeof output.content !== \"string\" ||\n (output.isError !== undefined && typeof output.isError !== \"boolean\")\n )\n throw new OutpostError(\n \"configuration\",\n \"Tools must return text or { content, isError }\",\n );\n return { content: output.content, isError: output.isError ?? false };\n}\n\nfunction failed(message: string): ToolOutcome {\n return { content: message, isError: true };\n}\n"]}
|
package/dist/cli/commands.js
CHANGED
|
@@ -28,7 +28,7 @@ export async function runCli(args = process.argv.slice(2)) {
|
|
|
28
28
|
for (const key of definition.options) {
|
|
29
29
|
const configuration = cliOptions[key];
|
|
30
30
|
const short = "short" in configuration ? `-${configuration.short}, ` : "";
|
|
31
|
-
command.addOption(new Option(`${short}--${key}${configuration.type === "string" ? " <value>" : ""}`, configuration.description));
|
|
31
|
+
command.addOption(new Option(`${short}--${key === "sandboxProvider" ? "sandbox-provider" : key}${configuration.type === "string" ? " <value>" : ""}`, configuration.description));
|
|
32
32
|
}
|
|
33
33
|
if (name === "init")
|
|
34
34
|
command.addOption(new Option("--no-build", "Skip automatic container image build").default(undefined));
|
|
@@ -38,7 +38,9 @@ export async function runCli(args = process.argv.slice(2)) {
|
|
|
38
38
|
for (const option of command.options) {
|
|
39
39
|
const value = parsed[option.attributeName()];
|
|
40
40
|
if (typeof value === "string" || typeof value === "boolean")
|
|
41
|
-
values[option.long
|
|
41
|
+
values[option.long === "--sandbox-provider"
|
|
42
|
+
? "sandboxProvider"
|
|
43
|
+
: option.long.replace(/^--(?:no-)?/, "")] = value;
|
|
42
44
|
}
|
|
43
45
|
await handlers[path[0]]({
|
|
44
46
|
values: values,
|
package/dist/cli/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAA0B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,YAAY,EAAE;SACd,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAyC;QACrD,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,aAAa;QACrB,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE,eAAe;KAC1B,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO,GAAG,OAAO,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;oBACrD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,OAAO,CAAC,SAAS,CACf,IAAI,MAAM,CACR,GAAG,KAAK,KAAK,GAAG,GAAG,aAAa,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, CommanderError, Option } from \"commander\";\nimport { recoveryCommand } from \"./recovery-command.ts\";\nimport { doctorCommand } from \"./doctor-command.ts\";\nimport { imageCommand } from \"./image-command.ts\";\nimport { initializeCommand } from \"./init-command.ts\";\nimport { cliOptions, commandOptions } from \"./main.constants.ts\";\nimport type { CliCommand, CliValues } from \"./main.types.ts\";\n\nexport async function runCli(\n args: readonly string[] = process.argv.slice(2),\n): Promise<void> {\n const program = new Command()\n .name(\"outpost\")\n .description(\"Outpost — sandboxed coding agents and workflows\")\n .exitOverride()\n .configureOutput({ writeErr: () => {} });\n const handlers: Readonly<Record<string, CliCommand>> = {\n init: initializeCommand,\n doctor: doctorCommand,\n image: imageCommand,\n recovery: recoveryCommand,\n };\n for (const [name, definition] of Object.entries(commandOptions)) {\n const path = name.split(\" \");\n let command = program;\n for (const part of path) {\n command =\n command.commands.find((item) => item.name() === part) ??\n command.command(part);\n }\n command.description(definition.description);\n for (const key of definition.options) {\n const configuration = cliOptions[key];\n const short = \"short\" in configuration ? `-${configuration.short}, ` : \"\";\n command.addOption(\n new Option(\n `${short}--${key === \"sandboxProvider\" ? \"sandbox-provider\" : key}${configuration.type === \"string\" ? \" <value>\" : \"\"}`,\n configuration.description,\n ),\n );\n }\n if (name === \"init\")\n command.addOption(\n new Option(\n \"--no-build\",\n \"Skip automatic container image build\",\n ).default(undefined),\n );\n command.action(async () => {\n const values: Record<string, string | boolean> = {};\n const parsed = command.opts<Record<string, unknown>>();\n for (const option of command.options) {\n const value = parsed[option.attributeName()];\n if (typeof value === \"string\" || typeof value === \"boolean\")\n values[\n option.long === \"--sandbox-provider\"\n ? \"sandboxProvider\"\n : option.long!.replace(/^--(?:no-)?/, \"\")\n ] = value;\n }\n await handlers[path[0]!]!({\n values: values as CliValues,\n positionals: path,\n });\n });\n }\n for (const command of program.commands.filter(\n (item) => item.commands.length,\n )) {\n command.allowExcessArguments().action(() => {\n throw new Error(`Unknown command. Run outpost ${command.name()} --help.`);\n });\n }\n try {\n await program.parseAsync(args.length ? [...args] : [\"--help\"], {\n from: \"user\",\n });\n } catch (error) {\n if (error instanceof CommanderError && error.exitCode === 0) return;\n throw error;\n }\n}\n"]}
|
|
@@ -7,22 +7,22 @@ function isProvider(value) {
|
|
|
7
7
|
export async function doctorCommand({ values, positionals }, execute, write = (text) => {
|
|
8
8
|
process.stdout.write(text);
|
|
9
9
|
}) {
|
|
10
|
-
invariant(positionals.length === 1, "Usage: outpost doctor [--provider NAME] [--agent NAME] [--image NAME] [--json]");
|
|
10
|
+
invariant(positionals.length === 1, "Usage: outpost doctor [--sandbox-provider NAME] [--agent NAME] [--image NAME] [--json]");
|
|
11
11
|
for (const key of Object.keys(values))
|
|
12
|
-
invariant(["
|
|
13
|
-
const
|
|
12
|
+
invariant(["sandboxProvider", "agent", "image", "json"].includes(key), `Unsupported doctor option: --${key}`);
|
|
13
|
+
const sandboxProvider = values.sandboxProvider ?? doctorDefaults.sandboxProvider;
|
|
14
14
|
const agent = values.agent ?? doctorDefaults.agent;
|
|
15
|
-
invariant(isProvider(
|
|
15
|
+
invariant(isProvider(sandboxProvider), "Unknown provider. Choose docker, podman, local, vercel or daytona.");
|
|
16
16
|
invariant(agent === "codex" || agent === "claude" || agent === "gemini", "Unknown agent. Choose codex, claude or gemini.");
|
|
17
17
|
const report = await diagnose({
|
|
18
|
-
|
|
18
|
+
sandboxProvider,
|
|
19
19
|
agent,
|
|
20
20
|
...(values.image !== undefined ? { image: values.image } : {}),
|
|
21
21
|
}, execute);
|
|
22
22
|
if (values.json)
|
|
23
23
|
write(`${JSON.stringify(report, null, 2)}\n`);
|
|
24
24
|
else {
|
|
25
|
-
write(`Outpost doctor — ${report.scope === "host" ? "host checks" : "host and image checks"} (${
|
|
25
|
+
write(`Outpost doctor — ${report.scope === "host" ? "host checks" : "host and image checks"} (${sandboxProvider}, ${agent})\n`);
|
|
26
26
|
write(`Provider contract: ${report.placement}; interactive terminal: ${report.interactiveTerminal ? "supported" : "unsupported"}. Workflow execution is not tested.\n`);
|
|
27
27
|
if (report.image)
|
|
28
28
|
write(`Image: ${report.image}\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-command.js","sourceRoot":"","sources":["../../src/cli/doctor-command.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIhD,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAE,MAAM,EAAE,WAAW,EAAiB,EACtC,OAAkB,EAClB,QAAgC,CAAC,IAAI,EAAE,EAAE;IACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;IAED,SAAS,CACP,WAAW,CAAC,MAAM,KAAK,CAAC,EACxB,
|
|
1
|
+
{"version":3,"file":"doctor-command.js","sourceRoot":"","sources":["../../src/cli/doctor-command.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n doctorDefaults,\n providerDiagnostics,\n} from \"../application/doctor.constants.ts\";\nimport { diagnose } from \"../application/doctor.ts\";\nimport type { DoctorProvider } from \"../application/doctor.types.ts\";\nimport { invariant } from \"../domain/errors.ts\";\nimport type { Executor } from \"../infrastructure/process.types.ts\";\nimport type { CliInvocation } from \"./main.types.ts\";\n\nfunction isProvider(value: string): value is DoctorProvider {\n return Object.hasOwn(providerDiagnostics, value);\n}\nexport async function doctorCommand(\n { values, positionals }: CliInvocation,\n execute?: Executor,\n write: (text: string) => void = (text) => {\n process.stdout.write(text);\n },\n): Promise<void> {\n invariant(\n positionals.length === 1,\n \"Usage: outpost doctor [--sandbox-provider NAME] [--agent NAME] [--image NAME] [--json]\",\n );\n for (const key of Object.keys(values))\n invariant(\n [\"sandboxProvider\", \"agent\", \"image\", \"json\"].includes(key),\n `Unsupported doctor option: --${key}`,\n );\n const sandboxProvider =\n values.sandboxProvider ?? doctorDefaults.sandboxProvider;\n const agent = values.agent ?? doctorDefaults.agent;\n invariant(\n isProvider(sandboxProvider),\n \"Unknown provider. Choose docker, podman, local, vercel or daytona.\",\n );\n invariant(\n agent === \"codex\" || agent === \"claude\" || agent === \"gemini\",\n \"Unknown agent. Choose codex, claude or gemini.\",\n );\n const report = await diagnose(\n {\n sandboxProvider,\n agent,\n ...(values.image !== undefined ? { image: values.image } : {}),\n },\n execute,\n );\n if (values.json) write(`${JSON.stringify(report, null, 2)}\\n`);\n else {\n write(\n `Outpost doctor — ${report.scope === \"host\" ? \"host checks\" : \"host and image checks\"} (${sandboxProvider}, ${agent})\\n`,\n );\n write(\n `Provider contract: ${report.placement}; interactive terminal: ${report.interactiveTerminal ? \"supported\" : \"unsupported\"}. Workflow execution is not tested.\\n`,\n );\n if (report.image) write(`Image: ${report.image}\\n`);\n for (const check of report.checks)\n write(\n `[${check.status.toUpperCase()}] ${check.id}${check.version ? ` ${check.version}` : \"\"}${check.referenceVersion ? ` (pinned: ${check.referenceVersion})` : \"\"}: ${check.message}\\n`,\n );\n write(\n report.hasFailures\n ? \"Diagnostic checks found failures.\\n\"\n : \"No blocking check failed; warnings and skipped checks still need review.\\n\",\n );\n }\n if (report.hasFailures) process.exitCode = 1;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { authenticationRecipes } from "
|
|
1
|
+
import { authenticationRecipes } from "../adapters/agents/authentication.constants.js";
|
|
2
2
|
export function authenticationEnvironment(options) {
|
|
3
3
|
if (options.baseUrl)
|
|
4
4
|
return `${options.apiKeyEnvironment ?? "OPENAI_API_KEY"}=\n`;
|
|
@@ -20,11 +20,11 @@ export function authenticationInstructions(options) {
|
|
|
20
20
|
export function authenticationSource(options) {
|
|
21
21
|
const agent = options.agent ?? "codex";
|
|
22
22
|
if (options.authentication === "login") {
|
|
23
|
-
if (options.
|
|
24
|
-
return
|
|
23
|
+
if (options.sandboxProvider === "local")
|
|
24
|
+
return 'const authentication = { mode: "login" as const };';
|
|
25
25
|
return `const seed = await readFile(resolve(process.env.CODEX_HOME || resolve(homedir(), ".codex"), "auth.json"), "utf8");
|
|
26
26
|
try { JSON.parse(seed); } catch { throw new Error("Invalid Codex authentication file. Run codex login again with file credential storage."); }
|
|
27
|
-
const authentication = {
|
|
27
|
+
const authentication = { mode: "login" as const, credentials: seed };`;
|
|
28
28
|
}
|
|
29
29
|
const key = authenticationEnvironment(options).trim().replace("=", "");
|
|
30
30
|
const conflict = agent === "claude"
|
|
@@ -36,8 +36,7 @@ const authentication = { sandboxReady: [{ executable: "node", arguments: ["-e",
|
|
|
36
36
|
const guard = conflict
|
|
37
37
|
? `\nif (variables[${JSON.stringify(conflict)}]) throw new Error("Conflicting Claude authentication methods. Keep only the selected credential in the workflow environment.");`
|
|
38
38
|
: "";
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return `${check}\nconst authentication = { sandboxReady: [{ executable: "node", arguments: ["-e", ${JSON.stringify(authenticationRecipes.codex.login)}], stdin: variables.OPENAI_API_KEY }] };`;
|
|
39
|
+
const mode = options.authentication === "oauth-token" ? "oauth-token" : "api-key";
|
|
40
|
+
return `${check}${guard}\nconst authentication = { mode: ${JSON.stringify(mode)} as const${mode === "api-key" ? `, environment: ${JSON.stringify(key)}` : ""} };`;
|
|
42
41
|
}
|
|
43
42
|
//# sourceMappingURL=init-authentication.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-authentication.js","sourceRoot":"","sources":["../../src/cli/init-authentication.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"init-authentication.js","sourceRoot":"","sources":["../../src/cli/init-authentication.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gDAAgD,CAAC;AAEvF,MAAM,UAAU,yBAAyB,CAAC,OAAoB;IAC5D,IAAI,OAAO,CAAC,OAAO;QACjB,OAAO,GAAG,OAAO,CAAC,iBAAiB,IAAI,gBAAgB,KAAK,CAAC;IAC/D,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IAClD,IAAI,OAAO,CAAC,cAAc,KAAK,aAAa;QAC1C,OAAO,4BAA4B,CAAC;IACtC,OAAO,qBAAqB,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAoB;IAC7D,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO;QACpC,OAAO,wJAAwJ,CAAC;IAClK,IAAI,OAAO,CAAC,cAAc,KAAK,aAAa;QAC1C,OAAO,sJAAsJ,CAAC;IAChK,OAAO,CACL,MAAM;QACN,yBAAyB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QAC1D,iGAAiG,CAClG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAoB;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;IACvC,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,eAAe,KAAK,OAAO;YACrC,OAAO,oDAAoD,CAAC;QAC9D,OAAO;;sEAE2D,CAAC;IACrE,CAAC;IACD,MAAM,GAAG,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,QAAQ,GACZ,KAAK,KAAK,QAAQ;QAChB,CAAC,CAAC,GAAG,KAAK,mBAAmB;YAC3B,CAAC,CAAC,yBAAyB;YAC3B,CAAC,CAAC,mBAAmB;QACvB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,KAAK,GAAG,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,gFAAgF,CAAC,IAAI,CAAC;IAC5L,MAAM,KAAK,GAAG,QAAQ;QACpB,CAAC,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,kIAAkI;QAC/K,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,IAAI,GACR,OAAO,CAAC,cAAc,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,OAAO,GAAG,KAAK,GAAG,KAAK,oCAAoC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;AACpK,CAAC","sourcesContent":["import type { InitOptions } from \"./scaffold.types.ts\";\nimport { authenticationRecipes } from \"../adapters/agents/authentication.constants.ts\";\n\nexport function authenticationEnvironment(options: InitOptions): string {\n if (options.baseUrl)\n return `${options.apiKeyEnvironment ?? \"OPENAI_API_KEY\"}=\\n`;\n if (options.authentication === \"login\") return \"\";\n if (options.authentication === \"oauth-token\")\n return \"CLAUDE_CODE_OAUTH_TOKEN=\\n\";\n return authenticationRecipes[options.agent ?? \"codex\"].environment;\n}\n\nexport function authenticationInstructions(options: InitOptions): string {\n if (options.authentication === \"login\")\n return \"Run codex login on the host. For isolated providers, use file credential storage; the generated script copies auth.json into the private sandbox home.\";\n if (options.authentication === \"oauth-token\")\n return \"Run claude setup-token on the host, then set CLAUDE_CODE_OAUTH_TOKEN in the workflow .env or parent environment. This uses your Claude subscription.\";\n return (\n \"Set \" +\n authenticationEnvironment(options).trim().replace(\"=\", \"\") +\n \" in the workflow .env or parent environment. API usage is billed separately from subscriptions.\"\n );\n}\n\nexport function authenticationSource(options: InitOptions): string {\n const agent = options.agent ?? \"codex\";\n if (options.authentication === \"login\") {\n if (options.sandboxProvider === \"local\")\n return 'const authentication = { mode: \"login\" as const };';\n return `const seed = await readFile(resolve(process.env.CODEX_HOME || resolve(homedir(), \".codex\"), \"auth.json\"), \"utf8\");\ntry { JSON.parse(seed); } catch { throw new Error(\"Invalid Codex authentication file. Run codex login again with file credential storage.\"); }\nconst authentication = { mode: \"login\" as const, credentials: seed };`;\n }\n const key = authenticationEnvironment(options).trim().replace(\"=\", \"\");\n const conflict =\n agent === \"claude\"\n ? key === \"ANTHROPIC_API_KEY\"\n ? \"CLAUDE_CODE_OAUTH_TOKEN\"\n : \"ANTHROPIC_API_KEY\"\n : undefined;\n const check = `if (!variables[${JSON.stringify(key)}]) throw new Error(${JSON.stringify(`Missing ${key}. Configure the workflow .env or parent environment before starting a sandbox.`)});`;\n const guard = conflict\n ? `\\nif (variables[${JSON.stringify(conflict)}]) throw new Error(\"Conflicting Claude authentication methods. Keep only the selected credential in the workflow environment.\");`\n : \"\";\n const mode =\n options.authentication === \"oauth-token\" ? \"oauth-token\" : \"api-key\";\n return `${check}${guard}\\nconst authentication = { mode: ${JSON.stringify(mode)} as const${mode === \"api-key\" ? `, environment: ${JSON.stringify(key)}` : \"\"} };`;\n}\n"]}
|
package/dist/cli/init-command.js
CHANGED
|
@@ -16,8 +16,8 @@ export async function initializeCommand({ values, }) {
|
|
|
16
16
|
delete options["api-key-env"];
|
|
17
17
|
if (!values.yes &&
|
|
18
18
|
!process.stdin.isTTY &&
|
|
19
|
-
(!values.agent || !values.
|
|
20
|
-
throw new Error("Headless initialization requires --yes for defaults, or --agent and --provider.");
|
|
19
|
+
(!values.agent || !values.sandboxProvider))
|
|
20
|
+
throw new Error("Headless initialization requires --yes for defaults, or --agent and --sandbox-provider.");
|
|
21
21
|
if (!values.yes && process.stdin.isTTY) {
|
|
22
22
|
intro("Create an Outpost workflow");
|
|
23
23
|
for (const question of initializationQuestions) {
|
|
@@ -63,7 +63,7 @@ export async function initializeCommand({ values, }) {
|
|
|
63
63
|
options[question.key] = value;
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
-
options.build ??= ["docker", "podman"].includes(String(options.
|
|
66
|
+
options.build ??= ["docker", "podman"].includes(String(options.sandboxProvider ?? "docker"));
|
|
67
67
|
const progress = !values.yes && process.stdin.isTTY ? spinner() : undefined;
|
|
68
68
|
progress?.start(options.build
|
|
69
69
|
? "Creating project and building its container image"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-command.js","sourceRoot":"","sources":["../../src/cli/init-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,MAAM,EACN,KAAK,EACL,QAAQ,EACR,KAAK,EACL,MAAM,EACN,OAAO,GACR,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,MAAM,GACQ;IACd,MAAM,OAAO,GAA4B,MAAM,CAAC,WAAW,CACzD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CACzE,CAAC;IACF,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,SAAS;QACrC,OAAO,CAAC,iBAAiB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,IACE,CAAC,MAAM,CAAC,GAAG;QACX,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QACpB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"init-command.js","sourceRoot":"","sources":["../../src/cli/init-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant } from \"../domain/errors.ts\";\nimport { resolve } from \"node:path\";\nimport {\n cancel,\n intro,\n isCancel,\n outro,\n select,\n spinner,\n} from \"@clack/prompts\";\nimport { projectSettings } from \"./project-settings.ts\";\nimport { authenticationInstructions } from \"./init-authentication.ts\";\nimport { supportedManagers } from \"./scaffold.constants.ts\";\nimport {\n initializationQuestions,\n authenticationChoices,\n} from \"./main.constants.ts\";\nimport type { CliInvocation } from \"./main.types.ts\";\nimport { initialize } from \"./scaffold.ts\";\nimport type { InitOptions } from \"./scaffold.types.ts\";\n\nexport async function initializeCommand({\n values,\n}: CliInvocation): Promise<void> {\n const options: Record<string, unknown> = Object.fromEntries(\n Object.entries(values).filter(([key]) => ![\"help\", \"yes\"].includes(key)),\n );\n if (values[\"base-url\"] !== undefined) options.baseUrl = values[\"base-url\"];\n if (values[\"api-key-env\"] !== undefined)\n options.apiKeyEnvironment = values[\"api-key-env\"];\n delete options[\"base-url\"];\n delete options[\"api-key-env\"];\n if (\n !values.yes &&\n !process.stdin.isTTY &&\n (!values.agent || !values.sandboxProvider)\n )\n throw new Error(\n \"Headless initialization requires --yes for defaults, or --agent and --sandbox-provider.\",\n );\n if (!values.yes && process.stdin.isTTY) {\n intro(\"Create an Outpost workflow\");\n for (const question of initializationQuestions) {\n if (options[question.key] !== undefined) continue;\n const value = await select({\n message: question.message,\n options: question.choices.map((value) => ({ value, label: value })),\n });\n if (isCancel(value)) {\n cancel(\"Initialization cancelled.\");\n process.exitCode = 130;\n return;\n }\n options[question.key] = value;\n }\n const settings = await projectSettings(\n resolve(values.directory ?? process.cwd()),\n options as InitOptions,\n );\n const choices = Object.entries(authenticationChoices).find(\n ([name]) => name === options.agent,\n )?.[1];\n invariant(choices, \"Choose codex, claude or gemini\");\n const questions = [\n {\n key: \"manager\",\n message: \"Package manager\",\n options: supportedManagers.map((value) => ({ value, label: value })),\n initialValue: settings.manager,\n },\n {\n key: \"authentication\",\n message: \"Agent authentication\",\n options: [...choices],\n initialValue: \"api-key\",\n },\n ];\n for (const question of questions) {\n if (options[question.key] !== undefined) continue;\n const value = await select(question);\n if (isCancel(value)) {\n cancel(\"Initialization cancelled.\");\n process.exitCode = 130;\n return;\n }\n options[question.key] = value;\n }\n }\n options.build ??= [\"docker\", \"podman\"].includes(\n String(options.sandboxProvider ?? \"docker\"),\n );\n const progress = !values.yes && process.stdin.isTTY ? spinner() : undefined;\n progress?.start(\n options.build\n ? \"Creating project and building its container image\"\n : \"Creating project\",\n );\n let result;\n try {\n result = await initialize(options as InitOptions);\n } catch (error) {\n progress?.stop(\"Initialization failed\");\n throw error;\n }\n progress?.stop(\"Project ready\");\n const installation = options.install\n ? \"\"\n : \"Install project dependencies with your selected package manager before running.\\n\";\n const message = `Initialized ${result.files.length} files in ${resolve(values.directory ?? process.cwd())}.\\n${authenticationInstructions(options as InitOptions)}\\n${installation}Run: ${result.run}`;\n if (!values.yes && process.stdin.isTTY) outro(message);\n else process.stdout.write(`${message}\\n`);\n}\n"]}
|
|
@@ -73,7 +73,7 @@ export declare const cliOptions: {
|
|
|
73
73
|
readonly type: "string";
|
|
74
74
|
readonly description: "Agent: codex, claude or gemini";
|
|
75
75
|
};
|
|
76
|
-
readonly
|
|
76
|
+
readonly sandboxProvider: {
|
|
77
77
|
readonly type: "string";
|
|
78
78
|
readonly description: "Provider: docker, podman, local, vercel or daytona";
|
|
79
79
|
};
|
|
@@ -125,11 +125,11 @@ export declare const cliOptions: {
|
|
|
125
125
|
export declare const commandOptions: {
|
|
126
126
|
readonly init: {
|
|
127
127
|
readonly description: "Create a standalone workflow project";
|
|
128
|
-
readonly options: readonly ["yes", "agent", "
|
|
128
|
+
readonly options: readonly ["yes", "agent", "sandboxProvider", "manager", "authentication", "model", "base-url", "api-key-env", "install", "build", "image", "directory", "repository"];
|
|
129
129
|
};
|
|
130
130
|
readonly doctor: {
|
|
131
131
|
readonly description: "Diagnose host and sandbox prerequisites";
|
|
132
|
-
readonly options: readonly ["
|
|
132
|
+
readonly options: readonly ["sandboxProvider", "agent", "image", "json"];
|
|
133
133
|
};
|
|
134
134
|
readonly "image build": {
|
|
135
135
|
readonly description: "Build a container image";
|
|
@@ -161,7 +161,7 @@ export declare const initializationQuestions: readonly [{
|
|
|
161
161
|
readonly message: "Coding agent";
|
|
162
162
|
readonly choices: readonly ["codex", "claude", "gemini"];
|
|
163
163
|
}, {
|
|
164
|
-
readonly key: "
|
|
164
|
+
readonly key: "sandboxProvider";
|
|
165
165
|
readonly message: "Sandbox provider";
|
|
166
166
|
readonly choices: readonly ["docker", "podman", "vercel", "daytona", "local"];
|
|
167
167
|
}];
|
|
@@ -39,7 +39,7 @@ export const cliOptions = {
|
|
|
39
39
|
"max-bytes": { type: "string", description: "Maximum bytes to inspect" },
|
|
40
40
|
"max-entries": { type: "string", description: "Maximum inventory entries" },
|
|
41
41
|
agent: { type: "string", description: "Agent: codex, claude or gemini" },
|
|
42
|
-
|
|
42
|
+
sandboxProvider: {
|
|
43
43
|
type: "string",
|
|
44
44
|
description: "Provider: docker, podman, local, vercel or daytona",
|
|
45
45
|
},
|
|
@@ -67,7 +67,7 @@ export const commandOptions = {
|
|
|
67
67
|
options: [
|
|
68
68
|
"yes",
|
|
69
69
|
"agent",
|
|
70
|
-
"
|
|
70
|
+
"sandboxProvider",
|
|
71
71
|
"manager",
|
|
72
72
|
"authentication",
|
|
73
73
|
"model",
|
|
@@ -82,7 +82,7 @@ export const commandOptions = {
|
|
|
82
82
|
},
|
|
83
83
|
doctor: {
|
|
84
84
|
description: "Diagnose host and sandbox prerequisites",
|
|
85
|
-
options: ["
|
|
85
|
+
options: ["sandboxProvider", "agent", "image", "json"],
|
|
86
86
|
},
|
|
87
87
|
"image build": {
|
|
88
88
|
description: "Build a container image",
|
|
@@ -131,7 +131,7 @@ export const initializationQuestions = [
|
|
|
131
131
|
choices: ["codex", "claude", "gemini"],
|
|
132
132
|
},
|
|
133
133
|
{
|
|
134
|
-
key: "
|
|
134
|
+
key: "sandboxProvider",
|
|
135
135
|
message: "Sandbox provider",
|
|
136
136
|
choices: ["docker", "podman", "vercel", "daytona", "local"],
|
|
137
137
|
},
|