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,281 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { accessSync, constants } from "node:fs";
|
|
3
|
+
import { setTimeout, clearTimeout } from "node:timers";
|
|
4
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
5
|
+
import { execa } from "execa";
|
|
6
|
+
const DEFAULT_SSH_TIMEOUT_MS = 60_000;
|
|
7
|
+
const FORCE_KILL_DELAY_MS = 5_000;
|
|
8
|
+
const DEFAULT_REMOTE_TCP_PORT_READY_TIMEOUT_MS = 10_000;
|
|
9
|
+
const DEFAULT_REMOTE_TCP_PORT_READY_INTERVAL_MS = 200;
|
|
10
|
+
const DEFAULT_REMOTE_TCP_PORT_READY_ATTEMPT_TIMEOUT_MS = 1_000;
|
|
11
|
+
const TCP_PORT_MAX = 65_535;
|
|
12
|
+
const NUMERIC_CHMOD_MODE = /^[0-7]{3,4}$/;
|
|
13
|
+
const SYMBOLIC_CHMOD_MODE = /^(?:[ugoa]*(?:(?:[+-][rwxXstugo]+)|(?:=[rwxXstugo]*)))(?:,(?:[ugoa]*(?:(?:[+-][rwxXstugo]+)|(?:=[rwxXstugo]*))))*$/;
|
|
14
|
+
function requireSshExecutable() {
|
|
15
|
+
const pathValue = process.env.PATH ?? "";
|
|
16
|
+
for (const directory of pathValue.split(path.delimiter)) {
|
|
17
|
+
if (!directory)
|
|
18
|
+
continue;
|
|
19
|
+
const executable = path.join(directory, "ssh");
|
|
20
|
+
try {
|
|
21
|
+
accessSync(executable, constants.X_OK);
|
|
22
|
+
return executable;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
throw new Error("ssh_not_found");
|
|
29
|
+
}
|
|
30
|
+
export async function runSsh(host, command, options = {}) {
|
|
31
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_SSH_TIMEOUT_MS;
|
|
32
|
+
if (!Number.isInteger(timeoutMs) || timeoutMs <= 0)
|
|
33
|
+
throw new Error(`invalid_ssh_timeout: ${timeoutMs}`);
|
|
34
|
+
if (options.abortSignal?.aborted)
|
|
35
|
+
throw new Error(`ssh_aborted: ${host}`);
|
|
36
|
+
try {
|
|
37
|
+
// Spawn in its own process group (detached) so we can kill the entire group on timeout.
|
|
38
|
+
// execa's built-in timeout only signals the direct child, leaving sub-processes alive
|
|
39
|
+
// with open pipes that block resolution until they exit naturally.
|
|
40
|
+
// SIGTERM first to allow trap handlers / graceful shutdown; SIGKILL after 5s as fallback.
|
|
41
|
+
// TODO - this may not be enough to ensure the remote ssh process cleans up its children
|
|
42
|
+
const subprocess = execa("ssh", sshArgs(host, command), {
|
|
43
|
+
reject: false,
|
|
44
|
+
...(options.stderrToStdout ? { all: true } : {}),
|
|
45
|
+
stdin: "ignore",
|
|
46
|
+
stripFinalNewline: false,
|
|
47
|
+
detached: true,
|
|
48
|
+
});
|
|
49
|
+
let timeoutTimer;
|
|
50
|
+
let forceKillTimer;
|
|
51
|
+
let terminationRequested = false;
|
|
52
|
+
let abortHandler;
|
|
53
|
+
const killProcessGroup = (signal) => {
|
|
54
|
+
try {
|
|
55
|
+
process.kill(-subprocess.pid, signal);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* process already exited */
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const forceKillProcessGroup = () => {
|
|
62
|
+
forceKillTimer ??= setTimeout(() => {
|
|
63
|
+
killProcessGroup("SIGKILL");
|
|
64
|
+
}, FORCE_KILL_DELAY_MS);
|
|
65
|
+
};
|
|
66
|
+
const clearTimers = () => {
|
|
67
|
+
if (timeoutTimer !== undefined)
|
|
68
|
+
clearTimeout(timeoutTimer);
|
|
69
|
+
// After timeout, descendants can still hold inherited pipes open even if the direct child exits.
|
|
70
|
+
if (!terminationRequested && forceKillTimer !== undefined)
|
|
71
|
+
clearTimeout(forceKillTimer);
|
|
72
|
+
if (abortHandler)
|
|
73
|
+
options.abortSignal?.removeEventListener("abort", abortHandler);
|
|
74
|
+
};
|
|
75
|
+
const clearForceKillTimer = () => {
|
|
76
|
+
if (forceKillTimer !== undefined)
|
|
77
|
+
clearTimeout(forceKillTimer);
|
|
78
|
+
};
|
|
79
|
+
const terminate = (error, reject) => {
|
|
80
|
+
terminationRequested = true;
|
|
81
|
+
killProcessGroup("SIGTERM");
|
|
82
|
+
forceKillProcessGroup();
|
|
83
|
+
reject(error);
|
|
84
|
+
};
|
|
85
|
+
const timeout = new Promise((_, reject) => {
|
|
86
|
+
timeoutTimer = setTimeout(() => {
|
|
87
|
+
terminate(new Error(`ssh_timeout: ${host} ${timeoutMs}`), reject);
|
|
88
|
+
}, timeoutMs);
|
|
89
|
+
});
|
|
90
|
+
const abort = new Promise((_, reject) => {
|
|
91
|
+
if (!options.abortSignal)
|
|
92
|
+
return;
|
|
93
|
+
abortHandler = () => terminate(new Error(`ssh_aborted: ${host}`), reject);
|
|
94
|
+
options.abortSignal.addEventListener("abort", abortHandler, { once: true });
|
|
95
|
+
});
|
|
96
|
+
void subprocess.then(clearForceKillTimer, clearForceKillTimer);
|
|
97
|
+
const result = await Promise.race([subprocess, timeout, abort]).finally(clearTimers);
|
|
98
|
+
if (result.code === "ENOENT")
|
|
99
|
+
throw new Error("ssh_not_found");
|
|
100
|
+
if (typeof result.exitCode !== "number")
|
|
101
|
+
throw sshMissingExitCodeError(host, result);
|
|
102
|
+
return {
|
|
103
|
+
stdout: options.stderrToStdout ? (result.all ?? "") : result.stdout,
|
|
104
|
+
stderr: options.stderrToStdout ? "" : result.stderr,
|
|
105
|
+
status: result.exitCode,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const code = error.code;
|
|
110
|
+
if (code === "ENOENT")
|
|
111
|
+
throw new Error("ssh_not_found", { cause: error });
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export function startSshProcess(host, command) {
|
|
116
|
+
return execa("ssh", sshArgs(host, command), {
|
|
117
|
+
stdin: "pipe",
|
|
118
|
+
stdout: "pipe",
|
|
119
|
+
stderr: "pipe",
|
|
120
|
+
reject: false,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
export function startReverseTunnel(host, remotePort, localHost, localPort) {
|
|
124
|
+
return execa(requireSshExecutable(), reverseTunnelArgs(host, remotePort, localHost, localPort), {
|
|
125
|
+
stdin: "pipe",
|
|
126
|
+
stdout: "pipe",
|
|
127
|
+
stderr: "pipe",
|
|
128
|
+
reject: false,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
export async function waitForRemoteTcpPort(host, remotePort, options = {}) {
|
|
132
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_REMOTE_TCP_PORT_READY_TIMEOUT_MS;
|
|
133
|
+
const intervalMs = options.intervalMs ?? DEFAULT_REMOTE_TCP_PORT_READY_INTERVAL_MS;
|
|
134
|
+
const attemptTimeoutMs = options.attemptTimeoutMs ?? DEFAULT_REMOTE_TCP_PORT_READY_ATTEMPT_TIMEOUT_MS;
|
|
135
|
+
if (!Number.isInteger(remotePort) || remotePort <= 0 || remotePort > TCP_PORT_MAX) {
|
|
136
|
+
throw new Error(`invalid_remote_tcp_port: ${remotePort}`);
|
|
137
|
+
}
|
|
138
|
+
if (!Number.isInteger(timeoutMs) || timeoutMs <= 0) {
|
|
139
|
+
throw new Error(`invalid_remote_tcp_port_ready_timeout: ${timeoutMs}`);
|
|
140
|
+
}
|
|
141
|
+
if (!Number.isInteger(intervalMs) || intervalMs <= 0) {
|
|
142
|
+
throw new Error(`invalid_remote_tcp_port_ready_interval: ${intervalMs}`);
|
|
143
|
+
}
|
|
144
|
+
if (!Number.isInteger(attemptTimeoutMs) || attemptTimeoutMs <= 0) {
|
|
145
|
+
throw new Error(`invalid_remote_tcp_port_ready_attempt_timeout: ${attemptTimeoutMs}`);
|
|
146
|
+
}
|
|
147
|
+
const deadline = Date.now() + timeoutMs;
|
|
148
|
+
let lastFailure;
|
|
149
|
+
while (Date.now() < deadline) {
|
|
150
|
+
const remainingMs = Math.max(1, deadline - Date.now());
|
|
151
|
+
try {
|
|
152
|
+
const result = await runSsh(host, `: < /dev/tcp/127.0.0.1/${remotePort}`, {
|
|
153
|
+
stderrToStdout: true,
|
|
154
|
+
timeoutMs: Math.min(attemptTimeoutMs, remainingMs),
|
|
155
|
+
});
|
|
156
|
+
if (result.status === 0)
|
|
157
|
+
return;
|
|
158
|
+
lastFailure = new Error(`remote_tcp_probe_status: ${result.status} ${result.stdout}`);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
lastFailure = error;
|
|
162
|
+
}
|
|
163
|
+
const sleepMs = Math.min(intervalMs, Math.max(0, deadline - Date.now()));
|
|
164
|
+
if (sleepMs > 0)
|
|
165
|
+
await delay(sleepMs);
|
|
166
|
+
}
|
|
167
|
+
throw new Error(`remote_tcp_port_unreachable: ${host} ${remotePort}`, {
|
|
168
|
+
cause: lastFailure,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
export async function writeRemoteFile(host, remotePath, contents, options = {}) {
|
|
172
|
+
const command = [
|
|
173
|
+
`mkdir -p ${shellEscape(path.posix.dirname(remotePath))}`,
|
|
174
|
+
`printf '%s' ${shellEscape(contents)} > ${shellEscape(remotePath)}`,
|
|
175
|
+
chmodCommand(options.mode, remotePath),
|
|
176
|
+
].join("\n");
|
|
177
|
+
const result = await runSsh(host, command, { ...options, stderrToStdout: true });
|
|
178
|
+
if (result.status !== 0)
|
|
179
|
+
throw new Error(`remote_write_failed: ${result.status} ${result.stdout}`);
|
|
180
|
+
}
|
|
181
|
+
export function sshArgs(host, command) {
|
|
182
|
+
const target = parseSshTarget(host);
|
|
183
|
+
return [
|
|
184
|
+
...sshConfigArgs(),
|
|
185
|
+
"-T",
|
|
186
|
+
...(target.port ? ["-p", target.port] : []),
|
|
187
|
+
"--",
|
|
188
|
+
target.destination,
|
|
189
|
+
remoteShellCommand(command),
|
|
190
|
+
];
|
|
191
|
+
}
|
|
192
|
+
export function reverseTunnelArgs(host, remotePort, localHost, localPort) {
|
|
193
|
+
const target = parseSshTarget(host);
|
|
194
|
+
return [
|
|
195
|
+
...sshConfigArgs(),
|
|
196
|
+
"-T",
|
|
197
|
+
"-N",
|
|
198
|
+
"-o",
|
|
199
|
+
"ExitOnForwardFailure=yes",
|
|
200
|
+
...(target.port ? ["-p", target.port] : []),
|
|
201
|
+
"-R",
|
|
202
|
+
`${remotePort}:${localHost}:${localPort}`,
|
|
203
|
+
"--",
|
|
204
|
+
target.destination,
|
|
205
|
+
];
|
|
206
|
+
}
|
|
207
|
+
export function remoteShellCommand(command) {
|
|
208
|
+
return `bash -lc ${shellEscape(command)}`;
|
|
209
|
+
}
|
|
210
|
+
export function shellEscape(value) {
|
|
211
|
+
return `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
212
|
+
}
|
|
213
|
+
export function parseSshTarget(target) {
|
|
214
|
+
const trimmed = target.trim();
|
|
215
|
+
const match = /^(.*):(\d+)$/.exec(trimmed);
|
|
216
|
+
if (!match)
|
|
217
|
+
return { destination: validateSshDestination(trimmed), port: null };
|
|
218
|
+
const destination = match[1] ?? "";
|
|
219
|
+
const port = match[2] ?? "";
|
|
220
|
+
if (validPortDestination(destination))
|
|
221
|
+
return { destination: validateSshDestination(destination), port };
|
|
222
|
+
return { destination: validateSshDestination(trimmed), port: null };
|
|
223
|
+
}
|
|
224
|
+
function sshMissingExitCodeError(host, result) {
|
|
225
|
+
const killed = result.killed ?? result.isTerminated ?? result.isForcefullyTerminated ?? false;
|
|
226
|
+
const metadata = [
|
|
227
|
+
`signal=${result.signal ?? "none"}`,
|
|
228
|
+
result.signalDescription
|
|
229
|
+
? `signalDescription=${JSON.stringify(result.signalDescription)}`
|
|
230
|
+
: null,
|
|
231
|
+
`terminated=${Boolean(result.isTerminated)}`,
|
|
232
|
+
`killed=${Boolean(killed)}`,
|
|
233
|
+
`forcefullyTerminated=${Boolean(result.isForcefullyTerminated)}`,
|
|
234
|
+
`timedOut=${Boolean(result.timedOut)}`,
|
|
235
|
+
`canceled=${Boolean(result.isCanceled)}`,
|
|
236
|
+
`failed=${Boolean(result.failed)}`,
|
|
237
|
+
].filter((entry) => entry !== null);
|
|
238
|
+
return new Error(`ssh_failed_without_exit_code: ${host} ${metadata.join(" ")}`, {
|
|
239
|
+
cause: result,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
function sshConfigArgs() {
|
|
243
|
+
const configPath = process.env.SYMPHONY_SSH_CONFIG;
|
|
244
|
+
return configPath ? ["-F", configPath] : [];
|
|
245
|
+
}
|
|
246
|
+
function validPortDestination(destination) {
|
|
247
|
+
return destination !== "" && (!destination.includes(":") || bracketedHost(destination));
|
|
248
|
+
}
|
|
249
|
+
function validateSshDestination(destination) {
|
|
250
|
+
if (destination === "" || destination.startsWith("-"))
|
|
251
|
+
throw new Error(`invalid_ssh_destination: ${destination}`);
|
|
252
|
+
return destination;
|
|
253
|
+
}
|
|
254
|
+
function bracketedHost(destination) {
|
|
255
|
+
return destination.includes("[") && destination.includes("]");
|
|
256
|
+
}
|
|
257
|
+
function chmodCommand(mode, remotePath) {
|
|
258
|
+
if (typeof mode === "number" && Number.isInteger(mode))
|
|
259
|
+
return `chmod ${mode.toString(8)} ${shellEscape(chmodPathOperand(remotePath))}`;
|
|
260
|
+
if (typeof mode === "string") {
|
|
261
|
+
const normalizedMode = normalizeChmodMode(mode);
|
|
262
|
+
if (normalizedMode !== "")
|
|
263
|
+
return `chmod ${shellEscape(normalizedMode)} ${shellEscape(chmodPathOperand(remotePath))}`;
|
|
264
|
+
}
|
|
265
|
+
return "true";
|
|
266
|
+
}
|
|
267
|
+
function normalizeChmodMode(mode) {
|
|
268
|
+
const trimmed = mode.trim();
|
|
269
|
+
if (trimmed === "")
|
|
270
|
+
return "";
|
|
271
|
+
if (trimmed !== mode || !validChmodMode(trimmed))
|
|
272
|
+
throw new Error(`invalid_chmod_mode: ${JSON.stringify(mode)}`);
|
|
273
|
+
return trimmed;
|
|
274
|
+
}
|
|
275
|
+
function validChmodMode(mode) {
|
|
276
|
+
return NUMERIC_CHMOD_MODE.test(mode) || SYMBOLIC_CHMOD_MODE.test(mode);
|
|
277
|
+
}
|
|
278
|
+
function chmodPathOperand(remotePath) {
|
|
279
|
+
return remotePath.startsWith("-") ? `./${remotePath}` : remotePath;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lorenz/ssh",
|
|
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/domain": "file:../domain",
|
|
13
|
+
"execa": "^9.6.1"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { WorkerDescriptor, WorkerDriver, WorkerDriverFactory, WorkerDriverRegistry, WorkerHealth, DriverCapabilities, DriverDeps, ProvisionRequest, TeardownReason } from "@lorenz/worker-sdk";
|
|
2
|
+
/**
|
|
3
|
+
* A {@link WorkerDriver} over a FIXED set of pre-existing SSH machines configured
|
|
4
|
+
* via the `ssh_hosts` (or `sshHosts`) driver option. It owns no lifecycle for the
|
|
5
|
+
* machines themselves: `min == max == hosts.length` is the implicit shape, and
|
|
6
|
+
* the address IS the `workerId`. `provision` hands out one of the configured
|
|
7
|
+
* addresses idempotently; `probe` runs `printf ready` over SSH using the
|
|
8
|
+
* caller-supplied `opts.timeoutMs` (the pool threads `worker.sshTimeoutMs` here);
|
|
9
|
+
* `destroy` merely forgets the address locally - it runs NO workspace hooks and
|
|
10
|
+
* NEVER deletes a machine (a destroyed host is immediately re-provisionable);
|
|
11
|
+
* `list` returns the configured set minus the addresses currently forgotten.
|
|
12
|
+
*/
|
|
13
|
+
export declare class StaticSshWorkerDriver implements WorkerDriver {
|
|
14
|
+
private readonly deps;
|
|
15
|
+
readonly kind = "static-ssh";
|
|
16
|
+
readonly capabilities: DriverCapabilities;
|
|
17
|
+
/** The full configured inventory (the fixed address set), in config order. */
|
|
18
|
+
private readonly hosts;
|
|
19
|
+
private readonly hostSet;
|
|
20
|
+
/**
|
|
21
|
+
* workerId -> assigned host. Keys are the pool's idempotency keys: either a
|
|
22
|
+
* synthetic `worker-N` the pool minted, or a configured host string (the legacy
|
|
23
|
+
* "address IS the workerId" shape). Tracks the provisioned-minus-destroyed view.
|
|
24
|
+
*/
|
|
25
|
+
private readonly assignments;
|
|
26
|
+
private readonly runSsh;
|
|
27
|
+
constructor(options: Readonly<Record<string, unknown>>, deps: DriverDeps);
|
|
28
|
+
/**
|
|
29
|
+
* Hands out a configured address for `req.workerId`. The pool mints synthetic
|
|
30
|
+
* `worker-N` idempotency keys (NOT host strings), so an unknown workerId is ASSIGNED a
|
|
31
|
+
* free configured host round-robin and that mapping is remembered (the
|
|
32
|
+
* `workerHost` is the chosen host while the `workerId` stays the pool's key). A
|
|
33
|
+
* workerId that already IS a configured host is served directly (the legacy
|
|
34
|
+
* "address is the workerId" shape, e.g. a host-keyed hydrate survivor). Idempotent
|
|
35
|
+
* on `workerId`: a second call returns the same assignment. Rejects with
|
|
36
|
+
* `static_ssh_unknown_host` only when the fixed inventory is exhausted (no free
|
|
37
|
+
* host remains).
|
|
38
|
+
*/
|
|
39
|
+
provision(req: ProvisionRequest): Promise<WorkerDescriptor>;
|
|
40
|
+
/**
|
|
41
|
+
* Runs `printf ready` over SSH against the worker's address, using the
|
|
42
|
+
* caller-supplied `opts.timeoutMs` (the pool passes `worker.sshTimeoutMs`). A
|
|
43
|
+
* non-zero exit or any transport error (e.g. `ssh_timeout`) gates the worker to
|
|
44
|
+
* `{ ok: false }` rather than throwing, so the reaper can demote it.
|
|
45
|
+
*/
|
|
46
|
+
probe(worker: WorkerDescriptor, opts: {
|
|
47
|
+
timeoutMs: number;
|
|
48
|
+
signal?: AbortSignal;
|
|
49
|
+
}): Promise<WorkerHealth>;
|
|
50
|
+
/**
|
|
51
|
+
* Forgets the address locally. This is a pure bookkeeping no-op against the
|
|
52
|
+
* machine: it runs NO workspace hooks and NEVER deletes the machine (a static
|
|
53
|
+
* host is pre-existing infrastructure). Idempotent and tolerant of an
|
|
54
|
+
* already-forgotten or never-provisioned address.
|
|
55
|
+
*/
|
|
56
|
+
destroy(worker: WorkerDescriptor, _opts: {
|
|
57
|
+
timeoutMs: number;
|
|
58
|
+
reason: TeardownReason;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
/** Returns the live inventory (provisioned-minus-destroyed assignments). */
|
|
61
|
+
list(): Promise<WorkerDescriptor[]>;
|
|
62
|
+
private descriptorFor;
|
|
63
|
+
}
|
|
64
|
+
/** The registered `static-ssh` factory: constructs a driver over the configured hosts. */
|
|
65
|
+
export declare const staticSshWorkerDriverFactory: WorkerDriverFactory;
|
|
66
|
+
/**
|
|
67
|
+
* Register this built-in worker driver. Idempotent; called by the composition
|
|
68
|
+
* root (or a test) against its registry, defaulting to the process-wide one.
|
|
69
|
+
*/
|
|
70
|
+
export declare function registerStaticSshWorkerDriver(registries?: {
|
|
71
|
+
workerDrivers?: WorkerDriverRegistry | undefined;
|
|
72
|
+
}): void;
|
|
73
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAEhB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAgC5B;;;;;;;;;;GAUG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IAiBtD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAhBvB,QAAQ,CAAC,IAAI,gBAAQ;IACrB,QAAQ,CAAC,YAAY,qBAAgB;IAErC,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAGjC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzB,IAAI,EAAE,UAAU;IAOnC;;;;;;;;;;OAUG;IACG,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuBjE;;;;;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,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,GACnD,OAAO,CAAC,IAAI,CAAC;IAOhB,4EAA4E;IACtE,IAAI,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQzC,OAAO,CAAC,aAAa;CAUtB;AAED,0FAA0F;AAC1F,eAAO,MAAM,4BAA4B,EAAE,mBAG1C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,UAAU,GAAE;IAAE,aAAa,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAA;CAAO,GACpE,IAAI,CAKN"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { defaultWorkerDriverRegistry } from "@lorenz/worker-sdk";
|
|
2
|
+
const KIND = "static-ssh";
|
|
3
|
+
const CAPABILITIES = {
|
|
4
|
+
sshAddressable: true,
|
|
5
|
+
ephemeral: false,
|
|
6
|
+
usesLedger: false,
|
|
7
|
+
};
|
|
8
|
+
/** The readiness command the probe runs over SSH (a cheap liveness check). */
|
|
9
|
+
const PROBE_COMMAND = "printf ready";
|
|
10
|
+
/**
|
|
11
|
+
* Reads the configured host list from the driver options, accepting BOTH the
|
|
12
|
+
* snake_case `ssh_hosts` and the camelCase `sshHosts` spellings. This is the
|
|
13
|
+
* documented passthrough: the config normalizer is a flat per-key alias map and
|
|
14
|
+
* does NOT recurse into the driver options, so an operator may write either form.
|
|
15
|
+
* Throws `static_ssh_hosts_required` when neither is a non-empty string array.
|
|
16
|
+
*/
|
|
17
|
+
function readSshHosts(options) {
|
|
18
|
+
const raw = options?.["ssh_hosts"] ?? options?.["sshHosts"];
|
|
19
|
+
if (Array.isArray(raw) &&
|
|
20
|
+
raw.length > 0 &&
|
|
21
|
+
raw.every((value) => typeof value === "string" && value.length > 0)) {
|
|
22
|
+
return raw;
|
|
23
|
+
}
|
|
24
|
+
throw new Error("static_ssh_hosts_required");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A {@link WorkerDriver} over a FIXED set of pre-existing SSH machines configured
|
|
28
|
+
* via the `ssh_hosts` (or `sshHosts`) driver option. It owns no lifecycle for the
|
|
29
|
+
* machines themselves: `min == max == hosts.length` is the implicit shape, and
|
|
30
|
+
* the address IS the `workerId`. `provision` hands out one of the configured
|
|
31
|
+
* addresses idempotently; `probe` runs `printf ready` over SSH using the
|
|
32
|
+
* caller-supplied `opts.timeoutMs` (the pool threads `worker.sshTimeoutMs` here);
|
|
33
|
+
* `destroy` merely forgets the address locally - it runs NO workspace hooks and
|
|
34
|
+
* NEVER deletes a machine (a destroyed host is immediately re-provisionable);
|
|
35
|
+
* `list` returns the configured set minus the addresses currently forgotten.
|
|
36
|
+
*/
|
|
37
|
+
export class StaticSshWorkerDriver {
|
|
38
|
+
deps;
|
|
39
|
+
kind = KIND;
|
|
40
|
+
capabilities = CAPABILITIES;
|
|
41
|
+
/** The full configured inventory (the fixed address set), in config order. */
|
|
42
|
+
hosts;
|
|
43
|
+
hostSet;
|
|
44
|
+
/**
|
|
45
|
+
* workerId -> assigned host. Keys are the pool's idempotency keys: either a
|
|
46
|
+
* synthetic `worker-N` the pool minted, or a configured host string (the legacy
|
|
47
|
+
* "address IS the workerId" shape). Tracks the provisioned-minus-destroyed view.
|
|
48
|
+
*/
|
|
49
|
+
assignments = new Map();
|
|
50
|
+
runSsh;
|
|
51
|
+
constructor(options, deps) {
|
|
52
|
+
this.deps = deps;
|
|
53
|
+
this.hosts = readSshHosts(options);
|
|
54
|
+
this.hostSet = new Set(this.hosts);
|
|
55
|
+
this.runSsh = deps.runSsh;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Hands out a configured address for `req.workerId`. The pool mints synthetic
|
|
59
|
+
* `worker-N` idempotency keys (NOT host strings), so an unknown workerId is ASSIGNED a
|
|
60
|
+
* free configured host round-robin and that mapping is remembered (the
|
|
61
|
+
* `workerHost` is the chosen host while the `workerId` stays the pool's key). A
|
|
62
|
+
* workerId that already IS a configured host is served directly (the legacy
|
|
63
|
+
* "address is the workerId" shape, e.g. a host-keyed hydrate survivor). Idempotent
|
|
64
|
+
* on `workerId`: a second call returns the same assignment. Rejects with
|
|
65
|
+
* `static_ssh_unknown_host` only when the fixed inventory is exhausted (no free
|
|
66
|
+
* host remains).
|
|
67
|
+
*/
|
|
68
|
+
async provision(req) {
|
|
69
|
+
const existing = this.assignments.get(req.workerId);
|
|
70
|
+
if (existing) {
|
|
71
|
+
return Promise.resolve(this.descriptorFor(req.workerId, existing, [...req.labels]));
|
|
72
|
+
}
|
|
73
|
+
// Legacy shape: the workerId itself is a configured address (the address IS the
|
|
74
|
+
// key). Serve that host directly so a host-keyed provision/hydrate still works.
|
|
75
|
+
if (this.hostSet.has(req.workerId)) {
|
|
76
|
+
this.assignments.set(req.workerId, req.workerId);
|
|
77
|
+
return Promise.resolve(this.descriptorFor(req.workerId, req.workerId, [...req.labels]));
|
|
78
|
+
}
|
|
79
|
+
// Synthetic workerId (the pool's `worker-N`): assign the first free configured host.
|
|
80
|
+
const taken = new Set(this.assignments.values());
|
|
81
|
+
const host = this.hosts.find((candidate) => !taken.has(candidate));
|
|
82
|
+
if (host === undefined) {
|
|
83
|
+
return Promise.reject(new Error(`static_ssh_unknown_host: ${req.workerId}`));
|
|
84
|
+
}
|
|
85
|
+
this.assignments.set(req.workerId, host);
|
|
86
|
+
return Promise.resolve(this.descriptorFor(req.workerId, host, [...req.labels]));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Runs `printf ready` over SSH against the worker's address, using the
|
|
90
|
+
* caller-supplied `opts.timeoutMs` (the pool passes `worker.sshTimeoutMs`). A
|
|
91
|
+
* non-zero exit or any transport error (e.g. `ssh_timeout`) gates the worker to
|
|
92
|
+
* `{ ok: false }` rather than throwing, so the reaper can demote it.
|
|
93
|
+
*/
|
|
94
|
+
async probe(worker, opts) {
|
|
95
|
+
try {
|
|
96
|
+
const result = await this.runSsh(worker.workerHost, PROBE_COMMAND, {
|
|
97
|
+
timeoutMs: opts.timeoutMs,
|
|
98
|
+
});
|
|
99
|
+
if (result.status !== 0) {
|
|
100
|
+
return { ok: false, reason: `static_ssh_probe_exit_${result.status}` };
|
|
101
|
+
}
|
|
102
|
+
return { ok: true };
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
return { ok: false, reason: error instanceof Error ? error.message : String(error) };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Forgets the address locally. This is a pure bookkeeping no-op against the
|
|
110
|
+
* machine: it runs NO workspace hooks and NEVER deletes the machine (a static
|
|
111
|
+
* host is pre-existing infrastructure). Idempotent and tolerant of an
|
|
112
|
+
* already-forgotten or never-provisioned address.
|
|
113
|
+
*/
|
|
114
|
+
async destroy(worker, _opts) {
|
|
115
|
+
// Free the host assignment so the address re-enters the pool of free hosts a
|
|
116
|
+
// future provision can hand out. Idempotent and tolerant of an already-gone id.
|
|
117
|
+
this.assignments.delete(worker.workerId);
|
|
118
|
+
return Promise.resolve();
|
|
119
|
+
}
|
|
120
|
+
/** Returns the live inventory (provisioned-minus-destroyed assignments). */
|
|
121
|
+
async list() {
|
|
122
|
+
return Promise.resolve([...this.assignments.entries()].map(([workerId, host]) => this.descriptorFor(workerId, host, [])));
|
|
123
|
+
}
|
|
124
|
+
descriptorFor(workerId, host, labels) {
|
|
125
|
+
return {
|
|
126
|
+
workerId,
|
|
127
|
+
workerHost: host,
|
|
128
|
+
driverRef: host,
|
|
129
|
+
createdAtMs: this.deps.clock.now().getTime(),
|
|
130
|
+
labels,
|
|
131
|
+
metadata: {},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** The registered `static-ssh` factory: constructs a driver over the configured hosts. */
|
|
136
|
+
export const staticSshWorkerDriverFactory = {
|
|
137
|
+
kind: KIND,
|
|
138
|
+
create: (options, deps) => new StaticSshWorkerDriver(options, deps),
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Register this built-in worker driver. Idempotent; called by the composition
|
|
142
|
+
* root (or a test) against its registry, defaulting to the process-wide one.
|
|
143
|
+
*/
|
|
144
|
+
export function registerStaticSshWorkerDriver(registries = {}) {
|
|
145
|
+
const drivers = registries.workerDrivers ?? defaultWorkerDriverRegistry;
|
|
146
|
+
if (drivers.get(KIND) === undefined) {
|
|
147
|
+
drivers.register(staticSshWorkerDriverFactory);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lorenz/static-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:../worker-sdk"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small query DSL backing the read tools of the structured trackers
|
|
3
|
+
* (`local_query` today). It is the composable, side-effect-free analog of `linear_graphql`'s
|
|
4
|
+
* read power: a query can never mutate the backend, so it carries no trust-boundary or
|
|
5
|
+
* atomicity risk and the agent can filter/project/sort/page freely.
|
|
6
|
+
*
|
|
7
|
+
* The DSL is intentionally total - no regex, no `eval`, no JSONPath - and is evaluated in
|
|
8
|
+
* memory over already-parsed records (a board `Issue[]`).
|
|
9
|
+
* Nesting depth and node count are bounded so a hostile or runaway filter cannot blow up.
|
|
10
|
+
*/
|
|
11
|
+
type Scalar = string | number | boolean | null;
|
|
12
|
+
type Predicate = {
|
|
13
|
+
field: string;
|
|
14
|
+
op: "eq" | "ne" | "lt" | "lte" | "gt" | "gte";
|
|
15
|
+
value: Scalar;
|
|
16
|
+
} | {
|
|
17
|
+
field: string;
|
|
18
|
+
op: "in" | "nin";
|
|
19
|
+
value: Scalar[];
|
|
20
|
+
} | {
|
|
21
|
+
field: string;
|
|
22
|
+
op: "contains";
|
|
23
|
+
value: string;
|
|
24
|
+
ci?: boolean;
|
|
25
|
+
} | {
|
|
26
|
+
field: string;
|
|
27
|
+
op: "exists";
|
|
28
|
+
value: boolean;
|
|
29
|
+
};
|
|
30
|
+
export type Filter = Predicate | {
|
|
31
|
+
and: Filter[];
|
|
32
|
+
} | {
|
|
33
|
+
or: Filter[];
|
|
34
|
+
} | {
|
|
35
|
+
not: Filter;
|
|
36
|
+
};
|
|
37
|
+
interface OrderBy {
|
|
38
|
+
field: string;
|
|
39
|
+
dir: "asc" | "desc";
|
|
40
|
+
}
|
|
41
|
+
export interface QuerySpec {
|
|
42
|
+
where?: Filter;
|
|
43
|
+
orderBy: OrderBy[];
|
|
44
|
+
limit: number;
|
|
45
|
+
offset: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate untrusted agent input into a typed {@link Filter}, reconstructing each node so no
|
|
49
|
+
* stray properties survive. Throws a clear `Error` on malformed input or when the tree exceeds
|
|
50
|
+
* the depth/node bounds.
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseFilter(input: unknown): Filter;
|
|
53
|
+
/** Evaluate a validated {@link Filter} against a record. Side-effect free. */
|
|
54
|
+
export declare function matchesFilter(record: Record<string, unknown>, filter: Filter): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Parse the shared query envelope (`where`, `order_by`, `limit`, `offset`) from raw tool args.
|
|
57
|
+
* `select`, and any tracker-specific args, are parsed by the calling tool.
|
|
58
|
+
*/
|
|
59
|
+
export declare function parseQuerySpec(args: Record<string, unknown>): QuerySpec;
|
|
60
|
+
/** Filter, then (stably) sort, then page a record list. Returns the page plus the pre-page total. */
|
|
61
|
+
export declare function applyQuery<T extends Record<string, unknown>>(records: T[], spec: QuerySpec): {
|
|
62
|
+
rows: T[];
|
|
63
|
+
total: number;
|
|
64
|
+
};
|
|
65
|
+
/** Validate an optional `select` projection: an array of field-name strings, or undefined. */
|
|
66
|
+
export declare function parseSelect(input: unknown): string[] | undefined;
|
|
67
|
+
/** Project a record down to the named fields, dropping any the record does not have. */
|
|
68
|
+
export declare function pickFields(record: Record<string, unknown>, fields: string[]): Record<string, unknown>;
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../src/filter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,KAAK,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE/C,KAAK,SAAS,GACV;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/E;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,IAAI,GAAG,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9D;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF,UAAU,OAAO;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,KAAK,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAUD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAElD;AAoED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKtF;AAuCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAOvE;AAED,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,OAAO,EAAE,CAAC,EAAE,EACZ,IAAI,EAAE,SAAS,GACd;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAO9B;AAED,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAMhE;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB"}
|