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,246 @@
|
|
|
1
|
+
import { defaultStateType, normalizeIssue } from "@lorenz/issue";
|
|
2
|
+
import { emojiForState, stateFromReactions, statusEmojiMap, stripLeadingMention, } from "./mapping.js";
|
|
3
|
+
import { mirrorStatusReaction, requireTrackedMessage } from "./operations.js";
|
|
4
|
+
import { slackTrackerOptions } from "./options.js";
|
|
5
|
+
import { resolveThreadState } from "./threadState.js";
|
|
6
|
+
export function splitIssueId(id) {
|
|
7
|
+
const idx = id.indexOf(":");
|
|
8
|
+
if (idx === -1)
|
|
9
|
+
return null;
|
|
10
|
+
return [id.slice(0, idx), id.slice(idx + 1)];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Derive labels from hashtag tokens in `text`: match `#tag`, strip the leading `#`, lowercase,
|
|
14
|
+
* and dedupe (preserving first-seen order). Lets Slack issues carry plain routing/filter labels.
|
|
15
|
+
*
|
|
16
|
+
* The `#` must be at a boundary (start of string or preceded by whitespace) so in-token `#`s -
|
|
17
|
+
* a URL fragment (`http://x#frag`) or a hex color (`color:#fff`) - do not leak in as bogus labels.
|
|
18
|
+
*
|
|
19
|
+
* Every mrkdwn angle-bracket token is stripped first: channel references (`<#C0ABC|general>`)
|
|
20
|
+
* and user mentions (`<@U123|alice>`) embed an id behind `#`/`@`, and links (`<url|caption>`)
|
|
21
|
+
* can carry a `#hashtag` inside their display caption - none of those are author-intended tags,
|
|
22
|
+
* and a leaked one could even become a dispatch route.
|
|
23
|
+
*/
|
|
24
|
+
function deriveLabels(text) {
|
|
25
|
+
const stripped = text.replace(/<[^>]*>/g, " ");
|
|
26
|
+
const labels = [];
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
for (const match of stripped.matchAll(/(?<=^|\s)#([a-z0-9][a-z0-9_-]*)/gi)) {
|
|
29
|
+
const label = match[1].toLowerCase();
|
|
30
|
+
if (seen.has(label))
|
|
31
|
+
continue;
|
|
32
|
+
seen.add(label);
|
|
33
|
+
labels.push(label);
|
|
34
|
+
}
|
|
35
|
+
return labels;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Permalink to a message: `<workspace base>/archives/<channel>/p<ts without the dot>` - the
|
|
39
|
+
* same shape Slack's own "copy link" produces.
|
|
40
|
+
*/
|
|
41
|
+
export function slackPermalink(base, channel, ts) {
|
|
42
|
+
return `${base.replace(/\/+$/, "")}/archives/${encodeURIComponent(channel)}/p${ts.replace(".", "")}`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Map a Slack root message onto the flat {@link SlackIssueRow} view. Pure; performs no IO -
|
|
46
|
+
* thread-derived state and the workspace base URL come in via {@link SlackIssueContext}.
|
|
47
|
+
*/
|
|
48
|
+
export function slackMessageToRow(message, settings, context = {}) {
|
|
49
|
+
const state = context.state ?? stateFromReactions(message.reactions, statusEmojiMap(settings), settings);
|
|
50
|
+
// For reply-tracked threads the request reply carries the ask; the root is surrounding
|
|
51
|
+
// conversation. Title (and routing hashtags) come from the request, labels from both.
|
|
52
|
+
const requestText = context.request?.text;
|
|
53
|
+
const titleSource = requestText ?? message.text;
|
|
54
|
+
const firstLine = (titleSource.split("\n")[0] ?? "").trim();
|
|
55
|
+
const title = stripLeadingMention(firstLine, slackTrackerOptions(settings).botUserId).trim() || message.ts;
|
|
56
|
+
// normalizeIssue requires a stateType. Fall back to "backlog" for custom emoji_states mappings
|
|
57
|
+
// whose state name is not a known category, so an unknown status never crashes the read.
|
|
58
|
+
const stateType = defaultStateType(state) ?? "backlog";
|
|
59
|
+
const base = context.permalinkBase;
|
|
60
|
+
return {
|
|
61
|
+
issueId: `${message.channel}:${message.ts}`,
|
|
62
|
+
channel: message.channel,
|
|
63
|
+
ts: message.ts,
|
|
64
|
+
title,
|
|
65
|
+
state,
|
|
66
|
+
stateType,
|
|
67
|
+
labels: deriveLabels(requestText ? `${message.text}\n${requestText}` : message.text),
|
|
68
|
+
text: message.text,
|
|
69
|
+
reactions: [...message.reactions],
|
|
70
|
+
...(base ? { url: slackPermalink(base, message.channel, message.ts) } : {}),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Map a Slack root message onto a normalized tracker {@link Issue}. Shared by the runtime
|
|
75
|
+
* client and the tracker tool operations so candidate discovery and agent tools never drift on
|
|
76
|
+
* how a message becomes an issue. The identifier keeps the channel: Slack ts values are only
|
|
77
|
+
* unique per channel, and workspace directories and cleanup are keyed by identifier downstream.
|
|
78
|
+
*/
|
|
79
|
+
export function slackMessageToIssue(message, settings, context = {}) {
|
|
80
|
+
const row = slackMessageToRow(message, settings, context);
|
|
81
|
+
const createdAtMs = Math.floor(Number.parseFloat(message.ts) * 1000);
|
|
82
|
+
const description = context.request
|
|
83
|
+
? `${context.request.text}\n\n(thread root) ${message.text}`
|
|
84
|
+
: message.text;
|
|
85
|
+
return normalizeIssue({
|
|
86
|
+
id: row.issueId,
|
|
87
|
+
identifier: `SLK-${message.channel}-${message.ts.replace(/\./g, "-")}`,
|
|
88
|
+
title: row.title,
|
|
89
|
+
description,
|
|
90
|
+
state: row.state,
|
|
91
|
+
state_type: row.stateType,
|
|
92
|
+
labels: row.labels,
|
|
93
|
+
...(row.url !== undefined ? { url: row.url } : {}),
|
|
94
|
+
...(Number.isFinite(createdAtMs) ? { created_at: new Date(createdAtMs).toISOString() } : {}),
|
|
95
|
+
raw: message,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Tracked roots of one scan: every bot-mention root, plus every threaded root the bot has
|
|
100
|
+
* marked with its own reaction (reply-tracked issues recognized across restarts without
|
|
101
|
+
* re-reading their threads).
|
|
102
|
+
*/
|
|
103
|
+
export function trackedRootsOf(scan) {
|
|
104
|
+
return [...scan.mentions, ...scan.threadedRoots.filter((root) => root.botReacted === true)];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* One scan serves every read within a poll cycle: the runtime triggers two back-to-back full
|
|
108
|
+
* scans per cycle (terminal-state reconciliation, then candidates), and each scan pages the
|
|
109
|
+
* full channel history against a tightly rate-limited API. Comfortably shorter than any real
|
|
110
|
+
* poll interval, so cross-poll staleness stays bounded.
|
|
111
|
+
*/
|
|
112
|
+
const SCAN_CACHE_TTL_MS = 10_000;
|
|
113
|
+
const DEFAULT_REPLY_LOOKBACK_DAYS = 2;
|
|
114
|
+
export class SlackTrackerClient {
|
|
115
|
+
settings;
|
|
116
|
+
transport;
|
|
117
|
+
scanCache = null;
|
|
118
|
+
/** Last state the reaction mirror was reconciled to, per issue (see healStatusMirror). */
|
|
119
|
+
mirroredStates = new Map();
|
|
120
|
+
/**
|
|
121
|
+
* Oldest thread activity (epoch seconds) considered when hunting for NEW reply-mention
|
|
122
|
+
* requests in untracked threads. Once tracked, a thread is marked with the bot's reaction
|
|
123
|
+
* and recognized regardless of age; the floor only bounds first discovery, so a reply
|
|
124
|
+
* mention posted while the daemon was down longer than the lookback is not picked up.
|
|
125
|
+
*/
|
|
126
|
+
replyFloor;
|
|
127
|
+
constructor(settings, transport) {
|
|
128
|
+
this.settings = settings;
|
|
129
|
+
this.transport = transport;
|
|
130
|
+
const lookbackDays = slackTrackerOptions(settings).replyLookbackDays ?? DEFAULT_REPLY_LOOKBACK_DAYS;
|
|
131
|
+
this.replyFloor = Date.now() / 1000 - lookbackDays * 86_400;
|
|
132
|
+
}
|
|
133
|
+
async fetchCandidateIssues() {
|
|
134
|
+
return this.fetchIssuesByStates(this.settings.tracker.activeStates);
|
|
135
|
+
}
|
|
136
|
+
async fetchIssuesByIds(ids) {
|
|
137
|
+
const base = await this.transport.teamUrl();
|
|
138
|
+
const out = [];
|
|
139
|
+
for (const id of ids) {
|
|
140
|
+
const parts = splitIssueId(id);
|
|
141
|
+
if (!parts)
|
|
142
|
+
continue;
|
|
143
|
+
const [channel, ts] = parts;
|
|
144
|
+
// Apply the same tracked-message predicate as candidate discovery and the Slack write
|
|
145
|
+
// tools. If a human edits the request away, the issue reconciles as gone, not live.
|
|
146
|
+
let root;
|
|
147
|
+
try {
|
|
148
|
+
root = await requireTrackedMessage(this.settings, this.transport, channel, ts);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const thread = await resolveThreadState(this.settings, this.transport, root);
|
|
154
|
+
out.push(slackMessageToIssue(root, this.settings, {
|
|
155
|
+
permalinkBase: base,
|
|
156
|
+
state: thread.state,
|
|
157
|
+
request: thread.request,
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
return out;
|
|
161
|
+
}
|
|
162
|
+
async fetchIssuesByStates(states) {
|
|
163
|
+
const wanted = new Set(states.map((s) => s.trim().toLowerCase()));
|
|
164
|
+
const issues = await this.trackedIssues();
|
|
165
|
+
return issues.filter((i) => wanted.has(i.state.trim().toLowerCase()));
|
|
166
|
+
}
|
|
167
|
+
async trackedIssues() {
|
|
168
|
+
const [scan, base] = await Promise.all([this.scanCached(), this.transport.teamUrl()]);
|
|
169
|
+
const roots = trackedRootsOf(scan);
|
|
170
|
+
// Hunt for NEW reply-mention requests: untracked threads with activity inside the lookback
|
|
171
|
+
// window. A thread is tracked once a reply mentions the bot; the bot then marks the root
|
|
172
|
+
// with its own reaction so later polls (and restarts) recognize it from the scan alone.
|
|
173
|
+
for (const root of scan.threadedRoots) {
|
|
174
|
+
if (root.botReacted === true)
|
|
175
|
+
continue;
|
|
176
|
+
if (tsValue(root.latestReply) <= this.replyFloor)
|
|
177
|
+
continue;
|
|
178
|
+
const thread = await resolveThreadState(this.settings, this.transport, root);
|
|
179
|
+
if (!thread.request)
|
|
180
|
+
continue;
|
|
181
|
+
roots.push(root);
|
|
182
|
+
try {
|
|
183
|
+
await this.transport.addReaction(root.channel, root.ts, this.markerEmoji());
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Tracking still works this poll; the marker retries on the next discovery pass.
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const issues = [];
|
|
190
|
+
for (const root of roots) {
|
|
191
|
+
const thread = await resolveThreadState(this.settings, this.transport, root);
|
|
192
|
+
await this.healStatusMirror(root, thread.state);
|
|
193
|
+
issues.push(slackMessageToIssue(root, this.settings, {
|
|
194
|
+
permalinkBase: base,
|
|
195
|
+
state: thread.state,
|
|
196
|
+
request: thread.request,
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
return issues;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Self-healing reaction mirror: when a HUMAN transitions status (`@bot !done`, a bare
|
|
203
|
+
* re-mention re-open), the bot's reaction still shows the previous state until the bot acts
|
|
204
|
+
* again. Reconcile the mirror to the thread-derived state during the poll, attempted once
|
|
205
|
+
* per state change per issue - a stale HUMAN-authored reaction is not removable by the bot
|
|
206
|
+
* (reactions are per-author), so retrying every poll would only churn the API.
|
|
207
|
+
*/
|
|
208
|
+
async healStatusMirror(root, state) {
|
|
209
|
+
const key = `${root.channel}:${root.ts}`;
|
|
210
|
+
if (this.mirroredStates.get(key) === state)
|
|
211
|
+
return;
|
|
212
|
+
const map = statusEmojiMap(this.settings);
|
|
213
|
+
const target = emojiForState(state, map);
|
|
214
|
+
const staleManaged = root.reactions.some((reaction) => typeof map[reaction] === "string" && reaction !== target);
|
|
215
|
+
const missingTarget = target !== null && !root.reactions.includes(target);
|
|
216
|
+
if (staleManaged || missingTarget) {
|
|
217
|
+
await mirrorStatusReaction(this.settings, this.transport, root.channel, root.ts, state);
|
|
218
|
+
}
|
|
219
|
+
this.mirroredStates.set(key, state);
|
|
220
|
+
}
|
|
221
|
+
async scanCached() {
|
|
222
|
+
const key = this.channels().join(",");
|
|
223
|
+
const now = Date.now();
|
|
224
|
+
if (this.scanCache &&
|
|
225
|
+
this.scanCache.key === key &&
|
|
226
|
+
now - this.scanCache.at < SCAN_CACHE_TTL_MS) {
|
|
227
|
+
return this.scanCache.scan;
|
|
228
|
+
}
|
|
229
|
+
const scan = await this.transport.scanChannels(this.channels());
|
|
230
|
+
this.scanCache = { at: Date.now(), key, scan };
|
|
231
|
+
return scan;
|
|
232
|
+
}
|
|
233
|
+
channels() {
|
|
234
|
+
return slackTrackerOptions(this.settings).channels;
|
|
235
|
+
}
|
|
236
|
+
markerEmoji() {
|
|
237
|
+
return slackTrackerOptions(this.settings).markerEmoji ?? "robot_face";
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function tsValue(ts) {
|
|
241
|
+
if (ts === undefined)
|
|
242
|
+
return 0;
|
|
243
|
+
const value = Number.parseFloat(ts);
|
|
244
|
+
return Number.isFinite(value) ? value : 0;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { SlackChannelScan, SlackMessage, SlackThreadReply, SlackTransport, SlackUser } from "./transport.js";
|
|
2
|
+
interface SeedMessage {
|
|
3
|
+
ts: string;
|
|
4
|
+
text: string;
|
|
5
|
+
user?: string;
|
|
6
|
+
reactions?: string[];
|
|
7
|
+
replies?: SlackThreadReply[];
|
|
8
|
+
/** Seed the bot's tracking marker, as if the bot had reacted in an earlier session. */
|
|
9
|
+
botReacted?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface InMemoryOptions {
|
|
12
|
+
botUserId?: string;
|
|
13
|
+
/** The bot's own user id when posting replies (defaults to `botUserId`). */
|
|
14
|
+
users?: Record<string, SlackUser>;
|
|
15
|
+
}
|
|
16
|
+
export declare class InMemorySlackTransport implements SlackTransport {
|
|
17
|
+
readonly replies: Array<{
|
|
18
|
+
channel: string;
|
|
19
|
+
threadTs: string;
|
|
20
|
+
body: string;
|
|
21
|
+
}>;
|
|
22
|
+
private readonly messages;
|
|
23
|
+
private readonly botUserId;
|
|
24
|
+
private readonly users;
|
|
25
|
+
constructor(seed?: Record<string, SeedMessage[]>, opts?: InMemoryOptions);
|
|
26
|
+
scanChannels(channels: string[]): Promise<SlackChannelScan>;
|
|
27
|
+
listMentions(channels: string[]): Promise<SlackMessage[]>;
|
|
28
|
+
teamUrl(): Promise<string | null>;
|
|
29
|
+
getMessage(channel: string, ts: string): Promise<SlackMessage | null>;
|
|
30
|
+
getThread(channel: string, ts: string): Promise<SlackThreadReply[]>;
|
|
31
|
+
getUser(userId: string): Promise<SlackUser | null>;
|
|
32
|
+
listAround(channel: string, ts: string, window: {
|
|
33
|
+
before: number;
|
|
34
|
+
after: number;
|
|
35
|
+
}): Promise<SlackMessage[]>;
|
|
36
|
+
addReaction(channel: string, ts: string, name: string): Promise<void>;
|
|
37
|
+
removeReaction(channel: string, ts: string, name: string): Promise<void>;
|
|
38
|
+
postReply(channel: string, threadTs: string, body: string): Promise<void>;
|
|
39
|
+
private snapshot;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=inMemoryTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryTransport.d.ts","sourceRoot":"","sources":["../src/inMemoryTransport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,uFAAuF;IACvF,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAMD,UAAU,eAAe;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACnC;AAED,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;IAClF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;gBAEtC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAM,EAAE,IAAI,GAAE,eAAoB;IAmB1E,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAY3D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAIzD,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIjC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKrE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAKnE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAIlD,UAAU,CACd,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GACxC,OAAO,CAAC,YAAY,EAAE,CAAC;IAWpB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/E,OAAO,CAAC,QAAQ;CAUjB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { isBotMention } from "./mapping.js";
|
|
2
|
+
export class InMemorySlackTransport {
|
|
3
|
+
replies = [];
|
|
4
|
+
messages = new Map();
|
|
5
|
+
botUserId;
|
|
6
|
+
users;
|
|
7
|
+
constructor(seed = {}, opts = {}) {
|
|
8
|
+
this.botUserId = opts.botUserId;
|
|
9
|
+
this.users = opts.users ?? {};
|
|
10
|
+
for (const [channel, msgs] of Object.entries(seed)) {
|
|
11
|
+
this.messages.set(channel, msgs.map((m) => ({
|
|
12
|
+
channel,
|
|
13
|
+
ts: m.ts,
|
|
14
|
+
text: m.text,
|
|
15
|
+
...(m.user !== undefined ? { user: m.user } : {}),
|
|
16
|
+
reactions: [...(m.reactions ?? [])],
|
|
17
|
+
botReacted: m.botReacted ?? false,
|
|
18
|
+
thread: (m.replies ?? []).map((r) => ({ ...r })),
|
|
19
|
+
})));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async scanChannels(channels) {
|
|
23
|
+
const mentions = [];
|
|
24
|
+
const threadedRoots = [];
|
|
25
|
+
for (const channel of channels) {
|
|
26
|
+
for (const m of this.messages.get(channel) ?? []) {
|
|
27
|
+
if (isBotMention(m.text, this.botUserId))
|
|
28
|
+
mentions.push(this.snapshot(m));
|
|
29
|
+
else if (m.thread.length > 0)
|
|
30
|
+
threadedRoots.push(this.snapshot(m));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return Promise.resolve({ mentions, threadedRoots });
|
|
34
|
+
}
|
|
35
|
+
async listMentions(channels) {
|
|
36
|
+
return (await this.scanChannels(channels)).mentions;
|
|
37
|
+
}
|
|
38
|
+
async teamUrl() {
|
|
39
|
+
return Promise.resolve("https://example.slack.com");
|
|
40
|
+
}
|
|
41
|
+
async getMessage(channel, ts) {
|
|
42
|
+
const found = (this.messages.get(channel) ?? []).find((m) => m.ts === ts);
|
|
43
|
+
return Promise.resolve(found ? this.snapshot(found) : null);
|
|
44
|
+
}
|
|
45
|
+
async getThread(channel, ts) {
|
|
46
|
+
const found = (this.messages.get(channel) ?? []).find((m) => m.ts === ts);
|
|
47
|
+
return Promise.resolve(found ? found.thread.map((r) => ({ ...r })) : []);
|
|
48
|
+
}
|
|
49
|
+
async getUser(userId) {
|
|
50
|
+
return Promise.resolve(this.users[userId] ?? null);
|
|
51
|
+
}
|
|
52
|
+
async listAround(channel, ts, window) {
|
|
53
|
+
const all = [...(this.messages.get(channel) ?? [])].sort((a, b) => Number.parseFloat(a.ts) - Number.parseFloat(b.ts));
|
|
54
|
+
const anchor = all.findIndex((m) => m.ts === ts);
|
|
55
|
+
if (anchor === -1)
|
|
56
|
+
return Promise.resolve([]);
|
|
57
|
+
const start = Math.max(0, anchor - window.before + 1);
|
|
58
|
+
const end = Math.min(all.length, anchor + 1 + window.after);
|
|
59
|
+
return Promise.resolve(all.slice(start, end).map((m) => this.snapshot(m)));
|
|
60
|
+
}
|
|
61
|
+
async addReaction(channel, ts, name) {
|
|
62
|
+
const msg = (this.messages.get(channel) ?? []).find((m) => m.ts === ts);
|
|
63
|
+
if (msg) {
|
|
64
|
+
if (!msg.reactions.includes(name))
|
|
65
|
+
msg.reactions.push(name);
|
|
66
|
+
// This transport acts as the bot, so a reaction it adds is the bot's marker.
|
|
67
|
+
msg.botReacted = true;
|
|
68
|
+
}
|
|
69
|
+
return Promise.resolve();
|
|
70
|
+
}
|
|
71
|
+
async removeReaction(channel, ts, name) {
|
|
72
|
+
const msg = (this.messages.get(channel) ?? []).find((m) => m.ts === ts);
|
|
73
|
+
if (msg)
|
|
74
|
+
msg.reactions = msg.reactions.filter((r) => r !== name);
|
|
75
|
+
return Promise.resolve();
|
|
76
|
+
}
|
|
77
|
+
async postReply(channel, threadTs, body) {
|
|
78
|
+
this.replies.push({ channel, threadTs, body });
|
|
79
|
+
// Append the reply to the parent message's thread so a posted reply can be read back via
|
|
80
|
+
// getThread in tests. The reply is authored by the bot, with a ts after the parent's.
|
|
81
|
+
const parent = (this.messages.get(channel) ?? []).find((m) => m.ts === threadTs);
|
|
82
|
+
if (parent) {
|
|
83
|
+
const reply = {
|
|
84
|
+
ts: `${Number.parseFloat(threadTs) + parent.thread.length + 1}.000000`,
|
|
85
|
+
text: body,
|
|
86
|
+
};
|
|
87
|
+
if (this.botUserId !== undefined)
|
|
88
|
+
reply.user = this.botUserId;
|
|
89
|
+
parent.thread.push(reply);
|
|
90
|
+
}
|
|
91
|
+
return Promise.resolve();
|
|
92
|
+
}
|
|
93
|
+
snapshot(message) {
|
|
94
|
+
const { thread, ...rest } = message;
|
|
95
|
+
return {
|
|
96
|
+
...rest,
|
|
97
|
+
reactions: [...message.reactions],
|
|
98
|
+
...(thread.length > 0
|
|
99
|
+
? { replyCount: thread.length, latestReply: thread[thread.length - 1].ts }
|
|
100
|
+
: {}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=inMemoryTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inMemoryTransport.js","sourceRoot":"","sources":["../src/inMemoryTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA6B5C,MAAM,OAAO,sBAAsB;IACxB,OAAO,GAA+D,EAAE,CAAC;IACjE,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;IACnD,SAAS,CAAqB;IAC9B,KAAK,CAA4B;IAElD,YAAY,OAAsC,EAAE,EAAE,OAAwB,EAAE;QAC9E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,OAAO,EACP,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACf,OAAO;gBACP,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBACnC,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,KAAK;gBACjC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;aACjD,CAAC,CAAC,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAkB;QACnC,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,MAAM,aAAa,GAAmB,EAAE,CAAC;QACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjD,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;qBACrE,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;oBAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAkB;QACnC,OAAO,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,EAAU;QAC1C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,EAAU;QACzC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU,CACd,OAAe,EACf,EAAU,EACV,MAAyC;QAEzC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACtD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5D,CAAC;QACF,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,IAAI,MAAM,KAAK,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,EAAU,EAAE,IAAY;QACzD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,6EAA6E;YAC7E,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,EAAU,EAAE,IAAY;QAC5D,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,IAAI,GAAG;YAAE,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACjE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,QAAgB,EAAE,IAAY;QAC7D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,yFAAyF;QACzF,sFAAsF;QACtF,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QACjF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,GAAqB;gBAC9B,EAAE,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,SAAS;gBACtE,IAAI,EAAE,IAAI;aACX,CAAC;YACF,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEO,QAAQ,CAAC,OAAsB;QACrC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QACpC,OAAO;YACL,GAAG,IAAI;YACP,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBACnB,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,EAAE;gBAC3E,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type { SlackChannelScan, SlackMessage, SlackThreadReply, SlackTransport, SlackUser, } from "./transport.js";
|
|
2
|
+
export { InMemorySlackTransport } from "./inMemoryTransport.js";
|
|
3
|
+
export { SlackWebTransport } from "./webTransport.js";
|
|
4
|
+
export type { SlackTrackerLogger } from "./webTransport.js";
|
|
5
|
+
export { SlackTrackerClient } from "./client.js";
|
|
6
|
+
export { DEFAULT_EMOJI_STATES, emojiForState, isBotMention, stateFromReactions, statusEmojiMap, stripLeadingMention, } from "./mapping.js";
|
|
7
|
+
export { slackTrackerOptions } from "./options.js";
|
|
8
|
+
export type { SlackTrackerOptions } from "./options.js";
|
|
9
|
+
export { BOT_STATUS_PREFIX, parseStatusCommand, resolveStateName, stateFromThread, } from "./threadState.js";
|
|
10
|
+
export type { ThreadState } from "./threadState.js";
|
|
11
|
+
export { slackTrackerProvider } from "./provider.js";
|
|
12
|
+
export { registerSlackTracker } from "./register.js";
|
|
13
|
+
export { executeSlackTool, slackToolSpecs } from "./tools.js";
|
|
14
|
+
export { slackToolOpsWith } from "./toolOps.js";
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { InMemorySlackTransport } from "./inMemoryTransport.js";
|
|
2
|
+
export { SlackWebTransport } from "./webTransport.js";
|
|
3
|
+
export { SlackTrackerClient } from "./client.js";
|
|
4
|
+
export { DEFAULT_EMOJI_STATES, emojiForState, isBotMention, stateFromReactions, statusEmojiMap, stripLeadingMention, } from "./mapping.js";
|
|
5
|
+
export { slackTrackerOptions } from "./options.js";
|
|
6
|
+
export { BOT_STATUS_PREFIX, parseStatusCommand, resolveStateName, stateFromThread, } from "./threadState.js";
|
|
7
|
+
export { slackTrackerProvider } from "./provider.js";
|
|
8
|
+
export { registerSlackTracker } from "./register.js";
|
|
9
|
+
export { executeSlackTool, slackToolSpecs } from "./tools.js";
|
|
10
|
+
export { slackToolOpsWith } from "./toolOps.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Settings } from "@lorenz/domain";
|
|
2
|
+
export declare const DEFAULT_EMOJI_STATES: Record<string, string>;
|
|
3
|
+
/**
|
|
4
|
+
* True when `text` mentions the bot. With `botUserId` set, only mentions of that specific user
|
|
5
|
+
* count; without it, any `<@U...>` mention counts (back-compat).
|
|
6
|
+
*/
|
|
7
|
+
export declare function isBotMention(text: string, botUserId?: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Strip a single leading bot mention (and following whitespace) from `text`. With `botUserId`
|
|
10
|
+
* set, only that user's leading mention is stripped; without it, any leading `<@U...>` mention is.
|
|
11
|
+
*/
|
|
12
|
+
export declare function stripLeadingMention(text: string, botUserId?: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* The emoji-name → state map for the workflow. Built on a null prototype: reaction names come
|
|
15
|
+
* straight from Slack and are used as lookup keys, so an emoji named `constructor` or
|
|
16
|
+
* `__proto__` must read as "unmapped" rather than resolving to an inherited Object member.
|
|
17
|
+
*/
|
|
18
|
+
export declare function statusEmojiMap(settings: Settings): Record<string, string>;
|
|
19
|
+
/**
|
|
20
|
+
* Derive state from the reactions present; the most-advanced mapped status wins (ties
|
|
21
|
+
* broken by reaction order), else "Todo". Pass `settings` so custom state names rank by
|
|
22
|
+
* their configured active/terminal role instead of falling to the bottom.
|
|
23
|
+
*/
|
|
24
|
+
export declare function stateFromReactions(reactions: string[], map: Record<string, string>, settings?: Settings): string;
|
|
25
|
+
/** Reverse lookup: the emoji name whose mapped state equals `state` (case-insensitive). */
|
|
26
|
+
export declare function emojiForState(state: string, map: Record<string, string>): string | null;
|
|
27
|
+
//# sourceMappingURL=mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIvD,CAAC;AAmBF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMzE;AAiCD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EAAE,EACnB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,QAAQ,CAAC,EAAE,QAAQ,GAClB,MAAM,CAaR;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAMvF"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { defaultStateType } from "@lorenz/issue";
|
|
2
|
+
import { slackTrackerOptions } from "./options.js";
|
|
3
|
+
export const DEFAULT_EMOJI_STATES = {
|
|
4
|
+
eyes: "In Progress",
|
|
5
|
+
white_check_mark: "Done",
|
|
6
|
+
x: "Cancelled",
|
|
7
|
+
};
|
|
8
|
+
/** Matches any Slack user mention, optionally in its piped `<@U123|label>` form. */
|
|
9
|
+
const ANY_MENTION = /<@[A-Z0-9_]+(\|[^>]*)?>/;
|
|
10
|
+
/** Escape a Slack user id for safe interpolation into a RegExp. */
|
|
11
|
+
function escapeRegExp(value) {
|
|
12
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build a regex matching a mention of `botUserId` (plain `<@BOTID>` or piped `<@BOTID|label>`),
|
|
16
|
+
* or any user mention when `botUserId` is not set (documented back-compat).
|
|
17
|
+
*/
|
|
18
|
+
function mentionRegExp(botUserId) {
|
|
19
|
+
if (!botUserId)
|
|
20
|
+
return new RegExp(ANY_MENTION.source);
|
|
21
|
+
return new RegExp(`<@${escapeRegExp(botUserId)}(\\|[^>]*)?>`);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* True when `text` mentions the bot. With `botUserId` set, only mentions of that specific user
|
|
25
|
+
* count; without it, any `<@U...>` mention counts (back-compat).
|
|
26
|
+
*/
|
|
27
|
+
export function isBotMention(text, botUserId) {
|
|
28
|
+
return mentionRegExp(botUserId).test(text);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Strip a single leading bot mention (and following whitespace) from `text`. With `botUserId`
|
|
32
|
+
* set, only that user's leading mention is stripped; without it, any leading `<@U...>` mention is.
|
|
33
|
+
*/
|
|
34
|
+
export function stripLeadingMention(text, botUserId) {
|
|
35
|
+
const source = botUserId
|
|
36
|
+
? `^<@${escapeRegExp(botUserId)}(\\|[^>]*)?>\\s*`
|
|
37
|
+
: `^${ANY_MENTION.source}\\s*`;
|
|
38
|
+
return text.replace(new RegExp(source), "");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The emoji-name → state map for the workflow. Built on a null prototype: reaction names come
|
|
42
|
+
* straight from Slack and are used as lookup keys, so an emoji named `constructor` or
|
|
43
|
+
* `__proto__` must read as "unmapped" rather than resolving to an inherited Object member.
|
|
44
|
+
*/
|
|
45
|
+
export function statusEmojiMap(settings) {
|
|
46
|
+
return Object.assign(Object.create(null), DEFAULT_EMOJI_STATES, slackTrackerOptions(settings).emojiStates ?? {});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Rank a status by category so a more-advanced state wins over a less-advanced one. Canceled
|
|
50
|
+
* outranks completed so that a cancellation deterministically overrides a completion when both
|
|
51
|
+
* reactions are present, regardless of reaction order. Custom state names (no known category)
|
|
52
|
+
* rank by their configured role: terminal states rank with completed and active states with
|
|
53
|
+
* started, so a human-applied custom terminal reaction still closes an issue the agent marked
|
|
54
|
+
* in-progress.
|
|
55
|
+
*/
|
|
56
|
+
function stateRank(state, settings) {
|
|
57
|
+
switch (defaultStateType(state)) {
|
|
58
|
+
case "canceled":
|
|
59
|
+
return 4;
|
|
60
|
+
case "completed":
|
|
61
|
+
return 3;
|
|
62
|
+
case "started":
|
|
63
|
+
return 2;
|
|
64
|
+
case "backlog":
|
|
65
|
+
case "unstarted":
|
|
66
|
+
case "triage":
|
|
67
|
+
return 1;
|
|
68
|
+
default:
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
if (settings) {
|
|
72
|
+
const target = state.trim().toLowerCase();
|
|
73
|
+
if (settings.tracker.terminalStates.some((s) => s.trim().toLowerCase() === target))
|
|
74
|
+
return 3;
|
|
75
|
+
if (settings.tracker.activeStates.some((s) => s.trim().toLowerCase() === target))
|
|
76
|
+
return 2;
|
|
77
|
+
}
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Derive state from the reactions present; the most-advanced mapped status wins (ties
|
|
82
|
+
* broken by reaction order), else "Todo". Pass `settings` so custom state names rank by
|
|
83
|
+
* their configured active/terminal role instead of falling to the bottom.
|
|
84
|
+
*/
|
|
85
|
+
export function stateFromReactions(reactions, map, settings) {
|
|
86
|
+
let best = null;
|
|
87
|
+
let bestRank = -1;
|
|
88
|
+
for (const reaction of reactions) {
|
|
89
|
+
const state = map[reaction];
|
|
90
|
+
if (typeof state !== "string")
|
|
91
|
+
continue;
|
|
92
|
+
const rank = stateRank(state, settings);
|
|
93
|
+
if (rank > bestRank) {
|
|
94
|
+
best = state;
|
|
95
|
+
bestRank = rank;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return best ?? "Todo";
|
|
99
|
+
}
|
|
100
|
+
/** Reverse lookup: the emoji name whose mapped state equals `state` (case-insensitive). */
|
|
101
|
+
export function emojiForState(state, map) {
|
|
102
|
+
const target = state.trim().toLowerCase();
|
|
103
|
+
for (const [emoji, mapped] of Object.entries(map)) {
|
|
104
|
+
if (mapped.trim().toLowerCase() === target)
|
|
105
|
+
return emoji;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,IAAI,EAAE,aAAa;IACnB,gBAAgB,EAAE,MAAM;IACxB,CAAC,EAAE,WAAW;CACf,CAAC;AAEF,oFAAoF;AACpF,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C,mEAAmE;AACnE,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,SAAkB;IACvC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,IAAI,MAAM,CAAC,KAAK,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,SAAkB;IAC3D,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,SAAkB;IAClE,MAAM,MAAM,GAAG,SAAS;QACtB,CAAC,CAAC,MAAM,YAAY,CAAC,SAAS,CAAC,kBAAkB;QACjD,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,MAAM,CAAC;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,OAAO,MAAM,CAAC,MAAM,CAClB,MAAM,CAAC,MAAM,CAAC,IAAI,CAA2B,EAC7C,oBAAoB,EACpB,mBAAmB,CAAC,QAAQ,CAAC,CAAC,WAAW,IAAI,EAAE,CAChD,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,SAAS,CAAC,KAAa,EAAE,QAAmB;IACnD,QAAQ,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,UAAU;YACb,OAAO,CAAC,CAAC;QACX,KAAK,WAAW;YACd,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX;YACE,MAAM;IACV,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;YAAE,OAAO,CAAC,CAAC;QAC7F,IAAI,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;YAAE,OAAO,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAmB,EACnB,GAA2B,EAC3B,QAAmB;IAEnB,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;YACpB,IAAI,GAAG,KAAK,CAAC;YACb,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,IAAI,MAAM,CAAC;AACxB,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,GAA2B;IACtE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|