@overdeck/desktop 0.46.0 → 0.47.1

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 (388) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +4 -1
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-CCwFGICj.js → acceptance-criteria-Cd7ZGZCq.js} +2 -2
  4. package/server/{advancing-selfheal-De1L-Sb4.js → advancing-selfheal-DieFp3qi.js} +6 -6
  5. package/server/{agent-gc-CBULruzm.js → agent-gc-BMcgTDl7.js} +5 -5
  6. package/server/{agent-state-VQk8fY9F.js → agent-state-DyZJia9f.js} +1 -1
  7. package/server/{agent-state-service-BlnSkRFA.js → agent-state-service-BOzQhLjU.js} +15 -9
  8. package/server/agent-state-service-DFO6qvHp.js +2 -0
  9. package/server/agent-state-source-Ca_zCaII.js +21 -0
  10. package/server/{agents-C5rWYhb6.js → agents-CtACUuVG.js} +23 -16
  11. package/server/{agents-BKKkxKgK.js → agents-Dnn4XgdB.js} +1 -1
  12. package/server/archive-planning-BHCd_eL5.js +2 -0
  13. package/server/{archive-planning-C0lAbNB_.js → archive-planning-Binfb99i.js} +10 -6
  14. package/server/{artifact-index-jobs-ug6ZxIP5.js → artifact-index-jobs-Jn7BGOtV.js} +2 -2
  15. package/server/{assemble-DnffNpOo.js → assemble-DsqK9OAq.js} +2 -2
  16. package/server/{tmux-dedup-DbN6MGzM.js → auto-spawn-consent-BooqhC3L.js} +262 -13
  17. package/server/{backlog-auto-trigger-Dh-i9PQf.js → backlog-auto-trigger-BADGPxov.js} +3 -3
  18. package/server/{behavior-CfIg6pKp.js → behavior-B7biGtFT.js} +2 -2
  19. package/server/boot-reconciled-stop-events-bQUzU8ns.js +44 -0
  20. package/server/{bridge-pool-patrol-CUFmjVDN.js → bridge-pool-patrol-DsPj6F7t.js} +1 -1
  21. package/server/{briefing-freshness-DHmCSLar.js → briefing-freshness-CUerZqWd.js} +2 -2
  22. package/server/{build-info-CuFfxZxp.js → build-info-D0q_i8WM.js} +3 -3
  23. package/server/{build-info-BP160gU7.js → build-info-Du74MKiP.js} +1 -1
  24. package/server/{checkpoint-manager-Dxh0FYsv.js → checkpoint-manager-Cu-R5Uzg.js} +1 -1
  25. package/server/{checkpoint-manager-DEWD82qK.js → checkpoint-manager-R5tnaxEY.js} +2 -2
  26. package/server/checkpoint-worker.js +1 -1
  27. package/server/{checkpoints-CZvbtLnr.js → checkpoints-DYtLu-PB.js} +2 -2
  28. package/server/{checkpoints-DMTgXuLG.js → checkpoints-wF84ubZ8.js} +1 -1
  29. package/server/{claude-hooks-provision-fvy4RD2b.js → claude-hooks-provision-DXI3Wqlm.js} +2 -2
  30. package/server/{claude-hooks-provision-CN-xo-do.js → claude-hooks-provision-UKxCeOyj.js} +1 -1
  31. package/server/{claude-permissions-CN0cSCPp.js → claude-permissions-DYVLnX9t.js} +2 -2
  32. package/server/{claude-settings-overlay-CJn35FHQ.js → claude-settings-overlay-DsbpIq2d.js} +2 -2
  33. package/server/{claude-settings-overlay-Dabi9slj.js → claude-settings-overlay-DxP2F_gY.js} +1 -1
  34. package/server/cli-D6mRfUE6.js +3 -0
  35. package/server/{cli-oCWYA1pE.js → cli-DzRKxxP_.js} +9 -9
  36. package/server/{cliproxy-C8mB3KuB.js → cliproxy-CG4meRFc.js} +2 -2
  37. package/server/{cliproxy-PGwTX_o8.js → cliproxy-Cwzw39yN.js} +1 -1
  38. package/server/{close-issue-D5MF5GqF.js → close-issue-BX1bATJy.js} +5 -5
  39. package/server/{closed-issue-reaper-CJ24u0Zt.js → closed-issue-reaper-DvnTSN6a.js} +1 -1
  40. package/server/{closed-issue-reaper-Cltx86x5.js → closed-issue-reaper-hLt0W86J.js} +62 -12
  41. package/server/{codex-Drlf5Xhf.js → codex-BYwi1uyW.js} +6 -6
  42. package/server/{codex-parser-DpB89Vqa.js → codex-parser-Poyz29GE.js} +2 -2
  43. package/server/{codex-BdEsUFWh.js → codex-rnJN3v3_.js} +1 -1
  44. package/server/{compaction-continuation-K2AxQX4H.js → compaction-continuation-DtMfHN0f.js} +3 -3
  45. package/server/{config-Dr3pW6w6.js → config-CX4vk1CV.js} +2 -2
  46. package/server/{config-DV-grfQc.js → config-R793W0yA.js} +1 -1
  47. package/server/{config-B2IMcBxx.js → config-ktAVnp4s.js} +2 -2
  48. package/server/{config-yaml-CmOPzmBb.js → config-yaml-CxdwhAIA.js} +10 -2
  49. package/server/{conflict-gate-B9cN3SBi.js → conflict-gate-BNv6UolH.js} +59 -13
  50. package/server/conflict-gate-BSTlwCtF.js +3 -0
  51. package/server/{context-layers-D6LZo3l1.js → context-layers-DCdaGsRG.js} +2 -2
  52. package/server/{context-layers-dR5YxHYB.js → context-layers-DlWsDiRF.js} +3 -3
  53. package/server/{control-settings-C7DUehE1.js → control-settings-qYYHrIqy.js} +13 -6
  54. package/server/{conversation-compaction-Dj4FAKoZ.js → conversation-compaction-BxUKObHb.js} +1 -1
  55. package/server/{conversation-compaction-BoqdDXWF.js → conversation-compaction-CXQrN3I_.js} +8 -8
  56. package/server/{conversation-service-BCxl4f8Z.js → conversation-service-CDnQ3ayN.js} +1 -1
  57. package/server/{conversation-service-5aCnq1zR.js → conversation-service-CZiUE8Uw.js} +8 -7
  58. package/server/{conversations-BUpYsOZg.js → conversations-D7lR670u.js} +4 -4
  59. package/server/{conversations-C34dyIb9.js → conversations-DXl5YTf4.js} +1 -1
  60. package/server/{cost-Bgcub5kW.js → cost-Aat8HfO_.js} +2 -2
  61. package/server/{cost-CvxRrucd.js → cost-CWvN9FP2.js} +3 -3
  62. package/server/{cost-sync-Dv3LUaNW.js → cost-sync-DiUBXwl6.js} +3 -3
  63. package/server/{dag-ombYYt4s.js → dag-5QlmH0oC.js} +2 -2
  64. package/server/{dangerous-git-ops-BcJPC5Rr.js → dangerous-git-ops-DWX6Og8c.js} +1 -1
  65. package/server/dashboard-db-worker.js +7 -7
  66. package/server/{deacon-hi9KLPLT.js → deacon-B1LD5cJU.js} +741 -211
  67. package/server/{deacon-DrXqT9LQ.js → deacon-PW_bg4uL.js} +3 -3
  68. package/server/{deacon-nudge-log-BNBebzeL.js → deacon-nudge-log-DPHsO14z.js} +3 -3
  69. package/server/{deacon-pending-lifecycle-Cpk0k7Hi.js → deacon-pending-lifecycle-2ZflPxgo.js} +3 -3
  70. package/server/deacon-swarm-BkKR7SXu.js +2 -0
  71. package/server/{deacon-swarm-DBxUaO-A.js → deacon-swarm-DwGUgSVp.js} +15 -14
  72. package/server/deacon.js +8 -8
  73. package/server/{dead-end-trip-CQcP70ND.js → dead-end-trip-B06RFIr2.js} +3 -3
  74. package/server/{delivery-Da0zEMY4.js → delivery-C2M73sBg.js} +1 -1
  75. package/server/{deploy-patrol-Df-Tmaq0.js → deploy-patrol-BNjeCL8u.js} +8 -8
  76. package/server/{deploy-queue-UjKGYsDe.js → deploy-queue-CKT_Ia9p.js} +2 -2
  77. package/server/{deploy-queue-9SrhZR63.js → deploy-queue-DMMYhFC8.js} +1 -1
  78. package/server/{deploy-window-rpqpWqHA.js → deploy-window-DC8lze3d.js} +6 -6
  79. package/server/{deploy-window-jOiPRHL0.js → deploy-window-D_AimdNN.js} +1 -1
  80. package/server/{dev-supervisor-CC46Ig8q.js → dev-supervisor-C4F0vbno.js} +2 -2
  81. package/server/{devcontainer-renderer-68CSCRnu.js → devcontainer-renderer-66sqMQIi.js} +3 -3
  82. package/server/{dist-CJy72uEg.js → dist-C5FT9lTG.js} +1 -1
  83. package/server/dist-qcf9gAP0.js +3 -0
  84. package/server/{dist-src-Bik83hFi.js → dist-src-B-AlGWSl.js} +1 -1
  85. package/server/{docker-BMVTSFL5.js → docker-BxrFhTZ_.js} +1 -1
  86. package/server/{docker-Dam7mbIB.js → docker-CoAT8R0J.js} +2 -2
  87. package/server/{dod-Dar-yheg.js → dod-Bg6wsKTV.js} +26 -5
  88. package/server/durable-review-pipeline-D_DcfIGP.js +3 -0
  89. package/server/{durable-review-pipeline-CGZ5QBxh.js → durable-review-pipeline-HkAgnx0L.js} +5 -2
  90. package/server/{ensure-devcontainer-C98V8yW-.js → ensure-devcontainer-Bg5HJAcO.js} +1 -1
  91. package/server/{ensure-devcontainer-B057YA81.js → ensure-devcontainer-DTxChVuA.js} +4 -4
  92. package/server/{esm-shims-Br9BPdkR.js → esm-shims-CaBWIR7f.js} +1 -1
  93. package/server/{event-store-ELqkVOn0.js → event-store-5UKzh9Jf.js} +1 -1
  94. package/server/{event-store-zY5MJHgF.js → event-store-CrHcVC5_.js} +3 -3
  95. package/server/{events-D6pyqhzM.js → events-ChEFB7Jp.js} +1 -1
  96. package/server/{events-D9PR1IC0.js → events-DhRN-6vM.js} +3 -3
  97. package/server/{factory-CRoOpGsF.js → factory-BezSPaTd.js} +5 -5
  98. package/server/{feature-registry-population--YUXU999.js → feature-registry-population-DhswNiXx.js} +4 -4
  99. package/server/{feature-registry-storage-BORBTo0y.js → feature-registry-storage-CUVNpAso.js} +2 -2
  100. package/server/{features--nFkJY8v.js → features-B2CfNPFw.js} +2 -2
  101. package/server/{feedback-target-C0ZzyHvU.js → feedback-target-CMrEAoeA.js} +1 -1
  102. package/server/{feedback-target-Dt9BsapX.js → feedback-target-VBr9gKgX.js} +18 -7
  103. package/server/{feedback-writer-D1fm-5Z8.js → feedback-writer-CY91ckuw.js} +1 -1
  104. package/server/{feedback-writer-BG0RUZiu.js → feedback-writer-xpFgU632.js} +5 -5
  105. package/server/{flywheel-BiT3odRb.js → flywheel-CTVY3yCG.js} +38 -19
  106. package/server/{flywheel-CLVB55Be.js → flywheel-DQqsSm7P.js} +14 -14
  107. package/server/{flywheel-BekukH4i.js → flywheel-DsICCjTR.js} +1 -1
  108. package/server/{flywheel-merge-order-BKw9o6ku.js → flywheel-merge-order-C-TI4JGu.js} +1 -1
  109. package/server/{flywheel-merge-order-BJv1DZz1.js → flywheel-merge-order-CMGz-imq.js} +7 -7
  110. package/server/forge-D647IMNa.js +3 -0
  111. package/server/{forge-CZbSg6Ds.js → forge-RTNqJe6a.js} +2 -2
  112. package/server/{from-D_4_dk7i.js → from-DxGcivc9.js} +1 -1
  113. package/server/fs-lock-Bre3sGoz.js +130 -0
  114. package/server/{fts-db-BeOomFa-.js → fts-db-wROfFfje.js} +2 -2
  115. package/server/{fts-operations-BdewJ_g9.js → fts-operations-BuTdlZFA.js} +2 -2
  116. package/server/{git-utils-CI6cwyyC.js → git-utils-CedsVume.js} +1 -1
  117. package/server/{git-utils-ameCgDdy.js → git-utils-DtdoEXJk.js} +4 -4
  118. package/server/{github-app-DtAsvwzK.js → github-app-DIE8BkHI.js} +1 -1
  119. package/server/{github-app-CQ1Lo6LA.js → github-app-gVnZcP9B.js} +2 -2
  120. package/server/{github-client-BfyDxuRN.js → github-client-BrAC6ELh.js} +3 -3
  121. package/server/{github-client-Cj0yl_07.js → github-client-CBOkvBUl.js} +1 -1
  122. package/server/{github-pr-lookup-BDq6Wznz.js → github-pr-lookup-CgMULTPf.js} +2 -2
  123. package/server/{harness-binary-DqkftwTb.js → harness-binary-CnBHpd57.js} +2 -2
  124. package/server/{harness-resolve-CqMqM1Mb.js → harness-resolve-BVj6sI8m.js} +4 -4
  125. package/server/{health-events-CazRxJUS.js → health-events-BBWO_Dh9.js} +2 -2
  126. package/server/{health-events-_xfTaOUs.js → health-events-Der6bOkm.js} +1 -1
  127. package/server/{hooks-BnJsxlSq.js → hooks-BJNal-bs.js} +1 -1
  128. package/server/{hooks-BO3QT1sn.js → hooks-BOavco-e.js} +2 -2
  129. package/server/{hume-CDYJxqx-.js → hume-DBocJFkA.js} +2 -2
  130. package/server/hume-DtWN8oV5.js +3 -0
  131. package/server/{idle-stack-reaper-BYqERdkE.js → idle-stack-reaper-CyGxXOfC.js} +1 -1
  132. package/server/{idle-stack-reaper-CnGx_PO_.js → idle-stack-reaper-DQFh8rDh.js} +2 -2
  133. package/server/{in-flight-guard-Bq3epG58.js → in-flight-guard-nXEKoxI7.js} +1 -1
  134. package/server/{infra-BjuxvjdS.js → infra-BDQDRopn.js} +15 -4
  135. package/server/{injection-UCf8EsjX.js → injection-CCopdUKz.js} +7 -7
  136. package/server/{injection-DZxlV2al.js → injection-DfFFEMKL.js} +1 -1
  137. package/server/inspect-agent-CPqXI81t.js +2 -0
  138. package/server/{inspect-agent-6kylZnrm.js → inspect-agent-FCDlNT_i.js} +12 -12
  139. package/server/{internal-token-DvMTQSOS.js → internal-token-BG6yQKNL.js} +2 -2
  140. package/server/{internal-token-M9omeXM1.js → internal-token-BJZa40Ld.js} +1 -1
  141. package/server/{io-VHvc0Ssp.js → io-C0NV7y6C.js} +4 -4
  142. package/server/{issue-closed-B6KJkmHZ.js → issue-closed-CNNGbhWm.js} +8 -8
  143. package/server/{issue-lifecycle-C4Zj0WmE.js → issue-lifecycle-BXfzxFCD.js} +29 -23
  144. package/server/{issue-lifecycle-9gk3fnXN.js → issue-lifecycle-DSH0GpWC.js} +1 -1
  145. package/server/{issue-service-singleton-DmCh7EHj.js → issue-service-singleton-F3A5VP6M.js} +10 -10
  146. package/server/{issue-service-singleton-PMx8F1jr.js → issue-service-singleton-lwFJ4dHk.js} +1 -1
  147. package/server/{issues-CgnQ1OGQ.js → issues-DA-U_MpR.js} +2 -2
  148. package/server/{jsonl-parser-DJOH_O-w.js → jsonl-parser-BXiGANOh.js} +3 -3
  149. package/server/{label-cleanup-Dv7AV_R1.js → label-cleanup-BnxRk0Eo.js} +3 -3
  150. package/server/{lifecycle-CTdOWYMi.js → lifecycle-DOgGnpIv.js} +2 -2
  151. package/server/{lifecycle-DDN8ApVY.js → lifecycle-Di48-w4x.js} +6 -6
  152. package/server/{lifecycle-io-D-lGdzK3.js → lifecycle-io-1XSeczTr.js} +5 -5
  153. package/server/{lifecycle-io-D_zTLvP1.js → lifecycle-io-eVG6v_8-.js} +1 -1
  154. package/server/{linear-client-BQU36QqE.js → linear-client-CYZRrcjp.js} +3 -3
  155. package/server/{linear-client-CY4O_Tu3.js → linear-client-CvGo9n7M.js} +1 -1
  156. package/server/{linear-mcp-auth-BnU4TYfY.js → linear-mcp-auth-Cp0XaP96.js} +5 -5
  157. package/server/{linear-mcp-auth-NYBq_oHZ.js → linear-mcp-auth-DoJnjdPZ.js} +1 -1
  158. package/server/memory-fts-worker.js +1 -1
  159. package/server/{merge-Bpx4jjht.js → merge-DO14mOr3.js} +3 -3
  160. package/server/{merge-idOG--29.js → merge-ZF99ig6A.js} +1 -1
  161. package/server/{merge-agent-DrXa1CpW.js → merge-agent-C1-9zbP_.js} +1 -1
  162. package/server/{merge-agent-DdMVSV2Y.js → merge-agent-gpiRkcvj.js} +31 -31
  163. package/server/{merge-batch-C5q1c1GX.js → merge-batch-C11ocNkO.js} +1 -1
  164. package/server/{merge-completeness-BMm8tMyZ.js → merge-completeness-BUzPZy0E.js} +4 -4
  165. package/server/{merge-completeness-D0ljXbk3.js → merge-completeness-CghMbyX7.js} +1 -1
  166. package/server/merge-ops-7QqziXAh.js +2 -0
  167. package/server/merge-rebase-B4pgzvQJ.js +2 -0
  168. package/server/{merge-rebase-xLnMlw5h.js → merge-rebase-iwlUzZjr.js} +2 -2
  169. package/server/{merge-set-DzsOTBg5.js → merge-set-BymrheTj.js} +1 -1
  170. package/server/{merge-set-DH7ot3yz.js → merge-set-Dbnx4chw.js} +4 -4
  171. package/server/{merge-sync-CQ-LgZ1_.js → merge-sync-CM978zez.js} +7 -4
  172. package/server/merge-sync-CqEtqjI2.js +3 -0
  173. package/server/{merge-train-DTEMyIu4.js → merge-train-DvLcAn1G.js} +4 -4
  174. package/server/{merge-train-deps-CNPJzepw.js → merge-train-deps-Cl_kcRbO.js} +21 -15
  175. package/server/{merge-verification-x3JO8Dtz.js → merge-verification-c9Y9mllw.js} +6 -6
  176. package/server/{merged-docker-cleanup-worker-CTpC27Bs.js → merged-docker-cleanup-worker-CGiDOdv8.js} +3 -3
  177. package/server/{merged-docker-cleanup-worker-Cdi9apm-.js → merged-docker-cleanup-worker-DgsLOx3E.js} +1 -1
  178. package/server/{multipart-parser-IMSBfePV.js → multipart-parser-D0twwRjz.js} +2 -2
  179. package/server/{no-resume-mode-C5ULAXwO.js → no-resume-mode-DZvP0M_S.js} +1 -1
  180. package/server/node_modules/.package-lock.json +4 -4
  181. package/server/node_modules/@types/node/README.md +1 -1
  182. package/server/node_modules/@types/node/crypto.d.ts +1 -1
  183. package/server/node_modules/@types/node/package.json +2 -2
  184. package/server/{orphan-proposed-reconciler-CWmOdM9-.js → orphan-proposed-reconciler-6r2OEfYd.js} +1 -1
  185. package/server/{orphan-proposed-reconciler-Dg6U4ADZ.js → orphan-proposed-reconciler-DtQP6oE_.js} +230 -31
  186. package/server/package-lock.json +5 -5
  187. package/server/package.json +1 -1
  188. package/server/{pan-dir-ubraCiUg.js → pan-dir-DAOb1V2-.js} +4 -4
  189. package/server/{paths-cXmOwSbh.js → paths-DuATV5iE.js} +2 -2
  190. package/server/{pending-lifecycle-claim-DEteYdS9.js → pending-lifecycle-claim-DQUHIDfX.js} +2 -2
  191. package/server/persistent-logger-CBj016pT.js +57 -0
  192. package/server/{pickup-D8xtG1J2.js → pickup-zXZl5lQI.js} +4 -3
  193. package/server/{pipeline-membership-CrAPLYtf.js → pipeline-membership-B2yUcBz7.js} +1 -1
  194. package/server/{pipeline-membership-BGSvkT2M.js → pipeline-membership-DHOXmvba.js} +1 -1
  195. package/server/{pipeline-membership-gather-CET40frr.js → pipeline-membership-gather-BIcJ-N0W.js} +114 -9
  196. package/server/{pipeline-membership-gather-DTfcgxLl.js → pipeline-membership-gather-OkLXuvxR.js} +1 -1
  197. package/server/{pipeline-notifier-ImNXknf0.js → pipeline-notifier-BmwrVKsO.js} +1 -1
  198. package/server/{pipeline-notifier-BuQ0e4hF.js → pipeline-notifier-CxMes51i.js} +2 -2
  199. package/server/{post-merge-lifecycle-worker-DbO10pum.js → post-merge-lifecycle-worker-3u_rA4R0.js} +3 -3
  200. package/server/{project-pipelines-Bim6bThI.js → project-pipelines-C3SPFJ38.js} +2 -2
  201. package/server/{project-repos-C0nuoBGv.js → project-repos-BOpBzkO6.js} +2 -2
  202. package/server/{project-repos-CRE6Ykow.js → project-repos-BgW4lcIa.js} +1 -1
  203. package/server/{projects-B03Wr-xc.js → projects-_n3Zui6K.js} +1 -1
  204. package/server/{prompts-BEx08AIu.js → prompts-B0TtboFm.js} +2 -2
  205. package/server/{providers-D7IluJe0.js → providers-BI1mOBQ4.js} +1 -1
  206. package/server/{providers-evXhiQeg.js → providers-O2smCvSz.js} +7 -7
  207. package/server/public/assets/{chunk-BO2N2NFS-D1s4-Sqp.js → chunk-BO2N2NFS-D_pGACYN.js} +4 -4
  208. package/server/public/assets/{diagram-OG6HWLK6-1gdMoSF7.js → diagram-OG6HWLK6-BO6fe3hH.js} +1 -1
  209. package/server/public/assets/{dist-DqDRYW6P.js → dist-5zingMiA.js} +3 -3
  210. package/server/public/assets/{dist-CxAOHbil.js → dist-CVxhbI2E.js} +1 -1
  211. package/server/public/assets/{ganttDiagram-6RSMTGT7-BYex-Ec7.js → ganttDiagram-6RSMTGT7-Bgj4A7kp.js} +1 -1
  212. package/server/public/assets/{highlighted-body-OFNGDK62-DlVkiG0S.js → highlighted-body-OFNGDK62-DNPK7_cm.js} +1 -1
  213. package/server/public/assets/{index-K0hAYCgV.js → index-DEpY-D1O.js} +148 -148
  214. package/server/public/assets/index-Ddkcz3WT.css +1 -0
  215. package/server/public/assets/{linear-B4cuEFmO.js → linear-BB0jQT16.js} +1 -1
  216. package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +1 -0
  217. package/server/public/assets/{pieDiagram-4H26LBE5-CBHNBIJQ.js → pieDiagram-4H26LBE5-DeGIzzpZ.js} +1 -1
  218. package/server/public/assets/{prod-CN2nHBvX.js → prod-XBLvikex.js} +4 -4
  219. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bom87VOQ.js → quadrantDiagram-W4KKPZXB-BV9SLeWz.js} +1 -1
  220. package/server/public/assets/{sankeyDiagram-5OEKKPKP-UrBeyLxk.js → sankeyDiagram-5OEKKPKP-Dwja0gj8.js} +1 -1
  221. package/server/public/assets/{xychartDiagram-2RQKCTM6-DhkbrIxR.js → xychartDiagram-2RQKCTM6-DCB4qvfw.js} +1 -1
  222. package/server/public/index.html +2 -2
  223. package/server/{pull-requests-DHWiKxo7.js → pull-requests-BonZ4WVG.js} +3 -3
  224. package/server/{pull-requests-Cv7LxzUN.js → pull-requests-DNcJUVWA.js} +1 -1
  225. package/server/{queries-DHJm7bTd.js → queries-DCX27GRr.js} +266 -155
  226. package/server/{rally-B71M9f4o.js → rally-Cxe7lKYX.js} +3 -3
  227. package/server/{rally-api-D5uXN08-.js → rally-api-Cp50exEi.js} +1 -1
  228. package/server/{rally-api-Dkqmok65.js → rally-api-CzkKenoi.js} +2 -2
  229. package/server/{rally-client-CxsA6ExK.js → rally-client-Bu3Cekkw.js} +1 -1
  230. package/server/{rally-client-Bfqm6XI4.js → rally-client-CyBBEDHu.js} +5 -5
  231. package/server/rally-x6ztTQo4.js +3 -0
  232. package/server/{reap-terminal-sessions-CvmwaqKv.js → reap-terminal-sessions-CtAhr6L0.js} +2 -2
  233. package/server/{reap-terminal-sessions-BQ23nriz.js → reap-terminal-sessions-DvFqQUnq.js} +2 -2
  234. package/server/{rebuild-stack-qeRqHZxH.js → rebuild-stack-BKYpIPDL.js} +2 -2
  235. package/server/{rebuild-stack-0EEYReVZ.js → rebuild-stack-hCQtprWC.js} +7 -7
  236. package/server/{reconstruct-cache-BbYFsqLa.js → reconstruct-cache-CF2avArx.js} +9 -8
  237. package/server/{record-CtroO946.js → record-BTwWhtBb.js} +1 -1
  238. package/server/{record-update-Z0QCxmMp.js → record-update-DaOKS7Wb.js} +5 -128
  239. package/server/{record-update-DH6dLJID.js → record-update-DhI7eySG.js} +1 -1
  240. package/server/{recovery-trip-eJe26h-f.js → recovery-trip-D-wM9EfB.js} +2 -2
  241. package/server/{release-engine-lPUp-MTd.js → release-engine-_eO3VFth.js} +5 -5
  242. package/server/{release-set-BwGeyZKX.js → release-set-vxgZwwZV.js} +3 -3
  243. package/server/{remote-BCd02Es1.js → remote-BienmcrZ.js} +3 -3
  244. package/server/{remote-CVGUhXMV.js → remote-CVPCc7Vy.js} +3 -3
  245. package/server/{remote-agents-C1bssi41.js → remote-agents-kwsEZvXu.js} +1 -1
  246. package/server/{remote-agents-C_VxssLU.js → remote-agents-kxraOCGT.js} +17 -8
  247. package/server/{remote-completion-DAB0P706.js → remote-completion-BtmZ42aP.js} +13 -13
  248. package/server/resume-DXIIfJNk.js +3 -0
  249. package/server/{review-agent-CHhI66UP.js → review-agent-CIRr0yYt.js} +31 -29
  250. package/server/{review-agent-CD4RCI0Y.js → review-agent-UpAM4DmT.js} +1 -1
  251. package/server/{review-artifacts-DSMRIfuJ.js → review-artifacts-BCODM9ww.js} +5 -5
  252. package/server/{review-context-oFuBbiEE.js → review-context-BBsNrDri.js} +9 -9
  253. package/server/{review-convoy-liveness-CpzrcJ5F.js → review-convoy-liveness-l06_LYCt.js} +2 -2
  254. package/server/review-status-CacDM78F.js +3 -0
  255. package/server/{review-status-yljtTd-q.js → review-status-CwhA9wmd.js} +329 -110
  256. package/server/{review-status-emit-CUExtHd5.js → review-status-emit-BPJwYcRy.js} +3 -3
  257. package/server/{review-status-enrichment-QV_hQkgS.js → review-status-enrichment-DvyZAbGR.js} +3 -3
  258. package/server/{review-status-source-ylw5QZUR.js → review-status-source-B70ekARK.js} +1 -1
  259. package/server/{review-status-source-CpvJnvnQ.js → review-status-source-DWnFE0b6.js} +1 -1
  260. package/server/{review-status-sync-NaWvI9Xf.js → review-status-sync-B0IS6Beh.js} +1 -1
  261. package/server/{review-status-sync-483sujRo.js → review-status-sync-h2CJX6ju.js} +11 -6
  262. package/server/{review-verdict-feedback-BPDn4li_.js → review-verdict-feedback-qRohbFG2.js} +1 -1
  263. package/server/{review-verdict-feedback-CELeUinh.js → review-verdict-feedback-yrrmgps_.js} +91 -15
  264. package/server/{rollup-DTNvelz9.js → rollup-CUoav0Op.js} +8 -8
  265. package/server/{rollup-DYZfq1c4.js → rollup-DxCjJaAM.js} +1 -1
  266. package/server/{scanner-CV35oSn4.js → scanner-ChURu_b-.js} +7 -7
  267. package/server/{sequence-io-DF_8iuhV.js → sequence-io-D9ITDxzq.js} +4 -4
  268. package/server/{sequencer-agent-B2WeCtGi.js → sequencer-agent-m7gmaakW.js} +7 -6
  269. package/server/server.js +435 -418
  270. package/server/{service-Br9rpBNA.js → service-BzFG0Us_.js} +88 -59
  271. package/server/{session-fork-D0LY152N.js → session-fork-KBq4HIHF.js} +2 -2
  272. package/server/{session-history-BUyK29eq.js → session-history-C_EMhIIF.js} +7 -55
  273. package/server/settings-9jSGHBPY.js +2 -0
  274. package/server/{settings-Bse1Pdcj.js → settings-BLbcDqUp.js} +3 -3
  275. package/server/{settings-CvVGqNEs.js → settings-DejgzzLs.js} +2 -2
  276. package/server/{shadow-engineering-BWLa8ODz.js → shadow-engineering-D8R9I8Yl.js} +3 -3
  277. package/server/{shadow-state-FV6PHfEW.js → shadow-state-C0Af4clN.js} +1 -1
  278. package/server/{shadow-state-B4fpKxOO.js → shadow-state-fzIqIMDD.js} +2 -2
  279. package/server/{shadow-utils-D7asqxOZ.js → shadow-utils-Ugca_9ND.js} +2 -2
  280. package/server/{ship-log-xplJ8t75.js → ship-log-VAv-lHrF.js} +1 -1
  281. package/server/{smart-compaction-D3U_79f-.js → smart-compaction-B2Xu5XEb.js} +7 -7
  282. package/server/{smart-compaction-CPp2Ykf6.js → smart-compaction-BcYY_Suf.js} +1 -1
  283. package/server/{spawn-planning-session-DGfZ5B8D.js → spawn-planning-session-DhCoBPct.js} +38 -50
  284. package/server/spawn-planning-session-Dsv-350T.js +3 -0
  285. package/server/{specialist-completion-Br48eiDP.js → specialist-completion-z6v3ZqJE.js} +1 -1
  286. package/server/{specialist-context-cVbGnTa3.js → specialist-context-CrA5azkJ.js} +5 -5
  287. package/server/{specialist-handoff-logger-DK-GTz4s.js → specialist-handoff-logger-CmpZYJMB.js} +2 -2
  288. package/server/{specialist-logs-Cl5-hqT8.js → specialist-logs-BorrIu0x.js} +3 -3
  289. package/server/{specialists-CNfYO3G2.js → specialists-2yLmqph9.js} +298 -180
  290. package/server/{specialists-Tdezg_6N.js → specialists-CH6ah6D-.js} +1 -1
  291. package/server/{specialists-Cicieuzu.js → specialists-Dfx9_Wzb.js} +18 -18
  292. package/server/{specialists-JHsdU3pA.js → specialists-ZdrifiKx.js} +1 -1
  293. package/server/specs-DKV3jIEs.js +3 -0
  294. package/server/{src-Ck028hjO.js → src-B2e5rGu2.js} +6 -6
  295. package/server/{src-CRmCHlma.js → src-B948bGVR.js} +57 -13
  296. package/server/{src-UWcGe0Ix.js → src-Dm_NV7f6.js} +3 -3
  297. package/server/{stack-health-DqSqx0zv.js → stack-health-Bf2WdG4E.js} +2 -2
  298. package/server/{stack-health-CJLMrLBl.js → stack-health-CoWAhA99.js} +1 -1
  299. package/server/{stale-task-claims-CYFOUNlT.js → stale-task-claims-D1Ll8fI5.js} +5 -4
  300. package/server/{staleness-D47CUJok.js → staleness-45qZ_a60.js} +1 -1
  301. package/server/{staleness-BQ-0gMYK.js → staleness-CuED1Psm.js} +1 -1
  302. package/server/{state-home-BYV7qZTW.js → state-home-B4EWfIxF.js} +2 -2
  303. package/server/{state-mapping-BVldLhBf.js → state-mapping-BEONzr8P.js} +1 -1
  304. package/server/{state-migrate-CvvBtS0Y.js → state-migrate-Cd8BH33U.js} +4 -4
  305. package/server/{stuck-remediation-Wt0UVvu1.js → stuck-remediation-ChcooZuk.js} +1 -1
  306. package/server/{stuck-remediation-mkLC6G_t.js → stuck-remediation-DmY5UJLg.js} +24 -23
  307. package/server/{substrate-bug-weights-service-XfLAKnmK.js → substrate-bug-weights-service-BvTWrFUz.js} +3 -3
  308. package/server/{summary-fork-CD7GOts0.js → summary-fork--Jr8duYh.js} +2 -2
  309. package/server/{summary-fork-xiXBnWG9.js → summary-fork-Ct514_Jl.js} +8 -8
  310. package/server/supervisor/{injection-budget-B5SbvDx2.js → injection-budget-B3UyEONL.js} +1 -1
  311. package/server/supervisor/{paths-K3noE4N_.js → paths-BBOnCYlO.js} +10 -2
  312. package/server/supervisor/pty-supervisor.js +4 -4
  313. package/server/supervisor/{pty-token-B7lp0ElT.js → pty-token-CWRffcCa.js} +3 -3
  314. package/server/{supervisor-DL788vos.js → supervisor-B7BHGcNA.js} +3 -3
  315. package/server/supervisor-CyR_mW5B.js +2 -0
  316. package/server/{swarm-readiness-BV14DF5N.js → swarm-readiness-MNE5O8hn.js} +3 -3
  317. package/server/{system-prerequisites-pdWG6ZQs.js → system-prerequisites-Cin9ZgDx.js} +2 -2
  318. package/server/{teardown-workspace-l2F4_zim.js → teardown-workspace-CvBpvc85.js} +15 -15
  319. package/server/{test-agent-queue-qakFIIGz.js → test-agent-queue-DmSIqays.js} +8 -7
  320. package/server/{test-verdict-Gw-btEfb.js → test-verdict-BieVDAV1.js} +1 -1
  321. package/server/{test-verdict-BJYDggMm.js → test-verdict-Cy2jJGTe.js} +1 -1
  322. package/server/{tldr-daemon-BKOYB616.js → tldr-daemon-Ca0eovh3.js} +1 -1
  323. package/server/{tldr-daemon-CBaWkV9k.js → tldr-daemon-IOssGwg7.js} +2 -2
  324. package/server/{tmux-B1Wbxz5o.js → tmux-CfDHob9M.js} +174 -4
  325. package/server/{tmux-DQ6jB76i.js → tmux-Ctk6RV5l.js} +1 -1
  326. package/server/{token-Cxbk023d.js → token-B10VFNOD.js} +2 -2
  327. package/server/{token-util-CLq2MmQt.js → token-util-CZ8WPtdk.js} +1 -1
  328. package/server/token-util-CrfQ2FKf.js +3 -0
  329. package/server/{tracker-config-DZ8Zn2nQ.js → tracker-config-CHbrjg6m.js} +2 -2
  330. package/server/{tracker-utils-L0FKtjq2.js → tracker-utils-DZZq_C0R.js} +2 -2
  331. package/server/{traefik-connect-bNX6jKkb.js → traefik-connect-GHomyBaD.js} +1 -1
  332. package/server/{tunnel-BAm1XgjG.js → tunnel-Bdyb-sNq.js} +3 -3
  333. package/server/{tunnel-CjSnHdTc.js → tunnel-Dz7y434T.js} +1 -1
  334. package/server/{typed-errors-BHhE85Ul.js → typed-errors-BR_RmPS_.js} +1 -1
  335. package/server/{typed-errors-2BTMxkZq.js → typed-errors-Bn_2WRU7.js} +1 -1
  336. package/server/{types-hraoaQIp.js → types-D2ETIB8T.js} +1 -1
  337. package/server/{types-q67TYYg5.js → types-Dh6RI5Vj.js} +1 -1
  338. package/server/{uat-promote-verification-CKB9ZrKC.js → uat-promote-verification-DyvQXvIn.js} +5 -5
  339. package/server/{uat-train-D5UjcyAa.js → uat-train-Dv0Bxer7.js} +0 -0
  340. package/server/{uat-train-Cu-4nvbf.js → uat-train-diX_7shd.js} +1 -1
  341. package/server/{validate-Cxsx5Uz1.js → validate-606KcYZC.js} +3 -3
  342. package/server/{validation-DEaTZafj.js → validation-Cf7aaV5A.js} +1 -1
  343. package/server/{validation-VZgJxmqc.js → validation-CnrDul1x.js} +4 -4
  344. package/server/{verification-artifact-g3yuxQDL.js → verification-artifact-D4b-bio9.js} +1 -1
  345. package/server/{verification-artifact-C85cRTc_.js → verification-artifact-GOaj8u2s.js} +1 -1
  346. package/server/{verification-runner-KDZIsBj4.js → verification-runner-B5MVxDvU.js} +19 -19
  347. package/server/{verification-runner-DlZI8yhw.js → verification-runner-DiPaUP-C.js} +1 -1
  348. package/server/{vtt-parser-Jr94BF3Y.js → vtt-parser-CMU5EZ5R.js} +1 -1
  349. package/server/{work-agent-prompt-C-vuP3_J.js → work-agent-prompt-Csb3fbVR.js} +9 -9
  350. package/server/{workflows-D0oip4eV.js → workflows-D87ajwV6.js} +113 -43
  351. package/server/workflows-DN6NyVGd.js +2 -0
  352. package/server/{workspace-BqFg__wH.js → workspace-AIOM7n00.js} +1 -1
  353. package/server/{workspace-anchor-drift-B4gMRHl4.js → workspace-anchor-drift-19cJ1bH5.js} +1 -1
  354. package/server/{workspace-anchor-drift-CZKofakh.js → workspace-anchor-drift-C3mK5wNI.js} +4 -4
  355. package/server/{workspace-config-B123aZl-.js → workspace-config-CJ7RqQiP.js} +1 -1
  356. package/server/{workspace-C0fH3aek.js → workspace-iD8oULqu.js} +3 -3
  357. package/server/{workspace-manager-CDTKjjdU.js → workspace-manager-B38rFWA1.js} +1 -1
  358. package/server/{workspace-manager-CwO-Hek7.js → workspace-manager-CXfrw4rR.js} +13 -13
  359. package/server/{workspace-metadata-D4M8BM4W.js → workspace-metadata-BuMRco5P.js} +1 -1
  360. package/server/{workspace-metadata-CQv00QwK.js → workspace-metadata-eHSj_NsP.js} +2 -2
  361. package/server/{workspaces-j1e_6aAT.js → workspaces-DbtMX2TM.js} +136 -113
  362. package/sync-sources/skills/pan-merge/SKILL.md +7 -5
  363. package/sync-sources/skills/pan-release/SKILL.md +57 -0
  364. package/server/agent-state-service-hZpxIw1E.js +0 -2
  365. package/server/archive-planning-0FJ6Xd3b.js +0 -2
  366. package/server/cli-DmXETsw-.js +0 -3
  367. package/server/conflict-gate-Dh754uyA.js +0 -3
  368. package/server/deacon-swarm-I2JfX5Tg.js +0 -2
  369. package/server/dist-DSlxIU1H.js +0 -3
  370. package/server/durable-review-pipeline-jpgCJZFp.js +0 -3
  371. package/server/forge-DK3blQb_.js +0 -3
  372. package/server/hume-Dq--7rOQ.js +0 -3
  373. package/server/inspect-agent-BVwDrVrz.js +0 -2
  374. package/server/label-reconciler--F85rufp.js +0 -113
  375. package/server/merge-ops-DdpTiEMt.js +0 -2
  376. package/server/merge-rebase-DGQpYJU3.js +0 -2
  377. package/server/merge-sync-Ca7F5JnQ.js +0 -3
  378. package/server/public/assets/index-Cc7cnFC4.css +0 -1
  379. package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +0 -1
  380. package/server/rally-YDjU513q.js +0 -3
  381. package/server/resume-u9byntrq.js +0 -3
  382. package/server/review-status-BZH8h-6W.js +0 -3
  383. package/server/settings-CdvIF84R.js +0 -2
  384. package/server/spawn-planning-session-1nFi3gfk.js +0 -2
  385. package/server/specs-Bt7WJDoC.js +0 -3
  386. package/server/supervisor-UWiQNK-y.js +0 -2
  387. package/server/token-util-zlz9U0ki.js +0 -3
  388. package/server/workflows-CHrx_hcW.js +0 -2
