@telora/daemon 0.24.17 → 0.24.26
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/build-info.json +12 -3
- package/dist/audit/audit-prompt.d.ts.map +1 -1
- package/dist/audit/audit-prompt.js +15 -0
- package/dist/audit/audit-prompt.js.map +1 -1
- package/dist/ci/candidate-failure-record.d.ts +104 -0
- package/dist/ci/candidate-failure-record.d.ts.map +1 -0
- package/dist/ci/candidate-failure-record.js +135 -0
- package/dist/ci/candidate-failure-record.js.map +1 -0
- package/dist/ci/candidate-ref.d.ts.map +1 -1
- package/dist/ci/candidate-ref.js +10 -3
- package/dist/ci/candidate-ref.js.map +1 -1
- package/dist/ci/ci-status-git.d.ts.map +1 -1
- package/dist/ci/ci-status-git.js +1 -0
- package/dist/ci/ci-status-git.js.map +1 -1
- package/dist/ci/ci-status.d.ts.map +1 -1
- package/dist/ci/ci-status.js +1 -0
- package/dist/ci/ci-status.js.map +1 -1
- package/dist/ci/gate-ref.d.ts +10 -1
- package/dist/ci/gate-ref.d.ts.map +1 -1
- package/dist/ci/gate-ref.js +11 -4
- package/dist/ci/gate-ref.js.map +1 -1
- package/dist/ci/product-ci-repo.d.ts.map +1 -1
- package/dist/ci/product-ci-repo.js +3 -2
- package/dist/ci/product-ci-repo.js.map +1 -1
- package/dist/completion/completion-event/event.d.ts +4 -3
- package/dist/completion/completion-event/event.d.ts.map +1 -1
- package/dist/completion/completion-event/event.js.map +1 -1
- package/dist/completion/review-cycle-budget/review-cycle-cap.d.ts +19 -11
- package/dist/completion/review-cycle-budget/review-cycle-cap.d.ts.map +1 -1
- package/dist/completion/review-cycle-budget/review-cycle-cap.js +36 -36
- package/dist/completion/review-cycle-budget/review-cycle-cap.js.map +1 -1
- package/dist/completion/review-cycle-budget/review-loop-detection.d.ts +101 -0
- package/dist/completion/review-cycle-budget/review-loop-detection.d.ts.map +1 -0
- package/dist/completion/review-cycle-budget/review-loop-detection.js +105 -0
- package/dist/completion/review-cycle-budget/review-loop-detection.js.map +1 -0
- package/dist/completion/review-cycle-budget/spent-budget-release.d.ts +70 -0
- package/dist/completion/review-cycle-budget/spent-budget-release.d.ts.map +1 -0
- package/dist/completion/review-cycle-budget/spent-budget-release.js +98 -0
- package/dist/completion/review-cycle-budget/spent-budget-release.js.map +1 -0
- package/dist/completion/review-exit/review-defect-detector.d.ts +71 -49
- package/dist/completion/review-exit/review-defect-detector.d.ts.map +1 -1
- package/dist/completion/review-exit/review-defect-detector.js +75 -69
- package/dist/completion/review-exit/review-defect-detector.js.map +1 -1
- package/dist/completion/review-exit/review-exit-attribution.d.ts +1 -1
- package/dist/completion/review-exit/review-exit-attribution.js +1 -1
- package/dist/completion/review-exit/review-exit-deps.d.ts +5 -2
- package/dist/completion/review-exit/review-exit-deps.d.ts.map +1 -1
- package/dist/completion/review-exit/review-exit-deps.js +1 -1
- package/dist/completion/review-exit/review-exit-evidence.d.ts +10 -1
- package/dist/completion/review-exit/review-exit-evidence.d.ts.map +1 -1
- package/dist/completion/review-exit/review-exit-evidence.js +17 -14
- package/dist/completion/review-exit/review-exit-evidence.js.map +1 -1
- package/dist/completion/review-exit/review-exit-foreign-findings.d.ts +1 -1
- package/dist/completion/review-exit/review-exit-foreign-findings.d.ts.map +1 -1
- package/dist/completion/review-exit/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit/review-exit-phase.js +12 -8
- package/dist/completion/review-exit/review-exit-phase.js.map +1 -1
- package/dist/completion/state-cascade/review-next-step.d.ts +12 -3
- package/dist/completion/state-cascade/review-next-step.d.ts.map +1 -1
- package/dist/completion/state-cascade/review-next-step.js +10 -1
- package/dist/completion/state-cascade/review-next-step.js.map +1 -1
- package/dist/completion/state-cascade/standing-approval-convergence.d.ts +1 -1
- package/dist/completion/state-cascade/standing-approval-convergence.d.ts.map +1 -1
- package/dist/completion/state-cascade/standing-approval-convergence.js +10 -4
- package/dist/completion/state-cascade/standing-approval-convergence.js.map +1 -1
- package/dist/completion/state-cascade/state-cascade.d.ts +3 -0
- package/dist/completion/state-cascade/state-cascade.d.ts.map +1 -1
- package/dist/completion/state-cascade/state-cascade.js +16 -1
- package/dist/completion/state-cascade/state-cascade.js.map +1 -1
- package/dist/completion/team-exit/status-advance-phase.d.ts +1 -1
- package/dist/completion/team-exit/status-advance-phase.d.ts.map +1 -1
- package/dist/completion/team-exit/status-advance-phase.js +6 -4
- package/dist/completion/team-exit/status-advance-phase.js.map +1 -1
- package/dist/completion/team-outcome/apply-turn.d.ts.map +1 -1
- package/dist/completion/team-outcome/apply-turn.js +9 -4
- package/dist/completion/team-outcome/apply-turn.js.map +1 -1
- package/dist/completion/team-outcome/decide-turn-entry-rows.d.ts.map +1 -1
- package/dist/completion/team-outcome/decide-turn-entry-rows.js +28 -3
- package/dist/completion/team-outcome/decide-turn-entry-rows.js.map +1 -1
- package/dist/completion/team-outcome/decide.d.ts.map +1 -1
- package/dist/completion/team-outcome/decide.js +1 -0
- package/dist/completion/team-outcome/decide.js.map +1 -1
- package/dist/completion/team-outcome/exit-limits.d.ts +6 -0
- package/dist/completion/team-outcome/exit-limits.d.ts.map +1 -1
- package/dist/completion/team-outcome/exit-limits.js +6 -0
- package/dist/completion/team-outcome/exit-limits.js.map +1 -1
- package/dist/completion/team-outcome/exit-pipeline-state.d.ts +5 -0
- package/dist/completion/team-outcome/exit-pipeline-state.d.ts.map +1 -1
- package/dist/completion/team-outcome/exit-pipeline-state.js.map +1 -1
- package/dist/completion/team-teardown/session-hold-bounds.d.ts +10 -1
- package/dist/completion/team-teardown/session-hold-bounds.d.ts.map +1 -1
- package/dist/completion/team-teardown/session-hold-bounds.js +11 -0
- package/dist/completion/team-teardown/session-hold-bounds.js.map +1 -1
- package/dist/completion/team-teardown/session-hold.d.ts.map +1 -1
- package/dist/completion/team-teardown/session-hold.js +2 -0
- package/dist/completion/team-teardown/session-hold.js.map +1 -1
- package/dist/composition/engine-start-context.d.ts.map +1 -1
- package/dist/composition/engine-start-context.js +9 -1
- package/dist/composition/engine-start-context.js.map +1 -1
- package/dist/composition/execution-merge-context.d.ts +13 -0
- package/dist/composition/execution-merge-context.d.ts.map +1 -1
- package/dist/composition/execution-merge-context.js +76 -3
- package/dist/composition/execution-merge-context.js.map +1 -1
- package/dist/composition/execution-spawn-context.d.ts.map +1 -1
- package/dist/composition/execution-spawn-context.js +2 -0
- package/dist/composition/execution-spawn-context.js.map +1 -1
- package/dist/composition/focus-activity-live-sources.d.ts.map +1 -1
- package/dist/composition/focus-activity-live-sources.js +1 -0
- package/dist/composition/focus-activity-live-sources.js.map +1 -1
- package/dist/composition/judgement-contexts.d.ts.map +1 -1
- package/dist/composition/judgement-contexts.js +8 -2
- package/dist/composition/judgement-contexts.js.map +1 -1
- package/dist/composition/review-exit-context.d.ts.map +1 -1
- package/dist/composition/review-exit-context.js +2 -0
- package/dist/composition/review-exit-context.js.map +1 -1
- package/dist/composition/review-loop-context.d.ts +28 -0
- package/dist/composition/review-loop-context.d.ts.map +1 -0
- package/dist/composition/review-loop-context.js +147 -0
- package/dist/composition/review-loop-context.js.map +1 -0
- package/dist/composition/runtime-heartbeat-context.d.ts +11 -0
- package/dist/composition/runtime-heartbeat-context.d.ts.map +1 -1
- package/dist/composition/runtime-heartbeat-context.js +33 -2
- package/dist/composition/runtime-heartbeat-context.js.map +1 -1
- package/dist/composition/spawn-pass-deps.d.ts.map +1 -1
- package/dist/composition/spawn-pass-deps.js +3 -0
- package/dist/composition/spawn-pass-deps.js.map +1 -1
- package/dist/composition/state-cascade-context.d.ts.map +1 -1
- package/dist/composition/state-cascade-context.js +3 -1
- package/dist/composition/state-cascade-context.js.map +1 -1
- package/dist/composition/team-liveness-phase-sources.d.ts.map +1 -1
- package/dist/composition/team-liveness-phase-sources.js +1 -0
- package/dist/composition/team-liveness-phase-sources.js.map +1 -1
- package/dist/composition/tower-escalation-context.d.ts +12 -0
- package/dist/composition/tower-escalation-context.d.ts.map +1 -0
- package/dist/composition/tower-escalation-context.js +109 -0
- package/dist/composition/tower-escalation-context.js.map +1 -0
- package/dist/composition/verification-context.d.ts.map +1 -1
- package/dist/composition/verification-context.js +34 -4
- package/dist/composition/verification-context.js.map +1 -1
- package/dist/composition/workstation-intervals-context.d.ts +3 -0
- package/dist/composition/workstation-intervals-context.d.ts.map +1 -0
- package/dist/composition/workstation-intervals-context.js +33 -0
- package/dist/composition/workstation-intervals-context.js.map +1 -0
- package/dist/daemon-state/awaiting-slot.d.ts +18 -1
- package/dist/daemon-state/awaiting-slot.d.ts.map +1 -1
- package/dist/daemon-state/awaiting-slot.js +7 -0
- package/dist/daemon-state/awaiting-slot.js.map +1 -1
- package/dist/delivery/delivery-reconciler.d.ts +7 -7
- package/dist/delivery/recorded-concerns.d.ts +63 -28
- package/dist/delivery/recorded-concerns.d.ts.map +1 -1
- package/dist/delivery/recorded-concerns.js +72 -28
- package/dist/delivery/recorded-concerns.js.map +1 -1
- package/dist/directive/directive-queue.d.ts +8 -0
- package/dist/directive/directive-queue.d.ts.map +1 -1
- package/dist/directive/directive-queue.js +1 -1
- package/dist/directive/directive-queue.js.map +1 -1
- package/dist/focus/control-state.d.ts +6 -4
- package/dist/focus/control-state.d.ts.map +1 -1
- package/dist/focus/control-state.js +6 -4
- package/dist/focus/control-state.js.map +1 -1
- package/dist/focus/daemon-contexts-judgement.d.ts +6 -0
- package/dist/focus/daemon-contexts-judgement.d.ts.map +1 -1
- package/dist/focus/daemon-contexts.d.ts +6 -0
- package/dist/focus/daemon-contexts.d.ts.map +1 -1
- package/dist/focus/daemon-contexts.js.map +1 -1
- package/dist/focus/focus-engine.d.ts.map +1 -1
- package/dist/focus/focus-engine.js +3 -1
- package/dist/focus/focus-engine.js.map +1 -1
- package/dist/focus/focus-executor.d.ts.map +1 -1
- package/dist/focus/focus-executor.js +3 -2
- package/dist/focus/focus-executor.js.map +1 -1
- package/dist/focus/focus-loop-registry.d.ts.map +1 -1
- package/dist/focus/focus-loop-registry.js +42 -0
- package/dist/focus/focus-loop-registry.js.map +1 -1
- package/dist/focus/focus-poller-auto-advance.d.ts +4 -2
- package/dist/focus/focus-poller-auto-advance.d.ts.map +1 -1
- package/dist/focus/focus-poller-auto-advance.js +24 -18
- package/dist/focus/focus-poller-auto-advance.js.map +1 -1
- package/dist/focus/focus-poller-spawn.d.ts.map +1 -1
- package/dist/focus/focus-poller-spawn.js +8 -6
- package/dist/focus/focus-poller-spawn.js.map +1 -1
- package/dist/focus/heartbeat-metadata.d.ts +5 -0
- package/dist/focus/heartbeat-metadata.d.ts.map +1 -1
- package/dist/focus/heartbeat-metadata.js +12 -0
- package/dist/focus/heartbeat-metadata.js.map +1 -1
- package/dist/focus/heartbeat.d.ts +9 -2
- package/dist/focus/heartbeat.d.ts.map +1 -1
- package/dist/focus/heartbeat.js +10 -1
- package/dist/focus/heartbeat.js.map +1 -1
- package/dist/focus/host-pressure.d.ts +77 -0
- package/dist/focus/host-pressure.d.ts.map +1 -0
- package/dist/focus/host-pressure.js +83 -0
- package/dist/focus/host-pressure.js.map +1 -0
- package/dist/focus/pending-directive-gates.d.ts +14 -0
- package/dist/focus/pending-directive-gates.d.ts.map +1 -1
- package/dist/focus/pending-directive-gates.js +25 -1
- package/dist/focus/pending-directive-gates.js.map +1 -1
- package/dist/focus/pending-spawn-pass-deps.d.ts +7 -0
- package/dist/focus/pending-spawn-pass-deps.d.ts.map +1 -1
- package/dist/focus/pending-spawn-review-next-step.d.ts +1 -1
- package/dist/focus/pending-spawn-review-next-step.d.ts.map +1 -1
- package/dist/focus/pending-spawn-review-next-step.js +2 -0
- package/dist/focus/pending-spawn-review-next-step.js.map +1 -1
- package/dist/focus/ready-focus-team-work.d.ts +9 -4
- package/dist/focus/ready-focus-team-work.d.ts.map +1 -1
- package/dist/focus/ready-focus-team-work.js +14 -3
- package/dist/focus/ready-focus-team-work.js.map +1 -1
- package/dist/focus/verify-open-issues.d.ts +3 -2
- package/dist/focus/verify-open-issues.d.ts.map +1 -1
- package/dist/focus/verify-open-issues.js +6 -4
- package/dist/focus/verify-open-issues.js.map +1 -1
- package/dist/focus/workstation-intervals.d.ts +83 -0
- package/dist/focus/workstation-intervals.d.ts.map +1 -0
- package/dist/focus/workstation-intervals.js +81 -0
- package/dist/focus/workstation-intervals.js.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +5 -2
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +2 -2
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/git/types.js +1 -1
- package/dist/merge/candidate-ci-failures.d.ts +72 -0
- package/dist/merge/candidate-ci-failures.d.ts.map +1 -0
- package/dist/merge/candidate-ci-failures.js +240 -0
- package/dist/merge/candidate-ci-failures.js.map +1 -0
- package/dist/merge/candidate-red-record.d.ts +44 -0
- package/dist/merge/candidate-red-record.d.ts.map +1 -0
- package/dist/merge/candidate-red-record.js +98 -0
- package/dist/merge/candidate-red-record.js.map +1 -0
- package/dist/merge/candidate-rework.d.ts +4 -3
- package/dist/merge/candidate-rework.d.ts.map +1 -1
- package/dist/merge/candidate-rework.js +46 -14
- package/dist/merge/candidate-rework.js.map +1 -1
- package/dist/merge/candidate-tip-attribution.d.ts +135 -0
- package/dist/merge/candidate-tip-attribution.d.ts.map +1 -0
- package/dist/merge/candidate-tip-attribution.js +319 -0
- package/dist/merge/candidate-tip-attribution.js.map +1 -0
- package/dist/merge/completion-merge-driver.d.ts +49 -5
- package/dist/merge/completion-merge-driver.d.ts.map +1 -1
- package/dist/merge/completion-merge-driver.js +56 -2
- package/dist/merge/completion-merge-driver.js.map +1 -1
- package/dist/merge/completion-merge-gate.d.ts +4 -1
- package/dist/merge/completion-merge-gate.d.ts.map +1 -1
- package/dist/merge/completion-merge-gate.js +9 -8
- package/dist/merge/completion-merge-gate.js.map +1 -1
- package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
- package/dist/prompt-sections/persona-sections.js +4 -1
- package/dist/prompt-sections/persona-sections.js.map +1 -1
- package/dist/prompt-sections/qa-author-section.d.ts.map +1 -1
- package/dist/prompt-sections/qa-author-section.js +18 -1
- package/dist/prompt-sections/qa-author-section.js.map +1 -1
- package/dist/prompt-sections/scoping-sections.d.ts +0 -12
- package/dist/prompt-sections/scoping-sections.d.ts.map +1 -1
- package/dist/prompt-sections/scoping-sections.js +16 -2
- package/dist/prompt-sections/scoping-sections.js.map +1 -1
- package/dist/prompts/bounded-universals.d.ts +13 -0
- package/dist/prompts/bounded-universals.d.ts.map +1 -0
- package/dist/prompts/bounded-universals.js +32 -0
- package/dist/prompts/bounded-universals.js.map +1 -0
- package/dist/queries/api-client/shared.d.ts +2 -1
- package/dist/queries/api-client/shared.d.ts.map +1 -1
- package/dist/queries/api-client/shared.js +36 -1
- package/dist/queries/api-client/shared.js.map +1 -1
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts +35 -0
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts.map +1 -0
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.js +42 -0
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.js.map +1 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts +16 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts.map +1 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.js +51 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.js.map +1 -0
- package/dist/queries/deliveries/issues.d.ts.map +1 -1
- package/dist/queries/deliveries/issues.js +1 -0
- package/dist/queries/deliveries/issues.js.map +1 -1
- package/dist/queries/escalations/escalation-consumption.d.ts +13 -0
- package/dist/queries/escalations/escalation-consumption.d.ts.map +1 -1
- package/dist/queries/escalations/escalation-consumption.js +12 -2
- package/dist/queries/escalations/escalation-consumption.js.map +1 -1
- package/dist/queries/escalations/tower-escalations.d.ts +82 -0
- package/dist/queries/escalations/tower-escalations.d.ts.map +1 -0
- package/dist/queries/escalations/tower-escalations.js +97 -0
- package/dist/queries/escalations/tower-escalations.js.map +1 -0
- package/dist/queries/focus-review/recorded-concern-ids.d.ts +48 -11
- package/dist/queries/focus-review/recorded-concern-ids.d.ts.map +1 -1
- package/dist/queries/focus-review/recorded-concern-ids.js +42 -12
- package/dist/queries/focus-review/recorded-concern-ids.js.map +1 -1
- package/dist/queries/focus-review/review-criterion-verdicts.d.ts +37 -0
- package/dist/queries/focus-review/review-criterion-verdicts.d.ts.map +1 -0
- package/dist/queries/focus-review/review-criterion-verdicts.js +64 -0
- package/dist/queries/focus-review/review-criterion-verdicts.js.map +1 -0
- package/dist/queries/focus-review/review-finding-facts.d.ts +18 -6
- package/dist/queries/focus-review/review-finding-facts.d.ts.map +1 -1
- package/dist/queries/focus-review/review-finding-facts.js +21 -8
- package/dist/queries/focus-review/review-finding-facts.js.map +1 -1
- package/dist/queries/focuses/ended-arm.d.ts +56 -13
- package/dist/queries/focuses/ended-arm.d.ts.map +1 -1
- package/dist/queries/focuses/ended-arm.js +40 -14
- package/dist/queries/focuses/ended-arm.js.map +1 -1
- package/dist/queries/focuses/focus-criteria-standing.d.ts +12 -0
- package/dist/queries/focuses/focus-criteria-standing.d.ts.map +1 -1
- package/dist/queries/focuses/focus-criteria-standing.js +13 -0
- package/dist/queries/focuses/focus-criteria-standing.js.map +1 -1
- package/dist/queries/focuses/focus-discovery.d.ts +14 -3
- package/dist/queries/focuses/focus-discovery.d.ts.map +1 -1
- package/dist/queries/focuses/focus-discovery.js +2 -19
- package/dist/queries/focuses/focus-discovery.js.map +1 -1
- package/dist/queries/focuses/focuses.d.ts +15 -12
- package/dist/queries/focuses/focuses.d.ts.map +1 -1
- package/dist/queries/focuses/focuses.js +15 -13
- package/dist/queries/focuses/focuses.js.map +1 -1
- package/dist/queries/sessions/daemon-connection.d.ts.map +1 -1
- package/dist/queries/sessions/daemon-connection.js +1 -0
- package/dist/queries/sessions/daemon-connection.js.map +1 -1
- package/dist/queries/sessions/sessions.d.ts.map +1 -1
- package/dist/queries/sessions/sessions.js +2 -1
- package/dist/queries/sessions/sessions.js.map +1 -1
- package/dist/queries/tower-decisions/tower-decisions.d.ts +103 -0
- package/dist/queries/tower-decisions/tower-decisions.d.ts.map +1 -0
- package/dist/queries/tower-decisions/tower-decisions.js +138 -0
- package/dist/queries/tower-decisions/tower-decisions.js.map +1 -0
- package/dist/queries/verification/verification.js +1 -1
- package/dist/queries/wire-schemas/schemas.d.ts +2 -0
- package/dist/queries/wire-schemas/schemas.d.ts.map +1 -1
- package/dist/queries/wire-schemas/schemas.js +8 -2
- package/dist/queries/wire-schemas/schemas.js.map +1 -1
- package/dist/queries/workstation-intervals/workstation-intervals.d.ts +52 -0
- package/dist/queries/workstation-intervals/workstation-intervals.d.ts.map +1 -0
- package/dist/queries/workstation-intervals/workstation-intervals.js +49 -0
- package/dist/queries/workstation-intervals/workstation-intervals.js.map +1 -0
- package/dist/resolvers/escalation-answers.d.ts +31 -0
- package/dist/resolvers/escalation-answers.d.ts.map +1 -1
- package/dist/resolvers/escalation-answers.js +31 -17
- package/dist/resolvers/escalation-answers.js.map +1 -1
- package/dist/resolvers/focus-criteria-standing.d.ts.map +1 -1
- package/dist/resolvers/focus-criteria-standing.js +20 -0
- package/dist/resolvers/focus-criteria-standing.js.map +1 -1
- package/dist/shell/unified-engine-lifecycle.d.ts +11 -1
- package/dist/shell/unified-engine-lifecycle.d.ts.map +1 -1
- package/dist/shell/unified-engine-lifecycle.js +10 -1
- package/dist/shell/unified-engine-lifecycle.js.map +1 -1
- package/dist/shell/unified-shell.d.ts +25 -0
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +26 -80
- package/dist/shell/unified-shell.js.map +1 -1
- package/dist/shell/update-restart.d.ts +47 -0
- package/dist/shell/update-restart.d.ts.map +1 -0
- package/dist/shell/update-restart.js +124 -0
- package/dist/shell/update-restart.js.map +1 -0
- package/dist/spawn/directive-dispatch.d.ts.map +1 -1
- package/dist/spawn/directive-dispatch.js +1 -0
- package/dist/spawn/directive-dispatch.js.map +1 -1
- package/dist/spawn/lead-continuation.d.ts +4 -3
- package/dist/spawn/lead-continuation.d.ts.map +1 -1
- package/dist/spawn/lead-continuation.js.map +1 -1
- package/dist/spawn/live-answer-delivery.d.ts +53 -0
- package/dist/spawn/live-answer-delivery.d.ts.map +1 -0
- package/dist/spawn/live-answer-delivery.js +26 -0
- package/dist/spawn/live-answer-delivery.js.map +1 -0
- package/dist/spawn/routing-decider-spawn.d.ts +64 -2
- package/dist/spawn/routing-decider-spawn.d.ts.map +1 -1
- package/dist/spawn/routing-decider-spawn.js +65 -20
- package/dist/spawn/routing-decider-spawn.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts +7 -5
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +11 -7
- package/dist/spawn/worktree-session.js.map +1 -1
- package/dist/supervision/escalation-suppression.js +1 -1
- package/dist/supervision/review-cycle-cap-hold.d.ts +11 -5
- package/dist/supervision/review-cycle-cap-hold.d.ts.map +1 -1
- package/dist/supervision/review-cycle-cap-hold.js +29 -11
- package/dist/supervision/review-cycle-cap-hold.js.map +1 -1
- package/dist/supervision/review-loop-detector.d.ts +48 -0
- package/dist/supervision/review-loop-detector.d.ts.map +1 -0
- package/dist/supervision/review-loop-detector.js +13 -0
- package/dist/supervision/review-loop-detector.js.map +1 -0
- package/dist/supervision/review-loop-hold.d.ts +29 -0
- package/dist/supervision/review-loop-hold.d.ts.map +1 -0
- package/dist/supervision/review-loop-hold.js +99 -0
- package/dist/supervision/review-loop-hold.js.map +1 -0
- package/dist/supervision/stall-detector-config.d.ts +8 -0
- package/dist/supervision/stall-detector-config.d.ts.map +1 -1
- package/dist/supervision/stall-detector-config.js +14 -3
- package/dist/supervision/stall-detector-config.js.map +1 -1
- package/dist/supervision/stop-registry.d.ts +3 -0
- package/dist/supervision/stop-registry.d.ts.map +1 -1
- package/dist/supervision/stop-registry.js +3 -1
- package/dist/supervision/stop-registry.js.map +1 -1
- package/dist/supervision/stop-rows-review-loop.d.ts +35 -0
- package/dist/supervision/stop-rows-review-loop.d.ts.map +1 -0
- package/dist/supervision/stop-rows-review-loop.js +150 -0
- package/dist/supervision/stop-rows-review-loop.js.map +1 -0
- package/dist/supervision/stop-rows-team-session.d.ts +1 -1
- package/dist/supervision/stop-rows-team-session.d.ts.map +1 -1
- package/dist/supervision/stop-rows-team-session.js.map +1 -1
- package/dist/supervision/unreviewed-settle-detector.d.ts +7 -2
- package/dist/supervision/unreviewed-settle-detector.d.ts.map +1 -1
- package/dist/supervision/unreviewed-settle-detector.js +15 -2
- package/dist/supervision/unreviewed-settle-detector.js.map +1 -1
- package/dist/templates/agents-md.d.ts.map +1 -1
- package/dist/templates/agents-md.js +1 -0
- package/dist/templates/agents-md.js.map +1 -1
- package/dist/templates/claude-md.d.ts +1 -1
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +12 -0
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/testing/fixtures/api-client.js +1 -1
- package/dist/testing/fixtures/completion-judge-stubs.d.ts +7 -2
- package/dist/testing/fixtures/completion-judge-stubs.d.ts.map +1 -1
- package/dist/testing/fixtures/completion-judge-stubs.js +11 -1
- package/dist/testing/fixtures/completion-judge-stubs.js.map +1 -1
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/testing/fixtures/merge-log-capture.d.ts.map +1 -1
- package/dist/testing/fixtures/merge-log-capture.js +1 -0
- package/dist/testing/fixtures/merge-log-capture.js.map +1 -1
- package/dist/testing/fixtures/pending-spawn-world.d.ts +4 -0
- package/dist/testing/fixtures/pending-spawn-world.d.ts.map +1 -1
- package/dist/testing/fixtures/pending-spawn-world.js +15 -2
- package/dist/testing/fixtures/pending-spawn-world.js.map +1 -1
- package/dist/testing/fixtures/recording-api-client.js +1 -1
- package/dist/testing/fixtures/review-exit-deps.d.ts.map +1 -1
- package/dist/testing/fixtures/review-exit-deps.js +3 -1
- package/dist/testing/fixtures/review-exit-deps.js.map +1 -1
- package/dist/testing/fixtures/review-loop.d.ts +19 -0
- package/dist/testing/fixtures/review-loop.d.ts.map +1 -0
- package/dist/testing/fixtures/review-loop.js +30 -0
- package/dist/testing/fixtures/review-loop.js.map +1 -0
- package/dist/testing/fixtures/shortfall-rework-hold-deps.d.ts.map +1 -1
- package/dist/testing/fixtures/shortfall-rework-hold-deps.js +1 -0
- package/dist/testing/fixtures/shortfall-rework-hold-deps.js.map +1 -1
- package/dist/testing/fixtures/tower-loop.d.ts +28 -0
- package/dist/testing/fixtures/tower-loop.d.ts.map +1 -0
- package/dist/testing/fixtures/tower-loop.js +83 -0
- package/dist/testing/fixtures/tower-loop.js.map +1 -0
- package/dist/testing/fixtures/verification-deps.d.ts +7 -0
- package/dist/testing/fixtures/verification-deps.d.ts.map +1 -1
- package/dist/testing/fixtures/verification-deps.js +17 -1
- package/dist/testing/fixtures/verification-deps.js.map +1 -1
- package/dist/testing/fixtures/vitest-failure-log.d.ts.map +1 -1
- package/dist/testing/fixtures/vitest-failure-log.js +2 -1
- package/dist/testing/fixtures/vitest-failure-log.js.map +1 -1
- package/dist/tower/tower-escalation-gather.d.ts +33 -0
- package/dist/tower/tower-escalation-gather.d.ts.map +1 -0
- package/dist/tower/tower-escalation-gather.js +38 -0
- package/dist/tower/tower-escalation-gather.js.map +1 -0
- package/dist/tower/tower-escalation-prompt.d.ts +62 -0
- package/dist/tower/tower-escalation-prompt.d.ts.map +1 -0
- package/dist/tower/tower-escalation-prompt.js +130 -0
- package/dist/tower/tower-escalation-prompt.js.map +1 -0
- package/dist/tower/tower-escalation-routing.d.ts +49 -0
- package/dist/tower/tower-escalation-routing.d.ts.map +1 -0
- package/dist/tower/tower-escalation-routing.js +53 -0
- package/dist/tower/tower-escalation-routing.js.map +1 -0
- package/dist/tower/tower-escalation-session.d.ts +149 -0
- package/dist/tower/tower-escalation-session.d.ts.map +1 -0
- package/dist/tower/tower-escalation-session.js +238 -0
- package/dist/tower/tower-escalation-session.js.map +1 -0
- package/dist/tower/tower-supervisor-history.d.ts +129 -0
- package/dist/tower/tower-supervisor-history.d.ts.map +1 -0
- package/dist/tower/tower-supervisor-history.js +217 -0
- package/dist/tower/tower-supervisor-history.js.map +1 -0
- package/dist/tower/tower-supervisor-prompt.d.ts +21 -0
- package/dist/tower/tower-supervisor-prompt.d.ts.map +1 -0
- package/dist/tower/tower-supervisor-prompt.js +205 -0
- package/dist/tower/tower-supervisor-prompt.js.map +1 -0
- package/dist/tower/tower-supervisor-session.d.ts +220 -0
- package/dist/tower/tower-supervisor-session.d.ts.map +1 -0
- package/dist/tower/tower-supervisor-session.js +307 -0
- package/dist/tower/tower-supervisor-session.js.map +1 -0
- package/dist/tower/tower-supervisor.d.ts +86 -0
- package/dist/tower/tower-supervisor.d.ts.map +1 -0
- package/dist/tower/tower-supervisor.js +8 -0
- package/dist/tower/tower-supervisor.js.map +1 -0
- package/dist/types/index.js +1 -1
- package/dist/update/auto-update.d.ts +11 -5
- package/dist/update/auto-update.d.ts.map +1 -1
- package/dist/update/auto-update.js +11 -5
- package/dist/update/auto-update.js.map +1 -1
- package/dist/update/restart-contract.d.ts +62 -0
- package/dist/update/restart-contract.d.ts.map +1 -0
- package/dist/update/restart-contract.js +137 -0
- package/dist/update/restart-contract.js.map +1 -0
- package/dist/verify/attribution/verification-baseline-run.d.ts.map +1 -1
- package/dist/verify/attribution/verification-baseline-run.js +1 -0
- package/dist/verify/attribution/verification-baseline-run.js.map +1 -1
- package/dist/verify/ci-gate/ci-gate-dispatch.d.ts +3 -0
- package/dist/verify/ci-gate/ci-gate-dispatch.d.ts.map +1 -1
- package/dist/verify/ci-gate/ci-gate-dispatch.js +31 -9
- package/dist/verify/ci-gate/ci-gate-dispatch.js.map +1 -1
- package/dist/verify/ci-gate/ci-gate-wait-record.d.ts +6 -0
- package/dist/verify/ci-gate/ci-gate-wait-record.d.ts.map +1 -1
- package/dist/verify/ci-gate/ci-gate-wait-record.js +1 -0
- package/dist/verify/ci-gate/ci-gate-wait-record.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.d.ts +12 -2
- package/dist/verify/deterministic-gate/verification-checkout.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.js +18 -3
- package/dist/verify/deterministic-gate/verification-checkout.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.js +1 -1
- package/dist/verify/deterministic-gate/verification-failure-parser.d.ts +30 -9
- package/dist/verify/deterministic-gate/verification-failure-parser.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-failure-parser.js +52 -8
- package/dist/verify/deterministic-gate/verification-failure-parser.js.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.d.ts.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.js +6 -2
- package/dist/verify/engine/verification-commit-sharing.js.map +1 -1
- package/dist/verify/engine/verification-deps.d.ts +9 -0
- package/dist/verify/engine/verification-deps.d.ts.map +1 -1
- package/dist/verify/engine/verification-deps.js +1 -1
- package/dist/verify/engine/verification-engine.d.ts.map +1 -1
- package/dist/verify/engine/verification-engine.js +4 -1
- package/dist/verify/engine/verification-engine.js.map +1 -1
- package/dist/verify/escaped-tests/escaped-pass-store.d.ts +19 -0
- package/dist/verify/escaped-tests/escaped-pass-store.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-pass-store.js +90 -0
- package/dist/verify/escaped-tests/escaped-pass-store.js.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-run.d.ts +39 -0
- package/dist/verify/escaped-tests/escaped-test-run.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-run.js +156 -0
- package/dist/verify/escaped-tests/escaped-test-run.js.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-set.d.ts +65 -0
- package/dist/verify/escaped-tests/escaped-test-set.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-set.js +95 -0
- package/dist/verify/escaped-tests/escaped-test-set.js.map +1 -0
- package/dist/verify/escaped-tests/escaped-tests-source.d.ts +44 -0
- package/dist/verify/escaped-tests/escaped-tests-source.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-tests-source.js +142 -0
- package/dist/verify/escaped-tests/escaped-tests-source.js.map +1 -0
- package/dist/verify/gate-config/verification-manifest.d.ts +12 -1
- package/dist/verify/gate-config/verification-manifest.d.ts.map +1 -1
- package/dist/verify/gate-config/verification-manifest.js +12 -1
- package/dist/verify/gate-config/verification-manifest.js.map +1 -1
- package/dist/verify/gate-verdicts/commit-verdict-record.js +1 -1
- package/dist/verify/outcome-routing/verification-rework-issue.d.ts +4 -4
- package/dist/verify/outcome-routing/verification-rework-issue.d.ts.map +1 -1
- package/dist/verify/outcome-routing/verification-rework-issue.js +16 -6
- package/dist/verify/outcome-routing/verification-rework-issue.js.map +1 -1
- package/package.json +3 -3
- package/scripts/telora-daemon-wrapper.sh +16 -7
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/tower/tower-escalation-session.test.ts
|
|
3
|
+
// PINNED-BY-END
|
|
4
|
+
import { createLogger } from '../log/daemon-log.js';
|
|
5
|
+
import { routeTeamEscalation } from './tower-escalation-routing.js';
|
|
6
|
+
import { buildTowerEscalationPrompt, parseTowerEscalationLine } from './tower-escalation-prompt.js';
|
|
7
|
+
const log = createLogger({ module: 'tower' });
|
|
8
|
+
/** Sessions that ran cleanly without deciding, per escalation, before the daemon defers it. */
|
|
9
|
+
export const TOWER_ESCALATION_MAX_ATTEMPTS = 2;
|
|
10
|
+
/** Kill an escalation session that has not exited within this window. */
|
|
11
|
+
export const TOWER_ESCALATION_TIMEOUT_MS = 20 * 60 * 1000;
|
|
12
|
+
/** Governor engine for escalation sessions (bounded by the global session cap, as the loop supervisor's). */
|
|
13
|
+
export const TOWER_ESCALATION_GOVERNOR_ENGINE = 'tower-supervisor';
|
|
14
|
+
/**
|
|
15
|
+
* Tools the escalation session is pre-approved for: reading the worktree, and
|
|
16
|
+
* the Telora reads plus the two acts it decides through (telora_agent
|
|
17
|
+
* escalation_answer / escalation_defer). Pre-approval only; the scoped MCP
|
|
18
|
+
* profile is the bound.
|
|
19
|
+
*/
|
|
20
|
+
export const TOWER_ESCALATION_MCP_TOOLS = [
|
|
21
|
+
'Read', 'Grep', 'Glob',
|
|
22
|
+
'mcp__telora-products__telora_agent',
|
|
23
|
+
'mcp__telora-products__telora_product_focus',
|
|
24
|
+
'mcp__telora-products__telora_product_issue',
|
|
25
|
+
'mcp__telora-products__telora_product_delivery',
|
|
26
|
+
'mcp__telora-products__telora_product_tower',
|
|
27
|
+
'mcp__telora-products__telora_reality_tree_traverse',
|
|
28
|
+
'mcp__telora-products__telora_wiki_search',
|
|
29
|
+
];
|
|
30
|
+
function emptyCounts() {
|
|
31
|
+
return { pending: 0, started: 0, inFlight: 0, deferred: 0, skipped: 0, unreadable: 0 };
|
|
32
|
+
}
|
|
33
|
+
/** Pure: whether a finished spawn ran at all (an unrun session is retried, uncounted). */
|
|
34
|
+
function ran(result) {
|
|
35
|
+
return result.started && result.modelUnavailable === undefined;
|
|
36
|
+
}
|
|
37
|
+
/** Pure: whether a session that ran ended abnormally (crash or kill): straight to the operator. */
|
|
38
|
+
export function crashed(result) {
|
|
39
|
+
return ran(result) && (result.timedOut || (result.exitCode !== null && result.exitCode !== 0));
|
|
40
|
+
}
|
|
41
|
+
function describeEnd(result) {
|
|
42
|
+
if (result.modelUnavailable)
|
|
43
|
+
return `model unavailable (${result.modelUnavailable.kind})`;
|
|
44
|
+
if (!result.started)
|
|
45
|
+
return result.errorMessage ?? 'did not start';
|
|
46
|
+
if (result.timedOut)
|
|
47
|
+
return 'timed out (killed)';
|
|
48
|
+
const said = parseTowerEscalationLine(result.stdout);
|
|
49
|
+
return `exited ${result.exitCode ?? 'null'}${said ? `; said "${said}"` : ''}`;
|
|
50
|
+
}
|
|
51
|
+
async function deferAs(st, esc, summary, rationale, evidence) {
|
|
52
|
+
const { towerDecisionId } = await st.deps.defer({ escalationId: esc.escalationId, summary, rationale, evidence });
|
|
53
|
+
st.attempts.delete(esc.escalationId);
|
|
54
|
+
log.info(`[tower-escalation] handed escalation ${esc.escalationId.slice(0, 8)} to the operator: ${summary} (decision ${towerDecisionId?.slice(0, 8) ?? 'unrecorded'}).`);
|
|
55
|
+
}
|
|
56
|
+
/** Pure: the deferral the daemon records for a route straight to the operator. */
|
|
57
|
+
export function operatorRouteDeferral(route) {
|
|
58
|
+
return {
|
|
59
|
+
summary: `Handed to the operator without a supervisor session: ${route.detail}.`,
|
|
60
|
+
rationale: 'The Tower supervisor answers what lies within the scope a team is solving for under an arm; this escalation ' +
|
|
61
|
+
`is outside what any agent can settle (${route.reason}), so it goes to the operator as filed.`,
|
|
62
|
+
evidence: { route: route.reason, detail: route.detail },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Answered: hand the answer to the live team, and backstop the decision record. */
|
|
66
|
+
async function onAnswered(st, esc, focusId, now, sessionId) {
|
|
67
|
+
const delivery = await st.deps.deliverAnswer({ focusId, rearmValues: now.answeredAt ? [now.answeredAt] : [] });
|
|
68
|
+
log.info(`[tower-escalation] the supervisor answered escalation ${esc.escalationId.slice(0, 8)}; ` +
|
|
69
|
+
(delivery.delivered ? 'injected into the live team.' : `no live team took it (${delivery.detail ?? 'none'}); it is read back at the next spawn.`));
|
|
70
|
+
const record = await st.deps.listTowerDecisions(focusId);
|
|
71
|
+
if (record.decisions.some((d) => d.kind === 'escalation_answered' && d.escalationId === esc.escalationId))
|
|
72
|
+
return;
|
|
73
|
+
await st.deps.recordTowerDecision({
|
|
74
|
+
focusId, kind: 'escalation_answered', decidedByKind: 'daemon', escalationId: esc.escalationId,
|
|
75
|
+
summary: 'The Tower supervisor answered this escalation; its own decision record did not land.',
|
|
76
|
+
rationale: 'Recorded by the daemon so the answer is on the focus record; the answer text is on the escalation.',
|
|
77
|
+
evidence: { supervisorSessionId: sessionId, answeredAt: now.answeredAt },
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** After a session exits: deliver an answer, leave a deferral, defer a crash, count an undecided run. */
|
|
81
|
+
async function settle(st, esc, focus, result, sessionId) {
|
|
82
|
+
const detail = describeEnd(result);
|
|
83
|
+
const now = await st.deps.readEscalation(esc.escalationId);
|
|
84
|
+
if (now.towerState === 'answered') {
|
|
85
|
+
st.attempts.delete(esc.escalationId);
|
|
86
|
+
await onAnswered(st, esc, focus.focusId, now, sessionId);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (now.towerState !== 'pending' || !['pending', 'in_review'].includes(now.status)) {
|
|
90
|
+
st.attempts.delete(esc.escalationId);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (!ran(result)) {
|
|
94
|
+
log.info(`[tower-escalation] supervisor for ${esc.escalationId.slice(0, 8)} did not run (${detail}); the next sweep retries.`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const evidence = { supervisorSessionId: sessionId, lastDetail: detail };
|
|
98
|
+
if (crashed(result)) {
|
|
99
|
+
await deferAs(st, esc, `The Tower supervisor session ended abnormally (${detail}); handed to the operator.`, 'A supervisor that crashed decided nothing; the escalation is left for the operator rather than retried blind.', evidence);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const tried = (st.attempts.get(esc.escalationId) ?? 0) + 1;
|
|
103
|
+
st.attempts.set(esc.escalationId, tried);
|
|
104
|
+
log.warn(`[tower-escalation] supervisor for ${esc.escalationId.slice(0, 8)} ${detail} without deciding (attempt ${tried} of ${TOWER_ESCALATION_MAX_ATTEMPTS}).`);
|
|
105
|
+
if (tried >= TOWER_ESCALATION_MAX_ATTEMPTS) {
|
|
106
|
+
await deferAs(st, esc, `The Tower supervisor ran ${tried} time(s) without deciding; handed to the operator.`, 'No session answered or deferred it; the daemon stops spending sessions on it and the operator decides.', { ...evidence, attempts: tried });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** One session inside a governor slot: gather, prompt, spawn, settle. */
|
|
110
|
+
async function runSession(st, esc, focus, config) {
|
|
111
|
+
const governor = st.deps.readGovernor();
|
|
112
|
+
let token = null;
|
|
113
|
+
if (governor) {
|
|
114
|
+
token = governor.tryAcquireSlot(TOWER_ESCALATION_GOVERNOR_ENGINE);
|
|
115
|
+
if (!token) {
|
|
116
|
+
log.info(`[tower-escalation] no governor slot free for ${esc.escalationId.slice(0, 8)}; the next sweep retries.`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const repoRoot = st.deps.focusWorktreePath(focus.focusId) ?? config.repoPath;
|
|
122
|
+
const context = await st.deps.gatherContext({ focus, config, repoRoot });
|
|
123
|
+
const supervisorSessionId = st.deps.newSessionId();
|
|
124
|
+
const prompt = buildTowerEscalationPrompt({ focus, escalation: esc, supervisorSessionId, context });
|
|
125
|
+
log.info(`[tower-escalation] deciding escalation ${esc.escalationId.slice(0, 8)} of "${focus.focusName}" (session ${supervisorSessionId.slice(0, 8)}).`);
|
|
126
|
+
const result = await st.deps.spawn({
|
|
127
|
+
config, prompt, cwd: repoRoot, focusId: focus.focusId, escalationId: esc.escalationId,
|
|
128
|
+
model: st.deps.model, timeoutMs: TOWER_ESCALATION_TIMEOUT_MS, allowedTools: TOWER_ESCALATION_MCP_TOOLS,
|
|
129
|
+
});
|
|
130
|
+
await settle(st, esc, focus, result, supervisorSessionId);
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
if (token && governor)
|
|
134
|
+
governor.releaseSlot(token);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** One step for one pending escalation. Never throws. */
|
|
138
|
+
async function step(st, esc, focuses, config) {
|
|
139
|
+
if (st.inFlight.has(esc.escalationId))
|
|
140
|
+
return 'in_flight';
|
|
141
|
+
try {
|
|
142
|
+
const focus = esc.focusId ? focuses.get(esc.focusId) ?? null : null;
|
|
143
|
+
const route = routeTeamEscalation({ disposition: esc.disposition, metadata: esc.metadata, focus });
|
|
144
|
+
if (route.route === 'operator') {
|
|
145
|
+
const d = operatorRouteDeferral(route);
|
|
146
|
+
await deferAs(st, esc, d.summary, d.rationale, d.evidence);
|
|
147
|
+
return 'deferred';
|
|
148
|
+
}
|
|
149
|
+
if (!focus)
|
|
150
|
+
return 'skipped';
|
|
151
|
+
const scoped = st.deps.productConfig(config, focus.productId);
|
|
152
|
+
if (!scoped)
|
|
153
|
+
return 'skipped';
|
|
154
|
+
if ((st.attempts.get(esc.escalationId) ?? 0) >= TOWER_ESCALATION_MAX_ATTEMPTS) {
|
|
155
|
+
await deferAs(st, esc, 'The Tower supervisor could not decide it; handed to the operator.', 'Its attempts ran out before a restart of this sweep could hand it on.', { attempts: st.attempts.get(esc.escalationId) });
|
|
156
|
+
return 'deferred';
|
|
157
|
+
}
|
|
158
|
+
const run = runSession(st, esc, focus, scoped)
|
|
159
|
+
.catch((err) => log.warn(`[tower-escalation] supervision of ${esc.escalationId.slice(0, 8)} failed: ${err.message}; the next sweep retries.`))
|
|
160
|
+
.finally(() => st.inFlight.delete(esc.escalationId));
|
|
161
|
+
st.inFlight.set(esc.escalationId, run);
|
|
162
|
+
return 'started';
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
log.warn(`[tower-escalation] could not route escalation ${esc.escalationId.slice(0, 8)}: ${err.message}; the next sweep retries.`);
|
|
166
|
+
return 'unreadable';
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** Pure: whether a pending row belongs to a product this daemon runs. */
|
|
170
|
+
export function ownedByThisDaemon(esc, productIds, focusIds) {
|
|
171
|
+
if (esc.productId !== null)
|
|
172
|
+
return productIds.has(esc.productId);
|
|
173
|
+
return esc.focusId !== null && focusIds.has(esc.focusId);
|
|
174
|
+
}
|
|
175
|
+
async function readFocuses(st, config, counts) {
|
|
176
|
+
const focuses = new Map();
|
|
177
|
+
for (const product of config.products) {
|
|
178
|
+
try {
|
|
179
|
+
for (const f of await st.deps.listFocuses(product.id))
|
|
180
|
+
focuses.set(f.focusId, f);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
log.warn(`[tower-escalation] focus read failed for product ${product.id.slice(0, 8)}: ${err.message}`);
|
|
184
|
+
counts.unreadable += 1;
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return focuses;
|
|
189
|
+
}
|
|
190
|
+
/** Sweep the pending team escalations of every configured product. */
|
|
191
|
+
async function sweepPending(st) {
|
|
192
|
+
const counts = emptyCounts();
|
|
193
|
+
const config = st.deps.readConfig();
|
|
194
|
+
if (!config)
|
|
195
|
+
return counts;
|
|
196
|
+
let pending;
|
|
197
|
+
try {
|
|
198
|
+
pending = await st.deps.listPending();
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
log.warn(`[tower-escalation] pending read failed: ${err.message}`);
|
|
202
|
+
counts.unreadable += 1;
|
|
203
|
+
return counts;
|
|
204
|
+
}
|
|
205
|
+
if (pending.length === 0)
|
|
206
|
+
return counts;
|
|
207
|
+
// A focus read that fails routes nothing: an absent focus would read as closed and defer a live one.
|
|
208
|
+
const focuses = await readFocuses(st, config, counts);
|
|
209
|
+
if (!focuses)
|
|
210
|
+
return counts;
|
|
211
|
+
const productIds = new Set(config.products.map((p) => p.id));
|
|
212
|
+
for (const esc of pending) {
|
|
213
|
+
if (!ownedByThisDaemon(esc, productIds, new Set(focuses.keys())))
|
|
214
|
+
continue;
|
|
215
|
+
counts.pending += 1;
|
|
216
|
+
const outcome = await step(st, esc, focuses, config);
|
|
217
|
+
if (outcome === 'started')
|
|
218
|
+
counts.started += 1;
|
|
219
|
+
else if (outcome === 'in_flight')
|
|
220
|
+
counts.inFlight += 1;
|
|
221
|
+
else if (outcome === 'deferred')
|
|
222
|
+
counts.deferred += 1;
|
|
223
|
+
else if (outcome === 'unreadable')
|
|
224
|
+
counts.unreadable += 1;
|
|
225
|
+
else
|
|
226
|
+
counts.skipped += 1;
|
|
227
|
+
}
|
|
228
|
+
return counts;
|
|
229
|
+
}
|
|
230
|
+
/** Build it (the composition root binds one per process). */
|
|
231
|
+
export function createTowerEscalationSupervisor(deps) {
|
|
232
|
+
const st = { deps, inFlight: new Map(), attempts: new Map() };
|
|
233
|
+
return {
|
|
234
|
+
sweep: () => sweepPending(st),
|
|
235
|
+
settled: async () => { await Promise.all([...st.inFlight.values()]); },
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=tower-escalation-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tower-escalation-session.js","sourceRoot":"","sources":["../../src/tower/tower-escalation-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { DaemonConfig, FocusDeliveryInfo, FocusIssueInfo } from '../types/index.js';
|
|
2
|
+
import type { CriterionVerdictRecord, ReviewVerdictRecord } from '../queries/focus-review/review-criterion-verdicts.js';
|
|
3
|
+
import type { TowerDecision } from '../queries/tower-decisions/tower-decisions.js';
|
|
4
|
+
/**
|
|
5
|
+
* Where a product keeps its standing decisions, in the order they are tried.
|
|
6
|
+
* A file is read whole (cut at the cap; logs are kept newest first); a
|
|
7
|
+
* directory (an ADR folder) contributes its markdown files, highest-numbered
|
|
8
|
+
* first. Conventional rather than configured: a product with its log elsewhere
|
|
9
|
+
* gets none, and the prompt says so.
|
|
10
|
+
*/
|
|
11
|
+
export declare const STANDING_DECISIONS_PATHS: readonly string[];
|
|
12
|
+
/** The most standing-decision text one prompt carries. */
|
|
13
|
+
export declare const STANDING_DECISIONS_MAX_CHARS = 24000;
|
|
14
|
+
/** The most review-summary text one round carries. */
|
|
15
|
+
export declare const ROUND_SUMMARY_MAX_CHARS = 3000;
|
|
16
|
+
/** The most lines one git listing (log or stat) carries. */
|
|
17
|
+
export declare const GIT_LISTING_MAX_LINES = 40;
|
|
18
|
+
/** A held loop as its loop_detected decision recorded it. */
|
|
19
|
+
export interface HeldLoop {
|
|
20
|
+
towerDecisionId: string;
|
|
21
|
+
focusId: string;
|
|
22
|
+
criterionKey: string;
|
|
23
|
+
criterion: string;
|
|
24
|
+
nodeId: string | null;
|
|
25
|
+
createdAt: string;
|
|
26
|
+
/** The loop's reviews, oldest first, with the new blocking findings each named. */
|
|
27
|
+
reviews: Array<{
|
|
28
|
+
reviewId: string;
|
|
29
|
+
completedAt: string;
|
|
30
|
+
newBlockingIssueIds: string[];
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
/** Pure: the held loop a loop_detected decision recorded, or null when its evidence is unreadable. */
|
|
34
|
+
export declare function heldLoopOf(decision: TowerDecision): HeldLoop | null;
|
|
35
|
+
/** One blocking finding a round filed against the criterion. */
|
|
36
|
+
export interface LoopFinding {
|
|
37
|
+
issueId: string;
|
|
38
|
+
key: string | null;
|
|
39
|
+
title: string;
|
|
40
|
+
description: string | null;
|
|
41
|
+
status: string | null;
|
|
42
|
+
deliveryId: string | null;
|
|
43
|
+
relevantFiles: string | null;
|
|
44
|
+
}
|
|
45
|
+
/** One review of the loop. */
|
|
46
|
+
export interface LoopRound {
|
|
47
|
+
reviewId: string;
|
|
48
|
+
completedAt: string;
|
|
49
|
+
outcome: string | null;
|
|
50
|
+
reviewedSha: string | null;
|
|
51
|
+
/** The review's verdict on the held criterion (null when the review was not readable). */
|
|
52
|
+
verdict: CriterionVerdictRecord | null;
|
|
53
|
+
/** The review's summary, cut at ROUND_SUMMARY_MAX_CHARS: where each verdict's reasoning is written. */
|
|
54
|
+
summaryExcerpt: string | null;
|
|
55
|
+
findings: LoopFinding[];
|
|
56
|
+
/** git log + diff --stat from the previous round's commit to this one's (null on the first round or when unreadable). */
|
|
57
|
+
changeSincePrevious: string | null;
|
|
58
|
+
}
|
|
59
|
+
/** A product's standing decisions, as read. */
|
|
60
|
+
export interface StandingDecisions {
|
|
61
|
+
/** The path read (repo-relative), or null when none of STANDING_DECISIONS_PATHS held any. */
|
|
62
|
+
source: string | null;
|
|
63
|
+
text: string;
|
|
64
|
+
truncated: boolean;
|
|
65
|
+
}
|
|
66
|
+
/** The deliveries of the focus, so a Task can be filed on the right one. */
|
|
67
|
+
export interface LoopDelivery {
|
|
68
|
+
deliveryId: string;
|
|
69
|
+
name: string;
|
|
70
|
+
executionStatus: string;
|
|
71
|
+
}
|
|
72
|
+
/** Everything the supervisor is shown besides the loop itself. */
|
|
73
|
+
export interface LoopHistory {
|
|
74
|
+
rounds: LoopRound[];
|
|
75
|
+
/** git log + diff --stat from the last reviewed commit to the focus HEAD. */
|
|
76
|
+
changeSinceLastReview: string | null;
|
|
77
|
+
/** The test files the findings and the loop's commits touched -- the check under dispute. */
|
|
78
|
+
disputedChecks: string[];
|
|
79
|
+
deliveries: LoopDelivery[];
|
|
80
|
+
/** The assembled focus context (focus.context, focus.criteria_standing, loop.context). */
|
|
81
|
+
focusContext: string;
|
|
82
|
+
standingDecisions: StandingDecisions;
|
|
83
|
+
/** Every read that failed, by name, so the prompt says what is missing. */
|
|
84
|
+
readErrors: string[];
|
|
85
|
+
}
|
|
86
|
+
/** The outcome of one git command (daemon-core's GitResult, structurally). */
|
|
87
|
+
export interface GitRun {
|
|
88
|
+
success: boolean;
|
|
89
|
+
output: string;
|
|
90
|
+
}
|
|
91
|
+
/** The reads the gathering makes. Bound at the composition root. */
|
|
92
|
+
export interface LoopHistoryDeps {
|
|
93
|
+
listReviewCriterionVerdicts: (focusId: string, limit: number) => Promise<ReviewVerdictRecord[]>;
|
|
94
|
+
getFocusIssues: (focusId: string) => Promise<FocusIssueInfo[]>;
|
|
95
|
+
getFocusDeliveries: (focusId: string) => Promise<FocusDeliveryInfo[]>;
|
|
96
|
+
/** The focus's assembled context ladder (resolvers), as markdown. */
|
|
97
|
+
assembleFocusContext: (focusId: string, productId: string, config: DaemonConfig) => Promise<string>;
|
|
98
|
+
runGit: (args: string[], cwd: string) => GitRun;
|
|
99
|
+
/** A file's text, or null when it does not exist. */
|
|
100
|
+
readTextFile: (path: string) => string | null;
|
|
101
|
+
/** A directory's entry names, or null when it does not exist. */
|
|
102
|
+
listDirectory: (path: string) => string[] | null;
|
|
103
|
+
}
|
|
104
|
+
/** What one gathering is about. */
|
|
105
|
+
export interface GatherLoopHistoryArgs {
|
|
106
|
+
loop: HeldLoop;
|
|
107
|
+
productId: string;
|
|
108
|
+
config: DaemonConfig;
|
|
109
|
+
/** Where git runs and the standing decisions are read: the focus worktree, else the product repo. */
|
|
110
|
+
repoRoot: string;
|
|
111
|
+
}
|
|
112
|
+
/** Pure: whether a repo path is a test (a check). */
|
|
113
|
+
export declare function isTestPath(path: string): boolean;
|
|
114
|
+
/** Pure: the first `max` lines of `text`, with a marker when more were cut. */
|
|
115
|
+
export declare function firstLines(text: string, max: number): string;
|
|
116
|
+
/** Pure: `text` cut at `max` characters on a line boundary, and whether it was cut. */
|
|
117
|
+
export declare function boundText(text: string, max: number): {
|
|
118
|
+
text: string;
|
|
119
|
+
truncated: boolean;
|
|
120
|
+
};
|
|
121
|
+
/** Read the product's standing decisions from the first conventional path that holds any. */
|
|
122
|
+
export declare function readStandingDecisions(repoRoot: string, io: Pick<LoopHistoryDeps, 'readTextFile' | 'listDirectory'>): StandingDecisions;
|
|
123
|
+
/** Pure: the test paths named in a finding's relevant files or description. */
|
|
124
|
+
export declare function testPathsOfFinding(finding: Pick<LoopFinding, 'relevantFiles' | 'description' | 'title'>): string[];
|
|
125
|
+
/** Build the rounds of the loop, oldest first. Pure over its inputs. */
|
|
126
|
+
export declare function buildLoopRounds(loop: HeldLoop, reviews: readonly ReviewVerdictRecord[], issues: readonly FocusIssueInfo[]): Array<Omit<LoopRound, 'changeSincePrevious'>>;
|
|
127
|
+
/** Gather everything the supervisor is shown. Never throws: a failed read is named in readErrors. */
|
|
128
|
+
export declare function gatherLoopHistory(deps: LoopHistoryDeps, args: GatherLoopHistoryArgs): Promise<LoopHistory>;
|
|
129
|
+
//# sourceMappingURL=tower-supervisor-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tower-supervisor-history.d.ts","sourceRoot":"","sources":["../../src/tower/tower-supervisor-history.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AACxH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAEnF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAErD,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,sDAAsD;AACtD,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAE7C,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAKxC,6DAA6D;AAC7D,MAAM,WAAW,QAAQ;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,OAAO,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC1F;AAaD,sGAAsG;AACtG,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,QAAQ,GAAG,IAAI,CAgBnE;AAED,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,8BAA8B;AAC9B,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,0FAA0F;IAC1F,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACvC,uGAAuG;IACvG,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,yHAAyH;IACzH,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,6FAA6F;IAC7F,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,6EAA6E;IAC7E,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,6FAA6F;IAC7F,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,0FAA0F;IAC1F,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,2EAA2E;IAC3E,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,8EAA8E;AAC9E,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,2BAA2B,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAChG,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/D,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtE,qEAAqE;IACrE,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpG,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAChD,qDAAqD;IACrD,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9C,iEAAiE;IACjE,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,GAAG,IAAI,CAAC;CAClD;AAED,mCAAmC;AACnC,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,qGAAqG;IACrG,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,qDAAqD;AACrD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAKzF;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,cAAc,GAAG,eAAe,CAAC,GAC1D,iBAAiB,CAmBnB;AAkBD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,eAAe,GAAG,aAAa,GAAG,OAAO,CAAC,GAAG,MAAM,EAAE,CAGlH;AAmBD,wEAAwE;AACxE,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,SAAS,mBAAmB,EAAE,EACvC,MAAM,EAAE,SAAS,cAAc,EAAE,GAChC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAsB/C;AAED,qGAAqG;AACrG,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAkChH"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/tower/tower-supervisor-history.test.ts,
|
|
3
|
+
// packages/daemon/src/tower/tower-supervisor-prompt.test.ts,
|
|
4
|
+
// packages/daemon/src/tower/tower-supervisor-session.test.ts
|
|
5
|
+
// PINNED-BY-END
|
|
6
|
+
/**
|
|
7
|
+
* What the Tower supervisor is shown about a held review loop: the LOOP'S
|
|
8
|
+
* HISTORY (each round's verdict on the criterion and the reasoning the review
|
|
9
|
+
* wrote, the blocking findings filed, what changed on the focus branch between
|
|
10
|
+
* rounds), the CHECK UNDER DISPUTE (the test files those findings and commits
|
|
11
|
+
* touched), the focus's deliveries, its assembled context (focus, criteria
|
|
12
|
+
* standing, loop) and the product's STANDING DECISIONS.
|
|
13
|
+
*
|
|
14
|
+
* Why standing decisions are read here: a daemon session loads no operator
|
|
15
|
+
* memory, so what the product has already ruled reaches the supervisor only if
|
|
16
|
+
* the daemon hands it over. They are read from the product repo by convention
|
|
17
|
+
* (STANDING_DECISIONS_PATHS, first that yields text; newest-first entries cut
|
|
18
|
+
* at STANDING_DECISIONS_MAX_CHARS).
|
|
19
|
+
*
|
|
20
|
+
* Every read is a REQUIRED collaborator (LoopHistoryDeps), bound at the
|
|
21
|
+
* composition root (composition/review-loop-context.ts). A failed read never
|
|
22
|
+
* fails the gathering: it is named in `readErrors`, which the prompt shows, so
|
|
23
|
+
* the supervisor knows what it was not given.
|
|
24
|
+
*
|
|
25
|
+
* @module tower/tower-supervisor-history
|
|
26
|
+
*/
|
|
27
|
+
import { z } from 'zod';
|
|
28
|
+
/**
|
|
29
|
+
* Where a product keeps its standing decisions, in the order they are tried.
|
|
30
|
+
* A file is read whole (cut at the cap; logs are kept newest first); a
|
|
31
|
+
* directory (an ADR folder) contributes its markdown files, highest-numbered
|
|
32
|
+
* first. Conventional rather than configured: a product with its log elsewhere
|
|
33
|
+
* gets none, and the prompt says so.
|
|
34
|
+
*/
|
|
35
|
+
export const STANDING_DECISIONS_PATHS = [
|
|
36
|
+
'docs/DECISIONS.md', 'DECISIONS.md', 'docs/decisions.md', 'docs/adr', 'doc/adr', 'docs/decisions',
|
|
37
|
+
];
|
|
38
|
+
/** The most standing-decision text one prompt carries. */
|
|
39
|
+
export const STANDING_DECISIONS_MAX_CHARS = 24_000;
|
|
40
|
+
/** The most review-summary text one round carries. */
|
|
41
|
+
export const ROUND_SUMMARY_MAX_CHARS = 3_000;
|
|
42
|
+
/** The most lines one git listing (log or stat) carries. */
|
|
43
|
+
export const GIT_LISTING_MAX_LINES = 40;
|
|
44
|
+
/** How many verdict-bearing reviews the history reads back to find the loop's rounds. */
|
|
45
|
+
const REVIEWS_READ = 20;
|
|
46
|
+
const LoopEvidenceSchema = z.object({
|
|
47
|
+
criterionKey: z.string(),
|
|
48
|
+
criterion: z.string(),
|
|
49
|
+
nodeId: z.string().nullable().optional(),
|
|
50
|
+
reviews: z.array(z.object({
|
|
51
|
+
reviewId: z.string(),
|
|
52
|
+
completedAt: z.string(),
|
|
53
|
+
newBlockingIssueIds: z.array(z.string()),
|
|
54
|
+
}).passthrough()),
|
|
55
|
+
}).passthrough();
|
|
56
|
+
/** Pure: the held loop a loop_detected decision recorded, or null when its evidence is unreadable. */
|
|
57
|
+
export function heldLoopOf(decision) {
|
|
58
|
+
if (decision.kind !== 'loop_detected')
|
|
59
|
+
return null;
|
|
60
|
+
const parsed = LoopEvidenceSchema.safeParse(decision.evidence);
|
|
61
|
+
if (!parsed.success)
|
|
62
|
+
return null;
|
|
63
|
+
const ev = parsed.data;
|
|
64
|
+
return {
|
|
65
|
+
towerDecisionId: decision.towerDecisionId,
|
|
66
|
+
focusId: decision.focusId,
|
|
67
|
+
criterionKey: decision.criterionKey ?? ev.criterionKey,
|
|
68
|
+
criterion: ev.criterion,
|
|
69
|
+
nodeId: decision.nodeId ?? ev.nodeId ?? null,
|
|
70
|
+
createdAt: decision.createdAt,
|
|
71
|
+
reviews: [...ev.reviews]
|
|
72
|
+
.sort((a, b) => Date.parse(a.completedAt) - Date.parse(b.completedAt))
|
|
73
|
+
.map((r) => ({ reviewId: r.reviewId, completedAt: r.completedAt, newBlockingIssueIds: r.newBlockingIssueIds })),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const TEST_PATH = /(^|\/)(__tests__|tests?|spec)\/|\.(test|spec)\.[cm]?[jt]sx?$|_test\.(go|py|rs)$|(^|\/)test_[^/]+\.py$|\.test\.sql$/;
|
|
77
|
+
const PATH_IN_TEXT = /[\w./@-]+\.[a-z]{1,5}\b/g;
|
|
78
|
+
/** Pure: whether a repo path is a test (a check). */
|
|
79
|
+
export function isTestPath(path) {
|
|
80
|
+
return TEST_PATH.test(path);
|
|
81
|
+
}
|
|
82
|
+
/** Pure: the first `max` lines of `text`, with a marker when more were cut. */
|
|
83
|
+
export function firstLines(text, max) {
|
|
84
|
+
const lines = text.trimEnd().split('\n');
|
|
85
|
+
return lines.length <= max ? lines.join('\n') : [...lines.slice(0, max), `... (${lines.length - max} more lines)`].join('\n');
|
|
86
|
+
}
|
|
87
|
+
/** Pure: `text` cut at `max` characters on a line boundary, and whether it was cut. */
|
|
88
|
+
export function boundText(text, max) {
|
|
89
|
+
if (text.length <= max)
|
|
90
|
+
return { text, truncated: false };
|
|
91
|
+
const cut = text.slice(0, max);
|
|
92
|
+
const lastNewline = cut.lastIndexOf('\n');
|
|
93
|
+
return { text: lastNewline > max / 2 ? cut.slice(0, lastNewline) : cut, truncated: true };
|
|
94
|
+
}
|
|
95
|
+
/** Read the product's standing decisions from the first conventional path that holds any. */
|
|
96
|
+
export function readStandingDecisions(repoRoot, io) {
|
|
97
|
+
for (const rel of STANDING_DECISIONS_PATHS) {
|
|
98
|
+
const abs = `${repoRoot.replace(/\/$/, '')}/${rel}`;
|
|
99
|
+
const entries = io.listDirectory(abs);
|
|
100
|
+
if (entries !== null) {
|
|
101
|
+
const files = entries.filter((e) => e.toLowerCase().endsWith('.md')).sort().reverse();
|
|
102
|
+
const parts = files.map((f) => `### ${rel}/${f}\n\n${io.readTextFile(`${abs}/${f}`) ?? ''}`.trimEnd());
|
|
103
|
+
const joined = parts.join('\n\n');
|
|
104
|
+
if (joined.trim() === '')
|
|
105
|
+
continue;
|
|
106
|
+
const bounded = boundText(joined, STANDING_DECISIONS_MAX_CHARS);
|
|
107
|
+
return { source: rel, text: bounded.text, truncated: bounded.truncated };
|
|
108
|
+
}
|
|
109
|
+
const text = io.readTextFile(abs);
|
|
110
|
+
if (text !== null && text.trim() !== '') {
|
|
111
|
+
const bounded = boundText(text, STANDING_DECISIONS_MAX_CHARS);
|
|
112
|
+
return { source: rel, text: bounded.text, truncated: bounded.truncated };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return { source: null, text: '', truncated: false };
|
|
116
|
+
}
|
|
117
|
+
/** The log + stat of a commit range, or null when git cannot read it. */
|
|
118
|
+
function describeRange(runGit, cwd, from, to) {
|
|
119
|
+
const log = runGit(['log', '--oneline', '--no-decorate', `${from}..${to}`], cwd);
|
|
120
|
+
const stat = runGit(['diff', '--stat', `${from}..${to}`], cwd);
|
|
121
|
+
if (!log.success || !stat.success)
|
|
122
|
+
return null;
|
|
123
|
+
const commits = log.output.trim() === '' ? '(no commits)' : firstLines(log.output, GIT_LISTING_MAX_LINES);
|
|
124
|
+
const files = stat.output.trim() === '' ? '(no file changes)' : firstLines(stat.output, GIT_LISTING_MAX_LINES);
|
|
125
|
+
return `Commits ${from.slice(0, 12)}..${to.slice(0, 12)}:\n${commits}\n\nFiles:\n${files}`;
|
|
126
|
+
}
|
|
127
|
+
/** The files a commit range changed (empty when unreadable). */
|
|
128
|
+
function changedFiles(runGit, cwd, from, to) {
|
|
129
|
+
const res = runGit(['diff', '--name-only', `${from}..${to}`], cwd);
|
|
130
|
+
return res.success ? res.output.split('\n').map((l) => l.trim()).filter((l) => l !== '') : [];
|
|
131
|
+
}
|
|
132
|
+
/** Pure: the test paths named in a finding's relevant files or description. */
|
|
133
|
+
export function testPathsOfFinding(finding) {
|
|
134
|
+
const text = [finding.relevantFiles ?? '', finding.description ?? '', finding.title].join('\n');
|
|
135
|
+
return [...new Set(text.match(PATH_IN_TEXT) ?? [])].filter(isTestPath);
|
|
136
|
+
}
|
|
137
|
+
function findingOf(issue) {
|
|
138
|
+
return {
|
|
139
|
+
issueId: issue.id, key: issue.key, title: issue.title, description: issue.description,
|
|
140
|
+
status: issue.status, deliveryId: issue.deliveryId, relevantFiles: issue.relevantFiles,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/** Run one read; on failure name it in `errors` and answer `fallback`. */
|
|
144
|
+
async function guarded(name, errors, fallback, read) {
|
|
145
|
+
try {
|
|
146
|
+
return await read();
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
errors.push(`${name}: ${err.message}`);
|
|
150
|
+
return fallback;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Build the rounds of the loop, oldest first. Pure over its inputs. */
|
|
154
|
+
export function buildLoopRounds(loop, reviews, issues) {
|
|
155
|
+
const byId = new Map(reviews.map((r) => [r.reviewId, r]));
|
|
156
|
+
const issueById = new Map(issues.map((i) => [i.id, i]));
|
|
157
|
+
return loop.reviews.map((entry) => {
|
|
158
|
+
const review = byId.get(entry.reviewId);
|
|
159
|
+
const verdict = review?.criterionVerdicts.find((v) => v.criterionKey === loop.criterionKey) ?? null;
|
|
160
|
+
const ids = [...new Set([...entry.newBlockingIssueIds, ...(verdict?.issueIds ?? [])])];
|
|
161
|
+
const findings = ids.map((id) => {
|
|
162
|
+
const issue = issueById.get(id);
|
|
163
|
+
return issue ? findingOf(issue) : { issueId: id, key: null, title: '(issue not readable on this focus)', description: null, status: null, deliveryId: null, relevantFiles: null };
|
|
164
|
+
});
|
|
165
|
+
const summary = review?.summary ?? null;
|
|
166
|
+
return {
|
|
167
|
+
reviewId: entry.reviewId,
|
|
168
|
+
completedAt: review?.completedAt ?? entry.completedAt,
|
|
169
|
+
outcome: review?.outcome ?? null,
|
|
170
|
+
reviewedSha: review?.reviewedSha ?? null,
|
|
171
|
+
verdict,
|
|
172
|
+
summaryExcerpt: summary === null ? null : boundText(summary, ROUND_SUMMARY_MAX_CHARS).text,
|
|
173
|
+
findings,
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
/** Gather everything the supervisor is shown. Never throws: a failed read is named in readErrors. */
|
|
178
|
+
export async function gatherLoopHistory(deps, args) {
|
|
179
|
+
const { loop, repoRoot } = args;
|
|
180
|
+
const readErrors = [];
|
|
181
|
+
const [reviews, issues, deliveries, focusContext] = await Promise.all([
|
|
182
|
+
guarded('review verdicts', readErrors, [], () => deps.listReviewCriterionVerdicts(loop.focusId, REVIEWS_READ)),
|
|
183
|
+
guarded('focus issues', readErrors, [], () => deps.getFocusIssues(loop.focusId)),
|
|
184
|
+
guarded('focus deliveries', readErrors, [], () => deps.getFocusDeliveries(loop.focusId)),
|
|
185
|
+
guarded('focus context', readErrors, '', () => deps.assembleFocusContext(loop.focusId, args.productId, args.config)),
|
|
186
|
+
]);
|
|
187
|
+
const base = buildLoopRounds(loop, reviews, issues);
|
|
188
|
+
const disputed = new Set(base.flatMap((r) => r.findings.flatMap(testPathsOfFinding)));
|
|
189
|
+
const rounds = base.map((round, i) => {
|
|
190
|
+
const prev = i > 0 ? base[i - 1]?.reviewedSha ?? null : null;
|
|
191
|
+
if (prev === null || round.reviewedSha === null)
|
|
192
|
+
return { ...round, changeSincePrevious: null };
|
|
193
|
+
for (const f of changedFiles(deps.runGit, repoRoot, prev, round.reviewedSha))
|
|
194
|
+
if (isTestPath(f))
|
|
195
|
+
disputed.add(f);
|
|
196
|
+
return { ...round, changeSincePrevious: describeRange(deps.runGit, repoRoot, prev, round.reviewedSha) };
|
|
197
|
+
});
|
|
198
|
+
const lastSha = [...base].reverse().find((r) => r.reviewedSha !== null)?.reviewedSha ?? null;
|
|
199
|
+
const changeSinceLastReview = lastSha === null ? null : describeRange(deps.runGit, repoRoot, lastSha, 'HEAD');
|
|
200
|
+
let standingDecisions = { source: null, text: '', truncated: false };
|
|
201
|
+
try {
|
|
202
|
+
standingDecisions = readStandingDecisions(repoRoot, deps);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
readErrors.push(`standing decisions: ${err.message}`);
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
rounds,
|
|
209
|
+
changeSinceLastReview,
|
|
210
|
+
disputedChecks: [...disputed].sort(),
|
|
211
|
+
deliveries: deliveries.map((d) => ({ deliveryId: d.id, name: d.name, executionStatus: d.executionStatus ?? 'unknown' })),
|
|
212
|
+
focusContext,
|
|
213
|
+
standingDecisions,
|
|
214
|
+
readErrors,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=tower-supervisor-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tower-supervisor-history.js","sourceRoot":"","sources":["../../src/tower/tower-supervisor-history.ts"],"names":[],"mappings":"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"}
|