lorenz 0.1.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/LICENSE +201 -0
- package/NOTICE +13 -0
- package/README.md +774 -0
- package/RELEASE-MANIFEST.json +211 -0
- package/apps/cli/bin/lorenz.js +25 -0
- package/apps/cli/dist/bin/cli.d.ts +3 -0
- package/apps/cli/dist/bin/cli.d.ts.map +1 -0
- package/apps/cli/dist/bin/cli.js +4 -0
- package/apps/cli/dist/bin/cli.js.map +1 -0
- package/apps/cli/dist/daemon.d.ts +76 -0
- package/apps/cli/dist/daemon.d.ts.map +1 -0
- package/apps/cli/dist/daemon.js +189 -0
- package/apps/cli/dist/daemon.js.map +1 -0
- package/apps/cli/dist/doctor.d.ts +40 -0
- package/apps/cli/dist/doctor.d.ts.map +1 -0
- package/apps/cli/dist/doctor.js +590 -0
- package/apps/cli/dist/doctor.js.map +1 -0
- package/apps/cli/dist/index.d.ts +32 -0
- package/apps/cli/dist/index.d.ts.map +1 -0
- package/apps/cli/dist/index.js +26 -0
- package/apps/cli/dist/index.js.map +1 -0
- package/apps/cli/dist/main.d.ts +40 -0
- package/apps/cli/dist/main.d.ts.map +1 -0
- package/apps/cli/dist/main.js +259 -0
- package/apps/cli/dist/main.js.map +1 -0
- package/apps/cli/dist/runs.d.ts +31 -0
- package/apps/cli/dist/runs.d.ts.map +1 -0
- package/apps/cli/dist/runs.js +281 -0
- package/apps/cli/dist/runs.js.map +1 -0
- package/apps/cli/dist/workerDriverLoader.d.ts +64 -0
- package/apps/cli/dist/workerDriverLoader.d.ts.map +1 -0
- package/apps/cli/dist/workerDriverLoader.js +211 -0
- package/apps/cli/dist/workerDriverLoader.js.map +1 -0
- package/apps/cli/package.json +57 -0
- package/apps/symphony-dashboard/dist/assets/index-B3owF3jd.css +1 -0
- package/apps/symphony-dashboard/dist/assets/index-DQ6XlL0d.js +227 -0
- package/apps/symphony-dashboard/dist/index.html +18 -0
- package/bin/lorenz +16 -0
- package/extensions/docker-worker/dist/index.d.ts +92 -0
- package/extensions/docker-worker/dist/index.d.ts.map +1 -0
- package/extensions/docker-worker/dist/index.js +283 -0
- package/extensions/docker-worker/dist/index.js.map +1 -0
- package/extensions/docker-worker/package.json +14 -0
- package/extensions/jira-tracker/dist/client.d.ts +50 -0
- package/extensions/jira-tracker/dist/client.d.ts.map +1 -0
- package/extensions/jira-tracker/dist/client.js +619 -0
- package/extensions/jira-tracker/dist/client.js.map +1 -0
- package/extensions/jira-tracker/dist/index.d.ts +5 -0
- package/extensions/jira-tracker/dist/index.d.ts.map +1 -0
- package/extensions/jira-tracker/dist/index.js +5 -0
- package/extensions/jira-tracker/dist/index.js.map +1 -0
- package/extensions/jira-tracker/dist/options.d.ts +38 -0
- package/extensions/jira-tracker/dist/options.d.ts.map +1 -0
- package/extensions/jira-tracker/dist/options.js +61 -0
- package/extensions/jira-tracker/dist/options.js.map +1 -0
- package/extensions/jira-tracker/dist/provider.d.ts +6 -0
- package/extensions/jira-tracker/dist/provider.d.ts.map +1 -0
- package/extensions/jira-tracker/dist/provider.js +178 -0
- package/extensions/jira-tracker/dist/provider.js.map +1 -0
- package/extensions/jira-tracker/dist/register.d.ts +10 -0
- package/extensions/jira-tracker/dist/register.d.ts.map +1 -0
- package/extensions/jira-tracker/dist/register.js +15 -0
- package/extensions/jira-tracker/dist/register.js.map +1 -0
- package/extensions/jira-tracker/package.json +16 -0
- package/extensions/linear-tracker/dist/client.d.ts +82 -0
- package/extensions/linear-tracker/dist/client.d.ts.map +1 -0
- package/extensions/linear-tracker/dist/client.js +622 -0
- package/extensions/linear-tracker/dist/client.js.map +1 -0
- package/extensions/linear-tracker/dist/index.d.ts +8 -0
- package/extensions/linear-tracker/dist/index.d.ts.map +1 -0
- package/extensions/linear-tracker/dist/index.js +7 -0
- package/extensions/linear-tracker/dist/index.js.map +1 -0
- package/extensions/linear-tracker/dist/options.d.ts +32 -0
- package/extensions/linear-tracker/dist/options.d.ts.map +1 -0
- package/extensions/linear-tracker/dist/options.js +59 -0
- package/extensions/linear-tracker/dist/options.js.map +1 -0
- package/extensions/linear-tracker/dist/provider.d.ts +4 -0
- package/extensions/linear-tracker/dist/provider.d.ts.map +1 -0
- package/extensions/linear-tracker/dist/provider.js +58 -0
- package/extensions/linear-tracker/dist/provider.js.map +1 -0
- package/extensions/linear-tracker/dist/register.d.ts +11 -0
- package/extensions/linear-tracker/dist/register.d.ts.map +1 -0
- package/extensions/linear-tracker/dist/register.js +19 -0
- package/extensions/linear-tracker/dist/register.js.map +1 -0
- package/extensions/linear-tracker/dist/toolOps.d.ts +8 -0
- package/extensions/linear-tracker/dist/toolOps.d.ts.map +1 -0
- package/extensions/linear-tracker/dist/toolOps.js +160 -0
- package/extensions/linear-tracker/dist/toolOps.js.map +1 -0
- package/extensions/linear-tracker/dist/tools.d.ts +7 -0
- package/extensions/linear-tracker/dist/tools.d.ts.map +1 -0
- package/extensions/linear-tracker/dist/tools.js +210 -0
- package/extensions/linear-tracker/dist/tools.js.map +1 -0
- package/extensions/linear-tracker/package.json +18 -0
- package/extensions/local-tracker/dist/boardStore.d.ts +116 -0
- package/extensions/local-tracker/dist/boardStore.d.ts.map +1 -0
- package/extensions/local-tracker/dist/boardStore.js +475 -0
- package/extensions/local-tracker/dist/boardStore.js.map +1 -0
- package/extensions/local-tracker/dist/client.d.ts +14 -0
- package/extensions/local-tracker/dist/client.d.ts.map +1 -0
- package/extensions/local-tracker/dist/client.js +27 -0
- package/extensions/local-tracker/dist/client.js.map +1 -0
- package/extensions/local-tracker/dist/index.d.ts +7 -0
- package/extensions/local-tracker/dist/index.d.ts.map +1 -0
- package/extensions/local-tracker/dist/index.js +7 -0
- package/extensions/local-tracker/dist/index.js.map +1 -0
- package/extensions/local-tracker/dist/options.d.ts +31 -0
- package/extensions/local-tracker/dist/options.d.ts.map +1 -0
- package/extensions/local-tracker/dist/options.js +69 -0
- package/extensions/local-tracker/dist/options.js.map +1 -0
- package/extensions/local-tracker/dist/provider.d.ts +9 -0
- package/extensions/local-tracker/dist/provider.d.ts.map +1 -0
- package/extensions/local-tracker/dist/provider.js +35 -0
- package/extensions/local-tracker/dist/provider.js.map +1 -0
- package/extensions/local-tracker/dist/register.d.ts +11 -0
- package/extensions/local-tracker/dist/register.d.ts.map +1 -0
- package/extensions/local-tracker/dist/register.js +19 -0
- package/extensions/local-tracker/dist/register.js.map +1 -0
- package/extensions/local-tracker/dist/resolveBoardDir.d.ts +24 -0
- package/extensions/local-tracker/dist/resolveBoardDir.d.ts.map +1 -0
- package/extensions/local-tracker/dist/resolveBoardDir.js +39 -0
- package/extensions/local-tracker/dist/resolveBoardDir.js.map +1 -0
- package/extensions/local-tracker/dist/toolOps.d.ts +9 -0
- package/extensions/local-tracker/dist/toolOps.d.ts.map +1 -0
- package/extensions/local-tracker/dist/toolOps.js +86 -0
- package/extensions/local-tracker/dist/toolOps.js.map +1 -0
- package/extensions/local-tracker/dist/tools.d.ts +7 -0
- package/extensions/local-tracker/dist/tools.d.ts.map +1 -0
- package/extensions/local-tracker/dist/tools.js +170 -0
- package/extensions/local-tracker/dist/tools.js.map +1 -0
- package/extensions/local-tracker/package.json +18 -0
- package/extensions/memory-tracker/dist/index.d.ts +24 -0
- package/extensions/memory-tracker/dist/index.d.ts.map +1 -0
- package/extensions/memory-tracker/dist/index.js +110 -0
- package/extensions/memory-tracker/dist/index.js.map +1 -0
- package/extensions/memory-tracker/package.json +16 -0
- package/extensions/slack-tracker/dist/client.d.ts +88 -0
- package/extensions/slack-tracker/dist/client.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/client.js +246 -0
- package/extensions/slack-tracker/dist/client.js.map +1 -0
- package/extensions/slack-tracker/dist/inMemoryTransport.d.ts +42 -0
- package/extensions/slack-tracker/dist/inMemoryTransport.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/inMemoryTransport.js +104 -0
- package/extensions/slack-tracker/dist/inMemoryTransport.js.map +1 -0
- package/extensions/slack-tracker/dist/index.d.ts +15 -0
- package/extensions/slack-tracker/dist/index.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/index.js +11 -0
- package/extensions/slack-tracker/dist/index.js.map +1 -0
- package/extensions/slack-tracker/dist/mapping.d.ts +27 -0
- package/extensions/slack-tracker/dist/mapping.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/mapping.js +109 -0
- package/extensions/slack-tracker/dist/mapping.js.map +1 -0
- package/extensions/slack-tracker/dist/operations.d.ts +41 -0
- package/extensions/slack-tracker/dist/operations.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/operations.js +97 -0
- package/extensions/slack-tracker/dist/operations.js.map +1 -0
- package/extensions/slack-tracker/dist/options.d.ts +30 -0
- package/extensions/slack-tracker/dist/options.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/options.js +49 -0
- package/extensions/slack-tracker/dist/options.js.map +1 -0
- package/extensions/slack-tracker/dist/provider.d.ts +9 -0
- package/extensions/slack-tracker/dist/provider.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/provider.js +74 -0
- package/extensions/slack-tracker/dist/provider.js.map +1 -0
- package/extensions/slack-tracker/dist/register.d.ts +11 -0
- package/extensions/slack-tracker/dist/register.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/register.js +19 -0
- package/extensions/slack-tracker/dist/register.js.map +1 -0
- package/extensions/slack-tracker/dist/threadState.d.ts +52 -0
- package/extensions/slack-tracker/dist/threadState.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/threadState.js +192 -0
- package/extensions/slack-tracker/dist/threadState.js.map +1 -0
- package/extensions/slack-tracker/dist/toolOps.d.ts +13 -0
- package/extensions/slack-tracker/dist/toolOps.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/toolOps.js +76 -0
- package/extensions/slack-tracker/dist/toolOps.js.map +1 -0
- package/extensions/slack-tracker/dist/tools.d.ts +8 -0
- package/extensions/slack-tracker/dist/tools.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/tools.js +266 -0
- package/extensions/slack-tracker/dist/tools.js.map +1 -0
- package/extensions/slack-tracker/dist/transport.d.ts +63 -0
- package/extensions/slack-tracker/dist/transport.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/transport.js +2 -0
- package/extensions/slack-tracker/dist/transport.js.map +1 -0
- package/extensions/slack-tracker/dist/webTransport.d.ts +44 -0
- package/extensions/slack-tracker/dist/webTransport.d.ts.map +1 -0
- package/extensions/slack-tracker/dist/webTransport.js +402 -0
- package/extensions/slack-tracker/dist/webTransport.js.map +1 -0
- package/extensions/slack-tracker/package.json +17 -0
- package/package.json +89 -0
- package/packages/acp/dist/childProcess.d.ts +4 -0
- package/packages/acp/dist/childProcess.d.ts.map +1 -0
- package/packages/acp/dist/childProcess.js +33 -0
- package/packages/acp/dist/childProcess.js.map +1 -0
- package/packages/acp/dist/index.d.ts +70 -0
- package/packages/acp/dist/index.d.ts.map +1 -0
- package/packages/acp/dist/index.js +701 -0
- package/packages/acp/dist/index.js.map +1 -0
- package/packages/acp/dist/options.d.ts +24 -0
- package/packages/acp/dist/options.d.ts.map +1 -0
- package/packages/acp/dist/options.js +92 -0
- package/packages/acp/dist/options.js.map +1 -0
- package/packages/acp/dist/toml.d.ts +2 -0
- package/packages/acp/dist/toml.d.ts.map +1 -0
- package/packages/acp/dist/toml.js +51 -0
- package/packages/acp/dist/toml.js.map +1 -0
- package/packages/acp/package.json +24 -0
- package/packages/agent-runner/dist/index.d.ts +58 -0
- package/packages/agent-runner/dist/index.d.ts.map +1 -0
- package/packages/agent-runner/dist/index.js +288 -0
- package/packages/agent-runner/dist/index.js.map +1 -0
- package/packages/agent-runner/package.json +19 -0
- package/packages/agent-sdk/dist/index.d.ts +2 -0
- package/packages/agent-sdk/dist/index.d.ts.map +1 -0
- package/packages/agent-sdk/dist/index.js +2 -0
- package/packages/agent-sdk/dist/index.js.map +1 -0
- package/packages/agent-sdk/dist/provider.d.ts +66 -0
- package/packages/agent-sdk/dist/provider.d.ts.map +1 -0
- package/packages/agent-sdk/dist/provider.js +38 -0
- package/packages/agent-sdk/dist/provider.js.map +1 -0
- package/packages/agent-sdk/package.json +14 -0
- package/packages/cli-kit/dist/index.d.ts +20 -0
- package/packages/cli-kit/dist/index.d.ts.map +1 -0
- package/packages/cli-kit/dist/index.js +72 -0
- package/packages/cli-kit/dist/index.js.map +1 -0
- package/packages/cli-kit/package.json +14 -0
- package/packages/config/dist/aliases.d.ts +10 -0
- package/packages/config/dist/aliases.d.ts.map +1 -0
- package/packages/config/dist/aliases.js +153 -0
- package/packages/config/dist/aliases.js.map +1 -0
- package/packages/config/dist/defaults.d.ts +12 -0
- package/packages/config/dist/defaults.d.ts.map +1 -0
- package/packages/config/dist/defaults.js +78 -0
- package/packages/config/dist/defaults.js.map +1 -0
- package/packages/config/dist/errors.d.ts +3 -0
- package/packages/config/dist/errors.d.ts.map +1 -0
- package/packages/config/dist/errors.js +56 -0
- package/packages/config/dist/errors.js.map +1 -0
- package/packages/config/dist/index.d.ts +5 -0
- package/packages/config/dist/index.d.ts.map +1 -0
- package/packages/config/dist/index.js +4 -0
- package/packages/config/dist/index.js.map +1 -0
- package/packages/config/dist/leaf-utils.d.ts +3 -0
- package/packages/config/dist/leaf-utils.d.ts.map +1 -0
- package/packages/config/dist/leaf-utils.js +9 -0
- package/packages/config/dist/leaf-utils.js.map +1 -0
- package/packages/config/dist/parse.d.ts +11 -0
- package/packages/config/dist/parse.d.ts.map +1 -0
- package/packages/config/dist/parse.js +821 -0
- package/packages/config/dist/parse.js.map +1 -0
- package/packages/config/dist/schemas.d.ts +214 -0
- package/packages/config/dist/schemas.d.ts.map +1 -0
- package/packages/config/dist/schemas.js +248 -0
- package/packages/config/dist/schemas.js.map +1 -0
- package/packages/config/package.json +19 -0
- package/packages/dispatch/dist/index.d.ts +22 -0
- package/packages/dispatch/dist/index.d.ts.map +1 -0
- package/packages/dispatch/dist/index.js +117 -0
- package/packages/dispatch/dist/index.js.map +1 -0
- package/packages/dispatch/package.json +16 -0
- package/packages/dispatch-coordinator/dist/coordinator.d.ts +158 -0
- package/packages/dispatch-coordinator/dist/coordinator.d.ts.map +1 -0
- package/packages/dispatch-coordinator/dist/coordinator.js +529 -0
- package/packages/dispatch-coordinator/dist/coordinator.js.map +1 -0
- package/packages/dispatch-coordinator/dist/gate.d.ts +24 -0
- package/packages/dispatch-coordinator/dist/gate.d.ts.map +1 -0
- package/packages/dispatch-coordinator/dist/gate.js +47 -0
- package/packages/dispatch-coordinator/dist/gate.js.map +1 -0
- package/packages/dispatch-coordinator/dist/index.d.ts +6 -0
- package/packages/dispatch-coordinator/dist/index.d.ts.map +1 -0
- package/packages/dispatch-coordinator/dist/index.js +16 -0
- package/packages/dispatch-coordinator/dist/index.js.map +1 -0
- package/packages/dispatch-coordinator/dist/mcpEndpointManager.d.ts +28 -0
- package/packages/dispatch-coordinator/dist/mcpEndpointManager.d.ts.map +1 -0
- package/packages/dispatch-coordinator/dist/mcpEndpointManager.js +54 -0
- package/packages/dispatch-coordinator/dist/mcpEndpointManager.js.map +1 -0
- package/packages/dispatch-coordinator/dist/nullEndpointManager.d.ts +18 -0
- package/packages/dispatch-coordinator/dist/nullEndpointManager.d.ts.map +1 -0
- package/packages/dispatch-coordinator/dist/nullEndpointManager.js +40 -0
- package/packages/dispatch-coordinator/dist/nullEndpointManager.js.map +1 -0
- package/packages/dispatch-coordinator/dist/types.d.ts +119 -0
- package/packages/dispatch-coordinator/dist/types.d.ts.map +1 -0
- package/packages/dispatch-coordinator/dist/types.js +17 -0
- package/packages/dispatch-coordinator/dist/types.js.map +1 -0
- package/packages/dispatch-coordinator/package.json +16 -0
- package/packages/domain/dist/index.d.ts +775 -0
- package/packages/domain/dist/index.d.ts.map +1 -0
- package/packages/domain/dist/index.js +124 -0
- package/packages/domain/dist/index.js.map +1 -0
- package/packages/domain/package.json +14 -0
- package/packages/humanize/dist/index.d.ts +4 -0
- package/packages/humanize/dist/index.d.ts.map +1 -0
- package/packages/humanize/dist/index.js +347 -0
- package/packages/humanize/dist/index.js.map +1 -0
- package/packages/humanize/package.json +11 -0
- package/packages/issue/dist/index.d.ts +7 -0
- package/packages/issue/dist/index.d.ts.map +1 -0
- package/packages/issue/dist/index.js +147 -0
- package/packages/issue/dist/index.js.map +1 -0
- package/packages/issue/package.json +14 -0
- package/packages/log-file/dist/index.d.ts +10 -0
- package/packages/log-file/dist/index.d.ts.map +1 -0
- package/packages/log-file/dist/index.js +200 -0
- package/packages/log-file/dist/index.js.map +1 -0
- package/packages/log-file/package.json +15 -0
- package/packages/mcp/dist/agentEndpoint.d.ts +31 -0
- package/packages/mcp/dist/agentEndpoint.d.ts.map +1 -0
- package/packages/mcp/dist/agentEndpoint.js +270 -0
- package/packages/mcp/dist/agentEndpoint.js.map +1 -0
- package/packages/mcp/dist/auth.d.ts +7 -0
- package/packages/mcp/dist/auth.d.ts.map +1 -0
- package/packages/mcp/dist/auth.js +48 -0
- package/packages/mcp/dist/auth.js.map +1 -0
- package/packages/mcp/dist/filter.d.ts +70 -0
- package/packages/mcp/dist/filter.d.ts.map +1 -0
- package/packages/mcp/dist/filter.js +231 -0
- package/packages/mcp/dist/filter.js.map +1 -0
- package/packages/mcp/dist/index.d.ts +7 -0
- package/packages/mcp/dist/index.d.ts.map +1 -0
- package/packages/mcp/dist/index.js +5 -0
- package/packages/mcp/dist/index.js.map +1 -0
- package/packages/mcp/dist/server.d.ts +31 -0
- package/packages/mcp/dist/server.d.ts.map +1 -0
- package/packages/mcp/dist/server.js +176 -0
- package/packages/mcp/dist/server.js.map +1 -0
- package/packages/mcp/dist/tools/linear.d.ts +5 -0
- package/packages/mcp/dist/tools/linear.d.ts.map +1 -0
- package/packages/mcp/dist/tools/linear.js +192 -0
- package/packages/mcp/dist/tools/linear.js.map +1 -0
- package/packages/mcp/dist/tools/local.d.ts +5 -0
- package/packages/mcp/dist/tools/local.d.ts.map +1 -0
- package/packages/mcp/dist/tools/local.js +161 -0
- package/packages/mcp/dist/tools/local.js.map +1 -0
- package/packages/mcp/dist/tools/result.d.ts +5 -0
- package/packages/mcp/dist/tools/result.d.ts.map +1 -0
- package/packages/mcp/dist/tools/result.js +15 -0
- package/packages/mcp/dist/tools/result.js.map +1 -0
- package/packages/mcp/dist/tools.d.ts +14 -0
- package/packages/mcp/dist/tools.d.ts.map +1 -0
- package/packages/mcp/dist/tools.js +58 -0
- package/packages/mcp/dist/tools.js.map +1 -0
- package/packages/mcp/package.json +20 -0
- package/packages/orchestrator/dist/index.d.ts +171 -0
- package/packages/orchestrator/dist/index.d.ts.map +1 -0
- package/packages/orchestrator/dist/index.js +524 -0
- package/packages/orchestrator/dist/index.js.map +1 -0
- package/packages/orchestrator/package.json +18 -0
- package/packages/policies/dist/index.d.ts +11 -0
- package/packages/policies/dist/index.d.ts.map +1 -0
- package/packages/policies/dist/index.js +6 -0
- package/packages/policies/dist/index.js.map +1 -0
- package/packages/policies/dist/reconciliation.d.ts +5 -0
- package/packages/policies/dist/reconciliation.d.ts.map +1 -0
- package/packages/policies/dist/reconciliation.js +17 -0
- package/packages/policies/dist/reconciliation.js.map +1 -0
- package/packages/policies/dist/resume.d.ts +14 -0
- package/packages/policies/dist/resume.d.ts.map +1 -0
- package/packages/policies/dist/resume.js +7 -0
- package/packages/policies/dist/resume.js.map +1 -0
- package/packages/policies/dist/retry.d.ts +4 -0
- package/packages/policies/dist/retry.d.ts.map +1 -0
- package/packages/policies/dist/retry.js +7 -0
- package/packages/policies/dist/retry.js.map +1 -0
- package/packages/policies/dist/stopReason.d.ts +4 -0
- package/packages/policies/dist/stopReason.d.ts.map +1 -0
- package/packages/policies/dist/stopReason.js +11 -0
- package/packages/policies/dist/stopReason.js.map +1 -0
- package/packages/policies/dist/usage.d.ts +14 -0
- package/packages/policies/dist/usage.d.ts.map +1 -0
- package/packages/policies/dist/usage.js +38 -0
- package/packages/policies/dist/usage.js.map +1 -0
- package/packages/policies/dist/workerHost.d.ts +8 -0
- package/packages/policies/dist/workerHost.d.ts.map +1 -0
- package/packages/policies/dist/workerHost.js +20 -0
- package/packages/policies/dist/workerHost.js.map +1 -0
- package/packages/policies/package.json +21 -0
- package/packages/presenter/dist/index.d.ts +81 -0
- package/packages/presenter/dist/index.d.ts.map +1 -0
- package/packages/presenter/dist/index.js +421 -0
- package/packages/presenter/dist/index.js.map +1 -0
- package/packages/presenter/package.json +16 -0
- package/packages/projections/dist/index.d.ts +10 -0
- package/packages/projections/dist/index.d.ts.map +1 -0
- package/packages/projections/dist/index.js +30 -0
- package/packages/projections/dist/index.js.map +1 -0
- package/packages/projections/package.json +15 -0
- package/packages/prompt/dist/index.d.ts +9 -0
- package/packages/prompt/dist/index.d.ts.map +1 -0
- package/packages/prompt/dist/index.js +71 -0
- package/packages/prompt/dist/index.js.map +1 -0
- package/packages/prompt/package.json +16 -0
- package/packages/retry-scheduler/dist/index.d.ts +12 -0
- package/packages/retry-scheduler/dist/index.d.ts.map +1 -0
- package/packages/retry-scheduler/dist/index.js +39 -0
- package/packages/retry-scheduler/dist/index.js.map +1 -0
- package/packages/retry-scheduler/package.json +15 -0
- package/packages/runtime/dist/index.d.ts +157 -0
- package/packages/runtime/dist/index.d.ts.map +1 -0
- package/packages/runtime/dist/index.js +1074 -0
- package/packages/runtime/dist/index.js.map +1 -0
- package/packages/runtime/package.json +26 -0
- package/packages/runtime-events/dist/index.d.ts +110 -0
- package/packages/runtime-events/dist/index.d.ts.map +1 -0
- package/packages/runtime-events/dist/index.js +25 -0
- package/packages/runtime-events/dist/index.js.map +1 -0
- package/packages/runtime-events/package.json +14 -0
- package/packages/server/dist/index.d.ts +25 -0
- package/packages/server/dist/index.d.ts.map +1 -0
- package/packages/server/dist/index.js +213 -0
- package/packages/server/dist/index.js.map +1 -0
- package/packages/server/dist/issue-store.d.ts +26 -0
- package/packages/server/dist/issue-store.d.ts.map +1 -0
- package/packages/server/dist/issue-store.js +88 -0
- package/packages/server/dist/issue-store.js.map +1 -0
- package/packages/server/dist/path-params.d.ts +6 -0
- package/packages/server/dist/path-params.d.ts.map +1 -0
- package/packages/server/dist/path-params.js +15 -0
- package/packages/server/dist/path-params.js.map +1 -0
- package/packages/server/dist/source.d.ts +12 -0
- package/packages/server/dist/source.d.ts.map +1 -0
- package/packages/server/dist/source.js +2 -0
- package/packages/server/dist/source.js.map +1 -0
- package/packages/server/dist/trace-routes.d.ts +21 -0
- package/packages/server/dist/trace-routes.d.ts.map +1 -0
- package/packages/server/dist/trace-routes.js +66 -0
- package/packages/server/dist/trace-routes.js.map +1 -0
- package/packages/server/dist/ws.d.ts +18 -0
- package/packages/server/dist/ws.d.ts.map +1 -0
- package/packages/server/dist/ws.js +168 -0
- package/packages/server/dist/ws.js.map +1 -0
- package/packages/server/package.json +22 -0
- package/packages/ssh/dist/index.d.ts +33 -0
- package/packages/ssh/dist/index.d.ts.map +1 -0
- package/packages/ssh/dist/index.js +281 -0
- package/packages/ssh/dist/index.js.map +1 -0
- package/packages/ssh/package.json +15 -0
- package/packages/static-worker/dist/index.d.ts +73 -0
- package/packages/static-worker/dist/index.d.ts.map +1 -0
- package/packages/static-worker/dist/index.js +150 -0
- package/packages/static-worker/dist/index.js.map +1 -0
- package/packages/static-worker/package.json +14 -0
- package/packages/tool-sdk/dist/filter.d.ts +70 -0
- package/packages/tool-sdk/dist/filter.d.ts.map +1 -0
- package/packages/tool-sdk/dist/filter.js +231 -0
- package/packages/tool-sdk/dist/filter.js.map +1 -0
- package/packages/tool-sdk/dist/index.d.ts +6 -0
- package/packages/tool-sdk/dist/index.d.ts.map +1 -0
- package/packages/tool-sdk/dist/index.js +4 -0
- package/packages/tool-sdk/dist/index.js.map +1 -0
- package/packages/tool-sdk/dist/provider.d.ts +51 -0
- package/packages/tool-sdk/dist/provider.d.ts.map +1 -0
- package/packages/tool-sdk/dist/provider.js +2 -0
- package/packages/tool-sdk/dist/provider.js.map +1 -0
- package/packages/tool-sdk/dist/registry.d.ts +35 -0
- package/packages/tool-sdk/dist/registry.d.ts.map +1 -0
- package/packages/tool-sdk/dist/registry.js +85 -0
- package/packages/tool-sdk/dist/registry.js.map +1 -0
- package/packages/tool-sdk/dist/result.d.ts +5 -0
- package/packages/tool-sdk/dist/result.d.ts.map +1 -0
- package/packages/tool-sdk/dist/result.js +15 -0
- package/packages/tool-sdk/dist/result.js.map +1 -0
- package/packages/tool-sdk/package.json +14 -0
- package/packages/traceviz-emitter/dist/index.d.ts +19 -0
- package/packages/traceviz-emitter/dist/index.d.ts.map +1 -0
- package/packages/traceviz-emitter/dist/index.js +97 -0
- package/packages/traceviz-emitter/dist/index.js.map +1 -0
- package/packages/traceviz-emitter/package.json +17 -0
- package/packages/traceviz-server/dist/index.d.ts +14 -0
- package/packages/traceviz-server/dist/index.d.ts.map +1 -0
- package/packages/traceviz-server/dist/index.js +10 -0
- package/packages/traceviz-server/dist/index.js.map +1 -0
- package/packages/traceviz-server/dist/models/api.d.ts +51 -0
- package/packages/traceviz-server/dist/models/api.d.ts.map +1 -0
- package/packages/traceviz-server/dist/models/api.js +5 -0
- package/packages/traceviz-server/dist/models/api.js.map +1 -0
- package/packages/traceviz-server/dist/models/display-events.d.ts +58 -0
- package/packages/traceviz-server/dist/models/display-events.d.ts.map +1 -0
- package/packages/traceviz-server/dist/models/display-events.js +6 -0
- package/packages/traceviz-server/dist/models/display-events.js.map +1 -0
- package/packages/traceviz-server/dist/parser.d.ts +14 -0
- package/packages/traceviz-server/dist/parser.d.ts.map +1 -0
- package/packages/traceviz-server/dist/parser.js +363 -0
- package/packages/traceviz-server/dist/parser.js.map +1 -0
- package/packages/traceviz-server/dist/stats.d.ts +7 -0
- package/packages/traceviz-server/dist/stats.d.ts.map +1 -0
- package/packages/traceviz-server/dist/stats.js +81 -0
- package/packages/traceviz-server/dist/stats.js.map +1 -0
- package/packages/traceviz-server/dist/watcher.d.ts +54 -0
- package/packages/traceviz-server/dist/watcher.d.ts.map +1 -0
- package/packages/traceviz-server/dist/watcher.js +368 -0
- package/packages/traceviz-server/dist/watcher.js.map +1 -0
- package/packages/traceviz-server/package.json +16 -0
- package/packages/tracker-sdk/dist/index.d.ts +5 -0
- package/packages/tracker-sdk/dist/index.d.ts.map +1 -0
- package/packages/tracker-sdk/dist/index.js +4 -0
- package/packages/tracker-sdk/dist/index.js.map +1 -0
- package/packages/tracker-sdk/dist/options.d.ts +20 -0
- package/packages/tracker-sdk/dist/options.d.ts.map +1 -0
- package/packages/tracker-sdk/dist/options.js +46 -0
- package/packages/tracker-sdk/dist/options.js.map +1 -0
- package/packages/tracker-sdk/dist/provider.d.ts +104 -0
- package/packages/tracker-sdk/dist/provider.d.ts.map +1 -0
- package/packages/tracker-sdk/dist/provider.js +2 -0
- package/packages/tracker-sdk/dist/provider.js.map +1 -0
- package/packages/tracker-sdk/dist/registry.d.ts +26 -0
- package/packages/tracker-sdk/dist/registry.d.ts.map +1 -0
- package/packages/tracker-sdk/dist/registry.js +52 -0
- package/packages/tracker-sdk/dist/registry.js.map +1 -0
- package/packages/tracker-sdk/dist/toolPack.d.ts +10 -0
- package/packages/tracker-sdk/dist/toolPack.d.ts.map +1 -0
- package/packages/tracker-sdk/dist/toolPack.js +185 -0
- package/packages/tracker-sdk/dist/toolPack.js.map +1 -0
- package/packages/tracker-sdk/package.json +15 -0
- package/packages/tui/dist/index.d.ts +35 -0
- package/packages/tui/dist/index.d.ts.map +1 -0
- package/packages/tui/dist/index.js +354 -0
- package/packages/tui/dist/index.js.map +1 -0
- package/packages/tui/package.json +18 -0
- package/packages/worker-host-pool/dist/index.d.ts +33 -0
- package/packages/worker-host-pool/dist/index.d.ts.map +1 -0
- package/packages/worker-host-pool/dist/index.js +311 -0
- package/packages/worker-host-pool/dist/index.js.map +1 -0
- package/packages/worker-host-pool/package.json +14 -0
- package/packages/worker-pool/dist/index.d.ts +6 -0
- package/packages/worker-pool/dist/index.d.ts.map +1 -0
- package/packages/worker-pool/dist/index.js +15 -0
- package/packages/worker-pool/dist/index.js.map +1 -0
- package/packages/worker-pool/dist/lease.d.ts +36 -0
- package/packages/worker-pool/dist/lease.d.ts.map +1 -0
- package/packages/worker-pool/dist/lease.js +53 -0
- package/packages/worker-pool/dist/lease.js.map +1 -0
- package/packages/worker-pool/dist/ledger.d.ts +51 -0
- package/packages/worker-pool/dist/ledger.d.ts.map +1 -0
- package/packages/worker-pool/dist/ledger.js +165 -0
- package/packages/worker-pool/dist/ledger.js.map +1 -0
- package/packages/worker-pool/dist/mutex.d.ts +10 -0
- package/packages/worker-pool/dist/mutex.d.ts.map +1 -0
- package/packages/worker-pool/dist/mutex.js +22 -0
- package/packages/worker-pool/dist/mutex.js.map +1 -0
- package/packages/worker-pool/dist/pool.d.ts +33 -0
- package/packages/worker-pool/dist/pool.d.ts.map +1 -0
- package/packages/worker-pool/dist/pool.js +1727 -0
- package/packages/worker-pool/dist/pool.js.map +1 -0
- package/packages/worker-pool/dist/reaper.d.ts +94 -0
- package/packages/worker-pool/dist/reaper.d.ts.map +1 -0
- package/packages/worker-pool/dist/reaper.js +295 -0
- package/packages/worker-pool/dist/reaper.js.map +1 -0
- package/packages/worker-pool/dist/types.d.ts +249 -0
- package/packages/worker-pool/dist/types.d.ts.map +1 -0
- package/packages/worker-pool/dist/types.js +2 -0
- package/packages/worker-pool/dist/types.js.map +1 -0
- package/packages/worker-pool/package.json +16 -0
- package/packages/worker-sdk/dist/conformance.d.ts +64 -0
- package/packages/worker-sdk/dist/conformance.d.ts.map +1 -0
- package/packages/worker-sdk/dist/conformance.js +109 -0
- package/packages/worker-sdk/dist/conformance.js.map +1 -0
- package/packages/worker-sdk/dist/fake.d.ts +76 -0
- package/packages/worker-sdk/dist/fake.d.ts.map +1 -0
- package/packages/worker-sdk/dist/fake.js +142 -0
- package/packages/worker-sdk/dist/fake.js.map +1 -0
- package/packages/worker-sdk/dist/index.d.ts +5 -0
- package/packages/worker-sdk/dist/index.d.ts.map +1 -0
- package/packages/worker-sdk/dist/index.js +10 -0
- package/packages/worker-sdk/dist/index.js.map +1 -0
- package/packages/worker-sdk/dist/module.d.ts +46 -0
- package/packages/worker-sdk/dist/module.d.ts.map +1 -0
- package/packages/worker-sdk/dist/module.js +59 -0
- package/packages/worker-sdk/dist/module.js.map +1 -0
- package/packages/worker-sdk/dist/registry.d.ts +24 -0
- package/packages/worker-sdk/dist/registry.d.ts.map +1 -0
- package/packages/worker-sdk/dist/registry.js +49 -0
- package/packages/worker-sdk/dist/registry.js.map +1 -0
- package/packages/worker-sdk/dist/types.d.ts +138 -0
- package/packages/worker-sdk/dist/types.d.ts.map +1 -0
- package/packages/worker-sdk/dist/types.js +21 -0
- package/packages/worker-sdk/dist/types.js.map +1 -0
- package/packages/worker-sdk/package.json +15 -0
- package/packages/workflow/dist/index.d.ts +33 -0
- package/packages/workflow/dist/index.d.ts.map +1 -0
- package/packages/workflow/dist/index.js +125 -0
- package/packages/workflow/dist/index.js.map +1 -0
- package/packages/workflow/package.json +19 -0
- package/packages/workspace/dist/index.d.ts +70 -0
- package/packages/workspace/dist/index.d.ts.map +1 -0
- package/packages/workspace/dist/index.js +1016 -0
- package/packages/workspace/dist/index.js.map +1 -0
- package/packages/workspace/package.json +17 -0
- package/runtime-deps/anthropic-claude-agent-sdk/LICENSE.md +1 -0
- package/runtime-deps/anthropic-claude-agent-sdk/README.md +65 -0
- package/runtime-deps/anthropic-claude-agent-sdk/agentSdkTypes.d.ts +1 -0
- package/runtime-deps/anthropic-claude-agent-sdk/assistant.d.ts +135 -0
- package/runtime-deps/anthropic-claude-agent-sdk/assistant.mjs +190 -0
- package/runtime-deps/anthropic-claude-agent-sdk/bridge.d.ts +231 -0
- package/runtime-deps/anthropic-claude-agent-sdk/bridge.mjs +168 -0
- package/runtime-deps/anthropic-claude-agent-sdk/browser-sdk.d.ts +53 -0
- package/runtime-deps/anthropic-claude-agent-sdk/browser-sdk.js +93 -0
- package/runtime-deps/anthropic-claude-agent-sdk/extractFromBunfs.d.ts +1 -0
- package/runtime-deps/anthropic-claude-agent-sdk/extractFromBunfs.js +156 -0
- package/runtime-deps/anthropic-claude-agent-sdk/manifest.json +47 -0
- package/runtime-deps/anthropic-claude-agent-sdk/manifest.zst.json +55 -0
- package/runtime-deps/anthropic-claude-agent-sdk/node_modules/.bin/anthropic-ai-sdk +21 -0
- package/runtime-deps/anthropic-claude-agent-sdk/package.json +81 -0
- package/runtime-deps/anthropic-claude-agent-sdk/sdk-tools.d.ts +3170 -0
- package/runtime-deps/anthropic-claude-agent-sdk/sdk.d.ts +6000 -0
- package/runtime-deps/anthropic-claude-agent-sdk/sdk.mjs +119 -0
- package/runtime-deps/openai-codex/README.md +60 -0
- package/runtime-deps/openai-codex/bin/codex.js +229 -0
- package/runtime-deps/openai-codex/bin/rg +79 -0
- package/runtime-deps/openai-codex/package.json +22 -0
- package/vendor/claude-agent-acp/dist/acp-agent.d.ts +239 -0
- package/vendor/claude-agent-acp/dist/acp-agent.d.ts.map +1 -0
- package/vendor/claude-agent-acp/dist/acp-agent.js +2693 -0
- package/vendor/claude-agent-acp/dist/bundle.js +41230 -0
- package/vendor/claude-agent-acp/dist/index.d.ts +3 -0
- package/vendor/claude-agent-acp/dist/index.d.ts.map +1 -0
- package/vendor/claude-agent-acp/dist/index.js +67 -0
- package/vendor/claude-agent-acp/dist/lib.d.ts +6 -0
- package/vendor/claude-agent-acp/dist/lib.d.ts.map +1 -0
- package/vendor/claude-agent-acp/dist/lib.js +5 -0
- package/vendor/claude-agent-acp/dist/settings.d.ts +68 -0
- package/vendor/claude-agent-acp/dist/settings.d.ts.map +1 -0
- package/vendor/claude-agent-acp/dist/settings.js +182 -0
- package/vendor/claude-agent-acp/dist/tools.d.ts +103 -0
- package/vendor/claude-agent-acp/dist/tools.d.ts.map +1 -0
- package/vendor/claude-agent-acp/dist/tools.js +713 -0
- package/vendor/claude-agent-acp/dist/utils.d.ts +16 -0
- package/vendor/claude-agent-acp/dist/utils.d.ts.map +1 -0
- package/vendor/claude-agent-acp/dist/utils.js +83 -0
- package/vendor/claude-agent-acp/package.json +23 -0
- package/vendor/codex-acp/dist/index.js +21280 -0
- package/vendor/codex-acp/package.json +17 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Symphony Dashboard</title>
|
|
7
|
+
<style>
|
|
8
|
+
body {
|
|
9
|
+
background: #09090b;
|
|
10
|
+
}
|
|
11
|
+
</style>
|
|
12
|
+
<script type="module" crossorigin src="/assets/index-DQ6XlL0d.js"></script>
|
|
13
|
+
<link rel="stylesheet" crossorigin href="/assets/index-B3owF3jd.css">
|
|
14
|
+
</head>
|
|
15
|
+
<body>
|
|
16
|
+
<div id="root"></div>
|
|
17
|
+
</body>
|
|
18
|
+
</html>
|
package/bin/lorenz
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Resolve @lorenz/cli through Node's module resolution rather than a fixed relative path so the
|
|
4
|
+
// launcher works in both install layouts: the release directory used as the install root, and the
|
|
5
|
+
// release hoisted under a parent node_modules (npx, npm install <tarball>, global install).
|
|
6
|
+
try {
|
|
7
|
+
const cliUrl = new URL("./bin/cli.js", import.meta.resolve("@lorenz/cli"));
|
|
8
|
+
await import(cliUrl.href);
|
|
9
|
+
} catch (error) {
|
|
10
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ERR_MODULE_NOT_FOUND") {
|
|
11
|
+
console.error("lorenz could not resolve @lorenz/cli. Install the release dependencies with npm install --omit=dev.");
|
|
12
|
+
process.exitCode = 1;
|
|
13
|
+
} else {
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { WorkerDescriptor, WorkerDriver, WorkerDriverFactory, WorkerDriverRegistry, WorkerHealth, DriverCapabilities, DriverDeps, ProvisionRequest, TeardownReason } from "@lorenz/worker-sdk";
|
|
2
|
+
/** Result of one `docker` invocation. Mirrors the subprocess transport surface. */
|
|
3
|
+
export interface DockerCommandResult {
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
status: number;
|
|
7
|
+
}
|
|
8
|
+
/** Injectable `docker` transport (test seam); defaults to a real subprocess. */
|
|
9
|
+
export type RunDocker = (args: readonly string[], options: {
|
|
10
|
+
timeoutMs: number;
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
}) => Promise<DockerCommandResult>;
|
|
13
|
+
/** Optional dependency overrides (test seam for the docker transport). */
|
|
14
|
+
export interface DockerDriverOverrides {
|
|
15
|
+
runDocker?: RunDocker;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A {@link WorkerDriver} that boots disposable Docker containers running `sshd`.
|
|
19
|
+
*
|
|
20
|
+
* `provision` runs `docker run -d` of the `image` driver option, publishing the
|
|
21
|
+
* container's sshd port (22) to an auto-assigned loopback host port and
|
|
22
|
+
* labelling the container with {@link LABEL_POOL} (so `list`/reconcile can adopt
|
|
23
|
+
* survivors) and {@link LABEL_WORKER_ID}=<workerId> (the pool's idempotency key). It is
|
|
24
|
+
* idempotent ACROSS driver instances: a second provision of the same workerId
|
|
25
|
+
* adopts the surviving labelled container rather than launching a duplicate.
|
|
26
|
+
* `probe` runs `printf ready` over SSH against the published `user@127.0.0.1:<port>`;
|
|
27
|
+
* `destroy` runs `docker rm -f <containerId>` and tolerates an already-gone
|
|
28
|
+
* container; `list` runs `docker ps --filter label=<LABEL_POOL>` so unlabelled
|
|
29
|
+
* containers are never touched. Capabilities are
|
|
30
|
+
* `{ sshAddressable: true, ephemeral: true, usesLedger: true }`.
|
|
31
|
+
*/
|
|
32
|
+
export declare class DockerWorkerDriver implements WorkerDriver {
|
|
33
|
+
private readonly deps;
|
|
34
|
+
readonly kind = "docker";
|
|
35
|
+
readonly capabilities: DriverCapabilities;
|
|
36
|
+
private readonly image;
|
|
37
|
+
private readonly user;
|
|
38
|
+
private readonly runDocker;
|
|
39
|
+
private readonly runSsh;
|
|
40
|
+
constructor(options: Readonly<Record<string, unknown>>, deps: DriverDeps, overrides?: DockerDriverOverrides);
|
|
41
|
+
/**
|
|
42
|
+
* Boots (or adopts) the container for `req.workerId`. Idempotency is keyed on the
|
|
43
|
+
* {@link LABEL_WORKER_ID} label on the live daemon: if a labelled container
|
|
44
|
+
* already exists it is adopted (no `docker run`), so two driver instances
|
|
45
|
+
* sharing one daemon never double-launch. Otherwise it runs
|
|
46
|
+
* `docker run -d -p 127.0.0.1::22 --label symphony.worker-pool= --label
|
|
47
|
+
* symphony.worker-id=<workerId> [--label <caller label>...] <image>`, then resolves
|
|
48
|
+
* the published loopback port via `docker port`. Rejects with
|
|
49
|
+
* `docker_image_required` when the `image` driver option is unset and
|
|
50
|
+
* `docker_run_failed` on a non-zero `docker run` exit.
|
|
51
|
+
*/
|
|
52
|
+
provision(req: ProvisionRequest): Promise<WorkerDescriptor>;
|
|
53
|
+
/**
|
|
54
|
+
* Runs `printf ready` over SSH against the published `workerHost`, using the
|
|
55
|
+
* caller-supplied `opts.timeoutMs`. A non-zero exit or any transport error
|
|
56
|
+
* gates the worker to `{ ok: false }` (with a reason) rather than throwing, so the
|
|
57
|
+
* reaper can demote an unreachable-but-created container.
|
|
58
|
+
*/
|
|
59
|
+
probe(worker: WorkerDescriptor, opts: {
|
|
60
|
+
timeoutMs: number;
|
|
61
|
+
signal?: AbortSignal;
|
|
62
|
+
}): Promise<WorkerHealth>;
|
|
63
|
+
/**
|
|
64
|
+
* Force-removes the container via `docker rm -f <driverRef>`. Idempotent: a
|
|
65
|
+
* `No such container` exit (the container is already gone) is tolerated, while
|
|
66
|
+
* any other non-zero exit (e.g. the daemon is unreachable) throws
|
|
67
|
+
* `docker_rm_failed` so the reaper can retry.
|
|
68
|
+
*/
|
|
69
|
+
destroy(worker: WorkerDescriptor, opts: {
|
|
70
|
+
timeoutMs: number;
|
|
71
|
+
reason: TeardownReason;
|
|
72
|
+
}): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Enumerates pool-owned containers via `docker ps --filter label=<LABEL_POOL>`,
|
|
75
|
+
* reading the {@link LABEL_WORKER_ID} label and the published loopback port out of
|
|
76
|
+
* the tab-separated `ID<TAB>worker-id<TAB>Ports` rows. Unlabelled containers are
|
|
77
|
+
* never returned (the filter excludes them), so reconcile never adopts an
|
|
78
|
+
* unrelated container.
|
|
79
|
+
*/
|
|
80
|
+
list(): Promise<WorkerDescriptor[]>;
|
|
81
|
+
private workerHostFor;
|
|
82
|
+
}
|
|
83
|
+
/** The registered `docker` factory: constructs a driver over the real docker CLI. */
|
|
84
|
+
export declare const dockerWorkerDriverFactory: WorkerDriverFactory;
|
|
85
|
+
/**
|
|
86
|
+
* Register this extension's worker driver. Idempotent; called by the composition
|
|
87
|
+
* root (or a test) against its registry, defaulting to the process-wide one.
|
|
88
|
+
*/
|
|
89
|
+
export declare function registerDockerWorkerDriver(registries?: {
|
|
90
|
+
workerDrivers?: WorkerDriverRegistry | undefined;
|
|
91
|
+
}): void;
|
|
92
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAEhB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAkC5B,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,CACtB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KACjD,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAElC,0EAA0E;AAC1E,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAwDD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IAWnD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVvB,QAAQ,CAAC,IAAI,YAAQ;IACrB,QAAQ,CAAC,YAAY,qBAAgB;IAErC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAGjC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzB,IAAI,EAAE,UAAU,EACjC,SAAS,GAAE,qBAA0B;IAQvC;;;;;;;;;;OAUG;IACG,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyEjE;;;;;OAKG;IACG,KAAK,CACT,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAChD,OAAO,CAAC,YAAY,CAAC;IAcxB;;;;;OAKG;IACG,OAAO,CACX,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,GAClD,OAAO,CAAC,IAAI,CAAC;IAShB;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAwCzC,OAAO,CAAC,aAAa;CAGtB;AAED,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,EAAE,mBAGvC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,GAAE;IAAE,aAAa,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAA;CAAO,GACpE,IAAI,CAKN"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { POOL_OWNED_LABEL, defaultWorkerDriverRegistry } from "@lorenz/worker-sdk";
|
|
3
|
+
const KIND = "docker";
|
|
4
|
+
/**
|
|
5
|
+
* Docker workers are disposable SSH-addressable containers, so the pool both
|
|
6
|
+
* destroys them (`ephemeral`) and keeps a write-ahead ledger (`usesLedger`) to
|
|
7
|
+
* recover survivors across a daemon restart by label.
|
|
8
|
+
*/
|
|
9
|
+
const CAPABILITIES = {
|
|
10
|
+
sshAddressable: true,
|
|
11
|
+
ephemeral: true,
|
|
12
|
+
usesLedger: true,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The label every pool-owned container carries (with an EMPTY value) so a
|
|
16
|
+
* `docker ps --filter label=<this>` enumerates only our containers and never
|
|
17
|
+
* adopts an unrelated one.
|
|
18
|
+
*/
|
|
19
|
+
const LABEL_POOL = "symphony.worker-pool";
|
|
20
|
+
/** The label that records the pool's idempotency key (workerId) on each container. */
|
|
21
|
+
const LABEL_WORKER_ID = "symphony.worker-id";
|
|
22
|
+
/** The container's sshd port that the run publishes to a loopback host port. */
|
|
23
|
+
const CONTAINER_SSH_PORT = "22";
|
|
24
|
+
/** The readiness command the probe runs over SSH (a cheap liveness check). */
|
|
25
|
+
const PROBE_COMMAND = "printf ready";
|
|
26
|
+
/** Default SSH user baked into the worker image when none is configured. */
|
|
27
|
+
const DEFAULT_USER = "root";
|
|
28
|
+
/** Reads a string driver-option value under any of the given keys. */
|
|
29
|
+
function readStringOption(options, ...keys) {
|
|
30
|
+
for (const key of keys) {
|
|
31
|
+
const value = options?.[key];
|
|
32
|
+
if (typeof value === "string" && value.length > 0)
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Default `docker` transport: shells out to the `docker` binary on PATH via
|
|
39
|
+
* `execFile`, never throwing on a non-zero exit (the caller maps exits to
|
|
40
|
+
* typed errors). An ENOENT (binary missing) surfaces as a thrown
|
|
41
|
+
* `docker_not_found` so the daemon fails loud at startup.
|
|
42
|
+
*/
|
|
43
|
+
const defaultRunDocker = async (args, options) => new Promise((resolve, reject) => {
|
|
44
|
+
execFile("docker", [...args], { timeout: options.timeoutMs, signal: options.signal, encoding: "utf8" }, (error, stdout, stderr) => {
|
|
45
|
+
if (error && error.code === "ENOENT") {
|
|
46
|
+
reject(new Error("docker_not_found", { cause: error }));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const status = typeof error?.code === "number"
|
|
50
|
+
? (error.code ?? 0)
|
|
51
|
+
: error
|
|
52
|
+
? 1
|
|
53
|
+
: 0;
|
|
54
|
+
resolve({ stdout: stdout ?? "", stderr: stderr ?? "", status });
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
* Parses the loopback host port that a `docker port <id> 22` / `docker ps`
|
|
59
|
+
* `Ports` column maps to the container's sshd port. Accepts both the
|
|
60
|
+
* `0.0.0.0:<port>` form emitted by `docker port` and the
|
|
61
|
+
* `0.0.0.0:<port>->22/tcp` mapping emitted in a `ps` row.
|
|
62
|
+
*/
|
|
63
|
+
function parsePublishedPort(text) {
|
|
64
|
+
const mapped = text.match(/(?:\d{1,3}(?:\.\d{1,3}){3}|\[[^\]]+\]):(\d+)->22\/tcp/);
|
|
65
|
+
if (mapped?.[1])
|
|
66
|
+
return Number.parseInt(mapped[1], 10);
|
|
67
|
+
const direct = text.match(/(?:\d{1,3}(?:\.\d{1,3}){3}|\[[^\]]+\]):(\d+)/);
|
|
68
|
+
if (direct?.[1])
|
|
69
|
+
return Number.parseInt(direct[1], 10);
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* A {@link WorkerDriver} that boots disposable Docker containers running `sshd`.
|
|
74
|
+
*
|
|
75
|
+
* `provision` runs `docker run -d` of the `image` driver option, publishing the
|
|
76
|
+
* container's sshd port (22) to an auto-assigned loopback host port and
|
|
77
|
+
* labelling the container with {@link LABEL_POOL} (so `list`/reconcile can adopt
|
|
78
|
+
* survivors) and {@link LABEL_WORKER_ID}=<workerId> (the pool's idempotency key). It is
|
|
79
|
+
* idempotent ACROSS driver instances: a second provision of the same workerId
|
|
80
|
+
* adopts the surviving labelled container rather than launching a duplicate.
|
|
81
|
+
* `probe` runs `printf ready` over SSH against the published `user@127.0.0.1:<port>`;
|
|
82
|
+
* `destroy` runs `docker rm -f <containerId>` and tolerates an already-gone
|
|
83
|
+
* container; `list` runs `docker ps --filter label=<LABEL_POOL>` so unlabelled
|
|
84
|
+
* containers are never touched. Capabilities are
|
|
85
|
+
* `{ sshAddressable: true, ephemeral: true, usesLedger: true }`.
|
|
86
|
+
*/
|
|
87
|
+
export class DockerWorkerDriver {
|
|
88
|
+
deps;
|
|
89
|
+
kind = KIND;
|
|
90
|
+
capabilities = CAPABILITIES;
|
|
91
|
+
image;
|
|
92
|
+
user;
|
|
93
|
+
runDocker;
|
|
94
|
+
runSsh;
|
|
95
|
+
constructor(options, deps, overrides = {}) {
|
|
96
|
+
this.deps = deps;
|
|
97
|
+
this.image = readStringOption(options, "image");
|
|
98
|
+
this.user = readStringOption(options, "user", "sshUser", "ssh_user") ?? DEFAULT_USER;
|
|
99
|
+
this.runDocker = overrides.runDocker ?? defaultRunDocker;
|
|
100
|
+
this.runSsh = deps.runSsh;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Boots (or adopts) the container for `req.workerId`. Idempotency is keyed on the
|
|
104
|
+
* {@link LABEL_WORKER_ID} label on the live daemon: if a labelled container
|
|
105
|
+
* already exists it is adopted (no `docker run`), so two driver instances
|
|
106
|
+
* sharing one daemon never double-launch. Otherwise it runs
|
|
107
|
+
* `docker run -d -p 127.0.0.1::22 --label symphony.worker-pool= --label
|
|
108
|
+
* symphony.worker-id=<workerId> [--label <caller label>...] <image>`, then resolves
|
|
109
|
+
* the published loopback port via `docker port`. Rejects with
|
|
110
|
+
* `docker_image_required` when the `image` driver option is unset and
|
|
111
|
+
* `docker_run_failed` on a non-zero `docker run` exit.
|
|
112
|
+
*/
|
|
113
|
+
async provision(req) {
|
|
114
|
+
if (!this.image)
|
|
115
|
+
throw new Error("docker_image_required");
|
|
116
|
+
const existing = (await this.list()).find((worker) => worker.workerId === req.workerId);
|
|
117
|
+
if (existing)
|
|
118
|
+
return existing;
|
|
119
|
+
const labelArgs = [
|
|
120
|
+
`--label`,
|
|
121
|
+
`${LABEL_POOL}=`,
|
|
122
|
+
`--label`,
|
|
123
|
+
`${LABEL_WORKER_ID}=${req.workerId}`,
|
|
124
|
+
];
|
|
125
|
+
for (const label of req.labels) {
|
|
126
|
+
if (label === LABEL_POOL)
|
|
127
|
+
continue;
|
|
128
|
+
labelArgs.push("--label", label);
|
|
129
|
+
}
|
|
130
|
+
const runArgs = [
|
|
131
|
+
"run",
|
|
132
|
+
"-d",
|
|
133
|
+
"-p",
|
|
134
|
+
`127.0.0.1::${CONTAINER_SSH_PORT}`,
|
|
135
|
+
...labelArgs,
|
|
136
|
+
this.image,
|
|
137
|
+
];
|
|
138
|
+
const run = await this.runDocker(runArgs, {
|
|
139
|
+
timeoutMs: req.timeoutMs,
|
|
140
|
+
...(req.signal ? { signal: req.signal } : {}),
|
|
141
|
+
});
|
|
142
|
+
if (run.status !== 0) {
|
|
143
|
+
throw new Error(`docker_run_failed: ${run.status} ${run.stderr.trim()}`);
|
|
144
|
+
}
|
|
145
|
+
const containerId = run.stdout.trim();
|
|
146
|
+
// The container now exists on the daemon. Any failure resolving its published
|
|
147
|
+
// port would otherwise leave a running container the pool never records: `grow()`
|
|
148
|
+
// drops the provisional ledger row and writes NO inventory record, so a later
|
|
149
|
+
// drain/reaper can never see or destroy it. Force-remove it before rethrowing so
|
|
150
|
+
// a post-create fault never leaks a paid container.
|
|
151
|
+
try {
|
|
152
|
+
const port = await this.runDocker(["port", containerId, CONTAINER_SSH_PORT], {
|
|
153
|
+
timeoutMs: req.timeoutMs,
|
|
154
|
+
...(req.signal ? { signal: req.signal } : {}),
|
|
155
|
+
});
|
|
156
|
+
if (port.status !== 0) {
|
|
157
|
+
throw new Error(`docker_port_failed: ${port.status} ${port.stderr.trim()}`);
|
|
158
|
+
}
|
|
159
|
+
const hostPort = parsePublishedPort(port.stdout);
|
|
160
|
+
if (hostPort === undefined) {
|
|
161
|
+
throw new Error(`docker_port_unresolved: ${port.stdout.trim()}`);
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
workerId: req.workerId,
|
|
165
|
+
workerHost: this.workerHostFor(hostPort),
|
|
166
|
+
driverRef: containerId,
|
|
167
|
+
createdAtMs: this.deps.clock.now().getTime(),
|
|
168
|
+
labels: [
|
|
169
|
+
LABEL_POOL,
|
|
170
|
+
LABEL_WORKER_ID,
|
|
171
|
+
...req.labels.filter((label) => label !== LABEL_POOL),
|
|
172
|
+
],
|
|
173
|
+
metadata: { containerId, hostPort },
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
// Best-effort: a cleanup failure must not mask the original provision error.
|
|
178
|
+
await this.runDocker(["rm", "-f", containerId], { timeoutMs: req.timeoutMs }).catch(() => undefined);
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Runs `printf ready` over SSH against the published `workerHost`, using the
|
|
184
|
+
* caller-supplied `opts.timeoutMs`. A non-zero exit or any transport error
|
|
185
|
+
* gates the worker to `{ ok: false }` (with a reason) rather than throwing, so the
|
|
186
|
+
* reaper can demote an unreachable-but-created container.
|
|
187
|
+
*/
|
|
188
|
+
async probe(worker, opts) {
|
|
189
|
+
try {
|
|
190
|
+
const result = await this.runSsh(worker.workerHost, PROBE_COMMAND, {
|
|
191
|
+
timeoutMs: opts.timeoutMs,
|
|
192
|
+
});
|
|
193
|
+
if (result.status !== 0) {
|
|
194
|
+
return { ok: false, reason: `docker_probe_exit_${result.status}` };
|
|
195
|
+
}
|
|
196
|
+
return { ok: true };
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
return { ok: false, reason: error instanceof Error ? error.message : String(error) };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Force-removes the container via `docker rm -f <driverRef>`. Idempotent: a
|
|
204
|
+
* `No such container` exit (the container is already gone) is tolerated, while
|
|
205
|
+
* any other non-zero exit (e.g. the daemon is unreachable) throws
|
|
206
|
+
* `docker_rm_failed` so the reaper can retry.
|
|
207
|
+
*/
|
|
208
|
+
async destroy(worker, opts) {
|
|
209
|
+
const result = await this.runDocker(["rm", "-f", worker.driverRef], {
|
|
210
|
+
timeoutMs: opts.timeoutMs,
|
|
211
|
+
});
|
|
212
|
+
if (result.status === 0)
|
|
213
|
+
return;
|
|
214
|
+
if (/no such container/i.test(result.stderr))
|
|
215
|
+
return;
|
|
216
|
+
throw new Error(`docker_rm_failed: ${result.status} ${result.stderr.trim()}`);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Enumerates pool-owned containers via `docker ps --filter label=<LABEL_POOL>`,
|
|
220
|
+
* reading the {@link LABEL_WORKER_ID} label and the published loopback port out of
|
|
221
|
+
* the tab-separated `ID<TAB>worker-id<TAB>Ports` rows. Unlabelled containers are
|
|
222
|
+
* never returned (the filter excludes them), so reconcile never adopts an
|
|
223
|
+
* unrelated container.
|
|
224
|
+
*/
|
|
225
|
+
async list() {
|
|
226
|
+
const result = await this.runDocker([
|
|
227
|
+
"ps",
|
|
228
|
+
"--filter",
|
|
229
|
+
`label=${LABEL_POOL}`,
|
|
230
|
+
"--no-trunc",
|
|
231
|
+
"--format",
|
|
232
|
+
`{{.ID}}\t{{.Label "${LABEL_WORKER_ID}"}}\t{{.Ports}}`,
|
|
233
|
+
], { timeoutMs: 30_000 });
|
|
234
|
+
if (result.status !== 0) {
|
|
235
|
+
throw new Error(`docker_ps_failed: ${result.status} ${result.stderr.trim()}`);
|
|
236
|
+
}
|
|
237
|
+
const createdAtMs = this.deps.clock.now().getTime();
|
|
238
|
+
const workers = [];
|
|
239
|
+
for (const line of result.stdout.split("\n")) {
|
|
240
|
+
const trimmed = line.trim();
|
|
241
|
+
if (!trimmed)
|
|
242
|
+
continue;
|
|
243
|
+
const [containerId, workerId, ports = ""] = trimmed.split("\t");
|
|
244
|
+
if (!containerId || !workerId)
|
|
245
|
+
continue;
|
|
246
|
+
const hostPort = parsePublishedPort(ports);
|
|
247
|
+
if (hostPort === undefined)
|
|
248
|
+
continue;
|
|
249
|
+
workers.push({
|
|
250
|
+
workerId,
|
|
251
|
+
workerHost: this.workerHostFor(hostPort),
|
|
252
|
+
driverRef: containerId,
|
|
253
|
+
createdAtMs,
|
|
254
|
+
// Surface the pool-owned label so the pool's hydrate/reconcile ownership
|
|
255
|
+
// gate (which keys on POOL_OWNED_LABEL) re-adopts or cleans up this
|
|
256
|
+
// survivor. The `docker ps --filter label=<LABEL_POOL>` filter already
|
|
257
|
+
// guarantees every returned container is pool-owned.
|
|
258
|
+
labels: [POOL_OWNED_LABEL, LABEL_POOL, LABEL_WORKER_ID],
|
|
259
|
+
metadata: { containerId, hostPort },
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
return workers;
|
|
263
|
+
}
|
|
264
|
+
workerHostFor(hostPort) {
|
|
265
|
+
return `${this.user}@127.0.0.1:${hostPort}`;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/** The registered `docker` factory: constructs a driver over the real docker CLI. */
|
|
269
|
+
export const dockerWorkerDriverFactory = {
|
|
270
|
+
kind: KIND,
|
|
271
|
+
create: (options, deps) => new DockerWorkerDriver(options, deps),
|
|
272
|
+
};
|
|
273
|
+
/**
|
|
274
|
+
* Register this extension's worker driver. Idempotent; called by the composition
|
|
275
|
+
* root (or a test) against its registry, defaulting to the process-wide one.
|
|
276
|
+
*/
|
|
277
|
+
export function registerDockerWorkerDriver(registries = {}) {
|
|
278
|
+
const drivers = registries.workerDrivers ?? defaultWorkerDriverRegistry;
|
|
279
|
+
if (drivers.get(KIND) === undefined) {
|
|
280
|
+
drivers.register(dockerWorkerDriverFactory);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAcnF,MAAM,IAAI,GAAG,QAAQ,CAAC;AAEtB;;;;GAIG;AACH,MAAM,YAAY,GAAuB;IACvC,cAAc,EAAE,IAAI;IACpB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,GAAG,sBAAsB,CAAC;AAE1C,sFAAsF;AACtF,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAE7C,gFAAgF;AAChF,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,8EAA8E;AAC9E,MAAM,aAAa,GAAG,cAAc,CAAC;AAErC,4EAA4E;AAC5E,MAAM,YAAY,GAAG,MAAM,CAAC;AAoB5B,sEAAsE;AACtE,SAAS,gBAAgB,CACvB,OAAsD,EACtD,GAAG,IAAc;IAEjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IAClE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,gBAAgB,GAAc,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAC1D,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IACnD,QAAQ,CACN,QAAQ,EACR,CAAC,GAAG,IAAI,CAAC,EACT,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EACxE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QACxB,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChE,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GACV,OAAQ,KAAmC,EAAE,IAAI,KAAK,QAAQ;YAC5D,CAAC,CAAC,CAAE,KAA0B,CAAC,IAAI,IAAI,CAAC,CAAC;YACzC,CAAC,CAAC,KAAK;gBACL,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,CAAC,CAAC;QACV,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACnF,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC1E,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,kBAAkB;IAWV;IAVV,IAAI,GAAG,IAAI,CAAC;IACZ,YAAY,GAAG,YAAY,CAAC;IAEpB,KAAK,CAAqB;IAC1B,IAAI,CAAS;IACb,SAAS,CAAY;IACrB,MAAM,CAAY;IAEnC,YACE,OAA0C,EACzB,IAAgB,EACjC,YAAmC,EAAE;QADpB,SAAI,GAAJ,IAAI,CAAY;QAGjC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,YAAY,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,IAAI,gBAAgB,CAAC;QACzD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,SAAS,CAAC,GAAqB;QACnC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAE1D,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxF,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,SAAS,GAAa;YAC1B,SAAS;YACT,GAAG,UAAU,GAAG;YAChB,SAAS;YACT,GAAG,eAAe,IAAI,GAAG,CAAC,QAAQ,EAAE;SACrC,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,KAAK,KAAK,UAAU;gBAAE,SAAS;YACnC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,OAAO,GAAG;YACd,KAAK;YACL,IAAI;YACJ,IAAI;YACJ,cAAc,kBAAkB,EAAE;YAClC,GAAG,SAAS;YACZ,IAAI,CAAC,KAAK;SACX,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;YACxC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEtC,8EAA8E;QAC9E,kFAAkF;QAClF,8EAA8E;QAC9E,iFAAiF;QACjF,oDAAoD;QACpD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,EAAE;gBAC3E,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9C,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,OAAO;gBACL,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;gBACxC,SAAS,EAAE,WAAW;gBACtB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;gBAC5C,MAAM,EAAE;oBACN,UAAU;oBACV,eAAe;oBACf,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,UAAU,CAAC;iBACtD;gBACD,QAAQ,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;aACpC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6EAA6E;YAC7E,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CACjF,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CACT,MAAwB,EACxB,IAAiD;QAEjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE;gBACjE,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACrE,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACvF,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CACX,MAAwB,EACxB,IAAmD;QAEnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE;YAClE,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChC,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO;QACrD,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CACjC;YACE,IAAI;YACJ,UAAU;YACV,SAAS,UAAU,EAAE;YACrB,YAAY;YACZ,UAAU;YACV,sBAAsB,eAAe,iBAAiB;SACvD,EACD,EAAE,SAAS,EAAE,MAAM,EAAE,CACtB,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QACpD,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChE,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,QAAQ,KAAK,SAAS;gBAAE,SAAS;YACrC,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ;gBACR,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;gBACxC,SAAS,EAAE,WAAW;gBACtB,WAAW;gBACX,yEAAyE;gBACzE,oEAAoE;gBACpE,uEAAuE;gBACvE,qDAAqD;gBACrD,MAAM,EAAE,CAAC,gBAAgB,EAAE,UAAU,EAAE,eAAe,CAAC;gBACvD,QAAQ,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,aAAa,CAAC,QAAgB;QACpC,OAAO,GAAG,IAAI,CAAC,IAAI,cAAc,QAAQ,EAAE,CAAC;IAC9C,CAAC;CACF;AAED,qFAAqF;AACrF,MAAM,CAAC,MAAM,yBAAyB,GAAwB;IAC5D,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC;CACjE,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,aAAmE,EAAE;IAErE,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,IAAI,2BAA2B,CAAC;IACxE,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lorenz/docker-worker",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@lorenz/worker-sdk": "file:../../packages/worker-sdk"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type Issue, type RuntimeTrackerClient, type Settings } from "@lorenz/domain";
|
|
2
|
+
export interface JiraClientDeps {
|
|
3
|
+
fetchImpl?: typeof fetch | undefined;
|
|
4
|
+
}
|
|
5
|
+
export declare class JiraClient implements RuntimeTrackerClient {
|
|
6
|
+
private readonly settings;
|
|
7
|
+
private readonly fetchImpl;
|
|
8
|
+
constructor(settings: Settings, deps?: JiraClientDeps);
|
|
9
|
+
fetchCandidateIssues(): Promise<Issue[]>;
|
|
10
|
+
fetchIssuesByIds(ids: string[]): Promise<Issue[]>;
|
|
11
|
+
fetchIssuesByStates(states: string[]): Promise<Issue[]>;
|
|
12
|
+
readIssue(issueIdOrKey: string): Promise<Issue>;
|
|
13
|
+
updateIssueStatus(issueIdOrKey: string, status: string): Promise<Issue>;
|
|
14
|
+
addComment(issueIdOrKey: string, body: string): Promise<void>;
|
|
15
|
+
createIssue(input: {
|
|
16
|
+
title: string;
|
|
17
|
+
body?: string | undefined;
|
|
18
|
+
status?: string | undefined;
|
|
19
|
+
assignee?: string | undefined;
|
|
20
|
+
}): Promise<Issue>;
|
|
21
|
+
searchIssues(jql: string, maxResults?: number): Promise<Issue[]>;
|
|
22
|
+
private requiredProjectKey;
|
|
23
|
+
private baseUrl;
|
|
24
|
+
private createIssueAssignee;
|
|
25
|
+
private authHeader;
|
|
26
|
+
private request;
|
|
27
|
+
}
|
|
28
|
+
export declare class JiraMcpClient implements RuntimeTrackerClient {
|
|
29
|
+
private readonly settings;
|
|
30
|
+
private readonly fetchImpl;
|
|
31
|
+
constructor(settings: Settings, deps?: JiraClientDeps);
|
|
32
|
+
fetchCandidateIssues(): Promise<Issue[]>;
|
|
33
|
+
fetchIssuesByIds(ids: string[]): Promise<Issue[]>;
|
|
34
|
+
fetchIssuesByStates(states: string[]): Promise<Issue[]>;
|
|
35
|
+
readIssue(issueIdOrKey: string): Promise<Issue>;
|
|
36
|
+
updateIssueStatus(issueIdOrKey: string, status: string): Promise<Issue>;
|
|
37
|
+
addComment(issueIdOrKey: string, body: string): Promise<void>;
|
|
38
|
+
createIssue(input: {
|
|
39
|
+
title: string;
|
|
40
|
+
body?: string | undefined;
|
|
41
|
+
status?: string | undefined;
|
|
42
|
+
assignee?: string | undefined;
|
|
43
|
+
}): Promise<Issue>;
|
|
44
|
+
searchIssues(jql: string): Promise<Issue[]>;
|
|
45
|
+
private baseUrlOrNull;
|
|
46
|
+
private toolName;
|
|
47
|
+
private callTool;
|
|
48
|
+
}
|
|
49
|
+
export declare function normalizeJiraIssue(issue: Record<string, unknown>, assignee?: string, baseUrl?: string | null): Issue;
|
|
50
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|