@telora/daemon 0.21.98 → 0.21.144
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 +6 -3
- package/dist/audit/audit-hooks.d.ts +120 -5
- package/dist/audit/audit-hooks.d.ts.map +1 -1
- package/dist/audit/audit-hooks.js +205 -45
- package/dist/audit/audit-hooks.js.map +1 -1
- package/dist/ci/ci-escalation.js +1 -1
- package/dist/ci/ci-escalation.js.map +1 -1
- package/dist/ci/ci-sensor-loop.d.ts +30 -0
- package/dist/ci/ci-sensor-loop.d.ts.map +1 -1
- package/dist/ci/ci-sensor-loop.js +85 -12
- package/dist/ci/ci-sensor-loop.js.map +1 -1
- package/dist/cli/connect/config-write.d.ts +87 -0
- package/dist/cli/connect/config-write.d.ts.map +1 -0
- package/dist/cli/connect/config-write.js +255 -0
- package/dist/cli/connect/config-write.js.map +1 -0
- package/dist/cli/connect/registration.d.ts +76 -0
- package/dist/cli/connect/registration.d.ts.map +1 -0
- package/dist/cli/connect/registration.js +207 -0
- package/dist/cli/connect/registration.js.map +1 -0
- package/dist/cli/connect.d.ts +3 -141
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +9 -441
- package/dist/cli/connect.js.map +1 -1
- package/dist/completion/coverage-drift-state.d.ts +29 -2
- package/dist/completion/coverage-drift-state.d.ts.map +1 -1
- package/dist/completion/coverage-drift-state.js +42 -2
- package/dist/completion/coverage-drift-state.js.map +1 -1
- package/dist/completion/coverage-stabilized.d.ts +58 -0
- package/dist/completion/coverage-stabilized.d.ts.map +1 -0
- package/dist/completion/coverage-stabilized.js +84 -0
- package/dist/completion/coverage-stabilized.js.map +1 -0
- package/dist/completion/delivery-advancement-guard.d.ts +21 -0
- package/dist/completion/delivery-advancement-guard.d.ts.map +1 -1
- package/dist/completion/delivery-advancement-guard.js +31 -3
- package/dist/completion/delivery-advancement-guard.js.map +1 -1
- package/dist/completion/escalation-provenance.d.ts +2 -1
- package/dist/completion/escalation-provenance.d.ts.map +1 -1
- package/dist/completion/escalation-provenance.js +2 -1
- package/dist/completion/escalation-provenance.js.map +1 -1
- package/dist/completion/escalations.js +1 -1
- package/dist/completion/escalations.js.map +1 -1
- package/dist/completion/event-escalations.d.ts +16 -1
- package/dist/completion/event-escalations.d.ts.map +1 -1
- package/dist/completion/event-escalations.js +43 -5
- package/dist/completion/event-escalations.js.map +1 -1
- package/dist/completion/event-phases.d.ts.map +1 -1
- package/dist/completion/event-phases.js +5 -2
- package/dist/completion/event-phases.js.map +1 -1
- package/dist/completion/event.d.ts +1 -1
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +2 -2
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/machine-remediable-demotion.d.ts +74 -0
- package/dist/completion/machine-remediable-demotion.d.ts.map +1 -0
- package/dist/completion/machine-remediable-demotion.js +148 -0
- package/dist/completion/machine-remediable-demotion.js.map +1 -0
- package/dist/completion/read-only-pristine.d.ts +1 -1
- package/dist/completion/read-only-pristine.d.ts.map +1 -1
- package/dist/completion/read-only-pristine.js +1 -1
- package/dist/completion/read-only-pristine.js.map +1 -1
- package/dist/completion/review-exit-escalations.d.ts +1 -1
- package/dist/completion/review-exit-escalations.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.d.ts +5 -2
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +15 -8
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/settle-injection-sweep.d.ts +55 -0
- package/dist/completion/settle-injection-sweep.d.ts.map +1 -0
- package/dist/completion/settle-injection-sweep.js +88 -0
- package/dist/completion/settle-injection-sweep.js.map +1 -0
- package/dist/completion/state-cascade.d.ts.map +1 -1
- package/dist/completion/state-cascade.js +42 -1
- package/dist/completion/state-cascade.js.map +1 -1
- package/dist/completion/status-advance-phase.d.ts.map +1 -1
- package/dist/completion/status-advance-phase.js +18 -0
- package/dist/completion/status-advance-phase.js.map +1 -1
- package/dist/completion/team-lifecycle.d.ts +42 -0
- package/dist/completion/team-lifecycle.d.ts.map +1 -1
- package/dist/completion/team-lifecycle.js +73 -1
- package/dist/completion/team-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-advance-block.d.ts +1 -1
- package/dist/delivery/delivery-advance-block.d.ts.map +1 -1
- package/dist/delivery/delivery-advance-block.js +1 -1
- package/dist/delivery/delivery-advance-block.js.map +1 -1
- package/dist/delivery/delivery-lifecycle.d.ts +19 -33
- package/dist/delivery/delivery-lifecycle.d.ts.map +1 -1
- package/dist/delivery/delivery-lifecycle.js +20 -148
- package/dist/delivery/delivery-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-merge-ops.d.ts +46 -0
- package/dist/delivery/delivery-merge-ops.d.ts.map +1 -0
- package/dist/delivery/delivery-merge-ops.js +154 -0
- package/dist/delivery/delivery-merge-ops.js.map +1 -0
- package/dist/delivery/delivery-reconciler-apply.d.ts +28 -0
- package/dist/delivery/delivery-reconciler-apply.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler-apply.js +30 -0
- package/dist/delivery/delivery-reconciler-apply.js.map +1 -1
- package/dist/delivery/delivery-reconciler-shadow.d.ts +1 -1
- package/dist/delivery/delivery-reconciler-shadow.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler-shadow.js +1 -1
- package/dist/delivery/delivery-reconciler-shadow.js.map +1 -1
- package/dist/delivery/delivery-reconciler.d.ts +7 -2
- package/dist/delivery/delivery-reconciler.d.ts.map +1 -1
- package/dist/delivery/delivery-reconciler.js +34 -5
- package/dist/delivery/delivery-reconciler.js.map +1 -1
- package/dist/delivery/external-hold-surface.d.ts +32 -0
- package/dist/delivery/external-hold-surface.d.ts.map +1 -0
- package/dist/delivery/external-hold-surface.js +67 -0
- package/dist/delivery/external-hold-surface.js.map +1 -0
- package/dist/delivery/external-hold.d.ts +21 -0
- package/dist/delivery/external-hold.d.ts.map +1 -1
- package/dist/delivery/external-hold.js +40 -5
- package/dist/delivery/external-hold.js.map +1 -1
- package/dist/delivery/operator-hold.d.ts +1 -1
- package/dist/delivery/operator-hold.d.ts.map +1 -1
- package/dist/delivery/paused-revival.d.ts +140 -0
- package/dist/delivery/paused-revival.d.ts.map +1 -0
- package/dist/delivery/paused-revival.js +230 -0
- package/dist/delivery/paused-revival.js.map +1 -0
- package/dist/delivery/wait-reachability.d.ts.map +1 -1
- package/dist/delivery/wait-reachability.js +11 -0
- package/dist/delivery/wait-reachability.js.map +1 -1
- package/dist/directive/close-loop-dispatcher.d.ts +16 -263
- package/dist/directive/close-loop-dispatcher.d.ts.map +1 -1
- package/dist/directive/close-loop-dispatcher.js +21 -259
- package/dist/directive/close-loop-dispatcher.js.map +1 -1
- package/dist/directive/directive-dispatch.d.ts +20 -1
- package/dist/directive/directive-dispatch.d.ts.map +1 -1
- package/dist/directive/directive-dispatch.js +19 -1
- package/dist/directive/directive-dispatch.js.map +1 -1
- package/dist/directive/directive-executor.d.ts +1 -3
- package/dist/directive/directive-executor.d.ts.map +1 -1
- package/dist/directive/directive-executor.js +24 -22
- package/dist/directive/directive-executor.js.map +1 -1
- package/dist/directive/phase-sync.d.ts +28 -15
- package/dist/directive/phase-sync.d.ts.map +1 -1
- package/dist/directive/phase-sync.js +28 -36
- package/dist/directive/phase-sync.js.map +1 -1
- package/dist/directive/resolver-dispatch.d.ts +19 -92
- package/dist/directive/resolver-dispatch.d.ts.map +1 -1
- package/dist/directive/resolver-dispatch.js +19 -65
- package/dist/directive/resolver-dispatch.js.map +1 -1
- package/dist/drift/staleness-sensor.js +1 -1
- package/dist/drift/staleness-sensor.js.map +1 -1
- package/dist/focus/focus-engine.d.ts.map +1 -1
- package/dist/focus/focus-engine.js +29 -2
- 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 +290 -256
- package/dist/focus/focus-executor.js.map +1 -1
- package/dist/focus/focus-lifecycle.d.ts.map +1 -1
- package/dist/focus/focus-lifecycle.js +2 -1
- package/dist/focus/focus-lifecycle.js.map +1 -1
- package/dist/focus/focus-loop-registry.d.ts.map +1 -1
- package/dist/focus/focus-loop-registry.js +43 -1
- package/dist/focus/focus-loop-registry.js.map +1 -1
- package/dist/focus/focus-respawn-guard.d.ts +1 -1
- package/dist/focus/focus-respawn-guard.d.ts.map +1 -1
- package/dist/focus/focus-respawn-guard.js +12 -3
- package/dist/focus/focus-respawn-guard.js.map +1 -1
- package/dist/focus/focus-team-state.d.ts +11 -0
- package/dist/focus/focus-team-state.d.ts.map +1 -1
- package/dist/focus/focus-team-state.js +17 -0
- package/dist/focus/focus-team-state.js.map +1 -1
- package/dist/focus/listener-auto-advance.d.ts +17 -46
- package/dist/focus/listener-auto-advance.d.ts.map +1 -1
- package/dist/focus/listener-auto-advance.js +104 -256
- package/dist/focus/listener-auto-advance.js.map +1 -1
- package/dist/focus/listener-spawn.d.ts +62 -0
- package/dist/focus/listener-spawn.d.ts.map +1 -0
- package/dist/focus/listener-spawn.js +418 -0
- package/dist/focus/listener-spawn.js.map +1 -0
- package/dist/focus/listener-state.d.ts +57 -0
- package/dist/focus/listener-state.d.ts.map +1 -0
- package/dist/focus/listener-state.js +63 -0
- package/dist/focus/listener-state.js.map +1 -0
- package/dist/focus/listener.d.ts +0 -58
- package/dist/focus/listener.d.ts.map +1 -1
- package/dist/focus/listener.js +138 -516
- package/dist/focus/listener.js.map +1 -1
- package/dist/focus/tick-deadline.d.ts +55 -0
- package/dist/focus/tick-deadline.d.ts.map +1 -0
- package/dist/focus/tick-deadline.js +91 -0
- package/dist/focus/tick-deadline.js.map +1 -0
- package/dist/focus/verify-open-issues.d.ts +62 -0
- package/dist/focus/verify-open-issues.d.ts.map +1 -0
- package/dist/focus/verify-open-issues.js +265 -0
- package/dist/focus/verify-open-issues.js.map +1 -0
- package/dist/focus-stage-lifecycle/index.d.ts +19 -26
- package/dist/focus-stage-lifecycle/index.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/index.js +27 -39
- package/dist/focus-stage-lifecycle/index.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts +52 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.d.ts.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js +94 -0
- package/dist/focus-stage-lifecycle/wedge-cause-arbiter.js.map +1 -0
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +18 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +57 -7
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/git/index.d.ts +2 -0
- package/dist/git/index.d.ts.map +1 -1
- package/dist/git/index.js +2 -0
- package/dist/git/index.js.map +1 -1
- package/dist/git/merge-strategies.d.ts +80 -0
- package/dist/git/merge-strategies.d.ts.map +1 -0
- package/dist/git/merge-strategies.js +218 -0
- package/dist/git/merge-strategies.js.map +1 -0
- package/dist/git/merge-to-main.d.ts +76 -0
- package/dist/git/merge-to-main.d.ts.map +1 -0
- package/dist/git/merge-to-main.js +256 -0
- package/dist/git/merge-to-main.js.map +1 -0
- package/dist/git/merge.d.ts +27 -81
- package/dist/git/merge.d.ts.map +1 -1
- package/dist/git/merge.js +4 -448
- package/dist/git/merge.js.map +1 -1
- package/dist/git/state-detector.js +1 -1
- package/dist/git/state-detector.js.map +1 -1
- package/dist/guard/condition-evaluators.d.ts +9 -0
- package/dist/guard/condition-evaluators.d.ts.map +1 -1
- package/dist/guard/condition-evaluators.js +15 -0
- package/dist/guard/condition-evaluators.js.map +1 -1
- package/dist/guard/guard-evaluator.d.ts +17 -1
- package/dist/guard/guard-evaluator.d.ts.map +1 -1
- package/dist/guard/guard-evaluator.js +61 -2
- package/dist/guard/guard-evaluator.js.map +1 -1
- package/dist/guard/trigger-executor.d.ts +30 -18
- package/dist/guard/trigger-executor.d.ts.map +1 -1
- package/dist/guard/trigger-executor.js +55 -31
- package/dist/guard/trigger-executor.js.map +1 -1
- package/dist/loops/engine.js +1 -1
- package/dist/loops/engine.js.map +1 -1
- package/dist/merge/focus-merge.d.ts +1 -1
- package/dist/merge/focus-merge.d.ts.map +1 -1
- package/dist/merge/focus-merge.js +1 -1
- package/dist/merge/focus-merge.js.map +1 -1
- package/dist/merge/merge-back-loop.d.ts +1 -1
- package/dist/merge/merge-back-loop.d.ts.map +1 -1
- package/dist/merge/merge-back-loop.js +2 -2
- package/dist/merge/merge-back-loop.js.map +1 -1
- package/dist/merge/merge-detector.js +1 -1
- package/dist/merge/merge-detector.js.map +1 -1
- package/dist/nexus/return.js +1 -1
- package/dist/nexus/return.js.map +1 -1
- package/dist/prd/controller-shared.d.ts +223 -0
- package/dist/prd/controller-shared.d.ts.map +1 -0
- package/dist/prd/controller-shared.js +77 -0
- package/dist/prd/controller-shared.js.map +1 -0
- package/dist/prd/controller.d.ts +5 -256
- package/dist/prd/controller.d.ts.map +1 -1
- package/dist/prd/controller.js +9 -166
- package/dist/prd/controller.js.map +1 -1
- package/dist/prd/done-sweep.d.ts +55 -0
- package/dist/prd/done-sweep.d.ts.map +1 -0
- package/dist/prd/done-sweep.js +112 -0
- package/dist/prd/done-sweep.js.map +1 -0
- package/dist/prompt/team-prompt-base.d.ts +1 -1
- package/dist/prompt/team-prompt-base.d.ts.map +1 -1
- package/dist/prompt/team-prompt-base.js +1 -1
- package/dist/prompt/team-prompt-base.js.map +1 -1
- package/dist/prompt-sections/execution-sections.d.ts +1 -1
- package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
- package/dist/prompt-sections/execution-sections.js +12 -2
- package/dist/prompt-sections/execution-sections.js.map +1 -1
- package/dist/prompt-sections/persona-sections.d.ts +0 -32
- package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
- package/dist/prompt-sections/persona-sections.js +19 -88
- package/dist/prompt-sections/persona-sections.js.map +1 -1
- package/dist/prompt-sections/shared.d.ts +1 -1
- package/dist/prompt-sections/shared.d.ts.map +1 -1
- package/dist/queries/agent-resolvable-promotion.d.ts +1 -1
- package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -1
- package/dist/queries/agent-resolvable-promotion.js +2 -1
- package/dist/queries/agent-resolvable-promotion.js.map +1 -1
- package/dist/queries/deliveries.d.ts +0 -172
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +1 -77
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/escalation-consumption.d.ts +120 -0
- package/dist/queries/escalation-consumption.d.ts.map +1 -0
- package/dist/queries/escalation-consumption.js +143 -0
- package/dist/queries/escalation-consumption.js.map +1 -0
- package/dist/queries/escalation-dispositions.d.ts +19 -0
- package/dist/queries/escalation-dispositions.d.ts.map +1 -0
- package/dist/queries/escalation-dispositions.js +18 -0
- package/dist/queries/escalation-dispositions.js.map +1 -0
- package/dist/queries/escalation-suppression.d.ts +1 -1
- package/dist/queries/escalation-suppression.d.ts.map +1 -1
- package/dist/queries/escalation-suppression.js +1 -1
- package/dist/queries/escalation-suppression.js.map +1 -1
- package/dist/queries/escalations.d.ts +343 -0
- package/dist/queries/escalations.d.ts.map +1 -0
- package/dist/queries/escalations.js +493 -0
- package/dist/queries/escalations.js.map +1 -0
- package/dist/queries/focus-discovery.d.ts +204 -0
- package/dist/queries/focus-discovery.d.ts.map +1 -0
- package/dist/queries/focus-discovery.js +92 -0
- package/dist/queries/focus-discovery.js.map +1 -0
- package/dist/queries/focuses.d.ts +36 -0
- package/dist/queries/focuses.d.ts.map +1 -1
- package/dist/queries/focuses.js +45 -0
- package/dist/queries/focuses.js.map +1 -1
- package/dist/queries/guards.d.ts +10 -0
- package/dist/queries/guards.d.ts.map +1 -1
- package/dist/queries/guards.js +14 -1
- package/dist/queries/guards.js.map +1 -1
- package/dist/queries/index.d.ts +4 -2
- package/dist/queries/index.d.ts.map +1 -1
- package/dist/queries/index.js +4 -2
- package/dist/queries/index.js.map +1 -1
- package/dist/queries/issues.d.ts +8 -372
- package/dist/queries/issues.d.ts.map +1 -1
- package/dist/queries/issues.js +7 -482
- package/dist/queries/issues.js.map +1 -1
- package/dist/queries/schemas.d.ts +51 -0
- package/dist/queries/schemas.d.ts.map +1 -1
- package/dist/queries/schemas.js +34 -0
- package/dist/queries/schemas.js.map +1 -1
- package/dist/queries/verification.d.ts +5 -6
- package/dist/queries/verification.d.ts.map +1 -1
- package/dist/queries/verification.js +5 -6
- package/dist/queries/verification.js.map +1 -1
- package/dist/resolvers/agent-escalations.d.ts +20 -0
- package/dist/resolvers/agent-escalations.d.ts.map +1 -1
- package/dist/resolvers/agent-escalations.js +40 -10
- package/dist/resolvers/agent-escalations.js.map +1 -1
- package/dist/resolvers/index.d.ts +2 -2
- package/dist/resolvers/index.d.ts.map +1 -1
- package/dist/resolvers/index.js +1 -1
- package/dist/resolvers/index.js.map +1 -1
- package/dist/resolvers/loop-persona.d.ts +1 -11
- package/dist/resolvers/loop-persona.d.ts.map +1 -1
- package/dist/resolvers/loop-persona.js +2 -16
- package/dist/resolvers/loop-persona.js.map +1 -1
- package/dist/resolvers/shared/git-diff.d.ts +99 -18
- package/dist/resolvers/shared/git-diff.d.ts.map +1 -1
- package/dist/resolvers/shared/git-diff.js +98 -27
- package/dist/resolvers/shared/git-diff.js.map +1 -1
- package/dist/shell/control-state.d.ts +1 -1
- package/dist/shell/control-state.d.ts.map +1 -1
- package/dist/shell/control-state.js +1 -1
- package/dist/shell/control-state.js.map +1 -1
- package/dist/shell/crash-recovery.d.ts +1 -1
- package/dist/shell/crash-recovery.d.ts.map +1 -1
- package/dist/shell/crash-recovery.js +2 -2
- package/dist/shell/crash-recovery.js.map +1 -1
- package/dist/shell/install-probe-tick.d.ts +1 -1
- package/dist/shell/install-probe-tick.d.ts.map +1 -1
- package/dist/shell/install-probe-tick.js +1 -1
- package/dist/shell/install-probe-tick.js.map +1 -1
- package/dist/shell/unified-shell-provisioning.d.ts +40 -0
- package/dist/shell/unified-shell-provisioning.d.ts.map +1 -1
- package/dist/shell/unified-shell-provisioning.js +72 -0
- package/dist/shell/unified-shell-provisioning.js.map +1 -1
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +19 -2
- package/dist/shell/unified-shell.js.map +1 -1
- package/dist/spawn/helpers.d.ts.map +1 -1
- package/dist/spawn/helpers.js +6 -1
- package/dist/spawn/helpers.js.map +1 -1
- package/dist/spawn/model-routing.d.ts +1 -1
- package/dist/spawn/model-routing.d.ts.map +1 -1
- package/dist/spawn/model-routing.js +1 -1
- package/dist/spawn/model-routing.js.map +1 -1
- package/dist/spawn/process-spawn.d.ts.map +1 -1
- package/dist/spawn/process-spawn.js +7 -0
- package/dist/spawn/process-spawn.js.map +1 -1
- package/dist/spawn/prompt-assembly.d.ts +1 -1
- package/dist/spawn/prompt-assembly.d.ts.map +1 -1
- package/dist/spawn/prompt-assembly.js +1 -1
- package/dist/spawn/prompt-assembly.js.map +1 -1
- package/dist/spawn/spawn-cooldown.d.ts +41 -7
- package/dist/spawn/spawn-cooldown.d.ts.map +1 -1
- package/dist/spawn/spawn-cooldown.js +47 -0
- package/dist/spawn/spawn-cooldown.js.map +1 -1
- package/dist/spawn/spawn-decision.d.ts.map +1 -1
- package/dist/spawn/spawn-decision.js +34 -2
- package/dist/spawn/spawn-decision.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts +1 -1
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +1 -1
- package/dist/spawn/worktree-session.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/verify/stall-detectors.d.ts +20 -8
- package/dist/verify/stall-detectors.d.ts.map +1 -1
- package/dist/verify/stall-detectors.js +27 -46
- package/dist/verify/stall-detectors.js.map +1 -1
- package/dist/verify/verification-default-on.d.ts +1 -1
- package/dist/verify/verification-default-on.d.ts.map +1 -1
- package/dist/verify/verification-deps.d.ts +1 -1
- package/dist/verify/verification-deps.d.ts.map +1 -1
- package/dist/verify/verification-engine.d.ts.map +1 -1
- package/dist/verify/verification-engine.js +20 -12
- package/dist/verify/verification-engine.js.map +1 -1
- package/dist/workflow/gate-failure-policy.d.ts +48 -0
- package/dist/workflow/gate-failure-policy.d.ts.map +1 -0
- package/dist/workflow/gate-failure-policy.js +57 -0
- package/dist/workflow/gate-failure-policy.js.map +1 -0
- package/dist/workflow/pipeline-config.d.ts +2 -2
- package/dist/workflow/pipeline-config.js +2 -2
- package/dist/worktree/provision.js +1 -1
- package/dist/worktree/provision.js.map +1 -1
- package/dist/worktree/scratch-guard.d.ts.map +1 -1
- package/dist/worktree/scratch-guard.js +23 -2
- package/dist/worktree/scratch-guard.js.map +1 -1
- package/package.json +1 -1
- package/dist/directive/close-loop-stage.d.ts +0 -50
- package/dist/directive/close-loop-stage.d.ts.map +0 -1
- package/dist/directive/close-loop-stage.js +0 -210
- package/dist/directive/close-loop-stage.js.map +0 -1
- package/dist/focus-stage-lifecycle/review-convergence.d.ts +0 -133
- package/dist/focus-stage-lifecycle/review-convergence.d.ts.map +0 -1
- package/dist/focus-stage-lifecycle/review-convergence.js +0 -237
- package/dist/focus-stage-lifecycle/review-convergence.js.map +0 -1
|
@@ -43,16 +43,59 @@
|
|
|
43
43
|
import { configForProduct } from '../shell/config.js';
|
|
44
44
|
import { decideCiSensorAction, createGitNativeCiStatusReader } from './ci-status.js';
|
|
45
45
|
import { listCiStatusRefs, resolveRemoteIntegrationTip } from './ci-status-git.js';
|
|
46
|
-
import { createEscalation, markEscalationResolved } from '../queries/
|
|
47
|
-
import { getDeliveryContext
|
|
46
|
+
import { createEscalation, markEscalationResolved } from '../queries/escalations.js';
|
|
47
|
+
import { getDeliveryContext } from '../queries/deliveries.js';
|
|
48
|
+
import { getActiveFocuses } from '../queries/focus-discovery.js';
|
|
48
49
|
import { readDeliveryTrailer, resolveRecordedMergeRange, listRangeCommits } from '../resolvers/shared/git-diff.js';
|
|
49
50
|
import { callApi } from '../queries/shared.js';
|
|
50
51
|
import { ciRunRedCauseKey } from '../queries/cause-key.js';
|
|
51
|
-
import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS } from '@telora/daemon-core';
|
|
52
|
+
import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS, healthEvents } from '@telora/daemon-core';
|
|
52
53
|
import { createLogger } from '../shell/log.js';
|
|
53
54
|
const log = createLogger({ module: 'ci-sensor' });
|
|
55
|
+
/** Health-event code for a red integration run that has no team to route to. */
|
|
56
|
+
export const MERGE_HELD_NO_RECEIVER_CODE = 'merge.held_no_receiver';
|
|
57
|
+
/**
|
|
58
|
+
* Keys (`${productId}:${sha}`) already surfaced as a held-merge-gate health
|
|
59
|
+
* event, so the sensor emits once per red episode instead of every tick. Cleared
|
|
60
|
+
* per product when integration goes green (the gate is no longer held), so a
|
|
61
|
+
* later red re-surfaces. Module-level so it persists across ticks; reset in tests.
|
|
62
|
+
*/
|
|
63
|
+
const surfacedHeldGates = new Set();
|
|
64
|
+
/** Test-only: clear the held-gate dedup state. */
|
|
65
|
+
export function __resetCiSensorHealthStateForTests() {
|
|
66
|
+
surfacedHeldGates.clear();
|
|
67
|
+
}
|
|
54
68
|
/** escalation_kind for a red CI run on integration. */
|
|
55
69
|
export const CI_RUN_RED_ESCALATION_KIND = 'ci_run_red';
|
|
70
|
+
/**
|
|
71
|
+
* The working posture a ci_run_red filing sets ("CI green is priority one until
|
|
72
|
+
* the red clears") and the condition under which that posture ENDS. Recorded as
|
|
73
|
+
* structured metadata on the filing so a team INHERITING the escalation can tell,
|
|
74
|
+
* from the escalation itself and not only its prose, whether the obligation still
|
|
75
|
+
* binds. The exit is the escalation's own resolution: when a later integration
|
|
76
|
+
* run goes green, defaultResolveCiRedEscalations marks the row resolved -- the
|
|
77
|
+
* SAME event that ends the posture. A machine-written obligation with no exit is
|
|
78
|
+
* the defect this carries the fix for (cf. "Every daemon-written state has an
|
|
79
|
+
* exit or names a human act").
|
|
80
|
+
*/
|
|
81
|
+
export const CI_RUN_RED_POSTURE = 'ci_green_priority';
|
|
82
|
+
export const CI_RUN_RED_POSTURE_TERMINATES = 'escalation_resolved';
|
|
83
|
+
/**
|
|
84
|
+
* Structured metadata for a ci_run_red filing: the cause-key routing fields PLUS
|
|
85
|
+
* the posture it sets and that posture's termination condition. Pure and
|
|
86
|
+
* exported so the metadata contract is unit-testable without mocking createEscalation.
|
|
87
|
+
*/
|
|
88
|
+
export function ciRunRedEscalationMetadata(params) {
|
|
89
|
+
return {
|
|
90
|
+
sha: params.sha,
|
|
91
|
+
branch: params.branch,
|
|
92
|
+
product_id: params.productId,
|
|
93
|
+
focus_id: params.focusId,
|
|
94
|
+
cause_key: ciRunRedCauseKey(params.branch),
|
|
95
|
+
posture: CI_RUN_RED_POSTURE,
|
|
96
|
+
terminates_when: CI_RUN_RED_POSTURE_TERMINATES,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
56
99
|
const OPEN_STATUSES = new Set(['pending', 'in_review']);
|
|
57
100
|
/** Statuses whose cause_key suppresses a re-file: open (idempotency) + dismissed (memory). */
|
|
58
101
|
const SUPPRESSING_STATUSES = new Set(['pending', 'in_review', 'dismissed']);
|
|
@@ -148,13 +191,9 @@ async function defaultFileCiRedEscalation(params) {
|
|
|
148
191
|
`it to an operator.`,
|
|
149
192
|
// cause_key (branch) collapses successive red tips onto one open filing and
|
|
150
193
|
// keeps the branch silent while it is already signalled; a green resolves it.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
product_id: params.productId,
|
|
155
|
-
focus_id: params.focusId,
|
|
156
|
-
cause_key: ciRunRedCauseKey(params.branch),
|
|
157
|
-
},
|
|
194
|
+
// The posture + terminates_when keys make the obligation's exit legible from
|
|
195
|
+
// the escalation itself (see ciRunRedEscalationMetadata).
|
|
196
|
+
metadata: ciRunRedEscalationMetadata(params),
|
|
158
197
|
});
|
|
159
198
|
}
|
|
160
199
|
const defaultOwningFocusResolverDeps = {
|
|
@@ -224,7 +263,7 @@ const defaultDeps = {
|
|
|
224
263
|
* failure on one product never aborts the others.
|
|
225
264
|
*/
|
|
226
265
|
export async function runCiSensorTick(config, deps = defaultDeps) {
|
|
227
|
-
const counts = { productsChecked: 0, escalationsFiled: 0, escalationsResolved: 0 };
|
|
266
|
+
const counts = { productsChecked: 0, escalationsFiled: 0, escalationsResolved: 0, heldGatesSurfaced: 0 };
|
|
228
267
|
for (const product of config.products) {
|
|
229
268
|
const pc = configForProduct(config, product);
|
|
230
269
|
try {
|
|
@@ -244,7 +283,27 @@ export async function runCiSensorTick(config, deps = defaultDeps) {
|
|
|
244
283
|
// unanchored agent_resolvable would be invisible forever (never
|
|
245
284
|
// ridden, never promoted); a direct needs_operator is exactly the
|
|
246
285
|
// inbox line this focus removes.
|
|
247
|
-
|
|
286
|
+
//
|
|
287
|
+
// But the held gate must not be SILENT (TEL-6): surface it as durable
|
|
288
|
+
// operator-visible STATE (a health event, not an escalation -- there is
|
|
289
|
+
// no human-only act to file, and the hold clears itself when a focus is
|
|
290
|
+
// armed or the run goes green). Emitted once per red episode; cleared
|
|
291
|
+
// when integration goes green below. This gives the held merge gate a
|
|
292
|
+
// receiver even with no focus to anchor an escalation to.
|
|
293
|
+
const heldKey = `${pc.productId}:${sha}`;
|
|
294
|
+
if (!surfacedHeldGates.has(heldKey)) {
|
|
295
|
+
surfacedHeldGates.add(heldKey);
|
|
296
|
+
counts.heldGatesSurfaced++;
|
|
297
|
+
healthEvents.emit({
|
|
298
|
+
severity: 'error',
|
|
299
|
+
source: `ci:${pc.productId}`,
|
|
300
|
+
code: MERGE_HELD_NO_RECEIVER_CODE,
|
|
301
|
+
message: `Integration '${pc.integrationBranch}' is RED at ${sha.slice(0, 12)} and the ` +
|
|
302
|
+
'merge gate is holding main out, but no armed focus owns the fix -- there is no ' +
|
|
303
|
+
'team to route it to. Arm a focus on this product (or push a green fix) to clear the hold.',
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
log.warn(`CI red on ${pc.integrationBranch} @ ${sha.slice(0, 12)} but no armed focus to route the fix to; holding (merge gate still fail-closed, surfaced as ${MERGE_HELD_NO_RECEIVER_CODE}), will retry.`);
|
|
248
307
|
continue;
|
|
249
308
|
}
|
|
250
309
|
await deps.fileCiRedEscalation({ organizationId: pc.organizationId, productId: pc.productId, focusId, sha, branch: pc.integrationBranch });
|
|
@@ -255,6 +314,20 @@ export async function runCiSensorTick(config, deps = defaultDeps) {
|
|
|
255
314
|
counts.escalationsResolved += await deps.resolveCiRedEscalations(pc.productId);
|
|
256
315
|
log.info(`integration green for product ${pc.productId} -- resolved open ci_run_red escalation(s).`);
|
|
257
316
|
}
|
|
317
|
+
// Integration green (any action -- 'resolve' OR 'none'): the held merge
|
|
318
|
+
// gate is no longer held, so clear any held-gate health state for this
|
|
319
|
+
// product and pair its resolution (TEL-6). A future red re-surfaces cleanly.
|
|
320
|
+
if (status === 'green') {
|
|
321
|
+
let clearedAny = false;
|
|
322
|
+
for (const key of surfacedHeldGates) {
|
|
323
|
+
if (key.startsWith(`${pc.productId}:`)) {
|
|
324
|
+
surfacedHeldGates.delete(key);
|
|
325
|
+
clearedAny = true;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
if (clearedAny)
|
|
329
|
+
healthEvents.resolveByCode(MERGE_HELD_NO_RECEIVER_CODE);
|
|
330
|
+
}
|
|
258
331
|
}
|
|
259
332
|
catch (err) {
|
|
260
333
|
log.warn(`tick failed for product ${product.id}: ${err.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-sensor-loop.js","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAuB,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ci-sensor-loop.js","sourceRoot":"","sources":["../../src/ci/ci-sensor-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connect-flow config + daemon-start writers.
|
|
3
|
+
*
|
|
4
|
+
* The daemon.json / starter-prompt / .gitignore writers and the on-disk
|
|
5
|
+
* daemon-binary resolution + detached start, plus Codex CLI path resolution.
|
|
6
|
+
* Split out of cli/connect.ts (file-size limit) into the connect/* family;
|
|
7
|
+
* connect.ts re-exports these so existing importers keep resolving them from
|
|
8
|
+
* cli/connect.js. Leaf module: connect.ts -> connect/config-write.ts, never back.
|
|
9
|
+
*/
|
|
10
|
+
import type { ConnectIO } from './shared.js';
|
|
11
|
+
/**
|
|
12
|
+
* Resolve Codex to a stable on-disk executable for daemon config.
|
|
13
|
+
*
|
|
14
|
+
* The daemon runs detached and may not inherit the operator's login-shell PATH.
|
|
15
|
+
* Persisting an absolute path during `connect --harness codex` keeps future
|
|
16
|
+
* agent spawns independent of shell startup files.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveCodexCliPath(repoPath: string): string | null;
|
|
19
|
+
/**
|
|
20
|
+
* Write the daemon config to ~/.telora/daemon.json.
|
|
21
|
+
*
|
|
22
|
+
* Connect-flow config is single-product. If a config already exists,
|
|
23
|
+
* we overwrite it and print a warning -- re-running connect is the
|
|
24
|
+
* supported recovery path.
|
|
25
|
+
*
|
|
26
|
+
* The `trackerId` is persisted in this file (mode 0600 in $HOME) so the
|
|
27
|
+
* background daemon can read it on startup without an env var. This matches
|
|
28
|
+
* the security profile of `.mcp.json`, which already stores the same secret.
|
|
29
|
+
*/
|
|
30
|
+
export declare function writeConnectDaemonConfig(params: {
|
|
31
|
+
teloraUrl: string;
|
|
32
|
+
trackerId: string;
|
|
33
|
+
organizationId: string;
|
|
34
|
+
productId: string;
|
|
35
|
+
repoPath: string;
|
|
36
|
+
io: ConnectIO;
|
|
37
|
+
/** Absolute path of the per-product isolated CODEX_HOME (local-model flow). */
|
|
38
|
+
codexHome?: string;
|
|
39
|
+
/** Default coding engine for the product (local-model flow). */
|
|
40
|
+
defaultCodingEngine?: string;
|
|
41
|
+
/** Model id the local-model server exposes (local-model flow). */
|
|
42
|
+
codexModel?: string;
|
|
43
|
+
/** Absolute path to the Codex CLI for detached daemon spawns. */
|
|
44
|
+
codexPath?: string;
|
|
45
|
+
}): string;
|
|
46
|
+
/**
|
|
47
|
+
* Write the AHA starter prompt + first-session marker into the repo's
|
|
48
|
+
* `.telora/` directory. The bash bootstrap reads `starter-prompt.md` and
|
|
49
|
+
* passes it to `claude` as the first user message.
|
|
50
|
+
*
|
|
51
|
+
* Returns the absolute path of the prompt file (or null on failure -- the
|
|
52
|
+
* caller treats prompt injection as best-effort and falls back to plain
|
|
53
|
+
* `claude` if this artifact is missing).
|
|
54
|
+
*/
|
|
55
|
+
export declare function writeStarterPromptArtifacts(repoPath: string, io: ConnectIO): string | null;
|
|
56
|
+
/**
|
|
57
|
+
* Append `.telora/` and `.mcp.json` to .gitignore in the repo root if missing.
|
|
58
|
+
*
|
|
59
|
+
* `.mcp.json` is per-user-machine (absolute path to the daemon's bundled
|
|
60
|
+
* MCP). It's regenerated by `connect` and refreshed by the daemon on every
|
|
61
|
+
* startup, so collaborators don't need to share it.
|
|
62
|
+
*/
|
|
63
|
+
export declare function ensureGitignoreEntries(repoPath: string, io: ConnectIO, extra?: readonly string[]): void;
|
|
64
|
+
/**
|
|
65
|
+
* Start the daemon as a detached background process from a stable on-disk
|
|
66
|
+
* install -- never from an ephemeral npx cache (which cannot self-update).
|
|
67
|
+
*
|
|
68
|
+
* Resolution order:
|
|
69
|
+
* 1. Use an existing on-disk binary (global install on PATH, or a repo-local
|
|
70
|
+
* `node_modules/.bin/telora-daemon` dev dependency).
|
|
71
|
+
* 2. If none exists, run `npm install -g @telora/daemon` best-effort. Global
|
|
72
|
+
* install keeps the connect flow language-agnostic -- it leaves no
|
|
73
|
+
* `package.json`/`node_modules`/dev-dependency footprint in the user's
|
|
74
|
+
* repo (Rust/Python/Go/empty repos stay untouched).
|
|
75
|
+
* 3. Spawn the resolved on-disk `telora-daemon run`.
|
|
76
|
+
*
|
|
77
|
+
* On install failure this throws (the caller surfaces the manual
|
|
78
|
+
* `npm install -g @telora/daemon` instruction and skips auto-start); it does
|
|
79
|
+
* NOT fall back to npx, because an npx-run daemon is exactly what this focus
|
|
80
|
+
* retires.
|
|
81
|
+
*
|
|
82
|
+
* Bin name is explicit (`telora-daemon`) because the package's bins are
|
|
83
|
+
* `telora-daemon` and `telora-daemon-wrapper`; neither matches the unscoped
|
|
84
|
+
* package name `daemon`.
|
|
85
|
+
*/
|
|
86
|
+
export declare function startDaemonOnDisk(repoPath: string): number;
|
|
87
|
+
//# sourceMappingURL=config-write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-write.d.ts","sourceRoot":"","sources":["../../../src/cli/connect/config-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmC7C;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,SAAS,CAAC;IACd,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CA4CT;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,SAAS,GACZ,MAAM,GAAG,IAAI,CAsBf;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,SAAS,EACb,KAAK,GAAE,SAAS,MAAM,EAAO,GAC5B,IAAI,CAiBN;AAkCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA+B1D"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connect-flow config + daemon-start writers.
|
|
3
|
+
*
|
|
4
|
+
* The daemon.json / starter-prompt / .gitignore writers and the on-disk
|
|
5
|
+
* daemon-binary resolution + detached start, plus Codex CLI path resolution.
|
|
6
|
+
* Split out of cli/connect.ts (file-size limit) into the connect/* family;
|
|
7
|
+
* connect.ts re-exports these so existing importers keep resolving them from
|
|
8
|
+
* cli/connect.js. Leaf module: connect.ts -> connect/config-write.ts, never back.
|
|
9
|
+
*/
|
|
10
|
+
import { closeSync, existsSync, mkdirSync, openSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { spawn, execFileSync } from 'node:child_process';
|
|
12
|
+
import { resolve, delimiter } from 'node:path';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { STARTER_PROMPT } from '../../prompts/starter-prompt.js';
|
|
15
|
+
import { convergeGitignore } from '../../shell/gitignore-convergence.js';
|
|
16
|
+
import { ensureGlobalStateDir, resolveDaemonLogPath } from '../../shell/daemon-process.js';
|
|
17
|
+
import { cliLog as log } from '../../shell/log.js';
|
|
18
|
+
function executableExists(path) {
|
|
19
|
+
return existsSync(path);
|
|
20
|
+
}
|
|
21
|
+
function resolveCommandOnPath(command) {
|
|
22
|
+
const pathEnv = process.env.PATH ?? '';
|
|
23
|
+
for (const dir of pathEnv.split(delimiter).filter(Boolean)) {
|
|
24
|
+
const candidate = resolve(dir, command);
|
|
25
|
+
if (executableExists(candidate))
|
|
26
|
+
return candidate;
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
function npmGlobalBinDir() {
|
|
31
|
+
if (process.env.NPM_CONFIG_PREFIX) {
|
|
32
|
+
return resolve(process.env.NPM_CONFIG_PREFIX, 'bin');
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const prefix = execFileSync('npm', ['prefix', '-g'], {
|
|
36
|
+
encoding: 'utf-8',
|
|
37
|
+
timeout: 5_000,
|
|
38
|
+
}).trim();
|
|
39
|
+
return prefix ? resolve(prefix, 'bin') : null;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve Codex to a stable on-disk executable for daemon config.
|
|
47
|
+
*
|
|
48
|
+
* The daemon runs detached and may not inherit the operator's login-shell PATH.
|
|
49
|
+
* Persisting an absolute path during `connect --harness codex` keeps future
|
|
50
|
+
* agent spawns independent of shell startup files.
|
|
51
|
+
*/
|
|
52
|
+
export function resolveCodexCliPath(repoPath) {
|
|
53
|
+
const onPath = resolveCommandOnPath('codex');
|
|
54
|
+
if (onPath)
|
|
55
|
+
return onPath;
|
|
56
|
+
const npmBinDir = npmGlobalBinDir();
|
|
57
|
+
const candidates = [
|
|
58
|
+
npmBinDir ? resolve(npmBinDir, 'codex') : null,
|
|
59
|
+
resolve(homedir(), '.npm-global', 'bin', 'codex'),
|
|
60
|
+
resolve(homedir(), '.local', 'bin', 'codex'),
|
|
61
|
+
resolve(repoPath, 'node_modules', '.bin', 'codex'),
|
|
62
|
+
];
|
|
63
|
+
for (const candidate of candidates) {
|
|
64
|
+
if (candidate && executableExists(candidate))
|
|
65
|
+
return candidate;
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Write the daemon config to ~/.telora/daemon.json.
|
|
71
|
+
*
|
|
72
|
+
* Connect-flow config is single-product. If a config already exists,
|
|
73
|
+
* we overwrite it and print a warning -- re-running connect is the
|
|
74
|
+
* supported recovery path.
|
|
75
|
+
*
|
|
76
|
+
* The `trackerId` is persisted in this file (mode 0600 in $HOME) so the
|
|
77
|
+
* background daemon can read it on startup without an env var. This matches
|
|
78
|
+
* the security profile of `.mcp.json`, which already stores the same secret.
|
|
79
|
+
*/
|
|
80
|
+
export function writeConnectDaemonConfig(params) {
|
|
81
|
+
const teloraDir = resolve(homedir(), '.telora');
|
|
82
|
+
if (!existsSync(teloraDir)) {
|
|
83
|
+
mkdirSync(teloraDir, { recursive: true, mode: 0o700 });
|
|
84
|
+
}
|
|
85
|
+
const configPath = resolve(teloraDir, 'daemon.json');
|
|
86
|
+
const alreadyExists = existsSync(configPath);
|
|
87
|
+
const config = {
|
|
88
|
+
teloraUrl: params.teloraUrl,
|
|
89
|
+
trackerId: params.trackerId,
|
|
90
|
+
organizationId: params.organizationId,
|
|
91
|
+
...(params.codexPath ? { codexPath: params.codexPath } : {}),
|
|
92
|
+
products: [
|
|
93
|
+
{
|
|
94
|
+
id: params.productId,
|
|
95
|
+
repoPath: resolve(params.repoPath),
|
|
96
|
+
...(params.codexHome ? { codexHome: params.codexHome } : {}),
|
|
97
|
+
...(params.defaultCodingEngine
|
|
98
|
+
? { defaultCodingEngine: params.defaultCodingEngine }
|
|
99
|
+
: {}),
|
|
100
|
+
...(params.codexModel ? { codexModel: params.codexModel } : {}),
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
engines: {
|
|
104
|
+
focus: {
|
|
105
|
+
enabled: true,
|
|
106
|
+
integrationBranch: 'integration',
|
|
107
|
+
maxTotalSessions: 5,
|
|
108
|
+
},
|
|
109
|
+
// The factory engine is retired. Newly generated configs carry only the
|
|
110
|
+
// focus engine; a legacy `engines.factory` block in an existing config is
|
|
111
|
+
// still tolerated (ignored, force-disabled) on load by unified-shell.
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', { mode: 0o600 });
|
|
115
|
+
if (alreadyExists) {
|
|
116
|
+
params.io.err(`Note: replaced existing ${configPath}.\n`);
|
|
117
|
+
}
|
|
118
|
+
return configPath;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Write the AHA starter prompt + first-session marker into the repo's
|
|
122
|
+
* `.telora/` directory. The bash bootstrap reads `starter-prompt.md` and
|
|
123
|
+
* passes it to `claude` as the first user message.
|
|
124
|
+
*
|
|
125
|
+
* Returns the absolute path of the prompt file (or null on failure -- the
|
|
126
|
+
* caller treats prompt injection as best-effort and falls back to plain
|
|
127
|
+
* `claude` if this artifact is missing).
|
|
128
|
+
*/
|
|
129
|
+
export function writeStarterPromptArtifacts(repoPath, io) {
|
|
130
|
+
const teloraDir = resolve(repoPath, '.telora');
|
|
131
|
+
try {
|
|
132
|
+
if (!existsSync(teloraDir)) {
|
|
133
|
+
mkdirSync(teloraDir, { recursive: true });
|
|
134
|
+
}
|
|
135
|
+
const promptPath = resolve(teloraDir, 'starter-prompt.md');
|
|
136
|
+
writeFileSync(promptPath, STARTER_PROMPT);
|
|
137
|
+
// First-session marker: presence indicates the AHA prompt has not yet
|
|
138
|
+
// been consumed. Future logic (subsequent sessions, idempotent re-runs)
|
|
139
|
+
// can read or delete it. This delivery only writes it.
|
|
140
|
+
writeFileSync(resolve(teloraDir, '.first-session'), '');
|
|
141
|
+
io.out(`Wrote ${promptPath}.\n`);
|
|
142
|
+
return promptPath;
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
io.err(`Warning: could not write starter prompt: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Append `.telora/` and `.mcp.json` to .gitignore in the repo root if missing.
|
|
151
|
+
*
|
|
152
|
+
* `.mcp.json` is per-user-machine (absolute path to the daemon's bundled
|
|
153
|
+
* MCP). It's regenerated by `connect` and refreshed by the daemon on every
|
|
154
|
+
* startup, so collaborators don't need to share it.
|
|
155
|
+
*/
|
|
156
|
+
export function ensureGitignoreEntries(repoPath, io, extra = []) {
|
|
157
|
+
const entries = ['.telora/', '.mcp.json', ...extra];
|
|
158
|
+
const result = convergeGitignore(repoPath, entries);
|
|
159
|
+
if (result.created) {
|
|
160
|
+
io.out(`Created ${result.gitignorePath}.\n`);
|
|
161
|
+
}
|
|
162
|
+
else if (result.added.length > 0) {
|
|
163
|
+
io.out(`Updated ${result.gitignorePath}: added ${result.added.join(', ')}.\n`);
|
|
164
|
+
}
|
|
165
|
+
if (result.alreadyTracked.length > 0) {
|
|
166
|
+
io.err(`Warning: ${result.alreadyTracked.join(', ')} already tracked by git in ` +
|
|
167
|
+
`${repoPath}; the .gitignore entry is a no-op over tracked content. ` +
|
|
168
|
+
`Run 'git rm -r --cached ${result.alreadyTracked.join(' ')}' to stop tracking.\n`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Resolve an existing on-disk `telora-daemon` binary.
|
|
173
|
+
*
|
|
174
|
+
* Checks, in order:
|
|
175
|
+
* 1. A global install on PATH (`which telora-daemon`) -- the canonical
|
|
176
|
+
* long-running install.
|
|
177
|
+
* 2. A repo-local `node_modules/.bin/telora-daemon` dev dependency.
|
|
178
|
+
*
|
|
179
|
+
* Returns the absolute path to the binary, or null when none is on disk.
|
|
180
|
+
* Deliberately does NOT resolve an npx-cache binary: a daemon launched from
|
|
181
|
+
* `~/.npm/_npx/<hash>/` cannot self-update (the running process keeps loading
|
|
182
|
+
* from the cache while `npm install -g` writes the global prefix), so the
|
|
183
|
+
* long-running daemon must run from a stable on-disk install.
|
|
184
|
+
*/
|
|
185
|
+
function resolveOnDiskDaemonBinary(repoPath) {
|
|
186
|
+
try {
|
|
187
|
+
const resolved = execFileSync('which', ['telora-daemon'], {
|
|
188
|
+
encoding: 'utf-8',
|
|
189
|
+
timeout: 5_000,
|
|
190
|
+
}).trim();
|
|
191
|
+
if (resolved && existsSync(resolved))
|
|
192
|
+
return resolved;
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
// Not on PATH -- fall through to the repo-local dev dependency.
|
|
196
|
+
log.debug('Not on PATH -- fall through to the repo-local dev dependency', { error: String(err?.message ?? err) });
|
|
197
|
+
}
|
|
198
|
+
const localBin = resolve(repoPath, 'node_modules', '.bin', 'telora-daemon');
|
|
199
|
+
if (existsSync(localBin))
|
|
200
|
+
return localBin;
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Start the daemon as a detached background process from a stable on-disk
|
|
205
|
+
* install -- never from an ephemeral npx cache (which cannot self-update).
|
|
206
|
+
*
|
|
207
|
+
* Resolution order:
|
|
208
|
+
* 1. Use an existing on-disk binary (global install on PATH, or a repo-local
|
|
209
|
+
* `node_modules/.bin/telora-daemon` dev dependency).
|
|
210
|
+
* 2. If none exists, run `npm install -g @telora/daemon` best-effort. Global
|
|
211
|
+
* install keeps the connect flow language-agnostic -- it leaves no
|
|
212
|
+
* `package.json`/`node_modules`/dev-dependency footprint in the user's
|
|
213
|
+
* repo (Rust/Python/Go/empty repos stay untouched).
|
|
214
|
+
* 3. Spawn the resolved on-disk `telora-daemon run`.
|
|
215
|
+
*
|
|
216
|
+
* On install failure this throws (the caller surfaces the manual
|
|
217
|
+
* `npm install -g @telora/daemon` instruction and skips auto-start); it does
|
|
218
|
+
* NOT fall back to npx, because an npx-run daemon is exactly what this focus
|
|
219
|
+
* retires.
|
|
220
|
+
*
|
|
221
|
+
* Bin name is explicit (`telora-daemon`) because the package's bins are
|
|
222
|
+
* `telora-daemon` and `telora-daemon-wrapper`; neither matches the unscoped
|
|
223
|
+
* package name `daemon`.
|
|
224
|
+
*/
|
|
225
|
+
export function startDaemonOnDisk(repoPath) {
|
|
226
|
+
let binary = resolveOnDiskDaemonBinary(repoPath);
|
|
227
|
+
if (!binary) {
|
|
228
|
+
// No on-disk install -- install globally (no repo footprint), best-effort.
|
|
229
|
+
execFileSync('npm', ['install', '-g', '@telora/daemon'], {
|
|
230
|
+
stdio: 'inherit',
|
|
231
|
+
timeout: 120_000,
|
|
232
|
+
});
|
|
233
|
+
binary = resolveOnDiskDaemonBinary(repoPath);
|
|
234
|
+
if (!binary) {
|
|
235
|
+
throw new Error('telora-daemon is not on disk after `npm install -g @telora/daemon`.');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
ensureGlobalStateDir();
|
|
239
|
+
const logPath = resolveDaemonLogPath();
|
|
240
|
+
const logFd = openSync(logPath, 'a', 0o600);
|
|
241
|
+
try {
|
|
242
|
+
const child = spawn(binary, ['run'], {
|
|
243
|
+
detached: true,
|
|
244
|
+
stdio: ['ignore', logFd, logFd],
|
|
245
|
+
cwd: repoPath,
|
|
246
|
+
env: { ...process.env },
|
|
247
|
+
});
|
|
248
|
+
child.unref();
|
|
249
|
+
return child.pid ?? 0;
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
closeSync(logFd);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=config-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-write.js","sourceRoot":"","sources":["../../../src/cli/connect/config-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connected-workstation identity + AI-tracking registration.
|
|
3
|
+
*
|
|
4
|
+
* Reads the connected identity from ~/.telora/daemon.json, locates the
|
|
5
|
+
* telora-ai CLI, pre-populates its config, and merges the tracking hooks into
|
|
6
|
+
* ~/.claude/settings.json. Split out of cli/connect.ts (file-size limit) into
|
|
7
|
+
* the connect/* family; connect.ts re-exports these so existing importers keep
|
|
8
|
+
* resolving them from cli/connect.js. Leaf module: connect.ts -> connect/registration.ts.
|
|
9
|
+
*/
|
|
10
|
+
import type { ConnectIO } from './shared.js';
|
|
11
|
+
/**
|
|
12
|
+
* Look up an existing product entry in `~/.telora/daemon.json` whose
|
|
13
|
+
* repoPath matches the given path. Returns the product id when found,
|
|
14
|
+
* else null. Used by runConnect for re-run idempotency: a second run on
|
|
15
|
+
* the same dir reuses the existing binding instead of creating a duplicate
|
|
16
|
+
* product on the unbound path.
|
|
17
|
+
*/
|
|
18
|
+
export declare function findExistingProductForRepo(repoPath: string): string | null;
|
|
19
|
+
/**
|
|
20
|
+
* Workstation identity for an already-connected repo, resolved from the single
|
|
21
|
+
* source `~/.telora/daemon.json`. Returned by `readConnectedIdentity` and
|
|
22
|
+
* consumed by the token-free `harness add` verb -- which never re-redeems a
|
|
23
|
+
* connect token, it just reads what `connect` already persisted.
|
|
24
|
+
*/
|
|
25
|
+
export interface ConnectedIdentity {
|
|
26
|
+
teloraUrl: string;
|
|
27
|
+
organizationId: string;
|
|
28
|
+
productId: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the connected-workstation identity for `repoPath` from
|
|
32
|
+
* `~/.telora/daemon.json`: the top-level `teloraUrl` / `organizationId` plus the
|
|
33
|
+
* `products[]` entry whose `repoPath` matches. Returns null when there is no
|
|
34
|
+
* config, the config lacks url/org, or no product entry binds this repo -- i.e.
|
|
35
|
+
* the repo is not connected, so `harness add` must direct the operator to
|
|
36
|
+
* `connect` first.
|
|
37
|
+
*/
|
|
38
|
+
export declare function readConnectedIdentity(repoPath: string): ConnectedIdentity | null;
|
|
39
|
+
/**
|
|
40
|
+
* Locate the `telora-ai` Python CLI on PATH. Returns the absolute path if
|
|
41
|
+
* found, else null. Detection is the entire install model -- if the user
|
|
42
|
+
* doesn't have it, connect prints a remediation hint and continues
|
|
43
|
+
* (tracking is opt-in).
|
|
44
|
+
*/
|
|
45
|
+
export declare function locateTeloraAi(): string | null;
|
|
46
|
+
/**
|
|
47
|
+
* Pre-populate the user's `~/.syntelyos/ai_tracking.db` config table with
|
|
48
|
+
* the redeem-derived credentials. Skips the
|
|
49
|
+
* `telora-ai register <code>` round-trip that Settings > AI Trackers
|
|
50
|
+
* normally requires -- the tracker row already exists in Telora (the
|
|
51
|
+
* redeem RPC inserted it), so all we need is to point the local DB at
|
|
52
|
+
* it.
|
|
53
|
+
*
|
|
54
|
+
* Each `telora-ai config <key> <value>` call is a single sqlite UPSERT;
|
|
55
|
+
* idempotent on re-runs.
|
|
56
|
+
*
|
|
57
|
+
* Returns true on success, false if any sub-call failed (the failure is
|
|
58
|
+
* surfaced via io.err but never aborts the connect flow).
|
|
59
|
+
*/
|
|
60
|
+
export declare function registerWorkstationLocally(params: {
|
|
61
|
+
teloraAiPath: string;
|
|
62
|
+
trackerId: string;
|
|
63
|
+
organizationId: string;
|
|
64
|
+
teloraUrl: string;
|
|
65
|
+
io: ConnectIO;
|
|
66
|
+
}): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Idempotent merge of `PostToolUse` and `UserPromptSubmit` hook entries
|
|
69
|
+
* into `~/.claude/settings.json`. Mirrors the shape of `telora-ai
|
|
70
|
+
* setup-hooks` in scripts/telora-ai but runs from the daemon connect flow
|
|
71
|
+
* so the user doesn't have to invoke it manually.
|
|
72
|
+
*
|
|
73
|
+
* Existing hook entries are preserved. Re-runs do not duplicate.
|
|
74
|
+
*/
|
|
75
|
+
export declare function mergeUserClaudeSettingsHooks(io: ConnectIO, homeOverride?: string): boolean;
|
|
76
|
+
//# sourceMappingURL=registration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../src/cli/connect/registration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB1E;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAyBhF;AAID;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAQ9C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,SAAS,CAAC;CACf,GAAG,OAAO,CA0BV;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,SAAS,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAwET"}
|