package/server/server.js CHANGED
@@ -1,115 +1,115 @@
1
1
  import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { A as canUseHarnessSync, An as extractTeamPrefix, Cn as resolveStateReadHomeSync, D as resolveTieredExecutionEnabled, Dr as GitHubApiError, E as resolveTieredExecutionBlock, Fr as init_errors, Gn as init_projects, Gr as OVERDECK_HOME, H as init_providers, I as UnknownModelError, In as getIssuePrefix, Ir as AGENTS_DIR, J as defaultBackgroundAiFeatures, Jn as listProjects, M as init_harness_policy, Mn as findProjectByPathSync, Mt as getIssueWorkspacePath, Nr as TrackerError, On as ProjectRenameError, Pn as findProjectByTeamSync, Pt as init_record, Q as computeModelOrigin, Qr as SYNC_SOURCES, R as getBuiltInDefaultHarness, Sn as init_state_read_home, T as init_tier_table, Tr as FsError, V as getProviderForModelSync, Vr as CLAUDE_DIR, Wr as LOGS_DIR, X as DEFAULT_ROLES, Y as init_registry, Yn as listProjectsSync, Z as DEFAULT_WORKHORSES, Zn as loadProjectsConfigSync, _ as getDefaultDocsConfig, ar as resolveProjectFromIssueSync, at as getModelEffortLevelsSync, ci as init_paths, cn as flushAutoCommits, ct as modelSupportsImagesSync, d as loadConfigNoMigration, dr as setProjectSwarmPolicySync, ei as encodeClaudeProjectDir, er as registerProjectSync, f as loadConfigSync, fi as sessionFilePath, g as mergeConfigs, gr as init_issue_id, gt as ROLE_EFFORTS, h as jsYaml, hr as extractPrefixSync, ht as PARENT_MODEL_REF, i as getConversationsConfig, ii as getDocsTelemetryPath, ir as resolveProjectFromIssue, jr as ProcessSpawnError, k as validateTieredExecutionConfig, li as isDevMode, ln as init_auto_commit, lr as setProjectAutoMergeDefaultSync, lt as resolveModelIdSync, m as init_js_yaml, mt as COMPLIANCE_MODES, n as clearConfigCache, ni as getDocsDisableStatePath, nt as MODEL_CAPABILITIES, o as getGlobalConfigPath, oi as getLegacyHome, ot as hasModelCapabilitySync, p as updateConversationsConfig, r as getConversationSearchConfigSync, ri as getDocsIndexPath, rr as resolveInfraRepo, rt as MODEL_DEPRECATIONS, s as init_load, si as getOverdeckHome, sn as flushAllPendingAutoCommits, st as init_model_capabilities, t as init_config_yaml, ti as getDocsBudgetStatePath, tr as renameProject, tt as resolveModel, u as isTldrEnabledSync, ui as packageRoot, ur as setProjectMergeTrainSync, v as getDefaultTtsDaemonConfig, vr as parseIssueIdSync, w as TieredExecutionConfigError, xr as require_dist$1, y as mergeTtsDaemonConfigs, z as getKimiAnthropicBaseUrl, zn as getProjectSync, zt as readIssueRecordSync } from "./config-yaml-CmOPzmBb.js";
