@telora/daemon 0.12.33
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/.env.example +64 -0
- package/README.md +229 -0
- package/build-info.json +4 -0
- package/dist/activity-tracker.d.ts +13 -0
- package/dist/activity-tracker.d.ts.map +1 -0
- package/dist/activity-tracker.js +19 -0
- package/dist/activity-tracker.js.map +1 -0
- package/dist/agent-state.d.ts +45 -0
- package/dist/agent-state.d.ts.map +1 -0
- package/dist/agent-state.js +61 -0
- package/dist/agent-state.js.map +1 -0
- package/dist/audit-hooks.d.ts +12 -0
- package/dist/audit-hooks.d.ts.map +1 -0
- package/dist/audit-hooks.js +45 -0
- package/dist/audit-hooks.js.map +1 -0
- package/dist/auto-update.d.ts +42 -0
- package/dist/auto-update.d.ts.map +1 -0
- package/dist/auto-update.js +96 -0
- package/dist/auto-update.js.map +1 -0
- package/dist/branch-status.d.ts +40 -0
- package/dist/branch-status.d.ts.map +1 -0
- package/dist/branch-status.js +107 -0
- package/dist/branch-status.js.map +1 -0
- package/dist/completion-detector.d.ts +87 -0
- package/dist/completion-detector.d.ts.map +1 -0
- package/dist/completion-detector.js +160 -0
- package/dist/completion-detector.js.map +1 -0
- package/dist/completion-handler.d.ts +48 -0
- package/dist/completion-handler.d.ts.map +1 -0
- package/dist/completion-handler.js +200 -0
- package/dist/completion-handler.js.map +1 -0
- package/dist/condition-evaluators.d.ts +31 -0
- package/dist/condition-evaluators.d.ts.map +1 -0
- package/dist/condition-evaluators.js +416 -0
- package/dist/condition-evaluators.js.map +1 -0
- package/dist/config.d.ts +55 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +311 -0
- package/dist/config.js.map +1 -0
- package/dist/control-state.d.ts +41 -0
- package/dist/control-state.d.ts.map +1 -0
- package/dist/control-state.js +204 -0
- package/dist/control-state.js.map +1 -0
- package/dist/crash-recovery-cleanup.d.ts +21 -0
- package/dist/crash-recovery-cleanup.d.ts.map +1 -0
- package/dist/crash-recovery-cleanup.js +198 -0
- package/dist/crash-recovery-cleanup.js.map +1 -0
- package/dist/crash-recovery-scan.d.ts +19 -0
- package/dist/crash-recovery-scan.d.ts.map +1 -0
- package/dist/crash-recovery-scan.js +145 -0
- package/dist/crash-recovery-scan.js.map +1 -0
- package/dist/crash-recovery-types.d.ts +54 -0
- package/dist/crash-recovery-types.d.ts.map +1 -0
- package/dist/crash-recovery-types.js +13 -0
- package/dist/crash-recovery-types.js.map +1 -0
- package/dist/crash-recovery.d.ts +88 -0
- package/dist/crash-recovery.d.ts.map +1 -0
- package/dist/crash-recovery.js +448 -0
- package/dist/crash-recovery.js.map +1 -0
- package/dist/daemon-logs.d.ts +19 -0
- package/dist/daemon-logs.d.ts.map +1 -0
- package/dist/daemon-logs.js +81 -0
- package/dist/daemon-logs.js.map +1 -0
- package/dist/daemon-process.d.ts +154 -0
- package/dist/daemon-process.d.ts.map +1 -0
- package/dist/daemon-process.js +427 -0
- package/dist/daemon-process.js.map +1 -0
- package/dist/dag-validator.d.ts +52 -0
- package/dist/dag-validator.d.ts.map +1 -0
- package/dist/dag-validator.js +199 -0
- package/dist/dag-validator.js.map +1 -0
- package/dist/delivery-guards.d.ts +41 -0
- package/dist/delivery-guards.d.ts.map +1 -0
- package/dist/delivery-guards.js +195 -0
- package/dist/delivery-guards.js.map +1 -0
- package/dist/delivery-lifecycle.d.ts +110 -0
- package/dist/delivery-lifecycle.d.ts.map +1 -0
- package/dist/delivery-lifecycle.js +353 -0
- package/dist/delivery-lifecycle.js.map +1 -0
- package/dist/delivery-merge.d.ts +17 -0
- package/dist/delivery-merge.d.ts.map +1 -0
- package/dist/delivery-merge.js +89 -0
- package/dist/delivery-merge.js.map +1 -0
- package/dist/dependency-resolver.d.ts +77 -0
- package/dist/dependency-resolver.d.ts.map +1 -0
- package/dist/dependency-resolver.js +337 -0
- package/dist/dependency-resolver.js.map +1 -0
- package/dist/evaluation-context.d.ts +49 -0
- package/dist/evaluation-context.d.ts.map +1 -0
- package/dist/evaluation-context.js +98 -0
- package/dist/evaluation-context.js.map +1 -0
- package/dist/git-activity.d.ts +24 -0
- package/dist/git-activity.d.ts.map +1 -0
- package/dist/git-activity.js +97 -0
- package/dist/git-activity.js.map +1 -0
- package/dist/git-branch.d.ts +33 -0
- package/dist/git-branch.d.ts.map +1 -0
- package/dist/git-branch.js +88 -0
- package/dist/git-branch.js.map +1 -0
- package/dist/git-integration.d.ts +27 -0
- package/dist/git-integration.d.ts.map +1 -0
- package/dist/git-integration.js +82 -0
- package/dist/git-integration.js.map +1 -0
- package/dist/git-merge-helpers.d.ts +48 -0
- package/dist/git-merge-helpers.d.ts.map +1 -0
- package/dist/git-merge-helpers.js +105 -0
- package/dist/git-merge-helpers.js.map +1 -0
- package/dist/git-merge-lock.d.ts +67 -0
- package/dist/git-merge-lock.d.ts.map +1 -0
- package/dist/git-merge-lock.js +157 -0
- package/dist/git-merge-lock.js.map +1 -0
- package/dist/git-merge-strategies.d.ts +39 -0
- package/dist/git-merge-strategies.d.ts.map +1 -0
- package/dist/git-merge-strategies.js +127 -0
- package/dist/git-merge-strategies.js.map +1 -0
- package/dist/git-merge.d.ts +80 -0
- package/dist/git-merge.d.ts.map +1 -0
- package/dist/git-merge.js +373 -0
- package/dist/git-merge.js.map +1 -0
- package/dist/git-state-detector.d.ts +24 -0
- package/dist/git-state-detector.d.ts.map +1 -0
- package/dist/git-state-detector.js +122 -0
- package/dist/git-state-detector.js.map +1 -0
- package/dist/git-types.d.ts +40 -0
- package/dist/git-types.d.ts.map +1 -0
- package/dist/git-types.js +23 -0
- package/dist/git-types.js.map +1 -0
- package/dist/git-utils.d.ts +28 -0
- package/dist/git-utils.d.ts.map +1 -0
- package/dist/git-utils.js +57 -0
- package/dist/git-utils.js.map +1 -0
- package/dist/git.d.ts +24 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +64 -0
- package/dist/git.js.map +1 -0
- package/dist/guard-engine.d.ts +19 -0
- package/dist/guard-engine.d.ts.map +1 -0
- package/dist/guard-engine.js +21 -0
- package/dist/guard-engine.js.map +1 -0
- package/dist/guard-evaluator.d.ts +47 -0
- package/dist/guard-evaluator.d.ts.map +1 -0
- package/dist/guard-evaluator.js +193 -0
- package/dist/guard-evaluator.js.map +1 -0
- package/dist/heartbeat.d.ts +73 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +306 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +493 -0
- package/dist/index.js.map +1 -0
- package/dist/listener-auto-advance.d.ts +29 -0
- package/dist/listener-auto-advance.d.ts.map +1 -0
- package/dist/listener-auto-advance.js +172 -0
- package/dist/listener-auto-advance.js.map +1 -0
- package/dist/listener-review.d.ts +37 -0
- package/dist/listener-review.d.ts.map +1 -0
- package/dist/listener-review.js +217 -0
- package/dist/listener-review.js.map +1 -0
- package/dist/listener.d.ts +57 -0
- package/dist/listener.d.ts.map +1 -0
- package/dist/listener.js +361 -0
- package/dist/listener.js.map +1 -0
- package/dist/log-manager.d.ts +18 -0
- package/dist/log-manager.d.ts.map +1 -0
- package/dist/log-manager.js +18 -0
- package/dist/log-manager.js.map +1 -0
- package/dist/otlp-log-parser.d.ts +21 -0
- package/dist/otlp-log-parser.d.ts.map +1 -0
- package/dist/otlp-log-parser.js +143 -0
- package/dist/otlp-log-parser.js.map +1 -0
- package/dist/otlp-metric-parser.d.ts +20 -0
- package/dist/otlp-metric-parser.d.ts.map +1 -0
- package/dist/otlp-metric-parser.js +113 -0
- package/dist/otlp-metric-parser.js.map +1 -0
- package/dist/otlp-port-manager.d.ts +26 -0
- package/dist/otlp-port-manager.d.ts.map +1 -0
- package/dist/otlp-port-manager.js +130 -0
- package/dist/otlp-port-manager.js.map +1 -0
- package/dist/otlp-receiver.d.ts +51 -0
- package/dist/otlp-receiver.d.ts.map +1 -0
- package/dist/otlp-receiver.js +663 -0
- package/dist/otlp-receiver.js.map +1 -0
- package/dist/otlp-types.d.ts +92 -0
- package/dist/otlp-types.d.ts.map +1 -0
- package/dist/otlp-types.js +133 -0
- package/dist/otlp-types.js.map +1 -0
- package/dist/output-monitor.d.ts +33 -0
- package/dist/output-monitor.d.ts.map +1 -0
- package/dist/output-monitor.js +67 -0
- package/dist/output-monitor.js.map +1 -0
- package/dist/planning-prompt-builder.d.ts +67 -0
- package/dist/planning-prompt-builder.d.ts.map +1 -0
- package/dist/planning-prompt-builder.js +515 -0
- package/dist/planning-prompt-builder.js.map +1 -0
- package/dist/prompt-builder.d.ts +14 -0
- package/dist/prompt-builder.d.ts.map +1 -0
- package/dist/prompt-builder.js +174 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/qa-crash-recovery.d.ts +77 -0
- package/dist/qa-crash-recovery.d.ts.map +1 -0
- package/dist/qa-crash-recovery.js +243 -0
- package/dist/qa-crash-recovery.js.map +1 -0
- package/dist/qa-dev-server.d.ts +73 -0
- package/dist/qa-dev-server.d.ts.map +1 -0
- package/dist/qa-dev-server.js +279 -0
- package/dist/qa-dev-server.js.map +1 -0
- package/dist/qa-orchestrator.d.ts +79 -0
- package/dist/qa-orchestrator.d.ts.map +1 -0
- package/dist/qa-orchestrator.js +349 -0
- package/dist/qa-orchestrator.js.map +1 -0
- package/dist/qa-port-allocator.d.ts +34 -0
- package/dist/qa-port-allocator.d.ts.map +1 -0
- package/dist/qa-port-allocator.js +75 -0
- package/dist/qa-port-allocator.js.map +1 -0
- package/dist/qa-provisioner.d.ts +33 -0
- package/dist/qa-provisioner.d.ts.map +1 -0
- package/dist/qa-provisioner.js +141 -0
- package/dist/qa-provisioner.js.map +1 -0
- package/dist/qa-state.d.ts +93 -0
- package/dist/qa-state.d.ts.map +1 -0
- package/dist/qa-state.js +74 -0
- package/dist/qa-state.js.map +1 -0
- package/dist/queries/control-state.d.ts +25 -0
- package/dist/queries/control-state.d.ts.map +1 -0
- package/dist/queries/control-state.js +34 -0
- package/dist/queries/control-state.js.map +1 -0
- package/dist/queries/daemon-connection.d.ts +25 -0
- package/dist/queries/daemon-connection.d.ts.map +1 -0
- package/dist/queries/daemon-connection.js +28 -0
- package/dist/queries/daemon-connection.js.map +1 -0
- package/dist/queries/deliveries.d.ts +100 -0
- package/dist/queries/deliveries.d.ts.map +1 -0
- package/dist/queries/deliveries.js +184 -0
- package/dist/queries/deliveries.js.map +1 -0
- package/dist/queries/git-activity.d.ts +20 -0
- package/dist/queries/git-activity.d.ts.map +1 -0
- package/dist/queries/git-activity.js +22 -0
- package/dist/queries/git-activity.js.map +1 -0
- package/dist/queries/guards.d.ts +47 -0
- package/dist/queries/guards.d.ts.map +1 -0
- package/dist/queries/guards.js +138 -0
- package/dist/queries/guards.js.map +1 -0
- package/dist/queries/index.d.ts +19 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +17 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/issues.d.ts +41 -0
- package/dist/queries/issues.d.ts.map +1 -0
- package/dist/queries/issues.js +67 -0
- package/dist/queries/issues.js.map +1 -0
- package/dist/queries/qa.d.ts +79 -0
- package/dist/queries/qa.d.ts.map +1 -0
- package/dist/queries/qa.js +85 -0
- package/dist/queries/qa.js.map +1 -0
- package/dist/queries/roles.d.ts +13 -0
- package/dist/queries/roles.d.ts.map +1 -0
- package/dist/queries/roles.js +39 -0
- package/dist/queries/roles.js.map +1 -0
- package/dist/queries/schemas.d.ts +777 -0
- package/dist/queries/schemas.d.ts.map +1 -0
- package/dist/queries/schemas.js +391 -0
- package/dist/queries/schemas.js.map +1 -0
- package/dist/queries/sessions.d.ts +64 -0
- package/dist/queries/sessions.d.ts.map +1 -0
- package/dist/queries/sessions.js +100 -0
- package/dist/queries/sessions.js.map +1 -0
- package/dist/queries/shared.d.ts +61 -0
- package/dist/queries/shared.d.ts.map +1 -0
- package/dist/queries/shared.js +187 -0
- package/dist/queries/shared.js.map +1 -0
- package/dist/queries/strategies.d.ts +69 -0
- package/dist/queries/strategies.d.ts.map +1 -0
- package/dist/queries/strategies.js +80 -0
- package/dist/queries/strategies.js.map +1 -0
- package/dist/queries/workflows.d.ts +17 -0
- package/dist/queries/workflows.d.ts.map +1 -0
- package/dist/queries/workflows.js +49 -0
- package/dist/queries/workflows.js.map +1 -0
- package/dist/queries/worktrees.d.ts +38 -0
- package/dist/queries/worktrees.d.ts.map +1 -0
- package/dist/queries/worktrees.js +37 -0
- package/dist/queries/worktrees.js.map +1 -0
- package/dist/self-update.d.ts +94 -0
- package/dist/self-update.d.ts.map +1 -0
- package/dist/self-update.js +438 -0
- package/dist/self-update.js.map +1 -0
- package/dist/session-lifecycle.d.ts +77 -0
- package/dist/session-lifecycle.d.ts.map +1 -0
- package/dist/session-lifecycle.js +379 -0
- package/dist/session-lifecycle.js.map +1 -0
- package/dist/shutdown-state.d.ts +17 -0
- package/dist/shutdown-state.d.ts.map +1 -0
- package/dist/shutdown-state.js +22 -0
- package/dist/shutdown-state.js.map +1 -0
- package/dist/spawn-cooldown.d.ts +14 -0
- package/dist/spawn-cooldown.d.ts.map +1 -0
- package/dist/spawn-cooldown.js +34 -0
- package/dist/spawn-cooldown.js.map +1 -0
- package/dist/spawn-environment.d.ts +35 -0
- package/dist/spawn-environment.d.ts.map +1 -0
- package/dist/spawn-environment.js +48 -0
- package/dist/spawn-environment.js.map +1 -0
- package/dist/spawner-liveness.d.ts +23 -0
- package/dist/spawner-liveness.d.ts.map +1 -0
- package/dist/spawner-liveness.js +99 -0
- package/dist/spawner-liveness.js.map +1 -0
- package/dist/spawner-resolution.d.ts +27 -0
- package/dist/spawner-resolution.d.ts.map +1 -0
- package/dist/spawner-resolution.js +99 -0
- package/dist/spawner-resolution.js.map +1 -0
- package/dist/spawner-timeout.d.ts +32 -0
- package/dist/spawner-timeout.d.ts.map +1 -0
- package/dist/spawner-timeout.js +124 -0
- package/dist/spawner-timeout.js.map +1 -0
- package/dist/spawner.d.ts +77 -0
- package/dist/spawner.d.ts.map +1 -0
- package/dist/spawner.js +734 -0
- package/dist/spawner.js.map +1 -0
- package/dist/strategy-completion.d.ts +110 -0
- package/dist/strategy-completion.d.ts.map +1 -0
- package/dist/strategy-completion.js +434 -0
- package/dist/strategy-completion.js.map +1 -0
- package/dist/strategy-engine.d.ts +47 -0
- package/dist/strategy-engine.d.ts.map +1 -0
- package/dist/strategy-engine.js +419 -0
- package/dist/strategy-engine.js.map +1 -0
- package/dist/strategy-executor.d.ts +93 -0
- package/dist/strategy-executor.d.ts.map +1 -0
- package/dist/strategy-executor.js +775 -0
- package/dist/strategy-executor.js.map +1 -0
- package/dist/strategy-lifecycle.d.ts +61 -0
- package/dist/strategy-lifecycle.d.ts.map +1 -0
- package/dist/strategy-lifecycle.js +516 -0
- package/dist/strategy-lifecycle.js.map +1 -0
- package/dist/strategy-merge.d.ts +72 -0
- package/dist/strategy-merge.d.ts.map +1 -0
- package/dist/strategy-merge.js +371 -0
- package/dist/strategy-merge.js.map +1 -0
- package/dist/strategy-prompt-builder.d.ts +62 -0
- package/dist/strategy-prompt-builder.d.ts.map +1 -0
- package/dist/strategy-prompt-builder.js +538 -0
- package/dist/strategy-prompt-builder.js.map +1 -0
- package/dist/strategy-provisioning.d.ts +16 -0
- package/dist/strategy-provisioning.d.ts.map +1 -0
- package/dist/strategy-provisioning.js +119 -0
- package/dist/strategy-provisioning.js.map +1 -0
- package/dist/strategy-team-state.d.ts +24 -0
- package/dist/strategy-team-state.d.ts.map +1 -0
- package/dist/strategy-team-state.js +43 -0
- package/dist/strategy-team-state.js.map +1 -0
- package/dist/strategy-teardown.d.ts +24 -0
- package/dist/strategy-teardown.d.ts.map +1 -0
- package/dist/strategy-teardown.js +158 -0
- package/dist/strategy-teardown.js.map +1 -0
- package/dist/strategy-worktree-state.d.ts +47 -0
- package/dist/strategy-worktree-state.d.ts.map +1 -0
- package/dist/strategy-worktree-state.js +104 -0
- package/dist/strategy-worktree-state.js.map +1 -0
- package/dist/supabase.d.ts +36 -0
- package/dist/supabase.d.ts.map +1 -0
- package/dist/supabase.js +50 -0
- package/dist/supabase.js.map +1 -0
- package/dist/task-converter.d.ts +61 -0
- package/dist/task-converter.d.ts.map +1 -0
- package/dist/task-converter.js +286 -0
- package/dist/task-converter.js.map +1 -0
- package/dist/task-dag-builder.d.ts +14 -0
- package/dist/task-dag-builder.d.ts.map +1 -0
- package/dist/task-dag-builder.js +17 -0
- package/dist/task-dag-builder.js.map +1 -0
- package/dist/team-prompt-base.d.ts +114 -0
- package/dist/team-prompt-base.d.ts.map +1 -0
- package/dist/team-prompt-base.js +531 -0
- package/dist/team-prompt-base.js.map +1 -0
- package/dist/team-prompt-variants.d.ts +27 -0
- package/dist/team-prompt-variants.d.ts.map +1 -0
- package/dist/team-prompt-variants.js +134 -0
- package/dist/team-prompt-variants.js.map +1 -0
- package/dist/team-spawner.d.ts +50 -0
- package/dist/team-spawner.d.ts.map +1 -0
- package/dist/team-spawner.js +410 -0
- package/dist/team-spawner.js.map +1 -0
- package/dist/telemetry-writer.d.ts +66 -0
- package/dist/telemetry-writer.d.ts.map +1 -0
- package/dist/telemetry-writer.js +96 -0
- package/dist/telemetry-writer.js.map +1 -0
- package/dist/trigger-executor.d.ts +56 -0
- package/dist/trigger-executor.d.ts.map +1 -0
- package/dist/trigger-executor.js +313 -0
- package/dist/trigger-executor.js.map +1 -0
- package/dist/types/config.d.ts +60 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/dag.d.ts +53 -0
- package/dist/types/dag.d.ts.map +1 -0
- package/dist/types/dag.js +5 -0
- package/dist/types/dag.js.map +1 -0
- package/dist/types/delivery.d.ts +71 -0
- package/dist/types/delivery.d.ts.map +1 -0
- package/dist/types/delivery.js +5 -0
- package/dist/types/delivery.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/issue.d.ts +22 -0
- package/dist/types/issue.d.ts.map +1 -0
- package/dist/types/issue.js +5 -0
- package/dist/types/issue.js.map +1 -0
- package/dist/types/merge.d.ts +28 -0
- package/dist/types/merge.d.ts.map +1 -0
- package/dist/types/merge.js +5 -0
- package/dist/types/merge.js.map +1 -0
- package/dist/types/session.d.ts +98 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +5 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/strategy.d.ts +175 -0
- package/dist/types/strategy.d.ts.map +1 -0
- package/dist/types/strategy.js +5 -0
- package/dist/types/strategy.js.map +1 -0
- package/dist/types/workflow.d.ts +34 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +9 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/unified-init.d.ts +16 -0
- package/dist/unified-init.d.ts.map +1 -0
- package/dist/unified-init.js +183 -0
- package/dist/unified-init.js.map +1 -0
- package/dist/unified-shell-config.d.ts +34 -0
- package/dist/unified-shell-config.d.ts.map +1 -0
- package/dist/unified-shell-config.js +238 -0
- package/dist/unified-shell-config.js.map +1 -0
- package/dist/unified-shell-status.d.ts +15 -0
- package/dist/unified-shell-status.d.ts.map +1 -0
- package/dist/unified-shell-status.js +100 -0
- package/dist/unified-shell-status.js.map +1 -0
- package/dist/unified-shell.d.ts +50 -0
- package/dist/unified-shell.d.ts.map +1 -0
- package/dist/unified-shell.js +682 -0
- package/dist/unified-shell.js.map +1 -0
- package/dist/version-check.d.ts +19 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +67 -0
- package/dist/version-check.js.map +1 -0
- package/dist/workflow-engine.d.ts +95 -0
- package/dist/workflow-engine.d.ts.map +1 -0
- package/dist/workflow-engine.js +165 -0
- package/dist/workflow-engine.js.map +1 -0
- package/dist/worktree-merge.d.ts +23 -0
- package/dist/worktree-merge.d.ts.map +1 -0
- package/dist/worktree-merge.js +57 -0
- package/dist/worktree-merge.js.map +1 -0
- package/dist/worktree-safety.d.ts +48 -0
- package/dist/worktree-safety.d.ts.map +1 -0
- package/dist/worktree-safety.js +113 -0
- package/dist/worktree-safety.js.map +1 -0
- package/dist/worktree-strategy.d.ts +69 -0
- package/dist/worktree-strategy.d.ts.map +1 -0
- package/dist/worktree-strategy.js +214 -0
- package/dist/worktree-strategy.js.map +1 -0
- package/dist/worktree.d.ts +159 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +512 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +76 -0
- package/scripts/telora-daemon-wrapper.sh +31 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent worktree provisioning for active strategies.
|
|
3
|
+
*
|
|
4
|
+
* Creates worktrees for active strategies that don't have one yet,
|
|
5
|
+
* adopts existing worktrees on disk, and rebases onto integration.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { installAuditPreCommitHook } from './audit-hooks.js';
|
|
10
|
+
import { getReadyStrategies } from './supabase.js';
|
|
11
|
+
import { createWorktree, syncIntegrationWithMain, runGitSync, ensureMcpServerInWorktree } from './git.js';
|
|
12
|
+
import { symlinkEnvFiles } from './qa-provisioner.js';
|
|
13
|
+
import { generateStrategyBranchName } from './strategy-executor.js';
|
|
14
|
+
import { setStrategyWorktree, hasStrategyWorktree, } from './strategy-worktree-state.js';
|
|
15
|
+
/**
|
|
16
|
+
* Ensure persistent worktrees exist for all active strategies.
|
|
17
|
+
*
|
|
18
|
+
* Called each poll cycle BEFORE processReadyStrategies(). Creates
|
|
19
|
+
* worktrees for active strategies that don't have one yet.
|
|
20
|
+
* Syncs integration with main once per cycle (not per strategy).
|
|
21
|
+
*/
|
|
22
|
+
export async function ensureStrategyWorktrees(config, roles) {
|
|
23
|
+
let readyStrategies;
|
|
24
|
+
try {
|
|
25
|
+
readyStrategies = await getReadyStrategies(config.organizationId, config.productId);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.warn(`[strategy-lifecycle] Failed to query ready strategies for worktree provisioning: ${err.message}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Find strategies that need worktrees
|
|
32
|
+
const needsWorktree = readyStrategies.filter(s => !hasStrategyWorktree(s.strategy_id));
|
|
33
|
+
if (needsWorktree.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
// Sync integration with main once before creating any worktrees
|
|
36
|
+
try {
|
|
37
|
+
const syncResult = await syncIntegrationWithMain(config);
|
|
38
|
+
if (syncResult.success) {
|
|
39
|
+
console.log(`[strategy-lifecycle] Synced integration with main before worktree provisioning`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.warn(`[strategy-lifecycle] Could not sync integration with main: ${syncResult.error}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.warn(`[strategy-lifecycle] Sync failed (continuing): ${err instanceof Error ? err.message : String(err)}`);
|
|
47
|
+
}
|
|
48
|
+
for (const strategy of needsWorktree) {
|
|
49
|
+
const role = roles.get(strategy.assigned_agent_role_id);
|
|
50
|
+
if (!role) {
|
|
51
|
+
console.warn(`[strategy-lifecycle] Unknown agent role ${strategy.assigned_agent_role_id} for strategy "${strategy.strategy_name}", skipping worktree`);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const branchName = generateStrategyBranchName(role, strategy.strategy_name, strategy.strategy_id);
|
|
55
|
+
const worktreePath = join(config.worktreeDir, branchName.replace(/\//g, '-'));
|
|
56
|
+
// Check if a valid worktree already exists on disk (e.g., after daemon restart
|
|
57
|
+
// or reactivation). Adopt it instead of destroying and rebuilding.
|
|
58
|
+
if (existsSync(worktreePath)) {
|
|
59
|
+
const gitDirResult = runGitSync(['rev-parse', '--git-dir'], worktreePath);
|
|
60
|
+
const branchResult = runGitSync(['rev-parse', '--abbrev-ref', 'HEAD'], worktreePath);
|
|
61
|
+
if (gitDirResult.success && branchResult.success && branchResult.output === branchName) {
|
|
62
|
+
// Valid worktree on the expected branch -- adopt it
|
|
63
|
+
console.log(`[strategy-lifecycle] Adopting existing worktree for "${strategy.strategy_name}": ${worktreePath}`);
|
|
64
|
+
setStrategyWorktree(strategy.strategy_id, {
|
|
65
|
+
strategyId: strategy.strategy_id,
|
|
66
|
+
strategyName: strategy.strategy_name,
|
|
67
|
+
worktreePath,
|
|
68
|
+
branchName,
|
|
69
|
+
createdAt: new Date(),
|
|
70
|
+
hasQaDevServer: false,
|
|
71
|
+
});
|
|
72
|
+
// Rebase onto integration to bring it current
|
|
73
|
+
const rebaseResult = runGitSync(['rebase', config.integrationBranch], worktreePath);
|
|
74
|
+
if (!rebaseResult.success) {
|
|
75
|
+
runGitSync(['rebase', '--abort'], worktreePath);
|
|
76
|
+
console.warn(`[strategy-lifecycle] Could not rebase adopted worktree for "${strategy.strategy_name}" onto integration. Continuing with existing state.`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.log(`[strategy-lifecycle] Rebased adopted worktree for "${strategy.strategy_name}" onto ${config.integrationBranch}`);
|
|
80
|
+
}
|
|
81
|
+
// Symlink env files and MCP server dist from main repo into worktree
|
|
82
|
+
symlinkEnvFiles(config.repoPath, worktreePath);
|
|
83
|
+
ensureMcpServerInWorktree(config.repoPath, worktreePath);
|
|
84
|
+
// Install audit pre-commit hook for read-only strategies
|
|
85
|
+
if (strategy.read_only) {
|
|
86
|
+
installAuditPreCommitHook(worktreePath);
|
|
87
|
+
console.log(`[strategy-lifecycle] Installed audit pre-commit hook for "${strategy.strategy_name}"`);
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Directory exists but is not a valid worktree for this branch -- fall through to createWorktree
|
|
92
|
+
console.log(`[strategy-lifecycle] Existing directory at ${worktreePath} is not a valid worktree for ${branchName}, recreating`);
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const createdPath = await createWorktree(config, branchName);
|
|
96
|
+
setStrategyWorktree(strategy.strategy_id, {
|
|
97
|
+
strategyId: strategy.strategy_id,
|
|
98
|
+
strategyName: strategy.strategy_name,
|
|
99
|
+
worktreePath: createdPath,
|
|
100
|
+
branchName,
|
|
101
|
+
createdAt: new Date(),
|
|
102
|
+
hasQaDevServer: false,
|
|
103
|
+
});
|
|
104
|
+
console.log(`[strategy-lifecycle] Created persistent worktree for "${strategy.strategy_name}": ${createdPath}`);
|
|
105
|
+
// Symlink env files from main repo into worktree
|
|
106
|
+
symlinkEnvFiles(config.repoPath, createdPath);
|
|
107
|
+
// Install audit pre-commit hook for read-only strategies
|
|
108
|
+
if (strategy.read_only) {
|
|
109
|
+
installAuditPreCommitHook(createdPath);
|
|
110
|
+
console.log(`[strategy-lifecycle] Installed audit pre-commit hook for "${strategy.strategy_name}"`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
console.error(`[strategy-lifecycle] Failed to create worktree for "${strategy.strategy_name}": ${err instanceof Error ? err.message : String(err)}`);
|
|
115
|
+
// Continue with other strategies
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=strategy-provisioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-provisioning.js","sourceRoot":"","sources":["../src/strategy-provisioning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy team state management.
|
|
3
|
+
*
|
|
4
|
+
* Tracks active strategy teams in memory and provides
|
|
5
|
+
* query/mutation helpers for the active teams map.
|
|
6
|
+
*/
|
|
7
|
+
import type { StrategyTeamState, StrategyExecutionConfig, PipelineConfig } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Get all active strategy teams.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getActiveTeams(): Map<string, StrategyTeamState>;
|
|
12
|
+
/**
|
|
13
|
+
* Check if a strategy already has an active team.
|
|
14
|
+
*/
|
|
15
|
+
export declare function hasActiveTeam(strategyId: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Get count of active teams.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getActiveTeamCount(): number;
|
|
20
|
+
/**
|
|
21
|
+
* Derive execution config from strategy pipeline config.
|
|
22
|
+
*/
|
|
23
|
+
export declare function deriveExecutionConfig(_pipelineConfig: PipelineConfig | null): StrategyExecutionConfig;
|
|
24
|
+
//# sourceMappingURL=strategy-team-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-team-state.d.ts","sourceRoot":"","sources":["../src/strategy-team-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACf,MAAM,YAAY,CAAC;AAOpB;;GAEG;AACH,wBAAgB,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAE/D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAUD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,cAAc,GAAG,IAAI,GAAG,uBAAuB,CAKrG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy team state management.
|
|
3
|
+
*
|
|
4
|
+
* Tracks active strategy teams in memory and provides
|
|
5
|
+
* query/mutation helpers for the active teams map.
|
|
6
|
+
*/
|
|
7
|
+
// ── Active teams tracking ────────────────────────────────────────────
|
|
8
|
+
/** Active strategy teams: strategyId -> StrategyTeamState */
|
|
9
|
+
const activeTeams = new Map();
|
|
10
|
+
/**
|
|
11
|
+
* Get all active strategy teams.
|
|
12
|
+
*/
|
|
13
|
+
export function getActiveTeams() {
|
|
14
|
+
return activeTeams;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if a strategy already has an active team.
|
|
18
|
+
*/
|
|
19
|
+
export function hasActiveTeam(strategyId) {
|
|
20
|
+
return activeTeams.has(strategyId);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get count of active teams.
|
|
24
|
+
*/
|
|
25
|
+
export function getActiveTeamCount() {
|
|
26
|
+
return activeTeams.size;
|
|
27
|
+
}
|
|
28
|
+
// ── Default execution config ─────────────────────────────────────────
|
|
29
|
+
const DEFAULT_EXECUTION_CONFIG = {
|
|
30
|
+
maxWorkers: 3,
|
|
31
|
+
idlePollIntervalMs: 30000,
|
|
32
|
+
activePollIntervalMs: 60000,
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Derive execution config from strategy pipeline config.
|
|
36
|
+
*/
|
|
37
|
+
export function deriveExecutionConfig(_pipelineConfig) {
|
|
38
|
+
// For now, use defaults. The teams.enabled flag in pipelineConfig
|
|
39
|
+
// is deprecated — teams are always the execution model.
|
|
40
|
+
// Future: pipelineConfig could specify maxWorkers or parallelism level.
|
|
41
|
+
return { ...DEFAULT_EXECUTION_CONFIG };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=strategy-team-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-team-state.js","sourceRoot":"","sources":["../src/strategy-team-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,wEAAwE;AAExE,6DAA6D;AAC7D,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,CAAC,IAAI,CAAC;AAC1B,CAAC;AAED,wEAAwE;AAExE,MAAM,wBAAwB,GAA4B;IACxD,UAAU,EAAE,CAAC;IACb,kBAAkB,EAAE,KAAK;IACzB,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,eAAsC;IAC1E,kEAAkE;IAClE,wDAAwD;IACxD,wEAAwE;IACxE,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy teardown and deactivation detection.
|
|
3
|
+
*
|
|
4
|
+
* Coordinated teardown stops QA, terminates the team, commits WIP,
|
|
5
|
+
* and removes the worktree. Deactivation detection polls for strategies
|
|
6
|
+
* that have been unassigned and triggers their teardown.
|
|
7
|
+
*/
|
|
8
|
+
import type { DaemonConfig } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Tear down a single strategy: stop QA, terminate team, remove worktree.
|
|
11
|
+
*
|
|
12
|
+
* Each step is independently try/caught so a failure in one
|
|
13
|
+
* does not prevent the others from running.
|
|
14
|
+
*/
|
|
15
|
+
export declare function teardownStrategy(config: DaemonConfig, strategyId: string, strategyName: string): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Detect deactivated strategies and tear them down.
|
|
18
|
+
*
|
|
19
|
+
* Replaces both detectDeactivatedStrategies() from strategy-executor.ts
|
|
20
|
+
* and checkQaForDeactivatedStrategies() from qa-orchestrator.ts.
|
|
21
|
+
* A single pass handles both team termination and QA cleanup.
|
|
22
|
+
*/
|
|
23
|
+
export declare function checkForDeactivatedStrategies(config: DaemonConfig): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=strategy-teardown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-teardown.d.ts","sourceRoot":"","sources":["../src/strategy-teardown.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAgGf;AAED;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAuCf"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy teardown and deactivation detection.
|
|
3
|
+
*
|
|
4
|
+
* Coordinated teardown stops QA, terminates the team, commits WIP,
|
|
5
|
+
* and removes the worktree. Deactivation detection polls for strategies
|
|
6
|
+
* that have been unassigned and triggers their teardown.
|
|
7
|
+
*/
|
|
8
|
+
import { getActiveStrategies, updateQaStatus } from './supabase.js';
|
|
9
|
+
import { safeRemoveStrategyWorktree, commitWipChanges } from './git.js';
|
|
10
|
+
import { terminateTeam, waitForTeamExit } from './strategy-executor.js';
|
|
11
|
+
import { getActiveTeams } from './strategy-team-state.js';
|
|
12
|
+
import { getStrategyWorktree, getAllStrategyWorktrees, } from './strategy-worktree-state.js';
|
|
13
|
+
import { escalateMergeConflict } from './strategy-merge.js';
|
|
14
|
+
import { getQaEnvironment, removeQaEnvironment } from './qa-state.js';
|
|
15
|
+
import { stopQaDevServer } from './qa-dev-server.js';
|
|
16
|
+
/**
|
|
17
|
+
* Tear down a single strategy: stop QA, terminate team, remove worktree.
|
|
18
|
+
*
|
|
19
|
+
* Each step is independently try/caught so a failure in one
|
|
20
|
+
* does not prevent the others from running.
|
|
21
|
+
*/
|
|
22
|
+
export async function teardownStrategy(config, strategyId, strategyName) {
|
|
23
|
+
console.log(`[strategy-lifecycle] Tearing down strategy "${strategyName}"`);
|
|
24
|
+
// 1. Stop QA dev server if running
|
|
25
|
+
try {
|
|
26
|
+
const qaState = getQaEnvironment(strategyId);
|
|
27
|
+
if (qaState?.pid) {
|
|
28
|
+
console.log(`[strategy-lifecycle] Stopping QA dev server for "${strategyName}" (PID: ${qaState.pid})`);
|
|
29
|
+
await stopQaDevServer(qaState.pid);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.warn(`[strategy-lifecycle] Failed to stop QA dev server for "${strategyName}": ${err.message}`);
|
|
34
|
+
}
|
|
35
|
+
// 2. Clear QA in-memory state
|
|
36
|
+
try {
|
|
37
|
+
removeQaEnvironment(strategyId);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.warn(`[strategy-lifecycle] Failed to clear QA state for "${strategyName}": ${err.message}`);
|
|
41
|
+
}
|
|
42
|
+
// 3. Clear QA DB state
|
|
43
|
+
try {
|
|
44
|
+
await updateQaStatus(strategyId, {
|
|
45
|
+
qaStatus: null,
|
|
46
|
+
qaUrl: null,
|
|
47
|
+
qaPort: null,
|
|
48
|
+
qaWorktreePath: null,
|
|
49
|
+
qaReadyAt: null,
|
|
50
|
+
qaError: null,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
console.warn(`[strategy-lifecycle] Failed to clear QA DB state for "${strategyName}": ${err.message}`);
|
|
55
|
+
}
|
|
56
|
+
// 4. Terminate agent team and wait for process exit
|
|
57
|
+
try {
|
|
58
|
+
const activeTeams = getActiveTeams();
|
|
59
|
+
const team = activeTeams.get(strategyId);
|
|
60
|
+
if (team && team.phase !== 'shutting_down' && team.phase !== 'terminated') {
|
|
61
|
+
console.log(`[strategy-lifecycle] Terminating team for "${strategyName}"`);
|
|
62
|
+
terminateTeam(strategyId);
|
|
63
|
+
// Wait for process to actually exit (default 30s, then SIGKILL)
|
|
64
|
+
const exited = await waitForTeamExit(strategyId);
|
|
65
|
+
if (!exited) {
|
|
66
|
+
console.warn(`[strategy-lifecycle] Team for "${strategyName}" did not exit cleanly after SIGKILL`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
console.warn(`[strategy-lifecycle] Failed to terminate team for "${strategyName}": ${err.message}`);
|
|
72
|
+
}
|
|
73
|
+
// 4b. Commit any uncommitted WIP changes left by the agent
|
|
74
|
+
try {
|
|
75
|
+
const worktreeInfo = getStrategyWorktree(strategyId);
|
|
76
|
+
if (worktreeInfo) {
|
|
77
|
+
commitWipChanges(worktreeInfo.worktreePath, strategyName);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
console.warn(`[strategy-lifecycle] WIP commit failed for "${strategyName}": ${err.message}`);
|
|
82
|
+
}
|
|
83
|
+
// 5. Remove strategy worktree via canonical path (merge-before-remove + conditional state cleanup).
|
|
84
|
+
try {
|
|
85
|
+
const worktreeInfo = getStrategyWorktree(strategyId);
|
|
86
|
+
if (worktreeInfo) {
|
|
87
|
+
console.log(`[strategy-lifecycle] Removing worktree for "${strategyName}": ${worktreeInfo.worktreePath}`);
|
|
88
|
+
const removeResult = await safeRemoveStrategyWorktree({
|
|
89
|
+
config,
|
|
90
|
+
worktreePath: worktreeInfo.worktreePath,
|
|
91
|
+
branchName: worktreeInfo.branchName,
|
|
92
|
+
deliveryName: strategyName,
|
|
93
|
+
deliveryId: strategyId,
|
|
94
|
+
strategyId,
|
|
95
|
+
});
|
|
96
|
+
// Escalate if merge failed (worktree preserved with unmerged work)
|
|
97
|
+
if (removeResult.merged && removeResult.mergeError) {
|
|
98
|
+
escalateMergeConflict({
|
|
99
|
+
organizationId: config.organizationId,
|
|
100
|
+
sessionId: '',
|
|
101
|
+
deliveryId: strategyId,
|
|
102
|
+
deliveryName: strategyName,
|
|
103
|
+
branchName: worktreeInfo.branchName,
|
|
104
|
+
integrationBranch: config.integrationBranch,
|
|
105
|
+
mergeError: removeResult.mergeError,
|
|
106
|
+
}).catch(err => console.warn(`[strategy-lifecycle] escalateMergeConflict failed for "${strategyName}": ${err.message}`));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.warn(`[strategy-lifecycle] Failed to remove worktree for "${strategyName}": ${err.message}`);
|
|
112
|
+
}
|
|
113
|
+
console.log(`[strategy-lifecycle] Teardown complete for "${strategyName}"`);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Detect deactivated strategies and tear them down.
|
|
117
|
+
*
|
|
118
|
+
* Replaces both detectDeactivatedStrategies() from strategy-executor.ts
|
|
119
|
+
* and checkQaForDeactivatedStrategies() from qa-orchestrator.ts.
|
|
120
|
+
* A single pass handles both team termination and QA cleanup.
|
|
121
|
+
*/
|
|
122
|
+
export async function checkForDeactivatedStrategies(config) {
|
|
123
|
+
const allWorktrees = getAllStrategyWorktrees();
|
|
124
|
+
const activeTeams = getActiveTeams();
|
|
125
|
+
// Nothing to check if no worktrees and no teams
|
|
126
|
+
if (allWorktrees.size === 0 && activeTeams.size === 0)
|
|
127
|
+
return;
|
|
128
|
+
let activeStrategyIds;
|
|
129
|
+
try {
|
|
130
|
+
// Use getActiveStrategies (not getReadyStrategies) -- a strategy is "active" even
|
|
131
|
+
// when all deliveries are done. Worktrees must persist for QA and idle queues.
|
|
132
|
+
const activeStrategies = await getActiveStrategies(config.organizationId, config.productId);
|
|
133
|
+
activeStrategyIds = new Set(activeStrategies.map(s => s.strategy_id));
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
console.warn(`[strategy-lifecycle] Cannot determine active strategies (skipping deactivation check): ${err.message}`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// Collect all strategy IDs that have either a worktree or an active team
|
|
140
|
+
const trackedStrategyIds = new Set([
|
|
141
|
+
...allWorktrees.keys(),
|
|
142
|
+
...activeTeams.keys(),
|
|
143
|
+
]);
|
|
144
|
+
for (const strategyId of trackedStrategyIds) {
|
|
145
|
+
if (activeStrategyIds.has(strategyId))
|
|
146
|
+
continue;
|
|
147
|
+
const worktreeInfo = getStrategyWorktree(strategyId);
|
|
148
|
+
const team = activeTeams.get(strategyId);
|
|
149
|
+
const name = worktreeInfo?.strategyName ?? team?.strategyName ?? strategyId;
|
|
150
|
+
// Skip teams already shutting down
|
|
151
|
+
if (team && (team.phase === 'shutting_down' || team.phase === 'terminated') && !worktreeInfo) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
console.log(`[strategy-lifecycle] Strategy "${name}" deactivated -- coordinated teardown`);
|
|
155
|
+
await teardownStrategy(config, strategyId, name);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=strategy-teardown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-teardown.js","sourceRoot":"","sources":["../src/strategy-teardown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy worktree state management — write-through cache.
|
|
3
|
+
*
|
|
4
|
+
* Tracks persistent strategy worktrees using a local Map as the
|
|
5
|
+
* synchronous read cache, backed by the strategy_worktrees DB table.
|
|
6
|
+
*
|
|
7
|
+
* Read path: all get/has/getAll calls are synchronous (Map lookup).
|
|
8
|
+
* Write path: update Map immediately, then fire async DB write.
|
|
9
|
+
* Startup: hydrateFromDb() loads all records from DB into the Map.
|
|
10
|
+
*
|
|
11
|
+
* The Map is authoritative during runtime. The DB is authoritative
|
|
12
|
+
* across restarts. Async DB writes are fire-and-forget with logging.
|
|
13
|
+
*/
|
|
14
|
+
import type { StrategyWorktreeInfo } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Hydrate the in-memory cache from the database.
|
|
17
|
+
*
|
|
18
|
+
* Call once during daemon startup, BEFORE rebuildStrategyWorktreeState.
|
|
19
|
+
* Stores the productId for subsequent write-through operations.
|
|
20
|
+
*/
|
|
21
|
+
export declare function hydrateFromDb(productId: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Get a single strategy worktree by strategy ID.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getStrategyWorktree(strategyId: string): StrategyWorktreeInfo | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Add or update a strategy worktree entry.
|
|
28
|
+
*
|
|
29
|
+
* Updates the Map synchronously, then fires an async DB upsert.
|
|
30
|
+
*/
|
|
31
|
+
export declare function setStrategyWorktree(strategyId: string, info: StrategyWorktreeInfo): void;
|
|
32
|
+
/**
|
|
33
|
+
* Remove a strategy worktree entry.
|
|
34
|
+
* Returns whether the entry existed.
|
|
35
|
+
*
|
|
36
|
+
* Deletes from Map synchronously, then fires an async DB remove.
|
|
37
|
+
*/
|
|
38
|
+
export declare function removeStrategyWorktree(strategyId: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Get all strategy worktrees.
|
|
41
|
+
*/
|
|
42
|
+
export declare function getAllStrategyWorktrees(): Map<string, StrategyWorktreeInfo>;
|
|
43
|
+
/**
|
|
44
|
+
* Check if a strategy has a persistent worktree.
|
|
45
|
+
*/
|
|
46
|
+
export declare function hasStrategyWorktree(strategyId: string): boolean;
|
|
47
|
+
//# sourceMappingURL=strategy-worktree-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-worktree-state.d.ts","sourceRoot":"","sources":["../src/strategy-worktree-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAgBvD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAExF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAgBxF;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAclE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAE3E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE/D"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategy worktree state management — write-through cache.
|
|
3
|
+
*
|
|
4
|
+
* Tracks persistent strategy worktrees using a local Map as the
|
|
5
|
+
* synchronous read cache, backed by the strategy_worktrees DB table.
|
|
6
|
+
*
|
|
7
|
+
* Read path: all get/has/getAll calls are synchronous (Map lookup).
|
|
8
|
+
* Write path: update Map immediately, then fire async DB write.
|
|
9
|
+
* Startup: hydrateFromDb() loads all records from DB into the Map.
|
|
10
|
+
*
|
|
11
|
+
* The Map is authoritative during runtime. The DB is authoritative
|
|
12
|
+
* across restarts. Async DB writes are fire-and-forget with logging.
|
|
13
|
+
*/
|
|
14
|
+
import { upsertWorktreeRecord, removeWorktreeRecord, listWorktreeRecords, } from './queries/worktrees.js';
|
|
15
|
+
// ── Module-level config ──────────────────────────────────────────────
|
|
16
|
+
let configuredProductId = null;
|
|
17
|
+
// ── Persistent worktree tracking ─────────────────────────────────────
|
|
18
|
+
/** Persistent strategy worktrees: strategyId -> StrategyWorktreeInfo */
|
|
19
|
+
const strategyWorktrees = new Map();
|
|
20
|
+
/**
|
|
21
|
+
* Hydrate the in-memory cache from the database.
|
|
22
|
+
*
|
|
23
|
+
* Call once during daemon startup, BEFORE rebuildStrategyWorktreeState.
|
|
24
|
+
* Stores the productId for subsequent write-through operations.
|
|
25
|
+
*/
|
|
26
|
+
export async function hydrateFromDb(productId) {
|
|
27
|
+
configuredProductId = productId;
|
|
28
|
+
let records;
|
|
29
|
+
try {
|
|
30
|
+
records = await listWorktreeRecords(productId);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.warn(`[worktree-state] Failed to hydrate from DB, starting with empty cache:`, err.message);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
let hydrated = 0;
|
|
37
|
+
for (const record of records) {
|
|
38
|
+
strategyWorktrees.set(record.strategyId, {
|
|
39
|
+
strategyId: record.strategyId,
|
|
40
|
+
strategyName: '', // Not stored in DB — rebuilt by callers
|
|
41
|
+
worktreePath: record.worktreePath,
|
|
42
|
+
branchName: record.branchName,
|
|
43
|
+
createdAt: new Date(record.createdAt),
|
|
44
|
+
hasQaDevServer: false, // Runtime-only state
|
|
45
|
+
});
|
|
46
|
+
hydrated++;
|
|
47
|
+
}
|
|
48
|
+
if (hydrated > 0) {
|
|
49
|
+
console.log(`[worktree-state] Hydrated ${hydrated} worktree(s) from DB`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get a single strategy worktree by strategy ID.
|
|
54
|
+
*/
|
|
55
|
+
export function getStrategyWorktree(strategyId) {
|
|
56
|
+
return strategyWorktrees.get(strategyId);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Add or update a strategy worktree entry.
|
|
60
|
+
*
|
|
61
|
+
* Updates the Map synchronously, then fires an async DB upsert.
|
|
62
|
+
*/
|
|
63
|
+
export function setStrategyWorktree(strategyId, info) {
|
|
64
|
+
strategyWorktrees.set(strategyId, info);
|
|
65
|
+
// Write-through: async DB upsert (fire-and-forget)
|
|
66
|
+
upsertWorktreeRecord({
|
|
67
|
+
strategyId,
|
|
68
|
+
productId: configuredProductId,
|
|
69
|
+
worktreePath: info.worktreePath,
|
|
70
|
+
branchName: info.branchName,
|
|
71
|
+
status: 'active',
|
|
72
|
+
}).catch((err) => {
|
|
73
|
+
console.warn(`[worktree-state] DB upsert failed for strategy ${strategyId}:`, err.message);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Remove a strategy worktree entry.
|
|
78
|
+
* Returns whether the entry existed.
|
|
79
|
+
*
|
|
80
|
+
* Deletes from Map synchronously, then fires an async DB remove.
|
|
81
|
+
*/
|
|
82
|
+
export function removeStrategyWorktree(strategyId) {
|
|
83
|
+
const existed = strategyWorktrees.delete(strategyId);
|
|
84
|
+
if (existed) {
|
|
85
|
+
// Write-through: async DB remove (fire-and-forget)
|
|
86
|
+
removeWorktreeRecord(strategyId).catch((err) => {
|
|
87
|
+
console.warn(`[worktree-state] DB remove failed for strategy ${strategyId}:`, err.message);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return existed;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get all strategy worktrees.
|
|
94
|
+
*/
|
|
95
|
+
export function getAllStrategyWorktrees() {
|
|
96
|
+
return strategyWorktrees;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if a strategy has a persistent worktree.
|
|
100
|
+
*/
|
|
101
|
+
export function hasStrategyWorktree(strategyId) {
|
|
102
|
+
return strategyWorktrees.has(strategyId);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=strategy-worktree-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy-worktree-state.js","sourceRoot":"","sources":["../src/strategy-worktree-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telora API client for the daemon.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports all query functions from domain-specific modules
|
|
5
|
+
* under queries/. The API client infrastructure (callApi, circuit breaker,
|
|
6
|
+
* config) lives in queries/shared.ts.
|
|
7
|
+
*
|
|
8
|
+
* All existing imports from './supabase.js' continue to work unchanged.
|
|
9
|
+
*/
|
|
10
|
+
export { initSupabase, validateTrackerAuth } from './queries/shared.js';
|
|
11
|
+
export { getAgentRoles, getAgentRole } from './queries/roles.js';
|
|
12
|
+
export { getActiveSessions, getActiveSessionCountByRole, getCompletedSessionAggregates, createSession, updateSession, } from './queries/sessions.js';
|
|
13
|
+
export type { CreateSessionParams, SessionAggregates } from './queries/sessions.js';
|
|
14
|
+
export { getReadyDeliveries, getDeliveryContext, updateDeliveryStatus, updateDeliveryMergeCommitSha, getDoneDeliveries, getReadyStrategies, getActiveStrategies, getMergeConflictDeliveries, reportGitState, } from './queries/deliveries.js';
|
|
15
|
+
export { fetchEffectiveWorkflow, fetchEffectiveWorkflowWithTransitions } from './queries/workflows.js';
|
|
16
|
+
export { getDeliveryIssues, getDeliverySessionCount, updateIssueStatus, createEscalation, createIssue, } from './queries/issues.js';
|
|
17
|
+
export type { CreateEscalationParams } from './queries/issues.js';
|
|
18
|
+
export { fetchTransitionGuards, createTransitionEvaluation, createTransitionBlock, getActiveTransitionBlock, getResolvedTransitionBlockForDelivery, } from './queries/guards.js';
|
|
19
|
+
export { sendHeartbeat, sendDisconnect } from './queries/daemon-connection.js';
|
|
20
|
+
export { getStrategyDeliveries, getStrategyIssues, getReviewRequests, clearReviewRequest, } from './queries/strategies.js';
|
|
21
|
+
export type { ReviewRequest } from './queries/strategies.js';
|
|
22
|
+
export { upsertWorktreeRecord, removeWorktreeRecord, listWorktreeRecords, } from './queries/worktrees.js';
|
|
23
|
+
export type { WorktreeRecord } from './queries/worktrees.js';
|
|
24
|
+
export { getQaRequests, updateQaStatus, getDeactivatedQaStrategies, getQaStrategies } from './queries/qa.js';
|
|
25
|
+
export { getProductQaRequests, updateProductQaStatus, getProductQaStatus } from './queries/qa.js';
|
|
26
|
+
export { getControlStateChanges, setControlStateRunning, } from './queries/control-state.js';
|
|
27
|
+
export type { ControlStateChange } from './queries/control-state.js';
|
|
28
|
+
/**
|
|
29
|
+
* @deprecated Use getReadyDeliveries instead
|
|
30
|
+
*/
|
|
31
|
+
export declare function getAgentAssignedIssues(_organizationId: string): Promise<never[]>;
|
|
32
|
+
/**
|
|
33
|
+
* @deprecated Not needed with HTTP API
|
|
34
|
+
*/
|
|
35
|
+
export declare function getSupabase(): never;
|
|
36
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGxE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGjE,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,6BAA6B,EAC7B,aAAa,EACb,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGpF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,4BAA4B,EAC5B,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,cAAc,GACf,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,sBAAsB,EAAE,qCAAqC,EAAE,MAAM,wBAAwB,CAAC;AAGvG,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGlE,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,qCAAqC,GACtC,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAG/E,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG7G,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGlG,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAIrE;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAGtF;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,KAAK,CAEnC"}
|