@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
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { lstat, open } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { OutpostError } from "../domain/errors.js";
|
|
5
|
+
import { expandPath } from "./files.js";
|
|
6
|
+
import { HOST_CREDENTIAL_LIMIT } from "./host-credentials.constants.js";
|
|
7
|
+
export function resolveHostPath(source, environment = process.env) {
|
|
8
|
+
const home = source.home && environment[source.home.variable];
|
|
9
|
+
return home && source.home
|
|
10
|
+
? join(expandPath(home), source.home.path)
|
|
11
|
+
: expandPath(source.path);
|
|
12
|
+
}
|
|
13
|
+
function missing(path, credential) {
|
|
14
|
+
const alternative = credential.alternative
|
|
15
|
+
? `, or pass ${credential.alternative}`
|
|
16
|
+
: "";
|
|
17
|
+
return new OutpostError("configuration", `Account credentials were not found at ${path}. Run ${credential.login} on the host${alternative}. Outpost reads only this file and never reads the system keychain.`, { path });
|
|
18
|
+
}
|
|
19
|
+
export async function readHostCredential(credential, environment = process.env) {
|
|
20
|
+
const path = resolveHostPath(credential.source, environment);
|
|
21
|
+
const link = await lstat(path).catch((error) => {
|
|
22
|
+
if (error.code === "ENOENT" || error.code === "ENOTDIR")
|
|
23
|
+
throw missing(path, credential);
|
|
24
|
+
throw error;
|
|
25
|
+
});
|
|
26
|
+
if (!link.isFile())
|
|
27
|
+
throw new OutpostError("configuration", `Account credentials must be a regular file, not a link or directory: ${path}`, { path });
|
|
28
|
+
const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
29
|
+
try {
|
|
30
|
+
const info = await handle.stat();
|
|
31
|
+
if (!info.isFile() || info.size > HOST_CREDENTIAL_LIMIT)
|
|
32
|
+
throw new OutpostError("configuration", `Account credentials must be a regular file of at most ${HOST_CREDENTIAL_LIMIT} bytes: ${path}`, { path });
|
|
33
|
+
const content = await handle.readFile("utf8");
|
|
34
|
+
return credential.select ? credential.select(content) : content;
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
await handle.close();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function stringEnd(text, start) {
|
|
41
|
+
for (let index = start + 1; index < text.length; index += 1) {
|
|
42
|
+
if (text[index] === '"')
|
|
43
|
+
return index + 1;
|
|
44
|
+
if (text[index] === "\\")
|
|
45
|
+
index += 1;
|
|
46
|
+
}
|
|
47
|
+
return text.length;
|
|
48
|
+
}
|
|
49
|
+
function withoutComments(text) {
|
|
50
|
+
let output = "";
|
|
51
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
52
|
+
const pair = text.slice(index, index + 2);
|
|
53
|
+
if (text[index] === '"') {
|
|
54
|
+
const end = stringEnd(text, index);
|
|
55
|
+
output += text.slice(index, end);
|
|
56
|
+
index = end - 1;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (pair === "//" || pair === "/*") {
|
|
60
|
+
const end = text.indexOf(pair === "//" ? "\n" : "*/", index + 2);
|
|
61
|
+
index = end === -1 ? text.length : end + (pair === "//" ? -1 : 1);
|
|
62
|
+
output += " ";
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
output += text[index];
|
|
66
|
+
}
|
|
67
|
+
return output;
|
|
68
|
+
}
|
|
69
|
+
function withoutTrailingCommas(text) {
|
|
70
|
+
const closing = /\s*[}\]]/y;
|
|
71
|
+
let output = "";
|
|
72
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
73
|
+
if (text[index] === '"') {
|
|
74
|
+
const end = stringEnd(text, index);
|
|
75
|
+
output += text.slice(index, end);
|
|
76
|
+
index = end - 1;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
closing.lastIndex = index + 1;
|
|
80
|
+
if (text[index] === "," && closing.test(text))
|
|
81
|
+
continue;
|
|
82
|
+
output += text[index];
|
|
83
|
+
}
|
|
84
|
+
return output;
|
|
85
|
+
}
|
|
86
|
+
export function parseJsonc(text) {
|
|
87
|
+
return JSON.parse(withoutTrailingCommas(withoutComments(text)));
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=host-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-credentials.js","sourceRoot":"","sources":["../../src/infrastructure/host-credentials.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants } from \"node:fs\";\nimport { lstat, open } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n HostCredential,\n HostCredentialPath,\n} from \"../domain/agent.types.ts\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport { expandPath } from \"./files.ts\";\nimport { HOST_CREDENTIAL_LIMIT } from \"./host-credentials.constants.ts\";\n\nexport function resolveHostPath(\n source: HostCredentialPath,\n environment: NodeJS.ProcessEnv = process.env,\n): string {\n const home = source.home && environment[source.home.variable];\n return home && source.home\n ? join(expandPath(home), source.home.path)\n : expandPath(source.path);\n}\n\nfunction missing(path: string, credential: HostCredential): OutpostError {\n const alternative = credential.alternative\n ? `, or pass ${credential.alternative}`\n : \"\";\n return new OutpostError(\n \"configuration\",\n `Account credentials were not found at ${path}. Run ${credential.login} on the host${alternative}. Outpost reads only this file and never reads the system keychain.`,\n { path },\n );\n}\n\nexport async function readHostCredential(\n credential: HostCredential,\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<string> {\n const path = resolveHostPath(credential.source, environment);\n const link = await lstat(path).catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n throw missing(path, credential);\n throw error;\n });\n if (!link.isFile())\n throw new OutpostError(\n \"configuration\",\n `Account credentials must be a regular file, not a link or directory: ${path}`,\n { path },\n );\n const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n try {\n const info = await handle.stat();\n if (!info.isFile() || info.size > HOST_CREDENTIAL_LIMIT)\n throw new OutpostError(\n \"configuration\",\n `Account credentials must be a regular file of at most ${HOST_CREDENTIAL_LIMIT} bytes: ${path}`,\n { path },\n );\n const content = await handle.readFile(\"utf8\");\n return credential.select ? credential.select(content) : content;\n } finally {\n await handle.close();\n }\n}\n\nfunction stringEnd(text: string, start: number): number {\n for (let index = start + 1; index < text.length; index += 1) {\n if (text[index] === '\"') return index + 1;\n if (text[index] === \"\\\\\") index += 1;\n }\n return text.length;\n}\n\nfunction withoutComments(text: string): string {\n let output = \"\";\n for (let index = 0; index < text.length; index += 1) {\n const pair = text.slice(index, index + 2);\n if (text[index] === '\"') {\n const end = stringEnd(text, index);\n output += text.slice(index, end);\n index = end - 1;\n continue;\n }\n if (pair === \"//\" || pair === \"/*\") {\n const end = text.indexOf(pair === \"//\" ? \"\\n\" : \"*/\", index + 2);\n index = end === -1 ? text.length : end + (pair === \"//\" ? -1 : 1);\n output += \" \";\n continue;\n }\n output += text[index];\n }\n return output;\n}\n\nfunction withoutTrailingCommas(text: string): string {\n const closing = /\\s*[}\\]]/y;\n let output = \"\";\n for (let index = 0; index < text.length; index += 1) {\n if (text[index] === '\"') {\n const end = stringEnd(text, index);\n output += text.slice(index, end);\n index = end - 1;\n continue;\n }\n closing.lastIndex = index + 1;\n if (text[index] === \",\" && closing.test(text)) continue;\n output += text[index];\n }\n return output;\n}\n\nexport function parseJsonc(text: string): unknown {\n return JSON.parse(withoutTrailingCommas(withoutComments(text)));\n}\n"]}
|
|
@@ -4,10 +4,11 @@ export async function isDirectInspectionPath(path) {
|
|
|
4
4
|
let current = resolve(path);
|
|
5
5
|
if ((await realpath(current)) === current)
|
|
6
6
|
return true;
|
|
7
|
-
if (process.platform !== "win32")
|
|
8
|
-
return false;
|
|
9
7
|
while (true) {
|
|
10
|
-
|
|
8
|
+
const info = await lstat(current);
|
|
9
|
+
// Root-owned POSIX links belong to the system layout, such as /var on macOS.
|
|
10
|
+
if (info.isSymbolicLink() &&
|
|
11
|
+
(process.platform === "win32" || info.uid !== 0))
|
|
11
12
|
return false;
|
|
12
13
|
const parent = dirname(current);
|
|
13
14
|
if (parent === current)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspection-path.js","sourceRoot":"","sources":["../../src/infrastructure/inspection-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY;IACvD,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,
|
|
1
|
+
{"version":3,"file":"inspection-path.js","sourceRoot":"","sources":["../../src/infrastructure/inspection-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY;IACvD,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,6EAA6E;QAC7E,IACE,IAAI,CAAC,cAAc,EAAE;YACrB,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAEhD,OAAO,KAAK,CAAC;QACf,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC","sourcesContent":["import { lstat, realpath } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nexport async function isDirectInspectionPath(path: string): Promise<boolean> {\n let current = resolve(path);\n if ((await realpath(current)) === current) return true;\n while (true) {\n const info = await lstat(current);\n // Root-owned POSIX links belong to the system layout, such as /var on macOS.\n if (\n info.isSymbolicLink() &&\n (process.platform === \"win32\" || info.uid !== 0)\n )\n return false;\n const parent = dirname(current);\n if (parent === current) return true;\n current = parent;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const verboseOnly: ReadonlySet<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.constants.js","sourceRoot":"","sources":["../../src/infrastructure/journal.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC","sourcesContent":["export const verboseOnly: ReadonlySet<string> = new Set([\"raw\", \"text-delta\"]);\n"]}
|
|
@@ -1,82 +1,18 @@
|
|
|
1
1
|
import { transportJournal } from "./transport-journal.js";
|
|
2
|
-
import {
|
|
3
|
-
import { markJournalClosed } from "./journal-retention.js";
|
|
4
|
-
import { randomUUID } from "node:crypto";
|
|
5
|
-
import { mkdir, open, rm } from "node:fs/promises";
|
|
6
|
-
import { dirname, join, resolve } from "node:path";
|
|
2
|
+
import { repositoryTransport } from "./repository-transport.js";
|
|
7
3
|
import { reporter } from "./reporter.js";
|
|
8
4
|
export async function journal(repository, logging = {}, label) {
|
|
9
|
-
if (logging && logging !== "stdout"
|
|
10
|
-
|
|
11
|
-
throw new Error("Provide a journal file or transporter, not both");
|
|
12
|
-
return transportJournal(logging.transporter, logging.verbose ?? false, label);
|
|
13
|
-
}
|
|
14
|
-
const file = logging && logging !== "stdout"
|
|
15
|
-
? resolve(repository, logging.file ??
|
|
16
|
-
join(".outpost", "logs", `${label ? label.replace(/[^A-Za-z0-9_-]/g, "-").slice(0, 64) + "-" : ""}${new Date().toISOString().replaceAll(":", "-")}-${randomUUID()}.jsonl`))
|
|
17
|
-
: undefined;
|
|
18
|
-
let handle, pending = Promise.resolve();
|
|
19
|
-
let failure;
|
|
20
|
-
let release;
|
|
21
|
-
let closing;
|
|
22
|
-
const managed = !!logging && logging !== "stdout" && logging.file === undefined;
|
|
5
|
+
if (logging && logging !== "stdout")
|
|
6
|
+
return transportJournal(logging.transporter ?? repositoryTransport(repository), logging.verbose ?? false, label);
|
|
23
7
|
const display = reporter({ ...(label ? { label } : {}) });
|
|
24
|
-
|
|
25
|
-
await mkdir(dirname(file), { recursive: true });
|
|
26
|
-
release = await lock(repository, `journal:${file}`);
|
|
27
|
-
try {
|
|
28
|
-
await rm(`${file}.closed.json`, { force: true });
|
|
29
|
-
handle = await open(file, managed ? "wx" : "a", 0o600);
|
|
30
|
-
await handle.write(JSON.stringify({
|
|
31
|
-
kind: "dispatch-start",
|
|
32
|
-
at: new Date().toISOString(),
|
|
33
|
-
label,
|
|
34
|
-
}) + "\n");
|
|
35
|
-
}
|
|
36
|
-
catch (error) {
|
|
37
|
-
await handle?.close();
|
|
38
|
-
await release();
|
|
39
|
-
throw error;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
8
|
+
let closed = false;
|
|
42
9
|
return {
|
|
43
|
-
...(file ? { file } : {}),
|
|
44
10
|
record(event) {
|
|
45
|
-
if (
|
|
46
|
-
return;
|
|
47
|
-
if (event.kind === "raw" && logging !== "stdout" && !logging.verbose)
|
|
48
|
-
return;
|
|
49
|
-
const line = JSON.stringify({
|
|
50
|
-
at: new Date().toISOString(),
|
|
51
|
-
...(label ? { label } : {}),
|
|
52
|
-
...event,
|
|
53
|
-
}) + "\n";
|
|
54
|
-
if (logging === "stdout")
|
|
11
|
+
if (logging === "stdout" && !closed)
|
|
55
12
|
display(event);
|
|
56
|
-
else
|
|
57
|
-
pending = pending
|
|
58
|
-
.then(async () => {
|
|
59
|
-
await handle?.write(line);
|
|
60
|
-
})
|
|
61
|
-
.catch((error) => {
|
|
62
|
-
failure = error;
|
|
63
|
-
});
|
|
64
13
|
},
|
|
65
|
-
close() {
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
await pending;
|
|
69
|
-
await handle?.close();
|
|
70
|
-
if (failure)
|
|
71
|
-
throw failure;
|
|
72
|
-
if (file && managed)
|
|
73
|
-
await markJournalClosed(file);
|
|
74
|
-
}
|
|
75
|
-
finally {
|
|
76
|
-
await release?.();
|
|
77
|
-
}
|
|
78
|
-
})();
|
|
79
|
-
return closing;
|
|
14
|
+
async close() {
|
|
15
|
+
closed = true;
|
|
80
16
|
},
|
|
81
17
|
};
|
|
82
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/infrastructure/journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/infrastructure/journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIzC,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,UAAkB,EAClB,UAAmB,EAAE,EACrB,KAAc;IAEd,IAAI,OAAO,IAAI,OAAO,KAAK,QAAQ;QACjC,OAAO,gBAAgB,CACrB,OAAO,CAAC,WAAW,IAAI,mBAAmB,CAAC,UAAU,CAAC,EACtD,OAAO,CAAC,OAAO,IAAI,KAAK,EACxB,KAAK,CACN,CAAC;IACJ,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1D,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO;QACL,MAAM,CAAC,KAAK;YACV,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { transportJournal } from \"./transport-journal.ts\";\nimport { repositoryTransport } from \"./repository-transport.ts\";\nimport type { Journal, Logging } from \"./journal.types.ts\";\nimport { reporter } from \"./reporter.ts\";\n\nexport type { Logging } from \"./journal.types.ts\";\n\nexport async function journal(\n repository: string,\n logging: Logging = {},\n label?: string,\n): Promise<Journal> {\n if (logging && logging !== \"stdout\")\n return transportJournal(\n logging.transporter ?? repositoryTransport(repository),\n logging.verbose ?? false,\n label,\n );\n const display = reporter({ ...(label ? { label } : {}) });\n let closed = false;\n return {\n record(event) {\n if (logging === \"stdout\" && !closed) display(event);\n },\n async close() {\n closed = true;\n },\n };\n}\n"]}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { Transport, TransportReference } from "../domain/transport.types.ts";
|
|
2
2
|
import type { AgentEvent } from "../domain/agent.types.ts";
|
|
3
3
|
export type Logging = false | "stdout" | {
|
|
4
|
-
readonly file?: string;
|
|
5
4
|
readonly transporter?: Transport;
|
|
6
5
|
readonly verbose?: boolean;
|
|
7
6
|
};
|
|
8
7
|
export type Journal = {
|
|
9
|
-
file?: string;
|
|
10
8
|
reference?: TransportReference;
|
|
11
9
|
record(event: AgentEvent): void;
|
|
12
10
|
close(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journal.types.js","sourceRoot":"","sources":["../../src/infrastructure/journal.types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n Transport,\n TransportReference,\n} from \"../domain/transport.types.ts\";\nimport type { AgentEvent } from \"../domain/agent.types.ts\";\n\nexport type Logging =\n | false\n | \"stdout\"\n | {\n readonly
|
|
1
|
+
{"version":3,"file":"journal.types.js","sourceRoot":"","sources":["../../src/infrastructure/journal.types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n Transport,\n TransportReference,\n} from \"../domain/transport.types.ts\";\nimport type { AgentEvent } from \"../domain/agent.types.ts\";\n\nexport type Logging =\n | false\n | \"stdout\"\n | {\n readonly transporter?: Transport;\n readonly verbose?: boolean;\n };\n\nexport type Journal = {\n reference?: TransportReference;\n record(event: AgentEvent): void;\n close(): Promise<void>;\n};\n"]}
|
|
@@ -8,14 +8,19 @@ import { OutpostError } from "../domain/errors.js";
|
|
|
8
8
|
import { readInspectionFile } from "./inspection-file.js";
|
|
9
9
|
import { decodeObject, encodeObject, readLimit } from "./transport-envelope.js";
|
|
10
10
|
import { transportDefaults } from "./transport.constants.js";
|
|
11
|
-
async function privateDirectory(path) {
|
|
11
|
+
async function privateDirectory(path, target = true) {
|
|
12
12
|
const parent = dirname(path);
|
|
13
13
|
if (parent !== path) {
|
|
14
|
-
await privateDirectory(parent);
|
|
14
|
+
await privateDirectory(parent, false);
|
|
15
15
|
await mkdir(path, { recursive: true, mode: 0o700 });
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
const info = await lstat(path);
|
|
18
|
+
if (info.isDirectory())
|
|
19
|
+
return;
|
|
20
|
+
// Root-owned ancestor links belong to the system layout, such as /var on macOS.
|
|
21
|
+
if (!target && info.isSymbolicLink() && info.uid === 0)
|
|
22
|
+
return;
|
|
23
|
+
throw new Error("Transport directories must not be symlinks");
|
|
19
24
|
}
|
|
20
25
|
export function localTransport(options) {
|
|
21
26
|
const root = resolve(options.directory), objects = join(root, "objects");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-transport.js","sourceRoot":"","sources":["../../src/infrastructure/local-transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, lstat, open, rename, rm, readdir } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { setTimeout } from \"node:timers/promises\";\nimport {\n TransportConflict,\n transportKey,\n transportCondition,\n} from \"../domain/transport.ts\";\nimport type {\n Transport,\n TransportWriteOptions,\n} from \"../domain/transport.types.ts\";\nimport type { LocalTransportOptions } from \"./local-transport.types.ts\";\nimport { lock } from \"./git/lock.ts\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport { readInspectionFile } from \"./inspection-file.ts\";\nimport { decodeObject, encodeObject, readLimit } from \"./transport-envelope.ts\";\nimport { transportDefaults } from \"./transport.constants.ts\";\n\nasync function privateDirectory(path: string): Promise<void> {\n const parent = dirname(path);\n if (parent !== path) {\n await privateDirectory(parent);\n await mkdir(path, { recursive: true, mode: 0o700 });\n }\n if (!(await lstat(path)).isDirectory())\n throw new Error(\"Transport directories must not be symlinks\");\n}\n\nexport function localTransport(options: LocalTransportOptions): Transport {\n const root = resolve(options.directory),\n objects = join(root, \"objects\");\n const path = (key: string) => join(objects, `${transportKey(key)}.object`);\n const read: Transport[\"read\"] = async (key, options = {}) => {\n options.signal?.throwIfAborted();\n const limit = readLimit(options.maxBytes);\n try {\n const target = path(key);\n const info = await lstat(target);\n const data = await readInspectionFile(\n target,\n Math.min(info.size, limit + transportDefaults.headerBytes) || 1,\n );\n options.signal?.throwIfAborted();\n return decodeObject(data, key, limit);\n } catch (error) {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n }\n };\n async function mutate<T>(\n key: string,\n options: TransportWriteOptions,\n action: () => Promise<T>,\n ): Promise<T> {\n transportKey(key);\n transportCondition(options.ifRevision);\n await privateDirectory(root);\n const signal = AbortSignal.any([\n AbortSignal.timeout(transportDefaults.lockMs),\n ...(options.signal ? [options.signal] : []),\n ]);\n let release: (() => Promise<void>) | undefined;\n while (!release) {\n signal.throwIfAborted();\n try {\n release = await lock(root, key);\n } catch (error) {\n if (!(error instanceof OutpostError) || error.code !== \"conflict\")\n throw error;\n await setTimeout(transportDefaults.retryMs, undefined, { signal });\n }\n }\n try {\n if ((await read(key))?.revision !== (options.ifRevision ?? undefined))\n throw new TransportConflict(key);\n options.signal?.throwIfAborted();\n return await action();\n } finally {\n await release();\n }\n }\n return {\n name: \"local\",\n read,\n write(key, input, options) {\n const bytes = Buffer.from(input);\n return mutate(key, options, async () => {\n const target = path(key);\n await privateDirectory(dirname(target));\n const { entry, data } = encodeObject(key, bytes);\n const temporary = `${target}.${randomUUID()}.tmp`;\n try {\n const file = await open(temporary, \"wx\", 0o600);\n try {\n await file.writeFile(data, { signal: options.signal });\n await file.sync();\n } finally {\n await file.close();\n }\n options.signal?.throwIfAborted();\n await rename(temporary, target);\n if (process.platform !== \"win32\") {\n const parent = await open(dirname(target), \"r\");\n try {\n await parent.sync();\n } finally {\n await parent.close();\n }\n }\n return entry;\n } finally {\n await rm(temporary, { force: true });\n }\n });\n },\n remove(key, options) {\n if (options.ifRevision === null)\n return Promise.reject(\n new Error(\"Transport removal requires an existing revision\"),\n );\n return mutate(key, options, () => rm(path(key), { force: true }));\n },\n async *list(prefix = \"\", options = {}) {\n if (prefix) transportKey(prefix.replace(/\\/$/, \"\"));\n async function* scan(\n directory: string,\n base: string,\n ): AsyncIterable<string> {\n const entries = await readdir(directory, { withFileTypes: true }).catch(\n (error) => {\n if (error.code === \"ENOENT\") return [];\n throw error;\n },\n );\n for (const entry of entries) {\n options.signal?.throwIfAborted();\n const name = `${base}${entry.name}`;\n if (entry.isDirectory())\n yield* scan(join(directory, entry.name), `${name}/`);\n if (entry.isFile() && name.endsWith(\".object\"))\n yield name.slice(0, -7);\n if (entry.isSymbolicLink())\n throw new Error(\"Transport objects must not be symlinks\");\n }\n }\n for await (const key of scan(objects, \"\")) {\n if (!key.startsWith(prefix)) continue;\n const object = await read(\n key,\n options.signal ? { signal: options.signal } : {},\n );\n if (object) {\n const { bytes: _bytes, ...entry } = object;\n yield entry;\n }\n }\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"local-transport.js","sourceRoot":"","sources":["../../src/infrastructure/local-transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, lstat, open, rename, rm, readdir } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { setTimeout } from \"node:timers/promises\";\nimport {\n TransportConflict,\n transportKey,\n transportCondition,\n} from \"../domain/transport.ts\";\nimport type {\n Transport,\n TransportWriteOptions,\n} from \"../domain/transport.types.ts\";\nimport type { LocalTransportOptions } from \"./local-transport.types.ts\";\nimport { lock } from \"./git/lock.ts\";\nimport { OutpostError } from \"../domain/errors.ts\";\nimport { readInspectionFile } from \"./inspection-file.ts\";\nimport { decodeObject, encodeObject, readLimit } from \"./transport-envelope.ts\";\nimport { transportDefaults } from \"./transport.constants.ts\";\n\nasync function privateDirectory(path: string, target = true): Promise<void> {\n const parent = dirname(path);\n if (parent !== path) {\n await privateDirectory(parent, false);\n await mkdir(path, { recursive: true, mode: 0o700 });\n }\n const info = await lstat(path);\n if (info.isDirectory()) return;\n // Root-owned ancestor links belong to the system layout, such as /var on macOS.\n if (!target && info.isSymbolicLink() && info.uid === 0) return;\n throw new Error(\"Transport directories must not be symlinks\");\n}\n\nexport function localTransport(options: LocalTransportOptions): Transport {\n const root = resolve(options.directory),\n objects = join(root, \"objects\");\n const path = (key: string) => join(objects, `${transportKey(key)}.object`);\n const read: Transport[\"read\"] = async (key, options = {}) => {\n options.signal?.throwIfAborted();\n const limit = readLimit(options.maxBytes);\n try {\n const target = path(key);\n const info = await lstat(target);\n const data = await readInspectionFile(\n target,\n Math.min(info.size, limit + transportDefaults.headerBytes) || 1,\n );\n options.signal?.throwIfAborted();\n return decodeObject(data, key, limit);\n } catch (error) {\n if (\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n }\n };\n async function mutate<T>(\n key: string,\n options: TransportWriteOptions,\n action: () => Promise<T>,\n ): Promise<T> {\n transportKey(key);\n transportCondition(options.ifRevision);\n await privateDirectory(root);\n const signal = AbortSignal.any([\n AbortSignal.timeout(transportDefaults.lockMs),\n ...(options.signal ? [options.signal] : []),\n ]);\n let release: (() => Promise<void>) | undefined;\n while (!release) {\n signal.throwIfAborted();\n try {\n release = await lock(root, key);\n } catch (error) {\n if (!(error instanceof OutpostError) || error.code !== \"conflict\")\n throw error;\n await setTimeout(transportDefaults.retryMs, undefined, { signal });\n }\n }\n try {\n if ((await read(key))?.revision !== (options.ifRevision ?? undefined))\n throw new TransportConflict(key);\n options.signal?.throwIfAborted();\n return await action();\n } finally {\n await release();\n }\n }\n return {\n name: \"local\",\n read,\n write(key, input, options) {\n const bytes = Buffer.from(input);\n return mutate(key, options, async () => {\n const target = path(key);\n await privateDirectory(dirname(target));\n const { entry, data } = encodeObject(key, bytes);\n const temporary = `${target}.${randomUUID()}.tmp`;\n try {\n const file = await open(temporary, \"wx\", 0o600);\n try {\n await file.writeFile(data, { signal: options.signal });\n await file.sync();\n } finally {\n await file.close();\n }\n options.signal?.throwIfAborted();\n await rename(temporary, target);\n if (process.platform !== \"win32\") {\n const parent = await open(dirname(target), \"r\");\n try {\n await parent.sync();\n } finally {\n await parent.close();\n }\n }\n return entry;\n } finally {\n await rm(temporary, { force: true });\n }\n });\n },\n remove(key, options) {\n if (options.ifRevision === null)\n return Promise.reject(\n new Error(\"Transport removal requires an existing revision\"),\n );\n return mutate(key, options, () => rm(path(key), { force: true }));\n },\n async *list(prefix = \"\", options = {}) {\n if (prefix) transportKey(prefix.replace(/\\/$/, \"\"));\n async function* scan(\n directory: string,\n base: string,\n ): AsyncIterable<string> {\n const entries = await readdir(directory, { withFileTypes: true }).catch(\n (error) => {\n if (error.code === \"ENOENT\") return [];\n throw error;\n },\n );\n for (const entry of entries) {\n options.signal?.throwIfAborted();\n const name = `${base}${entry.name}`;\n if (entry.isDirectory())\n yield* scan(join(directory, entry.name), `${name}/`);\n if (entry.isFile() && name.endsWith(\".object\"))\n yield name.slice(0, -7);\n if (entry.isSymbolicLink())\n throw new Error(\"Transport objects must not be symlinks\");\n }\n }\n for await (const key of scan(objects, \"\")) {\n if (!key.startsWith(prefix)) continue;\n const object = await read(\n key,\n options.signal ? { signal: options.signal } : {},\n );\n if (object) {\n const { bytes: _bytes, ...entry } = object;\n yield entry;\n }\n }\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DispatchTelemetrySession } from "../domain/dispatch-telemetry.types.ts";
|
|
2
|
+
import type { OpenTelemetryOptions } from "./opentelemetry.types.ts";
|
|
3
|
+
export declare function dispatchTelemetry(options: OpenTelemetryOptions): {
|
|
4
|
+
startDispatch(): DispatchTelemetrySession;
|
|
5
|
+
close(): void;
|
|
6
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { context, SpanStatusCode } from "@opentelemetry/api";
|
|
2
|
+
import { telemetryNames } from "./opentelemetry.constants.js";
|
|
3
|
+
import { usageDimensions } from "../domain/workflow/budget.constants.js";
|
|
4
|
+
export function dispatchTelemetry(options) {
|
|
5
|
+
function safe(action) {
|
|
6
|
+
try {
|
|
7
|
+
return action();
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
try {
|
|
11
|
+
options.onError?.(error);
|
|
12
|
+
}
|
|
13
|
+
catch { }
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const executions = safe(() => options.meter.createCounter(telemetryNames.dispatches));
|
|
17
|
+
const durations = safe(() => options.meter.createHistogram(telemetryNames.dispatchDuration, {
|
|
18
|
+
unit: "s",
|
|
19
|
+
}));
|
|
20
|
+
const tokens = safe(() => options.meter.createCounter(telemetryNames.dispatchTokens, {
|
|
21
|
+
unit: "{token}",
|
|
22
|
+
}));
|
|
23
|
+
const sessions = new Set();
|
|
24
|
+
let closed = false;
|
|
25
|
+
return {
|
|
26
|
+
startDispatch() {
|
|
27
|
+
if (closed)
|
|
28
|
+
return { finish() { } };
|
|
29
|
+
const started = Date.now();
|
|
30
|
+
const span = safe(() => options.tracer.startSpan("outpost.dispatch", { startTime: started }, context.active()));
|
|
31
|
+
const session = {
|
|
32
|
+
finish(outcome) {
|
|
33
|
+
if (!sessions.delete(session))
|
|
34
|
+
return;
|
|
35
|
+
const at = Date.now();
|
|
36
|
+
const attributes = { "outpost.status": outcome.status };
|
|
37
|
+
safe(() => span?.setAttributes(attributes));
|
|
38
|
+
if (outcome.completed !== undefined)
|
|
39
|
+
safe(() => span?.setAttribute("outpost.completed", outcome.completed));
|
|
40
|
+
safe(() => span?.setStatus({
|
|
41
|
+
code: outcome.status === "done"
|
|
42
|
+
? SpanStatusCode.OK
|
|
43
|
+
: SpanStatusCode.ERROR,
|
|
44
|
+
}));
|
|
45
|
+
safe(() => span?.end(at));
|
|
46
|
+
safe(() => executions?.add(1, attributes));
|
|
47
|
+
safe(() => durations?.record(Math.max(0, at - started) / 1000, attributes));
|
|
48
|
+
for (const dimension of usageDimensions) {
|
|
49
|
+
const value = outcome.usage[dimension];
|
|
50
|
+
if (value !== undefined && Number.isFinite(value) && value > 0)
|
|
51
|
+
safe(() => tokens?.add(value, { "outpost.token.type": dimension }));
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
sessions.add(session);
|
|
56
|
+
return session;
|
|
57
|
+
},
|
|
58
|
+
close() {
|
|
59
|
+
if (closed)
|
|
60
|
+
return;
|
|
61
|
+
closed = true;
|
|
62
|
+
for (const session of sessions)
|
|
63
|
+
session.finish({
|
|
64
|
+
status: "cancelled",
|
|
65
|
+
usage: { input: 0, cached: 0, output: 0 },
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=opentelemetry-dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opentelemetry-dispatch.js","sourceRoot":"","sources":["../../src/infrastructure/opentelemetry-dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["import { context, SpanStatusCode } from \"@opentelemetry/api\";\nimport type {\n DispatchTelemetryOutcome,\n DispatchTelemetrySession,\n} from \"../domain/dispatch-telemetry.types.ts\";\nimport type { OpenTelemetryOptions } from \"./opentelemetry.types.ts\";\nimport { telemetryNames } from \"./opentelemetry.constants.ts\";\nimport { usageDimensions } from \"../domain/workflow/budget.constants.ts\";\n\nexport function dispatchTelemetry(options: OpenTelemetryOptions) {\n function safe<T>(action: () => T): T | undefined {\n try {\n return action();\n } catch (error) {\n try {\n options.onError?.(error);\n } catch {}\n }\n }\n const executions = safe(() =>\n options.meter.createCounter(telemetryNames.dispatches),\n );\n const durations = safe(() =>\n options.meter.createHistogram(telemetryNames.dispatchDuration, {\n unit: \"s\",\n }),\n );\n const tokens = safe(() =>\n options.meter.createCounter(telemetryNames.dispatchTokens, {\n unit: \"{token}\",\n }),\n );\n const sessions = new Set<DispatchTelemetrySession>();\n let closed = false;\n return {\n startDispatch(): DispatchTelemetrySession {\n if (closed) return { finish() {} };\n const started = Date.now();\n const span = safe(() =>\n options.tracer.startSpan(\n \"outpost.dispatch\",\n { startTime: started },\n context.active(),\n ),\n );\n const session: DispatchTelemetrySession = {\n finish(outcome: DispatchTelemetryOutcome) {\n if (!sessions.delete(session)) return;\n const at = Date.now();\n const attributes = { \"outpost.status\": outcome.status };\n safe(() => span?.setAttributes(attributes));\n if (outcome.completed !== undefined)\n safe(() =>\n span?.setAttribute(\"outpost.completed\", outcome.completed!),\n );\n safe(() =>\n span?.setStatus({\n code:\n outcome.status === \"done\"\n ? SpanStatusCode.OK\n : SpanStatusCode.ERROR,\n }),\n );\n safe(() => span?.end(at));\n safe(() => executions?.add(1, attributes));\n safe(() =>\n durations?.record(Math.max(0, at - started) / 1000, attributes),\n );\n for (const dimension of usageDimensions) {\n const value = outcome.usage[dimension];\n if (value !== undefined && Number.isFinite(value) && value > 0)\n safe(() =>\n tokens?.add(value, { \"outpost.token.type\": dimension }),\n );\n }\n },\n };\n sessions.add(session);\n return session;\n },\n close() {\n if (closed) return;\n closed = true;\n for (const session of sessions)\n session.finish({\n status: \"cancelled\",\n usage: { input: 0, cached: 0, output: 0 },\n });\n },\n };\n}\n"]}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export declare const telemetryNames: {
|
|
2
|
+
readonly dispatches: "outpost.dispatch.executions";
|
|
3
|
+
readonly dispatchDuration: "outpost.dispatch.duration";
|
|
4
|
+
readonly dispatchTokens: "outpost.dispatch.tokens";
|
|
2
5
|
readonly workflows: "outpost.workflow.executions";
|
|
3
6
|
readonly tasks: "outpost.task.executions";
|
|
4
7
|
readonly attempts: "outpost.task.attempts";
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export const telemetryNames = {
|
|
2
|
+
dispatches: "outpost.dispatch.executions",
|
|
3
|
+
dispatchDuration: "outpost.dispatch.duration",
|
|
4
|
+
dispatchTokens: "outpost.dispatch.tokens",
|
|
2
5
|
workflows: "outpost.workflow.executions",
|
|
3
6
|
tasks: "outpost.task.executions",
|
|
4
7
|
attempts: "outpost.task.attempts",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opentelemetry.constants.js","sourceRoot":"","sources":["../../src/infrastructure/opentelemetry.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,SAAS,EAAE,6BAA6B;IACxC,KAAK,EAAE,yBAAyB;IAChC,QAAQ,EAAE,uBAAuB;IACjC,OAAO,EAAE,sBAAsB;IAC/B,KAAK,EAAE,sBAAsB;IAC7B,gBAAgB,EAAE,2BAA2B;IAC7C,YAAY,EAAE,uBAAuB;IACrC,eAAe,EAAE,+BAA+B;CACxC,CAAC","sourcesContent":["export const telemetryNames = {\n workflows: \"outpost.workflow.executions\",\n tasks: \"outpost.task.executions\",\n attempts: \"outpost.task.attempts\",\n retries: \"outpost.task.retries\",\n usage: \"outpost.agent.tokens\",\n workflowDuration: \"outpost.workflow.duration\",\n taskDuration: \"outpost.task.duration\",\n attemptDuration: \"outpost.task.attempt.duration\",\n} as const;\n"]}
|
|
1
|
+
{"version":3,"file":"opentelemetry.constants.js","sourceRoot":"","sources":["../../src/infrastructure/opentelemetry.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,6BAA6B;IACzC,gBAAgB,EAAE,2BAA2B;IAC7C,cAAc,EAAE,yBAAyB;IACzC,SAAS,EAAE,6BAA6B;IACxC,KAAK,EAAE,yBAAyB;IAChC,QAAQ,EAAE,uBAAuB;IACjC,OAAO,EAAE,sBAAsB;IAC/B,KAAK,EAAE,sBAAsB;IAC7B,gBAAgB,EAAE,2BAA2B;IAC7C,YAAY,EAAE,uBAAuB;IACrC,eAAe,EAAE,+BAA+B;CACxC,CAAC","sourcesContent":["export const telemetryNames = {\n dispatches: \"outpost.dispatch.executions\",\n dispatchDuration: \"outpost.dispatch.duration\",\n dispatchTokens: \"outpost.dispatch.tokens\",\n workflows: \"outpost.workflow.executions\",\n tasks: \"outpost.task.executions\",\n attempts: \"outpost.task.attempts\",\n retries: \"outpost.task.retries\",\n usage: \"outpost.agent.tokens\",\n workflowDuration: \"outpost.workflow.duration\",\n taskDuration: \"outpost.task.duration\",\n attemptDuration: \"outpost.task.attempt.duration\",\n} as const;\n"]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { dispatchTelemetry } from "./opentelemetry-dispatch.js";
|
|
1
2
|
import { context, trace, SpanStatusCode } from "@opentelemetry/api";
|
|
2
3
|
import { usageDimensions } from "../domain/workflow/budget.constants.js";
|
|
3
4
|
import { telemetryNames } from "./opentelemetry.constants.js";
|
|
4
5
|
export function openTelemetry(options) {
|
|
6
|
+
const dispatches = dispatchTelemetry(options);
|
|
5
7
|
function safe(action) {
|
|
6
8
|
try {
|
|
7
9
|
return action();
|
|
@@ -60,6 +62,7 @@ export function openTelemetry(options) {
|
|
|
60
62
|
safe(() => counters.workflows?.add(1, { "outpost.status": status }));
|
|
61
63
|
}
|
|
62
64
|
return {
|
|
65
|
+
startDispatch: dispatches.startDispatch,
|
|
63
66
|
observe(event) {
|
|
64
67
|
if (closed)
|
|
65
68
|
return;
|
|
@@ -122,6 +125,7 @@ export function openTelemetry(options) {
|
|
|
122
125
|
if (closed)
|
|
123
126
|
return;
|
|
124
127
|
closed = true;
|
|
128
|
+
dispatches.close();
|
|
125
129
|
for (const execution of executions.values())
|
|
126
130
|
complete(execution, "cancelled", Date.now());
|
|
127
131
|
executions.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opentelemetry.js","sourceRoot":"","sources":["../../src/infrastructure/opentelemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import { context, trace, SpanStatusCode } from \"@opentelemetry/api\";\nimport type { Context, Histogram } from \"@opentelemetry/api\";\nimport type { WorkflowEvent } from \"../domain/workflow.types.ts\";\nimport { usageDimensions } from \"../domain/workflow/budget.constants.ts\";\nimport { telemetryNames } from \"./opentelemetry.constants.ts\";\nimport type {\n OpenTelemetryObserver,\n OpenTelemetryOptions,\n TelemetryExecution,\n TelemetryOperation,\n} from \"./opentelemetry.types.ts\";\n\nexport type {\n OpenTelemetryObserver,\n OpenTelemetryOptions,\n} from \"./opentelemetry.types.ts\";\n\nexport function openTelemetry(\n options: OpenTelemetryOptions,\n): OpenTelemetryObserver {\n function safe<T>(action: () => T): T | undefined {\n try {\n return action();\n } catch (error) {\n try {\n options.onError?.(error);\n } catch {}\n }\n }\n const counters = {\n workflows: safe(() =>\n options.meter.createCounter(telemetryNames.workflows),\n ),\n tasks: safe(() => options.meter.createCounter(telemetryNames.tasks)),\n attempts: safe(() => options.meter.createCounter(telemetryNames.attempts)),\n retries: safe(() => options.meter.createCounter(telemetryNames.retries)),\n usage: safe(() =>\n options.meter.createCounter(telemetryNames.usage, { unit: \"{token}\" }),\n ),\n };\n const durations = {\n workflow: safe(() =>\n options.meter.createHistogram(telemetryNames.workflowDuration, {\n unit: \"s\",\n }),\n ),\n task: safe(() =>\n options.meter.createHistogram(telemetryNames.taskDuration, { unit: \"s\" }),\n ),\n attempt: safe(() =>\n options.meter.createHistogram(telemetryNames.attemptDuration, {\n unit: \"s\",\n }),\n ),\n };\n const executions = new Map<string, TelemetryExecution>();\n let closed = false;\n function start(\n name: string,\n parent: Context,\n at: number,\n ): TelemetryOperation {\n const span = safe(() =>\n options.tracer.startSpan(name, { startTime: at }, parent),\n );\n return {\n span,\n context: span ? trace.setSpan(parent, span) : parent,\n started: at,\n };\n }\n function finish(\n operation: TelemetryOperation | undefined,\n status: string,\n at: number,\n duration: Histogram | undefined,\n ): void {\n if (!operation) return;\n const attributes = { \"outpost.status\": status };\n safe(() => operation.span?.setAttributes(attributes));\n if (status !== \"skipped\" && status !== \"paused\")\n safe(() =>\n operation.span?.setStatus({\n code: status === \"done\" ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n }),\n );\n safe(() => operation.span?.end(at));\n safe(() =>\n duration?.record(Math.max(0, at - operation.started) / 1000, attributes),\n );\n }\n function complete(\n execution: TelemetryExecution,\n status: string,\n at: number,\n ): void {\n for (const attempt of execution.attempts.values())\n finish(attempt, status, at, durations.attempt);\n for (const task of execution.tasks.values())\n finish(task, status, at, durations.task);\n finish(execution.workflow, status, at, durations.workflow);\n safe(() => counters.workflows?.add(1, { \"outpost.status\": status }));\n }\n return {\n observe(event: WorkflowEvent) {\n if (closed) return;\n const at = Date.parse(event.timestamp);\n if (!Number.isFinite(at)) return;\n if (event.type === \"start\") {\n if (executions.has(event.executionId)) return;\n executions.set(event.executionId, {\n workflow: start(\"outpost.workflow\", context.active(), at),\n tasks: new Map(),\n attempts: new Map(),\n });\n return;\n }\n const execution = executions.get(event.executionId);\n if (!execution) return;\n if (event.type === \"finish\") {\n executions.delete(event.executionId);\n complete(execution, event.status ?? \"done\", at);\n return;\n }\n if (event.type === \"usage\") {\n for (const dimension of usageDimensions) {\n const value = event.usage?.[dimension];\n if (value !== undefined && Number.isFinite(value) && value > 0)\n safe(() =>\n counters.usage?.add(value, { \"outpost.token.type\": dimension }),\n );\n }\n return;\n }\n if (event.key === undefined) return;\n if (event.type === \"attempt\") {\n execution.attempts.set(\n event.key,\n start(\n \"outpost.task.attempt\",\n execution.tasks.get(event.key)?.context ??\n execution.workflow.context,\n at,\n ),\n );\n safe(() => counters.attempts?.add(1));\n return;\n }\n if (event.type === \"retry\") {\n finish(\n execution.attempts.get(event.key),\n \"failed\",\n at,\n durations.attempt,\n );\n execution.attempts.delete(event.key);\n safe(() => counters.retries?.add(1));\n return;\n }\n if (event.type === \"task\" && event.status === \"active\") {\n execution.tasks.set(\n event.key,\n start(\"outpost.task\", execution.workflow.context, at),\n );\n return;\n }\n if (event.type === \"task\" && event.status) {\n finish(\n execution.attempts.get(event.key),\n event.status,\n at,\n durations.attempt,\n );\n finish(\n execution.tasks.get(event.key),\n event.status,\n at,\n durations.task,\n );\n execution.attempts.delete(event.key);\n execution.tasks.delete(event.key);\n safe(() => counters.tasks?.add(1, { \"outpost.status\": event.status }));\n }\n },\n close() {\n if (closed) return;\n closed = true;\n for (const execution of executions.values())\n complete(execution, \"cancelled\", Date.now());\n executions.clear();\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"opentelemetry.js","sourceRoot":"","sources":["../../src/infrastructure/opentelemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import { dispatchTelemetry } from \"./opentelemetry-dispatch.ts\";\nimport { context, trace, SpanStatusCode } from \"@opentelemetry/api\";\nimport type { Context, Histogram } from \"@opentelemetry/api\";\nimport type { WorkflowEvent } from \"../domain/workflow.types.ts\";\nimport { usageDimensions } from \"../domain/workflow/budget.constants.ts\";\nimport { telemetryNames } from \"./opentelemetry.constants.ts\";\nimport type {\n OpenTelemetryObserver,\n OpenTelemetryOptions,\n TelemetryExecution,\n TelemetryOperation,\n} from \"./opentelemetry.types.ts\";\n\nexport type {\n OpenTelemetryObserver,\n OpenTelemetryOptions,\n} from \"./opentelemetry.types.ts\";\n\nexport function openTelemetry(\n options: OpenTelemetryOptions,\n): OpenTelemetryObserver {\n const dispatches = dispatchTelemetry(options);\n function safe<T>(action: () => T): T | undefined {\n try {\n return action();\n } catch (error) {\n try {\n options.onError?.(error);\n } catch {}\n }\n }\n const counters = {\n workflows: safe(() =>\n options.meter.createCounter(telemetryNames.workflows),\n ),\n tasks: safe(() => options.meter.createCounter(telemetryNames.tasks)),\n attempts: safe(() => options.meter.createCounter(telemetryNames.attempts)),\n retries: safe(() => options.meter.createCounter(telemetryNames.retries)),\n usage: safe(() =>\n options.meter.createCounter(telemetryNames.usage, { unit: \"{token}\" }),\n ),\n };\n const durations = {\n workflow: safe(() =>\n options.meter.createHistogram(telemetryNames.workflowDuration, {\n unit: \"s\",\n }),\n ),\n task: safe(() =>\n options.meter.createHistogram(telemetryNames.taskDuration, { unit: \"s\" }),\n ),\n attempt: safe(() =>\n options.meter.createHistogram(telemetryNames.attemptDuration, {\n unit: \"s\",\n }),\n ),\n };\n const executions = new Map<string, TelemetryExecution>();\n let closed = false;\n function start(\n name: string,\n parent: Context,\n at: number,\n ): TelemetryOperation {\n const span = safe(() =>\n options.tracer.startSpan(name, { startTime: at }, parent),\n );\n return {\n span,\n context: span ? trace.setSpan(parent, span) : parent,\n started: at,\n };\n }\n function finish(\n operation: TelemetryOperation | undefined,\n status: string,\n at: number,\n duration: Histogram | undefined,\n ): void {\n if (!operation) return;\n const attributes = { \"outpost.status\": status };\n safe(() => operation.span?.setAttributes(attributes));\n if (status !== \"skipped\" && status !== \"paused\")\n safe(() =>\n operation.span?.setStatus({\n code: status === \"done\" ? SpanStatusCode.OK : SpanStatusCode.ERROR,\n }),\n );\n safe(() => operation.span?.end(at));\n safe(() =>\n duration?.record(Math.max(0, at - operation.started) / 1000, attributes),\n );\n }\n function complete(\n execution: TelemetryExecution,\n status: string,\n at: number,\n ): void {\n for (const attempt of execution.attempts.values())\n finish(attempt, status, at, durations.attempt);\n for (const task of execution.tasks.values())\n finish(task, status, at, durations.task);\n finish(execution.workflow, status, at, durations.workflow);\n safe(() => counters.workflows?.add(1, { \"outpost.status\": status }));\n }\n return {\n startDispatch: dispatches.startDispatch,\n observe(event: WorkflowEvent) {\n if (closed) return;\n const at = Date.parse(event.timestamp);\n if (!Number.isFinite(at)) return;\n if (event.type === \"start\") {\n if (executions.has(event.executionId)) return;\n executions.set(event.executionId, {\n workflow: start(\"outpost.workflow\", context.active(), at),\n tasks: new Map(),\n attempts: new Map(),\n });\n return;\n }\n const execution = executions.get(event.executionId);\n if (!execution) return;\n if (event.type === \"finish\") {\n executions.delete(event.executionId);\n complete(execution, event.status ?? \"done\", at);\n return;\n }\n if (event.type === \"usage\") {\n for (const dimension of usageDimensions) {\n const value = event.usage?.[dimension];\n if (value !== undefined && Number.isFinite(value) && value > 0)\n safe(() =>\n counters.usage?.add(value, { \"outpost.token.type\": dimension }),\n );\n }\n return;\n }\n if (event.key === undefined) return;\n if (event.type === \"attempt\") {\n execution.attempts.set(\n event.key,\n start(\n \"outpost.task.attempt\",\n execution.tasks.get(event.key)?.context ??\n execution.workflow.context,\n at,\n ),\n );\n safe(() => counters.attempts?.add(1));\n return;\n }\n if (event.type === \"retry\") {\n finish(\n execution.attempts.get(event.key),\n \"failed\",\n at,\n durations.attempt,\n );\n execution.attempts.delete(event.key);\n safe(() => counters.retries?.add(1));\n return;\n }\n if (event.type === \"task\" && event.status === \"active\") {\n execution.tasks.set(\n event.key,\n start(\"outpost.task\", execution.workflow.context, at),\n );\n return;\n }\n if (event.type === \"task\" && event.status) {\n finish(\n execution.attempts.get(event.key),\n event.status,\n at,\n durations.attempt,\n );\n finish(\n execution.tasks.get(event.key),\n event.status,\n at,\n durations.task,\n );\n execution.attempts.delete(event.key);\n execution.tasks.delete(event.key);\n safe(() => counters.tasks?.add(1, { \"outpost.status\": event.status }));\n }\n },\n close() {\n if (closed) return;\n closed = true;\n dispatches.close();\n for (const execution of executions.values())\n complete(execution, \"cancelled\", Date.now());\n executions.clear();\n },\n };\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { Context, Meter, Span, Tracer } from "@opentelemetry/api";
|
|
2
|
-
import type {
|
|
2
|
+
import type { DispatchTelemetry } from "../domain/dispatch-telemetry.types.ts";
|
|
3
|
+
import type { WorkflowTelemetry } from "../domain/workflow.types.ts";
|
|
3
4
|
export interface OpenTelemetryOptions {
|
|
4
5
|
readonly tracer: Tracer;
|
|
5
6
|
readonly meter: Meter;
|
|
6
7
|
readonly onError?: (error: unknown) => void;
|
|
7
8
|
}
|
|
8
|
-
export interface OpenTelemetryObserver {
|
|
9
|
-
observe(event: WorkflowEvent): void;
|
|
9
|
+
export interface OpenTelemetryObserver extends DispatchTelemetry, WorkflowTelemetry {
|
|
10
10
|
close(): void;
|
|
11
11
|
}
|
|
12
12
|
export interface TelemetryOperation {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opentelemetry.types.js","sourceRoot":"","sources":["../../src/infrastructure/opentelemetry.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Context, Meter, Span, Tracer } from \"@opentelemetry/api\";\nimport type {
|
|
1
|
+
{"version":3,"file":"opentelemetry.types.js","sourceRoot":"","sources":["../../src/infrastructure/opentelemetry.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Context, Meter, Span, Tracer } from \"@opentelemetry/api\";\nimport type { DispatchTelemetry } from \"../domain/dispatch-telemetry.types.ts\";\nimport type { WorkflowTelemetry } from \"../domain/workflow.types.ts\";\n\nexport interface OpenTelemetryOptions {\n readonly tracer: Tracer;\n readonly meter: Meter;\n readonly onError?: (error: unknown) => void;\n}\n\nexport interface OpenTelemetryObserver\n extends DispatchTelemetry, WorkflowTelemetry {\n close(): void;\n}\n\nexport interface TelemetryOperation {\n readonly span: Span | undefined;\n readonly context: Context;\n readonly started: number;\n}\n\nexport interface TelemetryExecution {\n readonly workflow: TelemetryOperation;\n readonly tasks: Map<string, TelemetryOperation>;\n readonly attempts: Map<string, TelemetryOperation>;\n}\n"]}
|