3
- import { a as shouldRefuseHostDashboardPort, i as readHostDashboardApiPort, n as getDashboardIdentity, r as isNonPrimaryCheckoutRoot } from "./deacon-nudge-log-BNBebzeL.js";
4
- import { $ as composerCommandConfirmationFromBody, A as resolveAllowedHarness, B as cleanupUnreferencedConversationAttachments, C as handleConversationCreate, Ct as isTrustedOriginForHost, D as handleConversationStop, Dt as getDefaultCwd, E as handleConversationResume, Et as httpHandler, F as tmuxSessionExists, G as isManagedConversationAttachmentPath, H as extractConversationAttachmentPaths, I as waitForPiTuiReady, J as composerCommandResultHttpStatus, K as removeConversationAttachment, L as waitForTmuxSession$1, M as spawnConversationSession, N as startConversationModelBackfill, O as handleConversationSwitchModel, Ot as jsonResponse, P as stopConversationRuntime, Q as ComposerCommandConfirmationError, R as cleanupConversationAttachments, S as conversationSessionAliveFromState, St as getHeaderFromMap, T as handleConversationRestartAll, Tt as validateOriginHeaders, U as getConversationAttachmentsRoot, V as ensureConversationAttachmentDir, W as hasConversationAttachment, X as resolvePolicy, Y as handleComposerCommandMessage, Z as ComposerCommandParseError, _ as isPiControlChannelHarness, _t as rejectUnauthorizedDashboardRequest, a as agentsRouteLayer, at as panCliInvocation, b as validateConversationControlAckOrigin, bt as isRespawnPending, c as codexConversationPendingInput, ct as resolveAcpTranscriptPath, d as handleConversationCodexApproval, dt as resolveCodexRolloutPath, et as evaluateSpawnGuardrails, f as handleConversationCompact, ft as resolveJsonlPath, g as handleConversationThinkingLevel, gt as hasDashboardInternalToken, h as handleConversationPlanAction, ht as dashboardSessionCookieHeader, j as shouldReportUnresolvedLiveSession, k as isInsideGitWorkTree, kt as jsonStringResponse, l as deliverConversationViaControlChannel, lt as resolveAgentHarness, m as handleConversationDeliveryMethod, mt as dashboardCsrfToken, nt as resolveAgentGitInfo, o as saveAgentStateAndEmitEvent, p as handleConversationControlAck, pt as resolvePiSessionPath, q as runInBatches, rt as resolveConversationGitInfo, s as saveAgentStateAndEmitEventProgram, st as readLauncherPinnedSessionId, t as specialistsRouteLayer, tt as invalidateAgentsCache, u as handleConversationAbort, ut as resolveClaudeSessionId, v as pickDeliverAs, vt as rejectUnauthorizedDashboardSessionMintRequest, w as handleConversationDelete, wt as validateOrigin$1, x as conversationNeedsRunningRepair, xt as waitForSessionRespawn, y as resolveConversationDeliveryMethod, yt as rejectUnsafeDashboardMutationRequest, z as cleanupOrphanedConversationAttachments } from "./specialists-CNfYO3G2.js";
2
+ import { A as canUseHarnessSync, An as extractTeamPrefix, Cn as resolveStateReadHomeSync, D as resolveTieredExecutionEnabled, Dr as GitHubApiError, E as resolveTieredExecutionBlock, Fr as init_errors, Gn as init_projects, Gr as OVERDECK_HOME, H as init_providers, I as UnknownModelError, In as getIssuePrefix, Ir as AGENTS_DIR, J as defaultBackgroundAiFeatures, Jn as listProjects, M as init_harness_policy, Mn as findProjectByPathSync, Mt as getIssueWorkspacePath, Nr as TrackerError, On as ProjectRenameError, Pn as findProjectByTeamSync, Pt as init_record, Q as computeModelOrigin, Qr as SYNC_SOURCES, R as getBuiltInDefaultHarness, Sn as init_state_read_home, T as init_tier_table, Tr as FsError, V as getProviderForModelSync, Vr as CLAUDE_DIR, Wr as LOGS_DIR, X as DEFAULT_ROLES, Y as init_registry, Yn as listProjectsSync, Z as DEFAULT_WORKHORSES, Zn as loadProjectsConfigSync, _ as getDefaultDocsConfig, ai as getDocsTelemetryPath, ar as resolveProjectFromIssueSync, at as getModelEffortLevelsSync, ci as getOverdeckHome, cn as flushAutoCommits, ct as modelSupportsImagesSync, d as loadConfigNoMigration, di as packageRoot, dr as setProjectSwarmPolicySync, er as registerProjectSync, f as loadConfigSync, g as mergeConfigs, gr as init_issue_id, gt as ROLE_EFFORTS, h as jsYaml, hr as extractPrefixSync, ht as PARENT_MODEL_REF, i as getConversationsConfig, ii as getDocsIndexPath, ir as resolveProjectFromIssue, jr as ProcessSpawnError, k as validateTieredExecutionConfig, li as init_paths, ln as init_auto_commit, lr as setProjectAutoMergeDefaultSync, lt as resolveModelIdSync, m as init_js_yaml, mt as COMPLIANCE_MODES, n as clearConfigCache, ni as getDocsBudgetStatePath, nt as MODEL_CAPABILITIES, o as getGlobalConfigPath, ot as hasModelCapabilitySync, p as updateConversationsConfig, pi as sessionFilePath, r as getConversationSearchConfigSync, ri as getDocsDisableStatePath, rr as resolveInfraRepo, rt as MODEL_DEPRECATIONS, s as init_load, si as getLegacyHome, sn as flushAllPendingAutoCommits, st as init_model_capabilities, t as init_config_yaml, ti as encodeClaudeProjectDir, tr as renameProject, tt as resolveModel, u as isTldrEnabledSync, ui as isDevMode, ur as setProjectMergeTrainSync, v as getDefaultTtsDaemonConfig, vr as parseIssueIdSync, w as TieredExecutionConfigError, xr as require_dist$1, y as mergeTtsDaemonConfigs, z as getKimiAnthropicBaseUrl, zn as getProjectSync, zt as readIssueRecordSync } from "./config-yaml-CxdwhAIA.js";
3
+ import { a as shouldRefuseHostDashboardPort, i as readHostDashboardApiPort, n as getDashboardIdentity, r as isNonPrimaryCheckoutRoot } from "./deacon-nudge-log-DPHsO14z.js";
4
+ import { $ as composerCommandConfirmationFromBody, A as resolveAllowedHarness, At as jsonResponse, B as cleanupUnreferencedConversationAttachments, C as handleConversationCreate, Ct as waitForSessionRespawn, D as handleConversationStop, Dt as validateOriginHeaders, E as handleConversationResume, Et as validateOrigin$1, F as tmuxSessionExists, G as isManagedConversationAttachmentPath, H as extractConversationAttachmentPaths, I as waitForPiTuiReady, J as composerCommandResultHttpStatus, K as removeConversationAttachment, L as waitForTmuxSession$1, M as spawnConversationSession, N as startConversationModelBackfill, O as handleConversationSwitchModel, Ot as httpHandler, P as stopConversationRuntime, Q as ComposerCommandConfirmationError, R as cleanupConversationAttachments, S as conversationSessionAliveFromState, St as isRespawnPending, T as handleConversationRestartAll, Tt as isTrustedOriginForHost, U as getConversationAttachmentsRoot, V as ensureConversationAttachmentDir, W as hasConversationAttachment, X as resolvePolicy, Y as handleComposerCommandMessage, Z as ComposerCommandParseError, _ as isPiControlChannelHarness, _t as dashboardSessionCookieHeader, a as agentsRouteLayer, at as resolveConversationGitInfo, b as validateConversationControlAckOrigin, bt as rejectUnauthorizedDashboardSessionMintRequest, c as codexConversationPendingInput, d as handleConversationCodexApproval, dt as resolveAgentHarness, et as evaluateSpawnGuardrails, f as handleConversationCompact, ft as resolveClaudeSessionId, g as handleConversationThinkingLevel, gt as dashboardCsrfToken, h as handleConversationPlanAction, ht as resolvePiSessionPath, it as resolveAgentGitInfo, j as shouldReportUnresolvedLiveSession, jt as jsonStringResponse, k as isInsideGitWorkTree, kt as getDefaultCwd, l as deliverConversationViaControlChannel, lt as readLauncherPinnedSessionId, m as handleConversationDeliveryMethod, mt as resolveJsonlPath, nt as isInternalAgentRequest, o as saveAgentStateAndEmitEvent, p as handleConversationControlAck, pt as resolveCodexRolloutPath, q as runInBatches, rt as resolveRequestedStartedBy, s as saveAgentStateAndEmitEventProgram, st as panCliInvocation, t as specialistsRouteLayer, tt as invalidateAgentsCache, u as handleConversationAbort, ut as resolveAcpTranscriptPath, v as pickDeliverAs, vt as hasDashboardInternalToken, w as handleConversationDelete, wt as getHeaderFromMap, x as conversationNeedsRunningRepair, xt as rejectUnsafeDashboardMutationRequest, y as resolveConversationDeliveryMethod, yt as rejectUnauthorizedDashboardRequest, z as cleanupOrphanedConversationAttachments } from "./specialists-2yLmqph9.js";
5
5
  import { a as emitDashboardLifecycleSync, i as emitActivityTtsSync, o as init_activity_logger, r as emitActivityEntrySync } from "./activity-logger-CyteR4JO.js";
6
- import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-BjuxvjdS.js";
6
+ import { A as init_paths$1, O as OVERDECK_MIGRATION_PATH, f as init_infra, i as DbLive, k as getOverdeckDatabasePath, u as TmuxLive } from "./infra-BDQDRopn.js";
7
7
  import { n as openDatabase, t as init_driver } from "./driver-CKVGi51s.js";
