@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
package/dist/worktree.js
ADDED
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git worktree management for the daemon.
|
|
3
|
+
*
|
|
4
|
+
* Handles worktree creation, cleanup, pruning, and safety checks
|
|
5
|
+
* for agent session isolation.
|
|
6
|
+
*
|
|
7
|
+
* Base operations (prune, existence check, WIP commit, removal, creation)
|
|
8
|
+
* are imported from @telora/daemon-core. Daemon-specific extensions
|
|
9
|
+
* (safety guards, merge-before-remove, orphan cleanup) are implemented here.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readdirSync, rmSync, statSync, symlinkSync, copyFileSync } from 'node:fs';
|
|
12
|
+
import { join, resolve } from 'node:path';
|
|
13
|
+
import { runGitSync } from './git-types.js';
|
|
14
|
+
import { branchExists } from './git-branch.js';
|
|
15
|
+
import { pruneWorktrees as pruneWorktreesBase, worktreeExistsForBranch as worktreeExistsForBranchBase, commitWip, removeWorktreeBase, } from '@telora/daemon-core';
|
|
16
|
+
import { mergeToIntegration } from './git-merge.js';
|
|
17
|
+
import { getActiveStrategies } from './queries/deliveries.js';
|
|
18
|
+
import { removeStrategyWorktree as removeStrategyWorktreeState } from './strategy-worktree-state.js';
|
|
19
|
+
import { sanitizeGitSegment } from './git-utils.js';
|
|
20
|
+
// ── Merge worktree ────────────────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Derive the merge worktree path from config. Deterministic — no state.
|
|
23
|
+
*/
|
|
24
|
+
export function getMergeWorktreePath(config) {
|
|
25
|
+
return join(config.repoPath, '.telora', 'merge-worktree');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create or validate the persistent merge worktree.
|
|
29
|
+
*
|
|
30
|
+
* Uses a detached HEAD worktree at `.telora/merge-worktree/` so merge
|
|
31
|
+
* functions can checkout any branch without "already checked out" conflicts.
|
|
32
|
+
* The main repo working tree is never touched during merge operations.
|
|
33
|
+
*
|
|
34
|
+
* Called once from initGit() after ensureIntegrationBranch().
|
|
35
|
+
*/
|
|
36
|
+
export function ensureMergeWorktree(config) {
|
|
37
|
+
const teloraDir = join(config.repoPath, '.telora');
|
|
38
|
+
const wtPath = getMergeWorktreePath(config);
|
|
39
|
+
// Ensure .telora directory exists
|
|
40
|
+
if (!existsSync(teloraDir)) {
|
|
41
|
+
mkdirSync(teloraDir, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
if (existsSync(wtPath)) {
|
|
44
|
+
// Validate it's a functioning worktree (has a .git file or directory)
|
|
45
|
+
const gitMarker = join(wtPath, '.git');
|
|
46
|
+
if (existsSync(gitMarker)) {
|
|
47
|
+
console.log(`[merge-worktree] Using existing merge worktree: ${wtPath}`);
|
|
48
|
+
return wtPath;
|
|
49
|
+
}
|
|
50
|
+
// Directory exists but isn't a valid worktree -- prune and recreate
|
|
51
|
+
console.log(`[merge-worktree] Stale merge worktree detected, recreating...`);
|
|
52
|
+
rmSync(wtPath, { recursive: true, force: true });
|
|
53
|
+
runGitSync(['worktree', 'prune'], config.repoPath);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Prune in case git still has a stale entry for this path
|
|
57
|
+
runGitSync(['worktree', 'prune'], config.repoPath);
|
|
58
|
+
}
|
|
59
|
+
// Create detached HEAD worktree (avoids branch conflicts)
|
|
60
|
+
const result = runGitSync(['worktree', 'add', '--detach', wtPath], config.repoPath);
|
|
61
|
+
if (!result.success) {
|
|
62
|
+
throw new Error(`Failed to create merge worktree: ${result.error}`);
|
|
63
|
+
}
|
|
64
|
+
console.log(`[merge-worktree] Created merge worktree: ${wtPath}`);
|
|
65
|
+
return wtPath;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Ensure the worktree directory exists.
|
|
69
|
+
*/
|
|
70
|
+
export function ensureWorktreeDir(config) {
|
|
71
|
+
if (!existsSync(config.worktreeDir)) {
|
|
72
|
+
mkdirSync(config.worktreeDir, { recursive: true });
|
|
73
|
+
console.log(`Created worktree directory: ${config.worktreeDir}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Clean up stale worktree entries on startup.
|
|
78
|
+
*
|
|
79
|
+
* Delegates to daemon-core's pruneWorktrees.
|
|
80
|
+
*/
|
|
81
|
+
export function pruneWorktrees(repoPath) {
|
|
82
|
+
pruneWorktreesBase(repoPath);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if a worktree exists for a branch.
|
|
86
|
+
*
|
|
87
|
+
* Delegates to daemon-core's worktreeExistsForBranch.
|
|
88
|
+
*/
|
|
89
|
+
export function worktreeExistsForBranch(branchName, repoPath) {
|
|
90
|
+
return worktreeExistsForBranchBase(branchName, repoPath);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Ensure MCP server build artifacts are available in a worktree.
|
|
94
|
+
*
|
|
95
|
+
* The MCP server dist/ directories are gitignored build artifacts that only
|
|
96
|
+
* exist in the main repo. Worktrees created via `git worktree add` won't have
|
|
97
|
+
* them, which prevents Claude Code from loading MCP tools (the .mcp.json
|
|
98
|
+
* references relative paths like `mcp/telora-products/dist/index.js`).
|
|
99
|
+
*
|
|
100
|
+
* This function symlinks each MCP dist/ directory from the main repo into the
|
|
101
|
+
* worktree so the relative paths in .mcp.json resolve correctly.
|
|
102
|
+
*/
|
|
103
|
+
export function ensureMcpServerInWorktree(repoPath, worktreePath) {
|
|
104
|
+
const mcpDir = join(repoPath, 'mcp');
|
|
105
|
+
if (!existsSync(mcpDir))
|
|
106
|
+
return;
|
|
107
|
+
let entries;
|
|
108
|
+
try {
|
|
109
|
+
entries = readdirSync(mcpDir);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
for (const serverName of entries) {
|
|
115
|
+
const sourceDist = join(mcpDir, serverName, 'dist');
|
|
116
|
+
if (!existsSync(sourceDist))
|
|
117
|
+
continue;
|
|
118
|
+
const targetDist = join(worktreePath, 'mcp', serverName, 'dist');
|
|
119
|
+
// Skip if already exists (symlink or directory)
|
|
120
|
+
if (existsSync(targetDist))
|
|
121
|
+
continue;
|
|
122
|
+
// Ensure parent directory exists
|
|
123
|
+
const targetParent = join(worktreePath, 'mcp', serverName);
|
|
124
|
+
if (!existsSync(targetParent)) {
|
|
125
|
+
mkdirSync(targetParent, { recursive: true });
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
symlinkSync(sourceDist, targetDist, 'dir');
|
|
129
|
+
console.log(`[worktree] Symlinked MCP dist: ${serverName}/dist -> ${sourceDist}`);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
console.warn(`[worktree] Failed to symlink MCP dist for ${serverName}: ${err instanceof Error ? err.message : String(err)}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Copy .mcp.json from main repo to worktree so MCP tools point at the
|
|
136
|
+
// correct Telora URL. .mcp.json is gitignored, so worktrees inherit a
|
|
137
|
+
// stale copy (or none at all) unless we explicitly sync it.
|
|
138
|
+
const sourceMcpJson = join(repoPath, '.mcp.json');
|
|
139
|
+
const targetMcpJson = join(worktreePath, '.mcp.json');
|
|
140
|
+
if (existsSync(sourceMcpJson)) {
|
|
141
|
+
try {
|
|
142
|
+
copyFileSync(sourceMcpJson, targetMcpJson);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
console.warn(`[worktree] Failed to copy .mcp.json: ${err instanceof Error ? err.message : String(err)}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create a worktree for an agent session.
|
|
151
|
+
* The worktree is created from the integration branch.
|
|
152
|
+
*
|
|
153
|
+
* @returns The path to the created worktree
|
|
154
|
+
*/
|
|
155
|
+
export async function createWorktree(config, branchName) {
|
|
156
|
+
const worktreePath = join(config.worktreeDir, branchName.replace(/\//g, '-'));
|
|
157
|
+
// If worktree directory exists, remove it first
|
|
158
|
+
if (existsSync(worktreePath)) {
|
|
159
|
+
console.log(`Removing existing worktree directory: ${worktreePath}`);
|
|
160
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
161
|
+
}
|
|
162
|
+
// Prune any stale worktree entries (handles "missing but registered" state)
|
|
163
|
+
runGitSync(['worktree', 'prune'], config.repoPath);
|
|
164
|
+
// Check if there's still a worktree entry for this branch after pruning
|
|
165
|
+
if (worktreeExistsForBranch(branchName, config.repoPath)) {
|
|
166
|
+
console.log(`Removing existing worktree for branch: ${branchName}`);
|
|
167
|
+
runGitSync(['worktree', 'remove', '--force', branchName], config.repoPath);
|
|
168
|
+
}
|
|
169
|
+
// Determine if branch already exists
|
|
170
|
+
const branchAlreadyExists = branchExists(branchName, config.repoPath);
|
|
171
|
+
if (branchAlreadyExists) {
|
|
172
|
+
// Use existing branch
|
|
173
|
+
console.log(`Creating worktree using existing branch: ${branchName}`);
|
|
174
|
+
const result = runGitSync(['worktree', 'add', worktreePath, branchName], config.repoPath);
|
|
175
|
+
if (!result.success) {
|
|
176
|
+
throw new Error(`Failed to create worktree: ${result.error}`);
|
|
177
|
+
}
|
|
178
|
+
// Rebase onto integration branch to get latest changes
|
|
179
|
+
console.log(`Rebasing ${branchName} onto ${config.integrationBranch}...`);
|
|
180
|
+
const rebaseResult = runGitSync(['rebase', config.integrationBranch], worktreePath);
|
|
181
|
+
if (!rebaseResult.success) {
|
|
182
|
+
// If rebase fails, abort and warn
|
|
183
|
+
runGitSync(['rebase', '--abort'], worktreePath);
|
|
184
|
+
console.warn(`Warning: Could not rebase onto integration branch. Continuing with existing branch state.`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// Create new branch from integration
|
|
189
|
+
console.log(`Creating worktree with new branch ${branchName} from ${config.integrationBranch}`);
|
|
190
|
+
const result = runGitSync(['worktree', 'add', '-b', branchName, worktreePath, config.integrationBranch], config.repoPath);
|
|
191
|
+
if (!result.success) {
|
|
192
|
+
throw new Error(`Failed to create worktree: ${result.error}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Symlink MCP server dist/ from main repo so .mcp.json relative paths resolve
|
|
196
|
+
ensureMcpServerInWorktree(config.repoPath, worktreePath);
|
|
197
|
+
return worktreePath;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if a worktree has uncommitted changes (dirty working tree).
|
|
201
|
+
*/
|
|
202
|
+
export function worktreeHasUncommittedChanges(worktreePath) {
|
|
203
|
+
if (!existsSync(worktreePath))
|
|
204
|
+
return false;
|
|
205
|
+
const result = runGitSync(['status', '--porcelain'], worktreePath);
|
|
206
|
+
return result.success && result.output.trim().length > 0;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Check if a branch has commits not yet merged into a target branch.
|
|
210
|
+
*/
|
|
211
|
+
export function branchHasUnmergedCommits(branchName, targetBranch, repoPath) {
|
|
212
|
+
const result = runGitSync(['log', '--oneline', `${targetBranch}..${branchName}`, '--'], repoPath);
|
|
213
|
+
return result.success && result.output.trim().length > 0;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Commit all uncommitted changes in a worktree as a safety net.
|
|
217
|
+
* Returns the commit hash if successful, null otherwise.
|
|
218
|
+
*/
|
|
219
|
+
export function safetyCommitWorktree(worktreePath, deliveryName) {
|
|
220
|
+
// Stage everything
|
|
221
|
+
const addResult = runGitSync(['add', '-A'], worktreePath);
|
|
222
|
+
if (!addResult.success) {
|
|
223
|
+
console.error(`Safety commit: failed to stage changes: ${addResult.error}`);
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
// Commit
|
|
227
|
+
const commitResult = runGitSync(['commit', '-m', `wip: uncommitted agent work for "${deliveryName}" (safety commit)`], worktreePath);
|
|
228
|
+
if (!commitResult.success) {
|
|
229
|
+
console.warn(`Safety commit: commit failed (may be empty): ${commitResult.error}`);
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
// Return the new commit hash
|
|
233
|
+
const hashResult = runGitSync(['rev-parse', 'HEAD'], worktreePath);
|
|
234
|
+
return hashResult.success ? hashResult.output : null;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Remove a worktree when an agent session ends.
|
|
238
|
+
* The branch is preserved for PR creation.
|
|
239
|
+
*
|
|
240
|
+
* SAFETY: Refuses to remove a worktree that has uncommitted changes or
|
|
241
|
+
* unmerged commits. Uncommitted changes are auto-committed as a safety
|
|
242
|
+
* net to prevent losing agent work.
|
|
243
|
+
*
|
|
244
|
+
* @returns true if the worktree was actually removed, false if it was preserved
|
|
245
|
+
*/
|
|
246
|
+
export function removeWorktree(repoPath, worktreePath, options = {}) {
|
|
247
|
+
const { branchName, integrationBranch, deliveryName, mergeSucceeded } = options;
|
|
248
|
+
try {
|
|
249
|
+
if (!existsSync(worktreePath)) {
|
|
250
|
+
console.log(`Worktree already removed: ${worktreePath}`);
|
|
251
|
+
runGitSync(['worktree', 'prune'], repoPath);
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
// Guard 1: Check for uncommitted changes and safety-commit them
|
|
255
|
+
if (worktreeHasUncommittedChanges(worktreePath)) {
|
|
256
|
+
console.warn(`Worktree has uncommitted changes: ${worktreePath}. ` +
|
|
257
|
+
`Creating safety commit to preserve work...`);
|
|
258
|
+
const hash = safetyCommitWorktree(worktreePath, deliveryName ?? 'unknown');
|
|
259
|
+
if (hash) {
|
|
260
|
+
console.log(`Safety commit created: ${hash.slice(0, 8)}`);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Could not commit -- refuse to delete
|
|
264
|
+
console.error(`REFUSING to remove worktree ${worktreePath}: ` +
|
|
265
|
+
`has uncommitted changes and safety commit failed. ` +
|
|
266
|
+
`Manual cleanup required.`);
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Guard 2: Check for unmerged commits (if we know the branch and integration)
|
|
271
|
+
if (branchName && integrationBranch && !mergeSucceeded) {
|
|
272
|
+
if (branchHasUnmergedCommits(branchName, integrationBranch, repoPath)) {
|
|
273
|
+
console.error(`REFUSING to remove worktree ${worktreePath}: ` +
|
|
274
|
+
`branch ${branchName} has commits not merged to ${integrationBranch}. ` +
|
|
275
|
+
`Branch preserved for manual merge/review.`);
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Safe to remove -- delegate to daemon-core's base removal
|
|
280
|
+
return removeWorktreeBase(repoPath, worktreePath);
|
|
281
|
+
}
|
|
282
|
+
catch (err) {
|
|
283
|
+
console.error('Error removing worktree:', err instanceof Error ? err.message : String(err));
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// ── WIP commit after agent exit ───────────────────────────────────
|
|
288
|
+
/**
|
|
289
|
+
* Commit any uncommitted changes in a worktree as a WIP commit.
|
|
290
|
+
*
|
|
291
|
+
* Called by the daemon after an agent process exits but before worktree
|
|
292
|
+
* removal. Captures in-flight work that the agent didn't commit before
|
|
293
|
+
* being terminated.
|
|
294
|
+
*
|
|
295
|
+
* Delegates to daemon-core's commitWip for the actual git operations.
|
|
296
|
+
*
|
|
297
|
+
* @returns The commit hash if a WIP commit was created, null if no changes or failure.
|
|
298
|
+
*/
|
|
299
|
+
export function commitWipChanges(worktreePath, contextName) {
|
|
300
|
+
console.log(`[worktree] Committing WIP changes in ${worktreePath} for "${contextName}"`);
|
|
301
|
+
return commitWip(worktreePath, `Uncommitted work captured by daemon on agent exit (${contextName})`);
|
|
302
|
+
}
|
|
303
|
+
// ── Canonical worktree removal ────────────────────────────────────
|
|
304
|
+
/**
|
|
305
|
+
* Canonical strategy worktree removal: merge-before-remove + conditional cleanup.
|
|
306
|
+
*
|
|
307
|
+
* Every code path that removes a strategy worktree should route through this
|
|
308
|
+
* function. It encapsulates the full lifecycle:
|
|
309
|
+
* 1. Check for unmerged commits on the branch
|
|
310
|
+
* 2. Attempt merge to integration if needed
|
|
311
|
+
* 3. Call removeWorktree with safety guards (handles uncommitted changes)
|
|
312
|
+
* 4. Conditionally clear in-memory state based on whether removal succeeded
|
|
313
|
+
*
|
|
314
|
+
* Returns structured result so callers can count cleaned/preserved and log.
|
|
315
|
+
*/
|
|
316
|
+
export async function safeRemoveStrategyWorktree(params) {
|
|
317
|
+
const { config, worktreePath, branchName, deliveryName, deliveryId, strategyId } = params;
|
|
318
|
+
const { repoPath, integrationBranch } = config;
|
|
319
|
+
// 1. Attempt merge if there are unmerged commits
|
|
320
|
+
let mergeSucceeded = false;
|
|
321
|
+
let merged = false;
|
|
322
|
+
let mergeError;
|
|
323
|
+
try {
|
|
324
|
+
if (branchHasUnmergedCommits(branchName, integrationBranch, repoPath)) {
|
|
325
|
+
console.log(`[worktree] Attempting merge for ${branchName} before removal`);
|
|
326
|
+
const mergeResult = await mergeToIntegration({
|
|
327
|
+
config,
|
|
328
|
+
branchName,
|
|
329
|
+
deliveryName,
|
|
330
|
+
deliveryId: deliveryId ?? deliveryName,
|
|
331
|
+
});
|
|
332
|
+
mergeSucceeded = mergeResult.success;
|
|
333
|
+
merged = true;
|
|
334
|
+
if (mergeResult.success) {
|
|
335
|
+
console.log(`[worktree] Merge succeeded for ${branchName}`);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
mergeError = mergeResult.error ?? 'unknown';
|
|
339
|
+
console.warn(`[worktree] Merge failed for ${branchName}: ${mergeError}. ` +
|
|
340
|
+
`Safety guards will preserve the branch.`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
mergeSucceeded = true; // Nothing to merge
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch (err) {
|
|
348
|
+
mergeError = err.message;
|
|
349
|
+
console.warn(`[worktree] Merge attempt failed for ${branchName}: ${mergeError}`);
|
|
350
|
+
}
|
|
351
|
+
// 2. Remove worktree (safety guards handle uncommitted changes and unmerged commits)
|
|
352
|
+
let removed = false;
|
|
353
|
+
try {
|
|
354
|
+
removed = removeWorktree(repoPath, worktreePath, {
|
|
355
|
+
branchName,
|
|
356
|
+
integrationBranch,
|
|
357
|
+
deliveryName,
|
|
358
|
+
mergeSucceeded,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
console.warn(`[worktree] Failed to remove worktree ${worktreePath}: ${err.message}`);
|
|
363
|
+
}
|
|
364
|
+
// 3. Conditionally clear in-memory state
|
|
365
|
+
if (strategyId) {
|
|
366
|
+
if (removed) {
|
|
367
|
+
removeStrategyWorktreeState(strategyId);
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
console.log(`[worktree] Worktree preserved for strategy ${strategyId} -- keeping in-memory state`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return { removed, merged, mergeError };
|
|
374
|
+
}
|
|
375
|
+
// ── Orphan strategy worktree cleanup ──────────────────────────────
|
|
376
|
+
/**
|
|
377
|
+
* Clean up orphan strategy worktrees on daemon startup.
|
|
378
|
+
*
|
|
379
|
+
* Scans the worktree directory and cross-references against active
|
|
380
|
+
* strategies (those with assigned agent roles and queued deliveries).
|
|
381
|
+
* Worktrees that don't match any active strategy are orphans from a
|
|
382
|
+
* previous daemon run and are cleaned up.
|
|
383
|
+
*
|
|
384
|
+
* Conservative approach:
|
|
385
|
+
* - Safety-commits any uncommitted changes before removal
|
|
386
|
+
* - Checks for unmerged commits before deleting
|
|
387
|
+
* - Logs all actions for auditability
|
|
388
|
+
*
|
|
389
|
+
* @returns Count of orphans cleaned up and preserved
|
|
390
|
+
*/
|
|
391
|
+
export async function cleanupOrphanStrategyWorktrees(config) {
|
|
392
|
+
const { worktreeDir, repoPath, organizationId, productId } = config;
|
|
393
|
+
let cleaned = 0;
|
|
394
|
+
let preserved = 0;
|
|
395
|
+
if (!existsSync(worktreeDir)) {
|
|
396
|
+
return { cleaned, preserved };
|
|
397
|
+
}
|
|
398
|
+
// 1. List all subdirectories in the worktree directory
|
|
399
|
+
let entries;
|
|
400
|
+
try {
|
|
401
|
+
entries = readdirSync(worktreeDir).filter((entry) => {
|
|
402
|
+
try {
|
|
403
|
+
return statSync(join(worktreeDir, entry)).isDirectory();
|
|
404
|
+
}
|
|
405
|
+
catch (e) {
|
|
406
|
+
console.debug(`[worktree] Failed to stat ${entry} (may have been deleted):`, e.message);
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
catch (err) {
|
|
412
|
+
console.warn(`[worktree] Failed to scan worktree directory: ${err instanceof Error ? err.message : String(err)}`);
|
|
413
|
+
return { cleaned, preserved };
|
|
414
|
+
}
|
|
415
|
+
if (entries.length === 0) {
|
|
416
|
+
return { cleaned, preserved };
|
|
417
|
+
}
|
|
418
|
+
// 2. Query active strategies (all strategies with agent role assignments,
|
|
419
|
+
// regardless of delivery status) to build the set of expected worktree dir names.
|
|
420
|
+
// Uses getActiveStrategies instead of getReadyStrategies to avoid treating
|
|
421
|
+
// strategies with all deliveries in done/verify as orphans.
|
|
422
|
+
let activeStrategyBranchDirs;
|
|
423
|
+
try {
|
|
424
|
+
const activeStrategiesList = await getActiveStrategies(organizationId, productId);
|
|
425
|
+
// Build the set of expected worktree directory names from active strategies.
|
|
426
|
+
// Strategy branch names follow: agent/{role}/{strategy-name}-{id-prefix},
|
|
427
|
+
// mirroring generateStrategyBranchName() in strategy-executor.ts.
|
|
428
|
+
// Worktree dirs are derived from the branch name with '/' replaced by '-'.
|
|
429
|
+
// We use sanitizeGitSegment (from git-utils.ts) to reconstruct the expected
|
|
430
|
+
// directory name, falling back to shortId suffix-matching for robustness.
|
|
431
|
+
activeStrategyBranchDirs = new Set();
|
|
432
|
+
for (const s of activeStrategiesList) {
|
|
433
|
+
const shortId = s.strategy_id.slice(0, 8);
|
|
434
|
+
const sanitizedRole = sanitizeGitSegment(s.agent_role_name ?? 'reviewer');
|
|
435
|
+
const sanitizedName = sanitizeGitSegment(s.strategy_name);
|
|
436
|
+
// Reconstruct the worktree directory name from the branch name
|
|
437
|
+
// (branch = agent/{role}/{name}-{shortId}, dir = agent-{role}-{name}-{shortId})
|
|
438
|
+
const expectedDir = `agent-${sanitizedRole}-${sanitizedName}-${shortId}`;
|
|
439
|
+
if (entries.includes(expectedDir)) {
|
|
440
|
+
activeStrategyBranchDirs.add(expectedDir);
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
// Fallback: match by strategy ID prefix in case sanitization differs
|
|
444
|
+
for (const entry of entries) {
|
|
445
|
+
if (entry.endsWith(shortId)) {
|
|
446
|
+
activeStrategyBranchDirs.add(entry);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
catch (err) {
|
|
453
|
+
// Conservative fallback: if we cannot determine active strategies,
|
|
454
|
+
// skip orphan cleanup entirely rather than risk deleting active worktrees.
|
|
455
|
+
console.warn(`[worktree] Failed to query active strategies for orphan detection: ` +
|
|
456
|
+
`${err instanceof Error ? err.message : String(err)}. Skipping orphan cleanup.`);
|
|
457
|
+
return { cleaned, preserved };
|
|
458
|
+
}
|
|
459
|
+
// 3. Identify orphans: agent worktree dirs not matching any active strategy
|
|
460
|
+
const orphanDirs = entries.filter((entry) => {
|
|
461
|
+
// Only consider agent-* directories (strategy worktrees use agent/ branch prefix)
|
|
462
|
+
if (!entry.startsWith('agent-'))
|
|
463
|
+
return false;
|
|
464
|
+
return !activeStrategyBranchDirs.has(entry);
|
|
465
|
+
});
|
|
466
|
+
if (orphanDirs.length === 0) {
|
|
467
|
+
console.log('[worktree] No orphan strategy worktrees found');
|
|
468
|
+
return { cleaned, preserved };
|
|
469
|
+
}
|
|
470
|
+
console.log(`[worktree] Found ${orphanDirs.length} orphan strategy worktree(s)`);
|
|
471
|
+
// 4. Parse git worktree list to get branch names for each path
|
|
472
|
+
const worktreeListResult = runGitSync(['worktree', 'list', '--porcelain'], repoPath);
|
|
473
|
+
const pathToBranch = new Map();
|
|
474
|
+
if (worktreeListResult.success) {
|
|
475
|
+
let currentPath = null;
|
|
476
|
+
for (const line of worktreeListResult.output.split('\n')) {
|
|
477
|
+
if (line.startsWith('worktree ')) {
|
|
478
|
+
currentPath = line.slice('worktree '.length);
|
|
479
|
+
}
|
|
480
|
+
else if (line.startsWith('branch refs/heads/') && currentPath) {
|
|
481
|
+
pathToBranch.set(resolve(currentPath), line.slice('branch refs/heads/'.length));
|
|
482
|
+
currentPath = null;
|
|
483
|
+
}
|
|
484
|
+
else if (line === '') {
|
|
485
|
+
currentPath = null;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// 5. Clean up each orphan via canonical removal path
|
|
490
|
+
for (const dir of orphanDirs) {
|
|
491
|
+
const worktreePath = resolve(join(worktreeDir, dir));
|
|
492
|
+
const branchName = pathToBranch.get(worktreePath) ?? dir.replace(/-/g, '/');
|
|
493
|
+
const deliveryName = branchName.split('/').slice(2).join('/') || dir;
|
|
494
|
+
console.log(`[worktree] Cleaning up orphan strategy worktree: ${worktreePath} [${branchName}]`);
|
|
495
|
+
const result = await safeRemoveStrategyWorktree({
|
|
496
|
+
config,
|
|
497
|
+
worktreePath,
|
|
498
|
+
branchName,
|
|
499
|
+
deliveryName,
|
|
500
|
+
deliveryId: dir, // No real delivery ID -- use dir name for traceability
|
|
501
|
+
});
|
|
502
|
+
if (result.removed) {
|
|
503
|
+
cleaned++;
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
preserved++;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
console.log(`[worktree] Orphan strategy worktree cleanup: ${cleaned} cleaned, ${preserved} preserved`);
|
|
510
|
+
return { cleaned, preserved };
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@telora/daemon",
|
|
3
|
+
"version": "0.12.33",
|
|
4
|
+
"description": "Agent orchestration daemon for Telora - spawns and manages Claude Code instances",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"telora-daemon": "dist/index.js",
|
|
8
|
+
"telora-daemon-wrapper": "scripts/telora-daemon-wrapper.sh"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"scripts/telora-daemon-wrapper.sh",
|
|
21
|
+
"build-info.json",
|
|
22
|
+
"README.md",
|
|
23
|
+
".env.example"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"dev": "tsx watch src/index.ts",
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"clean": "rm -rf dist",
|
|
29
|
+
"start": "node dist/index.js",
|
|
30
|
+
"lint": "eslint .",
|
|
31
|
+
"test": "npx tsx --experimental-test-module-mocks --test --test-concurrency=1 src/__tests__/*.test.ts",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"stamp-build-info": "node scripts/stamp-build-info.mjs",
|
|
34
|
+
"prepublishOnly": "npm run stamp-build-info && npm run build"
|
|
35
|
+
},
|
|
36
|
+
"//testRunner": "Uses Node.js built-in test runner (node:test) via tsx for TypeScript support. The root package uses Vitest; this is a deliberate choice for the daemon package to avoid framework dependencies. See src/__tests__/ for test files.",
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@telora/daemon-core": "^0.2.5",
|
|
39
|
+
"@telora/factory": "^0.4.5",
|
|
40
|
+
"commander": "^14.0.3",
|
|
41
|
+
"zod": "^4.3.6"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^22.12.0",
|
|
45
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
46
|
+
"eslint-plugin-import-x": "^4.16.1",
|
|
47
|
+
"tsx": "^4.21.0",
|
|
48
|
+
"typescript": "^5.7.3"
|
|
49
|
+
},
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=20"
|
|
52
|
+
},
|
|
53
|
+
"keywords": [
|
|
54
|
+
"telora",
|
|
55
|
+
"agent",
|
|
56
|
+
"claude",
|
|
57
|
+
"claude-code",
|
|
58
|
+
"orchestration",
|
|
59
|
+
"ai-agent"
|
|
60
|
+
],
|
|
61
|
+
"repository": {
|
|
62
|
+
"type": "git",
|
|
63
|
+
"url": "git+https://github.com/syntelyos/telora.git",
|
|
64
|
+
"directory": "packages/daemon"
|
|
65
|
+
},
|
|
66
|
+
"bugs": {
|
|
67
|
+
"url": "https://github.com/syntelyos/telora/issues"
|
|
68
|
+
},
|
|
69
|
+
"homepage": "https://github.com/syntelyos/telora/tree/main/packages/daemon#readme",
|
|
70
|
+
"license": "MIT",
|
|
71
|
+
"author": "Syntelyos",
|
|
72
|
+
"publishConfig": {
|
|
73
|
+
"access": "public",
|
|
74
|
+
"registry": "https://registry.npmjs.org/"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Wrapper script for telora-daemon that restarts on exit code 75 (auto-update).
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# telora-daemon-wrapper.sh [daemon args...]
|
|
7
|
+
#
|
|
8
|
+
# The daemon exits with code 75 after installing a newer version of itself.
|
|
9
|
+
# This wrapper simply re-launches the daemon, which now runs the new code.
|
|
10
|
+
#
|
|
11
|
+
# For systemd users, you can instead configure:
|
|
12
|
+
# RestartForceExitStatus=75
|
|
13
|
+
# in the [Service] section and run telora-daemon directly.
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
|
|
17
|
+
# Default to 'run' subcommand if no args given
|
|
18
|
+
ARGS=("$@")
|
|
19
|
+
if [ ${#ARGS[@]} -eq 0 ]; then
|
|
20
|
+
ARGS=("run")
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
while true; do
|
|
24
|
+
telora-daemon "${ARGS[@]}"
|
|
25
|
+
rc=$?
|
|
26
|
+
if [ "$rc" -eq 75 ]; then
|
|
27
|
+
echo "[wrapper] Daemon exited with code 75 (auto-updated), restarting..."
|
|
28
|
+
continue
|
|
29
|
+
fi
|
|
30
|
+
exit "$rc"
|
|
31
|
+
done
|