@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/.env.example
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Telora Agent Orchestration Daemon Configuration
|
|
2
|
+
#
|
|
3
|
+
# Uses tracker-based authentication - same as Telora MCP server.
|
|
4
|
+
# You can use the same TELORA_TRACKER_ID and TELORA_URL as your MCP config.
|
|
5
|
+
|
|
6
|
+
# Telora API Connection (required)
|
|
7
|
+
# Copy these from your .mcp.json telora-products config
|
|
8
|
+
TELORA_URL=http://127.0.0.1:54321
|
|
9
|
+
TELORA_TRACKER_ID=your-tracker-uuid
|
|
10
|
+
|
|
11
|
+
# Organization to watch (required)
|
|
12
|
+
TELORA_ORGANIZATION_ID=your-organization-uuid
|
|
13
|
+
|
|
14
|
+
# Product to scope the daemon to (optional)
|
|
15
|
+
# If set, daemon only picks up deliveries for this product.
|
|
16
|
+
# If not set, daemon picks up ALL org deliveries.
|
|
17
|
+
# TELORA_PRODUCT_ID=your-product-uuid
|
|
18
|
+
|
|
19
|
+
# Repository path (optional, defaults to cwd)
|
|
20
|
+
TELORA_REPO_PATH=/path/to/your/repo
|
|
21
|
+
|
|
22
|
+
# Claude Code executable (optional, defaults to 'claude')
|
|
23
|
+
CLAUDE_CODE_PATH=claude
|
|
24
|
+
|
|
25
|
+
# MCP configuration file (optional)
|
|
26
|
+
# If set, daemon passes this to spawned Claude Code instances
|
|
27
|
+
MCP_CONFIG_PATH=/path/to/mcp-config.json
|
|
28
|
+
|
|
29
|
+
# Log directory (optional, defaults to .telora/logs in repo)
|
|
30
|
+
TELORA_LOG_DIR=/path/to/logs
|
|
31
|
+
|
|
32
|
+
# Worktree directory for parallel agent branches (optional, defaults to .telora/worktrees in repo)
|
|
33
|
+
# Each agent session gets its own worktree for branch isolation
|
|
34
|
+
TELORA_WORKTREE_DIR=/path/to/worktrees
|
|
35
|
+
|
|
36
|
+
# Integration branch (optional, defaults to 'integration')
|
|
37
|
+
# Agents merge their work to this branch on successful completion instead of main.
|
|
38
|
+
# Human reviewers promote changes from integration to main after review.
|
|
39
|
+
TELORA_INTEGRATION_BRANCH=integration
|
|
40
|
+
|
|
41
|
+
# Session limits (optional)
|
|
42
|
+
MAX_TOTAL_SESSIONS=5
|
|
43
|
+
SESSION_TIMEOUT_MS=3600000
|
|
44
|
+
TOKEN_LIMIT=200000
|
|
45
|
+
COST_LIMIT=10.0
|
|
46
|
+
|
|
47
|
+
# Merge lock settings (optional)
|
|
48
|
+
# How long to wait for the merge lock before timing out (ms, default: 300000 = 5 min)
|
|
49
|
+
MERGE_LOCK_TIMEOUT_MS=300000
|
|
50
|
+
# Log a contention warning if lock acquisition takes longer than this (ms, default: 30000 = 30s)
|
|
51
|
+
MERGE_LOCK_CONTENTION_WARNING_MS=30000
|
|
52
|
+
|
|
53
|
+
# Guard evaluation failure mode (optional, default: fail-open)
|
|
54
|
+
# "fail-open" = allow transition when guard evaluation errors
|
|
55
|
+
# "fail-closed" = block transition when guard evaluation errors
|
|
56
|
+
TELORA_POLICY_FAILURE_MODE=fail-open
|
|
57
|
+
|
|
58
|
+
# Log retention policy (optional)
|
|
59
|
+
# Delete log files older than this many days (default: 7)
|
|
60
|
+
LOG_MAX_AGE_DAYS=7
|
|
61
|
+
# Maximum total size of all log files in bytes (default: 1073741824 = 1 GB)
|
|
62
|
+
LOG_MAX_TOTAL_BYTES=1073741824
|
|
63
|
+
# Maximum number of log files to keep (default: 500)
|
|
64
|
+
LOG_MAX_FILES=500
|
package/README.md
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# @telora/daemon
|
|
2
|
+
|
|
3
|
+
Agent orchestration daemon for Telora - spawns and manages Claude Code instances to work on deliveries autonomously.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The Telora daemon watches for active strategies in your Telora organization and spawns Claude Code Agent Teams to execute them. Each strategy gets a single Agent Team that coordinates work across all deliveries and issues.
|
|
8
|
+
|
|
9
|
+
Key features:
|
|
10
|
+
- **Strategy-level Agent Teams**: One team per strategy manages all deliveries, building a task DAG and coordinating parallel execution
|
|
11
|
+
- **Multi-repo support**: Multiple daemons can run against the same Telora org, each handling strategies for different repos
|
|
12
|
+
- **Integration branch workflow**: Teams work on isolated branches, auto-merge to integration on success
|
|
13
|
+
- **Worktree isolation**: Each team gets its own git worktree
|
|
14
|
+
- **Dynamic delivery pickup**: Teams detect and incorporate new deliveries added mid-execution
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
The `@telora/daemon` package is published to an internal Gitea npm registry. You need registry access before installing.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Configure npm to use the Telora registry for @telora packages
|
|
22
|
+
# Replace the URL below with your organization's Gitea instance URL
|
|
23
|
+
echo '@telora:registry=https://<your-gitea-host>/api/packages/syntelyos/npm/' >> ~/.npmrc
|
|
24
|
+
|
|
25
|
+
# Global installation
|
|
26
|
+
npm install -g @telora/daemon
|
|
27
|
+
|
|
28
|
+
# Or run directly with npx
|
|
29
|
+
npx @telora/daemon
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
> **Note:** The registry URL is organization-specific. Ask your team lead for the correct URL if you don't have it. The registry requires a valid npm token for authentication.
|
|
33
|
+
|
|
34
|
+
## Quick Start
|
|
35
|
+
|
|
36
|
+
### Option 1: Interactive Setup (Recommended)
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
cd /path/to/your/repo
|
|
40
|
+
npx @telora/daemon init
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The setup wizard will guide you through:
|
|
44
|
+
- Telora URL configuration
|
|
45
|
+
- Organization ID
|
|
46
|
+
- Integration branch name
|
|
47
|
+
- Max concurrent agents
|
|
48
|
+
|
|
49
|
+
Then set your tracker ID and start the daemon:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
export TELORA_TRACKER_ID=your-tracker-id-here
|
|
53
|
+
telora-daemon
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Option 2: Manual Setup
|
|
57
|
+
|
|
58
|
+
1. **Get your Tracker ID** from Telora:
|
|
59
|
+
- Go to Settings → AI Work Trackers
|
|
60
|
+
- Click "Generate Tracker ID" on your profile
|
|
61
|
+
- Copy the tracker ID
|
|
62
|
+
|
|
63
|
+
2. **Configure environment variables** in your repo:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
cd /path/to/your/repo
|
|
67
|
+
|
|
68
|
+
# Create .env file
|
|
69
|
+
cat > .env << EOF
|
|
70
|
+
TELORA_URL=https://your-telora-instance.supabase.co
|
|
71
|
+
TELORA_TRACKER_ID=your-tracker-id-here
|
|
72
|
+
TELORA_ORGANIZATION_ID=your-org-id-here
|
|
73
|
+
EOF
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
3. **Start the daemon**:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
telora-daemon
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Configuration
|
|
83
|
+
|
|
84
|
+
The daemon is configured via environment variables:
|
|
85
|
+
|
|
86
|
+
| Variable | Required | Default | Description |
|
|
87
|
+
|----------|----------|---------|-------------|
|
|
88
|
+
| `TELORA_URL` | Yes | - | Telora API URL |
|
|
89
|
+
| `TELORA_TRACKER_ID` | Yes | - | Your tracker ID for authentication |
|
|
90
|
+
| `TELORA_ORGANIZATION_ID` | Yes | - | Organization to watch for work |
|
|
91
|
+
| `TELORA_REPO_PATH` | No | `cwd()` | Path to git repository |
|
|
92
|
+
| `TELORA_INTEGRATION_BRANCH` | No | `integration` | Branch for agent merges |
|
|
93
|
+
| `TELORA_WORKTREE_DIR` | No | `.telora/worktrees` | Directory for git worktrees |
|
|
94
|
+
| `TELORA_LOG_DIR` | No | `.telora/logs` | Directory for agent logs |
|
|
95
|
+
| `CLAUDE_CODE_PATH` | No | `claude` | Path to Claude Code executable |
|
|
96
|
+
| `MCP_CONFIG_PATH` | No | - | Path to MCP config file |
|
|
97
|
+
| `MAX_TOTAL_SESSIONS` | No | `5` | Max concurrent agents |
|
|
98
|
+
| `SESSION_TIMEOUT_MS` | No | `3600000` | Session timeout (1 hour) |
|
|
99
|
+
| `TOKEN_LIMIT` | No | `200000` | Max tokens per session |
|
|
100
|
+
| `COST_LIMIT` | No | `10.0` | Max cost per session ($) |
|
|
101
|
+
|
|
102
|
+
## CLI Options
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
telora-daemon [options]
|
|
106
|
+
|
|
107
|
+
Options:
|
|
108
|
+
-V, --version Output version number
|
|
109
|
+
-v, --verbose Enable verbose logging
|
|
110
|
+
-c, --config <path> Path to config file (default: .telora/daemon.json)
|
|
111
|
+
--dry-run Print configuration and exit
|
|
112
|
+
-h, --help Display help
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Config File
|
|
116
|
+
|
|
117
|
+
Instead of environment variables, you can use a JSON config file. The daemon looks for `.telora/daemon.json` by default.
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"teloraUrl": "https://your-telora-instance.supabase.co",
|
|
122
|
+
"organizationId": "your-organization-uuid",
|
|
123
|
+
"productId": "your-product-uuid",
|
|
124
|
+
"integrationBranch": "integration",
|
|
125
|
+
"maxTotalSessions": 5
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Configuration priority** (highest to lowest):
|
|
130
|
+
1. Environment variables
|
|
131
|
+
2. Config file values
|
|
132
|
+
3. Default values
|
|
133
|
+
|
|
134
|
+
**Security note:** The `trackerId` must always be set via the `TELORA_TRACKER_ID` environment variable. It cannot be set in the config file (which is safe to commit to git).
|
|
135
|
+
|
|
136
|
+
Available config file fields:
|
|
137
|
+
- `teloraUrl` - Telora API URL
|
|
138
|
+
- `organizationId` - Organization UUID
|
|
139
|
+
- `productId` - Product UUID (scopes daemon to one product; omit to handle all)
|
|
140
|
+
- `repoPath` - Repository path
|
|
141
|
+
- `worktreeDir` - Worktree directory
|
|
142
|
+
- `integrationBranch` - Integration branch name
|
|
143
|
+
- `claudeCodePath` - Claude Code executable path
|
|
144
|
+
- `mcpConfigPath` - MCP config file path
|
|
145
|
+
- `logDir` - Log directory
|
|
146
|
+
- `maxTotalSessions` - Max concurrent agents
|
|
147
|
+
- `sessionTimeoutMs` - Session timeout in milliseconds
|
|
148
|
+
- `tokenLimit` - Max tokens per session
|
|
149
|
+
- `costLimit` - Max cost per session in dollars
|
|
150
|
+
|
|
151
|
+
## How It Works
|
|
152
|
+
|
|
153
|
+
### Strategy Team Execution Model
|
|
154
|
+
|
|
155
|
+
1. **Strategy polling**: The daemon polls Telora every 30 seconds for active strategies with an assigned agent role and queued deliveries
|
|
156
|
+
2. **Filtering**: Only picks up strategies for the configured `productId` (if set)
|
|
157
|
+
3. **Team spawning**: For each ready strategy, spawns a single Claude Code Agent Team (one team per strategy)
|
|
158
|
+
4. **Task DAG**: The team lead reads all deliveries and issues, builds a dependency graph respecting delivery priority and file overlap
|
|
159
|
+
5. **Parallel execution**: Workers execute issues in parallel where safe (no file conflicts), sequentially where needed
|
|
160
|
+
6. **Delivery progression**: As issues complete, deliveries advance through workflow stages (coding -> verify -> done)
|
|
161
|
+
7. **Merge on success**: When all deliveries are complete, the strategy branch is merged to integration
|
|
162
|
+
8. **Dynamic pickup**: If new deliveries are added to the strategy mid-execution, the team incorporates them automatically
|
|
163
|
+
|
|
164
|
+
### Key daemon modules
|
|
165
|
+
|
|
166
|
+
- `strategy-executor.ts` - Strategy team lifecycle (spawn, monitor, completion)
|
|
167
|
+
- `task-dag-builder.ts` - Pure function that builds dependency graphs from deliveries/issues
|
|
168
|
+
- `strategy-prompt-builder.ts` - Builds the team lead's prompt with all context
|
|
169
|
+
- `delivery-lifecycle.ts` - Extracted guard evaluation, stage transition, git merge functions
|
|
170
|
+
- `completion-handler.ts` - Per-delivery completion (used by team lead for sub-delivery transitions)
|
|
171
|
+
- `spawner.ts` - Process spawning with Agent Teams mode always enabled
|
|
172
|
+
|
|
173
|
+
## Multi-Repo Setup
|
|
174
|
+
|
|
175
|
+
To run agents on multiple repositories:
|
|
176
|
+
|
|
177
|
+
1. Set `productId` in each daemon's `.telora/daemon.json` (or `TELORA_PRODUCT_ID` env var)
|
|
178
|
+
2. Run one daemon per repository:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# Terminal 1 - Repo A (productId set in .telora/daemon.json)
|
|
182
|
+
cd /path/to/repo-a
|
|
183
|
+
telora-daemon
|
|
184
|
+
|
|
185
|
+
# Terminal 2 - Repo B (productId set in .telora/daemon.json)
|
|
186
|
+
cd /path/to/repo-b
|
|
187
|
+
telora-daemon
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Each daemon only picks up deliveries for the configured product.
|
|
191
|
+
|
|
192
|
+
## Signals
|
|
193
|
+
|
|
194
|
+
- `SIGINT` / `SIGTERM`: Graceful shutdown (waits for agents to checkpoint)
|
|
195
|
+
- `SIGUSR1`: Print status of running agents
|
|
196
|
+
|
|
197
|
+
## Running in Production vs Development
|
|
198
|
+
|
|
199
|
+
**For production use**, always run the daemon with the compiled version:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Global install (recommended)
|
|
203
|
+
npm install -g @telora/daemon
|
|
204
|
+
telora-daemon
|
|
205
|
+
|
|
206
|
+
# Or from source
|
|
207
|
+
cd packages/daemon
|
|
208
|
+
npm run build
|
|
209
|
+
npm start
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Do NOT use `npm run dev`** (watch mode) when agents are running. The file watcher will restart the daemon whenever source files change, which kills any running agents and may leave sessions in a stuck "running" state.
|
|
213
|
+
|
|
214
|
+
If you need to modify daemon code while agents are working:
|
|
215
|
+
1. Wait for agents to complete
|
|
216
|
+
2. Or stop the daemon gracefully (Ctrl+C)
|
|
217
|
+
3. Make your changes
|
|
218
|
+
4. Restart the daemon
|
|
219
|
+
|
|
220
|
+
## Requirements
|
|
221
|
+
|
|
222
|
+
- Node.js 20+
|
|
223
|
+
- Claude Code CLI (`claude`) installed and authenticated
|
|
224
|
+
- Git repository with write access
|
|
225
|
+
- Active Telora account with AI Work Tracker
|
|
226
|
+
|
|
227
|
+
## License
|
|
228
|
+
|
|
229
|
+
MIT
|
package/build-info.json
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon-specific ActivityTracker -- thin wrapper around @telora/daemon-core.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the shared ActivitySnapshot type and provides a daemon-specific
|
|
5
|
+
* ActivityTracker subclass that flushes snapshots to agent_sessions via
|
|
6
|
+
* updateSession().
|
|
7
|
+
*/
|
|
8
|
+
import { ActivityTracker as CoreActivityTracker, type ActivitySnapshot } from '@telora/daemon-core';
|
|
9
|
+
export type { ActivitySnapshot };
|
|
10
|
+
export declare class ActivityTracker extends CoreActivityTracker {
|
|
11
|
+
constructor(sessionId: string);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=activity-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-tracker.d.ts","sourceRoot":"","sources":["../src/activity-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGpG,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,qBAAa,eAAgB,SAAQ,mBAAmB;gBAC1C,SAAS,EAAE,MAAM;CAO9B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon-specific ActivityTracker -- thin wrapper around @telora/daemon-core.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the shared ActivitySnapshot type and provides a daemon-specific
|
|
5
|
+
* ActivityTracker subclass that flushes snapshots to agent_sessions via
|
|
6
|
+
* updateSession().
|
|
7
|
+
*/
|
|
8
|
+
import { ActivityTracker as CoreActivityTracker } from '@telora/daemon-core';
|
|
9
|
+
import { updateSession } from './queries/sessions.js';
|
|
10
|
+
export class ActivityTracker extends CoreActivityTracker {
|
|
11
|
+
constructor(sessionId) {
|
|
12
|
+
super(sessionId, async (snapshot) => {
|
|
13
|
+
await updateSession(sessionId, {
|
|
14
|
+
activity_summary: snapshot,
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=activity-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-tracker.js","sourceRoot":"","sources":["../src/activity-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAyB,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,MAAM,OAAO,eAAgB,SAAQ,mBAAmB;IACtD,YAAY,SAAiB;QAC3B,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,QAA0B,EAAE,EAAE;YACpD,MAAM,aAAa,CAAC,SAAS,EAAE;gBAC7B,gBAAgB,EAAE,QAA8C;aACjE,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared agent state module -- breaks the circular dependency between
|
|
3
|
+
* heartbeat.ts and spawner.ts by centralizing state that both modules need.
|
|
4
|
+
*
|
|
5
|
+
* Contains:
|
|
6
|
+
* - Running agents map (read by heartbeat, written by spawner)
|
|
7
|
+
* - Session completion counters (written by spawner/completion-handler, read by heartbeat)
|
|
8
|
+
* - Activity tracking (written by spawner/listener, read by heartbeat)
|
|
9
|
+
*/
|
|
10
|
+
import type { RunningAgent } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Get map of running agents.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getRunningAgents(): Map<string, RunningAgent>;
|
|
15
|
+
/**
|
|
16
|
+
* Record a completed session (called by spawner when an agent finishes).
|
|
17
|
+
*/
|
|
18
|
+
export declare function recordSessionCompleted(tokens: number, cost: number): void;
|
|
19
|
+
/**
|
|
20
|
+
* Get current session completion counters (read by heartbeat).
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSessionCounters(): {
|
|
23
|
+
completedSessionCount: number;
|
|
24
|
+
totalTokensUsed: number;
|
|
25
|
+
totalCost: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Bootstrap session counters from database values.
|
|
29
|
+
* Called by heartbeat on startup to reflect cumulative history.
|
|
30
|
+
*/
|
|
31
|
+
export declare function setSessionCounters(counters: {
|
|
32
|
+
completedSessionCount: number;
|
|
33
|
+
totalTokensUsed: number;
|
|
34
|
+
totalCost: number;
|
|
35
|
+
}): void;
|
|
36
|
+
/**
|
|
37
|
+
* Record daemon activity. Call this whenever meaningful work occurs
|
|
38
|
+
* (spawning agents, completing sessions, polling, merges, etc.).
|
|
39
|
+
*/
|
|
40
|
+
export declare function recordActivity(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Get the last activity timestamp (for diagnostics/testing).
|
|
43
|
+
*/
|
|
44
|
+
export declare function getLastActivityAt(): Date;
|
|
45
|
+
//# sourceMappingURL=agent-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-state.d.ts","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAE5D;AAQD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,CAEA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAC3C,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAIP;AAMD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared agent state module -- breaks the circular dependency between
|
|
3
|
+
* heartbeat.ts and spawner.ts by centralizing state that both modules need.
|
|
4
|
+
*
|
|
5
|
+
* Contains:
|
|
6
|
+
* - Running agents map (read by heartbeat, written by spawner)
|
|
7
|
+
* - Session completion counters (written by spawner/completion-handler, read by heartbeat)
|
|
8
|
+
* - Activity tracking (written by spawner/listener, read by heartbeat)
|
|
9
|
+
*/
|
|
10
|
+
// ── Running agents map ──────────────────────────────────────────────
|
|
11
|
+
/** Running agents map: sessionId -> RunningAgent */
|
|
12
|
+
const runningAgents = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Get map of running agents.
|
|
15
|
+
*/
|
|
16
|
+
export function getRunningAgents() {
|
|
17
|
+
return runningAgents;
|
|
18
|
+
}
|
|
19
|
+
// ── Session completion counters ─────────────────────────────────────
|
|
20
|
+
let completedSessionCount = 0;
|
|
21
|
+
let totalTokensUsed = 0;
|
|
22
|
+
let totalCost = 0;
|
|
23
|
+
/**
|
|
24
|
+
* Record a completed session (called by spawner when an agent finishes).
|
|
25
|
+
*/
|
|
26
|
+
export function recordSessionCompleted(tokens, cost) {
|
|
27
|
+
completedSessionCount++;
|
|
28
|
+
totalTokensUsed += tokens;
|
|
29
|
+
totalCost += cost;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get current session completion counters (read by heartbeat).
|
|
33
|
+
*/
|
|
34
|
+
export function getSessionCounters() {
|
|
35
|
+
return { completedSessionCount, totalTokensUsed, totalCost };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Bootstrap session counters from database values.
|
|
39
|
+
* Called by heartbeat on startup to reflect cumulative history.
|
|
40
|
+
*/
|
|
41
|
+
export function setSessionCounters(counters) {
|
|
42
|
+
completedSessionCount = counters.completedSessionCount;
|
|
43
|
+
totalTokensUsed = counters.totalTokensUsed;
|
|
44
|
+
totalCost = counters.totalCost;
|
|
45
|
+
}
|
|
46
|
+
// ── Activity tracking ───────────────────────────────────────────────
|
|
47
|
+
let lastActivityAt = new Date();
|
|
48
|
+
/**
|
|
49
|
+
* Record daemon activity. Call this whenever meaningful work occurs
|
|
50
|
+
* (spawning agents, completing sessions, polling, merges, etc.).
|
|
51
|
+
*/
|
|
52
|
+
export function recordActivity() {
|
|
53
|
+
lastActivityAt = new Date();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the last activity timestamp (for diagnostics/testing).
|
|
57
|
+
*/
|
|
58
|
+
export function getLastActivityAt() {
|
|
59
|
+
return lastActivityAt;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=agent-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-state.js","sourceRoot":"","sources":["../src/agent-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,uEAAuE;AAEvE,oDAAoD;AACpD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,uEAAuE;AAEvE,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAC9B,IAAI,eAAe,GAAG,CAAC,CAAC;AACxB,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,IAAY;IACjE,qBAAqB,EAAE,CAAC;IACxB,eAAe,IAAI,MAAM,CAAC;IAC1B,SAAS,IAAI,IAAI,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAKhC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAIlC;IACC,qBAAqB,GAAG,QAAQ,CAAC,qBAAqB,CAAC;IACvD,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;IAC3C,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;AACjC,CAAC;AAED,uEAAuE;AAEvE,IAAI,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-commit hook management for read-only audit sessions.
|
|
3
|
+
*
|
|
4
|
+
* Installs a git pre-commit hook in a worktree that blocks all commits,
|
|
5
|
+
* providing an informative message about the read-only audit mode.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Install a pre-commit hook in a worktree that blocks all commits.
|
|
9
|
+
* Used for read-only audit sessions.
|
|
10
|
+
*/
|
|
11
|
+
export declare function installAuditPreCommitHook(worktreePath: string): void;
|
|
12
|
+
//# sourceMappingURL=audit-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-hooks.d.ts","sourceRoot":"","sources":["../src/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAiCpE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-commit hook management for read-only audit sessions.
|
|
3
|
+
*
|
|
4
|
+
* Installs a git pre-commit hook in a worktree that blocks all commits,
|
|
5
|
+
* providing an informative message about the read-only audit mode.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { runGitSync } from './git-types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Install a pre-commit hook in a worktree that blocks all commits.
|
|
12
|
+
* Used for read-only audit sessions.
|
|
13
|
+
*/
|
|
14
|
+
export function installAuditPreCommitHook(worktreePath) {
|
|
15
|
+
// Create a custom hooks directory inside the worktree
|
|
16
|
+
const hooksDir = join(worktreePath, '.telora-hooks');
|
|
17
|
+
if (!existsSync(hooksDir)) {
|
|
18
|
+
mkdirSync(hooksDir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
const hookScript = [
|
|
21
|
+
'#!/bin/bash',
|
|
22
|
+
'echo ""',
|
|
23
|
+
'echo "========================================================"',
|
|
24
|
+
'echo " READ-ONLY AUDIT SESSION"',
|
|
25
|
+
'echo "========================================================"',
|
|
26
|
+
'echo ""',
|
|
27
|
+
'echo " Commits are blocked. This session operates in"',
|
|
28
|
+
'echo " read-only audit mode by design."',
|
|
29
|
+
'echo ""',
|
|
30
|
+
'echo " Your job is discovery only:"',
|
|
31
|
+
'echo " - Log findings as issues via MCP tools"',
|
|
32
|
+
'echo " - Create remediation deliveries for fixes"',
|
|
33
|
+
'echo " - Do NOT modify or commit code changes"',
|
|
34
|
+
'echo ""',
|
|
35
|
+
'echo "========================================================"',
|
|
36
|
+
'echo ""',
|
|
37
|
+
'exit 1',
|
|
38
|
+
'',
|
|
39
|
+
].join('\n');
|
|
40
|
+
const hookPath = join(hooksDir, 'pre-commit');
|
|
41
|
+
writeFileSync(hookPath, hookScript, { mode: 0o755 });
|
|
42
|
+
// Point this worktree's git config at the custom hooks directory
|
|
43
|
+
runGitSync(['config', 'core.hooksPath', hooksDir], worktreePath);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=audit-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-hooks.js","sourceRoot":"","sources":["../src/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,sDAAsD;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,aAAa;QACb,SAAS;QACT,iEAAiE;QACjE,kCAAkC;QAClC,iEAAiE;QACjE,SAAS;QACT,wDAAwD;QACxD,0CAA0C;QAC1C,SAAS;QACT,sCAAsC;QACtC,iDAAiD;QACjD,oDAAoD;QACpD,iDAAiD;QACjD,SAAS;QACT,iEAAiE;QACjE,SAAS;QACT,QAAQ;QACR,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC9C,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAErD,iEAAiE;IACjE,UAAU,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon auto-update module.
|
|
3
|
+
*
|
|
4
|
+
* Periodically checks the npm registry for a newer version of @telora/daemon.
|
|
5
|
+
* When an update is detected and all engines are idle, installs the new version
|
|
6
|
+
* globally and signals the process to exit with code 75 (restart-after-update).
|
|
7
|
+
*
|
|
8
|
+
* A wrapper script or systemd RestartForceExitStatus=75 handles the actual
|
|
9
|
+
* process restart, which then runs the newly installed version.
|
|
10
|
+
*/
|
|
11
|
+
/** Exit code that signals "restart after self-update". */
|
|
12
|
+
export declare const EXIT_CODE_UPDATE = 75;
|
|
13
|
+
export interface AutoUpdateOptions {
|
|
14
|
+
/** Current daemon version string (e.g., "0.10.48"). */
|
|
15
|
+
currentVersion: string;
|
|
16
|
+
/** npm package name (default: "@telora/daemon"). */
|
|
17
|
+
packageName?: string;
|
|
18
|
+
/** Check interval in milliseconds (default: 3600000 = 1 hour). */
|
|
19
|
+
intervalMs?: number;
|
|
20
|
+
/** Callback that returns true when all engines are idle. */
|
|
21
|
+
isIdle: () => boolean;
|
|
22
|
+
/** Called when update is installed and the process should exit with code 75. */
|
|
23
|
+
onUpdateReady: () => void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Run `npm install -g <package>@latest` as a child process.
|
|
27
|
+
* Returns true on success, false on failure.
|
|
28
|
+
*/
|
|
29
|
+
export declare function performSelfUpdate(packageName: string): Promise<boolean>;
|
|
30
|
+
/**
|
|
31
|
+
* Start a periodic auto-update check loop.
|
|
32
|
+
*
|
|
33
|
+
* Each cycle:
|
|
34
|
+
* 1. Check npm registry for a newer version
|
|
35
|
+
* 2. If update available and engines are idle, install it
|
|
36
|
+
* 3. On successful install, call onUpdateReady (which triggers exit 75)
|
|
37
|
+
* 4. If engines are busy, defer to the next cycle
|
|
38
|
+
*
|
|
39
|
+
* Returns a cleanup function that stops the timer.
|
|
40
|
+
*/
|
|
41
|
+
export declare function startAutoUpdateLoop(opts: AutoUpdateOptions): () => void;
|
|
42
|
+
//# sourceMappingURL=auto-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAInC,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,gFAAgF;IAChF,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAgEvE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon auto-update module.
|
|
3
|
+
*
|
|
4
|
+
* Periodically checks the npm registry for a newer version of @telora/daemon.
|
|
5
|
+
* When an update is detected and all engines are idle, installs the new version
|
|
6
|
+
* globally and signals the process to exit with code 75 (restart-after-update).
|
|
7
|
+
*
|
|
8
|
+
* A wrapper script or systemd RestartForceExitStatus=75 handles the actual
|
|
9
|
+
* process restart, which then runs the newly installed version.
|
|
10
|
+
*/
|
|
11
|
+
import { execFile } from 'node:child_process';
|
|
12
|
+
import { checkForUpdates } from './version-check.js';
|
|
13
|
+
/** Exit code that signals "restart after self-update". */
|
|
14
|
+
export const EXIT_CODE_UPDATE = 75;
|
|
15
|
+
const DEFAULT_INTERVAL_MS = 3_600_000; // 1 hour
|
|
16
|
+
/**
|
|
17
|
+
* Run `npm install -g <package>@latest` as a child process.
|
|
18
|
+
* Returns true on success, false on failure.
|
|
19
|
+
*/
|
|
20
|
+
export function performSelfUpdate(packageName) {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const target = `${packageName}@latest`;
|
|
23
|
+
console.log(`[auto-update] Installing ${target}...`);
|
|
24
|
+
execFile('npm', ['install', '-g', target], { timeout: 120_000 }, (err, stdout, stderr) => {
|
|
25
|
+
if (err) {
|
|
26
|
+
console.warn(`[auto-update] npm install failed: ${err.message}`);
|
|
27
|
+
if (stderr)
|
|
28
|
+
console.warn(`[auto-update] stderr: ${stderr.trim()}`);
|
|
29
|
+
resolve(false);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (stdout.trim())
|
|
33
|
+
console.log(`[auto-update] ${stdout.trim()}`);
|
|
34
|
+
console.log(`[auto-update] Successfully installed ${target}`);
|
|
35
|
+
resolve(true);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Start a periodic auto-update check loop.
|
|
41
|
+
*
|
|
42
|
+
* Each cycle:
|
|
43
|
+
* 1. Check npm registry for a newer version
|
|
44
|
+
* 2. If update available and engines are idle, install it
|
|
45
|
+
* 3. On successful install, call onUpdateReady (which triggers exit 75)
|
|
46
|
+
* 4. If engines are busy, defer to the next cycle
|
|
47
|
+
*
|
|
48
|
+
* Returns a cleanup function that stops the timer.
|
|
49
|
+
*/
|
|
50
|
+
export function startAutoUpdateLoop(opts) {
|
|
51
|
+
const { currentVersion, packageName = '@telora/daemon', intervalMs = DEFAULT_INTERVAL_MS, isIdle, onUpdateReady, } = opts;
|
|
52
|
+
let pendingVersion = null;
|
|
53
|
+
let stopped = false;
|
|
54
|
+
async function tick() {
|
|
55
|
+
if (stopped)
|
|
56
|
+
return;
|
|
57
|
+
try {
|
|
58
|
+
// If we already know about a pending update, skip the registry check
|
|
59
|
+
if (!pendingVersion) {
|
|
60
|
+
const result = await checkForUpdates(currentVersion, packageName);
|
|
61
|
+
if (result?.updateAvailable) {
|
|
62
|
+
pendingVersion = result.latestVersion;
|
|
63
|
+
console.log(`[auto-update] Update available: v${result.latestVersion} (current: v${currentVersion})`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (!pendingVersion)
|
|
67
|
+
return;
|
|
68
|
+
// Only update when idle
|
|
69
|
+
if (!isIdle()) {
|
|
70
|
+
console.log('[auto-update] Engines are busy, deferring update to next cycle');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Install the update
|
|
74
|
+
const ok = await performSelfUpdate(packageName);
|
|
75
|
+
if (!ok) {
|
|
76
|
+
// Reset so we retry the install next cycle
|
|
77
|
+
console.warn('[auto-update] Install failed, will retry next cycle');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Signal the shell to restart
|
|
81
|
+
onUpdateReady();
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
console.warn(`[auto-update] Unexpected error: ${err instanceof Error ? err.message : String(err)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const timer = setInterval(() => void tick(), intervalMs);
|
|
88
|
+
// Don't block process exit
|
|
89
|
+
timer.unref();
|
|
90
|
+
console.log(`[auto-update] Enabled (check every ${Math.round(intervalMs / 60_000)}min)`);
|
|
91
|
+
return () => {
|
|
92
|
+
stopped = true;
|
|
93
|
+
clearInterval(timer);
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=auto-update.js.map
|