@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,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency resolution for the task DAG.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from task-dag-builder.ts. Contains functions that analyze
|
|
5
|
+
* and resolve task dependencies, including cross-delivery dependencies,
|
|
6
|
+
* CG-level dependencies, and file overlap detection.
|
|
7
|
+
*
|
|
8
|
+
* Pure functions only (no side effects, no API calls).
|
|
9
|
+
*
|
|
10
|
+
* Dependency rules:
|
|
11
|
+
* 1. Delivery ordering: issues in delivery N are blocked by issues in delivery N-1
|
|
12
|
+
* (respects priorityRank ordering)
|
|
13
|
+
* 2. Within a delivery: issues under the same Context Group can run in parallel
|
|
14
|
+
* unless they share relevant files
|
|
15
|
+
* 3. File overlap detection: if two issues from different deliveries share files,
|
|
16
|
+
* the lower-priority delivery's issue is blocked by the higher-priority one
|
|
17
|
+
* 4. Context Groups themselves can run in parallel unless they share relevant files
|
|
18
|
+
*/
|
|
19
|
+
// ── File overlap detection ───────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Parse relevant files from a newline-delimited string into a set of normalized paths.
|
|
22
|
+
* Supports glob patterns -- for overlap detection, we treat the base path as the key.
|
|
23
|
+
*/
|
|
24
|
+
export function parseRelevantFiles(relevantFiles) {
|
|
25
|
+
if (!relevantFiles)
|
|
26
|
+
return new Set();
|
|
27
|
+
const paths = new Set();
|
|
28
|
+
for (const line of relevantFiles.split('\n')) {
|
|
29
|
+
const trimmed = line.trim();
|
|
30
|
+
if (!trimmed)
|
|
31
|
+
continue;
|
|
32
|
+
// Normalize: remove leading ./ and trailing globs for overlap comparison
|
|
33
|
+
const normalized = trimmed
|
|
34
|
+
.replace(/^\.\//, '')
|
|
35
|
+
.replace(/\/\*\*?.*$/, '') // Remove glob suffixes like /** or /*.ts
|
|
36
|
+
.replace(/\*.*$/, ''); // Remove wildcard suffixes
|
|
37
|
+
if (normalized) {
|
|
38
|
+
paths.add(normalized);
|
|
39
|
+
}
|
|
40
|
+
// Also keep the original pattern for more precise matching
|
|
41
|
+
paths.add(trimmed.replace(/^\.\//, ''));
|
|
42
|
+
}
|
|
43
|
+
return paths;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if two sets of file paths have any overlap.
|
|
47
|
+
* An overlap means the two issues touch the same files and should not
|
|
48
|
+
* be worked on in parallel.
|
|
49
|
+
*/
|
|
50
|
+
export function hasFileOverlap(filesA, filesB) {
|
|
51
|
+
if (filesA.size === 0 || filesB.size === 0)
|
|
52
|
+
return false;
|
|
53
|
+
for (const pathA of filesA) {
|
|
54
|
+
for (const pathB of filesB) {
|
|
55
|
+
// Exact match
|
|
56
|
+
if (pathA === pathB)
|
|
57
|
+
return true;
|
|
58
|
+
// One is a prefix of the other (directory overlap)
|
|
59
|
+
if (pathA.startsWith(pathB + '/') || pathB.startsWith(pathA + '/'))
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
// ── Cross-delivery dependencies ──────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* Add cross-delivery dependencies.
|
|
68
|
+
*
|
|
69
|
+
* For each delivery after the first, its issues are blocked by the
|
|
70
|
+
* issues in the immediately preceding delivery. This ensures deliveries
|
|
71
|
+
* execute in priority order while allowing parallelism within a delivery.
|
|
72
|
+
*
|
|
73
|
+
* We also check for file overlap across non-adjacent deliveries.
|
|
74
|
+
*/
|
|
75
|
+
export function addCrossDeliveryDependencies(nodes, sortedDeliveries, issuesByDelivery, _issueDeliveryRank) {
|
|
76
|
+
for (let i = 1; i < sortedDeliveries.length; i++) {
|
|
77
|
+
const currentDelivery = sortedDeliveries[i];
|
|
78
|
+
const prevDelivery = sortedDeliveries[i - 1];
|
|
79
|
+
const currentIssues = issuesByDelivery.get(currentDelivery.id) ?? [];
|
|
80
|
+
const prevIssues = issuesByDelivery.get(prevDelivery.id) ?? [];
|
|
81
|
+
// Get actionable issue IDs from the previous delivery
|
|
82
|
+
const prevActionableIds = prevIssues
|
|
83
|
+
.filter(issue => issue.issueType !== 'Context Group' && issue.status !== 'Done')
|
|
84
|
+
.map(issue => issue.id);
|
|
85
|
+
if (prevActionableIds.length === 0)
|
|
86
|
+
continue;
|
|
87
|
+
// Block all current delivery's issues on all previous delivery's issues
|
|
88
|
+
for (const issue of currentIssues) {
|
|
89
|
+
if (issue.issueType === 'Context Group' || issue.status === 'Done')
|
|
90
|
+
continue;
|
|
91
|
+
const node = nodes.get(issue.id);
|
|
92
|
+
if (!node)
|
|
93
|
+
continue;
|
|
94
|
+
for (const prevId of prevActionableIds) {
|
|
95
|
+
if (nodes.has(prevId)) {
|
|
96
|
+
node.blockedBy.add(prevId);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// ── CG-level dependencies ────────────────────────────────────────
|
|
103
|
+
/**
|
|
104
|
+
* Add CG-level dependency enforcement within each delivery.
|
|
105
|
+
*
|
|
106
|
+
* For each Context Group that has a non-null `dependsOn` array,
|
|
107
|
+
* all child issues (Tasks/Bugs) under this CG are blocked by
|
|
108
|
+
* ALL child issues under each dependency CG. This creates a
|
|
109
|
+
* CG-level DAG: dependent CGs' issues can't start until
|
|
110
|
+
* dependency CGs' issues are all complete.
|
|
111
|
+
*/
|
|
112
|
+
export function addCGDependencies(nodes, sortedDeliveries, issuesByDelivery, _contextGroups) {
|
|
113
|
+
for (const delivery of sortedDeliveries) {
|
|
114
|
+
const deliveryIssues = issuesByDelivery.get(delivery.id) ?? [];
|
|
115
|
+
// Build a map: contextGroupId -> actionable child issue IDs (in the DAG)
|
|
116
|
+
const cgChildren = new Map();
|
|
117
|
+
for (const issue of deliveryIssues) {
|
|
118
|
+
if (issue.issueType === 'Context Group')
|
|
119
|
+
continue;
|
|
120
|
+
if (issue.status === 'Done')
|
|
121
|
+
continue;
|
|
122
|
+
if (!issue.parentIssueId)
|
|
123
|
+
continue;
|
|
124
|
+
if (!nodes.has(issue.id))
|
|
125
|
+
continue;
|
|
126
|
+
const existing = cgChildren.get(issue.parentIssueId) ?? [];
|
|
127
|
+
existing.push(issue.id);
|
|
128
|
+
cgChildren.set(issue.parentIssueId, existing);
|
|
129
|
+
}
|
|
130
|
+
// For each CG with dependsOn, block its children on all children of dependency CGs
|
|
131
|
+
for (const issue of deliveryIssues) {
|
|
132
|
+
if (issue.issueType !== 'Context Group')
|
|
133
|
+
continue;
|
|
134
|
+
if (!issue.dependsOn || issue.dependsOn.length === 0)
|
|
135
|
+
continue;
|
|
136
|
+
const myChildren = cgChildren.get(issue.id) ?? [];
|
|
137
|
+
if (myChildren.length === 0)
|
|
138
|
+
continue;
|
|
139
|
+
for (const depCgId of issue.dependsOn) {
|
|
140
|
+
const depChildren = cgChildren.get(depCgId) ?? [];
|
|
141
|
+
for (const childId of myChildren) {
|
|
142
|
+
const childNode = nodes.get(childId);
|
|
143
|
+
if (!childNode)
|
|
144
|
+
continue;
|
|
145
|
+
for (const depChildId of depChildren) {
|
|
146
|
+
if (nodes.has(depChildId)) {
|
|
147
|
+
childNode.blockedBy.add(depChildId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Compute CG execution waves for a delivery using topological sort.
|
|
157
|
+
* Wave 0 = CGs with no dependencies (parallelizable)
|
|
158
|
+
* Wave N = CGs whose dependencies are all in waves < N
|
|
159
|
+
* Returns Map<cgId, waveNumber>
|
|
160
|
+
*
|
|
161
|
+
* @throws Error if a cycle is detected in the CG dependency graph
|
|
162
|
+
*/
|
|
163
|
+
export function getCGExecutionWaves(issues, deliveryId) {
|
|
164
|
+
// Filter to CGs in the given delivery
|
|
165
|
+
const cgs = issues.filter(i => i.issueType === 'Context Group' && i.deliveryId === deliveryId);
|
|
166
|
+
const cgIds = new Set(cgs.map(cg => cg.id));
|
|
167
|
+
const waves = new Map();
|
|
168
|
+
// Build adjacency: cgId -> set of dependency CG IDs (within this delivery)
|
|
169
|
+
const deps = new Map();
|
|
170
|
+
// In-degree count for Kahn's algorithm
|
|
171
|
+
const inDegree = new Map();
|
|
172
|
+
for (const cg of cgs) {
|
|
173
|
+
inDegree.set(cg.id, 0);
|
|
174
|
+
deps.set(cg.id, new Set());
|
|
175
|
+
}
|
|
176
|
+
for (const cg of cgs) {
|
|
177
|
+
if (!cg.dependsOn)
|
|
178
|
+
continue;
|
|
179
|
+
for (const depId of cg.dependsOn) {
|
|
180
|
+
// Only consider dependencies within this delivery's CGs
|
|
181
|
+
if (cgIds.has(depId)) {
|
|
182
|
+
deps.get(cg.id).add(depId);
|
|
183
|
+
inDegree.set(cg.id, (inDegree.get(cg.id) ?? 0) + 1);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Kahn's algorithm: process nodes with in-degree 0 in waves
|
|
188
|
+
let currentWave = [];
|
|
189
|
+
for (const [id, degree] of inDegree) {
|
|
190
|
+
if (degree === 0) {
|
|
191
|
+
currentWave.push(id);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
let waveNumber = 0;
|
|
195
|
+
let processed = 0;
|
|
196
|
+
while (currentWave.length > 0) {
|
|
197
|
+
const nextWave = [];
|
|
198
|
+
for (const cgId of currentWave) {
|
|
199
|
+
waves.set(cgId, waveNumber);
|
|
200
|
+
processed++;
|
|
201
|
+
// Reduce in-degree of dependents
|
|
202
|
+
for (const cg of cgs) {
|
|
203
|
+
const cgDeps = deps.get(cg.id);
|
|
204
|
+
if (cgDeps && cgDeps.has(cgId)) {
|
|
205
|
+
const newDegree = (inDegree.get(cg.id) ?? 1) - 1;
|
|
206
|
+
inDegree.set(cg.id, newDegree);
|
|
207
|
+
if (newDegree === 0) {
|
|
208
|
+
nextWave.push(cg.id);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
currentWave = nextWave;
|
|
214
|
+
waveNumber++;
|
|
215
|
+
}
|
|
216
|
+
if (processed !== cgs.length) {
|
|
217
|
+
throw new Error(`Cycle detected in CG dependency graph for delivery ${deliveryId}: ` +
|
|
218
|
+
`processed ${processed} of ${cgs.length} CGs`);
|
|
219
|
+
}
|
|
220
|
+
return waves;
|
|
221
|
+
}
|
|
222
|
+
// ── File overlap dependencies ────────────────────────────────────
|
|
223
|
+
/**
|
|
224
|
+
* Add file overlap dependencies within the same delivery.
|
|
225
|
+
*
|
|
226
|
+
* Within a delivery, issues that share relevant files should run sequentially.
|
|
227
|
+
* Issues under the same context group with no file overlap can run in parallel.
|
|
228
|
+
*/
|
|
229
|
+
export function addFileOverlapDependencies(nodes, sortedDeliveries, issuesByDelivery, contextGroups) {
|
|
230
|
+
for (const delivery of sortedDeliveries) {
|
|
231
|
+
const deliveryIssues = issuesByDelivery.get(delivery.id) ?? [];
|
|
232
|
+
const actionableIssues = deliveryIssues.filter(i => i.issueType !== 'Context Group' && i.status !== 'Done');
|
|
233
|
+
// Build file sets for each issue
|
|
234
|
+
const issueFiles = new Map();
|
|
235
|
+
for (const issue of actionableIssues) {
|
|
236
|
+
const parentGroup = issue.parentIssueId ? contextGroups.get(issue.parentIssueId) : null;
|
|
237
|
+
const relevantFiles = parentGroup?.relevantFiles ?? issue.relevantFiles;
|
|
238
|
+
issueFiles.set(issue.id, parseRelevantFiles(relevantFiles));
|
|
239
|
+
}
|
|
240
|
+
// For each pair of issues in the same delivery, check for file overlap
|
|
241
|
+
for (let i = 0; i < actionableIssues.length; i++) {
|
|
242
|
+
for (let j = i + 1; j < actionableIssues.length; j++) {
|
|
243
|
+
const issueA = actionableIssues[i];
|
|
244
|
+
const issueB = actionableIssues[j];
|
|
245
|
+
const filesA = issueFiles.get(issueA.id);
|
|
246
|
+
const filesB = issueFiles.get(issueB.id);
|
|
247
|
+
if (!filesA || !filesB)
|
|
248
|
+
continue;
|
|
249
|
+
if (!hasFileOverlap(filesA, filesB))
|
|
250
|
+
continue;
|
|
251
|
+
// File overlap detected -- add a dependency (lower index goes first)
|
|
252
|
+
const nodeB = nodes.get(issueB.id);
|
|
253
|
+
if (nodeB && nodes.has(issueA.id)) {
|
|
254
|
+
nodeB.blockedBy.add(issueA.id);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// ── Single-delivery dependency helpers (for dynamic addition) ────
|
|
261
|
+
/**
|
|
262
|
+
* Add CG-level dependency enforcement for a single delivery's issues.
|
|
263
|
+
* Used by addIssuesToDAG for dynamically added deliveries.
|
|
264
|
+
*/
|
|
265
|
+
export function addCGDependenciesForDelivery(nodes, delivery, issues, _contextGroups) {
|
|
266
|
+
// Build a map: contextGroupId -> actionable child issue IDs (in the DAG)
|
|
267
|
+
const cgChildren = new Map();
|
|
268
|
+
for (const issue of issues) {
|
|
269
|
+
if (issue.issueType === 'Context Group')
|
|
270
|
+
continue;
|
|
271
|
+
if (issue.status === 'Done')
|
|
272
|
+
continue;
|
|
273
|
+
if (!issue.parentIssueId)
|
|
274
|
+
continue;
|
|
275
|
+
if (!nodes.has(issue.id))
|
|
276
|
+
continue;
|
|
277
|
+
const existing = cgChildren.get(issue.parentIssueId) ?? [];
|
|
278
|
+
existing.push(issue.id);
|
|
279
|
+
cgChildren.set(issue.parentIssueId, existing);
|
|
280
|
+
}
|
|
281
|
+
// For each CG with dependsOn, block its children on all children of dependency CGs
|
|
282
|
+
for (const issue of issues) {
|
|
283
|
+
if (issue.issueType !== 'Context Group')
|
|
284
|
+
continue;
|
|
285
|
+
if (!issue.dependsOn || issue.dependsOn.length === 0)
|
|
286
|
+
continue;
|
|
287
|
+
const myChildren = cgChildren.get(issue.id) ?? [];
|
|
288
|
+
if (myChildren.length === 0)
|
|
289
|
+
continue;
|
|
290
|
+
for (const depCgId of issue.dependsOn) {
|
|
291
|
+
const depChildren = cgChildren.get(depCgId) ?? [];
|
|
292
|
+
for (const childId of myChildren) {
|
|
293
|
+
const childNode = nodes.get(childId);
|
|
294
|
+
if (!childNode)
|
|
295
|
+
continue;
|
|
296
|
+
for (const depChildId of depChildren) {
|
|
297
|
+
if (nodes.has(depChildId)) {
|
|
298
|
+
childNode.blockedBy.add(depChildId);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Add file-overlap dependencies within a single delivery's issues.
|
|
307
|
+
* Used by addIssuesToDAG for dynamically added deliveries.
|
|
308
|
+
*/
|
|
309
|
+
export function addFileOverlapForDelivery(nodes, issues, contextGroups) {
|
|
310
|
+
const actionableIssues = issues.filter(i => i.issueType !== 'Context Group' && i.status !== 'Done' && nodes.has(i.id));
|
|
311
|
+
// Build file sets for each issue
|
|
312
|
+
const issueFiles = new Map();
|
|
313
|
+
for (const issue of actionableIssues) {
|
|
314
|
+
const parentGroup = issue.parentIssueId ? contextGroups.get(issue.parentIssueId) : null;
|
|
315
|
+
const relevantFiles = parentGroup?.relevantFiles ?? issue.relevantFiles;
|
|
316
|
+
issueFiles.set(issue.id, parseRelevantFiles(relevantFiles));
|
|
317
|
+
}
|
|
318
|
+
// For each pair of issues, check for file overlap
|
|
319
|
+
for (let i = 0; i < actionableIssues.length; i++) {
|
|
320
|
+
for (let j = i + 1; j < actionableIssues.length; j++) {
|
|
321
|
+
const issueA = actionableIssues[i];
|
|
322
|
+
const issueB = actionableIssues[j];
|
|
323
|
+
const filesA = issueFiles.get(issueA.id);
|
|
324
|
+
const filesB = issueFiles.get(issueB.id);
|
|
325
|
+
if (!filesA || !filesB)
|
|
326
|
+
continue;
|
|
327
|
+
if (!hasFileOverlap(filesA, filesB))
|
|
328
|
+
continue;
|
|
329
|
+
// File overlap detected -- add a dependency (lower index goes first)
|
|
330
|
+
const nodeB = nodes.get(issueB.id);
|
|
331
|
+
if (nodeB && nodes.has(issueA.id)) {
|
|
332
|
+
nodeB.blockedBy.add(issueA.id);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../src/dependency-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context building for guard evaluation.
|
|
3
|
+
*
|
|
4
|
+
* Gathers the evaluation context (delivery state, issue counts, session data,
|
|
5
|
+
* factory instance state, etc.) needed by condition evaluators.
|
|
6
|
+
*
|
|
7
|
+
* The EvaluationContext interface is canonically defined in @telora/daemon-core
|
|
8
|
+
* and re-exported here for backward compatibility.
|
|
9
|
+
*
|
|
10
|
+
* Extracted from guard-engine.ts to improve maintainability.
|
|
11
|
+
*/
|
|
12
|
+
import type { EvaluationContext } from '@telora/daemon-core';
|
|
13
|
+
export type { EvaluationContext } from '@telora/daemon-core';
|
|
14
|
+
/**
|
|
15
|
+
* Build factory evaluation context from in-memory instance state.
|
|
16
|
+
*
|
|
17
|
+
* This is a pure function that builds from already-available data,
|
|
18
|
+
* avoiding the cross-package DB query problem. The factory engine
|
|
19
|
+
* calls this with data it already has (instance state, work units,
|
|
20
|
+
* gate results from its own queries).
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildFactoryEvaluationContext(params: {
|
|
23
|
+
instanceId: string;
|
|
24
|
+
instanceState: {
|
|
25
|
+
tokensUsed: number;
|
|
26
|
+
completionGateIterations: number;
|
|
27
|
+
wallClockStartedAt: string | null;
|
|
28
|
+
};
|
|
29
|
+
blueprint: {
|
|
30
|
+
maxTokenBudget: number | null;
|
|
31
|
+
maxWallClockHours: number | null;
|
|
32
|
+
maxInstanceIterations: number | null;
|
|
33
|
+
};
|
|
34
|
+
workUnits: Array<{
|
|
35
|
+
status: string;
|
|
36
|
+
}>;
|
|
37
|
+
gateResults: Array<{
|
|
38
|
+
strategyId: string;
|
|
39
|
+
gateType: string;
|
|
40
|
+
iteration: number;
|
|
41
|
+
passed: boolean;
|
|
42
|
+
}>;
|
|
43
|
+
strategyId?: string;
|
|
44
|
+
}): EvaluationContext;
|
|
45
|
+
/**
|
|
46
|
+
* Build evaluation context by querying current delivery state.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildEvaluationContext(deliveryId: string, lastExitCode: number): Promise<EvaluationContext>;
|
|
49
|
+
//# sourceMappingURL=evaluation-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation-context.d.ts","sourceRoot":"","sources":["../src/evaluation-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAM7D;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,wBAAwB,EAAE,MAAM,CAAC;QACjC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC,CAAC;IACF,SAAS,EAAE;QACT,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;KACtC,CAAC;IACF,SAAS,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrC,WAAW,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACjG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,iBAAiB,CAqDpB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC,CA4B5B"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context building for guard evaluation.
|
|
3
|
+
*
|
|
4
|
+
* Gathers the evaluation context (delivery state, issue counts, session data,
|
|
5
|
+
* factory instance state, etc.) needed by condition evaluators.
|
|
6
|
+
*
|
|
7
|
+
* The EvaluationContext interface is canonically defined in @telora/daemon-core
|
|
8
|
+
* and re-exported here for backward compatibility.
|
|
9
|
+
*
|
|
10
|
+
* Extracted from guard-engine.ts to improve maintainability.
|
|
11
|
+
*/
|
|
12
|
+
import { getDeliveryIssues, getDeliverySessionCount, } from './supabase.js';
|
|
13
|
+
// ============================================
|
|
14
|
+
// Context Builders
|
|
15
|
+
// ============================================
|
|
16
|
+
/**
|
|
17
|
+
* Build factory evaluation context from in-memory instance state.
|
|
18
|
+
*
|
|
19
|
+
* This is a pure function that builds from already-available data,
|
|
20
|
+
* avoiding the cross-package DB query problem. The factory engine
|
|
21
|
+
* calls this with data it already has (instance state, work units,
|
|
22
|
+
* gate results from its own queries).
|
|
23
|
+
*/
|
|
24
|
+
export function buildFactoryEvaluationContext(params) {
|
|
25
|
+
const { instanceState, blueprint, workUnits, gateResults, strategyId } = params;
|
|
26
|
+
// Count work units by status
|
|
27
|
+
const workUnitsByStatus = {};
|
|
28
|
+
for (const wu of workUnits) {
|
|
29
|
+
workUnitsByStatus[wu.status] = (workUnitsByStatus[wu.status] ?? 0) + 1;
|
|
30
|
+
}
|
|
31
|
+
// Calculate wall clock seconds
|
|
32
|
+
let wallClockSeconds = 0;
|
|
33
|
+
if (instanceState.wallClockStartedAt) {
|
|
34
|
+
wallClockSeconds = Math.floor((Date.now() - new Date(instanceState.wallClockStartedAt).getTime()) / 1000);
|
|
35
|
+
}
|
|
36
|
+
// Convert wall clock limit from hours to seconds
|
|
37
|
+
const wallClockLimitSeconds = blueprint.maxWallClockHours != null
|
|
38
|
+
? blueprint.maxWallClockHours * 3600
|
|
39
|
+
: null;
|
|
40
|
+
// Filter gate results by strategy if scoped
|
|
41
|
+
const scopedGateResults = strategyId
|
|
42
|
+
? gateResults.filter(r => r.strategyId === strategyId)
|
|
43
|
+
: gateResults;
|
|
44
|
+
// Build configValues for dynamic guard thresholds
|
|
45
|
+
const configValues = {};
|
|
46
|
+
if (blueprint.maxInstanceIterations != null) {
|
|
47
|
+
configValues.max_instance_iterations = blueprint.maxInstanceIterations;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
// Delivery fields (defaults for factory context)
|
|
51
|
+
deliveryId: '',
|
|
52
|
+
openIssueCount: 0,
|
|
53
|
+
totalIssueCount: 0,
|
|
54
|
+
issuesByStatus: {},
|
|
55
|
+
issuesByPriority: {},
|
|
56
|
+
lastExitCode: 0,
|
|
57
|
+
sessionCount: 0,
|
|
58
|
+
// Factory fields
|
|
59
|
+
gateResults: scopedGateResults,
|
|
60
|
+
tokensUsed: instanceState.tokensUsed,
|
|
61
|
+
tokenBudget: blueprint.maxTokenBudget,
|
|
62
|
+
workUnitsByStatus,
|
|
63
|
+
totalWorkUnitCount: workUnits.length,
|
|
64
|
+
cycleCount: instanceState.completionGateIterations,
|
|
65
|
+
wallClockSeconds,
|
|
66
|
+
wallClockLimitSeconds,
|
|
67
|
+
configValues,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Build evaluation context by querying current delivery state.
|
|
72
|
+
*/
|
|
73
|
+
export async function buildEvaluationContext(deliveryId, lastExitCode) {
|
|
74
|
+
const [issues, sessionCount] = await Promise.all([
|
|
75
|
+
getDeliveryIssues(deliveryId),
|
|
76
|
+
getDeliverySessionCount(deliveryId),
|
|
77
|
+
]);
|
|
78
|
+
const issuesByStatus = {};
|
|
79
|
+
const issuesByPriority = {};
|
|
80
|
+
for (const issue of issues) {
|
|
81
|
+
issuesByStatus[issue.status] = (issuesByStatus[issue.status] ?? 0) + 1;
|
|
82
|
+
if (issue.issueType !== 'Context Group') {
|
|
83
|
+
const priority = 'unknown';
|
|
84
|
+
issuesByPriority[priority] = (issuesByPriority[priority] ?? 0) + 1;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const openIssueCount = issues.filter(i => i.status !== 'Done').length;
|
|
88
|
+
return {
|
|
89
|
+
deliveryId,
|
|
90
|
+
openIssueCount,
|
|
91
|
+
totalIssueCount: issues.length,
|
|
92
|
+
issuesByStatus,
|
|
93
|
+
issuesByPriority,
|
|
94
|
+
lastExitCode,
|
|
95
|
+
sessionCount,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=evaluation-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluation-context.js","sourceRoot":"","sources":["../src/evaluation-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git activity scanner -- parses git log output and buckets commits by hour.
|
|
3
|
+
*
|
|
4
|
+
* Used by the dashboard to render git activity charts for agent sessions.
|
|
5
|
+
*/
|
|
6
|
+
export interface GitActivityBucket {
|
|
7
|
+
/** ISO 8601 timestamp, floored to the hour boundary. */
|
|
8
|
+
intervalStart: string;
|
|
9
|
+
linesAdded: number;
|
|
10
|
+
linesRemoved: number;
|
|
11
|
+
commitCount: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Scan a git repository for commit activity since a given timestamp and
|
|
15
|
+
* return the results bucketed by hour.
|
|
16
|
+
*
|
|
17
|
+
* If the git command fails for any reason, returns an empty array.
|
|
18
|
+
*
|
|
19
|
+
* @param repoPath Absolute path to the git repository.
|
|
20
|
+
* @param since ISO 8601 timestamp (or any git-compatible date string)
|
|
21
|
+
* to start scanning from.
|
|
22
|
+
*/
|
|
23
|
+
export declare function scanGitActivity(repoPath: string, since: string): GitActivityBucket[];
|
|
24
|
+
//# sourceMappingURL=git-activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-activity.d.ts","sourceRoot":"","sources":["../src/git-activity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,iBAAiB,EAAE,CAkFrB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git activity scanner -- parses git log output and buckets commits by hour.
|
|
3
|
+
*
|
|
4
|
+
* Used by the dashboard to render git activity charts for agent sessions.
|
|
5
|
+
*/
|
|
6
|
+
import { runGitSync } from './git-types.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Floor an ISO 8601 date string to the start of its hour.
|
|
12
|
+
* Returns an ISO string with minutes, seconds, and milliseconds zeroed out.
|
|
13
|
+
*/
|
|
14
|
+
function floorToHour(isoDate) {
|
|
15
|
+
const d = new Date(isoDate);
|
|
16
|
+
d.setMinutes(0, 0, 0);
|
|
17
|
+
return d.toISOString();
|
|
18
|
+
}
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Main scanner
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/**
|
|
23
|
+
* Scan a git repository for commit activity since a given timestamp and
|
|
24
|
+
* return the results bucketed by hour.
|
|
25
|
+
*
|
|
26
|
+
* If the git command fails for any reason, returns an empty array.
|
|
27
|
+
*
|
|
28
|
+
* @param repoPath Absolute path to the git repository.
|
|
29
|
+
* @param since ISO 8601 timestamp (or any git-compatible date string)
|
|
30
|
+
* to start scanning from.
|
|
31
|
+
*/
|
|
32
|
+
export function scanGitActivity(repoPath, since) {
|
|
33
|
+
const result = runGitSync(['log', '--numstat', '--format=COMMIT:%H %aI', `--since=${since}`], repoPath, { timeoutMs: 60_000 });
|
|
34
|
+
if (!result.success) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const output = result.output;
|
|
38
|
+
if (!output) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
// Accumulate per-hour buckets
|
|
42
|
+
const buckets = new Map();
|
|
43
|
+
let currentHourKey = null;
|
|
44
|
+
for (const line of output.split('\n')) {
|
|
45
|
+
const trimmed = line.trim();
|
|
46
|
+
if (!trimmed) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (trimmed.startsWith('COMMIT:')) {
|
|
50
|
+
// Format: "COMMIT:<hash> <authorDateISO>"
|
|
51
|
+
// The hash is 40 hex chars, followed by a space, then the ISO date.
|
|
52
|
+
const parts = trimmed.slice('COMMIT:'.length).split(' ');
|
|
53
|
+
// parts[0] = hash, parts[1] = author date ISO 8601
|
|
54
|
+
const authorDate = parts[1];
|
|
55
|
+
if (authorDate) {
|
|
56
|
+
currentHourKey = floorToHour(authorDate);
|
|
57
|
+
let bucket = buckets.get(currentHourKey);
|
|
58
|
+
if (!bucket) {
|
|
59
|
+
bucket = {
|
|
60
|
+
intervalStart: currentHourKey,
|
|
61
|
+
linesAdded: 0,
|
|
62
|
+
linesRemoved: 0,
|
|
63
|
+
commitCount: 0,
|
|
64
|
+
};
|
|
65
|
+
buckets.set(currentHourKey, bucket);
|
|
66
|
+
}
|
|
67
|
+
bucket.commitCount += 1;
|
|
68
|
+
}
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Numstat line: "<added>\t<removed>\t<filename>"
|
|
72
|
+
// Binary files show as "-\t-\t<filename>" -- skip those.
|
|
73
|
+
if (currentHourKey) {
|
|
74
|
+
const tabParts = trimmed.split('\t');
|
|
75
|
+
if (tabParts.length >= 3) {
|
|
76
|
+
const addedStr = tabParts[0];
|
|
77
|
+
const removedStr = tabParts[1];
|
|
78
|
+
// Skip binary entries
|
|
79
|
+
if (addedStr === '-' && removedStr === '-') {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const added = parseInt(addedStr, 10);
|
|
83
|
+
const removed = parseInt(removedStr, 10);
|
|
84
|
+
if (!Number.isNaN(added) && !Number.isNaN(removed)) {
|
|
85
|
+
const bucket = buckets.get(currentHourKey);
|
|
86
|
+
if (bucket) {
|
|
87
|
+
bucket.linesAdded += added;
|
|
88
|
+
bucket.linesRemoved += removed;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Sort by intervalStart ascending
|
|
95
|
+
return Array.from(buckets.values()).sort((a, b) => a.intervalStart.localeCompare(b.intervalStart));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=git-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-activity.js","sourceRoot":"","sources":["../src/git-activity.ts"],"names":[],"mappings":"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"}
|