@telora/daemon 0.19.47 → 0.19.74

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.
Files changed (529) hide show
  1. package/build-info.json +6 -3
  2. package/dist/assembly-engine.d.ts +9 -0
  3. package/dist/assembly-engine.d.ts.map +1 -1
  4. package/dist/assembly-engine.js.map +1 -1
  5. package/dist/audit-hooks.js +1 -1
  6. package/dist/branch-status.js +2 -2
  7. package/dist/branch-status.js.map +1 -1
  8. package/dist/ci-sensor-loop.d.ts +47 -0
  9. package/dist/ci-sensor-loop.d.ts.map +1 -0
  10. package/dist/ci-sensor-loop.js +116 -0
  11. package/dist/ci-sensor-loop.js.map +1 -0
  12. package/dist/ci-status-git.d.ts +52 -0
  13. package/dist/ci-status-git.d.ts.map +1 -0
  14. package/dist/ci-status-git.js +86 -0
  15. package/dist/ci-status-git.js.map +1 -0
  16. package/dist/ci-status.d.ts +122 -0
  17. package/dist/ci-status.d.ts.map +1 -0
  18. package/dist/ci-status.js +114 -0
  19. package/dist/ci-status.js.map +1 -0
  20. package/dist/cli/connect/agents.d.ts +24 -0
  21. package/dist/cli/connect/agents.d.ts.map +1 -0
  22. package/dist/cli/connect/agents.js +65 -0
  23. package/dist/cli/connect/agents.js.map +1 -0
  24. package/dist/cli/connect/claude.d.ts +31 -0
  25. package/dist/cli/connect/claude.d.ts.map +1 -0
  26. package/dist/cli/connect/claude.js +104 -0
  27. package/dist/cli/connect/claude.js.map +1 -0
  28. package/dist/cli/connect/cline.d.ts +37 -0
  29. package/dist/cli/connect/cline.d.ts.map +1 -0
  30. package/dist/cli/connect/cline.js +115 -0
  31. package/dist/cli/connect/cline.js.map +1 -0
  32. package/dist/cli/connect/codex.d.ts +44 -0
  33. package/dist/cli/connect/codex.d.ts.map +1 -0
  34. package/dist/cli/connect/codex.js +111 -0
  35. package/dist/cli/connect/codex.js.map +1 -0
  36. package/dist/cli/connect/ide.d.ts +69 -0
  37. package/dist/cli/connect/ide.d.ts.map +1 -0
  38. package/dist/cli/connect/ide.js +134 -0
  39. package/dist/cli/connect/ide.js.map +1 -0
  40. package/dist/cli/connect/scaffolding.d.ts +31 -0
  41. package/dist/cli/connect/scaffolding.d.ts.map +1 -0
  42. package/dist/cli/connect/scaffolding.js +52 -0
  43. package/dist/cli/connect/scaffolding.js.map +1 -0
  44. package/dist/cli/connect/shared.d.ts +30 -0
  45. package/dist/cli/connect/shared.d.ts.map +1 -0
  46. package/dist/cli/connect/shared.js +11 -0
  47. package/dist/cli/connect/shared.js.map +1 -0
  48. package/dist/cli/connect.d.ts +9 -210
  49. package/dist/cli/connect.d.ts.map +1 -1
  50. package/dist/cli/connect.js +10 -526
  51. package/dist/cli/connect.js.map +1 -1
  52. package/dist/cli/open.js +2 -2
  53. package/dist/completion/event.d.ts +2 -0
  54. package/dist/completion/event.d.ts.map +1 -1
  55. package/dist/completion/event.js +19 -2
  56. package/dist/completion/event.js.map +1 -1
  57. package/dist/completion/merge-phase.d.ts +3 -0
  58. package/dist/completion/merge-phase.d.ts.map +1 -1
  59. package/dist/completion/merge-phase.js +35 -3
  60. package/dist/completion/merge-phase.js.map +1 -1
  61. package/dist/completion/read-only-pristine.d.ts +1 -1
  62. package/dist/completion/read-only-pristine.d.ts.map +1 -1
  63. package/dist/completion/read-only-pristine.js +1 -1
  64. package/dist/completion/read-only-pristine.js.map +1 -1
  65. package/dist/completion/review-exit-phase.d.ts +30 -3
  66. package/dist/completion/review-exit-phase.d.ts.map +1 -1
  67. package/dist/completion/review-exit-phase.js +203 -15
  68. package/dist/completion/review-exit-phase.js.map +1 -1
  69. package/dist/completion/status-advance-phase.js +1 -1
  70. package/dist/completion/status-advance-phase.js.map +1 -1
  71. package/dist/completion/team-completion.d.ts.map +1 -1
  72. package/dist/completion/team-completion.js +22 -2
  73. package/dist/completion/team-completion.js.map +1 -1
  74. package/dist/completion/team-lifecycle.js +1 -1
  75. package/dist/completion/terminated-work-reconcile.js +1 -1
  76. package/dist/completion/terminated-work-reconcile.js.map +1 -1
  77. package/dist/condition-evaluators.d.ts +41 -2
  78. package/dist/condition-evaluators.d.ts.map +1 -1
  79. package/dist/condition-evaluators.js +37 -288
  80. package/dist/condition-evaluators.js.map +1 -1
  81. package/dist/context-audit.d.ts +1 -1
  82. package/dist/context-audit.d.ts.map +1 -1
  83. package/dist/context-lock.d.ts +1 -1
  84. package/dist/context-lock.d.ts.map +1 -1
  85. package/dist/control-state.d.ts +2 -2
  86. package/dist/control-state.d.ts.map +1 -1
  87. package/dist/control-state.js +4 -3
  88. package/dist/control-state.js.map +1 -1
  89. package/dist/daemon-process.d.ts +1 -1
  90. package/dist/daemon-process.d.ts.map +1 -1
  91. package/dist/delivery-advance-block.d.ts +1 -1
  92. package/dist/delivery-advance-block.d.ts.map +1 -1
  93. package/dist/delivery-advance-block.js +1 -1
  94. package/dist/delivery-advance-block.js.map +1 -1
  95. package/dist/delivery-lifecycle.js +1 -1
  96. package/dist/delivery-reconciler-shadow.d.ts +1 -1
  97. package/dist/delivery-reconciler-shadow.d.ts.map +1 -1
  98. package/dist/delivery-reconciler-shadow.js +1 -1
  99. package/dist/delivery-reconciler-shadow.js.map +1 -1
  100. package/dist/directive-executor.js +1 -1
  101. package/dist/directive-executor.js.map +1 -1
  102. package/dist/drift-eval-loop.d.ts.map +1 -1
  103. package/dist/drift-eval-loop.js +6 -14
  104. package/dist/drift-eval-loop.js.map +1 -1
  105. package/dist/escalations.d.ts +1 -1
  106. package/dist/escalations.d.ts.map +1 -1
  107. package/dist/escalations.js +1 -1
  108. package/dist/escalations.js.map +1 -1
  109. package/dist/evaluation-context.d.ts +2 -33
  110. package/dist/evaluation-context.d.ts.map +1 -1
  111. package/dist/evaluation-context.js +2 -56
  112. package/dist/evaluation-context.js.map +1 -1
  113. package/dist/focus-engine.d.ts +14 -5
  114. package/dist/focus-engine.d.ts.map +1 -1
  115. package/dist/focus-engine.js +35 -289
  116. package/dist/focus-engine.js.map +1 -1
  117. package/dist/focus-executor.d.ts +10 -791
  118. package/dist/focus-executor.d.ts.map +1 -1
  119. package/dist/focus-executor.js +42 -1568
  120. package/dist/focus-executor.js.map +1 -1
  121. package/dist/focus-lifecycle.js +2 -2
  122. package/dist/focus-lifecycle.js.map +1 -1
  123. package/dist/focus-loop-registry.d.ts +52 -0
  124. package/dist/focus-loop-registry.d.ts.map +1 -0
  125. package/dist/focus-loop-registry.js +328 -0
  126. package/dist/focus-loop-registry.js.map +1 -0
  127. package/dist/focus-merge.d.ts +1 -1
  128. package/dist/focus-merge.d.ts.map +1 -1
  129. package/dist/focus-merge.js +3 -3
  130. package/dist/focus-merge.js.map +1 -1
  131. package/dist/focus-phase.d.ts +4 -0
  132. package/dist/focus-phase.d.ts.map +1 -1
  133. package/dist/focus-phase.js +3 -3
  134. package/dist/focus-phase.js.map +1 -1
  135. package/dist/focus-stage-lifecycle/planning-release.d.ts +197 -0
  136. package/dist/focus-stage-lifecycle/planning-release.d.ts.map +1 -0
  137. package/dist/focus-stage-lifecycle/planning-release.js +312 -0
  138. package/dist/focus-stage-lifecycle/planning-release.js.map +1 -0
  139. package/dist/focus-stage-lifecycle/review-convergence.d.ts +133 -0
  140. package/dist/focus-stage-lifecycle/review-convergence.d.ts.map +1 -0
  141. package/dist/focus-stage-lifecycle/review-convergence.js +235 -0
  142. package/dist/focus-stage-lifecycle/review-convergence.js.map +1 -0
  143. package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +133 -0
  144. package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -0
  145. package/dist/focus-stage-lifecycle/wedge-watchdog.js +365 -0
  146. package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -0
  147. package/dist/focus-stage-lifecycle.d.ts +22 -421
  148. package/dist/focus-stage-lifecycle.d.ts.map +1 -1
  149. package/dist/focus-stage-lifecycle.js +24 -832
  150. package/dist/focus-stage-lifecycle.js.map +1 -1
  151. package/dist/{git-activity.d.ts → git/activity.d.ts} +1 -1
  152. package/dist/git/activity.d.ts.map +1 -0
  153. package/dist/{git-activity.js → git/activity.js} +2 -2
  154. package/dist/git/activity.js.map +1 -0
  155. package/dist/{git-branch.d.ts → git/branch.d.ts} +2 -2
  156. package/dist/git/branch.d.ts.map +1 -0
  157. package/dist/{git-branch.js → git/branch.js} +2 -2
  158. package/dist/git/branch.js.map +1 -0
  159. package/dist/{git-fetch.d.ts → git/fetch.d.ts} +2 -2
  160. package/dist/git/fetch.d.ts.map +1 -0
  161. package/dist/{git-fetch.js → git/fetch.js} +1 -1
  162. package/dist/git/fetch.js.map +1 -0
  163. package/dist/{git-genesis.d.ts → git/genesis.d.ts} +3 -3
  164. package/dist/git/genesis.d.ts.map +1 -0
  165. package/dist/{git-genesis.js → git/genesis.js} +5 -5
  166. package/dist/git/genesis.js.map +1 -0
  167. package/dist/git/index.d.ts +36 -0
  168. package/dist/git/index.d.ts.map +1 -0
  169. package/dist/git/index.js +36 -0
  170. package/dist/git/index.js.map +1 -0
  171. package/dist/{git-integration.d.ts → git/integration.d.ts} +2 -2
  172. package/dist/git/integration.d.ts.map +1 -0
  173. package/dist/{git-integration.js → git/integration.js} +4 -4
  174. package/dist/git/integration.js.map +1 -0
  175. package/dist/{git-merge-helpers.d.ts → git/merge-helpers.d.ts} +3 -3
  176. package/dist/git/merge-helpers.d.ts.map +1 -0
  177. package/dist/{git-merge-helpers.js → git/merge-helpers.js} +3 -3
  178. package/dist/git/merge-helpers.js.map +1 -0
  179. package/dist/{git-merge-lock.d.ts → git/merge-lock.d.ts} +1 -1
  180. package/dist/git/merge-lock.d.ts.map +1 -0
  181. package/dist/{git-merge-lock.js → git/merge-lock.js} +1 -1
  182. package/dist/git/merge-lock.js.map +1 -0
  183. package/dist/{git-merge-strategies.d.ts → git/merge-strategies.d.ts} +2 -2
  184. package/dist/git/merge-strategies.d.ts.map +1 -0
  185. package/dist/{git-merge-strategies.js → git/merge-strategies.js} +3 -3
  186. package/dist/git/merge-strategies.js.map +1 -0
  187. package/dist/{git-merge.d.ts → git/merge.d.ts} +4 -4
  188. package/dist/git/merge.d.ts.map +1 -0
  189. package/dist/{git-merge.js → git/merge.js} +4 -4
  190. package/dist/git/merge.js.map +1 -0
  191. package/dist/{git-state-detector.d.ts → git/state-detector.d.ts} +2 -2
  192. package/dist/git/state-detector.d.ts.map +1 -0
  193. package/dist/{git-state-detector.js → git/state-detector.js} +7 -7
  194. package/dist/git/state-detector.js.map +1 -0
  195. package/dist/{git-types.d.ts → git/types.d.ts} +2 -2
  196. package/dist/git/types.d.ts.map +1 -0
  197. package/dist/{git-types.js → git/types.js} +1 -1
  198. package/dist/git/types.js.map +1 -0
  199. package/dist/{git-utils.d.ts → git/utils.d.ts} +1 -1
  200. package/dist/git/utils.d.ts.map +1 -0
  201. package/dist/{git-utils.js → git/utils.js} +2 -2
  202. package/dist/git/utils.js.map +1 -0
  203. package/dist/git.d.ts +5 -5
  204. package/dist/git.d.ts.map +1 -1
  205. package/dist/git.js +10 -10
  206. package/dist/git.js.map +1 -1
  207. package/dist/guard-engine.d.ts +3 -2
  208. package/dist/guard-engine.d.ts.map +1 -1
  209. package/dist/guard-engine.js +2 -2
  210. package/dist/guard-engine.js.map +1 -1
  211. package/dist/install-probe-tick.d.ts +63 -0
  212. package/dist/install-probe-tick.d.ts.map +1 -0
  213. package/dist/install-probe-tick.js +137 -0
  214. package/dist/install-probe-tick.js.map +1 -0
  215. package/dist/install-probe.d.ts +115 -0
  216. package/dist/install-probe.d.ts.map +1 -0
  217. package/dist/install-probe.js +197 -0
  218. package/dist/install-probe.js.map +1 -0
  219. package/dist/listener-auto-advance.d.ts.map +1 -1
  220. package/dist/listener-auto-advance.js +31 -0
  221. package/dist/listener-auto-advance.js.map +1 -1
  222. package/dist/listener.js +5 -5
  223. package/dist/listener.js.map +1 -1
  224. package/dist/{loop-context-audit-pass.d.ts → loops/context-audit-pass.d.ts} +4 -4
  225. package/dist/loops/context-audit-pass.d.ts.map +1 -0
  226. package/dist/{loop-context-audit-pass.js → loops/context-audit-pass.js} +7 -7
  227. package/dist/loops/context-audit-pass.js.map +1 -0
  228. package/dist/{loop-engine-types.d.ts → loops/engine-types.d.ts} +1 -1
  229. package/dist/loops/engine-types.d.ts.map +1 -0
  230. package/dist/{loop-engine-types.js → loops/engine-types.js} +1 -1
  231. package/dist/loops/engine-types.js.map +1 -0
  232. package/dist/{loop-engine.d.ts → loops/engine.d.ts} +6 -6
  233. package/dist/loops/engine.d.ts.map +1 -0
  234. package/dist/{loop-engine.js → loops/engine.js} +13 -13
  235. package/dist/loops/engine.js.map +1 -0
  236. package/dist/{loop-event-bus.d.ts → loops/event-bus.d.ts} +1 -1
  237. package/dist/loops/event-bus.d.ts.map +1 -0
  238. package/dist/{loop-event-bus.js → loops/event-bus.js} +1 -1
  239. package/dist/loops/event-bus.js.map +1 -0
  240. package/dist/loops/index.d.ts +33 -0
  241. package/dist/loops/index.d.ts.map +1 -0
  242. package/dist/loops/index.js +32 -0
  243. package/dist/loops/index.js.map +1 -0
  244. package/dist/{loop-llm-client.d.ts → loops/llm-client.d.ts} +3 -3
  245. package/dist/loops/llm-client.d.ts.map +1 -0
  246. package/dist/{loop-llm-client.js → loops/llm-client.js} +3 -3
  247. package/dist/loops/llm-client.js.map +1 -0
  248. package/dist/{loop-llm-flag.d.ts → loops/llm-flag.d.ts} +1 -1
  249. package/dist/loops/llm-flag.d.ts.map +1 -0
  250. package/dist/{loop-llm-flag.js → loops/llm-flag.js} +1 -1
  251. package/dist/loops/llm-flag.js.map +1 -0
  252. package/dist/{loop-operational-block.d.ts → loops/operational-block.d.ts} +1 -1
  253. package/dist/loops/operational-block.d.ts.map +1 -0
  254. package/dist/{loop-operational-block.js → loops/operational-block.js} +1 -1
  255. package/dist/loops/operational-block.js.map +1 -0
  256. package/dist/{loop-prompt-builder.d.ts → loops/prompt-builder.d.ts} +2 -2
  257. package/dist/loops/prompt-builder.d.ts.map +1 -0
  258. package/dist/{loop-prompt-builder.js → loops/prompt-builder.js} +1 -1
  259. package/dist/loops/prompt-builder.js.map +1 -0
  260. package/dist/{loop-variance.d.ts → loops/variance.d.ts} +1 -1
  261. package/dist/loops/variance.d.ts.map +1 -0
  262. package/dist/{loop-variance.js → loops/variance.js} +1 -1
  263. package/dist/loops/variance.js.map +1 -0
  264. package/dist/merge-back-loop.d.ts.map +1 -1
  265. package/dist/merge-back-loop.js +4 -3
  266. package/dist/merge-back-loop.js.map +1 -1
  267. package/dist/merge-detector.js +2 -2
  268. package/dist/merge-detector.js.map +1 -1
  269. package/dist/{nexus-endpoint-clearance.d.ts → nexus/endpoint-clearance.d.ts} +2 -2
  270. package/dist/nexus/endpoint-clearance.d.ts.map +1 -0
  271. package/dist/{nexus-endpoint-clearance.js → nexus/endpoint-clearance.js} +2 -2
  272. package/dist/nexus/endpoint-clearance.js.map +1 -0
  273. package/dist/{nexus-escalation-bridge.d.ts → nexus/escalation-bridge.d.ts} +1 -1
  274. package/dist/nexus/escalation-bridge.d.ts.map +1 -0
  275. package/dist/{nexus-escalation-bridge.js → nexus/escalation-bridge.js} +2 -2
  276. package/dist/nexus/escalation-bridge.js.map +1 -0
  277. package/dist/{nexus-incoming.d.ts → nexus/incoming.d.ts} +2 -2
  278. package/dist/nexus/incoming.d.ts.map +1 -0
  279. package/dist/{nexus-incoming.js → nexus/incoming.js} +2 -2
  280. package/dist/nexus/incoming.js.map +1 -0
  281. package/dist/nexus/index.d.ts +20 -0
  282. package/dist/nexus/index.d.ts.map +1 -0
  283. package/dist/nexus/index.js +20 -0
  284. package/dist/nexus/index.js.map +1 -0
  285. package/dist/{nexus-intake-spawn.d.ts → nexus/intake-spawn.d.ts} +3 -3
  286. package/dist/nexus/intake-spawn.d.ts.map +1 -0
  287. package/dist/{nexus-intake-spawn.js → nexus/intake-spawn.js} +1 -1
  288. package/dist/nexus/intake-spawn.js.map +1 -0
  289. package/dist/{nexus-intake.d.ts → nexus/intake.d.ts} +2 -2
  290. package/dist/nexus/intake.d.ts.map +1 -0
  291. package/dist/{nexus-intake.js → nexus/intake.js} +4 -4
  292. package/dist/nexus/intake.js.map +1 -0
  293. package/dist/{nexus-return.d.ts → nexus/return.d.ts} +3 -3
  294. package/dist/nexus/return.d.ts.map +1 -0
  295. package/dist/{nexus-return.js → nexus/return.js} +4 -4
  296. package/dist/nexus/return.js.map +1 -0
  297. package/dist/otlp/index.d.ts +19 -0
  298. package/dist/otlp/index.d.ts.map +1 -0
  299. package/dist/otlp/index.js +19 -0
  300. package/dist/otlp/index.js.map +1 -0
  301. package/dist/{otlp-log-parser.d.ts → otlp/log-parser.d.ts} +2 -2
  302. package/dist/otlp/log-parser.d.ts.map +1 -0
  303. package/dist/{otlp-log-parser.js → otlp/log-parser.js} +5 -6
  304. package/dist/otlp/log-parser.js.map +1 -0
  305. package/dist/{otlp-metric-parser.d.ts → otlp/metric-parser.d.ts} +2 -2
  306. package/dist/otlp/metric-parser.d.ts.map +1 -0
  307. package/dist/{otlp-metric-parser.js → otlp/metric-parser.js} +4 -5
  308. package/dist/otlp/metric-parser.js.map +1 -0
  309. package/dist/{otlp-port-manager.d.ts → otlp/port-manager.d.ts} +1 -1
  310. package/dist/otlp/port-manager.d.ts.map +1 -0
  311. package/dist/{otlp-port-manager.js → otlp/port-manager.js} +1 -1
  312. package/dist/otlp/port-manager.js.map +1 -0
  313. package/dist/{otlp-receiver.d.ts → otlp/receiver.d.ts} +2 -2
  314. package/dist/otlp/receiver.d.ts.map +1 -0
  315. package/dist/{otlp-receiver.js → otlp/receiver.js} +5 -33
  316. package/dist/otlp/receiver.js.map +1 -0
  317. package/dist/{otlp-types.d.ts → otlp/types.d.ts} +1 -9
  318. package/dist/otlp/types.d.ts.map +1 -0
  319. package/dist/{otlp-types.js → otlp/types.js} +1 -27
  320. package/dist/otlp/types.js.map +1 -0
  321. package/dist/pipeline-config.d.ts +1 -1
  322. package/dist/{prd-controller.d.ts → prd/controller.d.ts} +7 -7
  323. package/dist/prd/controller.d.ts.map +1 -0
  324. package/dist/{prd-controller.js → prd/controller.js} +11 -11
  325. package/dist/prd/controller.js.map +1 -0
  326. package/dist/{prd-divergence.d.ts → prd/divergence.d.ts} +2 -2
  327. package/dist/prd/divergence.d.ts.map +1 -0
  328. package/dist/{prd-divergence.js → prd/divergence.js} +1 -1
  329. package/dist/prd/divergence.js.map +1 -0
  330. package/dist/{prd-focus-pushdown.d.ts → prd/focus-pushdown.d.ts} +2 -2
  331. package/dist/prd/focus-pushdown.d.ts.map +1 -0
  332. package/dist/{prd-focus-pushdown.js → prd/focus-pushdown.js} +3 -3
  333. package/dist/prd/focus-pushdown.js.map +1 -0
  334. package/dist/{prd-frontier.d.ts → prd/frontier.d.ts} +2 -2
  335. package/dist/prd/frontier.d.ts.map +1 -0
  336. package/dist/{prd-frontier.js → prd/frontier.js} +1 -1
  337. package/dist/prd/frontier.js.map +1 -0
  338. package/dist/prd/index.d.ts +26 -0
  339. package/dist/prd/index.d.ts.map +1 -0
  340. package/dist/prd/index.js +25 -0
  341. package/dist/prd/index.js.map +1 -0
  342. package/dist/{prd-steward.d.ts → prd/steward.d.ts} +4 -4
  343. package/dist/prd/steward.d.ts.map +1 -0
  344. package/dist/{prd-steward.js → prd/steward.js} +4 -4
  345. package/dist/prd/steward.js.map +1 -0
  346. package/dist/{prd-viability.d.ts → prd/viability.d.ts} +2 -2
  347. package/dist/prd/viability.d.ts.map +1 -0
  348. package/dist/{prd-viability.js → prd/viability.js} +1 -1
  349. package/dist/prd/viability.js.map +1 -0
  350. package/dist/product-scaffold.js +2 -2
  351. package/dist/product-scaffold.js.map +1 -1
  352. package/dist/prompt-sections/persona-sections.d.ts +12 -0
  353. package/dist/prompt-sections/persona-sections.d.ts.map +1 -1
  354. package/dist/prompt-sections/persona-sections.js +29 -2
  355. package/dist/prompt-sections/persona-sections.js.map +1 -1
  356. package/dist/queries/context-lock-queries.js +1 -1
  357. package/dist/queries/context-lock-queries.js.map +1 -1
  358. package/dist/queries/deliveries.d.ts +15 -0
  359. package/dist/queries/deliveries.d.ts.map +1 -1
  360. package/dist/queries/deliveries.js +2 -0
  361. package/dist/queries/deliveries.js.map +1 -1
  362. package/dist/queries/focuses.d.ts +17 -0
  363. package/dist/queries/focuses.d.ts.map +1 -1
  364. package/dist/queries/focuses.js +27 -0
  365. package/dist/queries/focuses.js.map +1 -1
  366. package/dist/queries/schemas.d.ts +4 -0
  367. package/dist/queries/schemas.d.ts.map +1 -1
  368. package/dist/queries/schemas.js +8 -0
  369. package/dist/queries/schemas.js.map +1 -1
  370. package/dist/reality-pole.js +1 -1
  371. package/dist/resolvers/git-diff-against-base.d.ts.map +1 -1
  372. package/dist/resolvers/git-diff-against-base.js +4 -1
  373. package/dist/resolvers/git-diff-against-base.js.map +1 -1
  374. package/dist/resolvers/prd-context.js +1 -1
  375. package/dist/sensor-sweep.js +1 -1
  376. package/dist/spawn/model-routing.d.ts +277 -0
  377. package/dist/spawn/model-routing.d.ts.map +1 -0
  378. package/dist/spawn/model-routing.js +464 -0
  379. package/dist/spawn/model-routing.js.map +1 -0
  380. package/dist/spawn/process-spawn.d.ts +128 -0
  381. package/dist/spawn/process-spawn.d.ts.map +1 -0
  382. package/dist/spawn/process-spawn.js +378 -0
  383. package/dist/spawn/process-spawn.js.map +1 -0
  384. package/dist/spawn/prompt-assembly.d.ts +143 -0
  385. package/dist/spawn/prompt-assembly.d.ts.map +1 -0
  386. package/dist/spawn/prompt-assembly.js +263 -0
  387. package/dist/spawn/prompt-assembly.js.map +1 -0
  388. package/dist/spawn/shared.d.ts +72 -0
  389. package/dist/spawn/shared.d.ts.map +1 -0
  390. package/dist/spawn/shared.js +14 -0
  391. package/dist/spawn/shared.js.map +1 -0
  392. package/dist/spawn/spawn-decision.d.ts +189 -0
  393. package/dist/spawn/spawn-decision.d.ts.map +1 -0
  394. package/dist/spawn/spawn-decision.js +361 -0
  395. package/dist/spawn/spawn-decision.js.map +1 -0
  396. package/dist/spawn/worktree-session.d.ts +105 -0
  397. package/dist/spawn/worktree-session.d.ts.map +1 -0
  398. package/dist/spawn/worktree-session.js +216 -0
  399. package/dist/spawn/worktree-session.js.map +1 -0
  400. package/dist/spawner/lifecycle.js +2 -2
  401. package/dist/spawner/lifecycle.js.map +1 -1
  402. package/dist/spawner/resolution.js +1 -1
  403. package/dist/stall-detector-config.d.ts +4 -0
  404. package/dist/stall-detector-config.d.ts.map +1 -1
  405. package/dist/stall-detector-config.js +6 -0
  406. package/dist/stall-detector-config.js.map +1 -1
  407. package/dist/state-cascade.js +1 -1
  408. package/dist/state-cascade.js.map +1 -1
  409. package/dist/trigger-executor.d.ts +5 -9
  410. package/dist/trigger-executor.d.ts.map +1 -1
  411. package/dist/trigger-executor.js +14 -36
  412. package/dist/trigger-executor.js.map +1 -1
  413. package/dist/types/focus.d.ts +13 -0
  414. package/dist/types/focus.d.ts.map +1 -1
  415. package/dist/types/workflow.d.ts +1 -3
  416. package/dist/types/workflow.d.ts.map +1 -1
  417. package/dist/unified-engine-lifecycle.js +1 -1
  418. package/dist/unified-init.d.ts +3 -3
  419. package/dist/unified-init.d.ts.map +1 -1
  420. package/dist/unified-init.js +9 -25
  421. package/dist/unified-init.js.map +1 -1
  422. package/dist/unified-shell.d.ts +3 -3
  423. package/dist/unified-shell.js +4 -4
  424. package/dist/unified-shell.js.map +1 -1
  425. package/dist/verification-engine.d.ts.map +1 -1
  426. package/dist/verification-engine.js +15 -0
  427. package/dist/verification-engine.js.map +1 -1
  428. package/dist/{worktree-focus.d.ts → worktree/focus.d.ts} +2 -2
  429. package/dist/worktree/focus.d.ts.map +1 -0
  430. package/dist/{worktree-focus.js → worktree/focus.js} +7 -7
  431. package/dist/worktree/focus.js.map +1 -0
  432. package/dist/worktree/index.d.ts +16 -0
  433. package/dist/worktree/index.d.ts.map +1 -0
  434. package/dist/worktree/index.js +16 -0
  435. package/dist/worktree/index.js.map +1 -0
  436. package/dist/{worktree-safety.d.ts → worktree/safety.d.ts} +1 -1
  437. package/dist/worktree/safety.d.ts.map +1 -0
  438. package/dist/{worktree-safety.js → worktree/safety.js} +2 -2
  439. package/dist/worktree/safety.js.map +1 -0
  440. package/dist/{worktree-state.d.ts → worktree/state.d.ts} +1 -1
  441. package/dist/worktree/state.d.ts.map +1 -0
  442. package/dist/{worktree-state.js → worktree/state.js} +6 -6
  443. package/dist/worktree/state.js.map +1 -0
  444. package/dist/worktree.d.ts +1 -1
  445. package/dist/worktree.js +5 -5
  446. package/dist/worktree.js.map +1 -1
  447. package/package.json +5 -4
  448. package/dist/git-activity.d.ts.map +0 -1
  449. package/dist/git-activity.js.map +0 -1
  450. package/dist/git-branch.d.ts.map +0 -1
  451. package/dist/git-branch.js.map +0 -1
  452. package/dist/git-fetch.d.ts.map +0 -1
  453. package/dist/git-fetch.js.map +0 -1
  454. package/dist/git-genesis.d.ts.map +0 -1
  455. package/dist/git-genesis.js.map +0 -1
  456. package/dist/git-integration.d.ts.map +0 -1
  457. package/dist/git-integration.js.map +0 -1
  458. package/dist/git-merge-helpers.d.ts.map +0 -1
  459. package/dist/git-merge-helpers.js.map +0 -1
  460. package/dist/git-merge-lock.d.ts.map +0 -1
  461. package/dist/git-merge-lock.js.map +0 -1
  462. package/dist/git-merge-strategies.d.ts.map +0 -1
  463. package/dist/git-merge-strategies.js.map +0 -1
  464. package/dist/git-merge.d.ts.map +0 -1
  465. package/dist/git-merge.js.map +0 -1
  466. package/dist/git-state-detector.d.ts.map +0 -1
  467. package/dist/git-state-detector.js.map +0 -1
  468. package/dist/git-types.d.ts.map +0 -1
  469. package/dist/git-types.js.map +0 -1
  470. package/dist/git-utils.d.ts.map +0 -1
  471. package/dist/git-utils.js.map +0 -1
  472. package/dist/loop-context-audit-pass.d.ts.map +0 -1
  473. package/dist/loop-context-audit-pass.js.map +0 -1
  474. package/dist/loop-engine-types.d.ts.map +0 -1
  475. package/dist/loop-engine-types.js.map +0 -1
  476. package/dist/loop-engine.d.ts.map +0 -1
  477. package/dist/loop-engine.js.map +0 -1
  478. package/dist/loop-event-bus.d.ts.map +0 -1
  479. package/dist/loop-event-bus.js.map +0 -1
  480. package/dist/loop-llm-client.d.ts.map +0 -1
  481. package/dist/loop-llm-client.js.map +0 -1
  482. package/dist/loop-llm-flag.d.ts.map +0 -1
  483. package/dist/loop-llm-flag.js.map +0 -1
  484. package/dist/loop-operational-block.d.ts.map +0 -1
  485. package/dist/loop-operational-block.js.map +0 -1
  486. package/dist/loop-prompt-builder.d.ts.map +0 -1
  487. package/dist/loop-prompt-builder.js.map +0 -1
  488. package/dist/loop-variance.d.ts.map +0 -1
  489. package/dist/loop-variance.js.map +0 -1
  490. package/dist/nexus-endpoint-clearance.d.ts.map +0 -1
  491. package/dist/nexus-endpoint-clearance.js.map +0 -1
  492. package/dist/nexus-escalation-bridge.d.ts.map +0 -1
  493. package/dist/nexus-escalation-bridge.js.map +0 -1
  494. package/dist/nexus-incoming.d.ts.map +0 -1
  495. package/dist/nexus-incoming.js.map +0 -1
  496. package/dist/nexus-intake-spawn.d.ts.map +0 -1
  497. package/dist/nexus-intake-spawn.js.map +0 -1
  498. package/dist/nexus-intake.d.ts.map +0 -1
  499. package/dist/nexus-intake.js.map +0 -1
  500. package/dist/nexus-return.d.ts.map +0 -1
  501. package/dist/nexus-return.js.map +0 -1
  502. package/dist/otlp-log-parser.d.ts.map +0 -1
  503. package/dist/otlp-log-parser.js.map +0 -1
  504. package/dist/otlp-metric-parser.d.ts.map +0 -1
  505. package/dist/otlp-metric-parser.js.map +0 -1
  506. package/dist/otlp-port-manager.d.ts.map +0 -1
  507. package/dist/otlp-port-manager.js.map +0 -1
  508. package/dist/otlp-receiver.d.ts.map +0 -1
  509. package/dist/otlp-receiver.js.map +0 -1
  510. package/dist/otlp-types.d.ts.map +0 -1
  511. package/dist/otlp-types.js.map +0 -1
  512. package/dist/prd-controller.d.ts.map +0 -1
  513. package/dist/prd-controller.js.map +0 -1
  514. package/dist/prd-divergence.d.ts.map +0 -1
  515. package/dist/prd-divergence.js.map +0 -1
  516. package/dist/prd-focus-pushdown.d.ts.map +0 -1
  517. package/dist/prd-focus-pushdown.js.map +0 -1
  518. package/dist/prd-frontier.d.ts.map +0 -1
  519. package/dist/prd-frontier.js.map +0 -1
  520. package/dist/prd-steward.d.ts.map +0 -1
  521. package/dist/prd-steward.js.map +0 -1
  522. package/dist/prd-viability.d.ts.map +0 -1
  523. package/dist/prd-viability.js.map +0 -1
  524. package/dist/worktree-focus.d.ts.map +0 -1
  525. package/dist/worktree-focus.js.map +0 -1
  526. package/dist/worktree-safety.d.ts.map +0 -1
  527. package/dist/worktree-safety.js.map +0 -1
  528. package/dist/worktree-state.d.ts.map +0 -1
  529. package/dist/worktree-state.js.map +0 -1
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Process-spawn seam for the focus-team spawn path.
3
+ *
4
+ * Extracted verbatim from focus-executor.ts (behavior-preserving): the final
5
+ * phase that takes a fully-resolved spawn (env constituents, args, message,
6
+ * session, backend) and actually launches the team-lead child process, plus its
7
+ * fail-closed backend/sandbox/governor gates, the crash-isolated spawn wrapper,
8
+ * and the terminal session-update payload builders. focus-executor.ts re-exports
9
+ * this surface for backward compatibility, so external importers keep resolving
10
+ * these symbols from '../focus-executor.js'.
11
+ *
12
+ * Cycle rule: this module must NOT import from '../focus-executor.js'. The two
13
+ * symbols this seam would otherwise reach back for -- the resource governor and
14
+ * the orchestrator spawnFocusTeam (staying in focus-executor.ts) -- are threaded
15
+ * in via SpawnTeamProcessArgs instead.
16
+ */
17
+ import { spawn } from 'node:child_process';
18
+ import { hostname } from 'node:os';
19
+ import { withRetry } from '@telora/daemon-core';
20
+ import { updateSession, } from '../supabase.js';
21
+ import { buildLeveredSpawnEnvironment, fetchBackendEnvExtras } from '../spawn-environment.js';
22
+ import { wrapSpawnCommand, SandboxUnavailableError } from '../spawn-sandbox.js';
23
+ import { recordWorkerPid, removeWorkerPid } from '../worker-pidfile.js';
24
+ import { insertAssemblyManifest } from '../queries/context-assembly.js';
25
+ import { TELORA_LOCAL_API_KEY_ENV } from '../cli/codex-provision.js';
26
+ import { preflightLocalModelMcp } from '../backends/codex/mcp-preflight.js';
27
+ import { getActiveTeams } from '../focus-team-state.js';
28
+ import { attachStreamHandlers, handleTeamProcessClose, } from '../spawner/helpers.js';
29
+ import { terminateTeam, handleCompletionEvent, } from '../completion/index.js';
30
+ /**
31
+ * The terminal session-update payload written when the resource governor denies a
32
+ * slot for this spawn. Pure -- the caller adds `ended_at` and calls updateSession.
33
+ * Exported so the governor-denied exit_category contract is unit-pinned (the
34
+ * apply-side -- updateSession + governor.releaseSlot + activeTeams.delete -- stays
35
+ * in spawnTeamProcess, exercised by spawn-path-unified.test.ts).
36
+ */
37
+ export function governorDeniedSessionUpdate() {
38
+ return {
39
+ status: 'failed',
40
+ exit_reason: 'Governor denied slot',
41
+ exit_category: 'governor_denied',
42
+ };
43
+ }
44
+ /**
45
+ * The terminal session-update payload written when a required OS sandbox cannot
46
+ * initialize and the spawn is refused (fail-closed). Pure -- the caller adds
47
+ * `ended_at` and calls updateSession. Exported so the sandbox-unavailable
48
+ * exit_category contract is unit-pinned.
49
+ */
50
+ export function sandboxUnavailableSessionUpdate(message) {
51
+ return {
52
+ status: 'failed',
53
+ exit_reason: message,
54
+ exit_category: 'sandbox_unavailable',
55
+ };
56
+ }
57
+ /**
58
+ * Local-model passes depend on a host CLI, so refuse the process launch when
59
+ * the backend's existing availability probe says it cannot run. Cloud passes
60
+ * retain their existing behavior because their authentication can be supplied
61
+ * by the per-spawn environment after the host-level probe runs.
62
+ */
63
+ export async function gateLocalModelBackendSpawn(backend, config, isLocalModelPass, host = hostname()) {
64
+ if (!isLocalModelPass)
65
+ return { allowed: true };
66
+ const availability = await backend.probeAvailability(config);
67
+ if (availability.available)
68
+ return { allowed: true };
69
+ // A routed local model supplies its own provider key in the child env. The
70
+ // host probe cannot see that key yet, so only binary absence is terminal for
71
+ // this Codex path; host-auth absence is intentionally superseded.
72
+ if (backend.id === 'codex' && availability.detail?.includes('but not authenticated')) {
73
+ return { allowed: true };
74
+ }
75
+ const binaryMissing = backend.id === 'codex' && availability.detail?.includes('not found');
76
+ const prefix = binaryMissing
77
+ ? `Codex CLI not found on ${host} / not on PATH`
78
+ : `${backend.displayName} unavailable on ${host}`;
79
+ return {
80
+ allowed: false,
81
+ reason: availability.detail ? `${prefix}. ${availability.detail}` : prefix,
82
+ };
83
+ }
84
+ export function backendUnavailableSessionUpdate(reason, category = 'backend_unavailable') {
85
+ return {
86
+ status: 'failed',
87
+ exit_reason: reason,
88
+ exit_category: category,
89
+ };
90
+ }
91
+ /** Attach the error listener in the same synchronous stack frame as spawn(). */
92
+ export function spawnCrashIsolated(command, args, options, onError, spawnFn = spawn) {
93
+ const proc = spawnFn(command, args, {
94
+ ...options,
95
+ // Own process group (setsid on POSIX): the team lead becomes its own
96
+ // group leader (pgid == lead pid). This is what makes the reap's
97
+ // group-first signal (spawner/lifecycle.signalWorker: kill(-pid)) actually
98
+ // reap the lead AND any host children it sub-spawns as one group -- without
99
+ // detachment the lead shares the daemon's group and kill(-leadPid) ESRCHs,
100
+ // falling back to the bare pid (lead only). We deliberately do NOT unref():
101
+ // the daemon must still observe the lead's 'close'/'exit' to drive
102
+ // completion + delivery advancement. On a hard daemon kill the CLI reaps
103
+ // these groups from the persisted worker pidfile (see daemon-process reap).
104
+ detached: true,
105
+ stdio: ['pipe', 'pipe', 'pipe'],
106
+ });
107
+ proc.on('error', onError);
108
+ // A failed exec can also tear down stdin with EPIPE after the process-level
109
+ // error/close. Consume that duplicate stream error; forward other stdin
110
+ // failures through the pass-scoped handler.
111
+ proc.stdin.on('error', (error) => {
112
+ if (error.code !== 'EPIPE')
113
+ onError(error);
114
+ });
115
+ return proc;
116
+ }
117
+ /** Ensure a terminal spawn failure is persisted after any in-flight running transition. */
118
+ export async function persistSpawnFailureAfterRunning(runningTransition, persistFailure) {
119
+ if (runningTransition)
120
+ await runningTransition.catch(() => undefined);
121
+ await persistFailure();
122
+ }
123
+ /**
124
+ * Final phase: build the levered spawn environment, persist the assembly
125
+ * manifest, write the session lifecycle (starting -> running), acquire the
126
+ * governor slot, wrap the command in the sandbox (fail-closed), spawn the
127
+ * child, write its stdin, and attach the completion/close/error handlers.
128
+ *
129
+ * Owns ALL of its early-return cleanups so the team-state map and governor slot
130
+ * never leak: governor-denied (exit_category 'governor_denied') and
131
+ * sandbox-unavailable (exit_category 'sandbox_unavailable') both mark the
132
+ * session terminal, release the governor slot where one was held, remove the
133
+ * team from activeTeams, and return without spawning. Behavior byte-identical
134
+ * to the original inline tail of spawnFocusTeam.
135
+ */
136
+ /**
137
+ * Close a team's local-model translating proxy if one is engaged, and null it so
138
+ * the call is idempotent across the multiple teardown paths. No-op for every
139
+ * hosted/Claude/flag-off team (mcpProxy undefined/null).
140
+ */
141
+ export function closeTeamProxyQuietly(teamState) {
142
+ const proxy = teamState.mcpProxy;
143
+ if (!proxy)
144
+ return;
145
+ teamState.mcpProxy = null;
146
+ proxy.close().catch(() => undefined);
147
+ }
148
+ export async function spawnTeamProcess(spec) {
149
+ const { config, focusId, focusName, session, teamState, backend, args, messageToSend, logs, worktreePath, resumeId, assemblyManifest, spawnCodexHome, spawnLocalModelKey, isLocalModelPass, effectiveModel, pendingDirective, spawnStageName, params, governor, spawnFocusTeam, } = spec;
150
+ const activeTeams = getActiveTeams();
151
+ // Two fail-closed gates for local-model passes, both refusing the spawn into a
152
+ // durable terminal session rather than launching a team that cannot work:
153
+ // 1. backend availability (host CLI present) -- 'backend_unavailable'
154
+ // 2. read-only MCP preflight (required Telora tools callable) -- 'mcp_preflight_failed'
155
+ // The preflight runs only after availability passes (no point probing MCP when
156
+ // the binary is missing). Cloud/claude passes short-circuit both gates.
157
+ const availabilityGate = await gateLocalModelBackendSpawn(backend, config, isLocalModelPass);
158
+ const spawnGate = !availabilityGate.allowed
159
+ ? { ...availabilityGate, category: 'backend_unavailable' }
160
+ : await preflightLocalModelMcp(config, isLocalModelPass);
161
+ if (!spawnGate.allowed) {
162
+ const reason = spawnGate.reason ?? `${backend.displayName} unavailable`;
163
+ const category = spawnGate.category ?? 'backend_unavailable';
164
+ console.error(`[focus-executor] Refusing spawn for "${focusName}" (${category}): ${reason}`);
165
+ await updateSession(session.id, {
166
+ ...backendUnavailableSessionUpdate(reason, category),
167
+ ended_at: new Date().toISOString(),
168
+ }).catch(updateErr => {
169
+ console.warn(`[focus-executor] Failed to update refused-spawn session:`, updateErr.message);
170
+ });
171
+ logs.stdoutLogStream.end();
172
+ logs.stderrStream.end();
173
+ logs.jsonlStream.end();
174
+ closeTeamProxyQuietly(teamState);
175
+ teamState.phase = 'terminated';
176
+ activeTeams.delete(focusId);
177
+ return;
178
+ }
179
+ // Tag spend with the lever: the team-lead spawn runs the focus's execute
180
+ // phase (review directives run the gate); the workflow stage is carried
181
+ // separately. The audit phase tags its own spawn elsewhere.
182
+ const spawnPhase = (pendingDirective?.sessionType ?? 'coding') === 'review' ? 'gate' : 'execute';
183
+ // Stage: prefer the resolved workflow-stage name; when the stage could not be
184
+ // resolved (legacy-prompt fallback, or a non-review directive that carried no
185
+ // stage), fall back to the phase-appropriate default so the lever is never
186
+ // dropped. 'reviewing' for the gate phase, 'coding' for execute.
187
+ const spawnStage = spawnStageName ?? (spawnPhase === 'gate' ? 'reviewing' : 'coding');
188
+ // Levered spawn: buildLeveredSpawnEnvironment requires phase + stage, so this
189
+ // path cannot regress to dropping the telemetry lever.
190
+ const spawnEnv = buildLeveredSpawnEnvironment(config, {
191
+ orgId: config.organizationId,
192
+ focusId,
193
+ sessionId: session.id,
194
+ phase: spawnPhase,
195
+ stage: spawnStage,
196
+ });
197
+ // Inject backend-specific org secrets (e.g. CODEX_API_KEY for the codex backend).
198
+ // Non-fatal: fetchBackendEnvExtras returns {} on any error, falling back to host creds.
199
+ Object.assign(spawnEnv, await fetchBackendEnvExtras(backend.id));
200
+ // Per-product local-model isolation: point this codex spawn at the product's
201
+ // provisioned CODEX_HOME (no-invisible-cascading -- the override is logged).
202
+ // Cloud/claude spawns leave CODEX_HOME unset (spawnCodexHome === undefined).
203
+ if (spawnCodexHome) {
204
+ spawnEnv.CODEX_HOME = spawnCodexHome;
205
+ console.log(`[focus-executor] CODEX_HOME set for "${focusName}" (product ${config.productId.slice(0, 8)}): ` +
206
+ `${spawnCodexHome}` +
207
+ (effectiveModel ? ` (model: ${effectiveModel})` : ''));
208
+ }
209
+ // Per-pass local-model bearer (D8): inject the Telora-resolved key VALUE into
210
+ // the spawn env under the fixed name codex's config.toml references (env_key).
211
+ // The value lives only in this child process env -- never on disk, never on the
212
+ // local_models row. Set only for a routed local-model pass; cloud/claude and
213
+ // non-local codex spawns leave it untouched.
214
+ if (spawnLocalModelKey) {
215
+ spawnEnv[TELORA_LOCAL_API_KEY_ENV] = spawnLocalModelKey;
216
+ }
217
+ // Persist the assembly manifest for this spawn (best-effort -- never blocks
218
+ // the spawn). One row per resolved source, attributed to org + session +
219
+ // focus, so injected context becomes a queryable lever on token spend.
220
+ void insertAssemblyManifest({
221
+ sessionId: session.id,
222
+ focusId,
223
+ deliveryId: null,
224
+ manifest: assemblyManifest,
225
+ });
226
+ // Update session to starting
227
+ await updateSession(session.id, {
228
+ status: 'starting',
229
+ started_at: new Date().toISOString(),
230
+ stdout_path: logs.stdoutPath,
231
+ stderr_path: logs.stderrPath,
232
+ });
233
+ // Acquire governor slot (if governor is configured)
234
+ if (governor) {
235
+ try {
236
+ await governor.acquireSlot('focus');
237
+ }
238
+ catch (err) {
239
+ console.warn(`[focus-executor] Governor denied slot for "${focusName}":`, err.message);
240
+ // Mark session as failed so it doesn't linger in `starting` status
241
+ await updateSession(session.id, {
242
+ ...governorDeniedSessionUpdate(),
243
+ ended_at: new Date().toISOString(),
244
+ }).catch(updateErr => {
245
+ console.warn(`[focus-executor] Failed to update session after governor denial:`, updateErr.message);
246
+ });
247
+ closeTeamProxyQuietly(teamState);
248
+ activeTeams.delete(focusId);
249
+ return;
250
+ }
251
+ }
252
+ // Wrap the spawn in the OS sandbox (D3). Default mode is 'off' (no change);
253
+ // an explicit sandbox.mode="bwrap" confines the agent's filesystem to its
254
+ // worktree + an explicit read-only allowlist. FAIL-CLOSED: if a required
255
+ // sandbox cannot initialize, refuse the spawn rather than run unconfined.
256
+ let spawnCommand;
257
+ let spawnArgs;
258
+ try {
259
+ const wrapped = wrapSpawnCommand(config, {
260
+ command: backend.resolveCommand(config),
261
+ args,
262
+ worktreePath,
263
+ });
264
+ spawnCommand = wrapped.command;
265
+ spawnArgs = wrapped.args;
266
+ }
267
+ catch (err) {
268
+ if (err instanceof SandboxUnavailableError) {
269
+ console.error(`[focus-executor] Refusing spawn for "${focusName}": ${err.message}`);
270
+ await updateSession(session.id, {
271
+ ...sandboxUnavailableSessionUpdate(err.message),
272
+ ended_at: new Date().toISOString(),
273
+ }).catch(updateErr => {
274
+ console.warn(`[focus-executor] Failed to update session after sandbox refusal:`, updateErr.message);
275
+ });
276
+ if (governor)
277
+ governor.releaseSlot('focus');
278
+ closeTeamProxyQuietly(teamState);
279
+ activeTeams.delete(focusId);
280
+ return;
281
+ }
282
+ throw err;
283
+ }
284
+ // Spawn the team lead process
285
+ let processErrorHandled = false;
286
+ let runningTransition = null;
287
+ let completionDetectorForError = null;
288
+ const handleProcessError = (err) => {
289
+ if (processErrorHandled)
290
+ return;
291
+ processErrorHandled = true;
292
+ console.error(`[focus-executor] Team lead for "${focusName}" error:`, err.message);
293
+ governor?.releaseSlot('focus');
294
+ const missingCliReason = err.code === 'ENOENT'
295
+ ? `${backend.displayName} not found on ${hostname()} / not on PATH: ${err.message}`
296
+ : `Process error: ${err.message}`;
297
+ void persistSpawnFailureAfterRunning(runningTransition, () => withRetry(() => updateSession(session.id, {
298
+ status: 'failed',
299
+ exit_reason: missingCliReason,
300
+ exit_category: err.code === 'ENOENT' ? 'backend_unavailable' : 'error',
301
+ ended_at: new Date().toISOString(),
302
+ }), { maxAttempts: 3, baseDelayMs: 1000, label: 'session-update-error' })).catch(updateErr => {
303
+ console.warn(`[focus-executor] Failed to update session after retries:`, updateErr.message);
304
+ });
305
+ completionDetectorForError?.destroy();
306
+ logs.stdoutLogStream.end();
307
+ logs.stderrStream.end();
308
+ logs.jsonlStream.end();
309
+ closeTeamProxyQuietly(teamState);
310
+ teamState.phase = 'terminated';
311
+ activeTeams.delete(focusId);
312
+ };
313
+ const proc = spawnCrashIsolated(spawnCommand, spawnArgs, {
314
+ cwd: worktreePath,
315
+ env: spawnEnv,
316
+ }, handleProcessError);
317
+ teamState.leadPid = proc.pid ?? null;
318
+ teamState.leadStdin = proc.stdin;
319
+ teamState.phase = 'executing';
320
+ // Persist the detached lead pid so a hard daemon kill (stop --force / timeout
321
+ // / external kill -9) can group-reap it from the pidfile -- the in-memory
322
+ // activeTeams map dies with the daemon. Auto-removed on the lead's exit.
323
+ if (typeof proc.pid === 'number') {
324
+ const leadPid = proc.pid;
325
+ recordWorkerPid(leadPid, focusName);
326
+ proc.once('close', () => removeWorkerPid(leadPid));
327
+ proc.once('error', () => removeWorkerPid(leadPid));
328
+ }
329
+ // Attach stream parser, completion detector, activity tracker, event handlers
330
+ const { completionDetector, activityTracker } = attachStreamHandlers({
331
+ proc, backend, teamState, focusId, focusName, sessionId: session.id, logs,
332
+ });
333
+ completionDetectorForError = completionDetector;
334
+ // Send the message via stdin: the full composed prompt on a fresh spawn, or
335
+ // the incremental delta when resuming a lineage (INJ-D). Engine-specific input
336
+ // encoding lives in the backend.
337
+ proc.stdin.write(backend.encodeInput(messageToSend));
338
+ if (backend.closeStdinAfterInput) {
339
+ proc.stdin.end();
340
+ teamState.leadStdin = null;
341
+ }
342
+ // Update session to running
343
+ runningTransition = updateSession(session.id, {
344
+ status: 'running',
345
+ pid: proc.pid,
346
+ });
347
+ await runningTransition;
348
+ console.log(`[focus-executor] Team lead spawned for "${focusName}" (PID: ${proc.pid}, session: ${session.id})`);
349
+ // Handle completion -- check for more work or terminate.
350
+ // No idle phase: if actionable work remains, send it immediately (mid-focus
351
+ // handoff). If all work is done, terminate. A fresh team is spawned if new
352
+ // deliveries arrive later (~$0.50-1.00 exploration cost, but clean context).
353
+ completionDetector.on('complete', (info) => {
354
+ console.log(`[focus-executor] Team lead for "${focusName}" completed work cycle: ` +
355
+ `${info.turnCount} turns, $${info.totalCostUsd.toFixed(4)}`);
356
+ handleCompletionEvent({ config, focusId, focusName, teamState, completionDetector, proc, completionInfo: info }).catch(err => {
357
+ console.warn(`[focus-executor] Failed to check delivery state for "${focusName}":`, err.message);
358
+ // Fallback: terminate to avoid idle money burn.
359
+ terminateTeam(focusId, 'handoff');
360
+ });
361
+ });
362
+ // Handle process exit
363
+ const spawnedAt = Date.now();
364
+ proc.on('close', (code, signal) => {
365
+ // Node emits close after a spawn error. The error path already persisted
366
+ // the terminal reason; do not let normal completion overwrite it.
367
+ if (processErrorHandled)
368
+ return;
369
+ handleTeamProcessClose({
370
+ code, signal, focusName, focusId, resumeId, spawnedAt,
371
+ teamState, sessionId: session.id, config, completionDetector,
372
+ activityTracker, logs, params, governor, spawnFocusTeam,
373
+ }).catch(err => {
374
+ console.error(`[focus-executor] handleTeamProcessClose failed for "${focusName}":`, err.message);
375
+ });
376
+ });
377
+ }
378
+ //# sourceMappingURL=process-spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-spawn.js","sourceRoot":"","sources":["../../src/spawn/process-spawn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,KAAK,EAAsE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,SAAS,EAAyB,MAAM,qBAAqB,CAAC;AAKvE,OAAO,EAEL,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAEL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,aAAa,EACb,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAGhC;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,sBAAsB;QACnC,aAAa,EAAE,iBAAiB;KACjC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,+BAA+B,CAC7C,OAAe;IAEf,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,OAAO;QACpB,aAAa,EAAE,qBAAqB;KACrC,CAAC;AACJ,CAAC;AA+CD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAqB,EACrB,MAAoB,EACpB,gBAAyB,EACzB,IAAI,GAAG,QAAQ,EAAE;IAEjB,IAAI,CAAC,gBAAgB;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAEhD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,YAAY,CAAC,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAErD,2EAA2E;IAC3E,6EAA6E;IAC7E,kEAAkE;IAClE,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACrF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,EAAE,KAAK,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3F,MAAM,MAAM,GAAG,aAAa;QAC1B,CAAC,CAAC,0BAA0B,IAAI,gBAAgB;QAChD,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,mBAAmB,IAAI,EAAE,CAAC;IACpD,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM;KAC3E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,MAAc,EACd,QAAQ,GAAG,qBAAqB;IAMhC,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,MAAM;QACnB,aAAa,EAAE,QAAQ;KACxB,CAAC;AACJ,CAAC;AAGD,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,IAAuB,EACvB,OAAiC,EACjC,OAA+B,EAC/B,UAAwB,KAAK;IAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE;QAClC,GAAG,OAAO;QACV,qEAAqE;QACrE,iEAAiE;QACjE,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,4EAA4E;QAC5E,mEAAmE;QACnE,yEAAyE;QACzE,4EAA4E;QAC5E,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CAAmC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1B,4EAA4E;IAC5E,wEAAwE;IACxE,4CAA4C;IAC5C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE;QACtD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,iBAA0C,EAC1C,cAAsC;IAEtC,IAAI,iBAAiB;QAAE,MAAM,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAyB;IAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAA0B;IAC/D,MAAM,EACJ,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAC5E,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EACpG,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GACnF,GAAG,IAAI,CAAC;IACT,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,+EAA+E;IAC/E,0EAA0E;IAC1E,wEAAwE;IACxE,0FAA0F;IAC1F,+EAA+E;IAC/E,wEAAwE;IACxE,MAAM,gBAAgB,GAAG,MAAM,0BAA0B,CACvD,OAAO,EACP,MAAM,EACN,gBAAgB,CACjB,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,gBAAgB,CAAC,OAAO;QACzC,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,QAAQ,EAAE,qBAAqB,EAAE;QAC1D,CAAC,CAAC,MAAM,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3D,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,cAAc,CAAC;QACxE,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,qBAAqB,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,wCAAwC,SAAS,MAAM,QAAQ,MAAM,MAAM,EAAE,CAAC,CAAC;QAC7F,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;YAC9B,GAAG,+BAA+B,CAAC,MAAM,EAAE,QAAQ,CAAC;YACpD,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACnC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,0DAA0D,EAAG,SAAmB,CAAC,OAAO,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QACvB,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACjC,SAAS,CAAC,KAAK,GAAG,YAAY,CAAC;QAC/B,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,yEAAyE;IACzE,wEAAwE;IACxE,4DAA4D;IAC5D,MAAM,UAAU,GAAG,CAAC,gBAAgB,EAAE,WAAW,IAAI,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,8EAA8E;IAC9E,8EAA8E;IAC9E,2EAA2E;IAC3E,iEAAiE;IACjE,MAAM,UAAU,GAAG,cAAc,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtF,8EAA8E;IAC9E,uDAAuD;IACvD,MAAM,QAAQ,GAAG,4BAA4B,CAAC,MAAM,EAAE;QACpD,KAAK,EAAE,MAAM,CAAC,cAAc;QAC5B,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,UAAU;KAClB,CAAC,CAAC;IACH,kFAAkF;IAClF,wFAAwF;IACxF,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjE,6EAA6E;IAC7E,6EAA6E;IAC7E,6EAA6E;IAC7E,IAAI,cAAc,EAAE,CAAC;QACnB,QAAQ,CAAC,UAAU,GAAG,cAAc,CAAC;QACrC,OAAO,CAAC,GAAG,CACT,wCAAwC,SAAS,cAAc,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK;YAChG,GAAG,cAAc,EAAE;YACnB,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACtD,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,+EAA+E;IAC/E,gFAAgF;IAChF,6EAA6E;IAC7E,6CAA6C;IAC7C,IAAI,kBAAkB,EAAE,CAAC;QACvB,QAAQ,CAAC,wBAAwB,CAAC,GAAG,kBAAkB,CAAC;IAC1D,CAAC;IAED,4EAA4E;IAC5E,yEAAyE;IACzE,uEAAuE;IACvE,KAAK,sBAAsB,CAAC;QAC1B,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,OAAO;QACP,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,gBAAgB;KAC3B,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;QAC9B,MAAM,EAAE,UAAU;QAClB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,WAAW,EAAE,IAAI,CAAC,UAAU;QAC5B,WAAW,EAAE,IAAI,CAAC,UAAU;KAC7B,CAAC,CAAC;IAEH,oDAAoD;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,8CAA8C,SAAS,IAAI,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YAClG,mEAAmE;YACnE,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;gBAC9B,GAAG,2BAA2B,EAAE;gBAChC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC,kEAAkE,EAAG,SAAmB,CAAC,OAAO,CAAC,CAAC;YACjH,CAAC,CAAC,CAAC;YACH,qBAAqB,CAAC,SAAS,CAAC,CAAC;YACjC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,IAAI,YAAoB,CAAC;IACzB,IAAI,SAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE;YACvC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC;YACvC,IAAI;YACJ,YAAY;SACb,CAAC,CAAC;QACH,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,uBAAuB,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,wCAAwC,SAAS,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACpF,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;gBAC9B,GAAG,+BAA+B,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC/C,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC,kEAAkE,EAAG,SAAmB,CAAC,OAAO,CAAC,CAAC;YACjH,CAAC,CAAC,CAAC;YACH,IAAI,QAAQ;gBAAE,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5C,qBAAqB,CAAC,SAAS,CAAC,CAAC;YACjC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,8BAA8B;IAC9B,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,iBAAiB,GAA4B,IAAI,CAAC;IACtD,IAAI,0BAA0B,GAAyE,IAAI,CAAC;IAC5G,MAAM,kBAAkB,GAAG,CAAC,GAAU,EAAQ,EAAE;QAC9C,IAAI,mBAAmB;YAAE,OAAO;QAChC,mBAAmB,GAAG,IAAI,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,mCAAmC,SAAS,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACnF,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAE/B,MAAM,gBAAgB,GAAI,GAA6B,CAAC,IAAI,KAAK,QAAQ;YACvE,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,iBAAiB,QAAQ,EAAE,mBAAmB,GAAG,CAAC,OAAO,EAAE;YACnF,CAAC,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC;QACpC,KAAK,+BAA+B,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,SAAS,CACnE,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;YAC9B,MAAM,EAAE,QAAQ;YAChB,WAAW,EAAE,gBAAgB;YAC7B,aAAa,EAAG,GAA6B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO;YACjG,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACnC,CAAC,EACF,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,sBAAsB,EAAE,CACrE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACrB,OAAO,CAAC,IAAI,CAAC,0DAA0D,EAAG,SAAmB,CAAC,OAAO,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;QAEH,0BAA0B,EAAE,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QACvB,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACjC,SAAS,CAAC,KAAK,GAAG,YAAY,CAAC;QAC/B,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,kBAAkB,CAAC,YAAY,EAAE,SAAS,EAAE;QACvD,GAAG,EAAE,YAAY;QACjB,GAAG,EAAE,QAAQ;KACd,EAAE,kBAAkB,CAAC,CAAC;IAEvB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC;IACrC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,KAAM,CAAC;IAClC,SAAS,CAAC,KAAK,GAAG,WAAW,CAAC;IAE9B,8EAA8E;IAC9E,0EAA0E;IAC1E,yEAAyE;IACzE,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;QACzB,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,8EAA8E;IAC9E,MAAM,EAAE,kBAAkB,EAAE,eAAe,EAAE,GAAG,oBAAoB,CAAC;QACnE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI;KAC1E,CAAC,CAAC;IACH,0BAA0B,GAAG,kBAAkB,CAAC;IAEhD,4EAA4E;IAC5E,+EAA+E;IAC/E,iCAAiC;IACjC,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACjC,IAAI,CAAC,KAAM,CAAC,GAAG,EAAE,CAAC;QAClB,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,4BAA4B;IAC5B,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE;QAC5C,MAAM,EAAE,SAAS;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;IACH,MAAM,iBAAiB,CAAC;IAExB,OAAO,CAAC,GAAG,CAAC,2CAA2C,SAAS,WAAW,IAAI,CAAC,GAAG,cAAc,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;IAEhH,yDAAyD;IACzD,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QACzC,OAAO,CAAC,GAAG,CACT,mCAAmC,SAAS,0BAA0B;YACtE,GAAG,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAC5D,CAAC;QACF,qBAAqB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAC3H,OAAO,CAAC,IAAI,CACV,wDAAwD,SAAS,IAAI,EACpE,GAAa,CAAC,OAAO,CACvB,CAAC;YACF,gDAAgD;YAChD,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAChC,yEAAyE;QACzE,kEAAkE;QAClE,IAAI,mBAAmB;YAAE,OAAO;QAChC,sBAAsB,CAAC;YACrB,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS;YACrD,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,kBAAkB;YAC5D,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc;SACxD,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,uDAAuD,SAAS,IAAI,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC9G,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AAEL,CAAC"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Prompt-assembly seam for the focus-team spawn path.
3
+ *
4
+ * Extracted verbatim from focus-executor.ts (behavior-preserving): the pure
5
+ * prompt-context factory, the composed team-lead prompt builder, the stdin
6
+ * message selector (fresh prompt vs resume-delta vs scoping directive), and the
7
+ * scoping helpers they depend on. focus-executor.ts re-exports this surface for
8
+ * backward compatibility, so external importers keep resolving these symbols
9
+ * from '../focus-executor.js'.
10
+ *
11
+ * Cycle rule: this module must NOT import from '../focus-executor.js'.
12
+ */
13
+ import type { DaemonConfig, AgentRole, FocusTeamState, PipelineConfig } from '../types.js';
14
+ import { getFocusDeliveries, getFocusIssues } from '../queries/focuses.js';
15
+ import { type FocusTeamPromptContext } from '../team-prompt-base.js';
16
+ import { resolveLineageSpec } from '../session-lineage.js';
17
+ import type { SpawnContext } from './shared.js';
18
+ /**
19
+ * Phase C input: assemble the FocusTeamPromptContext threaded into both the
20
+ * directive and legacy prompt builders. Pure factory -- byte-identical to the
21
+ * original inline object literal; extracted so the orchestrator reads as ordered
22
+ * phase calls rather than inlining the context shape.
23
+ */
24
+ export declare function buildFocusPromptContext(args: {
25
+ config: DaemonConfig;
26
+ focusId: string;
27
+ focusName: string;
28
+ focusDescription: string | null;
29
+ deliveries: Awaited<ReturnType<typeof getFocusDeliveries>>;
30
+ issues: Awaited<ReturnType<typeof getFocusIssues>>;
31
+ executionConfig: FocusTeamState['executionConfig'];
32
+ pipelineConfig: PipelineConfig | null;
33
+ productContextDocs: SpawnContext['productContextDocs'];
34
+ deploymentProfileSnapshot: SpawnContext['deploymentProfileSnapshot'];
35
+ readOnly: boolean;
36
+ loopContext: string;
37
+ reviewFiledOpenCount: number;
38
+ engineId: string;
39
+ }): FocusTeamPromptContext;
40
+ /**
41
+ * Phase C: compose the final team-lead message -- role framework + remediation
42
+ * framing + directive body (or the legacy full focus prompt), then the PRD
43
+ * milestone push-down appended last so it reaches BOTH prompt paths. Pure +
44
+ * testable. Byte-identical to the original inline composition.
45
+ */
46
+ export declare function buildSpawnPrompt(args: {
47
+ role: AgentRole;
48
+ promptContext: FocusTeamPromptContext;
49
+ useLegacyFullPrompt: boolean;
50
+ directiveBody: string | null;
51
+ prdMilestoneContext: string;
52
+ /**
53
+ * True when this spawn is a review-lineage pass (reviewing stage). The
54
+ * outcome-stamping obligation is appended ONLY for review passes -- a coding
55
+ * team has nothing to stamp.
56
+ */
57
+ isReviewPass?: boolean;
58
+ /**
59
+ * The review session's Telora agent_sessions.id (from createTeamSession).
60
+ * Threaded into the outcome-stamping section so the review agent receives the
61
+ * exact id product-api validates against -- no reverse-engineering it from the
62
+ * Claude --resume session id. Only emitted on review passes; ignored otherwise.
63
+ */
64
+ agentSessionId?: string;
65
+ }): string;
66
+ /**
67
+ * Phase: choose the stdin message. A fresh spawn sends the full composed prompt;
68
+ * a resume sends an incremental delta (git diff + prior findings to verify) since
69
+ * the resumed session already holds its role + accumulated context (INJ-D).
70
+ *
71
+ * The scoping case is the one exception that overrides the fresh-vs-resume split:
72
+ * when a NON-read_only (executable) focus has queued deliveries carrying only
73
+ * Context Group issues and zero Task/Bug issues, this returns the role framework
74
+ * PLUS `buildQueuedDeliveryScopingMessage` REGARDLESS of resumeId. The caller pairs
75
+ * this with `resolveScopingSpawnResume`, which forces the spawn fresh (resumeId
76
+ * null) so the directive lands on a new session instead of no-opping a concluded
77
+ * one. Because the fresh session holds no accumulated context, the role framework
78
+ * (identity + Scoping Mandate + status-update rules) is prepended here; only the
79
+ * audit/kickoff DIRECTIVE body carried in `prompt` is dropped, per AC. `readOnlyFocus`
80
+ * focuses are discovery-only (audit-playbook origin): their CG-only deliveries are
81
+ * INTENTIONALLY unscoped, so they are never driven into scoping here --
82
+ * delivery-lifecycle terminalizes them instead.
83
+ */
84
+ export declare function buildSpawnMessage(args: {
85
+ prompt: string;
86
+ resumeId: string | null;
87
+ readOnlyFocus: boolean;
88
+ /**
89
+ * The team-lead role + context, used to rebuild JUST the role-framework prefix
90
+ * (`buildRoleFrameworkPrompt`, WITHOUT the audit/kickoff directive body) for the
91
+ * forced-fresh scoping message. The scoping spawn lands on a NEW session with no
92
+ * accumulated context, and stdin is that session's only first-turn instruction
93
+ * (there is no --system-prompt channel and the worktree CLAUDE.md carries no role
94
+ * framework), so the scoping directive must carry the role framework itself or
95
+ * the fresh team lead has no identity / status-update contract / scoping mandate.
96
+ */
97
+ role: AgentRole;
98
+ promptContext: FocusTeamPromptContext;
99
+ spawnSpec: ReturnType<typeof resolveLineageSpec>;
100
+ config: DaemonConfig;
101
+ focusId: string;
102
+ focusName: string;
103
+ deliveries: Awaited<ReturnType<typeof getFocusDeliveries>>;
104
+ issues: Awaited<ReturnType<typeof getFocusIssues>>;
105
+ worktreePath: string;
106
+ priorFindings: Awaited<ReturnType<typeof getFocusIssues>>;
107
+ }): Promise<string>;
108
+ /**
109
+ * Decide whether this spawn must be forced fresh to deliver a scoping directive,
110
+ * and return the resume id the spawn should actually use.
111
+ *
112
+ * The wedge this closes: a queued delivery carrying only Context Group issues and
113
+ * zero Task/Bug issues can never cross the queued->coding gate. The daemon
114
+ * re-spawns the focus every poll, but the resume lands on a session that already
115
+ * considers the audit "done" and no-ops in one turn. The fix is to force the
116
+ * scoping spawn FRESH (resumeId null) so `buildQueuedDeliveryScopingMessage`
117
+ * primes a new session as its first instruction rather than a resume-delta a
118
+ * concluded session ignores.
119
+ *
120
+ * Only executable focuses are driven into scoping. A `readOnly` (discovery-only,
121
+ * audit-playbook) focus's CG-only deliveries are intentionally unscoped, so this
122
+ * never forces them fresh -- their resume id passes through unchanged and the
123
+ * delivery reaches a terminal state via the reconciler's discovery-only path.
124
+ *
125
+ * Pure and exported so the fresh-spawn contract is unit-testable without a live
126
+ * spawn.
127
+ */
128
+ export declare function resolveScopingSpawnResume(args: {
129
+ readOnly: boolean;
130
+ deliveries: Awaited<ReturnType<typeof getFocusDeliveries>>;
131
+ issues: Awaited<ReturnType<typeof getFocusIssues>>;
132
+ resumeId: string | null;
133
+ }): {
134
+ resumeId: string | null;
135
+ isScopingSpawn: boolean;
136
+ };
137
+ export declare function findQueuedDeliveriesWithoutTaskIssues(deliveries: Awaited<ReturnType<typeof getFocusDeliveries>>, issues: Awaited<ReturnType<typeof getFocusIssues>>): Awaited<ReturnType<typeof getFocusDeliveries>>;
138
+ export declare function buildQueuedDeliveryScopingMessage(args: {
139
+ lineage: string;
140
+ focusName: string;
141
+ deliveries: Awaited<ReturnType<typeof getFocusDeliveries>>;
142
+ }): string;
143
+ //# sourceMappingURL=prompt-assembly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-assembly.d.ts","sourceRoot":"","sources":["../../src/spawn/prompt-assembly.ts"],"names":[],"mappings":"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"}