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
package/README.md
ADDED
|
@@ -0,0 +1,774 @@
|
|
|
1
|
+
# Lorenz
|
|
2
|
+
|
|
3
|
+
Lorenz turns tracker issues into agent runs. It polls for eligible work, prepares a workspace,
|
|
4
|
+
renders the workflow prompt with issue context, starts Codex or Claude, and records the run so
|
|
5
|
+
operators can inspect state, retries, cost, and logs.
|
|
6
|
+
|
|
7
|
+
This workspace owns the TypeScript CLI, runtime packages, tracker adapters, terminal dashboard,
|
|
8
|
+
local observability server, trace viewer packages, and tests.
|
|
9
|
+
|
|
10
|
+
## Requirements
|
|
11
|
+
|
|
12
|
+
[mise](https://mise.jdx.dev/) is recommended for managing Node and pnpm:
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
mise trust
|
|
16
|
+
mise install
|
|
17
|
+
pnpm install
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The workspace uses Node 24 and pnpm 9 from `ts/mise.toml`.
|
|
21
|
+
|
|
22
|
+
Runtime requirements depend on the workflow:
|
|
23
|
+
|
|
24
|
+
- `LINEAR_API_KEY` for Linear-backed workflows.
|
|
25
|
+
- `codex` on `PATH` for Codex runs and live Codex tests.
|
|
26
|
+
- A Claude ACP bridge, usually `claude-agent-acp`, for Claude runs and live Claude tests.
|
|
27
|
+
- SSH access for remote workers and live SSH tests.
|
|
28
|
+
- Docker and `ssh-keygen` for disposable live SSH workers when no real SSH hosts are configured.
|
|
29
|
+
|
|
30
|
+
Run commands from `ts/` unless a command says otherwise.
|
|
31
|
+
|
|
32
|
+
## Run
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
pnpm build
|
|
36
|
+
pnpm start -- WORKFLOW.md
|
|
37
|
+
pnpm start:once -- --dry-run --no-tui WORKFLOW.md
|
|
38
|
+
pnpm runs -- --port 4000 --failed
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The built CLI is `lorenz`:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
lorenz [--once] [--dry-run] [--no-tui] [--port <port>] [--logs-root <path>] [path-to-WORKFLOW.md]
|
|
45
|
+
lorenz runs [--issue ID] [--failed] [--cost] [--retries] [--id RUN_ID] [--limit N] [--url URL | --port PORT] [--json]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Optional flags:
|
|
49
|
+
|
|
50
|
+
- `--logs-root <path>` writes logs under `<path>/log/symphony.log`.
|
|
51
|
+
- `--port <port>` starts the local observability dashboard and JSON API.
|
|
52
|
+
- `--once` polls once and exits.
|
|
53
|
+
- `--dry-run` evaluates candidates without dispatching agents.
|
|
54
|
+
- `--no-tui` disables the terminal dashboard and prints JSON snapshots.
|
|
55
|
+
|
|
56
|
+
With no workflow path, the CLI reads `SYMPHONY_WORKFLOW`, then `./WORKFLOW.md`.
|
|
57
|
+
|
|
58
|
+
The runtime reloads the workflow before each poll. If startup cannot read or parse the workflow,
|
|
59
|
+
the CLI exits with an error. If a later reload fails, the runtime keeps the last good workflow and
|
|
60
|
+
records a `workflow_reload_failed` event.
|
|
61
|
+
|
|
62
|
+
## Workspace Layout
|
|
63
|
+
|
|
64
|
+
See [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) for the layering rules and the tracker extension
|
|
65
|
+
contract (including the recipe for adding a new tracker backend).
|
|
66
|
+
|
|
67
|
+
- `apps/cli` is the composition root: it invokes the built-in extensions' registration and wires
|
|
68
|
+
configuration, agent runners, the runtime, the TUI, and the observability server into the
|
|
69
|
+
shipped binary.
|
|
70
|
+
- `apps/traceviz` renders trace event streams for local inspection.
|
|
71
|
+
- `packages/tracker-sdk` is the extension SDK: the `TrackerProvider` contract, the provider
|
|
72
|
+
registry, and the helpers tracker backends build on.
|
|
73
|
+
- `extensions/*` are the backend extensions: `linear-tracker`, `local-tracker`,
|
|
74
|
+
`memory-tracker`, and `jira-tracker` are self-contained tracker providers (config
|
|
75
|
+
parsing, runtime client, tool packs) that each export their own registration; the CLI
|
|
76
|
+
invokes the built-in set at its composition root.
|
|
77
|
+
- The remaining `packages/*` are the provider-agnostic engine: domain model, configuration
|
|
78
|
+
loader, prompt renderer, runtime, policies, MCP server, dashboards, logging, SSH, and
|
|
79
|
+
support libraries.
|
|
80
|
+
- `test/` contains workspace-level integration, contract, sandbox, and live tests.
|
|
81
|
+
- Package- and app-owned unit tests live under `packages/<name>/test/` or `apps/<name>/test/` as
|
|
82
|
+
`.test.ts` or `.test.tsx` files.
|
|
83
|
+
|
|
84
|
+
Create a package when a boundary has a clear owner. Keep curated exports in `src/index.ts` and
|
|
85
|
+
declare internal dependencies as `workspace:*`.
|
|
86
|
+
|
|
87
|
+
## Configuration
|
|
88
|
+
|
|
89
|
+
Configuration lives in the YAML front matter of a workflow file. The Markdown body below the front
|
|
90
|
+
matter is the agent session prompt, rendered as Liquid with issue context variables.
|
|
91
|
+
|
|
92
|
+
### Quickstart
|
|
93
|
+
|
|
94
|
+
```yaml
|
|
95
|
+
---
|
|
96
|
+
tracker:
|
|
97
|
+
kind: linear
|
|
98
|
+
trackers:
|
|
99
|
+
linear:
|
|
100
|
+
provider: linear
|
|
101
|
+
project_slug: "your-project-slug"
|
|
102
|
+
workspace:
|
|
103
|
+
root: ~/code/workspaces
|
|
104
|
+
hooks:
|
|
105
|
+
after_create: |
|
|
106
|
+
git clone git@github.com:your-org/your-repo.git .
|
|
107
|
+
agent:
|
|
108
|
+
kind: codex
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
You are working on {{ issue.identifier }}: {{ issue.title }}
|
|
112
|
+
|
|
113
|
+
{{ issue.description }}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Set `LINEAR_API_KEY` in your environment before running a Linear workflow.
|
|
117
|
+
|
|
118
|
+
### Full Reference
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
---
|
|
122
|
+
tracker:
|
|
123
|
+
kind: linear # linear, jira, jira-mcp, local, or memory
|
|
124
|
+
trackers:
|
|
125
|
+
linear:
|
|
126
|
+
provider: linear
|
|
127
|
+
api_key: $LINEAR_API_KEY # defaults to $LINEAR_API_KEY when unset
|
|
128
|
+
endpoint: "https://api.linear.app/graphql"
|
|
129
|
+
project_slug: "my-project" # right-click a Linear project and copy the URL slug
|
|
130
|
+
assignee: $LINEAR_ASSIGNEE # optional; filters issues by assignee
|
|
131
|
+
active_states:
|
|
132
|
+
- Todo # default: ["Todo", "In Progress"]
|
|
133
|
+
- In Progress
|
|
134
|
+
- Agent Review
|
|
135
|
+
- Merging
|
|
136
|
+
- Rework
|
|
137
|
+
terminal_states:
|
|
138
|
+
- Closed # default: ["Closed", "Cancelled", "Canceled",
|
|
139
|
+
- Cancelled # "Duplicate", "Done"]
|
|
140
|
+
- Canceled
|
|
141
|
+
- Duplicate
|
|
142
|
+
- Done
|
|
143
|
+
dispatch:
|
|
144
|
+
accept_unrouted: true # accept issues without a route label; default: true
|
|
145
|
+
only_routes: null # null accepts any route, [] accepts none
|
|
146
|
+
route_label_prefix: "Symphony:" # route labels look like "Symphony:backend"
|
|
147
|
+
|
|
148
|
+
tools:
|
|
149
|
+
local:
|
|
150
|
+
path: .symphony/local # explicit extra pack config; not needed for Linear-owned tools
|
|
151
|
+
|
|
152
|
+
polling:
|
|
153
|
+
interval_ms: 30000 # default: 30000
|
|
154
|
+
|
|
155
|
+
workspace:
|
|
156
|
+
root: ~/code/workspaces # default: $TMPDIR/symphony_workspaces
|
|
157
|
+
|
|
158
|
+
worker:
|
|
159
|
+
# Either list static SSH hosts here, or set kind to select a top-level workers.<name> profile.
|
|
160
|
+
# kind: static-prod
|
|
161
|
+
ssh_hosts:
|
|
162
|
+
- worker1.example.com # standard OpenSSH targets and Host aliases work
|
|
163
|
+
- worker2.example.com:2222
|
|
164
|
+
ssh_timeout_ms: 60000 # default: 60000
|
|
165
|
+
max_concurrent_agents_per_host: 2 # optional; defaults to the global agent cap per host
|
|
166
|
+
# Alternative to ssh_hosts (mutually exclusive): a warm pool of leased workers
|
|
167
|
+
# provisioned by a worker driver. Disabled by default.
|
|
168
|
+
worker_pool:
|
|
169
|
+
enabled: false
|
|
170
|
+
# driver: fake # compatibility fallback when worker.kind is omitted
|
|
171
|
+
min: 0 # warm-inventory floor the reaper keeps alive
|
|
172
|
+
max: 1 # ceiling on concurrent workers
|
|
173
|
+
warm: 1 # pre-warmed idle workers the reaper tops up toward
|
|
174
|
+
max_in_flight: 1 # run slots per machine; >1 requires co_residence: true
|
|
175
|
+
ttl_ms: 3600000 # hard worker lifetime before recycle
|
|
176
|
+
idle_reap_ms: 300000 # idle window before a warm worker above min is reaped
|
|
177
|
+
acquire_timeout_ms: 30000 # how long an acquire waits for capacity
|
|
178
|
+
spend: # optional caps, all in worker count / wall-clock worker-seconds
|
|
179
|
+
max_concurrent_workers: 4
|
|
180
|
+
max_worker_seconds: 86400
|
|
181
|
+
daily_worker_seconds: 28800
|
|
182
|
+
|
|
183
|
+
workers:
|
|
184
|
+
static-prod: # selected by worker.kind, options pass through verbatim (snake_case preserved)
|
|
185
|
+
driver: static-ssh
|
|
186
|
+
ssh_hosts: ["user@worker1:22"]
|
|
187
|
+
|
|
188
|
+
agent:
|
|
189
|
+
kind: codex # default: "codex"; "claude" is configured below
|
|
190
|
+
max_concurrent_agents: 10 # default: 10
|
|
191
|
+
max_turns: 20 # default: 20
|
|
192
|
+
max_retry_backoff_ms: 300000 # default: 300000
|
|
193
|
+
ensemble_size: 1 # default: 1
|
|
194
|
+
skills: # skill directories overlaid into each workspace before the agent starts
|
|
195
|
+
- ./.codex/skills/symphony-land # one entry per skill directory
|
|
196
|
+
|
|
197
|
+
agents:
|
|
198
|
+
turn_timeout_ms: 3600000 # default: 3600000
|
|
199
|
+
stall_timeout_ms: 300000 # default: 300000
|
|
200
|
+
codex:
|
|
201
|
+
executor: acp
|
|
202
|
+
bridge_command: codex-acp
|
|
203
|
+
claude:
|
|
204
|
+
executor: acp
|
|
205
|
+
bridge_command: claude-agent-acp
|
|
206
|
+
bridge_args:
|
|
207
|
+
- --permission-mode
|
|
208
|
+
- dontAsk
|
|
209
|
+
- --model
|
|
210
|
+
- claude-opus-4-6[1m]
|
|
211
|
+
|
|
212
|
+
status_overrides:
|
|
213
|
+
in progress:
|
|
214
|
+
agent:
|
|
215
|
+
max_concurrent_agents: 5
|
|
216
|
+
merging:
|
|
217
|
+
agent:
|
|
218
|
+
max_concurrent_agents: 2
|
|
219
|
+
|
|
220
|
+
codex:
|
|
221
|
+
command: codex-acp # legacy alias for agents.codex.bridge_command
|
|
222
|
+
turn_timeout_ms: 3600000 # default: 3600000
|
|
223
|
+
stall_timeout_ms: 300000 # default: 300000
|
|
224
|
+
|
|
225
|
+
claude:
|
|
226
|
+
command: claude-agent-acp # ACP bridge command
|
|
227
|
+
model: claude-opus-4-6[1m]
|
|
228
|
+
permission_mode: dontAsk
|
|
229
|
+
strict_mcp_config: true # default: true
|
|
230
|
+
|
|
231
|
+
hooks:
|
|
232
|
+
after_create: | # runs after a workspace directory is created
|
|
233
|
+
git clone --depth 1 git@github.com:org/repo.git .
|
|
234
|
+
before_run: | # runs before each agent turn
|
|
235
|
+
git pull origin main
|
|
236
|
+
after_run: | # best effort; runs after each agent turn
|
|
237
|
+
echo "turn complete"
|
|
238
|
+
before_remove: | # best effort; runs before workspace cleanup
|
|
239
|
+
echo "cleaning up"
|
|
240
|
+
timeout_ms: 60000 # default: 60000
|
|
241
|
+
|
|
242
|
+
observability:
|
|
243
|
+
dashboard_enabled: true # terminal dashboard; default: true
|
|
244
|
+
refresh_ms: 1000 # default: 1000
|
|
245
|
+
render_interval_ms: 16 # default: 16
|
|
246
|
+
|
|
247
|
+
server:
|
|
248
|
+
port: 4000 # enables the web dashboard; default: disabled
|
|
249
|
+
host: 127.0.0.1 # default: 127.0.0.1
|
|
250
|
+
|
|
251
|
+
logging:
|
|
252
|
+
log_file: ./log/symphony.log # default: ~/.symphony/log/symphony.log
|
|
253
|
+
---
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Notes:
|
|
257
|
+
|
|
258
|
+
- `tracker.kind` is always required. When `trackers` is present it selects a named bundle, and
|
|
259
|
+
`trackers.<name>.provider` selects the tracker implementation.
|
|
260
|
+
- The older flat `tracker.kind: linear` shape is still accepted when no `trackers` map is present.
|
|
261
|
+
- `trackers.linear.project_slug`, `trackers.linear.project_slugs`, or
|
|
262
|
+
`trackers.linear.project_labels` is required for Linear workflows.
|
|
263
|
+
- `trackers.linear.api_key` falls back to `LINEAR_API_KEY`; `trackers.linear.assignee` falls back
|
|
264
|
+
to `LINEAR_ASSIGNEE`.
|
|
265
|
+
- Shared tracker secrets can use `op://` references when the 1Password CLI is installed.
|
|
266
|
+
- `tools.<pack>` mounts or configures extra tool packs. Tracker-owned tools are implicit, so a
|
|
267
|
+
Linear tracker does not need a matching `tools.linear` entry.
|
|
268
|
+
- `workspace.root` supports `~` and whole-value `$VAR` expansion. `SYMPHONY_WORKSPACE_ROOT`
|
|
269
|
+
overrides `workspace.root` at runtime.
|
|
270
|
+
- `SYMPHONY_SSH_CONFIG` points SSH worker commands at a custom OpenSSH config file.
|
|
271
|
+
- Hooks run through `bash -lc` locally or over SSH with the workspace as `cwd`. Use
|
|
272
|
+
fail-fast shell options in bootstrap hooks so clone and dependency setup failures stop workspace
|
|
273
|
+
creation immediately.
|
|
274
|
+
- `codex.command` runs through `bash -lc`, so shell expansion happens in the launched process.
|
|
275
|
+
- If the Markdown body is blank, Lorenz uses a default prompt with the issue identifier, title,
|
|
276
|
+
and body.
|
|
277
|
+
|
|
278
|
+
## Linear
|
|
279
|
+
|
|
280
|
+
Prerequisites:
|
|
281
|
+
|
|
282
|
+
1. Create a personal API token in Linear Settings, Security & access, Personal API keys.
|
|
283
|
+
2. Export it as `LINEAR_API_KEY`, or set `trackers.linear.api_key: $LINEAR_API_KEY`.
|
|
284
|
+
3. Find the project slug by right-clicking a Linear project and copying its URL. The slug is in the
|
|
285
|
+
path.
|
|
286
|
+
4. The example workflows use non-standard states such as `Agent Review`, `Rework`, `Human Review`,
|
|
287
|
+
and `Merging`. Add those states under Team Settings, Workflow, or adjust `active_states` and
|
|
288
|
+
`terminal_states` to match your team.
|
|
289
|
+
|
|
290
|
+
Route labels let multiple Lorenz instances share one Linear project. With the default
|
|
291
|
+
`route_label_prefix`, labels such as `Symphony:backend` and `Symphony:frontend` become route names.
|
|
292
|
+
|
|
293
|
+
## Trackers
|
|
294
|
+
|
|
295
|
+
A tracker is the source of issues Lorenz works on. `tracker.kind` selects a named bundle under
|
|
296
|
+
`trackers`, and the selected bundle's `provider` selects the implementation. Every tracker exposes
|
|
297
|
+
the same read surface to the runtime (poll for candidate issues, refresh in-flight issues by id)
|
|
298
|
+
and a set of agent tools. Those tools are read+write symmetric across kinds, mirroring
|
|
299
|
+
`linear_graphql` (which both reads and writes): each tracker gives the agent at least one write tool
|
|
300
|
+
and one read tool. The tools differ per kind; their descriptions are self-documenting and surface
|
|
301
|
+
to the agent via the MCP `tools/list` call.
|
|
302
|
+
|
|
303
|
+
Supported kinds:
|
|
304
|
+
|
|
305
|
+
- `linear` - issues live in a Linear project. Read access uses `trackers.linear.api_key` (resolved
|
|
306
|
+
from `LINEAR_API_KEY`) and project selection uses `trackers.linear.project_slug`,
|
|
307
|
+
`trackers.linear.project_slugs`, or `trackers.linear.project_labels`. Agents can use
|
|
308
|
+
provider-neutral `tracker_*` tools or the legacy
|
|
309
|
+
`linear_graphql` tool.
|
|
310
|
+
- `jira` - issues live in Jira Cloud and are accessed directly over Jira REST. Configure
|
|
311
|
+
`trackers.jira.base_url`, `trackers.jira.email`, `trackers.jira.api_key`, and either
|
|
312
|
+
`trackers.jira.project_keys` or `trackers.jira.jql`. `JIRA_BASE_URL`, `JIRA_EMAIL`, and
|
|
313
|
+
`JIRA_API_KEY` are used as fallbacks.
|
|
314
|
+
- `jira-mcp` - issues live in Jira, but Lorenz reaches them through an external MCP server.
|
|
315
|
+
Configure `trackers.jira-mcp.mcp.url` and either `trackers.jira-mcp.project_keys` or
|
|
316
|
+
`trackers.jira-mcp.jql`. Tool names can be overridden under `trackers.jira-mcp.mcp.tools`.
|
|
317
|
+
- `local` - issues live as Markdown files on disk. No external service required.
|
|
318
|
+
- `slack` - an @-mention of the bot (in a channel message or a thread reply) is an issue, the
|
|
319
|
+
thread carries the status (`@bot !` commands and bot `status:` replies), and a thread reply is
|
|
320
|
+
a comment.
|
|
321
|
+
- `memory` - an in-process tracker used for tests and dry runs.
|
|
322
|
+
|
|
323
|
+
All non-memory providers expose the provider-neutral agent tools:
|
|
324
|
+
|
|
325
|
+
- `tracker_read_issue`
|
|
326
|
+
- `tracker_query`
|
|
327
|
+
- `tracker_update_status`
|
|
328
|
+
- `tracker_comment`
|
|
329
|
+
- `tracker_create_issue`
|
|
330
|
+
|
|
331
|
+
Provider-specific tools are compatibility escape hatches, not the preferred workflow contract.
|
|
332
|
+
|
|
333
|
+
All kinds share the dispatch routing block under the selected tracker bundle:
|
|
334
|
+
|
|
335
|
+
```yaml
|
|
336
|
+
tracker:
|
|
337
|
+
kind: linear
|
|
338
|
+
trackers:
|
|
339
|
+
linear:
|
|
340
|
+
provider: linear
|
|
341
|
+
dispatch:
|
|
342
|
+
accept_unrouted: true # process issues that carry no matching route label (default)
|
|
343
|
+
only_routes: null # or a list of route names this instance handles
|
|
344
|
+
route_label_prefix: "Symphony:" # the label prefix that names a route
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Jira tracker
|
|
348
|
+
|
|
349
|
+
For both `jira` and `jira-mcp`, Lorenz only picks up issues that are assigned to the configured
|
|
350
|
+
user (`trackers.jira.assignee` or `trackers.jira-mcp.assignee`, defaulting to the authenticated
|
|
351
|
+
user via `assignee = currentUser()`) and labeled `agent`. This holds even when the configured JQL
|
|
352
|
+
widens the scope, so issues must be explicitly delegated before Lorenz will dispatch them.
|
|
353
|
+
Jira REST issues created through `tracker_create_issue` are assigned to that same owner by
|
|
354
|
+
default. Jira MCP creation forwards a concrete configured or caller-provided `assignee` to the
|
|
355
|
+
external MCP server.
|
|
356
|
+
|
|
357
|
+
Direct Jira REST configuration:
|
|
358
|
+
|
|
359
|
+
```yaml
|
|
360
|
+
tracker:
|
|
361
|
+
kind: jira
|
|
362
|
+
trackers:
|
|
363
|
+
jira:
|
|
364
|
+
provider: jira
|
|
365
|
+
base_url: https://example.atlassian.net
|
|
366
|
+
email: $JIRA_EMAIL
|
|
367
|
+
api_key: $JIRA_API_KEY
|
|
368
|
+
project_keys: ["ENG"]
|
|
369
|
+
# Optional provider-native scope. When present, Lorenz combines it with active_states.
|
|
370
|
+
# jql: 'project = ENG AND labels in ("symphony")'
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Jira via an external MCP server:
|
|
374
|
+
|
|
375
|
+
```yaml
|
|
376
|
+
tracker:
|
|
377
|
+
kind: jira-mcp
|
|
378
|
+
trackers:
|
|
379
|
+
jira-mcp:
|
|
380
|
+
provider: jira-mcp
|
|
381
|
+
base_url: https://example.atlassian.net # optional; used for issue URLs when MCP payloads omit them
|
|
382
|
+
project_keys: ["ENG"]
|
|
383
|
+
mcp:
|
|
384
|
+
url: http://127.0.0.1:5123/mcp
|
|
385
|
+
token: $JIRA_MCP_TOKEN
|
|
386
|
+
tools:
|
|
387
|
+
search: atlassian_search_jira
|
|
388
|
+
read_issue: atlassian_get_jira_issue
|
|
389
|
+
update_status: atlassian_transition_jira_issue
|
|
390
|
+
comment: atlassian_add_jira_comment
|
|
391
|
+
create_issue: atlassian_create_jira_issue
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Local tracker (filesystem board)
|
|
395
|
+
|
|
396
|
+
The local tracker runs Lorenz against a directory of Markdown files, with no Linear API key or
|
|
397
|
+
workspace. See `WORKFLOW.local.md` for a complete example workflow.
|
|
398
|
+
|
|
399
|
+
Configure it with `kind: local` and a board `path` (default `.symphony/local`):
|
|
400
|
+
|
|
401
|
+
```yaml
|
|
402
|
+
tracker:
|
|
403
|
+
kind: local
|
|
404
|
+
trackers:
|
|
405
|
+
local:
|
|
406
|
+
provider: local
|
|
407
|
+
path: .symphony/local
|
|
408
|
+
id_prefix: "BOARD-" # optional, default "BOARD-"
|
|
409
|
+
active_states:
|
|
410
|
+
- Todo
|
|
411
|
+
- In Progress
|
|
412
|
+
terminal_states:
|
|
413
|
+
- Done
|
|
414
|
+
- Cancelled
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Both `path` and `id_prefix` are local-specific and always defaulted, so a local workflow is valid
|
|
418
|
+
with just `kind: local`. `id_prefix` sets the issue-id prefix for the board: the tracker only treats
|
|
419
|
+
`<prefix><n>.md` files as issues and mints new ids with it, so one board can be `BOARD-1`, `BOARD-2`
|
|
420
|
+
and another `XXX-1`, `FEAT-1`, etc. It must be filesystem-safe (start alphanumeric, then only
|
|
421
|
+
letters, digits, `_` or `-`); an unsafe prefix is rejected at config load. Changing the prefix of an
|
|
422
|
+
existing board orphans files written under the old prefix (they stop matching), so set it up front.
|
|
423
|
+
|
|
424
|
+
Each issue is one file named `<prefix><n>.md` (for example `.symphony/local/BOARD-7.md`, or
|
|
425
|
+
`.symphony/local/XXX-7.md` with `id_prefix: "XXX-"`). The identifier is the file stem (`BOARD-7`).
|
|
426
|
+
The format is YAML front matter followed by a `# Title`
|
|
427
|
+
heading, the description, and an optional `## Comments` section:
|
|
428
|
+
|
|
429
|
+
<!-- prettier-ignore -->
|
|
430
|
+
```markdown
|
|
431
|
+
---
|
|
432
|
+
status: In Progress
|
|
433
|
+
labels:
|
|
434
|
+
- backend
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
# Fix the retry queue
|
|
438
|
+
|
|
439
|
+
The retry slot is not released when a worker fails.
|
|
440
|
+
|
|
441
|
+
<!-- symphony:comments -->
|
|
442
|
+
## Comments
|
|
443
|
+
- 2026-05-29T12:00:00.000Z agent: Reproduced the leak; fix in progress.
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
- `status` (required) is the issue state. Active states (`Todo`, `In Progress`) mean the issue is
|
|
447
|
+
available to work; terminal states (`Done`, `Cancelled`) mean it is finished and must not be
|
|
448
|
+
reopened. Configure the exact sets with `active_states` / `terminal_states`.
|
|
449
|
+
- `labels` (optional) is a YAML list. Labels feed dispatch routing the same way Linear labels do.
|
|
450
|
+
- The `# Title` heading is the issue title; the text below it is the description.
|
|
451
|
+
- The `## Comments` section is managed by the `local_comment` tool. The hidden
|
|
452
|
+
`<!-- symphony:comments -->` marker delimits it so a description that itself contains a
|
|
453
|
+
`## Comments` heading is never misparsed; treat the most recent comment block as the live
|
|
454
|
+
workpad.
|
|
455
|
+
|
|
456
|
+
Agent tools for `kind: local` (read and write, symmetric with `linear_graphql`):
|
|
457
|
+
|
|
458
|
+
- `local_update_status` - move an issue to a new status (args: `issueId`, `status`).
|
|
459
|
+
- `local_comment` - append a progress note to the issue's `## Comments` section (args: `issueId`,
|
|
460
|
+
`body`).
|
|
461
|
+
- `local_create_issue` - create a new board issue for out-of-scope follow-up work (args: `title`,
|
|
462
|
+
optional `body`, optional `status`).
|
|
463
|
+
- `local_read_issue` - read an issue's authoritative state: its current status, title, description,
|
|
464
|
+
and comments (args: `issueId`). Use it to re-read state and recover prior progress notes on a
|
|
465
|
+
continuation turn.
|
|
466
|
+
|
|
467
|
+
Concurrent writes (multiple agents or ensemble slots) to the same board file are serialized
|
|
468
|
+
in-process so a status change and comments are never lost. This assumes a single Lorenz daemon
|
|
469
|
+
owns the board; editing the `BOARD-<n>.md` files from another process at the same time is out of
|
|
470
|
+
scope.
|
|
471
|
+
|
|
472
|
+
To seed a board so you can try `kind: local` immediately, use the demo seeder, which writes
|
|
473
|
+
sample `BOARD-<n>.md` files through the same `BoardStore` the running tracker uses:
|
|
474
|
+
|
|
475
|
+
```sh
|
|
476
|
+
npx tsx sandbox/seed-local.ts # seeds ./.symphony/local
|
|
477
|
+
npx tsx sandbox/seed-local.ts /tmp/demo-board # seeds an explicit directory
|
|
478
|
+
npx tsx sandbox/seed-local.ts .symphony/local 2 # seeds only the first 2 issues
|
|
479
|
+
npx tsx sandbox/seed-local.ts /tmp/demo-board 3 XXX- # seeds XXX-1..XXX-3 (match trackers.local.id_prefix)
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
Point `trackers.local.path` at the directory you seeded and run Lorenz as usual. If you set a
|
|
483
|
+
custom `id_prefix`, pass the same prefix to the seeder so the seeded ids match what the tracker
|
|
484
|
+
expects.
|
|
485
|
+
|
|
486
|
+
### Slack tracker (mention + thread commands)
|
|
487
|
+
|
|
488
|
+
The Slack tracker treats an @-mention of a bot as an issue - in a channel message or in a thread
|
|
489
|
+
reply (a reply mention tracks its thread, anchored at the root, with the reply as the request).
|
|
490
|
+
The request's text is the issue title/description, threaded replies are comments, and the
|
|
491
|
+
issue's STATUS lives in the thread: the bot posts `status: <Name>` replies and humans transition
|
|
492
|
+
with `@bot !` command mentions; the latest event wins, and the bot mirrors the state onto its own
|
|
493
|
+
reaction for glanceability. See `WORKFLOW.slack.md` for a complete example workflow.
|
|
494
|
+
|
|
495
|
+
Set up a Slack app:
|
|
496
|
+
|
|
497
|
+
1. Create a Slack app at <https://api.slack.com/apps> (from scratch) in your workspace.
|
|
498
|
+
2. Under "OAuth & Permissions", add these **bot token scopes**:
|
|
499
|
+
- `channels:history` - read messages in public channels.
|
|
500
|
+
- `groups:history` - read messages in private channels (only if you watch private channels).
|
|
501
|
+
- `reactions:read` - read reactions (legacy status fallback and the tracking marker).
|
|
502
|
+
- `reactions:write` - mirror status onto the bot's own reaction and mark tracked threads.
|
|
503
|
+
- `chat:write` - post threaded replies (comments and `status:` transitions).
|
|
504
|
+
- `users:read` - resolve user ids to names for the `slack_user_info` tool (optional but
|
|
505
|
+
recommended).
|
|
506
|
+
|
|
507
|
+
Lorenz discovers issues by paging `conversations.history` and matching the bot's @-mention
|
|
508
|
+
in message text, so it does not need `app_mentions:read`. Only add that scope if you separately
|
|
509
|
+
wire up the Events API / `app_mention` subscription, which Lorenz does not use today.
|
|
510
|
+
|
|
511
|
+
`conversations.history` is rate-limited (newer non-Marketplace apps can be throttled to roughly
|
|
512
|
+
one request per minute), and each poll re-scans recent channel history. The shipped Slack
|
|
513
|
+
workflow therefore sets a conservative `polling.interval_ms` of `60000` (one minute), and you
|
|
514
|
+
should point it at dedicated, low-traffic channels so a busy channel does not trigger sustained
|
|
515
|
+
`429`s. The transport's `429`/`Retry-After` backoff and per-channel `poll_error` handling cover
|
|
516
|
+
transient limits on top of that.
|
|
517
|
+
|
|
518
|
+
3. Install the app to the workspace and copy the **Bot User OAuth Token** (starts with `xoxb-`).
|
|
519
|
+
Export it as `SLACK_BOT_TOKEN`; Lorenz resolves it into `trackers.slack.api_key`.
|
|
520
|
+
4. Find the app's **bot user id** (the `U...` id, shown on the app's "App Home" / via
|
|
521
|
+
`auth.test`). Export it as `SLACK_BOT_USER_ID` and reference it as
|
|
522
|
+
`trackers.slack.bot_user_id`.
|
|
523
|
+
5. Invite the bot to each channel you want it to watch (`/invite @your-bot`). A bot only sees
|
|
524
|
+
`*:history` for channels it has joined.
|
|
525
|
+
6. Collect the **channel IDs** (`C...`, from the channel's "About" panel) for those channels and
|
|
526
|
+
list them under `trackers.slack.channels`.
|
|
527
|
+
|
|
528
|
+
Configure it with `kind: slack`:
|
|
529
|
+
|
|
530
|
+
```yaml
|
|
531
|
+
tracker:
|
|
532
|
+
kind: slack
|
|
533
|
+
trackers:
|
|
534
|
+
slack:
|
|
535
|
+
provider: slack
|
|
536
|
+
channels:
|
|
537
|
+
- C0123456789
|
|
538
|
+
bot_user_id: $SLACK_BOT_USER_ID
|
|
539
|
+
emoji_states:
|
|
540
|
+
eyes: In Progress
|
|
541
|
+
white_check_mark: Done
|
|
542
|
+
x: Cancelled
|
|
543
|
+
active_states:
|
|
544
|
+
- Todo
|
|
545
|
+
- In Progress
|
|
546
|
+
terminal_states:
|
|
547
|
+
- Done
|
|
548
|
+
- Cancelled
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
`SLACK_BOT_TOKEN` (the bot token), a non-empty `channels` list, and `trackers.slack.bot_user_id`
|
|
552
|
+
(`SLACK_BOT_USER_ID`) are all **required**. The bot user id scopes issue creation to the bot's own
|
|
553
|
+
mentions: only messages that mention that exact user become issues, and only that leading mention
|
|
554
|
+
is stripped from the title. It is required so that ordinary human-to-human `<@U...>` mentions in a
|
|
555
|
+
watched channel never spawn agents or expose their text to workers. If it is unset or resolves
|
|
556
|
+
empty, config validation fails and the production transport fails closed (it scans nothing).
|
|
557
|
+
Channel entries resolve `$VAR` references the same way `bot_user_id` does.
|
|
558
|
+
`trackers.slack.assignee` is rejected for `kind: slack`: messages carry no assignee, so an
|
|
559
|
+
assignee-partitioned deployment would otherwise silently dispatch everything everywhere.
|
|
560
|
+
|
|
561
|
+
The issue identifier is the message reference in `<channel>:<ts>` form (for example
|
|
562
|
+
`C0123456789:1717000000.000100`); that is the `issueId` passed to the write tools. Issues also
|
|
563
|
+
carry a permalink (`{{ issue.url }}`, dashboard links) built from the workspace URL that
|
|
564
|
+
`auth.test` reports, and `slack_read_thread` returns the same permalink for linking the source
|
|
565
|
+
message from commits and PRs.
|
|
566
|
+
|
|
567
|
+
Status is derived from the issue's thread: the bot's own `status: <Name>` replies (posted by
|
|
568
|
+
`slack_update_status`) and human command mentions are ts-ordered events, and the latest wins.
|
|
569
|
+
The human commands are:
|
|
570
|
+
|
|
571
|
+
- `@bot !done` / `@bot !cancel` / `@bot !in progress` / `@bot !todo` - transition to the
|
|
572
|
+
standard state.
|
|
573
|
+
- `@bot !status <Name>` - transition to any configured active/terminal state (custom names
|
|
574
|
+
too).
|
|
575
|
+
- `@bot !reopen` - back to the first active state.
|
|
576
|
+
- Any other `@bot` mention on a terminal issue re-opens it: mentioning the bot again always
|
|
577
|
+
means "this needs attention".
|
|
578
|
+
|
|
579
|
+
Reactions are per-author in Slack (the bot cannot remove a human's reaction and vice versa), so
|
|
580
|
+
they are only the bot's visibility mirror, controlled by `emoji_states` (`:eyes:` ->
|
|
581
|
+
`In Progress`, `:white_check_mark:` -> `Done`, `:x:` -> `Cancelled` by default). Threads that
|
|
582
|
+
have never seen a status event fall back to the reaction-derived reading, so reaction-managed
|
|
583
|
+
threads keep working. Two optional keys tune tracking: `marker_emoji` (default `robot_face`) is
|
|
584
|
+
the reaction the bot drops on a reply-tracked thread's root, and `reply_lookback_days` (default
|
|
585
|
+
`2`) bounds how far back untracked threads are inspected for new reply-mention requests.
|
|
586
|
+
|
|
587
|
+
Agent tools for `kind: slack`, served by the `slack` tool pack (mounted by default alongside the
|
|
588
|
+
provider-neutral `tracker` pack):
|
|
589
|
+
|
|
590
|
+
- `slack_update_status` - set the issue's status by posting the bot's authoritative `status:`
|
|
591
|
+
thread reply, then mirror the bot's reaction (args: `issueId`, `status` - any configured
|
|
592
|
+
active/terminal state name).
|
|
593
|
+
- `slack_comment` - post a threaded reply on the source message as a comment (args: `issueId`,
|
|
594
|
+
`body`).
|
|
595
|
+
- `slack_read_thread` - read the issue's authoritative state: thread-derived status, source
|
|
596
|
+
message, request reply (for thread-tracked issues), reactions, permalink, and all replies
|
|
597
|
+
(args: `issueId`). Use it to re-read state, catch new human replies/commands, and recover
|
|
598
|
+
prior progress notes on a continuation turn.
|
|
599
|
+
- `slack_query` - read-only query over the tracked issues in the watched channels (bot-mention
|
|
600
|
+
roots plus bot-marked threads), with thread-derived state: filter with the shared JSON
|
|
601
|
+
predicate DSL, project fields, order, and page; `expand` adds `thread` and `reactions` (args:
|
|
602
|
+
`channels?`, `where?`, `select?`, `expand?`, `order_by?`, `limit?`, `offset?`).
|
|
603
|
+
- `slack_user_info` - resolve a `U...` user id to its profile: name, real name, display name,
|
|
604
|
+
bot flag (args: `userId`).
|
|
605
|
+
- `slack_channel_context` - read the channel conversation around a tracked issue's source
|
|
606
|
+
message, ascending (args: `issueId`, `before?` default 10 max 50, `after?` default 10 max 50).
|
|
607
|
+
|
|
608
|
+
There is no `slack_create_issue`, and the neutral `tracker_create_issue` reports itself as
|
|
609
|
+
unavailable on Slack: issues are created by humans @-mentioning the bot, not by the agent.
|
|
610
|
+
|
|
611
|
+
Routing note: Slack issues carry only hashtag-derived labels (a `#tag` in the message text
|
|
612
|
+
becomes the label `tag`); they are not otherwise routed or assigned. Dispatch treats a label as a
|
|
613
|
+
route only when it starts with `route_label_prefix`, so the Slack workflow sets
|
|
614
|
+
`route_label_prefix: route-`. Tag a message `#route-<name>` to route it: `#route-backend` becomes
|
|
615
|
+
the label `route-backend`, which dispatch resolves to the route `backend` (set `only_routes`
|
|
616
|
+
accordingly). Plain hashtags such as `#backend` stay non-route labels; with the default
|
|
617
|
+
`accept_unrouted: true` all Slack mentions are still picked up.
|
|
618
|
+
|
|
619
|
+
## Workflow Prompt
|
|
620
|
+
|
|
621
|
+
The prompt body can read these public issue and run fields:
|
|
622
|
+
|
|
623
|
+
- `{{ issue.identifier }}`
|
|
624
|
+
- `{{ issue.title }}`
|
|
625
|
+
- `{{ issue.description }}`
|
|
626
|
+
- `{{ issue.state }}`
|
|
627
|
+
- `{{ issue.state_type }}`
|
|
628
|
+
- `{{ issue.labels }}`
|
|
629
|
+
- `{{ issue.url }}`
|
|
630
|
+
- `{{ issue.id }}`
|
|
631
|
+
- `{{ issue.priority }}`
|
|
632
|
+
- `{{ issue.branch_name }}`
|
|
633
|
+
- `{{ issue.assignee_id }}`
|
|
634
|
+
- `{{ issue.created_at }}`
|
|
635
|
+
- `{{ issue.updated_at }}`
|
|
636
|
+
- `{{ issue.assigned_to_worker }}`
|
|
637
|
+
- `{{ issue.blocked_by }}`
|
|
638
|
+
- `{{ attempt }}`
|
|
639
|
+
- `{{ ensemble.enabled }}`
|
|
640
|
+
- `{{ ensemble.slot_index }}`
|
|
641
|
+
- `{{ ensemble.size }}`
|
|
642
|
+
|
|
643
|
+
Workspace tests render representative Liquid constructs: conditionals, null fallbacks, loops,
|
|
644
|
+
`forloop` metadata, nested blocker refs, and common filters.
|
|
645
|
+
|
|
646
|
+
## Skills
|
|
647
|
+
|
|
648
|
+
The `.codex/skills/` directory in this repo contains orchestration skills referenced by the example
|
|
649
|
+
workflow files:
|
|
650
|
+
|
|
651
|
+
- `symphony-commit` produces clean, logical commits.
|
|
652
|
+
- `symphony-push` pushes branches and creates or updates PRs.
|
|
653
|
+
- `symphony-pull` merges the latest `origin/main` into a working branch.
|
|
654
|
+
- `symphony-land` monitors and merges approved PRs.
|
|
655
|
+
- `symphony-debug` investigates stuck runs and execution failures.
|
|
656
|
+
|
|
657
|
+
Lorenz overlays skills into each prepared workspace before the agent starts, copying each
|
|
658
|
+
configured directory whole into the agent's skills directory - `.codex/skills/` for Codex,
|
|
659
|
+
`.claude/skills/` for Claude (the active executor chooses). Skills come from two places:
|
|
660
|
+
|
|
661
|
+
- **`agent.skills`** - a list of skill directories you maintain. Each entry is one skill directory
|
|
662
|
+
(e.g. `./.codex/skills/symphony-land`) and is copied to `<skills>/<directory-name>`. Relative
|
|
663
|
+
paths resolve from the workflow file directory.
|
|
664
|
+
- **Tool packs** - a mounted tool pack can bundle the skill that documents it, so the skill ships
|
|
665
|
+
automatically when the tool is in use. The Linear pack bundles `symphony-linear` (raw Linear
|
|
666
|
+
access via the injected `linear_graphql` tool for Codex or the `/mcp` endpoint for Claude), so
|
|
667
|
+
enabling Linear tools overlays that skill without listing it under `agent.skills`.
|
|
668
|
+
|
|
669
|
+
## Observability
|
|
670
|
+
|
|
671
|
+
The terminal dashboard shows agents, throughput, runtime, token usage, rate limits, running
|
|
672
|
+
sessions, retry queue, and dispatch blocks. The web dashboard exposes the same runtime snapshot
|
|
673
|
+
through a local HTTP server.
|
|
674
|
+
|
|
675
|
+
Start the web dashboard with `--port` or `server.port`:
|
|
676
|
+
|
|
677
|
+
```sh
|
|
678
|
+
pnpm start -- WORKFLOW.md --port 4000
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
API routes:
|
|
682
|
+
|
|
683
|
+
- `/`
|
|
684
|
+
- `/api/v1/state`
|
|
685
|
+
- `/api/v1/runs`
|
|
686
|
+
- `/api/v1/runs?id=<run-id>`
|
|
687
|
+
- `/api/v1/refresh`
|
|
688
|
+
- `/api/v1/:issue_identifier`
|
|
689
|
+
|
|
690
|
+
Live updates (ops state and trace events) stream over the `/ws` WebSocket endpoint.
|
|
691
|
+
|
|
692
|
+
Claude sessions use `/mcp` for injected dynamic tools when the runtime has started an
|
|
693
|
+
observability server. The server also starts automatically for Claude workflows so the ACP bridge
|
|
694
|
+
can reach those tools.
|
|
695
|
+
|
|
696
|
+
`lorenz runs` queries the same API for run history, cost summaries, retry summaries, and raw
|
|
697
|
+
JSON output.
|
|
698
|
+
|
|
699
|
+
## Testing
|
|
700
|
+
|
|
701
|
+
```sh
|
|
702
|
+
mise run tidy
|
|
703
|
+
mise run check
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
`mise run tidy` formats and applies lint fixes. `mise run check` runs typecheck, build, tests, and
|
|
707
|
+
lint.
|
|
708
|
+
|
|
709
|
+
Useful direct commands:
|
|
710
|
+
|
|
711
|
+
```sh
|
|
712
|
+
pnpm typecheck
|
|
713
|
+
pnpm build
|
|
714
|
+
pnpm lint
|
|
715
|
+
pnpm test
|
|
716
|
+
pnpm test:watch
|
|
717
|
+
```
|
|
718
|
+
|
|
719
|
+
When running Vitest directly, rebuild first so tests exercise the current compiled packages.
|
|
720
|
+
|
|
721
|
+
## Live Tests
|
|
722
|
+
|
|
723
|
+
Live tests are opt-in and launch real CLIs or services in isolated workspaces.
|
|
724
|
+
|
|
725
|
+
```sh
|
|
726
|
+
pnpm test:live:codex
|
|
727
|
+
pnpm test:live:linear-codex
|
|
728
|
+
pnpm test:live:claude
|
|
729
|
+
pnpm test:live:ssh
|
|
730
|
+
pnpm test:live:linear-sandbox
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
`pnpm test:live` runs the Codex, Linear plus Codex, and Claude live tests.
|
|
734
|
+
|
|
735
|
+
Environment knobs:
|
|
736
|
+
|
|
737
|
+
- `SYMPHONY_TS_CODEX_ACP_COMMAND` overrides the Codex ACP bridge command for live tests.
|
|
738
|
+
- `SYMPHONY_TS_CLAUDE_ACP_BRIDGE_COMMAND` enables Claude live tests.
|
|
739
|
+
- `SYMPHONY_TS_CLAUDE_ACP_BRIDGE_ARGS` supplies Claude ACP bridge args as a JSON string array.
|
|
740
|
+
- `LINEAR_API_KEY` is required for Linear live tests and MCP canaries.
|
|
741
|
+
- `LINEAR_PROJECT_SLUG` selects the Linear project for `pnpm test:live:linear-codex`.
|
|
742
|
+
- `SYMPHONY_LIVE_SSH_WORKER_HOSTS` is a comma-separated list of real SSH workers.
|
|
743
|
+
- When `SYMPHONY_LIVE_SSH_WORKER_HOSTS` is unset, the SSH live test can use disposable local
|
|
744
|
+
workers if Docker, `ssh-keygen`, and Codex auth are available.
|
|
745
|
+
- `SYMPHONY_LIVE_DOCKER_CODEX_AUTH_JSON` points disposable workers at a Codex auth file. The
|
|
746
|
+
default is `~/.codex/auth.json`.
|
|
747
|
+
- `CLAUDE_CODE_OAUTH_TOKEN` or `SYMPHONY_LIVE_DOCKER_CLAUDE_CODE_OAUTH_TOKEN` lets disposable
|
|
748
|
+
workers run the remote Claude canary.
|
|
749
|
+
- `SYMPHONY_TS_REQUIRE_REMOTE_CLAUDE=1` makes the remote Claude canary mandatory in the SSH live
|
|
750
|
+
test.
|
|
751
|
+
|
|
752
|
+
## Packaging
|
|
753
|
+
|
|
754
|
+
```sh
|
|
755
|
+
pnpm build
|
|
756
|
+
pnpm --filter @lorenz/cli pack --dry-run
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
The CLI package includes the built binary. Workspace documentation, workflow fixtures, and test
|
|
760
|
+
evidence stay at the workspace root.
|
|
761
|
+
|
|
762
|
+
## Compatibility Contracts
|
|
763
|
+
|
|
764
|
+
The checked-in workflow files are executable fixtures:
|
|
765
|
+
|
|
766
|
+
- `WORKFLOW.md`
|
|
767
|
+
- `WORKFLOW_FULL_ACCESS.md`
|
|
768
|
+
|
|
769
|
+
`pnpm test` guards workflow docs, prompt rendering, dashboard snapshots, runtime behavior, and CLI
|
|
770
|
+
documentation. Update the fixture and the matching test together when the public contract changes.
|
|
771
|
+
|
|
772
|
+
## License
|
|
773
|
+
|
|
774
|
+
This project is licensed under the [Apache License 2.0](../LICENSE).
|