@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,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stale agent process detection and liveness checking.
|
|
3
|
+
*
|
|
4
|
+
* Detects agents whose processes have disappeared (OOM kill, external kill -9, etc.)
|
|
5
|
+
* without firing a 'close' event, and cleans up the agent entry and session.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
import { updateSession } from './supabase.js';
|
|
9
|
+
import { recordSessionCompleted } from './heartbeat.js';
|
|
10
|
+
import { removeWorktree } from './git.js';
|
|
11
|
+
/**
|
|
12
|
+
* Check if a process is alive. Returns false if the process doesn't exist
|
|
13
|
+
* or is a zombie on Linux.
|
|
14
|
+
*/
|
|
15
|
+
export function isProcessAlive(pid) {
|
|
16
|
+
// Check if PID exists
|
|
17
|
+
try {
|
|
18
|
+
process.kill(pid, 0);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
console.debug(`[spawner] isProcessAlive(${pid}): process not found (ESRCH):`, e.message);
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
// On Linux, check for zombie state via /proc/{pid}/status
|
|
25
|
+
if (process.platform === 'linux') {
|
|
26
|
+
try {
|
|
27
|
+
const status = readFileSync(`/proc/${pid}/status`, 'utf-8');
|
|
28
|
+
const stateMatch = status.match(/^State:\s+(\S)/m);
|
|
29
|
+
if (stateMatch && stateMatch[1] === 'Z') {
|
|
30
|
+
return false; // Zombie -- won't produce an exit event
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.debug(`[spawner] isProcessAlive(${pid}): /proc read failed, treating as dead:`, e.message);
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check all running agents for PID liveness.
|
|
42
|
+
*
|
|
43
|
+
* If an agent's process has disappeared (OOM kill, external kill -9, etc.)
|
|
44
|
+
* without firing a 'close' event, clean up the agent entry and update the
|
|
45
|
+
* session in the database.
|
|
46
|
+
*
|
|
47
|
+
* Guards against double-cleanup by checking runningAgents.has() before acting.
|
|
48
|
+
*/
|
|
49
|
+
export async function checkAgentLiveness(config, runningAgents) {
|
|
50
|
+
if (runningAgents.size === 0)
|
|
51
|
+
return;
|
|
52
|
+
// Snapshot keys to avoid mutating the map while iterating
|
|
53
|
+
const entries = [...runningAgents.entries()];
|
|
54
|
+
for (const [sessionId, agent] of entries) {
|
|
55
|
+
// Guard: agent may have been cleaned up by a normal exit event since we started
|
|
56
|
+
if (!runningAgents.has(sessionId))
|
|
57
|
+
continue;
|
|
58
|
+
if (isProcessAlive(agent.pid))
|
|
59
|
+
continue;
|
|
60
|
+
// PID is gone -- stale agent detected
|
|
61
|
+
const runtime = Math.round((Date.now() - agent.startedAt.getTime()) / 1000);
|
|
62
|
+
console.error(`[liveness] Stale agent detected: "${agent.deliveryName}" ` +
|
|
63
|
+
`(session: ${sessionId}, PID: ${agent.pid}, runtime: ${runtime}s). ` +
|
|
64
|
+
`Process disappeared -- possible OOM or external kill.`);
|
|
65
|
+
// Clear timeout timers
|
|
66
|
+
if (agent.warningTimer)
|
|
67
|
+
clearTimeout(agent.warningTimer);
|
|
68
|
+
if (agent.timeoutTimer)
|
|
69
|
+
clearTimeout(agent.timeoutTimer);
|
|
70
|
+
// Remove from tracking map
|
|
71
|
+
runningAgents.delete(sessionId);
|
|
72
|
+
// Update session in database
|
|
73
|
+
try {
|
|
74
|
+
await updateSession(sessionId, {
|
|
75
|
+
status: 'failed',
|
|
76
|
+
exit_reason: 'Process disappeared -- possible OOM or external kill',
|
|
77
|
+
ended_at: new Date().toISOString(),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
console.error(`[liveness] Failed to update session ${sessionId}:`, err.message);
|
|
82
|
+
}
|
|
83
|
+
// Record session completion for heartbeat counters
|
|
84
|
+
recordSessionCompleted(0, 0);
|
|
85
|
+
// Clean up worktree (safety guards in removeWorktree protect uncommitted work)
|
|
86
|
+
try {
|
|
87
|
+
removeWorktree(config.repoPath, agent.worktreePath, {
|
|
88
|
+
branchName: agent.branchName,
|
|
89
|
+
integrationBranch: config.integrationBranch,
|
|
90
|
+
deliveryName: agent.deliveryName,
|
|
91
|
+
mergeSucceeded: false,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (worktreeErr) {
|
|
95
|
+
console.error(`[liveness] Failed to remove worktree for "${agent.deliveryName}":`, worktreeErr.message);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=spawner-liveness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawner-liveness.js","sourceRoot":"","sources":["../src/spawner-liveness.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,sBAAsB;IACtB,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,+BAA+B,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;QACpG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0DAA0D;IAC1D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,GAAG,SAAS,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACnD,IAAI,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxC,OAAO,KAAK,CAAC,CAAC,wCAAwC;YACxD,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,yCAAyC,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YAC9G,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAoB,EACpB,aAAwC;IAExC,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAErC,0DAA0D;IAC1D,MAAM,OAAO,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACzC,gFAAgF;QAChF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QAE5C,IAAI,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,SAAS;QAExC,sCAAsC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CACX,qCAAqC,KAAK,CAAC,YAAY,IAAI;YAC3D,aAAa,SAAS,UAAU,KAAK,CAAC,GAAG,cAAc,OAAO,MAAM;YACpE,uDAAuD,CACxD,CAAC;QAEF,uBAAuB;QACvB,IAAI,KAAK,CAAC,YAAY;YAAE,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,YAAY;YAAE,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEzD,2BAA2B;QAC3B,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEhC,6BAA6B;QAC7B,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,SAAS,EAAE;gBAC7B,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,sDAAsD;gBACnE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,uCAAuC,SAAS,GAAG,EAClD,GAAa,CAAC,OAAO,CACvB,CAAC;QACJ,CAAC;QAED,mDAAmD;QACnD,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7B,+EAA+E;QAC/E,IAAI,CAAC;YACH,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,YAAY,EAAE;gBAClD,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;gBAC3C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,cAAc,EAAE,KAAK;aACtB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,WAAW,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CACX,6CAA6C,KAAK,CAAC,YAAY,IAAI,EAClE,WAAqB,CAAC,OAAO,CAC/B,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge conflict resolution agent spawner.
|
|
3
|
+
*
|
|
4
|
+
* Spawns a short-lived, single-purpose Claude Code agent for merge conflict
|
|
5
|
+
* resolution. Used when no active team exists for a strategy but merge
|
|
6
|
+
* conflicts need resolution.
|
|
7
|
+
*/
|
|
8
|
+
import type { DaemonConfig } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Spawn a short-lived, single-purpose Claude Code agent for merge conflict resolution.
|
|
11
|
+
*
|
|
12
|
+
* Used when no active team exists for a strategy but merge conflicts need resolution.
|
|
13
|
+
* The agent receives a focused prompt with conflict details, resolves in the existing
|
|
14
|
+
* worktree, and exits. No session DB record, no streaming, no team mode.
|
|
15
|
+
*/
|
|
16
|
+
export declare function spawnResolutionAgent(params: {
|
|
17
|
+
config: DaemonConfig;
|
|
18
|
+
worktreePath: string;
|
|
19
|
+
branchName: string;
|
|
20
|
+
integrationBranch: string;
|
|
21
|
+
conflictFiles: string[];
|
|
22
|
+
strategyDescription: string;
|
|
23
|
+
}): Promise<{
|
|
24
|
+
success: boolean;
|
|
25
|
+
error?: string;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=spawner-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawner-resolution.d.ts","sourceRoot":"","sources":["../src/spawner-resolution.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkFhD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge conflict resolution agent spawner.
|
|
3
|
+
*
|
|
4
|
+
* Spawns a short-lived, single-purpose Claude Code agent for merge conflict
|
|
5
|
+
* resolution. Used when no active team exists for a strategy but merge
|
|
6
|
+
* conflicts need resolution.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from 'node:child_process';
|
|
9
|
+
import { runGitSync } from './git-types.js';
|
|
10
|
+
import { stripClaudeCodeEnvVars } from '@telora/daemon-core';
|
|
11
|
+
/** Timeout for the resolution agent (10 minutes). */
|
|
12
|
+
const RESOLUTION_AGENT_TIMEOUT_MS = 10 * 60 * 1000;
|
|
13
|
+
/**
|
|
14
|
+
* Spawn a short-lived, single-purpose Claude Code agent for merge conflict resolution.
|
|
15
|
+
*
|
|
16
|
+
* Used when no active team exists for a strategy but merge conflicts need resolution.
|
|
17
|
+
* The agent receives a focused prompt with conflict details, resolves in the existing
|
|
18
|
+
* worktree, and exits. No session DB record, no streaming, no team mode.
|
|
19
|
+
*/
|
|
20
|
+
export async function spawnResolutionAgent(params) {
|
|
21
|
+
const { config, worktreePath, branchName, integrationBranch, conflictFiles, strategyDescription } = params;
|
|
22
|
+
const prompt = [
|
|
23
|
+
`You are resolving merge conflicts in a git worktree.`,
|
|
24
|
+
``,
|
|
25
|
+
`**Worktree:** ${worktreePath}`,
|
|
26
|
+
`**Branch:** ${branchName}`,
|
|
27
|
+
`**Merge source:** origin/${integrationBranch}`,
|
|
28
|
+
``,
|
|
29
|
+
`**Conflicted files:**`,
|
|
30
|
+
...conflictFiles.map(f => `- ${f}`),
|
|
31
|
+
``,
|
|
32
|
+
`**Strategy context:** ${strategyDescription}`,
|
|
33
|
+
``,
|
|
34
|
+
`**Instructions:**`,
|
|
35
|
+
`1. Open each conflicted file and resolve the conflict markers (<<<<<<< / ======= / >>>>>>>)`,
|
|
36
|
+
`2. Stage each resolved file with: git add <file>`,
|
|
37
|
+
`3. Commit the merge resolution: git commit --no-edit`,
|
|
38
|
+
`4. Run: npm run build && npm test`,
|
|
39
|
+
`5. If build or test fails, fix the issues, commit, and re-run until passing`,
|
|
40
|
+
``,
|
|
41
|
+
`Do NOT run git merge --abort. Your goal is to produce a clean merge commit that passes build and tests.`,
|
|
42
|
+
`Follow the coding standards in CLAUDE.md.`,
|
|
43
|
+
].join('\n');
|
|
44
|
+
const args = [
|
|
45
|
+
'--print',
|
|
46
|
+
'--dangerously-skip-permissions',
|
|
47
|
+
'--setting-sources', 'project,local',
|
|
48
|
+
prompt,
|
|
49
|
+
];
|
|
50
|
+
// Build a clean environment (strip Claude Code session vars)
|
|
51
|
+
const spawnEnv = stripClaudeCodeEnvVars(process.env);
|
|
52
|
+
console.log(`[spawner] Spawning resolution agent for branch ${branchName} (${conflictFiles.length} conflicts)`);
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
const proc = spawn(config.claudeCodePath, args, {
|
|
55
|
+
cwd: worktreePath,
|
|
56
|
+
env: spawnEnv,
|
|
57
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
58
|
+
});
|
|
59
|
+
// Close stdin immediately -- prompt is passed as CLI arg
|
|
60
|
+
proc.stdin?.end();
|
|
61
|
+
// Timeout with escalating shutdown
|
|
62
|
+
const timeout = setTimeout(() => {
|
|
63
|
+
console.warn(`[spawner] Resolution agent timed out after ${RESOLUTION_AGENT_TIMEOUT_MS / 1000}s, killing`);
|
|
64
|
+
try {
|
|
65
|
+
process.kill(proc.pid, 'SIGTERM');
|
|
66
|
+
}
|
|
67
|
+
catch { /* ignore */ }
|
|
68
|
+
setTimeout(() => {
|
|
69
|
+
try {
|
|
70
|
+
process.kill(proc.pid, 'SIGKILL');
|
|
71
|
+
}
|
|
72
|
+
catch { /* ignore */ }
|
|
73
|
+
}, 10000);
|
|
74
|
+
}, RESOLUTION_AGENT_TIMEOUT_MS);
|
|
75
|
+
proc.on('close', (code) => {
|
|
76
|
+
clearTimeout(timeout);
|
|
77
|
+
// Verify resolution by checking for remaining unmerged files
|
|
78
|
+
const unmergedResult = runGitSync(['diff', '--name-only', '--diff-filter=U'], worktreePath);
|
|
79
|
+
const unmergedFiles = unmergedResult.success
|
|
80
|
+
? unmergedResult.output.split('\n').filter(Boolean)
|
|
81
|
+
: [];
|
|
82
|
+
if (unmergedFiles.length === 0) {
|
|
83
|
+
console.log(`[spawner] Resolution agent succeeded for branch ${branchName} (exit code: ${code})`);
|
|
84
|
+
resolve({ success: true });
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const msg = `Conflicts remain in: ${unmergedFiles.join(', ')}`;
|
|
88
|
+
console.warn(`[spawner] Resolution agent failed for branch ${branchName}: ${msg}`);
|
|
89
|
+
resolve({ success: false, error: msg });
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
proc.on('error', (err) => {
|
|
93
|
+
clearTimeout(timeout);
|
|
94
|
+
console.error(`[spawner] Resolution agent spawn error: ${err.message}`);
|
|
95
|
+
resolve({ success: false, error: `Spawn error: ${err.message}` });
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=spawner-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawner-resolution.js","sourceRoot":"","sources":["../src/spawner-resolution.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,qDAAqD;AACrD,MAAM,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAO1C;IACC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC;IAE3G,MAAM,MAAM,GAAG;QACb,sDAAsD;QACtD,EAAE;QACF,iBAAiB,YAAY,EAAE;QAC/B,eAAe,UAAU,EAAE;QAC3B,4BAA4B,iBAAiB,EAAE;QAC/C,EAAE;QACF,uBAAuB;QACvB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,EAAE;QACF,yBAAyB,mBAAmB,EAAE;QAC9C,EAAE;QACF,mBAAmB;QACnB,6FAA6F;QAC7F,kDAAkD;QAClD,sDAAsD;QACtD,mCAAmC;QACnC,6EAA6E;QAC7E,EAAE;QACF,yGAAyG;QACzG,2CAA2C;KAC5C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,IAAI,GAAG;QACX,SAAS;QACT,gCAAgC;QAChC,mBAAmB,EAAE,eAAe;QACpC,MAAM;KACP,CAAC;IAEF,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAyC,CAAC,CAAC;IAE3F,OAAO,CAAC,GAAG,CAAC,kDAAkD,UAAU,KAAK,aAAa,CAAC,MAAM,aAAa,CAAC,CAAC;IAEhH,OAAO,IAAI,OAAO,CAAuC,CAAC,OAAO,EAAE,EAAE;QACnE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE;YAC9C,GAAG,EAAE,YAAY;YACjB,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,yDAAyD;QACzD,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QAElB,mCAAmC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,IAAI,CAAC,8CAA8C,2BAA2B,GAAG,IAAI,YAAY,CAAC,CAAC;YAC3G,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAI,EAAE,SAAS,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAClE,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAI,EAAE,SAAS,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACpE,CAAC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAEhC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,YAAY,CAAC,OAAO,CAAC,CAAC;YAEtB,6DAA6D;YAC7D,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,CAAC,EAAE,YAAY,CAAC,CAAC;YAC5F,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO;gBAC1C,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBACnD,CAAC,CAAC,EAAE,CAAC;YAEP,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,mDAAmD,UAAU,gBAAgB,IAAI,GAAG,CAAC,CAAC;gBAClG,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,wBAAwB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,gDAAgD,UAAU,KAAK,GAAG,EAAE,CAAC,CAAC;gBACnF,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,2CAA2C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeout enforcement and graceful shutdown for agent sessions.
|
|
3
|
+
*
|
|
4
|
+
* Handles per-agent timeout warnings, escalating shutdown sequences
|
|
5
|
+
* (stdin close -> SIGTERM -> SIGKILL), and graceful completion shutdown.
|
|
6
|
+
*/
|
|
7
|
+
import type { Writable } from 'node:stream';
|
|
8
|
+
import type { DaemonConfig, RunningAgent } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Safely send a signal to a process, ignoring errors if the process has already exited.
|
|
11
|
+
*/
|
|
12
|
+
export declare function safeSendSignal(pid: number, signal: NodeJS.Signals): void;
|
|
13
|
+
/**
|
|
14
|
+
* Safely close a writable stdin stream, ignoring errors if already closed.
|
|
15
|
+
*/
|
|
16
|
+
export declare function safeCloseStdin(stdin: Writable): void;
|
|
17
|
+
/**
|
|
18
|
+
* Set up per-agent timeout enforcement with warning at 80% and escalating shutdown.
|
|
19
|
+
*
|
|
20
|
+
* Returns a `timedOut` accessor function (closure over mutable state).
|
|
21
|
+
*/
|
|
22
|
+
export declare function setupTimeoutEnforcement(config: DaemonConfig, runningAgent: RunningAgent, deliveryName: string, sessionId: string, runningAgents: Map<string, RunningAgent>): {
|
|
23
|
+
getTimedOut: () => boolean;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Initiate graceful shutdown for an agent session.
|
|
27
|
+
*
|
|
28
|
+
* Sends a wrap-up message via stdin, waits for the process to exit,
|
|
29
|
+
* and escalates to SIGTERM/SIGKILL if needed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function initiateGracefulShutdown(agent: RunningAgent, deliveryName: string, runningAgents: Map<string, RunningAgent>): void;
|
|
32
|
+
//# sourceMappingURL=spawner-timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawner-timeout.d.ts","sourceRoot":"","sources":["../src/spawner-timeout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG7D;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAMxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAMpD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACvC;IAAE,WAAW,EAAE,MAAM,OAAO,CAAA;CAAE,CAuChC;AA8BD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACvC,IAAI,CAuCN"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeout enforcement and graceful shutdown for agent sessions.
|
|
3
|
+
*
|
|
4
|
+
* Handles per-agent timeout warnings, escalating shutdown sequences
|
|
5
|
+
* (stdin close -> SIGTERM -> SIGKILL), and graceful completion shutdown.
|
|
6
|
+
*/
|
|
7
|
+
import { sendMessage } from '@telora/daemon-core';
|
|
8
|
+
/**
|
|
9
|
+
* Safely send a signal to a process, ignoring errors if the process has already exited.
|
|
10
|
+
*/
|
|
11
|
+
export function safeSendSignal(pid, signal) {
|
|
12
|
+
try {
|
|
13
|
+
process.kill(pid, signal);
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
console.debug(`[spawner] safeSendSignal(${pid}, ${signal}) failed (process may have exited):`, e.message);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Safely close a writable stdin stream, ignoring errors if already closed.
|
|
21
|
+
*/
|
|
22
|
+
export function safeCloseStdin(stdin) {
|
|
23
|
+
try {
|
|
24
|
+
stdin.end();
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
console.debug('[spawner] safeCloseStdin failed (stdin may already be closed):', e.message);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Set up per-agent timeout enforcement with warning at 80% and escalating shutdown.
|
|
32
|
+
*
|
|
33
|
+
* Returns a `timedOut` accessor function (closure over mutable state).
|
|
34
|
+
*/
|
|
35
|
+
export function setupTimeoutEnforcement(config, runningAgent, deliveryName, sessionId, runningAgents) {
|
|
36
|
+
let timedOut = false;
|
|
37
|
+
const timeoutMs = config.sessionTimeoutMs;
|
|
38
|
+
if (timeoutMs <= 0) {
|
|
39
|
+
return { getTimedOut: () => timedOut };
|
|
40
|
+
}
|
|
41
|
+
// Warning at 80% of timeout -- send warning via stdin
|
|
42
|
+
const warningMs = Math.floor(timeoutMs * 0.8);
|
|
43
|
+
runningAgent.warningTimer = setTimeout(() => {
|
|
44
|
+
const remaining = Math.ceil((timeoutMs - warningMs) / 60000);
|
|
45
|
+
console.warn(`[timeout] Agent for "${deliveryName}" at 80% of timeout limit. ` +
|
|
46
|
+
`Sending warning via stdin. ~${remaining} min remaining.`);
|
|
47
|
+
sendMessage(runningAgent.stdin, `WARNING: You have approximately ${remaining} minutes remaining before the session ` +
|
|
48
|
+
`is terminated. Please wrap up your current work, commit changes, and prepare to exit.`);
|
|
49
|
+
}, warningMs);
|
|
50
|
+
// Hard timeout -- escalating shutdown: message -> close stdin -> SIGTERM -> SIGKILL
|
|
51
|
+
runningAgent.timeoutTimer = setTimeout(() => {
|
|
52
|
+
timedOut = true;
|
|
53
|
+
console.error(`[timeout] Agent for "${deliveryName}" exceeded ${timeoutMs / 60000} min timeout. ` +
|
|
54
|
+
`Sending shutdown message...`);
|
|
55
|
+
runningAgent.streamState = 'shutting_down';
|
|
56
|
+
sendMessage(runningAgent.stdin, `TIMEOUT: Session time limit reached. Stop all work immediately, commit any changes, and exit now.`);
|
|
57
|
+
scheduleTimeoutEscalation(runningAgent, deliveryName, sessionId, runningAgents);
|
|
58
|
+
}, timeoutMs);
|
|
59
|
+
return { getTimedOut: () => timedOut };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Schedule escalating shutdown steps after the initial timeout message:
|
|
63
|
+
* stdin close -> SIGTERM -> SIGKILL
|
|
64
|
+
*/
|
|
65
|
+
function scheduleTimeoutEscalation(agent, deliveryName, sessionId, runningAgents) {
|
|
66
|
+
// Close stdin after a short grace period to signal EOF
|
|
67
|
+
setTimeout(() => safeCloseStdin(agent.stdin), 10000);
|
|
68
|
+
// SIGTERM after stdin close grace period
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
if (!runningAgents.has(sessionId))
|
|
71
|
+
return;
|
|
72
|
+
console.error(`[timeout] Agent for "${deliveryName}" did not exit after stdin close. Sending SIGTERM...`);
|
|
73
|
+
safeSendSignal(agent.pid, 'SIGTERM');
|
|
74
|
+
}, 20000);
|
|
75
|
+
// SIGKILL as absolute last resort
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
if (!runningAgents.has(sessionId))
|
|
78
|
+
return;
|
|
79
|
+
console.error(`[timeout] Agent for "${deliveryName}" still running. Sending SIGKILL...`);
|
|
80
|
+
safeSendSignal(agent.pid, 'SIGKILL');
|
|
81
|
+
}, 30000);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Initiate graceful shutdown for an agent session.
|
|
85
|
+
*
|
|
86
|
+
* Sends a wrap-up message via stdin, waits for the process to exit,
|
|
87
|
+
* and escalates to SIGTERM/SIGKILL if needed.
|
|
88
|
+
*/
|
|
89
|
+
export function initiateGracefulShutdown(agent, deliveryName, runningAgents) {
|
|
90
|
+
const GRACE_PERIOD_MS = 60000; // 60s for agent to wrap up
|
|
91
|
+
const ESCALATION_STEP_MS = 10000; // 10s between escalation steps
|
|
92
|
+
// Send wrap-up message
|
|
93
|
+
sendMessage(agent.stdin, 'All work is complete. Please commit any remaining changes, clean up, and exit.');
|
|
94
|
+
// Flat escalation chain using absolute offsets from now
|
|
95
|
+
// Step 1: Close stdin after grace period
|
|
96
|
+
const graceTimer = setTimeout(() => {
|
|
97
|
+
if (!runningAgents.has(agent.sessionId))
|
|
98
|
+
return;
|
|
99
|
+
console.warn(`[shutdown] Agent for "${deliveryName}" did not exit within grace period. Closing stdin...`);
|
|
100
|
+
safeCloseStdin(agent.stdin);
|
|
101
|
+
}, GRACE_PERIOD_MS);
|
|
102
|
+
// Step 2: SIGTERM after grace period + one escalation step
|
|
103
|
+
setTimeout(() => {
|
|
104
|
+
if (!runningAgents.has(agent.sessionId))
|
|
105
|
+
return;
|
|
106
|
+
console.warn(`[shutdown] Agent for "${deliveryName}" did not exit after stdin close. Sending SIGTERM...`);
|
|
107
|
+
safeSendSignal(agent.pid, 'SIGTERM');
|
|
108
|
+
}, GRACE_PERIOD_MS + ESCALATION_STEP_MS);
|
|
109
|
+
// Step 3: SIGKILL after grace period + two escalation steps
|
|
110
|
+
setTimeout(() => {
|
|
111
|
+
if (!runningAgents.has(agent.sessionId))
|
|
112
|
+
return;
|
|
113
|
+
console.error(`[shutdown] Agent for "${deliveryName}" still running. Sending SIGKILL...`);
|
|
114
|
+
safeSendSignal(agent.pid, 'SIGKILL');
|
|
115
|
+
}, GRACE_PERIOD_MS + ESCALATION_STEP_MS * 2);
|
|
116
|
+
// Clean up timer if process exits before grace period
|
|
117
|
+
const checkExit = setInterval(() => {
|
|
118
|
+
if (!runningAgents.has(agent.sessionId)) {
|
|
119
|
+
clearTimeout(graceTimer);
|
|
120
|
+
clearInterval(checkExit);
|
|
121
|
+
}
|
|
122
|
+
}, 1000);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=spawner-timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawner-timeout.js","sourceRoot":"","sources":["../src/spawner-timeout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code spawner - manages spawning and tracking agent processes.
|
|
3
|
+
*
|
|
4
|
+
* Spawns agents at delivery level with full context including:
|
|
5
|
+
* - Product info (name, vision, description)
|
|
6
|
+
* - Delivery details (name, description, acceptance criteria, tech context)
|
|
7
|
+
* - All context groups and tasks within the delivery
|
|
8
|
+
*
|
|
9
|
+
* Each agent runs in an isolated git worktree created from the integration branch.
|
|
10
|
+
* On successful completion, the agent's branch is merged into integration.
|
|
11
|
+
*/
|
|
12
|
+
import type { DaemonConfig, AgentRole, RunningAgent } from './types.js';
|
|
13
|
+
import { type ResourceGovernor } from '@telora/daemon-core';
|
|
14
|
+
/** Inject the resource governor for global concurrency limiting. */
|
|
15
|
+
export declare function initGovernor(gov: ResourceGovernor): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get map of running agents.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getRunningAgents(): Map<string, RunningAgent>;
|
|
20
|
+
/**
|
|
21
|
+
* Spawn a Claude Code agent to work on a delivery.
|
|
22
|
+
*
|
|
23
|
+
* The agent runs in an isolated git worktree created from the integration branch.
|
|
24
|
+
* On successful completion, the agent's changes are merged back to integration.
|
|
25
|
+
*/
|
|
26
|
+
export declare function spawnAgentForDelivery(config: DaemonConfig, deliveryId: string, role: AgentRole, strategyId: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Terminate a running agent.
|
|
29
|
+
* Sends a shutdown message via stdin, then escalates to SIGTERM/SIGKILL.
|
|
30
|
+
*/
|
|
31
|
+
export declare function terminateAgent(sessionId: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Terminate all running agents.
|
|
34
|
+
*/
|
|
35
|
+
export declare function terminateAllAgents(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Check if an agent is running for a session.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isAgentRunning(sessionId: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Get count of running agents.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getRunningAgentCount(): number;
|
|
44
|
+
/**
|
|
45
|
+
* Spawn a short-lived, single-purpose Claude Code agent for merge conflict resolution.
|
|
46
|
+
*
|
|
47
|
+
* Used when no active team exists for a strategy but merge conflicts need resolution.
|
|
48
|
+
* The agent receives a focused prompt with conflict details, resolves in the existing
|
|
49
|
+
* worktree, and exits. No session DB record, no streaming, no team mode.
|
|
50
|
+
*/
|
|
51
|
+
export declare function spawnResolutionAgent(params: {
|
|
52
|
+
config: DaemonConfig;
|
|
53
|
+
worktreePath: string;
|
|
54
|
+
branchName: string;
|
|
55
|
+
integrationBranch: string;
|
|
56
|
+
conflictFiles: string[];
|
|
57
|
+
strategyDescription: string;
|
|
58
|
+
}): Promise<{
|
|
59
|
+
success: boolean;
|
|
60
|
+
error?: string;
|
|
61
|
+
}>;
|
|
62
|
+
/**
|
|
63
|
+
* Check if a process is alive. Returns false if the process doesn't exist
|
|
64
|
+
* or is a zombie on Linux.
|
|
65
|
+
*/
|
|
66
|
+
export declare function isProcessAlive(pid: number): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Check all running agents for PID liveness.
|
|
69
|
+
*
|
|
70
|
+
* If an agent's process has disappeared (OOM kill, external kill -9, etc.)
|
|
71
|
+
* without firing a 'close' event, clean up the agent entry and update the
|
|
72
|
+
* session in the database.
|
|
73
|
+
*
|
|
74
|
+
* Guards against double-cleanup by checking runningAgents.has() before acting.
|
|
75
|
+
*/
|
|
76
|
+
export declare function checkAgentLiveness(config: DaemonConfig): Promise<void>;
|
|
77
|
+
//# sourceMappingURL=spawner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawner.d.ts","sourceRoot":"","sources":["../src/spawner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAmB,YAAY,EAAY,MAAM,YAAY,CAAC;AAQnG,OAAO,EAA+F,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAczJ,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAE5D;AAsJD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA8Mf;AAmND;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CA2BzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAOD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkFhD;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAwBnD;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD5E"}
|