8
- import { i as updateIssueRecord, n as clearRecordPipelineClosedOutSync, r as init_record_update } from "./record-update-Z0QCxmMp.js";
9
- import { $ as buildChildEnvSync, B as sendKeysAsync, C as getWindowDimensions, D as killSession, E as isPaneDead, H as sessionExists, L as resizeWindow, M as listSessionNames, T as isHarnessProcessAlive, V as sendRawKeystroke, X as init_ui_theme, Z as setUiTheme, d as ensureManagedTmuxContextOnce, et as buildChildEnvWithoutTmuxSync, i as capturePane, l as deliveryVerifyLine, n as buildTmuxArgs, o as capturePaneText, s as createSession, tt as init_child_env, w as init_tmux, z as sendKeys } from "./tmux-B1Wbxz5o.js";
10
- import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-zY5MJHgF.js";
11
- import { A as AgentRuntimeSnapshot, C as FlywheelStatus, E as SystemHealthSnapshot, M as ReviewStatusSnapshot, O as MemoryObservation, S as FlywheelRunId, T as DomainEvent, b as PanRpcGroup, j as AgentSnapshot, l as ContextLayerSaveRequest, n as COMPOSER_COMMAND_MANIFEST, p as FlywheelStats, r as compareIssueIds, s as getHarnessBehavior, t as init_src, u as ContextPreviewRequest, w as EDITORS, x as WS_METHODS, y as PanRpcError } from "./src-CRmCHlma.js";
12
- import { A as getOrCreateInstallId, D as getAnalyticsService, M as init_config, N as resolveTelemetryEnabled, O as init_service, P as telemetryEnvironmentForcesOff, S as setReviewStatusSync, a as clearStuckMergeStatuses, c as fixStuckReadyForMerge, f as init_review_status, g as markWorkspaceStuck, i as clearReviewStatus, j as init_install_id, k as synchronizeAnalyticsServices, l as getReviewStatus, m as loadReviewStatuses, p as loadReadyForMergeFlags, s as fixStuckCommentedReviews, u as getReviewStatusSync, x as setReviewStatus } from "./review-status-yljtTd-q.js";
13
- import { a as EventStoreService, c as ReadModelService, f as init_read_model, h as toRole, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toAgentStatus, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentResolution, s as init_domain_services, t as IssueLifecycle, u as activityEntriesFromStoredEvents } from "./issue-lifecycle-C4Zj0WmE.js";
14
- import { c as listAllAgentsSync, n as AgentsResolverLive, o as init_agents } from "./agents-C5rWYhb6.js";
15
- import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-cXmOwSbh.js";
16
- import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-DHmCSLar.js";
17
- import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-BORBTo0y.js";
18
- import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, m as init_checkpoint_manager, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-DEWD82qK.js";
19
- import { $ as operatorInterventionEvent, $n as getAgentDir, Bt as init_transcript_landing, Cr as init_agent_record_sync, D as init_tier_supervisor, E as deliverCommitForReview, Fn as init_openai_auth, Fr as getAgentRuntimeState, Hr as checkCodexAuthStatus, Ir as getAgentRuntimeStateSync, Mt as deliverAgentMessage, Pn as getOpenAIAuthStatus, Pr as waitForReadySignal, Q as init_operator_interventions, Qt as init_staffing, Tn as init_claude_auth, Ur as init_codex_auth, Vt as probeTranscriptSince, X as messageAgent, Y as init_messaging, _r as saveAgentStateSync, a as listRunningAgentsSync, b as init_agents$1, bt as init_concurrency, c as getRuntimeCensus, d as panePidsForSession, dn as getProviderAuthMode, en as resolveImplicitStaffing, f as refreshRuntimeCensus, i as listRunningAgents, j as supervisorAgentId, jr as normalizeAgentId, kn as getProviderEnvForModel, l as getRuntimeCensusSnapshot, mn as injectPiConversationMemory, n as init_queries, p as runtimeCensusHasHarnessProcess, r as listAgentStates, rr as getAgentStateSync, tr as getAgentState, u as init_runtime_census, vt as emergencyBrake, wn as getClaudeAuthStatus, wr as readAgentHarnessModelRecordSync, zt as captureTranscriptUserRecordSnapshot } from "./queries-DHJm7bTd.js";
20
- import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, d as init_cost_sync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, p as queryCostEventsSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as getTodayCostSync } from "./cost-sync-Dv3LUaNW.js";
21
- import { c as getAgentsNeedingAttention, d as CostResolverLive, f as CostWriter, l as CostDoorLive, n as readCloisterStateFile, o as generateHealthSummary, s as getAgentHealth, t as getCloisterService, u as CostResolver } from "./service-Br9rpBNA.js";
22
- import { u as init_agent_runtime_mirror } from "./session-history-BUyK29eq.js";
23
- import { t as init_behavior } from "./behavior-CfIg6pKp.js";
24
- import { n as AgentStateServiceLive } from "./agent-state-service-BlnSkRFA.js";
25
- import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-DZ8Zn2nQ.js";
26
- import { d as init_typed_errors, i as PlanEmpty, l as WorkspaceCreateError, n as AgentStartError, s as TrackerApiError, t as AgentAlreadyRunning, u as WorkspaceNotFound } from "./typed-errors-2BTMxkZq.js";
27
- import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-BQU36QqE.js";
28
- import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-BfyDxuRN.js";
29
- import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-Bfqm6XI4.js";
30
- import { n as resolveGitHubIssueSync, r as resolveTrackerTypeSync, t as init_tracker_utils } from "./tracker-utils-L0FKtjq2.js";
31
- import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-DmCh7EHj.js";
32
- import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-DvMTQSOS.js";
33
- import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-BuQ0e4hF.js";
34
- import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-483sujRo.js";
35
- import { n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-CpvJnvnQ.js";
36
- import { a as PAN_DIRNAME, d as WORKSPACE_RUNTIME_DIRNAME, f as asPanSpecDocument, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-hraoaQIp.js";
37
- import { C as transitionToMerging, S as scheduleAutoMergeWithResult, _ as markMergingBlocked, b as requeueToPending, c as isFlywheelGloballyPaused, d as listActiveAutoMerges, f as listDuePendingAutoMerges, g as markMerged, h as markFailed, m as markBlocked, p as listProblemAutoMerges, r as getActionableAutoMerge, s as init_merge_sync, t as cancelPending } from "./merge-sync-CQ-LgZ1_.js";
38
- import { D as writeSpecForIssue, E as writeSpecDocument, S as init_specs, a as findWorkspaceDraftPlan, m as readWorkspacePlanSync, o as init_io, p as readWorkspacePlan, r as findPlan, s as isPlanningComplete, u as readPlan, v as init_types$1, x as findSpecByIssue, y as subItemsOf } from "./io-VHvc0Ssp.js";
39
- import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-C8mB3KuB.js";
40
- import { $ as updateConversationForkFallbackReason, A as isAgentConversationName, B as removeFavorite, C as getConversationByTmuxSession, D as importLegacyConversation, F as markConversationEnded, H as setClearedToConvId, I as markConversationRunning, J as setForkRequest, M as listConversations, N as listFavoritedIds, O as incrementForkRetryCount, P as markConversationActive, S as getConversationByName, T as getStuckForks, U as setConversationClaudeSessionId, X as unarchiveConversation, Y as setImportedConversationLinks, Z as updateConversationCost, _ as canRefineTitle, _t as getDiscoveredStats, at as aggregateDiscoveredSessionCost, b as getConversationByClaudeSessionId, ct as countDiscoveredSessions, et as updateConversationTitle, ft as findDiscoveredSessions, gt as getDiscoveredSessionBySessionId, h as archiveConversation, j as listArchivedConversationsWithEnrichment, k as init_conversations, mt as getDiscoveredSessionById, ot as aggregateDiscoveredSessionCostBy, q as setFavorite, tt as updateForkStatus, v as canReplaceTitle, w as getConversationLedgerCosts, x as getConversationById, y as createConversation, yt as init_discovered_sessions, z as recordConversationHandoff } from "./conversations-BUpYsOZg.js";
41
- import { n as isBackgroundFeatureEnabled, t as init_features } from "./features--nFkJY8v.js";
42
- import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-Bse1Pdcj.js";
43
- import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-evXhiQeg.js";
44
- import { d as generateLauncherScriptSync, f as init_launcher_generator, g as requireModelOverrideSync, h as normalizeModelOverrideSync, m as init_model_validation, p as MODEL_ID_PATTERN } from "./tmux-dedup-DbN6MGzM.js";
45
- import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-CN0cSCPp.js";
46
- import { C as ensureProjectLayer, E as init_layers, I as workspaceContextFile, N as resolveProjectContextFile, P as resolveWorkspaceContextFile, S as codexGlobalContextFile, T as globalContextFile$1, b as validateTemplate, c as init_render, d as userContentOutsideRegion, i as workspaceContextWithoutProjectLayer, r as init_assemble, s as hasManagedRegion, v as init_harness, y as renderForHarness } from "./assemble-DnffNpOo.js";
47
- import { l as init_codex, s as findRolloutPath } from "./codex-Drlf5Xhf.js";
48
- import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-DqkftwTb.js";
49
- import { f as init_config$1, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-Dr3pW6w6.js";
50
- import { C as setFlywheelRequireUatBeforeMerge, T as setSetting, _ as setCloisterSpawnsPausedSync, c as isCloisterSpawnsPausedSync, d as isFlywheelAutoPickupBacklog, f as isFlywheelGloballyPaused$1, h as setBootReconciliationDecision, m as isMergeTrainEnabled, n as FLYWHEEL_GLOBAL_PAUSE_KEY, o as getSetting, p as isFlywheelRequireUatBeforeMerge, r as getBootReconciliationState, s as init_control_settings, t as FLYWHEEL_ACTIVE_RUN_ID_KEY, u as isDeaconGloballyPausedSync, w as setMergeTrainEnabled, x as setFlywheelAutoPickupBacklog, y as setDeaconGloballyPausedSync } from "./control-settings-C7DUehE1.js";
51
- import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-CqMqM1Mb.js";
52
- import { a as loadCloisterConfigSync, o as saveCloisterConfigSync, r as init_config$2, s as shouldAutoStart } from "./config-B2IMcBxx.js";
53
- import { c as isStateMigrated, i as ensureStateWorktree, o as init_state_home, r as clearStateMigrationCache, s as inspectStateMigration } from "./state-home-BYV7qZTW.js";
54
- import { i as checkPrdGateSync, s as promoteWorkspacePrdDraft, t as init_pan_dir } from "./pan-dir-ubraCiUg.js";
55
- import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-D-lGdzK3.js";
56
- import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-BV14DF5N.js";
57
- import { a as buildMatchQuery, c as init_query_expansion, i as resolveKnowledgeBundleRoot, n as init_injection, o as init_search, r as injectPromptTimeMemory, s as clearQueryExpansionCache } from "./injection-UCf8EsjX.js";
58
- import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-BeOomFa-.js";
59
- import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-CLq2MmQt.js";
60
- import { A as createSettledTtlPromiseCache, D as init_advisory_checks, E as verifyAppCanMerge, M as withConcurrencyLimit, O as isAdvisoryCheckName, d as getPullRequestState, f as init_github_app, j as init_concurrency$1, k as createPromiseConcurrencyLimiter, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-CQ1Lo6LA.js";
61
- import { C as getWorkspacePathForIssue, E as stopAgentOutputService, S as resolveIssueHeadlineCost, T as startAgentOutputService, _ as getCostsForIssueSync, b as processPendingFeedbackDeliveries, d as resumeQueuedMerges, f as syncWalFromAllProjects, g as migrateAllSessionsSync, h as reclassifyUnknownCostEventsSync, l as internalEventsRouteLayer, m as reconcilePiTranscripts, p as reconcile$1, t as workspacesRouteLayer, u as eventsRouteLayer, v as rebuildCacheSync, w as retainAgentOutputInterest, x as getCachedRunningAgents, y as syncCacheSync } from "./workspaces-j1e_6aAT.js";
62
- import { _ as init_codex_conversation_parser, a as contextUsageFromParseResult, b as parseAcpConversationMessages, c as parseEntireConversation, d as init_pi_conversation_parser, f as isPiSessionFile, g as parseOhmypiConversationMessages, h as isOhmypiSessionFile, i as computeContextUsage, l as parseFromLastCompactBoundary, m as init_ohmypi_conversation_parser, n as gateSnapshotEmission, o as summarizeConversationActivity, p as parsePiConversationMessages, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages, y as init_acp_conversation_parser } from "./conversation-service-5aCnq1zR.js";
63
- import { c as countPendingAskUserQuestionsForAgent, g as detectAwaitingInputFromPaneSync, h as detectAwaitingInputForAgent, l as getAgentJsonlMtime, m as scanPendingInputsPromise, o as getRuntimeForAgent, s as computeAgentEnrichment } from "./stuck-remediation-mkLC6G_t.js";
64
- import { a as enrichSessions, c as searchSessions, i as CostThresholdError, l as embed, n as getSessionsFeedFacets, o as embedSessions, r as listSessionsFeed, s as parseRelativeTime, t as scan } from "./scanner-CV35oSn4.js";
65
- import { c as tailEventsSync, n as deduplicateEventsSync, o as readEventsSync } from "./events-D9PR1IC0.js";
66
- import { n as recordBackgroundAiCost, t as init_cost } from "./cost-CvxRrucd.js";
67
- import { a as getByIssueId, i as parseFlywheelStatsWindow, n as derivePipelineRunStatsInputs, o as markFixed, r as computeFlywheelStats, s as upsert, t as listSubstrateBugWeights } from "./substrate-bug-weights-service-XfLAKnmK.js";
68
- import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-DF_8iuhV.js";
69
- import { _ as selectNeedsPlanning, c as classifyIssue, d as computeLanes, f as computeStats, g as normalizeGate, l as computeCohort, m as init_pickup, p as computeWaves, u as computeEpicGroups } from "./pickup-D8xtG1J2.js";
70
- import { B as getBook, C as readCurrentLatestFlywheelStatus, D as writeFlywheelLaunchMetadata, E as subscribeLatestFlywheelStatus, F as setItemRequirements, H as liveOrderIssueLookup, I as setSettings, L as setStatus, M as moveItem, N as removeItem, O as writeLatestFlywheelStatus, P as renameBook, R as backlogCandidates, S as nextFlywheelRunId, T as resolveLiveFlywheelRunId, V as listBooks, a as isFlywheelDevcontainerRuntime, b as isFlywheelRunId, f as spawnFlywheelAgent, g as abortFlywheelRun, j as createBook, k as addItems, p as buildClassifyLookups, s as loadResumeSessionId, t as FLYWHEEL_ORCHESTRATOR_AGENT_ID, u as saveResumeSessionId, v as getFlywheelRunDetail, w as readFlywheelLaunchMetadata, x as listFlywheelRuns, z as computeBookProgress } from "./flywheel-BiT3odRb.js";
71
- import { At as formatUptime, Bt as classifyAgentHealth, D as loadConfig, F as setAgentStoppedNotifier, G as isBootReconciliationCandidate, I as setMergeReadyNotifier, It as getSystemHealthEvidenceSnapshot, K as listBootReconciliationCandidates, Mt as getCurrentDockerStats, Nt as getAcceptedSystemHealthSnapshot, O as loadState, P as setAgentStatusChangedNotifier, Pt as getDeployStaleness, Rt as isSmeeConfiguredSync, W as extendBootReconciliationGrace, b as getDeaconLogs, jt as getContainerHistory, kt as getResourceStacks, n as assessDeaconPatrolFreshness, q as startBootReconciliation, t as applyBootReconciliationDecision, wt as paneShowsClaudeBootBlockingScreen, zt as startSmeeProcessSync } from "./deacon-hi9KLPLT.js";
72
- import { c as installGitHooksInDir, f as detectPlatform, p as init_platform, s as init_git_hooks } from "./workspace-manager-CwO-Hek7.js";
73
- import { a as getShadowState, s as init_shadow_state } from "./shadow-state-B4fpKxOO.js";
74
- import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-B6KJkmHZ.js";
75
- import { i as parseArtifactRef, r as init_forge } from "./forge-CZbSg6Ds.js";
76
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-BG0RUZiu.js";
77
- import { V as getReviewerSessionName, t as init_specialists } from "./specialists-Cicieuzu.js";
78
- import { s as findPrdAnywhereSync } from "./archive-planning-C0lAbNB_.js";
79
- import { b as resolveSwarmPolicy } from "./deacon-swarm-DBxUaO-A.js";
80
- import { a as init_boot_gates, i as formatBootGateState, o as resolveBootGates } from "./no-resume-mode-C5ULAXwO.js";
81
- import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-Bq3epG58.js";
82
- import { a as applyIssueObjectionLabel, c as applyIssueReleasedLabel, d as removeIssueBlocksMainLabel, f as removeIssueObjectionLabel, g as removeIssueVetoedLabel, h as removeIssueReleasedLabel, i as applyIssueBlocksMainLabel, l as applyIssueVetoedLabel, m as removeIssueReadyLabel, o as applyIssueParkedLabel, p as removeIssueParkedLabel, s as applyIssueReadyLabel, u as init_label_ops } from "./label-reconciler--F85rufp.js";
83
- import { r as computeMergeQueueFromCandidates, s as listEligibleCandidatesByProject } from "./flywheel-merge-order-BJv1DZz1.js";
84
- import { a as gatherProjectLensSignals, g as parseIssueIdFromTextSync, h as init_resource_utils, n as PipelineMembershipUnavailableError, s as init_pipeline_membership_gather, u as listOpenPullRequestsSnapshot } from "./pipeline-membership-gather-CET40frr.js";
85
- import { n as init_pipeline_membership, r as resolvePipelineMembership } from "./pipeline-membership-CrAPLYtf.js";
86
- import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-CQv00QwK.js";
87
- import { i as resolveAutoSpawnOnFinalize, o as spawnPlanningSession } from "./spawn-planning-session-DGfZ5B8D.js";
88
- import { d as killRemoteAgent, m as loadRemoteAgentState, o as getRemoteAgentOutput, r as checkRemoteSpendCap, s as init_remote_agents, v as sendToRemoteAgent, y as spawnRemoteAgent } from "./remote-agents-C_VxssLU.js";
89
- import { r as spawnInspectAgent } from "./inspect-agent-6kylZnrm.js";
90
- import { i as lookupPullRequestNumberForBranch, n as init_github_pr_lookup, t as githubPrLookupSource } from "./github-pr-lookup-BDq6Wznz.js";
91
- import { a as fetchIssuePullRequestDiff, c as getCachedIssuePrTabResponse, d as setCachedIssuePrTabResponse, i as fetchIssuePullRequestDetails, l as getIssuePrTabCacheGeneration, n as fetchIssueCheckRuns, o as init_pull_requests, r as fetchIssuePullRequest, s as bumpIssuePrTabCacheGeneration, u as init_pr_tab_cache } from "./pull-requests-DHWiKxo7.js";
92
- import { n as DOD_ROWS } from "./dod-Dar-yheg.js";
93
- import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-DTNvelz9.js";
94
- import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-CBaWkV9k.js";
95
- import { T as listGitOperationsSync, w as init_git_activity } from "./merge-agent-DdMVSV2Y.js";
96
- import { t as readVerificationArtifact } from "./verification-artifact-g3yuxQDL.js";
97
- import { i as readPendingDeploy, n as init_deploy_queue } from "./deploy-queue-UjKGYsDe.js";
98
- import { t as getAgentCommandSync } from "./settings-CvVGqNEs.js";
99
- import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-CHhI66UP.js";
100
- import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-BCd02Es1.js";
101
- import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-CJn35FHQ.js";
102
- import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-xiXBnWG9.js";
103
- import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-BoqdDXWF.js";
104
- import { t as init_context_layers } from "./context-layers-dR5YxHYB.js";
105
- import { a as appendLinearMcpAuthHealthyEvent, r as appendLinearMcpAuthCallbackRelayedEvent, u as resolveLinearMcpAuthIntervention } from "./linear-mcp-auth-BnU4TYfY.js";
106
- import { i as getMergeBlockersPayload, n as hasOrderIssuePrd, r as validateBookForStart, t as createOrderPrdLookup } from "./validate-Cxsx5Uz1.js";
107
- import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-B2WeCtGi.js";
108
- import { n as sameCanonicalReviewStatus, t as emitReviewStatusChanged } from "./review-status-emit-CUExtHd5.js";
109
- import "./supervisor-DL788vos.js";
110
- import { l as startUatTrainReconciler, u as stopUatTrainReconciler } from "./uat-train-D5UjcyAa.js";
111
- import { n as settlePendingLifecycleClaim, t as claimPendingLifecycleFile } from "./pending-lifecycle-claim-DEteYdS9.js";
112
- import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-CZvbtLnr.js";
8
+ import { i as updateIssueRecord, n as clearRecordPipelineClosedOutSync, r as init_record_update } from "./record-update-DaOKS7Wb.js";
9
+ import { B as sendKeysAsync, C as getWindowDimensions, D as killSession, E as isPaneDead, H as sessionExists, J as init_pane_choice_menu, L as resizeWindow, M as listSessionNames, T as isHarnessProcessAlive, V as sendRawKeystroke, Y as paneChoiceMenuSignature, Z as parsePaneChoiceMenu, at as buildChildEnvWithoutTmuxSync, d as ensureManagedTmuxContextOnce, i as capturePane, it as buildChildEnvSync, l as deliveryVerifyLine, n as buildTmuxArgs, nt as setUiTheme, o as capturePaneText, ot as init_child_env, q as buildChoiceKeystrokes, s as createSession, tt as init_ui_theme, w as init_tmux, z as sendKeys } from "./tmux-CfDHob9M.js";
10
+ import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-CrHcVC5_.js";
11
+ import { A as AgentRuntimeSnapshot, C as FlywheelStatus, E as SystemHealthSnapshot, M as ReviewStatusSnapshot, O as MemoryObservation, S as FlywheelRunId, T as DomainEvent, b as PanRpcGroup, j as AgentSnapshot, l as ContextLayerSaveRequest, n as COMPOSER_COMMAND_MANIFEST, p as FlywheelStats, r as compareIssueIds, s as getHarnessBehavior, t as init_src, u as ContextPreviewRequest, w as EDITORS, x as WS_METHODS, y as PanRpcError } from "./src-B948bGVR.js";
12
+ import { A as synchronizeAnalyticsServices, C as setReviewStatusSync, F as telemetryEnvironmentForcesOff, M as init_install_id, N as init_config, O as getAnalyticsService, P as resolveTelemetryEnabled, S as setReviewStatus, _ as markWorkspaceStuck, a as clearStuckMergeStatuses, c as fixStuckCommentedReviews, d as getReviewStatusSync, h as loadReviewStatuses, i as clearReviewStatus, j as getOrCreateInstallId, k as init_service, l as fixStuckReadyForMerge, m as loadReadyForMergeFlags, p as init_review_status, u as getReviewStatus } from "./review-status-CwhA9wmd.js";
13
+ import { a as EventStoreService, c as ReadModelService, f as init_read_model, h as toRole, i as init_issue_lifecycle, l as ReadModelServiceLive, m as toAgentStatus, n as IssueLifecycleLive, o as EventStoreServiceLive, p as toAgentResolution, s as init_domain_services, t as IssueLifecycle, u as activityEntriesFromStoredEvents } from "./issue-lifecycle-BXfzxFCD.js";
14
+ import { n as logAgentLifecycleSync, t as init_persistent_logger } from "./persistent-logger-CBj016pT.js";
15
+ import { c as listAllAgentsSync, n as AgentsResolverLive, o as init_agents } from "./agents-CtACUuVG.js";
16
+ import { i as init_paths$2, l as resolveObservationsFile, r as ensureParentDir, s as resolveIssueMemoryRoot, t as assertMemorySafeSegment } from "./paths-DuATV5iE.js";
17
+ import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-CUerZqWd.js";
18
+ import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-CUVNpAso.js";
19
+ import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, m as init_checkpoint_manager, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-R5tnaxEY.js";
20
+ import { $ as operatorInterventionEvent, $n as getAgentDir, Bt as init_transcript_landing, Cr as init_agent_record_sync, D as init_tier_supervisor, E as deliverCommitForReview, Fn as init_openai_auth, Gr as init_codex_auth, Ir as waitForReadySignal, Lr as getAgentRuntimeState, Mt as deliverAgentMessage, Nr as normalizeAgentId, Pn as getOpenAIAuthStatus, Q as init_operator_interventions, Qt as init_staffing, Rr as getAgentRuntimeStateSync, Tn as init_claude_auth, Vt as probeTranscriptSince, Wr as checkCodexAuthStatus, X as messageAgent, Y as init_messaging, _r as saveAgentStateSync, a as listRunningAgentsSync, b as init_agents$1, bt as init_concurrency, c as getRuntimeCensus, d as panePidsForSession, dn as getProviderAuthMode, en as resolveImplicitStaffing, f as refreshRuntimeCensus, i as listRunningAgents, j as supervisorAgentId, kn as getProviderEnvForModel, l as getRuntimeCensusSnapshot, mn as injectPiConversationMemory, n as init_queries, p as runtimeCensusHasHarnessProcess, r as listAgentStates, rr as getAgentStateSync, tr as getAgentState, u as init_runtime_census, vt as emergencyBrake, wn as getClaudeAuthStatus, wr as readAgentHarnessModelRecordSync, zt as captureTranscriptUserRecordSnapshot } from "./queries-DCX27GRr.js";
21
+ import { a as getCostForIssueAggregateSync, c as getDailyTrendsSync, d as init_cost_sync, l as getModelRollupSync, n as getBackgroundCostBySourceSync, p as queryCostEventsSync, r as getCavemanExperimentDataSync, s as getCostsByIssueSync, u as getTodayCostSync } from "./cost-sync-DiUBXwl6.js";
22
+ import { c as getAgentsNeedingAttention, d as CostResolverLive, f as CostWriter, l as CostDoorLive, n as readCloisterStateFile, o as generateHealthSummary, s as getAgentHealth, t as getCloisterService, u as CostResolver } from "./service-BzFG0Us_.js";
23
+ import { s as init_agent_runtime_mirror } from "./session-history-C_EMhIIF.js";
24
+ import { t as init_behavior } from "./behavior-B7biGtFT.js";
25
+ import { n as AgentStateServiceLive } from "./agent-state-service-BOzQhLjU.js";
26
+ import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-CHbrjg6m.js";
27
+ import { d as init_typed_errors, i as PlanEmpty, l as WorkspaceCreateError, n as AgentStartError, s as TrackerApiError, t as AgentAlreadyRunning, u as WorkspaceNotFound } from "./typed-errors-Bn_2WRU7.js";
28
+ import { i as init_linear_client, r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-CYZRrcjp.js";
29
+ import { i as init_github_client, r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-BrAC6ELh.js";
30
+ import { i as init_rally_client, r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-CyBBEDHu.js";
31
+ import { n as resolveGitHubIssueSync, r as resolveTrackerTypeSync, t as init_tracker_utils } from "./tracker-utils-DZZq_C0R.js";
32
+ import { a as CacheService, i as startSharedIssueService, n as init_issue_service_singleton, o as init_cache_service, r as issue_service_singleton_exports, s as parseIntegerHeader, t as getSharedIssueService } from "./issue-service-singleton-F3A5VP6M.js";
33
+ import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-BG6yQKNL.js";
34
+ import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-CxMes51i.js";
35
+ import { c as init_review_status_sync, i as getMergeBlockerReconcileCandidates } from "./review-status-sync-h2CJX6ju.js";
36
+ import { n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-DWnFE0b6.js";
37
+ import { a as PAN_DIRNAME, d as WORKSPACE_RUNTIME_DIRNAME, f as asPanSpecDocument, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-D2ETIB8T.js";
38
+ import { C as scheduleAutoMergeWithResult, _ as markMerged, c as init_merge_sync, f as listActiveAutoMerges, g as markFailed, h as markBlocked, i as getActionableAutoMerge, l as isFlywheelGloballyPaused, m as listProblemAutoMerges, n as countActionableAutoMerges, p as listDuePendingAutoMerges, t as cancelPending, v as markMergingBlocked, w as transitionToMerging, x as requeueToPending } from "./merge-sync-CM978zez.js";
39
+ import { D as writeSpecForIssue, E as writeSpecDocument, S as init_specs, a as findWorkspaceDraftPlan, m as readWorkspacePlanSync, o as init_io, p as readWorkspacePlan, r as findPlan, s as isPlanningComplete, u as readPlan, v as init_types$1, x as findSpecByIssue, y as subItemsOf } from "./io-C0NV7y6C.js";
40
+ import { C as restartCliproxy, S as readPidFile, T as stopCliproxy, b as isCliproxyInstalled, d as getCliproxyAuthDir, o as bridgeCodexAuthToCliproxy, v as init_cliproxy, w as startCliproxy, x as isCliproxyRunning, y as installCliproxy } from "./cliproxy-CG4meRFc.js";
41
+ import { $ as updateConversationForkFallbackReason, A as isAgentConversationName, B as removeFavorite, C as getConversationByTmuxSession, D as importLegacyConversation, F as markConversationEnded, H as setClearedToConvId, I as markConversationRunning, J as setForkRequest, M as listConversations, N as listFavoritedIds, O as incrementForkRetryCount, P as markConversationActive, S as getConversationByName, T as getStuckForks, U as setConversationClaudeSessionId, X as unarchiveConversation, Y as setImportedConversationLinks, Z as updateConversationCost, _ as canRefineTitle, _t as getDiscoveredStats, at as aggregateDiscoveredSessionCost, b as getConversationByClaudeSessionId, ct as countDiscoveredSessions, et as updateConversationTitle, ft as findDiscoveredSessions, gt as getDiscoveredSessionBySessionId, h as archiveConversation, j as listArchivedConversationsWithEnrichment, k as init_conversations, mt as getDiscoveredSessionById, ot as aggregateDiscoveredSessionCostBy, q as setFavorite, tt as updateForkStatus, v as canReplaceTitle, w as getConversationLedgerCosts, x as getConversationById, y as createConversation, yt as init_discovered_sessions, z as recordConversationHandoff } from "./conversations-D7lR670u.js";
42
+ import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-B2CfNPFw.js";
43
+ import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-BLbcDqUp.js";
44
+ import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-O2smCvSz.js";
45
+ import { C as init_launcher_generator, D as requireModelOverrideSync, E as normalizeModelOverrideSync, S as generateLauncherScriptSync, T as init_model_validation, w as MODEL_ID_PATTERN } from "./auto-spawn-consent-BooqhC3L.js";
46
+ import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-DYVLnX9t.js";
47
+ import { C as ensureProjectLayer, E as init_layers, I as workspaceContextFile, N as resolveProjectContextFile, P as resolveWorkspaceContextFile, S as codexGlobalContextFile, T as globalContextFile$1, b as validateTemplate, c as init_render, d as userContentOutsideRegion, i as workspaceContextWithoutProjectLayer, r as init_assemble, s as hasManagedRegion, v as init_harness, y as renderForHarness } from "./assemble-DsqK9OAq.js";
48
+ import { l as init_codex, s as findRolloutPath } from "./codex-BYwi1uyW.js";
49
+ import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-CnBHpd57.js";
50
+ import { f as init_config$1, m as loadConfigSync$1, s as getDashboardApiUrlSync } from "./config-CX4vk1CV.js";
51
+ import { D as setSetting, E as setMergeTrainEnabled, S as setFlywheelAutoPickupBacklog, T as setLastCleanShutdownAt, b as setDeaconGloballyPausedSync, c as init_control_settings, d as isDeaconGloballyPausedSync, f as isFlywheelAutoPickupBacklog, g as setBootReconciliationDecision, h as isMergeTrainEnabled, l as isCloisterSpawnsPausedSync, m as isFlywheelRequireUatBeforeMerge, n as FLYWHEEL_GLOBAL_PAUSE_KEY, p as isFlywheelGloballyPaused$1, r as getBootReconciliationState, s as getSetting, t as FLYWHEEL_ACTIVE_RUN_ID_KEY, v as setCloisterSpawnsPausedSync, w as setFlywheelRequireUatBeforeMerge } from "./control-settings-qYYHrIqy.js";
52
+ import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-BVj6sI8m.js";
53
+ import { a as loadCloisterConfigSync, o as saveCloisterConfigSync, r as init_config$2, s as shouldAutoStart } from "./config-ktAVnp4s.js";
54
+ import { c as isStateMigrated, i as ensureStateWorktree, o as init_state_home, r as clearStateMigrationCache, s as inspectStateMigration } from "./state-home-B4EWfIxF.js";
55
+ import { i as checkPrdGateSync, s as promoteWorkspacePrdDraft, t as init_pan_dir } from "./pan-dir-DAOb1V2-.js";
56
+ import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-1XSeczTr.js";
57
+ import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-MNE5O8hn.js";
58
+ import { a as buildMatchQuery, c as init_query_expansion, i as resolveKnowledgeBundleRoot, n as init_injection, o as init_search, r as injectPromptTimeMemory, s as clearQueryExpansionCache } from "./injection-CCopdUKz.js";
59
+ import { i as runMemoryFtsTransaction, n as init_fts_db, r as runMemoryFtsStatement, t as closeMemoryFtsDatabases } from "./fts-db-wROfFfje.js";
60
+ import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-CZ8WPtdk.js";
61
+ import { A as createSettledTtlPromiseCache, D as init_advisory_checks, E as verifyAppCanMerge, M as withConcurrencyLimit, O as isAdvisoryCheckName, d as getPullRequestState, f as init_github_app, j as init_concurrency$1, k as createPromiseConcurrencyLimiter, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-gVnZcP9B.js";
62
+ import { C as getWorkspacePathForIssue, E as stopAgentOutputService, S as resolveIssueHeadlineCost, T as startAgentOutputService, _ as getCostsForIssueSync, b as processPendingFeedbackDeliveries, d as resumeQueuedMerges, f as syncWalFromAllProjects, g as migrateAllSessionsSync, h as reclassifyUnknownCostEventsSync, l as internalEventsRouteLayer, m as reconcilePiTranscripts, p as reconcile$1, t as workspacesRouteLayer, u as eventsRouteLayer, v as rebuildCacheSync, w as retainAgentOutputInterest, x as getCachedRunningAgents, y as syncCacheSync } from "./workspaces-DbtMX2TM.js";
63
+ import { _ as init_codex_conversation_parser, a as contextUsageFromParseResult, b as parseAcpConversationMessages, c as parseEntireConversation, d as init_pi_conversation_parser, f as isPiSessionFile, g as parseOhmypiConversationMessages, h as isOhmypiSessionFile, i as computeContextUsage, l as parseFromLastCompactBoundary, m as init_ohmypi_conversation_parser, n as gateSnapshotEmission, o as summarizeConversationActivity, p as parsePiConversationMessages, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages, y as init_acp_conversation_parser } from "./conversation-service-CZiUE8Uw.js";
64
+ import { c as countPendingAskUserQuestionsForAgent, g as detectAwaitingInputFromPaneSync, h as detectAwaitingInputForAgent, l as getAgentJsonlMtime, m as scanPendingInputsPromise, o as getRuntimeForAgent, s as computeAgentEnrichment } from "./stuck-remediation-DmY5UJLg.js";
65
+ import { a as enrichSessions, c as searchSessions, i as CostThresholdError, l as embed, n as getSessionsFeedFacets, o as embedSessions, r as listSessionsFeed, s as parseRelativeTime, t as scan } from "./scanner-ChURu_b-.js";
66
+ import { c as tailEventsSync, n as deduplicateEventsSync, o as readEventsSync } from "./events-DhRN-6vM.js";
67
+ import { n as recordBackgroundAiCost, t as init_cost } from "./cost-CWvN9FP2.js";
68
+ import { a as getByIssueId, i as parseFlywheelStatsWindow, n as derivePipelineRunStatsInputs, o as markFixed, r as computeFlywheelStats, s as upsert, t as listSubstrateBugWeights } from "./substrate-bug-weights-service-BvTWrFUz.js";
69
+ import { n as parseSequenceMd, r as writeSequenceMd, t as init_sequence_io } from "./sequence-io-D9ITDxzq.js";
70
+ import { _ as normalizeGate, d as computeEpicGroups, f as computeLanes, h as init_pickup, l as classifyIssue, m as computeWaves, p as computeStats, u as computeCohort, v as selectNeedsPlanning } from "./pickup-zXZl5lQI.js";
71
+ import { B as getBook, C as readCurrentLatestFlywheelStatus, D as writeFlywheelLaunchMetadata, E as subscribeLatestFlywheelStatus, F as setItemRequirements, H as liveOrderIssueLookup, I as setSettings, L as setStatus, M as moveItem, N as removeItem, O as writeLatestFlywheelStatus, P as renameBook, R as backlogCandidates, S as nextFlywheelRunId, T as resolveLiveFlywheelRunId, V as listBooks, a as isFlywheelDevcontainerRuntime, b as isFlywheelRunId, f as spawnFlywheelAgent, g as abortFlywheelRun, j as createBook, k as addItems, p as buildClassifyLookups, s as loadResumeSessionId, t as FLYWHEEL_ORCHESTRATOR_AGENT_ID, u as saveResumeSessionId, v as getFlywheelRunDetail, w as readFlywheelLaunchMetadata, x as listFlywheelRuns, z as computeBookProgress } from "./flywheel-CTVY3yCG.js";
72
+ import { D as loadConfig, Dt as paneShowsClaudeBootBlockingScreen, F as setAgentStoppedNotifier, Ft as getCurrentDockerStats, G as isAutoResumableRole, Ht as startSmeeProcessSync, I as setMergeReadyNotifier, It as getAcceptedSystemHealthSnapshot, J as startBootReconciliation, K as isBootReconciliationCandidate, Lt as getDeployStaleness, Mt as getResourceStacks, Nt as formatUptime, O as loadState, P as setAgentStatusChangedNotifier, Pt as getContainerHistory, Ut as classifyAgentHealth, Vt as isSmeeConfiguredSync, W as extendBootReconciliationGrace, b as getDeaconLogs, n as assessDeaconPatrolFreshness, q as listBootReconciliationCandidates, t as applyBootReconciliationDecision, zt as getSystemHealthEvidenceSnapshot } from "./deacon-B1LD5cJU.js";
73
+ import { c as installGitHooksInDir, f as detectPlatform, p as init_platform, s as init_git_hooks } from "./workspace-manager-CXfrw4rR.js";
74
+ import { a as getShadowState, s as init_shadow_state } from "./shadow-state-fzIqIMDD.js";
75
+ import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-CNNGbhWm.js";
76
+ import { i as parseArtifactRef, r as init_forge } from "./forge-RTNqJe6a.js";
77
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-xpFgU632.js";
78
+ import { V as getReviewerSessionName, t as init_specialists } from "./specialists-Dfx9_Wzb.js";
79
+ import { s as findPrdAnywhereSync } from "./archive-planning-Binfb99i.js";
80
+ import { A as removeIssueReleasedLabel, C as applyIssueReleasedLabel, D as removeIssueObjectionLabel, E as removeIssueBlocksMainLabel, O as removeIssueParkedLabel, S as applyIssueReadyLabel, T as init_label_ops, a as gatherProjectLensSignals, b as applyIssueObjectionLabel, g as parseIssueIdFromTextSync, h as init_resource_utils, j as removeIssueVetoedLabel, k as removeIssueReadyLabel, n as PipelineMembershipUnavailableError, s as init_pipeline_membership_gather, u as listOpenPullRequestsSnapshot, w as applyIssueVetoedLabel, x as applyIssueParkedLabel, y as applyIssueBlocksMainLabel } from "./pipeline-membership-gather-BIcJ-N0W.js";
81
+ import { n as init_pipeline_membership, r as resolvePipelineMembership } from "./pipeline-membership-B2yUcBz7.js";
82
+ import { b as resolveSwarmPolicy } from "./deacon-swarm-DwGUgSVp.js";
83
+ import { a as init_boot_gates, i as formatBootGateState, o as resolveBootGates } from "./no-resume-mode-DZvP0M_S.js";
84
+ import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-nXEKoxI7.js";
85
+ import { a as spawnPlanningSession, r as resolveAutoSpawnOnFinalize } from "./spawn-planning-session-DhCoBPct.js";
86
+ import { r as computeMergeQueueFromCandidates, s as listEligibleCandidatesByProject } from "./flywheel-merge-order-CMGz-imq.js";
87
+ import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-eHSj_NsP.js";
88
+ import { d as killRemoteAgent, m as loadRemoteAgentState, o as getRemoteAgentOutput, r as checkRemoteSpendCap, s as init_remote_agents, v as sendToRemoteAgent, y as spawnRemoteAgent } from "./remote-agents-kxraOCGT.js";
89
+ import { r as spawnInspectAgent } from "./inspect-agent-FCDlNT_i.js";
90
+ import { i as lookupPullRequestNumberForBranch, n as init_github_pr_lookup, t as githubPrLookupSource } from "./github-pr-lookup-CgMULTPf.js";
91
+ import { a as fetchIssuePullRequestDiff, c as getCachedIssuePrTabResponse, d as setCachedIssuePrTabResponse, i as fetchIssuePullRequestDetails, l as getIssuePrTabCacheGeneration, n as fetchIssueCheckRuns, o as init_pull_requests, r as fetchIssuePullRequest, s as bumpIssuePrTabCacheGeneration, u as init_pr_tab_cache } from "./pull-requests-BonZ4WVG.js";
92
+ import { n as DOD_ROWS } from "./dod-Bg6wsKTV.js";
93
+ import { c as init_pending, l as maybeTriggerStatusRollup, o as readRecentObservations, r as init_rollup, u as writePendingTurn } from "./rollup-CUoav0Op.js";
94
+ import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-IOssGwg7.js";
95
+ import { T as listGitOperationsSync, w as init_git_activity } from "./merge-agent-gpiRkcvj.js";
96
+ import { t as readVerificationArtifact } from "./verification-artifact-D4b-bio9.js";
97
+ import { i as readPendingDeploy, n as init_deploy_queue } from "./deploy-queue-CKT_Ia9p.js";
98
+ import { t as getAgentCommandSync } from "./settings-DejgzzLs.js";
99
+ import { n as init_review_agent, r as isExtendedReviewEnabled } from "./review-agent-CIRr0yYt.js";
100
+ import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-BienmcrZ.js";
101
+ import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-DsbpIq2d.js";
102
+ import { _ as init_transcript_adapter, a as generateFallbackSummary, c as handoffPreconditionFallbackReason, d as prependFallbackFocus, f as requestHandoffFromAgent, g as getTranscriptAdapter, i as copySessionFromCompactBoundary, l as init_summary_fork, o as generateSummaryForFork, p as reserveSummaryForkSession, r as authorHandoffExternal, s as handoffFailureReason, u as logHandoffFallback } from "./summary-fork-Ct514_Jl.js";
103
+ import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-CXQrN3I_.js";
104
+ import { t as init_context_layers } from "./context-layers-DlWsDiRF.js";
105
+ import { a as appendLinearMcpAuthHealthyEvent, r as appendLinearMcpAuthCallbackRelayedEvent, u as resolveLinearMcpAuthIntervention } from "./linear-mcp-auth-Cp0XaP96.js";
106
+ import { i as getMergeBlockersPayload, n as hasOrderIssuePrd, r as validateBookForStart, t as createOrderPrdLookup } from "./validate-606KcYZC.js";
107
+ import { a as spawnSequencerAgent, i as init_sequencer_agent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-m7gmaakW.js";
108
+ import { n as sameCanonicalReviewStatus, t as emitReviewStatusChanged } from "./review-status-emit-BPJwYcRy.js";
109
+ import "./supervisor-B7BHGcNA.js";
110
+ import { l as startUatTrainReconciler, u as stopUatTrainReconciler } from "./uat-train-Dv0Bxer7.js";
111
+ import { n as settlePendingLifecycleClaim, t as claimPendingLifecycleFile } from "./pending-lifecycle-claim-DQUHIDfX.js";
112
+ import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-DYtLu-PB.js";
113
113
  import { createRequire } from "node:module";
114
114
  import * as sp from "node:path";
115
115
  import { basename, delimiter, dirname, extname, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
@@ -404,8 +404,10 @@ init_js_yaml();
404
404
  init_load();
405
405
  init_config_yaml();
406
406
  init_ui_theme();
407
+ init_pane_choice_menu();
407
408
  init_infra();
408
409
  init_event_store();
410
+ init_persistent_logger();
409
411
  init_agents();
410
412
  init_read_model();
411
413
  init_checkpoint_manager();
@@ -718,7 +720,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
718
720
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
719
721
  const plan = readWorkspacePlanSync(workspacePath);
720
722
  if (!plan || plan.plan.items.length === 0) throw new PlanEmpty({ id: issueId });
721
- const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-BKKkxKgK.js");
723
+ const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-Dnn4XgdB.js");
722
724
  const normalizedId = normalizeAgentId(issueId);
723
725
  if ((await Effect.runPromise(getAgentState(normalizedId)))?.status === "running") throw new AgentAlreadyRunning({ id: issueId });
724
726
  return {
@@ -728,7 +730,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
728
730
  model: opts.model,
729
731
  role: "work",
730
732
  prompt: opts.prompt,
731
- allowHost: opts.allowHost
733
+ allowHost: opts.allowHost,
734
+ startedBy: "dashboard:agent-spawner"
732
735
  })).id ?? normalizedId,
733
736
  issueId,
734
737
  sessionName: normalizedId,
@@ -749,7 +752,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
749
752
  const { workspacePath, projectPath, issue } = opts;
750
753
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
751
754
  const sessionName = opts.sessionName ?? `planning-${issueId.toLowerCase()}`;
752
- const { spawnPlanningSession } = await import("./spawn-planning-session-1nFi3gfk.js");
755
+ const { spawnPlanningSession } = await import("./spawn-planning-session-Dsv-350T.js");
753
756
  const result = await spawnPlanningSession({
754
757
  issue: {
755
758
  id: issue.id,
@@ -764,7 +767,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
764
767
  sessionName,
765
768
  workspaceLocation: "local",
766
769
  shadowMode: opts.shadowMode ?? false,
767
- autoSpawnOnFinalize: false
770
+ autoSpawnOnFinalize: false,
771
+ startedBy: "dashboard:agent-spawner"
768
772
  });
769
773
  if (!result.success) throw new AgentStartError({
770
774
  id: issueId,
@@ -782,14 +786,14 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
782
786
  }),
783
787
  kill: (agentId) => Effect.tryPromise({
784
788
  try: async () => {
785
- const { stopAgent } = await import("./agents-BKKkxKgK.js");
789
+ const { stopAgent } = await import("./agents-Dnn4XgdB.js");
786
790
  await Effect.runPromise(stopAgent(agentId));
787
791
  },
788
792
  catch: () => void 0
789
793
  }).pipe(Effect.ignore),
790
794
  message: (agentId, msg) => Effect.tryPromise({
791
795
  try: async () => {
792
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
796
+ const { messageAgent } = await import("./agents-Dnn4XgdB.js");
793
797
  await messageAgent(agentId, msg);
794
798
  },
795
799
  catch: (err) => new AgentStartError({
@@ -800,8 +804,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
800
804
  }),
801
805
  deepWipe: (issueId, opts) => Effect.tryPromise({
802
806
  try: async () => {
803
- const { deepWipe } = await import("./workflows-CHrx_hcW.js");
804
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
807
+ const { deepWipe } = await import("./workflows-DN6NyVGd.js");
808
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
805
809
  const project = resolveProjectFromIssueSync(issueId);
806
810
  const projectPath = project?.projectPath ?? process.cwd();
807
811
  await Effect.runPromise(deepWipe({
@@ -860,8 +864,8 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
860
864
  const { workspacePath, branch } = getWorkspacePath(issueId);
861
865
  const issueLower = issueId.toLowerCase();
862
866
  if (existsSync$1(workspacePath)) return workspacePath;
863
- const { createWorkspace } = await import("./workspace-manager-CDTKjjdU.js");
864
- const { loadProjectsConfigSync } = await import("./projects-B03Wr-xc.js");
867
+ const { createWorkspace } = await import("./workspace-manager-B38rFWA1.js");
868
+ const { loadProjectsConfigSync } = await import("./projects-_n3Zui6K.js");
865
869
  const { projects } = loadProjectsConfigSync();
866
870
  const project = resolveProjectFromIssueSync(issueId);
867
871
  if (!project) throw new WorkspaceCreateError({
@@ -896,7 +900,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
896
900
  const { workspacePath } = getWorkspacePath(issueId);
897
901
  const issueLower = issueId.toLowerCase();
898
902
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
899
- const { removeWorkspace } = await import("./workspace-manager-CDTKjjdU.js");
903
+ const { removeWorkspace } = await import("./workspace-manager-B38rFWA1.js");
900
904
  const project = resolveProjectFromIssueSync(issueId);
901
905
  if (!project) throw new WorkspaceCreateError({
902
906
  id: issueId,
@@ -927,7 +931,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
927
931
  try: async () => {
928
932
  const { workspacePath } = getWorkspacePath(issueId);
929
933
  const issueLower = issueId.toLowerCase();
930
- const { stopWorkspaceDocker } = await import("./workspace-manager-CDTKjjdU.js");
934
+ const { stopWorkspaceDocker } = await import("./workspace-manager-B38rFWA1.js");
931
935
  await Effect.runPromise(stopWorkspaceDocker(workspacePath, issueLower));
932
936
  },
933
937
  catch: () => void 0
@@ -996,7 +1000,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
996
1000
  join(workspacePath, ".devcontainer", "docker-compose.devcontainer.yml")
997
1001
  ];
998
1002
  if (!composePaths.find((p) => existsSync$1(p))) {
999
- const { ensureDevcontainerSync } = await import("./ensure-devcontainer-C98V8yW-.js");
1003
+ const { ensureDevcontainerSync } = await import("./ensure-devcontainer-Bg5HJAcO.js");
1000
1004
  const ensure = ensureDevcontainerSync({
1001
1005
  workspacePath,
1002
1006
  issueId
@@ -17261,7 +17265,7 @@ var require_get_vercel_oidc_token = /* @__PURE__ */ __commonJSMin(((exports, mod
17261
17265
  err = error;
17262
17266
  }
17263
17267
  try {
17264
- const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-zlz9U0ki.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-Cxbk023d.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
17268
+ const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-CrfQ2FKf.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-B10VFNOD.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
17265
17269
  if (!token || isExpired(getTokenPayload(token), options?.expirationBufferMs)) {
17266
17270
  await refreshToken(options);
17267
17271
  token = getVercelOidcTokenSync();
@@ -29578,7 +29582,7 @@ var GoogleCloudTranscription = class {
29578
29582
  }
29579
29583
  async start(apiKey, model) {
29580
29584
  try {
29581
- const { SpeechClient } = await import("./src-Ck028hjO.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
29585
+ const { SpeechClient } = await import("./src-B2e5rGu2.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
29582
29586
  if (this.closed) return;
29583
29587
  const stream = new SpeechClient({ apiKey }).streamingRecognize({
29584
29588
  config: {
@@ -30404,15 +30408,15 @@ async function runInline$1(operation, payload, onProgress) {
30404
30408
  });
30405
30409
  }
30406
30410
  case "getArtifactBySlug": {
30407
- const { getArtifactBySlugJob } = await import("./artifact-index-jobs-ug6ZxIP5.js");
30411
+ const { getArtifactBySlugJob } = await import("./artifact-index-jobs-Jn7BGOtV.js");
30408
30412
  return getArtifactBySlugJob(payload);
30409
30413
  }
30410
30414
  case "listArtifactsForWorkspaceOrIssue": {
30411
- const { listArtifactsForWorkspaceOrIssueJob } = await import("./artifact-index-jobs-ug6ZxIP5.js");
30415
+ const { listArtifactsForWorkspaceOrIssueJob } = await import("./artifact-index-jobs-Jn7BGOtV.js");
30412
30416
  return listArtifactsForWorkspaceOrIssueJob(payload);
30413
30417
  }
30414
30418
  case "unshareArtifactBySlug": {
30415
- const { unshareArtifactBySlugJob } = await import("./artifact-index-jobs-ug6ZxIP5.js");
30419
+ const { unshareArtifactBySlugJob } = await import("./artifact-index-jobs-Jn7BGOtV.js");
30416
30420
  return unshareArtifactBySlugJob(payload);
30417
30421
  }
30418
30422
  }
@@ -30803,6 +30807,98 @@ function normalizeSessionsFeedFilter(input) {
30803
30807
  };
30804
30808
  }
30805
30809
  //#endregion
30810
+ //#region services/conversation/subagents.ts
30811
+ /**
30812
+ * Read-only discovery and streaming support for Claude Code conversation subagents.
30813
+ * See docs/CONVERSATION-SUBAGENTS.md for the file layout and transport contract.
30814
+ */
30815
+ const metaCache = /* @__PURE__ */ new Map();
30816
+ const SAFE_AGENT_ID = /^[A-Za-z0-9_-]+$/;
30817
+ function subagentsDirFor(sessionFile) {
30818
+ return join(sessionFile.endsWith(".jsonl") ? sessionFile.slice(0, -6) : sessionFile, "subagents");
30819
+ }
30820
+ function parseMeta(agentId, value) {
30821
+ if (typeof value !== "object" || value === null || !("agentType" in value) || typeof value.agentType !== "string" || !("description" in value) || typeof value.description !== "string" || !("toolUseId" in value) || typeof value.toolUseId !== "string" || !("spawnDepth" in value) || typeof value.spawnDepth !== "number") throw new Error("invalid subagent metadata");
30822
+ return {
30823
+ agentId,
30824
+ agentType: value.agentType,
30825
+ description: value.description,
30826
+ toolUseId: value.toolUseId,
30827
+ spawnDepth: value.spawnDepth
30828
+ };
30829
+ }
30830
+ async function readMeta(metaPath, agentId) {
30831
+ const cached = metaCache.get(metaPath);
30832
+ if (cached !== void 0) return cached;
30833
+ try {
30834
+ const parsed = parseMeta(agentId, JSON.parse(await readFile(metaPath, "utf8")));
30835
+ metaCache.set(metaPath, parsed);
30836
+ return parsed;
30837
+ } catch (error) {
30838
+ console.warn(`[conversation-subagents] Failed to parse ${metaPath}:`, error);
30839
+ return null;
30840
+ }
30841
+ }
30842
+ async function listSubagentMetas(sessionFile) {
30843
+ const subagentsDir = subagentsDirFor(sessionFile);
30844
+ let entries;
30845
+ try {
30846
+ entries = await readdir(subagentsDir);
30847
+ } catch (error) {
30848
+ if (error.code === "ENOENT") return [];
30849
+ throw error;
30850
+ }
30851
+ const metas = [];
30852
+ for (const entry of entries.sort()) {
30853
+ const match = /^agent-(.+)\.meta\.json$/.exec(entry);
30854
+ if (!match?.[1]) continue;
30855
+ const meta = await readMeta(join(subagentsDir, entry), match[1]);
30856
+ if (meta) metas.push(meta);
30857
+ }
30858
+ return metas;
30859
+ }
30860
+ function subagentTranscriptPath(sessionFile, agentId) {
30861
+ if (!SAFE_AGENT_ID.test(agentId)) return null;
30862
+ const subagentsDir = resolve(subagentsDirFor(sessionFile));
30863
+ const transcriptPath = resolve(subagentsDir, `agent-${agentId}.jsonl`);
30864
+ if (dirname(transcriptPath) !== subagentsDir || !transcriptPath.startsWith(`${subagentsDir}${sep}`)) return null;
30865
+ return transcriptPath;
30866
+ }
30867
+ async function startSubagentListPolling(sessionFile, pendingToolUseIds, emit) {
30868
+ let stopped = false;
30869
+ let lastSerialized = null;
30870
+ let refreshChain = Promise.resolve();
30871
+ const refresh = () => {
30872
+ refreshChain = refreshChain.then(async () => {
30873
+ if (stopped) return;
30874
+ const pending = pendingToolUseIds();
30875
+ const subagents = (await listSubagentMetas(sessionFile)).map((meta) => ({
30876
+ ...meta,
30877
+ status: pending.has(meta.toolUseId) ? "running" : "done"
30878
+ }));
30879
+ const serialized = JSON.stringify(subagents);
30880
+ if (serialized === lastSerialized) return;
30881
+ lastSerialized = serialized;
30882
+ emit({
30883
+ kind: "subagents",
30884
+ subagents
30885
+ });
30886
+ }).catch((error) => {
30887
+ console.warn(`[conversation-subagents] Failed to refresh ${sessionFile}:`, error);
30888
+ });
30889
+ return refreshChain;
30890
+ };
30891
+ await refresh();
30892
+ const interval = setInterval(() => void refresh(), 2e3);
30893
+ return {
30894
+ refresh,
30895
+ stop: () => {
30896
+ stopped = true;
30897
+ clearInterval(interval);
30898
+ }
30899
+ };
30900
+ }
30901
+ //#endregion
30806
30902
  //#region ws-rpc.ts
30807
30903
  /**
30808
30904
  * WebSocket RPC handlers — implements PanRpcGroup using Effect (PAN-428 B5)
@@ -31315,7 +31411,8 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
31315
31411
  if (getHarnessBehavior(conv.harness).transcriptKind !== "claude-jsonl") return conversationDiscoveringStream();
31316
31412
  const launcherTmuxSession = conv.tmuxSession;
31317
31413
  const resolvedSessionId = (launcherTmuxSession ? yield* Effect.promise(() => readLauncherPinnedSessionId(launcherTmuxSession)) : null) ?? conv.claudeSessionId;
31318
- const sessionFile = resolvedSessionId ? sessionFilePath(conv.cwd, resolvedSessionId) : null;
31414
+ const parentSessionFile = resolvedSessionId ? sessionFilePath(conv.cwd, resolvedSessionId) : null;
31415
+ const sessionFile = parentSessionFile && input.agentId ? subagentTranscriptPath(parentSessionFile, input.agentId) : parentSessionFile;
31319
31416
  const model = conv.model ?? null;
31320
31417
  if (!sessionFile) return conversationDiscoveringStream();
31321
31418
  if (isPiSessionFile(sessionFile)) return conversationDiscoveringStream();
@@ -31354,11 +31451,15 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
31354
31451
  compactBoundaries: initial.compactBoundaries && initial.compactBoundaries.length > 0 ? initial.compactBoundaries : void 0,
31355
31452
  contextUsage: currentContextUsage
31356
31453
  });
31357
- return watchConversation(sessionFile, (result) => {
31454
+ let pendingSubagentToolUseIds = new Set(initial.pendingToolUse.keys());
31455
+ const subagentPoller = input.agentId ? null : await startSubagentListPolling(sessionFile, () => pendingSubagentToolUseIds, offer);
31456
+ const handle = watchConversation(sessionFile, (result) => {
31358
31457
  const gate = gateSnapshotEmission(result.byteOffset < currentByteOffset, result.messages.length, highWaterCount);
31359
31458
  highWaterCount = gate.highWaterCount;
31360
31459
  currentByteOffset = result.byteOffset;
31361
31460
  currentContextUsage = contextUsageFromParseResult(result, model);
31461
+ pendingSubagentToolUseIds = new Set(result.pendingToolUse.keys());
31462
+ subagentPoller?.refresh();
31362
31463
  if (gate.suppressedShrink) console.warn(`[conv-stream] suppressed shrinking reset for ${input.conversationName}: byteOffset ${currentByteOffset} (re-parsed ${result.messages.length} msgs) < high-water ${highWaterCount} — treating as transient rewrite, merging instead of replacing`);
31363
31464
  offer({
31364
31465
  kind: "messages",
@@ -31374,6 +31475,10 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
31374
31475
  byteOffset: initial.byteOffset,
31375
31476
  priorState
31376
31477
  });
31478
+ return { stop() {
31479
+ handle.stop();
31480
+ subagentPoller?.stop();
31481
+ } };
31377
31482
  }), (handle) => Effect.sync(() => {
31378
31483
  handle.stop();
31379
31484
  })));
@@ -31895,8 +32000,30 @@ function hasBlocksCycle(doc) {
31895
32000
  }
31896
32001
  return visited < itemIds.size;
31897
32002
  }
32003
+ function lintProjectedSurface(doc) {
32004
+ const issues = [];
32005
+ const files = /* @__PURE__ */ new Set();
32006
+ const subsystems = /* @__PURE__ */ new Set();
32007
+ for (const item of doc.plan.items) {
32008
+ if (item.status === "cancelled") continue;
32009
+ const filesScope = item.metadata?.files_scope;
32010
+ if (Array.isArray(filesScope)) for (const scope of filesScope) {
32011
+ const normalized = scope.replace(/\/\*+$/, "");
32012
+ files.add(normalized);
32013
+ const parts = normalized.split("/");
32014
+ if (parts.length >= 2) subsystems.add(`${parts[0]}/${parts[1]}`);
32015
+ else if (parts.length === 1) subsystems.add(parts[0]);
32016
+ }
32017
+ }
32018
+ const fileCount = files.size;
32019
+ const subsystemCount = subsystems.size;
32020
+ const hasJustification = typeof doc.plan.metadata?.sizeJustification === "string" && doc.plan.metadata.sizeJustification.trim().length > 0;
32021
+ if ((fileCount > 25 || subsystemCount > 6) && !hasJustification) issues.push(issue(null, "projected-surface", `Plan touches ${fileCount} files (limit: 25) and ${subsystemCount} subsystems (limit: 6). Split into independently-shippable sibling issues per the swarm contract, or set plan.metadata.sizeJustification for genuinely inseparable work.`));
32022
+ return issues;
32023
+ }
31898
32024
  function lintPlanQuality(doc, options = {}) {
31899
32025
  return [
32026
+ ...lintProjectedSurface(doc),
31900
32027
  ...doc.plan.items.flatMap((item) => item.status === "cancelled" ? [] : lintItem(item)),
31901
32028
  ...lintDocumentReferences(doc),
31902
32029
  ...lintDocsCoverage(doc),
@@ -31917,7 +32044,7 @@ const execFileAsync$18 = promisify(execFile);
31917
32044
  async function loadTrackerIssues() {
31918
32045
  const map = /* @__PURE__ */ new Map();
31919
32046
  try {
31920
- const { getSharedIssueService } = await import("./issue-service-singleton-PMx8F1jr.js");
32047
+ const { getSharedIssueService } = await import("./issue-service-singleton-lwFJ4dHk.js");
31921
32048
  const issues = (await getSharedIssueService()).getIssues();
31922
32049
  for (const issue of issues) if (issue.identifier) map.set(issue.identifier.toUpperCase(), issue);
31923
32050
  } catch {}
@@ -31940,7 +32067,7 @@ async function loadDockerContainers() {
31940
32067
  }
31941
32068
  async function loadActiveRemoteAgentStates() {
31942
32069
  try {
31943
- const { listActiveRemoteAgentStates } = await import("./remote-agents-C1bssi41.js");
32070
+ const { listActiveRemoteAgentStates } = await import("./remote-agents-kwsEZvXu.js");
31944
32071
  return listActiveRemoteAgentStates();
31945
32072
  } catch {
31946
32073
  return [];
@@ -33101,15 +33228,19 @@ async function completePlanningAutoSpawn(options) {
33101
33228
  },
33102
33229
  body: JSON.stringify({
33103
33230
  issueId: options.issueId,
33104
- role: "work"
33231
+ role: "work",
33232
+ startedBy: "planning-auto-handoff",
33233
+ autoSpawnConsentRequired: true
33105
33234
  })
33106
33235
  });
33107
33236
  const body = await response.json().catch(() => ({}));
33108
33237
  const agentId = typeof body["agentId"] === "string" ? body["agentId"] : `agent-${options.issueId.toLowerCase()}`;
33109
33238
  if (response.ok && body["success"] !== false) {
33110
- emitCompletePlanningPhase(options.issueId, "autoSpawn", "success", "work agent spawn requested", { agentId });
33239
+ const workAgentQueued = body["startingContainers"] === true;
33240
+ emitCompletePlanningPhase(options.issueId, "autoSpawn", "success", workAgentQueued ? "container startup queued before work-agent spawn" : "work agent spawn requested", { agentId });
33111
33241
  return {
33112
33242
  workAgentSpawned: true,
33243
+ ...workAgentQueued ? { workAgentQueued: true } : {},
33113
33244
  workAgentSession: agentId
33114
33245
  };
33115
33246
  }
@@ -33119,9 +33250,14 @@ async function completePlanningAutoSpawn(options) {
33119
33250
  const recovery = await (options.fetchImpl ?? fetch)(new URL(`/api/workspaces/${encodeURIComponent(options.issueId)}/rebuild-and-start`, dashboardOrigin), {
33120
33251
  method: "POST",
33121
33252
  headers: {
33253
+ "content-type": "application/json",
33122
33254
  origin: dashboardOrigin,
33123
33255
  ...internalTokenHeaders
33124
- }
33256
+ },
33257
+ body: JSON.stringify({
33258
+ startedBy: "planning-auto-handoff",
33259
+ autoSpawnConsentRequired: true
33260
+ })
33125
33261
  });
33126
33262
  const recoveryBody = await recovery.json().catch(() => ({}));
33127
33263
  if (recovery.ok && recoveryBody["success"] !== false) {
@@ -33182,7 +33318,7 @@ async function completePlanningForIssue(options) {
33182
33318
  const { request, id, body, eventStore, linear, lifecycle } = options;
33183
33319
  const skipKill = body?.skipKill === true;
33184
33320
  const bodyAutoSpawn = body?.autoSpawn;
33185
- const autoSpawn = resolveAutoSpawnOnFinalize(bodyAutoSpawn, id);
33321
+ const autoSpawn = await resolveAutoSpawnOnFinalize(bodyAutoSpawn, id);
33186
33322
  const noPrd = body?.noPrd === true;
33187
33323
  if (bodyAutoSpawn === true) {
33188
33324
  const originCheck = validateOrigin$1(request);
@@ -33660,7 +33796,7 @@ async function closeIssuePullRequest(issueId, reason = "Canceled via Overdeck")
33660
33796
  timeout: 15e3
33661
33797
  });
33662
33798
  try {
33663
- const { setReviewStatusSync } = await import("./review-status-BZH8h-6W.js");
33799
+ const { setReviewStatusSync } = await import("./review-status-CacDM78F.js");
33664
33800
  setReviewStatusSync(issueId.toUpperCase(), { prUrl: void 0 });
33665
33801
  } catch {}
33666
33802
  return [`Closed PR #${prNumber} on ${githubCheck.owner}/${githubCheck.repo}`];
@@ -33714,7 +33850,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
33714
33850
  const { ctx, projectConfig } = buildLifecycleContext(id, getIssueDataService$8().getIssueSource(id) ?? void 0);
33715
33851
  const deleteWorkspace = opts.deleteWorkspace ?? true;
33716
33852
  cleanupLog.push(...await closeIssuePullRequest(id, mode === "cancel" ? "Canceled via Overdeck" : "Reset to Todo via Overdeck"));
33717
- const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-DDN8ApVY.js");
33853
+ const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-Di48-w4x.js");
33718
33854
  const workflow = mode === "cancel" ? cancelIssueWorkflow : resetToTodo;
33719
33855
  const result = await Effect.runPromise(workflow(ctx, {
33720
33856
  deleteWorkspace,
@@ -33729,7 +33865,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
33729
33865
  }));
33730
33866
  cleanupLog.push(...result.steps.flatMap((step) => step.details || [step.error].filter(Boolean)));
33731
33867
  if (mode === "cancel") try {
33732
- const { transitionXBriefOnMain } = await import("./lifecycle-io-D_zTLvP1.js");
33868
+ const { transitionXBriefOnMain } = await import("./lifecycle-io-eVG6v_8-.js");
33733
33869
  const tx = await Effect.runPromise(transitionXBriefOnMain(ctx.projectPath, id, "cancelled", "cancelled", `scope: cancel ${id.toUpperCase()} xBRIEF`));
33734
33870
  if (tx.moved) cleanupLog.push(`xBRIEF moved ${tx.fromDir} → cancelled`);
33735
33871
  if (tx.committed) cleanupLog.push(`Committed xBRIEF cancellation on main`);
@@ -33737,8 +33873,8 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
33737
33873
  cleanupLog.push(`xBRIEF cancel transition failed (non-fatal): ${err?.message ?? err}`);
33738
33874
  }
33739
33875
  try {
33740
- const { killAllReviewerSessions } = await import("./review-agent-CD4RCI0Y.js");
33741
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
33876
+ const { killAllReviewerSessions } = await import("./review-agent-UpAM4DmT.js");
33877
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
33742
33878
  const projectKey = resolveProjectFromIssueSync(id)?.projectKey;
33743
33879
  if (projectKey) {
33744
33880
  const { killed } = await Effect.runPromise(killAllReviewerSessions(projectKey, id.toUpperCase()));
@@ -33752,7 +33888,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
33752
33888
  cleanupLog.push("Cleared review status");
33753
33889
  } catch {}
33754
33890
  try {
33755
- const { resetPostMergeState } = await import("./merge-agent-DrXa1CpW.js");
33891
+ const { resetPostMergeState } = await import("./merge-agent-C1-9zbP_.js");
33756
33892
  resetPostMergeState(id);
33757
33893
  resetPostMergeState(id.toUpperCase());
33758
33894
  cleanupLog.push("Cleared merge state");
@@ -33772,7 +33908,7 @@ function closeIssueTransition(options) {
33772
33908
  const { issueId, body, eventStore } = options;
33773
33909
  const { reason } = body;
33774
33910
  const projectPath = getProjectPath$3(void 0, extractPrefixSync(issueId) ?? issueId.split("-")[0]);
33775
- const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-DDN8ApVY.js"));
33911
+ const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-Di48-w4x.js"));
33776
33912
  const githubCheck = isGitHubIssue$4(issueId);
33777
33913
  const issueDataService = getIssueDataService$8();
33778
33914
  const issueSource = issueDataService.getIssueSource(issueId);
@@ -34039,7 +34175,7 @@ function reopenIssueTransition(options) {
34039
34175
  else clearReviewStatus(id.toUpperCase());
34040
34176
  } catch {}
34041
34177
  try {
34042
- const { resetPostMergeState } = await import("./merge-agent-DrXa1CpW.js");
34178
+ const { resetPostMergeState } = await import("./merge-agent-C1-9zbP_.js");
34043
34179
  resetPostMergeState(id);
34044
34180
  resetPostMergeState(id.toUpperCase());
34045
34181
  } catch {}
@@ -34103,7 +34239,7 @@ function moveIssueStatus(options) {
34103
34239
  "done"
34104
34240
  ];
34105
34241
  if (!targetStatus || !validStatuses.includes(targetStatus)) return jsonResponse({ error: `Invalid targetStatus. Must be one of: ${validStatuses.join(", ")}` }, { status: 400 });
34106
- const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-FV6PHfEW.js"));
34242
+ const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-C0Af4clN.js"));
34107
34243
  const issueState = {
34108
34244
  backlog: "open",
34109
34245
  todo: "open",
@@ -34330,7 +34466,7 @@ async function copySettingsToWorkspace(id) {
34330
34466
  success: false,
34331
34467
  error: "Workspace not found"
34332
34468
  }, { status: 404 });
34333
- const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-CDTKjjdU.js");
34469
+ const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-B38rFWA1.js");
34334
34470
  const result = copyOverdeckSettingsToWorkspaceSync(workspacePath);
34335
34471
  return jsonResponse({
34336
34472
  success: result.errors.length === 0 || result.copied.length > 0,
@@ -34439,7 +34575,7 @@ function getProjectPath$2(linearProjectId, issuePrefix) {
34439
34575
  }
34440
34576
  function startPlanningForIssue(options) {
34441
34577
  return Effect.gen(function* () {
34442
- const { id, body, eventStore, linear, github, rally, lifecycle } = options;
34578
+ const { id, body, eventStore, linear, github, rally, lifecycle, startedBy } = options;
34443
34579
  const { skipWorkspace = false, startDocker = false, workspaceLocation = "local", shadowMode = false, model: modelOverride, effort, auto = false, autoStart = false, probe = false, harness = "claude-code" } = body;
34444
34580
  const requestedHarness = harness === "ohmypi" || harness === "claude-code" || harness === "codex" || harness === "acp" ? harness : "claude-code";
34445
34581
  const workModelRaw = body.workModel;
@@ -34545,7 +34681,8 @@ function startPlanningForIssue(options) {
34545
34681
  startedAt: (/* @__PURE__ */ new Date()).toISOString(),
34546
34682
  role: "plan",
34547
34683
  model: "",
34548
- auto: auto === true
34684
+ auto: auto === true,
34685
+ startedBy
34549
34686
  });
34550
34687
  return Promise.resolve();
34551
34688
  });
@@ -34620,6 +34757,7 @@ function startPlanningForIssue(options) {
34620
34757
  auto: auto === true,
34621
34758
  probe: probe === true,
34622
34759
  autoSpawnOnFinalize: autoStart === true,
34760
+ startedBy,
34623
34761
  onProgress: (event) => {
34624
34762
  console.log(`[start-planning] Progress: step=${event.step} label="${event.label}" status=${event.status} detail="${event.detail}"`);
34625
34763
  sendEvent({
@@ -34812,7 +34950,7 @@ function restartFromPlan(options) {
34812
34950
  });
34813
34951
  const resetResult = yield* Effect.promise(async () => {
34814
34952
  try {
34815
- const { runGitResetHard } = await import("./dangerous-git-ops-BcJPC5Rr.js");
34953
+ const { runGitResetHard } = await import("./dangerous-git-ops-DWX6Og8c.js");
34816
34954
  async function findPlanningCommit(grep, label) {
34817
34955
  try {
34818
34956
  const { stdout } = await execAsync$7(`git log --grep="${grep.replace(/"/g, "\\\"")}" --format=%H -1`, {
@@ -35264,7 +35402,7 @@ function closeOutIssue(id, opts = {}) {
35264
35402
  }
35265
35403
  const closeOutResult = yield* Effect.promise(async () => {
35266
35404
  try {
35267
- const { closeOut } = await import("./lifecycle-DDN8ApVY.js");
35405
+ const { closeOut } = await import("./lifecycle-Di48-w4x.js");
35268
35406
  return {
35269
35407
  ok: true,
35270
35408
  result: await Effect.runPromise(closeOut(ctx, {
@@ -35353,7 +35491,7 @@ function bulkCloseOut(body) {
35353
35491
  const invalidIds = issueIds.filter((id) => !isValidIssueId(id));
35354
35492
  if (invalidIds.length > 0) return jsonResponse({ error: `Invalid issue ID format: ${invalidIds.join(", ")}` }, { status: 400 });
35355
35493
  const eventStore = yield* EventStoreService;
35356
- const { closeOut } = yield* Effect.promise(() => import("./lifecycle-DDN8ApVY.js"));
35494
+ const { closeOut } = yield* Effect.promise(() => import("./lifecycle-Di48-w4x.js"));
35357
35495
  const issueDataService = getIssueDataService$5();
35358
35496
  const tasks = [];
35359
35497
  const agentChecks = yield* withConcurrencyLimit(issueIds.map((id) => Effect.promise(async () => {
@@ -35579,8 +35717,8 @@ const getIssueShipLogRoute = HttpRouter.add("GET", "/api/issues/:id/ship-log", h
35579
35717
  const id = (yield* HttpRouter.params)["id"] ?? "";
35580
35718
  if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
35581
35719
  return yield* Effect.promise(async () => {
35582
- const { getShipLog } = await import("./ship-log-xplJ8t75.js");
35583
- const { getReviewStatusSync } = await import("./review-status-BZH8h-6W.js");
35720
+ const { getShipLog } = await import("./ship-log-VAv-lHrF.js");
35721
+ const { getReviewStatusSync } = await import("./review-status-CacDM78F.js");
35584
35722
  const log = getShipLog(id);
35585
35723
  const rs = getReviewStatusSync(id);
35586
35724
  return jsonResponse({
@@ -35595,8 +35733,8 @@ const getIssueVerificationRoute = HttpRouter.add("GET", "/api/issues/:id/verific
35595
35733
  const id = (yield* HttpRouter.params)["id"] ?? "";
35596
35734
  if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
35597
35735
  return yield* Effect.promise(async () => {
35598
- const { readVerificationArtifact } = await import("./verification-artifact-C85cRTc_.js");
35599
- const { getReviewStatusSync } = await import("./review-status-BZH8h-6W.js");
35736
+ const { readVerificationArtifact } = await import("./verification-artifact-GOaj8u2s.js");
35737
+ const { getReviewStatusSync } = await import("./review-status-CacDM78F.js");
35600
35738
  const { join } = await import("node:path");
35601
35739
  const resolved = resolveProjectFromIssueSync(id);
35602
35740
  const workspacePath = resolved ? join(resolved.projectPath, "workspaces", `feature-${id.toLowerCase()}`) : null;
@@ -35619,16 +35757,30 @@ const postIssueCloseRoute = HttpRouter.add("POST", "/api/issues/:issueId/close",
35619
35757
  });
35620
35758
  })));
35621
35759
  const postIssueStartPlanningRoute = HttpRouter.add("POST", "/api/issues/:id/start-planning", httpHandler(Effect.gen(function* () {
35760
+ const request = yield* HttpServerRequest.HttpServerRequest;
35622
35761
  const id = (yield* HttpRouter.params)["id"] ?? "";
35623
35762
  if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
35763
+ const body = yield* readJsonBody$18;
35764
+ const eventStore = yield* EventStoreService;
35765
+ const linear = yield* LinearClient;
35766
+ const github = yield* GitHubClient;
35767
+ const rally = yield* RallyClient;
35768
+ const lifecycle = yield* IssueLifecycle;
35769
+ let startedBy;
35770
+ try {
35771
+ startedBy = resolveRequestedStartedBy(body.startedBy, yield* Effect.promise(() => isInternalAgentRequest(request)));
35772
+ } catch (error) {
35773
+ return jsonResponse({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
35774
+ }
35624
35775
  return yield* startPlanningForIssue({
35625
35776
  id,
35626
- body: yield* readJsonBody$18,
35627
- eventStore: yield* EventStoreService,
35628
- linear: yield* LinearClient,
35629
- github: yield* GitHubClient,
35630
- rally: yield* RallyClient,
35631
- lifecycle: yield* IssueLifecycle
35777
+ body,
35778
+ eventStore,
35779
+ linear,
35780
+ github,
35781
+ rally,
35782
+ lifecycle,
35783
+ startedBy
35632
35784
  });
35633
35785
  })));
35634
35786
  const postIssueAbortPlanningRoute = HttpRouter.add("POST", "/api/issues/:id/abort-planning", httpHandler(Effect.gen(function* () {
@@ -40252,7 +40404,7 @@ Be specific: reference actual file names, function names, requirement text, disc
40252
40404
  const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
40253
40405
  const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
40254
40406
  const promptFile = join(planningDir, ".status-review-prompt.tmp");
40255
- const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-D7IluJe0.js");
40407
+ const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-BI1mOBQ4.js");
40256
40408
  let providerEnvStr = "";
40257
40409
  let providerEnv = {};
40258
40410
  const statusProvider = getProviderForModelSync(statusModelId);
@@ -40335,7 +40487,7 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
40335
40487
  let safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "-");
40336
40488
  let processedContent = content;
40337
40489
  if (safeName.endsWith(".vtt")) {
40338
- const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-Jr94BF3Y.js"));
40490
+ const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-CMU5EZ5R.js"));
40339
40491
  processedContent = vttToMarkdown(content);
40340
40492
  safeName = safeName.replace(/\.vtt$/, ".md");
40341
40493
  }
@@ -40718,6 +40870,7 @@ const startRemoteAgentRoute = HttpRouter.add("POST", "/api/remote/workspaces/:is
40718
40870
  workspace: metadata,
40719
40871
  prompt,
40720
40872
  model,
40873
+ startedBy: "operator:dashboard",
40721
40874
  tier: fly.getResiliencyTier()
40722
40875
  });
40723
40876
  },
@@ -45966,7 +46119,7 @@ const readJsonBody$11 = Effect.gen(function* () {
45966
46119
  function bootReconciliationWhyStopped(agent) {
45967
46120
  if (agent.paused === true) return agent.pausedReason ? `paused: ${agent.pausedReason}` : "paused";
45968
46121
  if (agent.troubled === true) return "troubled";
45969
- if (agent.stoppedByUser === true && !isBootReconciliationCandidate(agent)) return "stopped by operator";
46122
+ if (agent.stoppedByUser === true) return "stopped by operator";
45970
46123
  if (agent.status === "stopped" && agent.sessionId && !sessionExists(agent.sessionId)) return "orphaned: tmux session missing";
45971
46124
  if (agent.status === "stopped") return "stopped cleanly";
45972
46125
  if (agent.hostOverride) return "running remote";
@@ -45994,14 +46147,19 @@ const getBootReconciliationRoute = HttpRouter.add("GET", "/api/boot-reconciliati
45994
46147
  lastActivity: agent.lastActivity ?? agent.updatedAt ?? null,
45995
46148
  cost: agent.costSoFar ?? null,
45996
46149
  remote: Boolean(agent.hostOverride),
46150
+ stoppedByUser: agent.stoppedByUser === true,
45997
46151
  readOnly: bootReconciliationReadOnly(agent)
45998
46152
  });
45999
- const workAgents = listAllAgentsSync().filter((agent) => agent.role === "work");
46000
- const set = workAgents.filter((agent) => candidateIds.has(agent.id)).map(toRow);
46001
- const context = workAgents.filter((agent) => !candidateIds.has(agent.id) && (agent.paused === true || agent.troubled === true || Boolean(agent.hostOverride))).map(toRow);
46153
+ const autoResumableAgents = listAllAgentsSync().filter((agent) => isAutoResumableRole(agent.role));
46154
+ const set = autoResumableAgents.filter((agent) => candidateIds.has(agent.id)).map(toRow);
46155
+ const context = autoResumableAgents.filter((agent) => !candidateIds.has(agent.id) && (agent.paused === true || agent.troubled === true || Boolean(agent.hostOverride))).map(toRow);
46156
+ let heldCount = 0;
46157
+ if (state.decision === "hold_all") heldCount = set.length;
46158
+ else if (state.decision === "per_agent") heldCount = set.filter((agent) => state.perAgent[agent.issueId] !== "resume").length;
46002
46159
  return jsonResponse({
46003
46160
  ...state,
46004
46161
  maxGraceExtensions: 3,
46162
+ heldCount,
46005
46163
  set,
46006
46164
  context
46007
46165
  });
@@ -46032,7 +46190,7 @@ const postBootReconciliationDecisionRoute = HttpRouter.add("POST", "/api/boot-re
46032
46190
  }, { status: 400 });
46033
46191
  const perAgent = body.decision === "per_agent" ? parsePerAgentMap(body.perAgent) : {};
46034
46192
  setBootReconciliationDecision(body.decision, perAgent);
46035
- const result = yield* Effect.promise(() => applyBootReconciliationDecision());
46193
+ const result = yield* Effect.promise(() => applyBootReconciliationDecision({ origin: "operator" }));
46036
46194
  const resumed = result.resumed;
46037
46195
  return jsonResponse({
46038
46196
  ok: true,
@@ -46257,7 +46415,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
46257
46415
  }, { status: 400 });
46258
46416
  return yield* Effect.promise(async () => {
46259
46417
  try {
46260
- const { RallyRestApi } = await import("./rally-api-D5uXN08-.js");
46418
+ const { RallyRestApi } = await import("./rally-api-Cp50exEi.js");
46261
46419
  const api = new RallyRestApi({
46262
46420
  apiKey,
46263
46421
  server: server || "https://rally1.rallydev.com"
@@ -46643,7 +46801,7 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
46643
46801
  const remoteState = loadRemoteAgentState(sessionName);
46644
46802
  const isRemote = !!remoteState;
46645
46803
  const vmName = remoteState?.vmName ?? "";
46646
- const { getAgentStateSync } = await import("./agents-BKKkxKgK.js");
46804
+ const { getAgentStateSync } = await import("./agents-Dnn4XgdB.js");
46647
46805
  const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
46648
46806
  let tmuxSessionAlive = false;
46649
46807
  if (!isRemote) try {
@@ -46787,7 +46945,7 @@ Continue the PLANNING session. Do NOT implement anything.
46787
46945
  const agentCwd = workspacePath;
46788
46946
  const harnessLaunch = await prepareHarnessLaunch("claude-code");
46789
46947
  if (existsSync$1(outputFile)) await rename(outputFile, join(planningDir, `output-${Date.now()}.jsonl`));
46790
- const { getAgentCommandSync } = await import("./settings-CdvIF84R.js");
46948
+ const { getAgentCommandSync } = await import("./settings-9jSGHBPY.js");
46791
46949
  let msgPlanningModel = "claude-sonnet-5";
46792
46950
  try {
46793
46951
  msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
@@ -46910,7 +47068,7 @@ async function getIndexStats(rootPath, isMain) {
46910
47068
  }
46911
47069
  const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
46912
47070
  try {
46913
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BKOYB616.js");
47071
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Ca0eovh3.js");
46914
47072
  const projectRoot = process.cwd();
46915
47073
  const venvPath = join(projectRoot, ".venv");
46916
47074
  const results = [];
@@ -46955,7 +47113,7 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
46955
47113
  }));
46956
47114
  const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
46957
47115
  try {
46958
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BKOYB616.js");
47116
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Ca0eovh3.js");
46959
47117
  const projectRoot = process.cwd();
46960
47118
  const venvPath = join(projectRoot, ".venv");
46961
47119
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -46972,7 +47130,7 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
46972
47130
  }));
46973
47131
  const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
46974
47132
  try {
46975
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BKOYB616.js");
47133
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Ca0eovh3.js");
46976
47134
  const projectRoot = process.cwd();
46977
47135
  const venvPath = join(projectRoot, ".venv");
46978
47136
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -46989,7 +47147,7 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
46989
47147
  }));
46990
47148
  const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
46991
47149
  try {
46992
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BKOYB616.js");
47150
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-Ca0eovh3.js");
46993
47151
  const enabled = isTldrEnabledSync();
46994
47152
  const projectRoot = process.cwd();
46995
47153
  const targets = [];
@@ -47177,7 +47335,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
47177
47335
  const version = await getOverdeckVersion();
47178
47336
  let supervisorUrl = null;
47179
47337
  try {
47180
- const { getSupervisorUrlSync } = await import("./supervisor-UWiQNK-y.js");
47338
+ const { getSupervisorUrlSync } = await import("./supervisor-CyR_mW5B.js");
47181
47339
  supervisorUrl = getSupervisorUrlSync();
47182
47340
  } catch {}
47183
47341
  return jsonResponse({
@@ -47187,11 +47345,11 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
47187
47345
  });
47188
47346
  }));
47189
47347
  const getPrerequisitesRoute = HttpRouter.add("GET", "/api/prerequisites", Effect.promise(async () => {
47190
- const { checkSystemPrerequisites } = await import("./system-prerequisites-pdWG6ZQs.js");
47348
+ const { checkSystemPrerequisites } = await import("./system-prerequisites-Cin9ZgDx.js");
47191
47349
  return jsonResponse(await checkSystemPrerequisites());
47192
47350
  }));
47193
47351
  const getSetupDiagnosticsRoute = HttpRouter.add("GET", "/api/diagnostics/setup", Effect.promise(async () => {
47194
- const { collectSetupDiagnostics } = await import("./system-prerequisites-pdWG6ZQs.js");
47352
+ const { collectSetupDiagnostics } = await import("./system-prerequisites-Cin9ZgDx.js");
47195
47353
  return jsonResponse(await collectSetupDiagnostics(await getOverdeckVersion()));
47196
47354
  }));
47197
47355
  const getSyncStatusRoute = HttpRouter.add("GET", "/api/sync-status", Effect.sync(() => {
@@ -47372,7 +47530,7 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
47372
47530
  const projectPath = await getProjectPath(issuePrefix);
47373
47531
  const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
47374
47532
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
47375
- const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-BWLa8ODz.js");
47533
+ const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-D8R9I8Yl.js");
47376
47534
  const config = {
47377
47535
  issueId,
47378
47536
  workspacePath,
@@ -47402,7 +47560,7 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
47402
47560
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
47403
47561
  const ghConfig = getGitHubConfig();
47404
47562
  if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
47405
- const { runObserverCycle } = await import("./shadow-engineering-BWLa8ODz.js");
47563
+ const { runObserverCycle } = await import("./shadow-engineering-D8R9I8Yl.js");
47406
47564
  const firstRepo = ghConfig.repos[0];
47407
47565
  const config = {
47408
47566
  issueId,
@@ -49152,198 +49310,11 @@ function isNonEmptyJsonlLine(buffer) {
49152
49310
  return buffer.subarray(0, end).some((byte) => byte !== 32 && byte !== 9);
49153
49311
  }
49154
49312
  //#endregion
49155
- //#region ../../lib/pane-choice-menu.ts
49313
+ //#region ../../lib/overdeck/conversation-pane-choice.ts
49156
49314
  init_transcript_adapter();
49157
49315
  init_summary_fork();
49158
49316
  init_conversation_compaction();
49159
49317
  /**
49160
- * PAN-3113 — parse blocking numbered-choice menus from a captured tmux pane.
49161
- *
49162
- * Claude Code (and sibling harnesses) render modal choices as a cursor-driven
49163
- * numbered menu — the session-resume gate is the driving case:
49164
- *
49165
- * This session is 4h 5m old and 146.9k tokens.
49166
- *
49167
- * Resuming the full session will consume a substantial portion of your
49168
- * usage limits. We recommend resuming from a summary.
49169
- *
49170
- * ❯ 1. Resume from summary (recommended)
49171
- * 2. Resume full session as-is
49172
- * 3. Don't ask me again
49173
- *
49174
- * Enter to confirm · Esc to cancel
49175
- *
49176
- * These menus never appear as transcript tool calls, so neither the AUQ
49177
- * pipeline nor the JSONL pending-input scan can see them. This module turns
49178
- * the pane text into a structured menu the dashboard can render as an
49179
- * actionable card (PAN-3113 mockup A) and answer with literal keystrokes
49180
- * (Down × N + Enter).
49181
- *
49182
- * The parser is deliberately conservative — a false positive parks a phantom
49183
- * decision card in a live conversation, which is worse than a miss:
49184
- *
49185
- * - Options must be numbered sequentially from 1 (kills prose lists such as
49186
- * "3. FCM push is dead…" and "1. First step / 2. Second step" plans).
49187
- * - High confidence requires BOTH a ❯ cursor row and a harness footer hint
49188
- * ("Enter to confirm · Esc to cancel"). Exactly one of the two is low
49189
- * confidence (render the verbatim mirror, not the card). Neither → null.
49190
- * - The menu must be the current bottom-of-pane surface: after the menu and
49191
- * its footer, only blank lines, box separators, or further footer hints
49192
- * may follow. Real output below the menu means it was answered/scrolled.
49193
- * - Claude permission menus ("1. Yes / 2. Yes, and allow / 3. No") are
49194
- * excluded — the existing tool_permission detection path owns them.
49195
- * - Multi-select menus ("space to select") are excluded — answering needs
49196
- * toggle semantics the card does not model.
49197
- */
49198
- const ANSI_PATTERN = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
49199
- /** "❯ 1. Resume from summary (recommended)" / " 2. Resume full session as-is" */
49200
- const OPTION_LINE = /^\s*(❯|›)?\s*(\d{1,2})[.)]\s+(\S.*)$/;
49201
- /** Box-drawing separator lines (Claude draws ─── rules around its input box). */
49202
- const SEPARATOR_LINE = /^\s*[─━═]{6,}\s*$/;
49203
- /** Bare input prompt with nothing typed — the menu is gone when this follows. */
49204
- const BARE_PROMPT_LINE = /^\s*(❯|›)\s*$/;
49205
- const MAX_TRAILING_LINES = 6;
49206
- const MAX_CONTEXT_LINES = 8;
49207
- const MAX_OPTIONS = 9;
49208
- const MAX_LABEL_CHARS = 100;
49209
- const RECOMMENDED_SUFFIX = /\s*\((recommended)\)\s*$/i;
49210
- function cleanLine(line) {
49211
- return line.replace(ANSI_PATTERN, "").replace(/[\x00-\x1f\x7f]/g, "").replace(/\s+$/g, "");
49212
- }
49213
- /**
49214
- * PAN-3068 shape — key/action pairs separated by "·". Every segment must open
49215
- * with a key name, so real post-answer output never qualifies.
49216
- */
49217
- function looksLikeHarnessFooterHint(line) {
49218
- const segments = line.split("·").map((s) => s.trim()).filter(Boolean);
49219
- if (segments.length === 0) return false;
49220
- return segments.every((segment) => /^(?:esc(?:ape)?|tab|enter|return|space|backspace|shift\+\S+|ctrl\+\S+|alt\+\S+|\?)\b/i.test(segment) || /^press\s+\S+/i.test(segment));
49221
- }
49222
- /** "1. Yes / 2. Yes, and allow… / 3. No" — owned by the permission-menu path. */
49223
- function looksLikePermissionOptions(options) {
49224
- if (options.length !== 3) return false;
49225
- return /^yes$/i.test(options[0].label) && /^yes,?\s*(?:and\s*)?(?:allow|don't ask|always)/i.test(options[1].label) && /^no\b/i.test(options[2].label);
49226
- }
49227
- function parseOptionLine(line) {
49228
- const match = OPTION_LINE.exec(line);
49229
- if (!match) return null;
49230
- const number = Number(match[2]);
49231
- if (!Number.isInteger(number) || number < 1 || number > MAX_OPTIONS) return null;
49232
- const rawLabel = match[3].trim();
49233
- if (rawLabel.length === 0 || rawLabel.length > MAX_LABEL_CHARS) return null;
49234
- return {
49235
- cursor: Boolean(match[1]),
49236
- number,
49237
- rawLabel
49238
- };
49239
- }
49240
- /**
49241
- * Parse the last numbered-choice menu in the pane, or null when the pane is
49242
- * not currently blocked on one. See the module header for the conservative
49243
- * acceptance rules.
49244
- */
49245
- function parsePaneChoiceMenu(paneText) {
49246
- if (!paneText) return null;
49247
- const lines = paneText.split("\n").map(cleanLine);
49248
- let end = lines.length - 1;
49249
- while (end >= 0 && lines[end].trim() === "") end -= 1;
49250
- if (end < 0) return null;
49251
- let lastOption = -1;
49252
- for (let i = end; i >= 0; i -= 1) {
49253
- if (parseOptionLine(lines[i])) {
49254
- lastOption = i;
49255
- break;
49256
- }
49257
- if (end - i > MAX_TRAILING_LINES + MAX_OPTIONS) break;
49258
- }
49259
- if (lastOption < 0) return null;
49260
- const optionLines = [];
49261
- let firstOption = lastOption;
49262
- for (let i = lastOption; i >= 0; i -= 1) {
49263
- const parsed = parseOptionLine(lines[i]);
49264
- if (!parsed) break;
49265
- optionLines.unshift(parsed);
49266
- firstOption = i;
49267
- }
49268
- if (optionLines.length < 2 || optionLines.length > MAX_OPTIONS) return null;
49269
- for (let i = 0; i < optionLines.length; i += 1) if (optionLines[i].number !== i + 1) return null;
49270
- const cursorRows = optionLines.map((opt, index) => opt.cursor ? index : -1).filter((index) => index >= 0);
49271
- if (cursorRows.length > 1) return null;
49272
- const trailing = lines.slice(lastOption + 1).filter((line) => line.trim() !== "");
49273
- if (trailing.length > MAX_TRAILING_LINES) return null;
49274
- let footerHint = null;
49275
- for (const line of trailing) {
49276
- if (BARE_PROMPT_LINE.test(line)) return null;
49277
- if (SEPARATOR_LINE.test(line)) continue;
49278
- if (looksLikeHarnessFooterHint(line.trim())) {
49279
- if (footerHint === null) footerHint = line.trim();
49280
- continue;
49281
- }
49282
- return null;
49283
- }
49284
- const options = optionLines.map((opt) => {
49285
- const recommended = RECOMMENDED_SUFFIX.test(opt.rawLabel);
49286
- return {
49287
- number: opt.number,
49288
- label: recommended ? opt.rawLabel.replace(RECOMMENDED_SUFFIX, "") : opt.rawLabel,
49289
- recommended
49290
- };
49291
- });
49292
- if (looksLikePermissionOptions(options)) return null;
49293
- if (footerHint && /space\s+to\s+(?:select|toggle)/i.test(footerHint)) return null;
49294
- const contextLines = [];
49295
- let paragraphs = 0;
49296
- let i = firstOption - 1;
49297
- while (i >= 0 && lines[i].trim() === "") i -= 1;
49298
- for (; i >= 0 && contextLines.length < MAX_CONTEXT_LINES; i -= 1) {
49299
- const line = lines[i];
49300
- if (SEPARATOR_LINE.test(line) || BARE_PROMPT_LINE.test(line)) break;
49301
- if (parseOptionLine(line)) break;
49302
- if (line.trim() === "") {
49303
- if (paragraphs >= 2) break;
49304
- let j = i - 1;
49305
- while (j >= 0 && lines[j].trim() === "") j -= 1;
49306
- if (j < 0 || SEPARATOR_LINE.test(lines[j]) || BARE_PROMPT_LINE.test(lines[j]) || parseOptionLine(lines[j])) break;
49307
- i = j + 1;
49308
- continue;
49309
- }
49310
- if (lines[i + 1] === void 0 || lines[i + 1].trim() === "") paragraphs += 1;
49311
- contextLines.unshift(line.trim());
49312
- }
49313
- const hasCursor = cursorRows.length === 1;
49314
- if (!hasCursor && footerHint === null) return null;
49315
- const confidence = hasCursor && footerHint !== null ? "high" : "low";
49316
- return {
49317
- title: contextLines[0] ?? options[0].label,
49318
- contextLines,
49319
- options,
49320
- selectedIndex: hasCursor ? cursorRows[0] : 0,
49321
- footerHint,
49322
- confidence
49323
- };
49324
- }
49325
- /** Stable identity for patrol dedupe — same menu re-parsed must not re-surface. */
49326
- function paneChoiceMenuSignature(menu) {
49327
- return `${menu.title}::${menu.options.map((o) => `${o.number}:${o.label}`).join("|")}`;
49328
- }
49329
- /**
49330
- * Literal tmux keystrokes answering the menu with `selectedIndex`: arrow the
49331
- * cursor from its current row to the target, then confirm. Claude Code menus
49332
- * move the ❯ cursor with ↑/↓ and confirm with Enter; number keys are not
49333
- * guaranteed across harness versions, so arrows are the universal path.
49334
- */
49335
- function buildChoiceKeystrokes(menu, selectedIndex) {
49336
- const clamped = Math.max(0, Math.min(selectedIndex, menu.options.length - 1));
49337
- const from = menu.selectedIndex;
49338
- const keys = [];
49339
- for (let i = from; i < clamped; i += 1) keys.push("Down");
49340
- for (let i = from; i > clamped; i -= 1) keys.push("Up");
49341
- keys.push("Enter");
49342
- return keys;
49343
- }
49344
- //#endregion
49345
- //#region ../../lib/overdeck/conversation-pane-choice.ts
49346
- /**
49347
49318
  * PAN-3113 — surface blocking numbered-choice menus in claude-code
49348
49319
  * conversation panes (the session-resume gate is the driving case) as
49349
49320
  * actionable pending input, and answer them from the dashboard.
@@ -49873,7 +49844,7 @@ async function resolveSpecialistSessionFile(name) {
49873
49844
  } catch {}
49874
49845
  return null;
49875
49846
  }
49876
- async function getConversationMessagesRead(name, deps) {
49847
+ async function getConversationMessagesRead(name, deps, agentId) {
49877
49848
  try {
49878
49849
  const conv = getConversationByName(name);
49879
49850
  let sessionFile = conv ? await deps.resolveSessionFile(conv) : void 0;
@@ -49894,15 +49865,24 @@ async function getConversationMessagesRead(name, deps) {
49894
49865
  streaming: false
49895
49866
  });
49896
49867
  }
49868
+ const parentSessionFile = sessionFile;
49869
+ if (agentId !== void 0) {
49870
+ sessionFile = subagentTranscriptPath(parentSessionFile, agentId);
49871
+ if (!sessionFile) return result({ error: "Invalid subagent id" }, 400);
49872
+ }
49897
49873
  try {
49898
49874
  const parsed = await getCachedMessages(sessionFile, false);
49899
- if (conv && (parsed.totalCost > 0 || parsed.totalTokens > 0)) updateConversationCost(name, parsed.totalCost, parsed.totalTokens);
49875
+ if (agentId === void 0 && conv && (parsed.totalCost > 0 || parsed.totalTokens > 0)) updateConversationCost(name, parsed.totalCost, parsed.totalTokens);
49900
49876
  let contextUsage = null;
49901
49877
  if (conv) try {
49902
49878
  contextUsage = await computeContextUsage(sessionFile, conv.model);
49903
49879
  } catch {
49904
49880
  contextUsage = null;
49905
49881
  }
49882
+ const subagents = agentId === void 0 ? (await listSubagentMetas(parentSessionFile)).map((meta) => ({
49883
+ ...meta,
49884
+ status: "done"
49885
+ })) : void 0;
49906
49886
  return result({
49907
49887
  messages: parsed.messages,
49908
49888
  workLog: parsed.workLog,
@@ -49912,7 +49892,8 @@ async function getConversationMessagesRead(name, deps) {
49912
49892
  proposedPlan: parsed.proposedPlan,
49913
49893
  compactBoundaries: (parsed.compactBoundaries?.length ?? 0) > 0 ? parsed.compactBoundaries : void 0,
49914
49894
  compacting: isCompacting(sessionFile) || void 0,
49915
- contextUsage
49895
+ contextUsage,
49896
+ subagents
49916
49897
  });
49917
49898
  } catch (parseErr) {
49918
49899
  if (parseErr?.code === "ENOENT") return result({
@@ -50979,7 +50960,7 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
50979
50960
  let mergeState;
50980
50961
  let isDraft;
50981
50962
  let checksFailed;
50982
- const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-DtAsvwzK.js");
50963
+ const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-DIE8BkHI.js");
50983
50964
  if (isGitHubAppConfigured()) {
50984
50965
  const prState = await Effect.runPromise(getPullRequestState(owner, repoName, prNumber));
50985
50966
  mergeable = prState.mergeable === null ? "UNKNOWN" : prState.mergeable ? "MERGEABLE" : "CONFLICTING";
@@ -51130,8 +51111,8 @@ async function handlePullRequestPromise(payload) {
51130
51111
  bumpIssuePrTabCacheGeneration(issueId);
51131
51112
  const repo = payload.repository.full_name;
51132
51113
  if (payload.action === "closed" && pr.merged === true) try {
51133
- const { postMergeLifecycle } = await import("./merge-agent-DrXa1CpW.js");
51134
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
51114
+ const { postMergeLifecycle } = await import("./merge-agent-C1-9zbP_.js");
51115
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
51135
51116
  const project = resolveProjectFromIssueSync(issueId);
51136
51117
  if (project) {
51137
51118
  const branchName = pr.head.ref;
@@ -52119,11 +52100,12 @@ const postConversationAbortRoute = HttpRouter.add("POST", "/api/conversations/:n
52119
52100
  });
52120
52101
  }));
52121
52102
  const getConversationMessagesRoute = HttpRouter.add("GET", "/api/conversations/:name/messages", Effect.gen(function* () {
52122
- const originCheck = validateOrigin$1(yield* HttpServerRequest.HttpServerRequest);
52103
+ const request = yield* HttpServerRequest.HttpServerRequest;
52104
+ const originCheck = validateOrigin$1(request);
52123
52105
  if (!originCheck.ok) return jsonResponse({ error: originCheck.error }, { status: 403 });
52124
52106
  const name = (yield* HttpRouter.params)["name"] ?? "";
52125
52107
  return yield* Effect.promise(async () => {
52126
- return conversationReadJson(await getConversationMessagesRead(name, conversationReadDependencies));
52108
+ return conversationReadJson(await getConversationMessagesRead(name, conversationReadDependencies, new URL(request.url, "http://localhost").searchParams.get("agentId") ?? void 0));
52127
52109
  });
52128
52110
  }));
52129
52111
  const getConversationMessageLocatorRoute = HttpRouter.add("GET", "/api/conversations/:name/message-locator", Effect.gen(function* () {
@@ -52515,7 +52497,7 @@ async function registerProjectFromPath(opts) {
52515
52497
  registerProjectSync(key, projectConfig);
52516
52498
  const seededContextLayer = ensureProjectLayer(fullPath);
52517
52499
  try {
52518
- const { preTrustDirectorySync } = await import("./workspace-manager-CDTKjjdU.js");
52500
+ const { preTrustDirectorySync } = await import("./workspace-manager-B38rFWA1.js");
52519
52501
  preTrustDirectorySync(fullPath);
52520
52502
  } catch {}
52521
52503
  let hooksInstalled = 0;
@@ -52556,7 +52538,7 @@ init_specs();
52556
52538
  init_paths();
52557
52539
  const execAsync$3 = promisify(exec);
52558
52540
  async function getIssueDataService() {
52559
- const { getSharedIssueService } = await import("./issue-service-singleton-PMx8F1jr.js");
52541
+ const { getSharedIssueService } = await import("./issue-service-singleton-lwFJ4dHk.js");
52560
52542
  return getSharedIssueService();
52561
52543
  }
52562
52544
  /** Returns true if the path exists (any type). */
@@ -53026,7 +53008,7 @@ const getProjectReleaseStatusRoute = HttpRouter.add("GET", "/api/projects/:proje
53026
53008
  const projectKey = (yield* HttpRouter.params)["projectKey"] ?? "";
53027
53009
  return jsonResponse(yield* Effect.tryPromise({
53028
53010
  try: async () => {
53029
- const { fetchProjectReleaseStatus } = await import("./project-pipelines-Bim6bThI.js");
53011
+ const { fetchProjectReleaseStatus } = await import("./project-pipelines-C3SPFJ38.js");
53030
53012
  return fetchProjectReleaseStatus(projectKey);
53031
53013
  },
53032
53014
  catch: (err) => new Error(err instanceof Error ? err.message : String(err))
@@ -53267,7 +53249,7 @@ init_projects();
53267
53249
  const getProjectMergeTrainRoute = HttpRouter.add("GET", "/api/projects/:projectKey/merge-train", httpHandler(Effect.gen(function* () {
53268
53250
  const config = getProjectSync((yield* HttpRouter.params)["projectKey"] ?? "");
53269
53251
  if (!config) return jsonResponse({ error: "Project not found" }, { status: 404 });
53270
- const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-Ca7F5JnQ.js"));
53252
+ const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-CqEtqjI2.js"));
53271
53253
  return jsonResponse({
53272
53254
  value: config.merge_train ?? null,
53273
53255
  effective: isMergeTrainEnabledForProject(config)
@@ -53280,7 +53262,7 @@ const postProjectMergeTrainRoute = HttpRouter.add("POST", "/api/projects/:projec
53280
53262
  if (!getProjectSync(key)) return jsonResponse({ error: "Project not found" }, { status: 404 });
53281
53263
  const v = (yield* readProjectJsonBody).value;
53282
53264
  if (v !== "enabled" && v !== "disabled" && v !== null) return jsonResponse({ error: "value must be 'enabled', 'disabled', or null" }, { status: 400 });
53283
- const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-Ca7F5JnQ.js"));
53265
+ const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-CqEtqjI2.js"));
53284
53266
  setProjectMergeTrainSync(key, v);
53285
53267
  const updated = getProjectSync(key);
53286
53268
  return jsonResponse({
@@ -53356,7 +53338,7 @@ async function queueEntryForProject(key, config, enabled) {
53356
53338
  * not blank the whole response, so a failed project reports an empty queue.
53357
53339
  */
53358
53340
  async function getMergeTrainQueuesPayload() {
53359
- const { isMergeTrainEnabledForProject } = await import("./merge-sync-Ca7F5JnQ.js");
53341
+ const { isMergeTrainEnabledForProject } = await import("./merge-sync-CqEtqjI2.js");
53360
53342
  const projects = listProjectsSync();
53361
53343
  return (await Promise.allSettled(projects.map(({ key, config }) => queueEntryForProject(key, config, isMergeTrainEnabledForProject(config))))).flatMap((outcome, i) => {
53362
53344
  if (outcome.status === "fulfilled") return [outcome.value];
@@ -53374,8 +53356,8 @@ async function getMergeTrainQueuesPayload() {
53374
53356
  }
53375
53357
  /** PAN-1696 AC2: per-project generation chains across every tracked project. */
53376
53358
  async function getMergeTrainGenerationsPayload() {
53377
- const { isMergeTrainEnabledForProject } = await import("./merge-sync-Ca7F5JnQ.js");
53378
- const { getUatGenerationsPayload } = await import("./uat-train-Cu-4nvbf.js");
53359
+ const { isMergeTrainEnabledForProject } = await import("./merge-sync-CqEtqjI2.js");
53360
+ const { getUatGenerationsPayload } = await import("./uat-train-diX_7shd.js");
53379
53361
  return (await Promise.allSettled(listProjectsSync().map(async ({ key, config }) => ({
53380
53362
  projectKey: key,
53381
53363
  projectName: config.name,
@@ -53389,7 +53371,7 @@ async function defaultOrderedIssueIdsForProject(projectPath) {
53389
53371
  return (await Effect.runPromise(computeMergeQueueFromCandidates(candidates, projectPath).pipe(Effect.provide(layer)))).map((item) => item.issueId);
53390
53372
  }
53391
53373
  async function defaultMergeOne(issueId) {
53392
- const { triggerMerge } = await import("./merge-ops-DdpTiEMt.js");
53374
+ const { triggerMerge } = await import("./merge-ops-7QqziXAh.js");
53393
53375
  const r = await triggerMerge(issueId);
53394
53376
  return r.success ? { ok: true } : {
53395
53377
  ok: false,
@@ -53417,13 +53399,13 @@ async function postMergeTrainMergeNextPayload(payload, deps = {}) {
53417
53399
  status: 404,
53418
53400
  body: { error: `Unknown project key: ${projectKey}` }
53419
53401
  };
53420
- const { isMergeTrainEnabledForProject } = await import("./merge-sync-Ca7F5JnQ.js");
53402
+ const { isMergeTrainEnabledForProject } = await import("./merge-sync-CqEtqjI2.js");
53421
53403
  if (!isMergeTrainEnabledForProject(config)) return {
53422
53404
  status: 409,
53423
53405
  body: { error: `merge-train is disabled for project ${projectKey}` }
53424
53406
  };
53425
53407
  const issueIds = (await (deps.getOrderedIssueIds ?? defaultOrderedIssueIdsForProject)(resolve(config.path))).slice(0, n);
53426
- const { shipMergeBatch } = await import("./merge-batch-C5q1c1GX.js");
53408
+ const { shipMergeBatch } = await import("./merge-batch-C11ocNkO.js");
53427
53409
  return {
53428
53410
  status: 200,
53429
53411
  body: {
@@ -53453,7 +53435,7 @@ async function postMergeTrainAssemblePayload(payload) {
53453
53435
  status: 404,
53454
53436
  body: { error: `Unknown project key: ${projectKey}` }
53455
53437
  };
53456
- const { runUatTrainReconcile } = await import("./uat-train-Cu-4nvbf.js");
53438
+ const { runUatTrainReconcile } = await import("./uat-train-diX_7shd.js");
53457
53439
  return {
53458
53440
  status: 200,
53459
53441
  body: { projects: [{
@@ -53465,7 +53447,7 @@ async function postMergeTrainAssemblePayload(payload) {
53465
53447
  }] }
53466
53448
  };
53467
53449
  }
53468
- const { runUatTrainReconcileAllProjects } = await import("./uat-train-Cu-4nvbf.js");
53450
+ const { runUatTrainReconcileAllProjects } = await import("./uat-train-diX_7shd.js");
53469
53451
  return {
53470
53452
  status: 200,
53471
53453
  body: { projects: await runUatTrainReconcileAllProjects({ force: true }) }
@@ -53490,7 +53472,7 @@ const postMergeTrainGenerationStackRoute = HttpRouter.add("POST", "/api/merge-tr
53490
53472
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
53491
53473
  if (authError) return authError;
53492
53474
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
53493
- const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-Cu-4nvbf.js"));
53475
+ const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-diX_7shd.js"));
53494
53476
  const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
53495
53477
  if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
53496
53478
  return jsonResponse({
@@ -53502,8 +53484,8 @@ const postMergeTrainGenerationPromoteRoute = HttpRouter.add("POST", "/api/merge-
53502
53484
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
53503
53485
  if (authError) return authError;
53504
53486
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
53505
- const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-Cu-4nvbf.js"));
53506
- const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-JHsdU3pA.js"));
53487
+ const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-diX_7shd.js"));
53488
+ const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-ZdrifiKx.js"));
53507
53489
  const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle));
53508
53490
  if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
53509
53491
  return jsonResponse(result);
@@ -55013,7 +54995,7 @@ function getCheckpointWorker() {
55013
54995
  return worker;
55014
54996
  }
55015
54997
  async function runInline(operation, payload) {
55016
- const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-DMTgXuLG.js");
54998
+ const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-wF84ubZ8.js");
55017
54999
  switch (operation) {
55018
55000
  case "claimTranscriptRange": return claimTranscriptRange(payload);
55019
55001
  case "commitTranscriptRange": return commitTranscriptRange(payload);
@@ -56167,7 +56149,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
56167
56149
  };
56168
56150
  }
56169
56151
  async function emitMemoryObservationCreated(observation, timestamp) {
56170
- const { initEventStore } = await import("./event-store-ELqkVOn0.js");
56152
+ const { initEventStore } = await import("./event-store-5UKzh9Jf.js");
56171
56153
  await (await initEventStore()).appendAsync({
56172
56154
  type: "memory.observation_created",
56173
56155
  timestamp,
@@ -58864,12 +58846,12 @@ async function pauseFlywheelRunForDashboard() {
58864
58846
  if (before.activeRunId) try {
58865
58847
  const { readFile } = await import("node:fs/promises");
58866
58848
  const { join } = await import("node:path");
58867
- const { getAgentDir } = await import("./agents-BKKkxKgK.js");
58849
+ const { getAgentDir } = await import("./agents-Dnn4XgdB.js");
58868
58850
  const sessionId = (await readFile(join(getAgentDir(FLYWHEEL_ORCHESTRATOR_AGENT_ID), "session.id"), "utf-8")).trim();
58869
58851
  if (sessionId) await saveResumeSessionId(before.activeRunId, sessionId);
58870
58852
  } catch {}
58871
58853
  await setPaused(true);
58872
- await import("./agents-BKKkxKgK.js").then(({ stopAgent }) => Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID)));
58854
+ await import("./agents-Dnn4XgdB.js").then(({ stopAgent }) => Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID)));
58873
58855
  return {
58874
58856
  before,
58875
58857
  after: await readGateSnapshot(),
@@ -58879,7 +58861,7 @@ async function pauseFlywheelRunForDashboard() {
58879
58861
  async function abortFlywheelRunForDashboard() {
58880
58862
  const candidate = await getActiveRunId();
58881
58863
  if (!candidate) return { aborted: await resolveLiveFlywheelRunId() ?? null };
58882
- const { stopAgent } = await import("./agents-BKKkxKgK.js");
58864
+ const { stopAgent } = await import("./agents-Dnn4XgdB.js");
58883
58865
  await Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID));
58884
58866
  await abortFlywheelRun(candidate);
58885
58867
  return { aborted: candidate };
@@ -59542,7 +59524,8 @@ function deleteAutoMergePayload(issueIdParam, deps = {}) {
59542
59524
  ...entry,
59543
59525
  status: "cancelled",
59544
59526
  cancelledAt,
59545
- cancelledBy: "operator"
59527
+ cancelledBy: "operator",
59528
+ remainingActionable: (deps.countRemaining ?? countActionableAutoMerges)(issueId)
59546
59529
  }
59547
59530
  };
59548
59531
  }
@@ -59559,7 +59542,7 @@ async function getFlywheelConversationPayload() {
59559
59542
  };
59560
59543
  }
59561
59544
  async function postFlywheelReportPayload() {
59562
- const { flywheelReportCommand } = await import("./flywheel-CLVB55Be.js");
59545
+ const { flywheelReportCommand } = await import("./flywheel-DQqsSm7P.js");
59563
59546
  await flywheelReportCommand({ cwd: process.cwd() });
59564
59547
  return {
59565
59548
  status: 200,
@@ -59854,7 +59837,7 @@ const postFlywheelBriefRoute = HttpRouter.add("POST", "/api/flywheel/brief", htt
59854
59837
  });
59855
59838
  })));
59856
59839
  const getUatCandidateRoute = HttpRouter.add("GET", "/api/flywheel/uat-candidate", httpHandler(Effect.gen(function* () {
59857
- const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-Cu-4nvbf.js"));
59840
+ const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-diX_7shd.js"));
59858
59841
  return jsonResponse(yield* Effect.promise(() => getUatCandidatePayload()));
59859
59842
  })));
59860
59843
  const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
@@ -60049,7 +60032,7 @@ function previewBrief(book) {
60049
60032
  return `${lines.join("\n")}\n`;
60050
60033
  }
60051
60034
  async function defaultStartOrderBook(book) {
60052
- const { startFlywheelRun } = await import("./flywheel-CLVB55Be.js");
60035
+ const { startFlywheelRun } = await import("./flywheel-DQqsSm7P.js");
60053
60036
  return startFlywheelRun({
60054
60037
  cwd: process.cwd(),
60055
60038
  orders: book.id
@@ -60727,6 +60710,7 @@ function agentStateToDbAgent(state) {
60727
60710
  lastFailureReason: state.lastFailureReason ?? null,
60728
60711
  lastFailureNextRetryAt: state.lastFailureNextRetryAt ?? null,
60729
60712
  flywheelRunId: state.flywheelRunId ?? null,
60713
+ startedBy: state.startedBy ?? null,
60730
60714
  roleRunHead: state.roleRunHead ?? null,
60731
60715
  reviewSubRole: state.reviewSubRole ?? null,
60732
60716
  reviewRunId: state.reviewRunId ?? null,
@@ -60803,6 +60787,7 @@ const COLUMN_MAP = {
60803
60787
  lastFailureReason: "last_failure_reason",
60804
60788
  lastFailureNextRetryAt: "last_failure_next_retry_at",
60805
60789
  flywheelRunId: "flywheel_run_id",
60790
+ startedBy: "started_by",
60806
60791
  roleRunHead: "role_run_head",
60807
60792
  reviewSubRole: "review_sub_role",
60808
60793
  reviewRunId: "review_run_id",
@@ -60875,7 +60860,7 @@ function backfillAgentsFromStateJsonSync(db, options) {
60875
60860
  const readHarnessModel = options?.readHarnessModel ?? readAgentHarnessModelRecordSync;
60876
60861
  let processed = 0;
60877
60862
  let skipped = 0;
60878
- let markedStopped = 0;
60863
+ const markedStoppedIds = [];
60879
60864
  let entries = [];
60880
60865
  try {
60881
60866
  entries = readdirSync$1(agentsDir);
@@ -60883,7 +60868,8 @@ function backfillAgentsFromStateJsonSync(db, options) {
60883
60868
  return {
60884
60869
  processed,
60885
60870
  skipped,
60886
- markedStopped
60871
+ markedStopped: 0,
60872
+ markedStoppedIds
60887
60873
  };
60888
60874
  }
60889
60875
  const columns = Object.values(COLUMN_MAP);
@@ -60912,7 +60898,10 @@ function backfillAgentsFromStateJsonSync(db, options) {
60912
60898
  continue;
60913
60899
  }
60914
60900
  const reconciled = reconcileAgentStatus(state, liveSessions);
60915
- if (reconciled.status === "stopped" && state.status !== "stopped") markedStopped++;
60901
+ const reconciledStop = reconciled.status === "stopped" && state.status !== "stopped" ? {
60902
+ id: state.id,
60903
+ previousStatus: state.status
60904
+ } : void 0;
60916
60905
  let effective = reconciled;
60917
60906
  if (reconciled.issueId) {
60918
60907
  const rec = readHarnessModel(reconciled.issueId);
@@ -60924,14 +60913,17 @@ function backfillAgentsFromStateJsonSync(db, options) {
60924
60913
  }
60925
60914
  const row = agentStateToDbAgent(effective);
60926
60915
  upsert.run(buildNamedParams(row));
60916
+ if (reconciledStop) markedStoppedIds.push(reconciledStop);
60927
60917
  processed++;
60928
60918
  if (options?.verbose) console.log(`[backfill] ${row.id} -> ${row.status}`);
60929
60919
  }
60930
60920
  })();
60921
+ for (const { id, previousStatus } of markedStoppedIds) logAgentLifecycleSync(id, `status changed: ${previousStatus} → stopped (boot backfill reconcile: no live tmux session)`);
60931
60922
  return {
60932
60923
  processed,
60933
60924
  skipped,
60934
- markedStopped
60925
+ markedStopped: markedStoppedIds.length,
60926
+ markedStoppedIds
60935
60927
  };
60936
60928
  }
60937
60929
  function reconcileAgentStatus(state, liveSessions) {
@@ -61171,6 +61163,8 @@ function initSchema(db) {
61171
61163
  review_spawned_at TEXT,
61172
61164
  -- PAN-1765: timestamp when conflict resolution was dispatched
61173
61165
  conflict_resolution_dispatched_at TEXT,
61166
+ -- PAN-3154: main-head SHA/paths that first made this branch conflict (JSON)
61167
+ conflicts_since TEXT,
61174
61168
  -- PAN-699: number of test-agent dispatch retries (circuit breaker)
61175
61169
  test_retry_count INTEGER DEFAULT 0,
61176
61170
  -- PAN-794: parallel-review re-dispatch retry counter (scoped to current recovery cycle)
@@ -61188,7 +61182,9 @@ function initSchema(db) {
61188
61182
  -- PAN-938: current merge pipeline step
61189
61183
  merge_step TEXT,
61190
61184
  -- PAN-1691: per-issue merge-train routing key (NULL=project default, 1=auto-merge, 0=hold-for-UAT)
61191
- auto_merge INTEGER
61185
+ auto_merge INTEGER,
61186
+ -- PAN-3151: JSON array of review cycle history entries for convergence detection
61187
+ review_cycle_history TEXT
61192
61188
  );
61193
61189
 
61194
61190
  CREATE INDEX IF NOT EXISTS idx_review_status_updated
@@ -61374,7 +61370,7 @@ function initSchema(db) {
61374
61370
  last_failure_at TEXT,
61375
61371
  last_failure_reason TEXT,
61376
61372
  last_failure_next_retry_at TEXT,
61377
- flywheel_run_id TEXT,
61373
+ flywheel_run_id TEXT, started_by TEXT,
61378
61374
  role_run_head TEXT,
61379
61375
  review_sub_role TEXT,
61380
61376
  review_run_id TEXT,
@@ -61693,7 +61689,7 @@ function initSchema(db) {
61693
61689
  CREATE INDEX IF NOT EXISTS idx_backlog_sequence_project_rank
61694
61690
  ON backlog_sequence(project_key, rank);
61695
61691
  `);
61696
- db.pragma(`user_version = 61`);
61692
+ db.pragma(`user_version = 63`);
61697
61693
  }
61698
61694
  /**
61699
61695
  * Run schema migrations if the database version is older than SCHEMA_VERSION.
@@ -61701,12 +61697,18 @@ function initSchema(db) {
61701
61697
  */
61702
61698
  function runMigrations(db, dbPath) {
61703
61699
  const currentVersion = db.pragma("user_version", { simple: true });
61704
- if (currentVersion === 61) tryIdempotentDdl(db, 61, "ALTER TABLE flywheel_substrate_bugs ADD COLUMN affected_criteria TEXT");
61705
- if (currentVersion >= 61) return;
61706
61700
  if (currentVersion === 0) {
61707
61701
  initSchema(db);
61708
61702
  return;
61709
61703
  }
61704
+ if (currentVersion === 63) {
61705
+ tryIdempotentDdl(db, 61, "ALTER TABLE flywheel_substrate_bugs ADD COLUMN affected_criteria TEXT");
61706
+ tryIdempotentDdl(db, 61, "ALTER TABLE agents ADD COLUMN started_by TEXT");
61707
+ tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN review_cycle_history TEXT");
61708
+ tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN conflicts_since TEXT");
61709
+ return;
61710
+ }
61711
+ if (currentVersion > 63) return;
61710
61712
  if (currentVersion < 2) db.exec(`
61711
61713
  DELETE FROM status_history
61712
61714
  WHERE id NOT IN (
@@ -62360,8 +62362,17 @@ function runMigrations(db, dbPath) {
62360
62362
  tryIdempotentDdl(db, 60, `ALTER TABLE review_status ADD COLUMN release_status TEXT`);
62361
62363
  tryIdempotentDdl(db, 60, `ALTER TABLE review_status ADD COLUMN release_notes TEXT`);
62362
62364
  }
62363
- if (currentVersion < 61) tryIdempotentDdl(db, 61, "ALTER TABLE flywheel_substrate_bugs ADD COLUMN affected_criteria TEXT");
62364
- db.pragma(`user_version = 61`);
62365
+ tryIdempotentDdl(db, 61, "ALTER TABLE flywheel_substrate_bugs ADD COLUMN affected_criteria TEXT");
62366
+ tryIdempotentDdl(db, 61, "ALTER TABLE agents ADD COLUMN started_by TEXT");
62367
+ if (currentVersion < 62) {
62368
+ tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN review_cycle_history TEXT");
62369
+ tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN conflicts_since TEXT");
62370
+ }
62371
+ if (currentVersion < 63) {
62372
+ tryIdempotentDdl(db, 63, "ALTER TABLE review_status ADD COLUMN review_cycle_history TEXT");
62373
+ tryIdempotentDdl(db, 63, "ALTER TABLE review_status ADD COLUMN conflicts_since TEXT");
62374
+ }
62375
+ db.pragma(`user_version = 63`);
62365
62376
  }
62366
62377
  //#endregion
62367
62378
  //#region ../../lib/database/index.ts
@@ -65347,7 +65358,7 @@ const RESTART_MARKER = join$1(homedir(), ".overdeck", "dashboard-restarting.json
65347
65358
  * loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
65348
65359
  */
65349
65360
  async function defaultLifecycleRunner(pending) {
65350
- const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-DrXa1CpW.js");
65361
+ const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-C1-9zbP_.js");
65351
65362
  await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
65352
65363
  if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
65353
65364
  }
@@ -65688,7 +65699,7 @@ function failureReason(result) {
65688
65699
  return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
65689
65700
  }
65690
65701
  async function defaultMergeIssue(issueId) {
65691
- const { triggerMerge } = await import("./merge-ops-DdpTiEMt.js");
65702
+ const { triggerMerge } = await import("./merge-ops-7QqziXAh.js");
65692
65703
  return triggerMerge(issueId);
65693
65704
  }
65694
65705
  function defaultAnnounceFailure(issueId, reason) {
@@ -65987,7 +65998,7 @@ const defaultDependencies = {
65987
65998
  inspect: inspectStateMigration,
65988
65999
  ensureWorktree: ensureStateWorktree,
65989
66000
  migrate: async (projectKey, project, signal) => {
65990
- const { migrateProjectState } = await import("./state-migrate-CvvBtS0Y.js");
66001
+ const { migrateProjectState } = await import("./state-migrate-Cd8BH33U.js");
65991
66002
  await migrateProjectState(projectKey, { signal }, project);
65992
66003
  },
65993
66004
  clearCache: clearStateMigrationCache,
@@ -66124,6 +66135,7 @@ init_agents$1();
66124
66135
  init_paths();
66125
66136
  init_tmux();
66126
66137
  init_fts_db();
66138
+ init_control_settings();
66127
66139
  init_paths$1();
66128
66140
  init_auto_commit();
66129
66141
  init_projects();
@@ -66198,7 +66210,7 @@ if (shouldStartStaleCheckRetriggerService()) {
66198
66210
  }
66199
66211
  if (process.env.OVERDECK_MODE === "desktop") (async () => {
66200
66212
  try {
66201
- const { provisionClaudeHooks } = await import("./claude-hooks-provision-CN-xo-do.js");
66213
+ const { provisionClaudeHooks } = await import("./claude-hooks-provision-UKxCeOyj.js");
66202
66214
  const result = await provisionClaudeHooks();
66203
66215
  if (!result.ok) console.warn(`[overdeck] Claude hook provisioning skipped: ${result.reason}`);
66204
66216
  else if (result.changed) console.log(`[overdeck] Claude hooks provisioned: ${result.binariesSynced} scripts, registered ${result.registered.length} hook(s)${result.pruned.length ? `, pruned ${result.pruned.length} stale` : ""}`);
@@ -66493,6 +66505,11 @@ let shuttingDown = false;
66493
66505
  const handleShutdownSignal = async (signal) => {
66494
66506
  if (shuttingDown) return;
66495
66507
  shuttingDown = true;
66508
+ try {
66509
+ setLastCleanShutdownAt((/* @__PURE__ */ new Date()).toISOString());
66510
+ } catch (err) {
66511
+ console.warn("[overdeck] failed to record clean shutdown marker:", err);
66512
+ }
66496
66513
  console.log(`[overdeck] received ${signal} (pid=${process.pid} ppid=${process.ppid}) — shutting down`);
66497
66514
  try {
66498
66515
  const notifiedClients = broadcastServerRestarting();
@@ -66522,7 +66539,7 @@ const handleShutdownSignal = async (signal) => {
66522
66539
  await stopAllKnowledgeViewers().catch((err) => console.warn("[knowledge-viewer] shutdown failed:", err?.message ?? err));
66523
66540
  await stopDeaconChild().catch((err) => console.warn("[deacon-supervisor] child shutdown failed:", err?.message ?? err));
66524
66541
  try {
66525
- const { killAllGateProcessGroups } = await import("./validation-DEaTZafj.js");
66542
+ const { killAllGateProcessGroups } = await import("./validation-Cf7aaV5A.js");
66526
66543
  const reaped = killAllGateProcessGroups();
66527
66544
  if (reaped > 0) console.log(`[overdeck] reaped ${reaped} in-flight gate process group(s)`);
66528
66545
  } catch (err) {
@@ -66577,7 +66594,7 @@ reconcileStaleGitHubBlockers().then((n) => {
66577
66594
  }
66578
66595
  }).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
66579
66596
  try {
66580
- const { resetProcessingToQueued } = await import("./merge-sync-Ca7F5JnQ.js");
66597
+ const { resetProcessingToQueued } = await import("./merge-sync-CqEtqjI2.js");
66581
66598
  const resetCount = resetProcessingToQueued();
66582
66599
  if (resetCount > 0) {
66583
66600
  console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);
@@ -66599,7 +66616,7 @@ else {
66599
66616
  console.log("[overdeck] Auto-merge executor started");
66600
66617
  }
66601
66618
  try {
66602
- const { reconcileInterruptedVerifications } = await import("./verification-runner-DlZI8yhw.js");
66619
+ const { reconcileInterruptedVerifications } = await import("./verification-runner-DiPaUP-C.js");
66603
66620
  const interrupted = reconcileInterruptedVerifications();
66604
66621
  if (interrupted > 0) console.log(`[overdeck] recovered ${interrupted} orphaned verification worker(s)`);
66605
66622
  } catch (err) {