@overdeck/desktop 0.49.2 → 0.50.0

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 (455) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +1 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-CHtDkHEL.js → acceptance-criteria-B_maCGZv.js} +2 -2
  4. package/server/{active-dashboard-bundle-Byh6sP-q.js → active-dashboard-bundle-CCqpFWiz.js} +2 -2
  5. package/server/{activity-logger-Ck8qoluj.js → activity-logger-B0X2JJwM.js} +1 -1
  6. package/server/{activity-logger-BWZhVphb.js → activity-logger-SlTXYCVf.js} +3 -3
  7. package/server/{advancing-selfheal-65W4yUQi.js → advancing-selfheal-BJAfiY-C.js} +11 -6
  8. package/server/{agent-gc-BNUudFnt.js → agent-gc-bhikjoJ_.js} +11 -11
  9. package/server/{agent-idle-ONBssBN_.js → agent-idle-D-UQ7gDv.js} +11 -11
  10. package/server/{agent-state-CM8iVw5B.js → agent-state-BrUPf_7Z.js} +1 -1
  11. package/server/{agent-state-BJhGIJZe.js → agent-state-FABw8neJ.js} +344 -402
  12. package/server/{agent-state-service-CzHfoqKQ.js → agent-state-service-BAQApt97.js} +1 -1
  13. package/server/{agent-state-service-CiIuwzIs.js → agent-state-service-rDenYSlD.js} +5 -5
  14. package/server/{agents-DpCuoF65.js → agents-DixZjXWm.js} +1 -1
  15. package/server/{agents-jXgqpHca.js → agents-DzpQidT8.js} +4 -4
  16. package/server/{archive-planning-CGkU6UeL.js → archive-planning-BL1ABtW0.js} +5 -5
  17. package/server/archive-planning-D3gw32U9.js +2 -0
  18. package/server/{artifact-index-jobs-Ck4NRRkY.js → artifact-index-jobs-Cjdme0jS.js} +2 -2
  19. package/server/{assemble-CyvEBmmq.js → assemble-B_JgnCbG.js} +2 -2
  20. package/server/{auto-spawn-consent-Dc4mtM-B.js → auto-spawn-consent-BesWchEi.js} +7 -7
  21. package/server/{backlog-auto-trigger-CCEpr4YT.js → backlog-auto-trigger-COLq639j.js} +3 -3
  22. package/server/{behavior-BiCQzqyT.js → behavior-DCg8CIWC.js} +3 -3
  23. package/server/{bridge-pool-patrol-Ce8rNPym.js → bridge-pool-patrol-BDohuMRt.js} +2 -2
  24. package/server/{briefing-freshness-e_OEYZEe.js → briefing-freshness-ENa_hW_V.js} +2 -2
  25. package/server/build-info-Dx2qrVhb.js +2 -0
  26. package/server/{build-info-BRw4QlYO.js → build-info-WuZT6xyi.js} +3 -3
  27. package/server/{checkpoint-manager-DOwRGFff.js → checkpoint-manager-CSZ7aVQF.js} +2 -2
  28. package/server/{checkpoint-manager-CKr42Usw.js → checkpoint-manager-DXhGRvg4.js} +1 -1
  29. package/server/checkpoint-worker.js +1 -1
  30. package/server/{checkpoints-Cszp_0Np.js → checkpoints-DUkUsPVS.js} +2 -2
  31. package/server/{checkpoints-Cb6CWT4S.js → checkpoints-tm_w6Y4V.js} +1 -1
  32. package/server/{claude-hooks-provision-C5JHpxTS.js → claude-hooks-provision-CTh9zxEi.js} +1 -1
  33. package/server/{claude-hooks-provision-Cer2eFfj.js → claude-hooks-provision-fRofvhTN.js} +2 -2
  34. package/server/{claude-permissions-Bc5kjX1q.js → claude-permissions-DLrb9ovz.js} +18 -3
  35. package/server/{claude-settings-overlay-m-VVZej1.js → claude-settings-overlay-BYnXaTVc.js} +2 -2
  36. package/server/{claude-settings-overlay-C7rWsnya.js → claude-settings-overlay-CMS5Jab5.js} +1 -1
  37. package/server/cli-BflmtEFM.js +2 -0
  38. package/server/{cli-BmczsfD6.js → cli-CoQou1t_.js} +11 -11
  39. package/server/{cliproxy-BpYpkogS.js → cliproxy-DXDQcR3I.js} +2 -2
  40. package/server/{cliproxy-_yUU0HRY.js → cliproxy-DdhFpcXU.js} +1 -1
  41. package/server/{close-issue-CxvRD0UI.js → close-issue-CpQ0BWg-.js} +5 -5
  42. package/server/{closed-issue-reaper-nMLRi5de.js → closed-issue-reaper-CdcJRvUx.js} +13 -13
  43. package/server/{closed-issue-reaper-omOcUDBl.js → closed-issue-reaper-TymtZM37.js} +1 -1
  44. package/server/{codex-DZhFfcWu.js → codex-BValsmtK.js} +1 -1
  45. package/server/{codex-KaSKE-R3.js → codex-DYyZL8JD.js} +6 -6
  46. package/server/{compaction-continuation-Bjfi70G-.js → compaction-continuation-CVjbdGKt.js} +3 -3
  47. package/server/{config-CH1AqqIQ.js → config-CvKH7r7W.js} +1 -1
  48. package/server/{config-ZGjvuR6J.js → config-NxI9Yl2f.js} +2 -2
  49. package/server/{config-Doq_tF-f.js → config-_qaa1UXH.js} +2 -2
  50. package/server/{config-yaml-D9nfpEx1.js → config-yaml-D60AnTIu.js} +24 -9
  51. package/server/{conflict-gate-D4XCtrm2.js → conflict-gate-0dD1kxjN.js} +1 -1
  52. package/server/{conflict-gate-DcUTY4Gb.js → conflict-gate-hAUCL-un.js} +5 -5
  53. package/server/{context-layers-BBTKP-Y4.js → context-layers-CdpabJj0.js} +3 -3
  54. package/server/{context-layers-BGj2Y9l3.js → context-layers-Ds1MnEFI.js} +2 -2
  55. package/server/{continue-i7Revg8D.js → continue-CnvrUfxw.js} +2 -2
  56. package/server/{control-settings-BMoDHY1G.js → control-settings-Db0uXgVM.js} +308 -5
  57. package/server/{conversation-compaction-D4VOmF7p.js → conversation-compaction-B-1KETG9.js} +8 -8
  58. package/server/{conversation-compaction-DzIjYMfg.js → conversation-compaction-DzMXGRiJ.js} +1 -1
  59. package/server/{conversation-service-CzZUJFEx.js → conversation-service-BL-asWPX.js} +1 -1
  60. package/server/{conversation-service-tQCIbBVZ.js → conversation-service-BxIOd5ay.js} +21 -7
  61. package/server/{conversations-bFDaD5YN.js → conversations-CEMfwMt-.js} +1 -1
  62. package/server/{conversations-C75EFFjf.js → conversations-nS6QgYpD.js} +5 -5
  63. package/server/cost-3FyqKK56.js +838 -0
  64. package/server/{cost-BCWEkvro.js → cost-Cctc-Q9M.js} +3 -3
  65. package/server/{cost-CiIwxH1D.js → cost-DTuIRE4y.js} +2 -2
  66. package/server/{cost-sync-DOkdE_yB.js → cost-sync-DfmvLT9L.js} +3 -3
  67. package/server/{dag-BPc74hwj.js → dag-o-dUpw1L.js} +2 -2
  68. package/server/{dangerous-git-ops-By9iguTP.js → dangerous-git-ops-BOtXCFkT.js} +1 -1
  69. package/server/dashboard-db-worker.js +61 -11
  70. package/server/{deacon-B24dNzr8.js → deacon-CsisLmPt.js} +125 -165
  71. package/server/{deacon-canonical-state-CkvxRPck.js → deacon-canonical-state-DkdkQS5p.js} +2 -2
  72. package/server/{deacon-CzSZMtb-.js → deacon-e6py3jkM.js} +3 -3
  73. package/server/{deacon-event-client-BYIQBu0T.js → deacon-event-client-BCjHiGAY.js} +1 -1
  74. package/server/{deacon-event-client-Do6Z2gKl.js → deacon-event-client-CMQswEHX.js} +2 -2
  75. package/server/{deacon-nudge-log-CzM9JA9t.js → deacon-nudge-log-pcliw8Dr.js} +1 -1
  76. package/server/{deacon-pending-lifecycle-BObEdT-L.js → deacon-pending-lifecycle-BzaE76Xo.js} +3 -3
  77. package/server/deacon.js +11 -11
  78. package/server/{dead-end-trip-CnVmjnya.js → dead-end-trip-Bs3hxIn6.js} +3 -3
  79. package/server/dead-end-trip-DUbiRMtT.js +2 -0
  80. package/server/{delivery-gyce0vQ7.js → delivery-DhZGRShH.js} +1 -1
  81. package/server/{deploy-patrol-CEwwEYDM.js → deploy-patrol-B8sKkA8h.js} +8 -8
  82. package/server/deploy-queue--smqHLhe.js +2 -0
  83. package/server/{deploy-queue-r96ojDI3.js → deploy-queue-CCGWXFkp.js} +2 -2
  84. package/server/{deploy-window-D_3hhfxt.js → deploy-window-YuJewzmC.js} +4 -4
  85. package/server/{deploy-window-DeJK8mTK.js → deploy-window-hgsvZ3UZ.js} +1 -1
  86. package/server/{dev-supervisor-DZWwpENk.js → dev-supervisor-4SBloJHV.js} +2 -2
  87. package/server/{devcontainer-renderer-d-9dCV_2.js → devcontainer-renderer-BiJhwFNi.js} +3 -3
  88. package/server/{dist-DsLAsFSh.js → dist-CoR2sivG.js} +1 -1
  89. package/server/dist-FHv1s5ez.js +3 -0
  90. package/server/{docker-B2mUBzGk.js → docker-CWO7dcIP.js} +3 -3
  91. package/server/{docker-CRPHBylA.js → docker-DQzyMXkd.js} +1 -1
  92. package/server/{dod-DWtilRLx.js → dod-BAk5arLF.js} +1 -1
  93. package/server/{done-preflight-BDVdWed5.js → done-preflight-CGFA0M1b.js} +1 -1
  94. package/server/{done-preflight-D4ukUf-S.js → done-preflight-Cx9JGznT.js} +5 -5
  95. package/server/{durable-review-pipeline-CaCbEJSt.js → durable-review-pipeline-BOEZ0chh.js} +1 -1
  96. package/server/{durable-review-pipeline-B3OS2_He.js → durable-review-pipeline-Djx_lvFd.js} +1 -1
  97. package/server/{ensure-devcontainer-rGSh0JHK.js → ensure-devcontainer-Dk6ZMOUC.js} +1 -1
  98. package/server/{ensure-devcontainer-BUeBRjmm.js → ensure-devcontainer-DzYBBwnM.js} +4 -4
  99. package/server/{esm-shims-oAaKIa-a.js → esm-shims-deFq5Hhl.js} +1 -1
  100. package/server/{event-store-Db4w4YIY.js → event-store-C50Qt-f1.js} +1 -1
  101. package/server/{event-store-BCSgMubf.js → event-store-DTns2XZP.js} +5 -5
  102. package/server/{event-store-provider-DlSQND3V.js → event-store-provider-Bu1Qrg6v.js} +1 -1
  103. package/server/{events-B6zioJA_.js → events-B6xW8Cpm.js} +3 -3
  104. package/server/{factory-BrdqXBeK.js → factory-CWVKwKFE.js} +4 -4
  105. package/server/{feature-registry-storage-zh3ZXW6f.js → feature-registry-storage-vaxRN3WO.js} +2 -2
  106. package/server/{features-BGntOWdy.js → features-DXWwktJB.js} +2 -2
  107. package/server/{feedback-stuck-retirement-DpA5u1kt.js → feedback-stuck-retirement-CXAYe2rU.js} +2 -2
  108. package/server/{feedback-target-Ddqk93NF.js → feedback-target-DSVpi0gT.js} +1 -1
  109. package/server/{feedback-target-D7GxdUYG.js → feedback-target-yPD_wclF.js} +10 -10
  110. package/server/{feedback-writer-CH2846DP.js → feedback-writer-BzN4qvaP.js} +1 -1
  111. package/server/{feedback-writer-C1gCLFmp.js → feedback-writer-Ds1Wjsz4.js} +5 -5
  112. package/server/{flywheel-HJt7QdWP.js → flywheel-BCZS-FlW.js} +1 -1
  113. package/server/{flywheel-v1cCOBx-.js → flywheel-CC4gE_rx.js} +15 -15
  114. package/server/{flywheel-CjW2L7BS.js → flywheel-DWKd7bMc.js} +16 -16
  115. package/server/{flywheel-merge-order-4fNRN2F2.js → flywheel-merge-order-DDT3i57u.js} +1 -1
  116. package/server/{flywheel-merge-order-D_yyAlND.js → flywheel-merge-order-DJwH2KpL.js} +17 -15
  117. package/server/forge-4VVCRcF7.js +2 -0
  118. package/server/{forge-RVTCK_5X.js → forge-CHADjOFs.js} +2 -2
  119. package/server/{from-BnLgKYvw.js → from-C3dzmjSO.js} +1 -1
  120. package/server/{fs-lock-C7J-ugIf.js → fs-lock-DQ_gUxfq.js} +2 -2
  121. package/server/{fts-operations-CU0B5WUx.js → fts-operations-asZo2fh1.js} +2 -2
  122. package/server/{git-info-BSrI9owC.js → git-info-DMOSfJ9I.js} +1 -1
  123. package/server/{git-utils-CsKV0Dis.js → git-utils-BAMwn9Nf.js} +1 -1
  124. package/server/{git-utils-DW8-jIUJ.js → git-utils-BdHk8y7g.js} +4 -4
  125. package/server/{github-app-Oi5hdn1n.js → github-app-BWziYCf3.js} +1 -1
  126. package/server/{github-app-7ywLhuZO.js → github-app-BlMSzSTw.js} +2 -2
  127. package/server/{github-client-Cy0fSj1a.js → github-client-OK24qpol.js} +1 -1
  128. package/server/{github-client-DAbuXLuk.js → github-client-w6j5nVlz.js} +2 -2
  129. package/server/{github-pr-lookup-Dhh3ec1V.js → github-pr-lookup-bGcsEvLE.js} +2 -2
  130. package/server/{harness-binary-tMmgJfC1.js → harness-binary-DChiynaB.js} +2 -2
  131. package/server/{harness-resolve-DusNpVEe.js → harness-resolve-BplBEbwn.js} +4 -4
  132. package/server/{health-events-BYDZ9n2i.js → health-events-BTqsmunw.js} +1 -1
  133. package/server/{health-events-DNw9Mzw9.js → health-events-Bk3LjaJ9.js} +2 -2
  134. package/server/{hooks-BjBjxqNh.js → hooks-DJR1yR9w.js} +2 -2
  135. package/server/{hooks-B4wj32l2.js → hooks-EndRNrx9.js} +1 -1
  136. package/server/{hume-BP9YbxaE.js → hume-1FJmNDTq.js} +2 -2
  137. package/server/hume-gXLmRhmN.js +3 -0
  138. package/server/{identity-C23uY8dZ.js → identity-C3s8lyp0.js} +3 -3
  139. package/server/{idle-stack-reaper-Bw0rU9GC.js → idle-stack-reaper-CBelVOE3.js} +1 -1
  140. package/server/{idle-stack-reaper-BSxb1bln.js → idle-stack-reaper-DtoI4al6.js} +4 -4
  141. package/server/{in-flight-guard-DuxabAHT.js → in-flight-guard-B7khcBdQ.js} +1 -1
  142. package/server/{infra-CHIvOb9q.js → infra-CJRi_5Wu.js} +10 -4
  143. package/server/{injection-BYUt8ml1.js → injection-ADWQ3D0s.js} +8 -8
  144. package/server/{injection-BviePcm3.js → injection-BWsgHvrL.js} +1 -1
  145. package/server/{inspect-agent-sV_19NxZ.js → inspect-agent-CCfNJjKr.js} +12 -12
  146. package/server/inspect-agent-Dhp3hCGp.js +2 -0
  147. package/server/{internal-token-BOtIRJU7.js → internal-token-BCTEqUCX.js} +1 -1
  148. package/server/{internal-token-DoVzb4b7.js → internal-token-BeIWG_kT.js} +2 -2
  149. package/server/{io-DKrWd3gX.js → io-BCtZoXHo.js} +4 -4
  150. package/server/{issue-closed-6RQsAjDX.js → issue-closed-CiYAa6bX.js} +7 -7
  151. package/server/{issue-lifecycle-D9nLErvS.js → issue-lifecycle-BETNVVLq.js} +25 -25
  152. package/server/{issue-lifecycle-DOPVv7xz.js → issue-lifecycle-DaKN57sx.js} +1 -1
  153. package/server/{issue-service-singleton-CvgNAWqK.js → issue-service-singleton-1Q0ER8Yc.js} +1 -1
  154. package/server/{issue-service-singleton-B2xy-IS9.js → issue-service-singleton-C_sZ0HjP.js} +10 -10
  155. package/server/{issue-title-fallback-DTSCQVu0.js → issue-title-fallback-B91iD66g.js} +3 -3
  156. package/server/{issues-e_Ck1Ln2.js → issues-RGHQUKhB.js} +2 -2
  157. package/server/{jsonl-parser-DqxVCZ1k.js → jsonl-parser-Dfs1dlYE.js} +3 -3
  158. package/server/{jsonl-resolver-07OS3qOr.js → jsonl-resolver-bFtftCDd.js} +8 -8
  159. package/server/{kimi-code-vtXl2DR5.js → kimi-code-BxkDgaj4.js} +1 -1
  160. package/server/{kimi-code-BjtAHIz1.js → kimi-code-CNYRA8Dd.js} +11 -11
  161. package/server/{kimi-parser-B1lgy2Vt.js → kimi-parser-OcWwmOqF.js} +2 -2
  162. package/server/{label-cleanup-D2zUMasf.js → label-cleanup-CefxK9tL.js} +3 -3
  163. package/server/{lifecycle-DaCovZwn.js → lifecycle-DDZ7w-BY.js} +6 -6
  164. package/server/{lifecycle-0NOEzomy.js → lifecycle-DVXyUil2.js} +2 -2
  165. package/server/{lifecycle-io-BBMTaP7S.js → lifecycle-io-D1oBiMce.js} +1 -1
  166. package/server/{lifecycle-io-6WL46dsB.js → lifecycle-io-D7N0vQNj.js} +5 -5
  167. package/server/{linear-client-7fQThJTc.js → linear-client-DUN7zCeb.js} +2 -2
  168. package/server/{linear-client-BTGApNLo.js → linear-client-TL32snOy.js} +1 -1
  169. package/server/{linear-mcp-auth-B8pYRsiU.js → linear-mcp-auth-CtRKSHy5.js} +1 -1
  170. package/server/{linear-mcp-auth-Nk5s3L9M.js → linear-mcp-auth-bB0CPyjh.js} +5 -5
  171. package/server/memory-fts-worker.js +1 -1
  172. package/server/{memory-governor-Cqvbusr4.js → memory-governor-Cvv_9K0M.js} +87 -21
  173. package/server/{memory-pressure-patrol-DPb8foam.js → memory-pressure-patrol-C6DJJQRA.js} +38 -14
  174. package/server/{merge-BB_bjJ9a.js → merge-DOCR6pHi.js} +1 -1
  175. package/server/{merge-FZ78_cEz.js → merge-FTk4LsnM.js} +3 -3
  176. package/server/{merge-agent-B3jRrlS1.js → merge-agent-C-dsN9se.js} +31 -31
  177. package/server/{merge-agent-BuoC_PRZ.js → merge-agent-D-4_iQgy.js} +2 -2
  178. package/server/{merge-batch-B8bVjFWS.js → merge-batch-BJjzUUL7.js} +1 -1
  179. package/server/{merge-completeness-DQt7Qa7i.js → merge-completeness-BOtBUwTU.js} +4 -4
  180. package/server/{merge-completeness-DkdabVch.js → merge-completeness-CoLJxfUY.js} +1 -1
  181. package/server/merge-eligibility-C4rTS97F.js +3 -0
  182. package/server/merge-eligibility-D7wRnJbj.js +51 -0
  183. package/server/merge-ops-Cf02szJ5.js +2 -0
  184. package/server/merge-rebase-Bj7eJAG4.js +2 -0
  185. package/server/{merge-rebase-qq40s91P.js → merge-rebase-KBw4rdh3.js} +2 -2
  186. package/server/{merge-set-BTNYvxM3.js → merge-set-CVfEM57p.js} +1 -1
  187. package/server/{merge-set-BmRRflt0.js → merge-set-CyW-xSn4.js} +4 -4
  188. package/server/{merge-sync-0m2Q087q.js → merge-sync-CYGsJy0u.js} +1 -1
  189. package/server/{merge-sync-CJpOa0cZ.js → merge-sync-YLvOPAry.js} +2 -2
  190. package/server/{merge-train-iwKqjtCF.js → merge-train-VxLn8Ms4.js} +4 -4
  191. package/server/{merge-train-deps-CH5Mr3vN.js → merge-train-deps-D0y4hBB9.js} +4 -4
  192. package/server/{merge-verification-JJc5GC2t.js → merge-verification-BfJRNMiD.js} +6 -6
  193. package/server/{merged-docker-cleanup-worker-BOqWA373.js → merged-docker-cleanup-worker-Bh5fKG_b.js} +3 -3
  194. package/server/{merged-docker-cleanup-worker-CrhTdxZV.js → merged-docker-cleanup-worker-Ci9oeFAe.js} +1 -1
  195. package/server/{messaging-nuwStbdQ.js → messaging-Dfbhgjd6.js} +1 -1
  196. package/server/{multipart-parser-DxuW_rZV.js → multipart-parser-BYwfKOVU.js} +2 -2
  197. package/server/{no-resume-mode-xuYLFhLw.js → no-resume-mode-DjMQRkId.js} +1 -1
  198. package/server/node_modules/.package-lock.json +18 -18
  199. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/package.json +2 -2
  200. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/70_cli/10_basics.ts +4 -2
  201. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.d.ts.map +1 -1
  202. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js +12 -9
  203. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js.map +1 -1
  204. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js +1 -1
  205. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js.map +1 -1
  206. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +6 -6
  207. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeClusterSocket.ts +15 -12
  208. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocket.ts +1 -1
  209. package/server/node_modules/@types/node/README.md +1 -1
  210. package/server/node_modules/@types/node/buffer.buffer.d.ts +5 -5
  211. package/server/node_modules/@types/node/crypto.d.ts +2 -2
  212. package/server/node_modules/@types/node/http.d.ts +16 -0
  213. package/server/node_modules/@types/node/http2.d.ts +10 -2
  214. package/server/node_modules/@types/node/package.json +2 -2
  215. package/server/node_modules/@types/node/process.d.ts +52 -0
  216. package/server/node_modules/@types/node/quic.d.ts +210 -28
  217. package/server/node_modules/@types/node/sqlite.d.ts +6 -2
  218. package/server/node_modules/@types/node/test.d.ts +36 -0
  219. package/server/node_modules/effect/node_modules/uuid/README.md +19 -19
  220. package/server/node_modules/effect/node_modules/uuid/dist/v1.js +7 -3
  221. package/server/node_modules/effect/node_modules/uuid/dist/v7.js +5 -2
  222. package/server/node_modules/effect/node_modules/uuid/dist-node/v1.js +7 -3
  223. package/server/node_modules/effect/node_modules/uuid/dist-node/v7.js +5 -2
  224. package/server/node_modules/effect/node_modules/uuid/package.json +4 -3
  225. package/server/node_modules/msgpackr/dist/index-no-eval.cjs +11 -5
  226. package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
  227. package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
  228. package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
  229. package/server/node_modules/msgpackr/dist/index.js +11 -5
  230. package/server/node_modules/msgpackr/dist/index.js.map +1 -1
  231. package/server/node_modules/msgpackr/dist/index.min.js +1 -1
  232. package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
  233. package/server/node_modules/msgpackr/dist/node.cjs +11 -5
  234. package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
  235. package/server/node_modules/msgpackr/dist/test.js +11 -5
  236. package/server/node_modules/msgpackr/dist/test.js.map +1 -1
  237. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +11 -5
  238. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
  239. package/server/node_modules/msgpackr/package.json +1 -1
  240. package/server/node_modules/msgpackr/unpack.js +11 -5
  241. package/server/node_modules/picomatch/lib/parse.js +10 -1
  242. package/server/node_modules/picomatch/lib/scan.js +30 -18
  243. package/server/node_modules/picomatch/package.json +1 -1
  244. package/server/{orphan-proposed-reconciler-gf4TxfZb.js → orphan-proposed-reconciler-CnP0K2v3.js} +2 -2
  245. package/server/{orphan-proposed-reconciler-Dmk0kO_p.js → orphan-proposed-reconciler-nFUlquZt.js} +21 -21
  246. package/server/package-lock.json +19 -19
  247. package/server/package.json +1 -1
  248. package/server/{pan-dir-BMda7tQj.js → pan-dir-B4NfzOf3.js} +4 -4
  249. package/server/{parked-residue-BiHb8cD7.js → parked-residue-8WbU0y1z.js} +68 -64
  250. package/server/{paths-DEe9j-kw.js → paths-rETQhTF2.js} +2 -2
  251. package/server/{pending-lifecycle-claim-J5uIIJPu.js → pending-lifecycle-claim-yAwDuGS4.js} +1 -1
  252. package/server/{pickup-D1UbSDPd.js → pickup-Dle6k9Xt.js} +1 -1
  253. package/server/{pipeline-agent-reader-D-6okryb.js → pipeline-agent-reader-CeWhQzXC.js} +3 -3
  254. package/server/{pipeline-membership-PGX3Pe8V.js → pipeline-membership-BV4hdkHm.js} +1 -1
  255. package/server/{pipeline-membership-CCbgBzNC.js → pipeline-membership-C9ykcjsn.js} +1 -1
  256. package/server/{pipeline-membership-gather-BK4dzh0X.js → pipeline-membership-gather-Ba0wJNCR.js} +10 -10
  257. package/server/{pipeline-membership-gather-BRhU7XPx.js → pipeline-membership-gather-C9E22B2W.js} +1 -1
  258. package/server/{pipeline-notifier-DvHLaXKb.js → pipeline-notifier-B5DPXvnr.js} +1 -1
  259. package/server/{pipeline-notifier-BNAV9kpa.js → pipeline-notifier-p190L97e.js} +2 -2
  260. package/server/{post-merge-lifecycle-worker-DAWgzXQA.js → post-merge-lifecycle-worker-OQoK8Ckg.js} +2 -2
  261. package/server/{post-merge-state-DC2_0t12.js → post-merge-state-DFaf7OI1.js} +4 -4
  262. package/server/{prd-locations-BbAvqQmT.js → prd-locations-F2oLSAhy.js} +3 -3
  263. package/server/{project-pipelines-By_5WcT4.js → project-pipelines-CUsa6U59.js} +2 -2
  264. package/server/{project-repos-3bI6t4fO.js → project-repos-BVdi9-ch.js} +1 -1
  265. package/server/{project-repos--QeCg7yQ.js → project-repos-CsfvLtmr.js} +2 -2
  266. package/server/{project-resource-refresh-queue-x-K9mvpP.js → project-resource-refresh-queue-BehrH4Ai.js} +17 -17
  267. package/server/{project-resource-refresh-queue-BaZC79S3.js → project-resource-refresh-queue-D2110Guc.js} +1 -1
  268. package/server/{projects-LftaVK99.js → projects-BMuEf14J.js} +1 -1
  269. package/server/{prompts-BotGu-6W.js → prompts-CKpDt8Jn.js} +2 -2
  270. package/server/{providers-Dqgz3MY5.js → providers-Buv2wmFU.js} +1 -1
  271. package/server/{providers-BL1I66sM.js → providers-CxPKmyif.js} +7 -7
  272. package/server/public/assets/{chunk-BO2N2NFS-D5Fz5jND.js → chunk-BO2N2NFS-DZOQVqV1.js} +4 -4
  273. package/server/public/assets/{diagram-OG6HWLK6-Eux0gWFq.js → diagram-OG6HWLK6-oKeXcbO1.js} +1 -1
  274. package/server/public/assets/{dist-D-JX_u7m.js → dist-2qPmeRzT.js} +3 -3
  275. package/server/public/assets/{dist-C3zShwhA.js → dist-ClBlE-Nm.js} +1 -1
  276. package/server/public/assets/{ganttDiagram-6RSMTGT7-UH3aweia.js → ganttDiagram-6RSMTGT7-BwdG9fQv.js} +1 -1
  277. package/server/public/assets/{highlighted-body-OFNGDK62-ccIQ-WXS.js → highlighted-body-OFNGDK62-BzGNdskQ.js} +1 -1
  278. package/server/public/assets/index-CdPveU3M.css +1 -0
  279. package/server/public/assets/{index-BTVcdPve.js → index-Cg6tdZoY.js} +149 -149
  280. package/server/public/assets/{linear-Cnnu4YQy.js → linear-DpEt1TJb.js} +1 -1
  281. package/server/public/assets/mermaid-GHXKKRXX-6KBD_3T_.js +1 -0
  282. package/server/public/assets/{pieDiagram-4H26LBE5-BD8-Tye6.js → pieDiagram-4H26LBE5-9BpM4oRJ.js} +1 -1
  283. package/server/public/assets/{prod-Ca6aKMts.js → prod-CzJiNNEG.js} +4 -4
  284. package/server/public/assets/{quadrantDiagram-W4KKPZXB-BmSrVyFD.js → quadrantDiagram-W4KKPZXB-BXWVAoZx.js} +1 -1
  285. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CEGy8Das.js → sankeyDiagram-5OEKKPKP-5oxodGEw.js} +1 -1
  286. package/server/public/assets/{xychartDiagram-2RQKCTM6-VnQ8iY8s.js → xychartDiagram-2RQKCTM6-BChDrHxZ.js} +1 -1
  287. package/server/public/index.html +2 -2
  288. package/server/pull-requests-CmlandI7.js +2 -0
  289. package/server/{pull-requests-Cp_FDT8-.js → pull-requests-T0OV0Vn4.js} +3 -3
  290. package/server/{rally-bQpBzUNf.js → rally-CUqj2oIN.js} +3 -3
  291. package/server/rally-DYIn9R2U.js +3 -0
  292. package/server/{rally-api-CqAIJ8RX.js → rally-api-BFPb2oSq.js} +2 -2
  293. package/server/{rally-api-Ij1Zt0NI.js → rally-api-BoucQG1u.js} +1 -1
  294. package/server/{rally-client-qKbCNRVW.js → rally-client-16iObny7.js} +4 -4
  295. package/server/{rally-client-CN5vh4Ac.js → rally-client-CsqLjLLa.js} +1 -1
  296. package/server/{rebuild-stack-DrMyA_mA.js → rebuild-stack-BcBVFJp3.js} +2 -2
  297. package/server/{rebuild-stack-BNOMVh7C.js → rebuild-stack-CyXMrj6K.js} +6 -6
  298. package/server/reconciler-caYiRnPy.js +657 -0
  299. package/server/{reconstruct-cache-mxIYCnqs.js → reconstruct-cache-3JzPOune.js} +7 -7
  300. package/server/{record-Ug18Cp4V.js → record-DYOg97Iv.js} +1 -1
  301. package/server/{record-update-dBGxL9OC.js → record-update-BPqpBu3O.js} +5 -5
  302. package/server/{record-update-WyhsREoH.js → record-update-CDPEX7BH.js} +1 -1
  303. package/server/{recovery-trip-BKLrL6NX.js → recovery-trip-CpfW6LCJ.js} +3 -3
  304. package/server/{recovery-trip-wFAixKsg.js → recovery-trip-xqKC07Gy.js} +1 -1
  305. package/server/{release-engine-D9gaCBn9.js → release-engine-C_OOhCaK.js} +5 -5
  306. package/server/{release-set-DPHHzEGx.js → release-set-DOIDz2vw.js} +3 -3
  307. package/server/{remote-BUEeUic6.js → remote-BTh-sjpX.js} +3 -3
  308. package/server/{remote-agents-CSaTLi3u.js → remote-agents-DbbN7vSm.js} +6 -6
  309. package/server/{remote-agents-BVtASiOF.js → remote-agents-MuXx2gWm.js} +1 -1
  310. package/server/{remote-completion-CBV3b9TI.js → remote-completion-LcWCpAm2.js} +12 -12
  311. package/server/{remote-BU6ONLpv.js → remote-xY0B43Ho.js} +3 -3
  312. package/server/{resolver-gxv97jsQ.js → resolver-C2QKOf09.js} +2 -2
  313. package/server/{resolver-DvSMXty7.js → resolver-D4nsxfGo.js} +7 -7
  314. package/server/{resume-DvHuF-bm.js → resume-ByUrJUNX.js} +1 -1
  315. package/server/{review-agent-esZ0QXdY.js → review-agent-BRBTm1qE.js} +30 -30
  316. package/server/{review-agent-DgkUPRx0.js → review-agent-Caodi0PX.js} +2 -2
  317. package/server/{review-artifacts-DGGEobLp.js → review-artifacts-DgaDlbO4.js} +6 -6
  318. package/server/{review-convoy-liveness-DmO8dIBH.js → review-convoy-liveness-BBvyuRLC.js} +8 -8
  319. package/server/{review-run-recovery-DHiiw7d8.js → review-run-recovery-DCzWMMvE.js} +1 -1
  320. package/server/{review-run-recovery-Ct0q7FkE.js → review-run-recovery-THHMKlXJ.js} +2 -2
  321. package/server/{review-status-C_kQeeX0.js → review-status-Bge_3XTR.js} +1 -1
  322. package/server/{review-status-yOGD2MuK.js → review-status-DpniqzPT.js} +55 -45
  323. package/server/{review-status-emit-BZz1Y_22.js → review-status-emit-D7sM720S.js} +3 -3
  324. package/server/{review-status-enrichment-BWH0XW_m.js → review-status-enrichment-PDI4-faj.js} +3 -3
  325. package/server/{review-status-sync-2C9lk85r.js → review-status-sync-C6ZKTI8f.js} +11 -8
  326. package/server/{review-status-sync-Bq00Loey.js → review-status-sync-CvpHWyvR.js} +1 -1
  327. package/server/{review-verdict-feedback-CE_tr2iQ.js → review-verdict-feedback-B2ojHFH5.js} +7 -7
  328. package/server/{review-verdict-feedback-Brjaxoda.js → review-verdict-feedback-tyMoLT2L.js} +1 -1
  329. package/server/{review-verdict-writer-Ca2V7QSY.js → review-verdict-writer-Cy_1pnIj.js} +7 -7
  330. package/server/{review-verdict-writer-CD-4kDVx.js → review-verdict-writer-DjrJ64eS.js} +1 -1
  331. package/server/{rollup--g9ik1XQ.js → rollup-Cp0KEoOu.js} +1 -1
  332. package/server/{rollup-B6g9Nr6L.js → rollup-DU3xBQu2.js} +8 -8
  333. package/server/{scanner-YxIv-fG1.js → scanner-BFKG3Gxv.js} +7 -7
  334. package/server/{search-DqMN4__-.js → search-DhtKwbBC.js} +2 -2
  335. package/server/{sequence-io--b3_PsWq.js → sequence-io-C-Q19Jez.js} +4 -4
  336. package/server/{sequencer-agent-CqouKVZG.js → sequencer-agent-eN2P2lDz.js} +6 -6
  337. package/server/server.js +585 -282
  338. package/server/{service-CEp-3iow.js → service-CThO0Sar.js} +77 -772
  339. package/server/{session-fork-GtoeCh2H.js → session-fork-ZYTHtpBh.js} +2 -2
  340. package/server/settings-ByDRfuuE.js +2 -0
  341. package/server/{settings-CLQcdkoD.js → settings-CTywpFw5.js} +2 -2
  342. package/server/{settings-Ch2pCVtt.js → settings-nAT-eK56.js} +3 -3
  343. package/server/{shadow-engineering-BxiFrIKv.js → shadow-engineering-BHZKPJhq.js} +2 -2
  344. package/server/{shadow-state-CSA1vtxr.js → shadow-state-BTLi4Axs.js} +2 -2
  345. package/server/{shadow-state-nGhCNXT2.js → shadow-state-CZ_LnPsi.js} +1 -1
  346. package/server/{shadow-utils-7q5QDmMj.js → shadow-utils-CPLlPHdn.js} +2 -2
  347. package/server/{ship-log-ie0A_SqV.js → ship-log-D-CphNZx.js} +1 -1
  348. package/server/{ship-record-BM3oVvnL.js → ship-record-BaBla0l_.js} +5 -5
  349. package/server/{ship-record-DHWH1hLz.js → ship-record-BlvX8-xv.js} +1 -1
  350. package/server/{ship-status-BEkddXMT.js → ship-status-rQbPQBsF.js} +2 -2
  351. package/server/{smart-compaction-BkzjVpWL.js → smart-compaction-CUXn8mfX.js} +1 -1
  352. package/server/{smart-compaction-D0TE1lBD.js → smart-compaction-D1CNGdZx.js} +7 -7
  353. package/server/{spawn-planning-session-CkGweSCC.js → spawn-planning-session-DCmO6COk.js} +17 -17
  354. package/server/{spawn-planning-session-s406rw1N.js → spawn-planning-session-DfEWyrVV.js} +2 -2
  355. package/server/{specialist-completion-CTAjwH5j.js → specialist-completion-BMv3K54P.js} +1 -1
  356. package/server/{specialist-context-CKasRfYu.js → specialist-context-C1-CfYQb.js} +5 -5
  357. package/server/{specialist-handoff-logger-DrjrOmmn.js → specialist-handoff-logger-BDKoz5Z9.js} +2 -2
  358. package/server/{specialist-logs-Du6quZ0_.js → specialist-logs-BJQFkpdG.js} +3 -3
  359. package/server/{specialists-x-kPMhrL.js → specialists-CYt1U3Zm.js} +2 -2
  360. package/server/{specialists-CuDWiNdB.js → specialists-D6MUU31Q.js} +19 -19
  361. package/server/{specialists-b0dMMjWq.js → specialists-DhS79T9v.js} +333 -118
  362. package/server/{specialists-B-4zyE4Y.js → specialists-Dx0zRTxX.js} +1 -1
  363. package/server/{specialists-registry-1y6Rt_F1.js → specialists-registry-BRLCi61y.js} +1 -1
  364. package/server/{specialists-registry-BYjs04iK.js → specialists-registry-Bng0OFGH.js} +2 -2
  365. package/server/specs-oRGyfz6C.js +3 -0
  366. package/server/{src-CZsPs61V.js → src-C7gGe4KU.js} +6 -6
  367. package/server/{src-CY2Wl8IX.js → src-CdwN6WY6.js} +8 -2
  368. package/server/{src-DeQwpuh6.js → src-DMosbuSJ.js} +3 -3
  369. package/server/{stack-health-BQFSJc0l.js → stack-health-BKfNaqMm.js} +3 -3
  370. package/server/{stack-health-ypIKtkbE.js → stack-health-Bz711z1Y.js} +1 -1
  371. package/server/{stale-task-claims-C2e1zdMT.js → stale-task-claims-DMRLb5R2.js} +5 -5
  372. package/server/{staleness-Fzx_3_Hr.js → staleness-CxZaIhrn.js} +1 -1
  373. package/server/{staleness-CRDK6LFG.js → staleness-r_dkMyMG.js} +1 -1
  374. package/server/{stall-sweeper-QNk4h9m6.js → stall-sweeper-CBWqSWV2.js} +8 -8
  375. package/server/{state-home-DdG8erBI.js → state-home-DhsMqg8W.js} +2 -2
  376. package/server/{state-migrate-C6H3jfHE.js → state-migrate-C2Ouyd6e.js} +6 -6
  377. package/server/{state-mirror-DF4Lfxm0.js → state-mirror-BPXciz84.js} +3 -3
  378. package/server/{stuck-remediation-BVNd9txd.js → stuck-remediation-DALieAkx.js} +1 -1
  379. package/server/{stuck-remediation-BDa_tXgB.js → stuck-remediation-kta3KN7c.js} +13 -13
  380. package/server/{substrate-bug-weights-service-BbbCZEtJ.js → substrate-bug-weights-service-D_ICP7TI.js} +3 -3
  381. package/server/{summary-fork-DIQmtOuV.js → summary-fork-CojrFKb6.js} +2 -2
  382. package/server/{summary-fork-BvcW6bq0.js → summary-fork-DhhaFhxZ.js} +10 -10
  383. package/server/supervisor-DSSWo4M2.js +2 -0
  384. package/server/{supervisor-D3jC2c7A.js → supervisor-DqH-laVL.js} +4 -4
  385. package/server/{swarm-readiness-CMWAQuWM.js → swarm-readiness-LF8ZF_hc.js} +3 -3
  386. package/server/{synthesis-verdict-DVlrLF9A.js → synthesis-verdict-CGFF8uQI.js} +2 -2
  387. package/server/{synthesis-verdict-C-pJOPsn.js → synthesis-verdict-DSoOFUIV.js} +1 -1
  388. package/server/{system-prerequisites-QKtIYXI2.js → system-prerequisites-Lsx0jUUV.js} +2 -2
  389. package/server/{teardown-workspace-cJea1OLo.js → teardown-workspace-DMwomEG1.js} +16 -16
  390. package/server/{test-agent-queue-C5DI_gWX.js → test-agent-queue-Cu0D6BYe.js} +6 -6
  391. package/server/{test-verdict-C7kmd2_Y.js → test-verdict-9mvl7pQn.js} +1 -1
  392. package/server/{test-verdict-DUbDHqeD.js → test-verdict-oNSv1rVr.js} +2 -2
  393. package/server/{tldr-daemon-BNQHwblU.js → tldr-daemon-CRSAkhBx.js} +1 -1
  394. package/server/{tldr-daemon-CO08YlfQ.js → tldr-daemon-McqCk2X7.js} +2 -2
  395. package/server/{tmux-B8zsqD_6.js → tmux-CYucGrTl.js} +2 -2
  396. package/server/{tmux-DWEc4Ld9.js → tmux-wnT_hg-s.js} +2 -2
  397. package/server/{token-Bez-qCB2.js → token-BdfZLRg1.js} +1 -1
  398. package/server/{tracker-config-CJzPhSHv.js → tracker-config-tfAOWgng.js} +2 -2
  399. package/server/{tracker-utils-DJAOAuMN.js → tracker-utils-Dbg_pVZg.js} +2 -2
  400. package/server/{traefik-connect-D3H5I6b9.js → traefik-connect-DoQvQ6oJ.js} +1 -1
  401. package/server/{tunnel-BSdKnW0U.js → tunnel-B1MNIgkL.js} +1 -1
  402. package/server/{tunnel-Cr3ctqxp.js → tunnel-skW68j9B.js} +3 -3
  403. package/server/{types-fzBp9cYi.js → types-PW4zkxCM.js} +1 -1
  404. package/server/{uat-failure-feedback-IZQ-J8jt.js → uat-failure-feedback-ly8ZwtfC.js} +5 -5
  405. package/server/{uat-promote-verification-DXApKcc2.js → uat-promote-verification-BBaMwfdc.js} +5 -5
  406. package/server/{uat-train-IIZlz7r3.js → uat-train-BBEiYSep.js} +0 -0
  407. package/server/{uat-train-CycEzpbE.js → uat-train-D7Ran2FB.js} +1 -1
  408. package/server/{validate-Ur4xH5bN.js → validate-BYcBcBwg.js} +3 -3
  409. package/server/{validation-Dr6V4PXx.js → validation-BfG2jW5C.js} +4 -4
  410. package/server/{validation-CHovCoTT.js → validation-nSrYiYvA.js} +1 -1
  411. package/server/{verification-artifact-D3viYe_t.js → verification-artifact-Cmhgq4b_.js} +1 -1
  412. package/server/{verification-artifact-k5Ftpg0c.js → verification-artifact-DglwaHke.js} +1 -1
  413. package/server/{verification-runner-Dl13mmsI.js → verification-runner-BEq5ZF-h.js} +16 -16
  414. package/server/{verification-runner-BuqGwm2t.js → verification-runner-CFjAuv9u.js} +1 -1
  415. package/server/{vtt-parser-BSnAB-Og.js → vtt-parser-Va--tv27.js} +1 -1
  416. package/server/{work-agent-prompt-CJJ4tXci.js → work-agent-prompt-BnhKNAg7.js} +1 -1
  417. package/server/{work-agent-prompt-CioeOuM4.js → work-agent-prompt-CaD2ue8m.js} +10 -10
  418. package/server/{work-agent-start-B65Gqn9N.js → work-agent-start-0nJ-6UeA.js} +2 -2
  419. package/server/{work-agent-start-Ct1HVh6z.js → work-agent-start-D8NEN5KD.js} +1 -1
  420. package/server/workflows-BtHRlFIm.js +2 -0
  421. package/server/{workflows-AgFul1xc.js → workflows-C7mxM1qc.js} +28 -28
  422. package/server/{workspace-Cy4sDd3q.js → workspace-BAhMgMaO.js} +3 -3
  423. package/server/{workspace-Cu3XlMXt.js → workspace-Dbqv9ehn.js} +1 -1
  424. package/server/{workspace-anchor-drift-CMaqvizr.js → workspace-anchor-drift-B_3kyyxJ.js} +4 -4
  425. package/server/{workspace-anchor-drift-BI0Hz6zI.js → workspace-anchor-drift-Bpa3xoni.js} +1 -1
  426. package/server/{workspace-config-DRYDO7Zr.js → workspace-config-D-bNq2CF.js} +1 -1
  427. package/server/{workspace-manager-jfkKAEuO.js → workspace-manager-BrbX90Rm.js} +1 -1
  428. package/server/{workspace-manager-CgovxDrO.js → workspace-manager-CM8RCrSc.js} +16 -16
  429. package/server/{workspace-metadata-BDqXzGGK.js → workspace-metadata-BEOwJSdK.js} +1 -1
  430. package/server/{workspace-metadata-BNzODIv6.js → workspace-metadata-Cu6yfxBS.js} +2 -2
  431. package/server/{workspaces-BJdPqx_J.js → workspaces-C7LAuZfe.js} +123 -696
  432. package/sync-sources/rules/agent-message-delivery.md +21 -14
  433. package/sync-sources/rules/pan-handoff-focus-limit.md +3 -1
  434. package/sync-sources/skills/pan-gauntlet-loop/SKILL.md +94 -46
  435. package/sync-sources/skills/pan-handoff/SKILL.md +13 -2
  436. package/server/archive-planning-BW4MKNI7.js +0 -2
  437. package/server/build-info-Bj2vQEMh.js +0 -2
  438. package/server/cli-BRuzUT_I.js +0 -2
  439. package/server/dead-end-trip-6V_CwveT.js +0 -2
  440. package/server/deploy-queue-CjLErpgw.js +0 -2
  441. package/server/dist-fCA6y2bH.js +0 -3
  442. package/server/forge-bvak6vXJ.js +0 -2
  443. package/server/hume-TYTb6fDU.js +0 -3
  444. package/server/inspect-agent-JFEaYTRa.js +0 -2
  445. package/server/merge-ops-DabXHp2i.js +0 -2
  446. package/server/merge-rebase-CXq0qsgR.js +0 -2
  447. package/server/public/assets/index-2wV4ipy_.css +0 -1
  448. package/server/public/assets/mermaid-GHXKKRXX-Bjto8iJh.js +0 -1
  449. package/server/pull-requests-jVGcVq5G.js +0 -2
  450. package/server/rally-CxhVgIQ6.js +0 -3
  451. package/server/settings-DhtPDmmI.js +0 -2
  452. package/server/specs-IYsFlM-L.js +0 -3
  453. package/server/supervisor-v0cYN2Vp.js +0 -2
  454. package/server/workflows-CfHm8lVd.js +0 -2
  455. package/sync-sources/skills/pan-gauntlet-loop/references/lessons.md +0 -60
package/server/server.js CHANGED
@@ -1,121 +1,124 @@
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 { $n as updateProjectsConfigText, $r as GitHubApiError, $t as findProjectByPathSync, A as validateTieredExecutionConfig, An as resolveProjectKeyForCwdAsync, Ar as MODEL_DEPRECATIONS, Bi as isDevMode, Cn as registerProjectSync, Cr as DEFAULT_ROLES, Ct as flushAllPendingAutoCommits, D as resolveTieredExecutionBlock, Di as activeDeploymentRepoRoot, Dn as resolveProjectFromIssue, E as init_tier_table, En as resolveInfraRepo, Fr as modelSupportsImagesSync, Gr as COMPLIANCE_MODES, Hn as validateVersionSyncConfig, Ht as init_state_read_home, Ii as getLegacyHome, In as setProjectMergeTrain, Ir as resolveModelIdSync, Jt as PROJECTS_CONFIG_FILE, Kn as extractPrefixSync, Kr as PARENT_MODEL_REF, Kt as init_project_key, Li as getOverdeckHome, Mi as getDocsDisableStatePath, Mr as getModelEffortLevelsSync, Ni as getDocsIndexPath, Nr as hasModelCapabilitySync, O as resolveTieredExecutionEnabled, On as resolveProjectFromIssueSync, Or as resolveModel, Pi as getDocsTelemetryPath, Pn as setProjectAutoMergeDefault, Pr as init_model_capabilities, Qn as init_projects_config_write, Ri as init_paths, Rn as setProjectSwarmPolicy, Sr as init_registry, T as TieredExecutionConfigError, Ti as SYNC_SOURCES, Tr as computeModelOrigin, Tt as init_auto_commit, Ui as sessionFilePath, Un as init_projects_cache_events, Ut as resolveStateReadHomeAsync, Vi as packageRoot, Wn as subscribeProjectsConfigInvalidation, Wt as resolveStateReadHomeSync, Y as init_record, Yn as parseIssueIdSync, Yt as ProjectRenameError, Zr as FsError, Zt as extractTeamPrefix, _ as mergeConfigs, _i as LOGS_DIR, _n as listProjectsAsync, b as mergeTtsDaemonConfigs, bn as loadProjectsConfigSync, br as init_openai_compatible_proxy, c as init_load, ci as init_errors, d as isTldrEnabledSync, er as require_dist$1, f as loadConfigNoMigration, fn as init_projects, fr as getProviderForModelSync, g as jsYaml, gn as listProjects, h as init_js_yaml, hn as invalidateProjectsConfigCache, i as getConversationsConfig, ii as ProcessSpawnError, ji as getDocsBudgetStatePath, jn as resolveProjectPath, ki as encodeClaudeProjectDir, kr as MODEL_CAPABILITIES, lr as getBuiltInDefaultHarness, m as updateConversationsConfig, mi as CLAUDE_DIR, n as clearConfigCache, o as getGlobalConfigPath, oi as TrackerError, on as getProjectSync, p as loadConfigSync, pr as init_providers, q as getIssueWorkspacePath, qn as init_issue_id, qr as ROLE_EFFORTS, qt as projectKey, r as getConversationSearchConfigSync, rn as getIssuePrefix, rr as init_harness_policy, s as getOpenInEditorCommand, sr as UnknownModelError, t as init_config_yaml, tn as findProjectByTeamSync, tr as canUseHarnessSync, tt as readIssueRecordSync, ur as getKimiAnthropicBaseUrl, v as getDefaultDocsConfig, vi as OVERDECK_HOME, vn as listProjectsSync, wn as renameProject, wr as DEFAULT_WORKHORSES, wt as flushAutoCommits, x as DEFAULT_CONFIG$1, xr as defaultBackgroundAiFeatures, y as getDefaultTtsDaemonConfig, yr as getDashScopeUpstreamBaseUrl, zi as isDeploymentGenerationRoot } from "./config-yaml-D9nfpEx1.js";
3
- import { i as shouldRefuseHostDashboardPort, n as isNonPrimaryCheckoutRoot, r as readHostDashboardApiPort, t as getDashboardIdentity } from "./identity-C23uY8dZ.js";
4
- import { $ as ComposerCommandParseError, A as isInsideGitWorkTree, B as cleanupConversationAttachments, C as handleConversationClearForkState, Ct as jsonResponse, D as handleConversationResume, E as handleConversationRestartAll, F as startConversationModelBackfill, G as getConversationAttachmentsRoot, H as cleanupUnreferencedConversationAttachments, I as stopConversationRuntime, J as removeConversationAttachment, K as hasConversationAttachment, L as tmuxSessionExists, M as resolveRegisteredProject, N as shouldReportUnresolvedLiveSession, O as handleConversationStop, P as spawnConversationSession, Q as resolvePolicy, R as waitForPiTuiReady, S as conversationSessionAliveFromState, St as getDefaultCwd, T as handleConversationDelete, U as ensureConversationAttachmentDir, V as cleanupOrphanedConversationAttachments, W as extractConversationAttachmentPaths, X as composerCommandResultHttpStatus, Y as runInBatches, Z as handleComposerCommandMessage, _ as isPiControlChannelHarness, _t as getHeaderFromMap, a as agentsRouteLayer, at as resolveRequestedStartedBy, b as validateConversationControlAckOrigin, bt as validateOriginHeaders, c as codexConversationPendingInput, d as handleConversationCodexApproval, dt as hasDashboardInternalToken, et as ComposerCommandConfirmationError, f as handleConversationCompact, ft as rejectUnauthorizedDashboardRequest, g as handleConversationThinkingLevel, gt as waitForSessionRespawn, h as handleConversationPlanAction, ht as isRespawnPending, it as isInternalAgentRequest, j as resolveAllowedHarness, k as handleConversationSwitchModel, l as deliverConversationViaControlChannel, lt as dashboardCsrfToken, m as handleConversationDeliveryMethod, mt as rejectUnsafeDashboardMutationRequest, nt as evaluateSpawnGuardrails, o as saveAgentStateAndEmitEvent, p as handleConversationControlAck, pt as rejectUnauthorizedDashboardSessionMintRequest, q as isManagedConversationAttachmentPath, rt as invalidateAgentsCache, s as saveAgentStateAndEmitEventProgram, st as panCliInvocation, t as specialistsRouteLayer, tt as composerCommandConfirmationFromBody, u as handleConversationAbort, ut as dashboardSessionCookieHeader, v as pickDeliverAs, vt as isTrustedOriginForHost, w as handleConversationCreate, wt as jsonStringResponse, x as conversationNeedsRunningRepair, xt as httpHandler, y as resolveConversationDeliveryMethod, yt as validateOrigin$1, z as waitForTmuxSession$1 } from "./specialists-b0dMMjWq.js";
5
- import { h as loadConfigSync$1, p as init_config, s as getDashboardApiUrlSync } from "./config-ZGjvuR6J.js";
6
- import { c as emitDashboardLifecycleSync, l as init_activity_logger, o as emitActivityEntrySync, s as emitActivityTtsSync, t as appendDomainEventAsync } from "./activity-logger-BWZhVphb.js";
7
- 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-CHIvOb9q.js";
2
+ import { $n as updateProjectsConfigText, $t as findProjectByPathSync, A as validateTieredExecutionConfig, Ai as encodeClaudeProjectDir, An as resolveProjectKeyForCwdAsync, Ar as MODEL_DEPRECATIONS, Bi as isDeploymentGenerationRoot, Cn as registerProjectSync, Cr as DEFAULT_ROLES, Ct as flushAllPendingAutoCommits, D as resolveTieredExecutionBlock, Dn as resolveProjectFromIssue, E as init_tier_table, Ei as SYNC_SOURCES, En as resolveInfraRepo, Fi as getDocsTelemetryPath, Fr as modelSupportsImagesSync, Hi as packageRoot, Hn as validateVersionSyncConfig, Ht as init_state_read_home, In as setProjectMergeTrain, Ir as resolveModelIdSync, Jr as ROLE_EFFORTS, Jt as PROJECTS_CONFIG_FILE, Kn as extractPrefixSync, Kr as COMPLIANCE_MODES, Kt as init_project_key, Li as getLegacyHome, Mi as getDocsBudgetStatePath, Mr as getModelEffortLevelsSync, Ni as getDocsDisableStatePath, Nr as hasModelCapabilitySync, O as resolveTieredExecutionEnabled, Oi as activeDeploymentRepoRoot, On as resolveProjectFromIssueSync, Or as resolveModel, Pi as getDocsIndexPath, Pn as setProjectAutoMergeDefault, Pr as init_model_capabilities, Qn as init_projects_config_write, Qr as FsError, Ri as getOverdeckHome, Rn as setProjectSwarmPolicy, Sr as init_registry, T as TieredExecutionConfigError, Tr as computeModelOrigin, Tt as init_auto_commit, Un as init_projects_cache_events, Ut as resolveStateReadHomeAsync, Vi as isDevMode, Wi as sessionFilePath, Wn as subscribeProjectsConfigInvalidation, Wt as resolveStateReadHomeSync, Y as init_record, Yn as parseIssueIdSync, Yt as ProjectRenameError, Zt as extractTeamPrefix, _ as mergeConfigs, _n as listProjectsAsync, ai as ProcessSpawnError, b as mergeTtsDaemonConfigs, bn as loadProjectsConfigSync, br as init_openai_compatible_proxy, c as init_load, d as isTldrEnabledSync, ei as GitHubApiError, er as require_dist$1, f as loadConfigNoMigration, fn as init_projects, fr as getProviderForModelSync, g as jsYaml, gn as listProjects, h as init_js_yaml, hi as CLAUDE_DIR, hn as invalidateProjectsConfigCache, i as getConversationsConfig, jn as resolveProjectPath, kr as MODEL_CAPABILITIES, li as init_errors, lr as getBuiltInDefaultHarness, m as updateConversationsConfig, n as clearConfigCache, o as getGlobalConfigPath, on as getProjectSync, p as loadConfigSync, pr as init_providers, q as getIssueWorkspacePath, qn as init_issue_id, qr as PARENT_MODEL_REF, qt as projectKey, r as getConversationSearchConfigSync, rn as getIssuePrefix, rr as init_harness_policy, s as getOpenInEditorCommand, si as TrackerError, sr as UnknownModelError, t as init_config_yaml, tn as findProjectByTeamSync, tr as canUseHarnessSync, tt as readIssueRecordSync, ur as getKimiAnthropicBaseUrl, v as getDefaultDocsConfig, vi as LOGS_DIR, vn as listProjectsSync, wn as renameProject, wr as DEFAULT_WORKHORSES, wt as flushAutoCommits, x as DEFAULT_CONFIG$1, xr as defaultBackgroundAiFeatures, y as getDefaultTtsDaemonConfig, yi as OVERDECK_HOME, yr as getDashScopeUpstreamBaseUrl, zi as init_paths } from "./config-yaml-D60AnTIu.js";
3
+ import { i as shouldRefuseHostDashboardPort, n as isNonPrimaryCheckoutRoot, r as readHostDashboardApiPort, t as getDashboardIdentity } from "./identity-C3s8lyp0.js";
4
+ import { $ as resolvePolicy, A as handleConversationSwitchModel, B as waitForTmuxSession$1, C as conversationSessionAliveFromState, Ct as getDefaultCwd, D as handleConversationRestartAll, E as handleConversationDelete, F as spawnConversationSession, G as extractConversationAttachmentPaths, H as cleanupOrphanedConversationAttachments, I as startConversationModelBackfill, J as isManagedConversationAttachmentPath, K as getConversationAttachmentsRoot, L as stopConversationRuntime, M as resolveAllowedHarness, N as resolveRegisteredProject, O as handleConversationResume, P as shouldReportUnresolvedLiveSession, Q as handleComposerCommandMessage, R as tmuxSessionExists, S as conversationNeedsRunningRepair, St as httpHandler, T as handleConversationCreate, Tt as jsonStringResponse, U as cleanupUnreferencedConversationAttachments, V as cleanupConversationAttachments, W as ensureConversationAttachmentDir, X as runInBatches, Y as removeConversationAttachment, Z as composerCommandResultHttpStatus, _ as handleConversationThinkingLevel, _t as waitForSessionRespawn, a as agentsRouteLayer, at as isInternalAgentRequest, b as resolveConversationDeliveryMethod, bt as validateOrigin$1, c as codexConversationPendingInput, ct as panCliInvocation, d as handleConversationCodexApproval, dt as dashboardSessionCookieHeader, et as ComposerCommandParseError, f as handleConversationCompact, ft as hasDashboardInternalToken, g as handleConversationPlanAction, gt as isRespawnPending, h as handleConversationPiAskAnswer, ht as rejectUnsafeDashboardMutationRequest, it as invalidateAgentsCache, j as isInsideGitWorkTree, k as handleConversationStop, l as deliverConversationViaControlChannel, m as handleConversationDeliveryMethod, mt as rejectUnauthorizedDashboardSessionMintRequest, nt as composerCommandConfirmationFromBody, o as saveAgentStateAndEmitEvent, ot as resolveRequestedStartedBy, p as handleConversationControlAck, pt as rejectUnauthorizedDashboardRequest, q as hasConversationAttachment, rt as evaluateSpawnGuardrails, s as saveAgentStateAndEmitEventProgram, t as specialistsRouteLayer, tt as ComposerCommandConfirmationError, u as handleConversationAbort, ut as dashboardCsrfToken, v as isPiControlChannelHarness, vt as getHeaderFromMap, w as handleConversationClearForkState, wt as jsonResponse, x as validateConversationControlAckOrigin, xt as validateOriginHeaders, y as pickDeliverAs, yt as isTrustedOriginForHost, z as waitForPiTuiReady } from "./specialists-DhS79T9v.js";
5
+ import { h as loadConfigSync$1, p as init_config, s as getDashboardApiUrlSync } from "./config-NxI9Yl2f.js";
6
+ import { c as emitDashboardLifecycleSync, l as init_activity_logger, o as emitActivityEntrySync, s as emitActivityTtsSync, t as appendDomainEventAsync } from "./activity-logger-SlTXYCVf.js";
7
+ 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-CJRi_5Wu.js";
8
8
  import { n as openDatabase, t as init_driver } from "./driver-BtcFz-qu.js";
9
- import { a as updateIssueRecord, i as init_record_update, r as clearRecordPipelineClosedOutSync } from "./record-update-dBGxL9OC.js";
10
- import { B as sendKeys, C as init_tmux, E as killSession, L as resizeWindow, S as getWindowDimensions, T as isPaneDead, U as sessionExists, V as sendKeysAsync, X as deliveryVerifyLine, Y as activeComposerRegion, Z as init_pane_composer, a as capturePaneText, dt as init_child_env, j as listSessionNames, lt as buildChildEnvSync, o as capturePaneViewport, ot as init_ui_theme, r as capturePane, s as createSession, st as setUiTheme, t as buildTmuxArgs, u as ensureManagedTmuxContextOnce, ut as buildChildEnvWithoutTmuxSync, w as isHarnessProcessAlive } from "./tmux-DWEc4Ld9.js";
11
- import { a as getWorkspaceForIssue, c as listProjectTargets, f as resolveWorkspaceForCwd, i as getWorkspaceById, l as listProjects$1, o as init_resolver, s as listPinnedDocs, u as listWorkspaces } from "./resolver-gxv97jsQ.js";
12
- import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-BCSgMubf.js";
13
- 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-CY2Wl8IX.js";
14
- import { a as EventStoreServiceLive, c as ReadModelService, f as toAgentResolution, i as EventStoreService, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as startProjectCiRefillAfterProjectionReady, p as toAgentStatus, s as resolveDefaultBranchHead, t as IssueLifecycle, u as activityEntriesFromStoredEvents } from "./issue-lifecycle-D9nLErvS.js";
15
- import { c as init_agents, g as logAgentLifecycleSync, h as init_persistent_logger, n as AgentsResolverLive, u as listAllAgentsSync } from "./agents-jXgqpHca.js";
16
- import { c as resolveMemoryRoot, d as resolveRagRunsFile, i as init_paths$2, l as resolveObservationsFile, m as resolveWorkspaceMemoryRoot, r as ensureParentDir, s as resolveMemoryBase, t as assertMemorySafeSegment } from "./paths-DEe9j-kw.js";
17
- import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-e_OEYZEe.js";
18
- import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-zh3ZXW6f.js";
19
- import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-DOwRGFff.js";
20
- import { $ as deliverCommitForReview, A as saveAgentStateSync, An as init_runtime_census, At as init_agent_input_detection, Dt as scanPendingInputsPromise, Et as isInteractiveRoleAgent, Gn as init_concurrency, H as waitForReadySignal, Ht as init_messaging, Ii as init_agent_record_sync, It as answerSessionPaneChoice, Jr as injectPiConversationMemory, Kt as init_operator_interventions, Li as readAgentHarnessModelRecordSync, Lt as captureSessionPaneChoice, Mn as refreshRuntimeCensus, Mr as resolveImplicitStaffing, Nn as runtimeCensusHasHarnessProcess, On as getRuntimeCensus, Ot as detectAwaitingInputForAgent, Rt as init_session_pane_choice, U as getAgentRuntimeState, Un as emergencyBrake, Ut as messageAgent, W as getAgentRuntimeStateSync, Wr as getProviderAuthMode, _n as listAgentStates, ai as init_claude_auth, ar as deliverAgentMessage, br as checkCodexAuthStatus, bt as getAgentJsonlMtime, et as init_tier_supervisor, f as getAgentDir, g as getAgentStateSync, gn as init_queries, hi as init_openai_auth, hr as probeTranscriptSince, ii as getClaudeAuthStatus, it as supervisorAgentId, jn as panePidsForSession, jr as init_staffing, kn as getRuntimeCensusSnapshot, kt as detectAwaitingInputFromPaneSync, li as getProviderEnvForModel, m as getAgentState, mi as getOpenAIAuthStatus, mr as init_transcript_landing, pr as captureTranscriptUserRecordSnapshot, q as init_agents$1, qt as operatorInterventionEvent, vn as listRunningAgents, vt as computeAgentEnrichment, wt as init_agent_enrichment, xr as init_codex_auth, yn as listRunningAgentsSync, yt as countPendingAskUserQuestionsForAgent, z as normalizeAgentId, zi as init_agent_runtime_mirror } from "./agent-state-BJhGIJZe.js";
21
- import { t as init_behavior } from "./behavior-BiCQzqyT.js";
22
- 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-DOkdE_yB.js";
23
- import { a as generateHealthSummary, c as CostDoorLive, d as CostWriter, l as CostResolver, n as readCloisterStateFile, o as getAgentHealth, s as getAgentsNeedingAttention, t as getCloisterService, u as CostResolverLive } from "./service-CEp-3iow.js";
24
- import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-BGntOWdy.js";
25
- import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-Ch2pCVtt.js";
26
- import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-BL1I66sM.js";
27
- import { C as isCliproxyRunning, D as restartCliproxy, E as readPidFile, O as startCliproxy, S as isCliproxyInstalled, b as init_cliproxy, k as stopCliproxy, o as bridgeCodexAuthToCliproxy, p as getCliproxyAuthDir, x as installCliproxy } from "./cliproxy-BpYpkogS.js";
28
- import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-DoVzb4b7.js";
29
- import { $ as unarchiveConversation, A as init_conversations, C as getConversationByName, E as getStuckForks, F as listFavoritedIds, G as setConversationClaudeSessionId, H as removeFavorite, I as markConversationActive, L as markConversationEnded, N as listArchivedConversationsWithEnrichment, O as importLegacyConversation, P as listConversations, Q as setImportedConversationLinks, R as markConversationRunning, S as getConversationById, St as init_discovered_sessions, T as getConversationLedgerCosts, V as recordConversationHandoff, W as setClearedToConvId, X as setFavorite, Y as setConversationProjectKey, Z as setForkRequest, _ as canRefineTitle, _t as getDiscoveredSessionById, b as createConversation, bt as getDiscoveredStats, ct as aggregateDiscoveredSessionCost, dt as countDiscoveredSessions, et as updateConversationCost, h as archiveConversation, ht as findDiscoveredSessions, it as updateForkStatus, j as isAgentConversationName, k as incrementForkRetryCount, lt as aggregateDiscoveredSessionCostBy, nt as updateConversationForkFallbackReason, rt as updateConversationTitle, v as canReplaceTitle, w as getConversationByTmuxSession, x as getConversationByClaudeSessionId, yt as getDiscoveredSessionBySessionId } from "./conversations-C75EFFjf.js";
30
- import { C as generateLauncherScriptSync, D as normalizeModelOverrideSync, E as init_model_validation, O as requireModelOverrideSync, T as MODEL_ID_PATTERN, w as init_launcher_generator } from "./auto-spawn-consent-Dc4mtM-B.js";
31
- import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-Bc5kjX1q.js";
32
- import { C as codexGlobalContextFile, D as init_layers, E as globalContextFile$1, F as resolveWorkspaceContextFile, L as workspaceContextFile, P as resolveProjectContextFile, b as renderForHarness, c as hasManagedRegion, f as userContentOutsideRegion, i as workspaceContextWithoutProjectLayer, l as init_render, r as init_assemble, s as configDisabledRuleNames, w as ensureProjectLayer, x as validateTemplate, y as init_harness } from "./assemble-CyvEBmmq.js";
33
- import { l as init_codex, s as findRolloutPath } from "./codex-KaSKE-R3.js";
34
- import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-tMmgJfC1.js";
35
- 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, r as getBootReconciliationState, s as getSetting, t as FLYWHEEL_ACTIVE_RUN_ID_KEY, v as setCloisterSpawnsPausedSync, w as setFlywheelRequireUatBeforeMerge } from "./control-settings-BMoDHY1G.js";
9
+ import { a as updateIssueRecord, i as init_record_update, r as clearRecordPipelineClosedOutSync } from "./record-update-BPqpBu3O.js";
10
+ import { B as sendKeys, C as init_tmux, E as killSession, L as resizeWindow, S as getWindowDimensions, T as isPaneDead, U as sessionExists, V as sendKeysAsync, X as deliveryVerifyLine, Y as activeComposerRegion, Z as init_pane_composer, a as capturePaneText, dt as init_child_env, j as listSessionNames, lt as buildChildEnvSync, o as capturePaneViewport, ot as init_ui_theme, r as capturePane, s as createSession, st as setUiTheme, t as buildTmuxArgs, u as ensureManagedTmuxContextOnce, ut as buildChildEnvWithoutTmuxSync, w as isHarnessProcessAlive } from "./tmux-wnT_hg-s.js";
11
+ import { a as getWorkspaceForIssue, c as listProjectTargets, f as resolveWorkspaceForCwd, i as getWorkspaceById, l as listProjects$1, o as init_resolver, s as listPinnedDocs, u as listWorkspaces } from "./resolver-C2QKOf09.js";
12
+ import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-DTns2XZP.js";
13
+ 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-CdwN6WY6.js";
14
+ import { a as EventStoreServiceLive, c as ReadModelService, f as toAgentResolution, i as EventStoreService, l as ReadModelServiceLive, m as toRole, n as IssueLifecycleLive, o as startProjectCiRefillAfterProjectionReady, p as toAgentStatus, s as resolveDefaultBranchHead, t as IssueLifecycle, u as activityEntriesFromStoredEvents } from "./issue-lifecycle-BETNVVLq.js";
15
+ import { c as init_agents, g as logAgentLifecycleSync, h as init_persistent_logger, n as AgentsResolverLive, u as listAllAgentsSync } from "./agents-DzpQidT8.js";
16
+ import { c as resolveMemoryRoot, d as resolveRagRunsFile, i as init_paths$2, l as resolveObservationsFile, m as resolveWorkspaceMemoryRoot, r as ensureParentDir, s as resolveMemoryBase, t as assertMemorySafeSegment } from "./paths-rETQhTF2.js";
17
+ import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-ENa_hW_V.js";
18
+ import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-vaxRN3WO.js";
19
+ import { a as diffAgainstMain, c as diffCheckpoints, d as diffPatchSinceCommit, f as findCommitAtTime, h as listCheckpoints, l as diffFilesAgainstHead, o as diffAgainstMainFiles, s as diffCheckpointFiles, t as captureCheckpoint, u as diffPatchFilesAgainstHead } from "./checkpoint-manager-CSZ7aVQF.js";
20
+ 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, r as getBootReconciliationState, s as getSetting, t as FLYWHEEL_ACTIVE_RUN_ID_KEY, v as setCloisterSpawnsPausedSync, w as setFlywheelRequireUatBeforeMerge } from "./control-settings-Db0uXgVM.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-DfmvLT9L.js";
22
+ import { a as collectCodexCostEvents, i as CostWriter, n as CostResolver, r as CostResolverLive, s as recordSkipVerdict, t as CostDoorLive } from "./cost-3FyqKK56.js";
23
+ import { t as init_behavior } from "./behavior-DCg8CIWC.js";
24
+ import { $ as deliverCommitForReview, A as saveAgentStateSync, An as init_runtime_census, At as init_agent_input_detection, Dt as scanPendingInputsPromise, Et as isInteractiveRoleAgent, Gn as init_concurrency, H as waitForReadySignal, Ht as init_messaging, Ii as init_agent_record_sync, It as answerSessionPaneChoice, Jr as injectPiConversationMemory, Kt as init_operator_interventions, Li as readAgentHarnessModelRecordSync, Lt as captureSessionPaneChoice, Mn as refreshRuntimeCensus, Mr as resolveImplicitStaffing, Nn as runtimeCensusHasHarnessProcess, On as getRuntimeCensus, Ot as detectAwaitingInputForAgent, Rt as init_session_pane_choice, U as getAgentRuntimeState, Un as emergencyBrake, Ut as messageAgent, W as getAgentRuntimeStateSync, Wr as getProviderAuthMode, _n as listAgentStates, ai as init_claude_auth, ar as deliverAgentMessage, br as checkCodexAuthStatus, bt as getAgentJsonlMtime, et as init_tier_supervisor, f as getAgentDir, g as getAgentStateSync, gn as init_queries, hi as init_openai_auth, hr as probeTranscriptSince, ii as getClaudeAuthStatus, it as supervisorAgentId, jn as panePidsForSession, jr as init_staffing, kn as getRuntimeCensusSnapshot, kt as detectAwaitingInputFromPaneSync, li as getProviderEnvForModel, m as getAgentState, mi as getOpenAIAuthStatus, mr as init_transcript_landing, pr as captureTranscriptUserRecordSnapshot, q as init_agents$1, qt as operatorInterventionEvent, vn as listRunningAgents, vt as computeAgentEnrichment, wt as init_agent_enrichment, xr as init_codex_auth, yn as listRunningAgentsSync, yt as countPendingAskUserQuestionsForAgent, z as normalizeAgentId, zi as init_agent_runtime_mirror } from "./agent-state-FABw8neJ.js";
25
+ import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-DXWwktJB.js";
26
+ import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-nAT-eK56.js";
27
+ import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-CxPKmyif.js";
28
+ import { C as isCliproxyRunning, D as restartCliproxy, E as readPidFile, O as startCliproxy, S as isCliproxyInstalled, b as init_cliproxy, k as stopCliproxy, o as bridgeCodexAuthToCliproxy, p as getCliproxyAuthDir, x as installCliproxy } from "./cliproxy-DXDQcR3I.js";
29
+ import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-BeIWG_kT.js";
30
+ import { $ as unarchiveConversation, A as init_conversations, C as getConversationByName, E as getStuckForks, F as listFavoritedIds, G as setConversationClaudeSessionId, H as removeFavorite, I as markConversationActive, L as markConversationEnded, N as listArchivedConversationsWithEnrichment, O as importLegacyConversation, P as listConversations, Q as setImportedConversationLinks, R as markConversationRunning, S as getConversationById, St as init_discovered_sessions, T as getConversationLedgerCosts, V as recordConversationHandoff, W as setClearedToConvId, X as setFavorite, Y as setConversationProjectKey, Z as setForkRequest, _ as canRefineTitle, _t as getDiscoveredSessionById, b as createConversation, bt as getDiscoveredStats, ct as aggregateDiscoveredSessionCost, dt as countDiscoveredSessions, et as updateConversationCost, h as archiveConversation, ht as findDiscoveredSessions, it as updateForkStatus, j as isAgentConversationName, k as incrementForkRetryCount, lt as aggregateDiscoveredSessionCostBy, nt as updateConversationForkFallbackReason, rt as updateConversationTitle, v as canReplaceTitle, w as getConversationByTmuxSession, x as getConversationByClaudeSessionId, y as clearConversationFailureState, yt as getDiscoveredSessionBySessionId } from "./conversations-nS6QgYpD.js";
31
+ import { C as generateLauncherScriptSync, D as normalizeModelOverrideSync, E as init_model_validation, O as requireModelOverrideSync, T as MODEL_ID_PATTERN, w as init_launcher_generator } from "./auto-spawn-consent-BesWchEi.js";
32
+ import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-DLrb9ovz.js";
33
+ import { C as codexGlobalContextFile, D as init_layers, E as globalContextFile$1, F as resolveWorkspaceContextFile, L as workspaceContextFile, P as resolveProjectContextFile, b as renderForHarness, c as hasManagedRegion, f as userContentOutsideRegion, i as workspaceContextWithoutProjectLayer, l as init_render, r as init_assemble, s as configDisabledRuleNames, w as ensureProjectLayer, x as validateTemplate, y as init_harness } from "./assemble-B_JgnCbG.js";
34
+ import { l as init_codex, s as findRolloutPath } from "./codex-DYyZL8JD.js";
35
+ import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-DChiynaB.js";
36
36
  import { n as init_review_status_source, t as classifyAdvancingSessionLifecycle } from "./review-status-source-Jq0BXmn3.js";
37
37
  import { a as PAN_DIRNAME, d as PENDING_PROMOTION_FILENAME, f as WORKSPACE_RUNTIME_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types, p as asPanSpecDocument } from "./types-pLpbsNto.js";
38
- import { C as init_specs, D as writeSpecDocument, N as getProjectPanPaths, O as writeSpecForIssue, P as init_paths$3, S as findSpecByIssue, a as findWorkspaceDraftPlan, b as subItemsOf, c as isPlanningComplete, d as readPlan, h as readWorkspacePlanSync, m as readWorkspacePlan, r as findPlan, s as init_io, y as init_types$1 } from "./io-DKrWd3gX.js";
39
- import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-DusNpVEe.js";
40
- import { a as loadCloisterConfigSync, o as saveCloisterConfigSync, r as init_config$1, s as shouldAutoStart } from "./config-Doq_tF-f.js";
41
- import { a as init_state_home, c as isStateMigrated, i as ensureStateWorktree, r as clearStateMigrationCache, s as inspectStateMigration } from "./state-home-DdG8erBI.js";
42
- import { i as checkPrdGateSync, s as promoteWorkspacePrdDraft, t as init_pan_dir } from "./pan-dir-BMda7tQj.js";
43
- import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-6WL46dsB.js";
44
- import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-CJzPhSHv.js";
45
- import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-CMWAQuWM.js";
46
- import { n as AgentStateServiceLive } from "./agent-state-service-CiIuwzIs.js";
38
+ import { C as init_specs, D as writeSpecDocument, N as getProjectPanPaths, O as writeSpecForIssue, P as init_paths$3, S as findSpecByIssue, a as findWorkspaceDraftPlan, b as subItemsOf, c as isPlanningComplete, d as readPlan, h as readWorkspacePlanSync, m as readWorkspacePlan, r as findPlan, s as init_io, y as init_types$1 } from "./io-BCtZoXHo.js";
39
+ import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-BplBEbwn.js";
40
+ import { a as loadCloisterConfigSync, o as saveCloisterConfigSync, r as init_config$1, s as shouldAutoStart } from "./config-_qaa1UXH.js";
41
+ import { a as init_state_home, c as isStateMigrated, i as ensureStateWorktree, r as clearStateMigrationCache, s as inspectStateMigration } from "./state-home-DhsMqg8W.js";
42
+ import { i as checkPrdGateSync, s as promoteWorkspacePrdDraft, t as init_pan_dir } from "./pan-dir-B4NfzOf3.js";
43
+ import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-D7N0vQNj.js";
44
+ import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-tfAOWgng.js";
45
+ import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-LF8ZF_hc.js";
46
+ import { n as AgentStateServiceLive } from "./agent-state-service-rDenYSlD.js";
47
47
  import { i as PlanEmpty, l as WorkspaceCreateError, n as AgentStartError, s as TrackerApiError, t as AgentAlreadyRunning, u as WorkspaceNotFound } from "./typed-errors-DXqf3RnP.js";
48
- import { r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-7fQThJTc.js";
49
- import { r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-DAbuXLuk.js";
50
- import { r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-qKbCNRVW.js";
51
- import { n as resolveGitHubIssueSync, r as resolveTrackerTypeSync, t as init_tracker_utils } from "./tracker-utils-DJAOAuMN.js";
52
- import { a as startSharedIssueService, c as parseIntegerHeader, i as issue_service_singleton_exports, n as init_issue_service_singleton, o as CacheService, s as init_cache_service, t as getSharedIssueService } from "./issue-service-singleton-B2xy-IS9.js";
53
- import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-BNAV9kpa.js";
54
- import { a as getMergeBlockerReconcileCandidates, l as init_review_status_sync } from "./review-status-sync-2C9lk85r.js";
55
- import { S as requeueToPending, T as transitionToMerging, _ as markMerged, c as init_merge_sync, f as listActiveAutoMerges, g as markFailed, h as markBlocked, i as getActionableAutoMerge, j as listUatGenerationsSync, l as isFlywheelGloballyPaused$1, m as listProblemAutoMerges, n as countActionableAutoMerges, p as listDuePendingAutoMerges, t as cancelPending, v as markMergingBlocked, w as scheduleAutoMergeWithResult } from "./merge-sync-CJpOa0cZ.js";
56
- import { C as setReviewStatus, F as init_install_id, I as init_config$2, L as resolveTelemetryEnabled, M as init_service, N as synchronizeAnalyticsServices, P as getOrCreateInstallId, R as telemetryEnvironmentForcesOff, _ as markWorkspaceStuck, a as clearStuckMergeStatuses, c as fixStuckCommentedReviews, d as getReviewStatusSync, h as loadReviewStatuses, i as clearReviewStatus, j as getAnalyticsService, l as fixStuckReadyForMerge, p as init_review_status, u as getReviewStatus, w as setReviewStatusSync } from "./review-status-yOGD2MuK.js";
57
- import { a as clearQueryExpansionCache, i as resolveKnowledgeBundleRoot, n as init_injection, o as init_query_expansion, r as injectPromptTimeMemory } from "./injection-BYUt8ml1.js";
58
- import { a as init_fts_db, i as closeMemoryFtsDatabases, n as init_search, o as runMemoryFtsStatement, s as runMemoryFtsTransaction, t as buildMatchQuery } from "./search-DqMN4__-.js";
48
+ import { r as LinearClientOptionalLive, t as LinearClient } from "./linear-client-DUN7zCeb.js";
49
+ import { r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-w6j5nVlz.js";
50
+ import { r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-16iObny7.js";
51
+ import { n as resolveGitHubIssueSync, r as resolveTrackerTypeSync, t as init_tracker_utils } from "./tracker-utils-Dbg_pVZg.js";
52
+ import { a as startSharedIssueService, c as parseIntegerHeader, i as issue_service_singleton_exports, n as init_issue_service_singleton, o as CacheService, s as init_cache_service, t as getSharedIssueService } from "./issue-service-singleton-C_sZ0HjP.js";
53
+ import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-p190L97e.js";
54
+ import { a as getMergeBlockerReconcileCandidates, l as init_review_status_sync } from "./review-status-sync-C6ZKTI8f.js";
55
+ import { S as requeueToPending, T as transitionToMerging, _ as markMerged, c as init_merge_sync, f as listActiveAutoMerges, g as markFailed, h as markBlocked, i as getActionableAutoMerge, j as listUatGenerationsSync, l as isFlywheelGloballyPaused$1, m as listProblemAutoMerges, n as countActionableAutoMerges, p as listDuePendingAutoMerges, t as cancelPending, v as markMergingBlocked, w as scheduleAutoMergeWithResult } from "./merge-sync-YLvOPAry.js";
56
+ import { C as setReviewStatus, F as init_install_id, I as init_config$2, L as resolveTelemetryEnabled, M as init_service, N as synchronizeAnalyticsServices, P as getOrCreateInstallId, R as telemetryEnvironmentForcesOff, _ as markWorkspaceStuck, a as clearStuckMergeStatuses, c as fixStuckCommentedReviews, d as getReviewStatusSync, h as loadReviewStatuses, i as clearReviewStatus, j as getAnalyticsService, l as fixStuckReadyForMerge, p as init_review_status, u as getReviewStatus, w as setReviewStatusSync } from "./review-status-DpniqzPT.js";
57
+ import { a as clearQueryExpansionCache, i as resolveKnowledgeBundleRoot, n as init_injection, o as init_query_expansion, r as injectPromptTimeMemory } from "./injection-ADWQ3D0s.js";
58
+ import { a as init_fts_db, i as closeMemoryFtsDatabases, n as init_search, o as runMemoryFtsStatement, s as runMemoryFtsTransaction, t as buildMatchQuery } from "./search-DhtKwbBC.js";
59
59
  import { n as require_auth_errors, r as require_token_error, t as require_token_util } from "./token-util-Crcay9j_.js";
60
- import { 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, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-7ywLhuZO.js";
61
- import { C as resolveIssueHeadlineCost, D as stopAgentOutputService, E as startAgentOutputService, S as getCachedRunningAgents, T as retainAgentOutputInterest, _ as migrateAllSessionsSync, b as syncCacheSync, d as eventsRouteLayer, f as resumeQueuedMerges, g as reclassifyUnknownCostEventsSync, h as reconcilePiTranscripts, m as reconcile$1, p as syncWalFromAllProjects, t as workspacesRouteLayer, u as internalEventsRouteLayer, v as getCostsForIssueSync, w as getWorkspacePathForIssue, x as processPendingFeedbackDeliveries, y as rebuildCacheSync } from "./workspaces-BJdPqx_J.js";
62
- import { S as parseAcpConversationMessages, _ as isOhmypiSessionFile, a as contextUsageFromParseResult, b as parseCodexConversationMessages, c as parseEntireConversation, d as init_kimi_conversation_parser, f as parseKimiConversationMessages, g as init_ohmypi_conversation_parser, h as parsePiConversationMessages, i as computeContextUsage, l as parseFromLastCompactBoundary, m as isPiSessionFile, n as gateSnapshotEmission, o as summarizeConversationActivity, p as init_pi_conversation_parser, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseOhmypiConversationMessages, x as init_acp_conversation_parser, y as init_codex_conversation_parser } from "./conversation-service-tQCIbBVZ.js";
63
- import { a as resolveClaudeSessionId, c as resolveKimiWirePath, i as resolveAgentHarness, l as resolvePiSessionPath, n as readLauncherPinnedSessionId, o as resolveCodexRolloutPath, r as resolveAcpTranscriptPath, s as resolveJsonlPath, t as init_jsonl_resolver } from "./jsonl-resolver-07OS3qOr.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-YxIv-fG1.js";
65
- import { c as tailEventsSync, n as deduplicateEventsSync, s as readEventsSync } from "./events-B6zioJA_.js";
66
- import { n as recordBackgroundAiCost, t as init_cost } from "./cost-BCWEkvro.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-BbbCZEtJ.js";
68
- import { n as writeSequenceMd, t as parseSequenceMd } from "./sequence-io--b3_PsWq.js";
69
- 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-D1UbSDPd.js";
70
- import { C as readCurrentLatestFlywheelStatus, D as writeFlywheelLaunchMetadata, E as subscribeLatestFlywheelStatus, F as setItemRequirements, G as liveOrderIssueLookup, H as getBook, I as setSettings, K as normalizeOrderIssueId, L as setStatus, M as moveItem, N as removeItem, O as writeLatestFlywheelStatus, P as renameBook, R as backlogCandidates, S as nextFlywheelRunId, T as resolveLiveFlywheelRunId, U as getBookAsync, W 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-CjW2L7BS.js";
71
- import { n as resolveConversationGitInfo } from "./git-info-BSrI9owC.js";
72
- import { a as getResourceStacks, c as getCurrentDockerStats, f as getSystemHealthEvidenceSnapshot, g as classifyAgentHealth, h as startSmeeProcessSync, l as getAcceptedSystemHealthSnapshot, m as isSmeeConfiguredSync, o as formatUptime, s as getContainerHistory, u as getDeployStaleness } from "./memory-governor-Cqvbusr4.js";
73
- import { D as detectPlatform, E as validateFeatureName, O as init_platform, S as init_worktree_ops, _ as updateWorkspaceLayout, b as readWorkspaceIdentity, c as installGitHooksInDir, d as init_writer, f as relocateWorkspace, g as unarchiveWorkspace, h as touchWorkspaceAccessed, l as archiveWorkspace, m as setWorkspaceRunCommand, p as setWorkspaceFavorite, s as init_git_hooks, u as createWorkspace, v as upsertProjectFromConfig, x as writeWorkspaceIdentity, y as init_identity_record } from "./workspace-manager-CgovxDrO.js";
74
- import { n as init_workspace_config, t as getDefaultWorkspaceConfigSync } from "./workspace-config-DRYDO7Zr.js";
75
- import { B as cleanupClosedIssueAgentDirectories, F as setAgentStatusChangedNotifier, I as setAgentStoppedNotifier, J as isBootReconciliationCandidate, K as extendBootReconciliationGrace, L as setMergeReadyNotifier, O as loadConfig, X as startBootReconciliation, Y as listBootReconciliationCandidates, Z as resolveSwarmPolicy, gt as paneShowsClaudeBootBlockingScreen, k as loadState, n as applyBootReconciliationDecision, q as isAutoResumableRole, r as assessDeaconPatrolFreshness, x as getDeaconLogs } from "./deacon-B24dNzr8.js";
76
- import { i as getRuntimeForAgent } from "./agent-idle-ONBssBN_.js";
77
- import { a as getShadowState, s as init_shadow_state } from "./shadow-state-CSA1vtxr.js";
78
- import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-6RQsAjDX.js";
79
- import { r as parseArtifactRef } from "./forge-RVTCK_5X.js";
80
- import "./parked-residue-BiHb8cD7.js";
81
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-C1gCLFmp.js";
82
- import { t as init_specialists } from "./specialists-CuDWiNdB.js";
83
- import { a as getReviewerSessionName } from "./specialists-registry-BYjs04iK.js";
84
- import { a as readPrdContent, r as findPrdAnywhereSync } from "./prd-locations-BbAvqQmT.js";
85
- import { i as resolveBootGates, r as formatBootGateState } from "./no-resume-mode-xuYLFhLw.js";
86
- import { t as createInFlightGuard } from "./in-flight-guard-DuxabAHT.js";
87
- import { A as removeIssueParkedLabel, C as applyIssueParkedLabel, D as init_label_ops, E as applyIssueVetoedLabel, M as removeIssueReleasedLabel, N as removeIssueVetoedLabel, O as removeIssueBlocksMainLabel, S as applyIssueObjectionLabel, T as applyIssueReleasedLabel, g as parseIssueIdFromTextSync, h as init_resource_utils, j as removeIssueReadyLabel, k as removeIssueObjectionLabel, w as applyIssueReadyLabel, x as applyIssueBlocksMainLabel } from "./pipeline-membership-gather-BK4dzh0X.js";
88
- import { a as spawnPlanningSession, r as resolveAutoSpawnOnFinalize } from "./spawn-planning-session-CkGweSCC.js";
89
- import { r as computeMergeQueueFromCandidates, s as listEligibleCandidatesByProject } from "./flywheel-merge-order-D_yyAlND.js";
90
- import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-BNzODIv6.js";
91
- 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-CSaTLi3u.js";
92
- import { _ as refreshMembershipSnapshotsForProjects, a as enqueueProjectsResourceRefresh, c as startProjectResourceConvergence, d as getCachedResourceAllocatedIssues, f as getResourceDetailIdentifiers, g as readPipelineMembershipSnapshotsForProjects, h as sanitizeResourceAllocatedIssues, l as stopProjectResourceRefreshQueue, m as isDiscoverableAgentSession, o as getProjectResourceRefreshQueueState, p as groupResourceAllocatedIssuesByProject, u as whenProjectResourceRefreshIdle, v as summarizePipelineMembership, y as unavailablePipelineMembership } from "./project-resource-refresh-queue-x-K9mvpP.js";
93
- import { r as spawnInspectAgent } from "./inspect-agent-sV_19NxZ.js";
94
- import { r as lookupPullRequestNumberForBranch, t as githubPrLookupSource } from "./github-pr-lookup-Dhh3ec1V.js";
95
- import { a as fetchIssuePullRequestDiff, c as getCachedIssuePrTabResponse, i as fetchIssuePullRequestDetails, l as getIssuePrTabCacheGeneration, n as fetchIssueCheckRuns, r as fetchIssuePullRequest, s as bumpIssuePrTabCacheGeneration, u as setCachedIssuePrTabResponse } from "./pull-requests-Cp_FDT8-.js";
96
- import { n as DOD_ROWS } from "./dod-DWtilRLx.js";
97
- import { n as resolveParkedPopulation, r as summarizeParked } from "./resolver-DvSMXty7.js";
98
- import { a as readCurrentStatus, l as maybeTriggerStatusRollup, s as readRecentObservations, u as writePendingTurn } from "./rollup-B6g9Nr6L.js";
99
- import { r as isExtendedReviewEnabled } from "./review-agent-esZ0QXdY.js";
100
- import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-CO08YlfQ.js";
101
- import { S as ensureSyncGitQuiescent, x as listGitOperationsSync } from "./merge-agent-B3jRrlS1.js";
102
- import { t as readVerificationArtifact } from "./verification-artifact-k5Ftpg0c.js";
103
- import { t as getAgentCommandSync } from "./settings-CLQcdkoD.js";
104
- import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-BU6ONLpv.js";
105
- import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-m-VVZej1.js";
106
- 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-BvcW6bq0.js";
107
- import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-D4VOmF7p.js";
108
- import { n as loadShipRecords, r as publicShipStatus, t as aggregateGenerationShipStatus } from "./ship-status-BEkddXMT.js";
109
- import { t as init_context_layers } from "./context-layers-BBTKP-Y4.js";
110
- import { a as appendLinearMcpAuthHealthyEvent, r as appendLinearMcpAuthCallbackRelayedEvent, u as resolveLinearMcpAuthIntervention } from "./linear-mcp-auth-Nk5s3L9M.js";
111
- import { i as getMergeBlockersPayload, n as hasOrderIssuePrd, r as validateBookForStart, t as createOrderPrdLookup } from "./validate-Ur4xH5bN.js";
112
- import { i as spawnSequencerAgent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-CqouKVZG.js";
113
- import { n as sameCanonicalReviewStatus, t as emitReviewStatusChanged } from "./review-status-emit-BZz1Y_22.js";
114
- import "./supervisor-D3jC2c7A.js";
115
- import { l as startUatTrainReconciler, u as stopUatTrainReconciler } from "./uat-train-IIZlz7r3.js";
116
- import { n as settlePendingLifecycleClaim, t as claimPendingLifecycleFile } from "./pending-lifecycle-claim-J5uIIJPu.js";
117
- import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-Cszp_0Np.js";
118
- import { r as readPendingDeploy } from "./deploy-queue-r96ojDI3.js";
60
+ import { 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, l as getMergeBackendStatus, p as isGitHubAppConfigured } from "./github-app-BlMSzSTw.js";
61
+ import { C as startAgentOutputService, S as retainAgentOutputInterest, _ as syncCacheSync, b as resolveIssueHeadlineCost, d as eventsRouteLayer, f as resumeQueuedMerges, g as rebuildCacheSync, h as getCostsForIssueSync, m as migrateAllSessionsSync, p as syncWalFromAllProjects, t as workspacesRouteLayer, u as internalEventsRouteLayer, v as processPendingFeedbackDeliveries, w as stopAgentOutputService, x as getWorkspacePathForIssue, y as getCachedRunningAgents } from "./workspaces-C7LAuZfe.js";
62
+ import { S as parseAcpConversationMessages, _ as isOhmypiSessionFile, a as contextUsageFromParseResult, b as parseCodexConversationMessages, c as parseEntireConversation, d as init_kimi_conversation_parser, f as parseKimiConversationMessages, g as init_ohmypi_conversation_parser, h as parsePiConversationMessages, i as computeContextUsage, l as parseFromLastCompactBoundary, m as isPiSessionFile, n as gateSnapshotEmission, o as summarizeConversationActivity, p as init_pi_conversation_parser, r as watchConversation, s as parseConversationMessages, t as init_conversation_service, v as parseOhmypiConversationMessages, x as init_acp_conversation_parser, y as init_codex_conversation_parser } from "./conversation-service-BxIOd5ay.js";
63
+ import { a as resolveClaudeSessionId, c as resolveKimiWirePath, i as resolveAgentHarness, l as resolvePiSessionPath, n as readLauncherPinnedSessionId, o as resolveCodexRolloutPath, r as resolveAcpTranscriptPath, s as resolveJsonlPath, t as init_jsonl_resolver } from "./jsonl-resolver-bFtftCDd.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-BFKG3Gxv.js";
65
+ import { c as tailEventsSync, n as deduplicateEventsSync, s as readEventsSync } from "./events-B6xW8Cpm.js";
66
+ import { n as recordBackgroundAiCost, t as init_cost } from "./cost-Cctc-Q9M.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-D_ICP7TI.js";
68
+ import { i as reclassifyUnknownCostEventsSync, n as reconcile$1, r as recordCostEventsThroughOverdeck, t as collectPiCostEvents } from "./reconciler-caYiRnPy.js";
69
+ import { n as writeSequenceMd, t as parseSequenceMd } from "./sequence-io-C-Q19Jez.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-Dle6k9Xt.js";
71
+ import { C as readCurrentLatestFlywheelStatus, D as writeFlywheelLaunchMetadata, E as subscribeLatestFlywheelStatus, F as setItemRequirements, G as liveOrderIssueLookup, H as getBook, I as setSettings, K as normalizeOrderIssueId, L as setStatus, M as moveItem, N as removeItem, O as writeLatestFlywheelStatus, P as renameBook, R as backlogCandidates, S as nextFlywheelRunId, T as resolveLiveFlywheelRunId, U as getBookAsync, W 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-DWKd7bMc.js";
72
+ import { n as resolveConversationGitInfo } from "./git-info-DMOSfJ9I.js";
73
+ import { _ as classifyAgentHealth, c as getContainerHistory, d as getDeployStaleness, g as startSmeeProcessSync, h as isSmeeConfiguredSync, l as getCurrentDockerStats, o as getResourceStacks, p as getSystemHealthEvidenceSnapshot, s as formatUptime, u as getAcceptedSystemHealthSnapshot } from "./memory-governor-Cvv_9K0M.js";
74
+ import { D as detectPlatform, E as validateFeatureName, O as init_platform, S as init_worktree_ops, _ as updateWorkspaceLayout, b as readWorkspaceIdentity, c as installGitHooksInDir, d as init_writer, f as relocateWorkspace, g as unarchiveWorkspace, h as touchWorkspaceAccessed, l as archiveWorkspace, m as setWorkspaceRunCommand, p as setWorkspaceFavorite, s as init_git_hooks, u as createWorkspace, v as upsertProjectFromConfig, x as writeWorkspaceIdentity, y as init_identity_record } from "./workspace-manager-CM8RCrSc.js";
75
+ import { n as init_workspace_config, t as getDefaultWorkspaceConfigSync } from "./workspace-config-D-bNq2CF.js";
76
+ import { B as cleanupClosedIssueAgentDirectories, F as setAgentStatusChangedNotifier, I as setAgentStoppedNotifier, J as isBootReconciliationCandidate, K as extendBootReconciliationGrace, L as setMergeReadyNotifier, O as loadConfig, X as startBootReconciliation, Y as listBootReconciliationCandidates, Z as resolveSwarmPolicy, gt as paneShowsClaudeBootBlockingScreen, k as loadState, n as applyBootReconciliationDecision, q as isAutoResumableRole, r as assessDeaconPatrolFreshness, x as getDeaconLogs } from "./deacon-CsisLmPt.js";
77
+ import { a as generateHealthSummary, n as readCloisterStateFile, o as getAgentHealth, s as getAgentsNeedingAttention, t as getCloisterService } from "./service-CThO0Sar.js";
78
+ import { i as getRuntimeForAgent } from "./agent-idle-D-UQ7gDv.js";
79
+ import { a as getShadowState, s as init_shadow_state } from "./shadow-state-BTLi4Axs.js";
80
+ import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-CiYAa6bX.js";
81
+ import { r as parseArtifactRef } from "./forge-CHADjOFs.js";
82
+ import "./parked-residue-8WbU0y1z.js";
83
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-Ds1Wjsz4.js";
84
+ import { t as init_specialists } from "./specialists-D6MUU31Q.js";
85
+ import { a as getReviewerSessionName } from "./specialists-registry-Bng0OFGH.js";
86
+ import { a as readPrdContent, r as findPrdAnywhereSync } from "./prd-locations-F2oLSAhy.js";
87
+ import { i as resolveBootGates, r as formatBootGateState } from "./no-resume-mode-DjMQRkId.js";
88
+ import { t as createInFlightGuard } from "./in-flight-guard-B7khcBdQ.js";
89
+ import { A as removeIssueParkedLabel, C as applyIssueParkedLabel, D as init_label_ops, E as applyIssueVetoedLabel, M as removeIssueReleasedLabel, N as removeIssueVetoedLabel, O as removeIssueBlocksMainLabel, S as applyIssueObjectionLabel, T as applyIssueReleasedLabel, g as parseIssueIdFromTextSync, h as init_resource_utils, j as removeIssueReadyLabel, k as removeIssueObjectionLabel, w as applyIssueReadyLabel, x as applyIssueBlocksMainLabel } from "./pipeline-membership-gather-Ba0wJNCR.js";
90
+ import { a as spawnPlanningSession, r as resolveAutoSpawnOnFinalize } from "./spawn-planning-session-DCmO6COk.js";
91
+ import { r as computeMergeQueueFromCandidates, s as listEligibleCandidatesByProject } from "./flywheel-merge-order-DJwH2KpL.js";
92
+ import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-Cu6yfxBS.js";
93
+ 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-DbbN7vSm.js";
94
+ import { _ as refreshMembershipSnapshotsForProjects, a as enqueueProjectsResourceRefresh, c as startProjectResourceConvergence, d as getCachedResourceAllocatedIssues, f as getResourceDetailIdentifiers, g as readPipelineMembershipSnapshotsForProjects, h as sanitizeResourceAllocatedIssues, l as stopProjectResourceRefreshQueue, m as isDiscoverableAgentSession, o as getProjectResourceRefreshQueueState, p as groupResourceAllocatedIssuesByProject, u as whenProjectResourceRefreshIdle, v as summarizePipelineMembership, y as unavailablePipelineMembership } from "./project-resource-refresh-queue-BehrH4Ai.js";
95
+ import { r as spawnInspectAgent } from "./inspect-agent-CCfNJjKr.js";
96
+ import { r as lookupPullRequestNumberForBranch, t as githubPrLookupSource } from "./github-pr-lookup-bGcsEvLE.js";
97
+ import { a as fetchIssuePullRequestDiff, c as getCachedIssuePrTabResponse, i as fetchIssuePullRequestDetails, l as getIssuePrTabCacheGeneration, n as fetchIssueCheckRuns, r as fetchIssuePullRequest, s as bumpIssuePrTabCacheGeneration, u as setCachedIssuePrTabResponse } from "./pull-requests-T0OV0Vn4.js";
98
+ import { n as DOD_ROWS } from "./dod-BAk5arLF.js";
99
+ import { n as resolveParkedPopulation, r as summarizeParked } from "./resolver-D4nsxfGo.js";
100
+ import { a as readCurrentStatus, l as maybeTriggerStatusRollup, s as readRecentObservations, u as writePendingTurn } from "./rollup-DU3xBQu2.js";
101
+ import { r as isExtendedReviewEnabled } from "./review-agent-BRBTm1qE.js";
102
+ import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-McqCk2X7.js";
103
+ import { S as ensureSyncGitQuiescent, x as listGitOperationsSync } from "./merge-agent-C-dsN9se.js";
104
+ import { t as readVerificationArtifact } from "./verification-artifact-DglwaHke.js";
105
+ import { t as getAgentCommandSync } from "./settings-CTywpFw5.js";
106
+ import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-xY0B43Ho.js";
107
+ import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-BYnXaTVc.js";
108
+ 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-DhhaFhxZ.js";
109
+ import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-B-1KETG9.js";
110
+ import { n as loadShipRecords, r as publicShipStatus, t as aggregateGenerationShipStatus } from "./ship-status-rQbPQBsF.js";
111
+ import { t as init_context_layers } from "./context-layers-CdpabJj0.js";
112
+ import { n as init_merge_eligibility, r as isMergeEligible, t as gatherMergeEligibility } from "./merge-eligibility-D7wRnJbj.js";
113
+ import { a as appendLinearMcpAuthHealthyEvent, r as appendLinearMcpAuthCallbackRelayedEvent, u as resolveLinearMcpAuthIntervention } from "./linear-mcp-auth-bB0CPyjh.js";
114
+ import { i as getMergeBlockersPayload, n as hasOrderIssuePrd, r as validateBookForStart, t as createOrderPrdLookup } from "./validate-BYcBcBwg.js";
115
+ import { i as spawnSequencerAgent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-eN2P2lDz.js";
116
+ import { n as sameCanonicalReviewStatus, t as emitReviewStatusChanged } from "./review-status-emit-D7sM720S.js";
117
+ import "./supervisor-DqH-laVL.js";
118
+ import { l as startUatTrainReconciler, u as stopUatTrainReconciler } from "./uat-train-BBEiYSep.js";
119
+ import { n as settlePendingLifecycleClaim, t as claimPendingLifecycleFile } from "./pending-lifecycle-claim-yAwDuGS4.js";
120
+ import { i as listTranscriptCheckpoints, r as getTranscriptCheckpoint$1 } from "./checkpoints-DUkUsPVS.js";
121
+ import { r as readPendingDeploy } from "./deploy-queue-CCGWXFkp.js";
119
122
  import { createRequire } from "node:module";
120
123
  import { basename, delimiter, dirname, extname, isAbsolute, join, normalize, posix, relative, resolve, sep, win32 } from "node:path";
121
124
  import { Cause, Context, Data, Duration, Effect, Exit, Fiber, FileSystem, Layer, Option, Path, Queue, Result, Schedule, Schema, Stream } from "effect";
@@ -724,7 +727,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
724
727
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
725
728
  const plan = readWorkspacePlanSync(workspacePath);
726
729
  if (!plan || plan.plan.items.length === 0) throw new PlanEmpty({ id: issueId });
727
- const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-DpCuoF65.js");
730
+ const { getAgentState, spawnAgent, normalizeAgentId } = await import("./agents-DixZjXWm.js");
728
731
  const normalizedId = normalizeAgentId(issueId);
729
732
  if ((await Effect.runPromise(getAgentState(normalizedId)))?.status === "running") throw new AgentAlreadyRunning({ id: issueId });
730
733
  return {
@@ -756,7 +759,7 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
756
759
  const { workspacePath, projectPath, issue } = opts;
757
760
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
758
761
  const sessionName = opts.sessionName ?? `planning-${issueId.toLowerCase()}`;
759
- const { spawnPlanningSession } = await import("./spawn-planning-session-s406rw1N.js");
762
+ const { spawnPlanningSession } = await import("./spawn-planning-session-DfEWyrVV.js");
760
763
  const result = await spawnPlanningSession({
761
764
  issue: {
762
765
  id: issue.id,
@@ -790,14 +793,14 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
790
793
  }),
791
794
  kill: (agentId) => Effect.tryPromise({
792
795
  try: async () => {
793
- const { stopAgent } = await import("./agents-DpCuoF65.js");
796
+ const { stopAgent } = await import("./agents-DixZjXWm.js");
794
797
  await Effect.runPromise(stopAgent(agentId));
795
798
  },
796
799
  catch: () => void 0
797
800
  }).pipe(Effect.ignore),
798
801
  message: (agentId, msg) => Effect.tryPromise({
799
802
  try: async () => {
800
- const { messageAgent } = await import("./agents-DpCuoF65.js");
803
+ const { messageAgent } = await import("./agents-DixZjXWm.js");
801
804
  await messageAgent(agentId, msg);
802
805
  },
803
806
  catch: (err) => new AgentStartError({
@@ -808,8 +811,8 @@ const AgentSpawnerLive = Layer.effect(AgentSpawner, Effect.sync(() => ({
808
811
  }),
809
812
  deepWipe: (issueId, opts) => Effect.tryPromise({
810
813
  try: async () => {
811
- const { deepWipe } = await import("./workflows-CfHm8lVd.js");
812
- const { resolveProjectFromIssueSync } = await import("./projects-LftaVK99.js");
814
+ const { deepWipe } = await import("./workflows-BtHRlFIm.js");
815
+ const { resolveProjectFromIssueSync } = await import("./projects-BMuEf14J.js");
813
816
  const project = resolveProjectFromIssueSync(issueId);
814
817
  const projectPath = project?.projectPath ?? process.cwd();
815
818
  await Effect.runPromise(deepWipe({
@@ -868,8 +871,8 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
868
871
  const { workspacePath, branch } = getWorkspacePath(issueId);
869
872
  const issueLower = issueId.toLowerCase();
870
873
  if (existsSync$1(workspacePath)) return workspacePath;
871
- const { createWorkspace } = await import("./workspace-manager-jfkKAEuO.js");
872
- const { loadProjectsConfigSync } = await import("./projects-LftaVK99.js");
874
+ const { createWorkspace } = await import("./workspace-manager-BrbX90Rm.js");
875
+ const { loadProjectsConfigSync } = await import("./projects-BMuEf14J.js");
873
876
  const { projects } = loadProjectsConfigSync();
874
877
  const project = resolveProjectFromIssueSync(issueId);
875
878
  if (!project) throw new WorkspaceCreateError({
@@ -904,7 +907,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
904
907
  const { workspacePath } = getWorkspacePath(issueId);
905
908
  const issueLower = issueId.toLowerCase();
906
909
  if (!existsSync$1(workspacePath)) throw new WorkspaceNotFound({ id: issueId });
907
- const { removeWorkspace } = await import("./workspace-manager-jfkKAEuO.js");
910
+ const { removeWorkspace } = await import("./workspace-manager-BrbX90Rm.js");
908
911
  const project = resolveProjectFromIssueSync(issueId);
909
912
  if (!project) throw new WorkspaceCreateError({
910
913
  id: issueId,
@@ -935,7 +938,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
935
938
  try: async () => {
936
939
  const { workspacePath } = getWorkspacePath(issueId);
937
940
  const issueLower = issueId.toLowerCase();
938
- const { stopWorkspaceDocker } = await import("./workspace-manager-jfkKAEuO.js");
941
+ const { stopWorkspaceDocker } = await import("./workspace-manager-BrbX90Rm.js");
939
942
  await Effect.runPromise(stopWorkspaceDocker(workspacePath, issueLower));
940
943
  },
941
944
  catch: () => void 0
@@ -1004,7 +1007,7 @@ const WorkspaceServiceLive = Layer.effect(WorkspaceService, Effect.sync(() => {
1004
1007
  join(workspacePath, ".devcontainer", "docker-compose.devcontainer.yml")
1005
1008
  ];
1006
1009
  if (!composePaths.find((p) => existsSync$1(p))) {
1007
- const { ensureDevcontainerSync } = await import("./ensure-devcontainer-rGSh0JHK.js");
1010
+ const { ensureDevcontainerSync } = await import("./ensure-devcontainer-Dk6ZMOUC.js");
1008
1011
  const ensure = ensureDevcontainerSync({
1009
1012
  workspacePath,
1010
1013
  issueId
@@ -17273,7 +17276,7 @@ var require_get_vercel_oidc_token = /* @__PURE__ */ __commonJSMin(((exports, mod
17273
17276
  err = error;
17274
17277
  }
17275
17278
  try {
17276
- const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-DfUS3Lpp.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-Bez-qCB2.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
17279
+ const [{ getTokenPayload, isExpired }, { refreshToken }] = await Promise.all([await import("./token-util-DfUS3Lpp.js").then((m) => /* @__PURE__ */ __toESM(m.default)), await import("./token-BdfZLRg1.js").then((m) => /* @__PURE__ */ __toESM(m.default))]);
17277
17280
  if (!token || isExpired(getTokenPayload(token), options?.expirationBufferMs)) {
17278
17281
  await refreshToken(options);
17279
17282
  token = getVercelOidcTokenSync();
@@ -29590,7 +29593,7 @@ var GoogleCloudTranscription = class {
29590
29593
  }
29591
29594
  async start(apiKey, model) {
29592
29595
  try {
29593
- const { SpeechClient } = await import("./src-CZsPs61V.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
29596
+ const { SpeechClient } = await import("./src-C7gGe4KU.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1)).then((module) => module.v1p1beta1 ?? module.v1);
29594
29597
  if (this.closed) return;
29595
29598
  const stream = new SpeechClient({ apiKey }).streamingRecognize({
29596
29599
  config: {
@@ -30274,14 +30277,22 @@ function streamAgentOutput(eventStore, agentId) {
30274
30277
  init_agent_input_detection();
30275
30278
  init_tracker_config();
30276
30279
  init_agent_enrichment();
30280
+ init_jsonl_resolver();
30281
+ init_control_settings();
30277
30282
  init_acp_conversation_parser();
30278
30283
  init_codex_conversation_parser();
30284
+ init_kimi_conversation_parser();
30279
30285
  init_ohmypi_conversation_parser();
30280
30286
  init_pi_conversation_parser();
30281
- init_kimi_conversation_parser();
30282
30287
  init_conversation_service();
30283
- init_jsonl_resolver();
30284
- init_control_settings();
30288
+ const transcriptParsers = {
30289
+ pi: parsePiConversationMessages,
30290
+ ohmypi: parseOhmypiConversationMessages,
30291
+ codex: parseCodexConversationMessages,
30292
+ acp: parseAcpConversationMessages,
30293
+ kimi: parseKimiConversationMessages,
30294
+ "claude-initial": (sessionFile) => parseEntireConversation(sessionFile, { flushPendingToolUse: false })
30295
+ };
30285
30296
  const MAX_PENDING_JOBS = 32;
30286
30297
  const SEMANTIC_SEARCH_TIMEOUT_MS = Number.parseInt(process.env["OVERDECK_SEMANTIC_SEARCH_TIMEOUT_MS"] ?? "15000", 10);
30287
30298
  const COALESCED_OPERATIONS = new Set([
@@ -30289,16 +30300,23 @@ const COALESCED_OPERATIONS = new Set([
30289
30300
  "enrichSessions",
30290
30301
  "embedSessions",
30291
30302
  "searchSessionsSemantic",
30292
- "listSubstrateBugWeights"
30303
+ "listSubstrateBugWeights",
30304
+ "parseTranscriptSnapshot"
30293
30305
  ]);
30294
30306
  const workers = {
30295
30307
  read: null,
30296
30308
  long: null,
30297
- semantic: null
30309
+ semantic: null,
30310
+ parse: null
30298
30311
  };
30299
30312
  const pending = /* @__PURE__ */ new Map();
30300
30313
  const sharedJobs = /* @__PURE__ */ new Map();
30301
30314
  let latestSemanticJobId = null;
30315
+ function formatSlowJobLine(input) {
30316
+ if (input.waitMs <= 1e3 && input.runMs <= 1e3) return null;
30317
+ const bytes = input.bytes === void 0 ? "" : ` bytes=${input.bytes}`;
30318
+ return `[db-jobs] slow: op=${input.op} lane=${input.lane} waitMs=${input.waitMs} runMs=${input.runMs} depth=${input.depth}${bytes}`;
30319
+ }
30302
30320
  function workerScriptUrl() {
30303
30321
  return import.meta.url.endsWith(".ts") ? new URL("./dashboard-db-worker.ts", import.meta.url) : new URL("./dashboard-db-worker.js", import.meta.url);
30304
30322
  }
@@ -30323,6 +30341,8 @@ function coalescingKey(operation, payload) {
30323
30341
  }
30324
30342
  function workerLane(operation) {
30325
30343
  if (operation === "searchSessionsSemantic") return "semantic";
30344
+ if (operation === "parseTranscriptSnapshot") return "parse";
30345
+ if (operation === "costReconcileSweep") return "long";
30326
30346
  return COALESCED_OPERATIONS.has(operation) ? "long" : "read";
30327
30347
  }
30328
30348
  function cancelOlderSemanticSearches() {
@@ -30347,12 +30367,28 @@ function getWorker(lane) {
30347
30367
  if (message.progress !== void 0) {
30348
30368
  job.progressChain = job.progressChain.then(async () => {
30349
30369
  for (const listener of job.progressListeners) await listener(message.progress);
30370
+ }).finally(() => {
30371
+ worker.postMessage({
30372
+ id: message.id,
30373
+ ack: message.progressSeq
30374
+ });
30350
30375
  });
30351
30376
  return;
30352
30377
  }
30353
30378
  pending.delete(message.id);
30354
30379
  if (job.timeout) clearTimeout(job.timeout);
30355
30380
  if (job.lane === "semantic" && latestSemanticJobId === message.id) latestSemanticJobId = null;
30381
+ if (message.startedAt !== void 0 && message.finishedAt !== void 0) {
30382
+ const line = formatSlowJobLine({
30383
+ op: job.operation,
30384
+ lane: job.lane,
30385
+ waitMs: message.startedAt - job.enqueuedAt,
30386
+ runMs: message.finishedAt - message.startedAt,
30387
+ depth: [...pending.values()].filter((pendingJob) => pendingJob.lane === job.lane).length,
30388
+ bytes: message.bytes
30389
+ });
30390
+ if (line) console.warn(line);
30391
+ }
30356
30392
  if (message.ok) {
30357
30393
  job.progressChain.then(() => job.resolve(message.result), job.reject);
30358
30394
  return;
@@ -30372,7 +30408,7 @@ function getWorker(lane) {
30372
30408
  });
30373
30409
  return worker;
30374
30410
  }
30375
- async function runInline$1(operation, payload, onProgress) {
30411
+ async function executeInline(operation, payload, onProgress) {
30376
30412
  switch (operation) {
30377
30413
  case "getDiscoveredStats": return getDiscoveredStats();
30378
30414
  case "listDiscoveredSessions": {
@@ -30407,6 +30443,12 @@ async function runInline$1(operation, payload, onProgress) {
30407
30443
  onProgress
30408
30444
  });
30409
30445
  case "getConversationByName": return getConversationByName(payload);
30446
+ case "parseTranscriptSnapshot": {
30447
+ const input = payload;
30448
+ const parser = transcriptParsers[input.parser];
30449
+ if (!parser) throw new Error(`Unknown transcript parser: ${input.parser}`);
30450
+ return parser(input.sessionFile);
30451
+ }
30410
30452
  case "getSetting": return getSetting(payload);
30411
30453
  case "setSetting": {
30412
30454
  const input = payload;
@@ -30421,27 +30463,66 @@ async function runInline$1(operation, payload, onProgress) {
30421
30463
  });
30422
30464
  }
30423
30465
  case "getArtifactBySlug": {
30424
- const { getArtifactBySlugJob } = await import("./artifact-index-jobs-Ck4NRRkY.js");
30466
+ const { getArtifactBySlugJob } = await import("./artifact-index-jobs-Cjdme0jS.js");
30425
30467
  return getArtifactBySlugJob(payload);
30426
30468
  }
30427
30469
  case "listArtifactsForWorkspaceOrIssue": {
30428
- const { listArtifactsForWorkspaceOrIssueJob } = await import("./artifact-index-jobs-Ck4NRRkY.js");
30470
+ const { listArtifactsForWorkspaceOrIssueJob } = await import("./artifact-index-jobs-Cjdme0jS.js");
30429
30471
  return listArtifactsForWorkspaceOrIssueJob(payload);
30430
30472
  }
30431
30473
  case "unshareArtifactBySlug": {
30432
- const { unshareArtifactBySlugJob } = await import("./artifact-index-jobs-Ck4NRRkY.js");
30474
+ const { unshareArtifactBySlugJob } = await import("./artifact-index-jobs-Cjdme0jS.js");
30433
30475
  return unshareArtifactBySlugJob(payload);
30434
30476
  }
30477
+ case "costReconcileSweep": return payload.source === "pi" ? collectPiCostEvents({
30478
+ ...payload,
30479
+ onBatch: async (batch) => onProgress?.(batch)
30480
+ }) : collectCodexCostEvents({
30481
+ ...payload,
30482
+ onBatch: async (batch) => onProgress?.(batch)
30483
+ });
30484
+ }
30485
+ }
30486
+ async function runInline$1(operation, payload, onProgress) {
30487
+ const startedAt = Date.now();
30488
+ let bytes;
30489
+ try {
30490
+ const result = await executeInline(operation, payload, onProgress);
30491
+ if (operation === "parseTranscriptSnapshot") bytes = result.byteOffset;
30492
+ return result;
30493
+ } finally {
30494
+ const line = formatSlowJobLine({
30495
+ op: operation,
30496
+ lane: workerLane(operation),
30497
+ waitMs: 0,
30498
+ runMs: Date.now() - startedAt,
30499
+ depth: 0,
30500
+ bytes
30501
+ });
30502
+ if (line) console.warn(line);
30435
30503
  }
30436
30504
  }
30437
30505
  function runDashboardDbJob(operation, payload, onProgress) {
30438
- if (import.meta.url.endsWith(".ts") && process.env["VITEST"]) return runInline$1(operation, payload, onProgress);
30439
30506
  const key = coalescingKey(operation, payload);
30440
30507
  const existing = key ? sharedJobs.get(key) : void 0;
30441
30508
  if (existing) {
30442
30509
  if (onProgress) existing.progressListeners.add(onProgress);
30443
30510
  return existing.promise;
30444
30511
  }
30512
+ if (import.meta.url.endsWith(".ts") && process.env["VITEST"]) {
30513
+ const progressListeners = /* @__PURE__ */ new Set();
30514
+ if (onProgress) progressListeners.add(onProgress);
30515
+ const promise = runInline$1(operation, payload, onProgress);
30516
+ if (key) {
30517
+ sharedJobs.set(key, {
30518
+ lane: workerLane(operation),
30519
+ promise,
30520
+ progressListeners
30521
+ });
30522
+ promise.then(() => sharedJobs.delete(key), () => sharedJobs.delete(key));
30523
+ }
30524
+ return promise;
30525
+ }
30445
30526
  if (pending.size >= MAX_PENDING_JOBS) return Promise.reject(/* @__PURE__ */ new Error("Dashboard database worker queue is full"));
30446
30527
  const id = randomUUID$1();
30447
30528
  const lane = workerLane(operation);
@@ -30468,7 +30549,8 @@ function runDashboardDbJob(operation, payload, onProgress) {
30468
30549
  reject,
30469
30550
  progressListeners,
30470
30551
  progressChain: Promise.resolve(),
30471
- timeout
30552
+ timeout,
30553
+ enqueuedAt: Date.now()
30472
30554
  });
30473
30555
  getWorker(lane).postMessage({
30474
30556
  id,
@@ -31057,7 +31139,8 @@ async function startSubagentListPolling(sessionFile, pendingToolUseIds, emit) {
31057
31139
  * are implemented via TerminalService (dual-runtime PTY, B20).
31058
31140
  */
31059
31141
  init_src();
31060
- init_conversations();
31142
+ init_conversation_service();
31143
+ init_pi_conversation_parser();
31061
31144
  init_paths();
31062
31145
  init_projects();
31063
31146
  function storedToDomainEvent(stored) {
@@ -31089,6 +31172,12 @@ function normalizedIssueId(value) {
31089
31172
  function conversationDiscoveringStream() {
31090
31173
  return Stream.succeed({ kind: "discovering" }).pipe(Stream.repeat(Schedule.fixed("2 seconds")));
31091
31174
  }
31175
+ /**
31176
+ * Watch and emit full transcript snapshots for harnesses without incremental parsing.
31177
+ * Path resolution, file watching, debounce state, and event emission stay on the main
31178
+ * thread. Callers supply a parser callback that sends CPU-bound parsing through the
31179
+ * dashboard DB worker's parse lane via the job door.
31180
+ */
31092
31181
  function streamResolvedFullParseSnapshots(resolve, parse, model, unresolvedMeansEmpty = false) {
31093
31182
  return Stream.callback((queue) => Effect.acquireRelease(Effect.promise(async () => {
31094
31183
  let stopped = false;
@@ -31211,20 +31300,26 @@ function streamResolvedFullParseSnapshots(resolve, parse, model, unresolvedMeans
31211
31300
  } };
31212
31301
  }), (handle) => Effect.sync(() => handle.stop())));
31213
31302
  }
31214
- function ohmypiSnapshotParser(harness) {
31215
- switch (harness) {
31216
- case "pi": return parsePiConversationMessages;
31217
- default: return parseOhmypiConversationMessages;
31218
- }
31219
- }
31220
31303
  function streamHarnessFullParseSnapshots(sessionName, harness, model, unresolvedMeansEmpty = false, workspace = null) {
31221
31304
  const behavior = getHarnessBehavior(harness);
31222
31305
  const streamResolved = (resolve, parse) => streamResolvedFullParseSnapshots(resolve, parse, model, unresolvedMeansEmpty);
31223
31306
  switch (behavior.transcriptKind) {
31224
- case "ohmypi-jsonl": return streamResolved(() => resolvePiSessionPath(sessionName), ohmypiSnapshotParser(harness));
31225
- case "codex-rollout-jsonl": return streamResolved(() => resolveCodexRolloutPath(sessionName), parseCodexConversationMessages);
31226
- case "acp-jsonl": return streamResolved(() => resolveAcpTranscriptPath(sessionName), parseAcpConversationMessages);
31227
- case "kimi-wire-jsonl": return streamResolved(() => resolveKimiWirePath(sessionName, workspace ? { workspaceOverride: workspace } : {}), parseKimiConversationMessages);
31307
+ case "ohmypi-jsonl": return streamResolved(() => resolvePiSessionPath(sessionName), (file) => runDashboardDbJob("parseTranscriptSnapshot", {
31308
+ sessionFile: file,
31309
+ parser: harness === "pi" ? "pi" : "ohmypi"
31310
+ }));
31311
+ case "codex-rollout-jsonl": return streamResolved(() => resolveCodexRolloutPath(sessionName), (file) => runDashboardDbJob("parseTranscriptSnapshot", {
31312
+ sessionFile: file,
31313
+ parser: "codex"
31314
+ }));
31315
+ case "acp-jsonl": return streamResolved(() => resolveAcpTranscriptPath(sessionName), (file) => runDashboardDbJob("parseTranscriptSnapshot", {
31316
+ sessionFile: file,
31317
+ parser: "acp"
31318
+ }));
31319
+ case "kimi-wire-jsonl": return streamResolved(() => resolveKimiWirePath(sessionName, workspace ? { workspaceOverride: workspace } : {}), (file) => runDashboardDbJob("parseTranscriptSnapshot", {
31320
+ sessionFile: file,
31321
+ parser: "kimi"
31322
+ }));
31228
31323
  default: return null;
31229
31324
  }
31230
31325
  }
@@ -31540,7 +31635,7 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
31540
31635
  }), (unsubscribe) => Effect.sync(() => unsubscribe()))),
31541
31636
  [WS_METHODS.subscribeIssueEvents]: (input) => {
31542
31637
  console.log(`[ws-rpc] subscribeIssueEvents invoked issueId=${input.issueId}`);
31543
- import("./issue-service-singleton-CvgNAWqK.js").then(({ getSharedIssueService }) => getSharedIssueService().backfillIssue(input.issueId)).catch(() => {});
31638
+ import("./issue-service-singleton-1Q0ER8Yc.js").then(({ getSharedIssueService }) => getSharedIssueService().backfillIssue(input.issueId)).catch(() => {});
31544
31639
  return eventStore.streamEvents.pipe(Stream.filter(shouldBroadcastDashboardEvent), Stream.map(storedToDomainEvent), Stream.filter(passesDomainEventSchema), Stream.mapEffect((event) => getCachedAgentIssueLookup(readModel).pipe(Effect.map((lookup) => filterDomainEventForIssue(event, input.issueId, lookup)))), Stream.filter((event) => event !== null));
31545
31640
  },
31546
31641
  [WS_METHODS.subscribeTerminal]: (input) => terminalService.streamSession(input.sessionName, input.cols, input.rows),
@@ -31566,7 +31661,7 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
31566
31661
  [WS_METHODS.terminalResize]: (input) => terminalService.resize(input.sessionName, input.cols, input.rows),
31567
31662
  [WS_METHODS.terminalClose]: (input) => terminalService.close(input.sessionName),
31568
31663
  [WS_METHODS.subscribeConversationMessages]: (input) => Stream.unwrap(Effect.gen(function* () {
31569
- const conv = getConversationByName(input.conversationName);
31664
+ const conv = yield* Effect.promise(() => runDashboardDbJob("getConversationByName", input.conversationName));
31570
31665
  if (!conv && /^(agent-|planning-|specialist-|strike-|inspect-)|^(flywheel-orchestrator|conv-flywheel-orchestrator)$/.test(input.conversationName)) {
31571
31666
  const harness = yield* Effect.promise(() => resolveAgentHarness(input.conversationName));
31572
31667
  const stream = streamHarnessFullParseSnapshots(input.conversationName, harness, null);
@@ -31590,7 +31685,10 @@ const PanRpcLayer = PanRpcGroup.toLayer(Effect.gen(function* () {
31590
31685
  Queue.offerUnsafe(queue, event);
31591
31686
  } catch {}
31592
31687
  };
31593
- const initial = await parseEntireConversation(sessionFile, { flushPendingToolUse: false });
31688
+ const initial = await runDashboardDbJob("parseTranscriptSnapshot", {
31689
+ sessionFile,
31690
+ parser: "claude-initial"
31691
+ });
31594
31692
  let currentByteOffset = initial.byteOffset;
31595
31693
  let currentContextUsage = contextUsageFromParseResult(initial, model);
31596
31694
  let highWaterCount = initial.messages.length;
@@ -33334,7 +33432,7 @@ async function closeIssuePullRequest(issueId, reason = "Canceled via Overdeck")
33334
33432
  timeout: 15e3
33335
33433
  });
33336
33434
  try {
33337
- const { setReviewStatusSync } = await import("./review-status-C_kQeeX0.js");
33435
+ const { setReviewStatusSync } = await import("./review-status-Bge_3XTR.js");
33338
33436
  setReviewStatusSync(issueId.toUpperCase(), { prUrl: void 0 });
33339
33437
  } catch {}
33340
33438
  return [`Closed PR #${prNumber} on ${githubCheck.owner}/${githubCheck.repo}`];
@@ -33388,7 +33486,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
33388
33486
  const { ctx, projectConfig } = buildLifecycleContext(id, getIssueDataService$8().getIssueSource(id) ?? void 0);
33389
33487
  const deleteWorkspace = opts.deleteWorkspace ?? true;
33390
33488
  cleanupLog.push(...await closeIssuePullRequest(id, mode === "cancel" ? "Canceled via Overdeck" : "Reset to Todo via Overdeck"));
33391
- const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-DaCovZwn.js");
33489
+ const { resetToTodo, cancelIssueWorkflow } = await import("./lifecycle-DDZ7w-BY.js");
33392
33490
  const workflow = mode === "cancel" ? cancelIssueWorkflow : resetToTodo;
33393
33491
  const result = await Effect.runPromise(workflow(ctx, {
33394
33492
  deleteWorkspace,
@@ -33403,7 +33501,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
33403
33501
  }));
33404
33502
  cleanupLog.push(...result.steps.flatMap((step) => step.details || [step.error].filter(Boolean)));
33405
33503
  if (mode === "cancel") try {
33406
- const { transitionXBriefOnMain } = await import("./lifecycle-io-BBMTaP7S.js");
33504
+ const { transitionXBriefOnMain } = await import("./lifecycle-io-D1oBiMce.js");
33407
33505
  const tx = await Effect.runPromise(transitionXBriefOnMain(ctx.projectPath, id, "cancelled", "cancelled", `scope: cancel ${id.toUpperCase()} xBRIEF`));
33408
33506
  if (tx.moved) cleanupLog.push(`xBRIEF moved ${tx.fromDir} → cancelled`);
33409
33507
  if (tx.committed) cleanupLog.push(`Committed xBRIEF cancellation on main`);
@@ -33411,8 +33509,8 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
33411
33509
  cleanupLog.push(`xBRIEF cancel transition failed (non-fatal): ${err?.message ?? err}`);
33412
33510
  }
33413
33511
  try {
33414
- const { killAllReviewerSessions } = await import("./review-agent-DgkUPRx0.js");
33415
- const { resolveProjectFromIssueSync } = await import("./projects-LftaVK99.js");
33512
+ const { killAllReviewerSessions } = await import("./review-agent-Caodi0PX.js");
33513
+ const { resolveProjectFromIssueSync } = await import("./projects-BMuEf14J.js");
33416
33514
  const projectKey = resolveProjectFromIssueSync(id)?.projectKey;
33417
33515
  if (projectKey) {
33418
33516
  const { killed } = await Effect.runPromise(killAllReviewerSessions(projectKey, id.toUpperCase()));
@@ -33426,7 +33524,7 @@ async function runDestructiveIssueLifecycle(id, mode, opts = {}) {
33426
33524
  cleanupLog.push("Cleared review status");
33427
33525
  } catch {}
33428
33526
  try {
33429
- const { resetPostMergeState } = await import("./merge-agent-BuoC_PRZ.js");
33527
+ const { resetPostMergeState } = await import("./merge-agent-D-4_iQgy.js");
33430
33528
  resetPostMergeState(id);
33431
33529
  resetPostMergeState(id.toUpperCase());
33432
33530
  cleanupLog.push("Cleared merge state");
@@ -33446,7 +33544,7 @@ function closeIssueTransition(options) {
33446
33544
  const { issueId, body, eventStore } = options;
33447
33545
  const { reason } = body;
33448
33546
  const projectPath = getProjectPath$3(void 0, extractPrefixSync(issueId) ?? issueId.split("-")[0]);
33449
- const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-DaCovZwn.js"));
33547
+ const { close: closeWorkflow } = yield* Effect.promise(() => import("./lifecycle-DDZ7w-BY.js"));
33450
33548
  const githubCheck = isGitHubIssue$4(issueId);
33451
33549
  const issueDataService = getIssueDataService$8();
33452
33550
  const issueSource = issueDataService.getIssueSource(issueId);
@@ -33713,7 +33811,7 @@ function reopenIssueTransition(options) {
33713
33811
  else clearReviewStatus(id.toUpperCase());
33714
33812
  } catch {}
33715
33813
  try {
33716
- const { resetPostMergeState } = await import("./merge-agent-BuoC_PRZ.js");
33814
+ const { resetPostMergeState } = await import("./merge-agent-D-4_iQgy.js");
33717
33815
  resetPostMergeState(id);
33718
33816
  resetPostMergeState(id.toUpperCase());
33719
33817
  } catch {}
@@ -33777,7 +33875,7 @@ function moveIssueStatus(options) {
33777
33875
  "done"
33778
33876
  ];
33779
33877
  if (!targetStatus || !validStatuses.includes(targetStatus)) return jsonResponse({ error: `Invalid targetStatus. Must be one of: ${validStatuses.join(", ")}` }, { status: 400 });
33780
- const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-nGhCNXT2.js"));
33878
+ const { updateShadowState } = yield* Effect.promise(() => import("./shadow-state-CZ_LnPsi.js"));
33781
33879
  const issueState = {
33782
33880
  backlog: "open",
33783
33881
  todo: "open",
@@ -34020,7 +34118,7 @@ async function copySettingsToWorkspace(id) {
34020
34118
  success: false,
34021
34119
  error: "Workspace not found"
34022
34120
  }, { status: 404 });
34023
- const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-jfkKAEuO.js");
34121
+ const { copyOverdeckSettingsToWorkspaceSync } = await import("./workspace-manager-BrbX90Rm.js");
34024
34122
  const result = copyOverdeckSettingsToWorkspaceSync(workspacePath);
34025
34123
  return jsonResponse({
34026
34124
  success: result.errors.length === 0 || result.copied.length > 0,
@@ -34526,7 +34624,7 @@ function restartFromPlan(options) {
34526
34624
  });
34527
34625
  const resetResult = yield* Effect.promise(async () => {
34528
34626
  try {
34529
- const { runGitResetHard } = await import("./dangerous-git-ops-By9iguTP.js");
34627
+ const { runGitResetHard } = await import("./dangerous-git-ops-BOtXCFkT.js");
34530
34628
  async function findPlanningCommit(grep, label) {
34531
34629
  try {
34532
34630
  const { stdout } = await execAsync$7(`git log --grep="${grep.replace(/"/g, "\\\"")}" --format=%H -1`, {
@@ -34973,7 +35071,7 @@ function closeOutIssue(id, opts = {}) {
34973
35071
  }
34974
35072
  const closeOutResult = yield* Effect.promise(async () => {
34975
35073
  try {
34976
- const { closeOut } = await import("./lifecycle-DaCovZwn.js");
35074
+ const { closeOut } = await import("./lifecycle-DDZ7w-BY.js");
34977
35075
  return {
34978
35076
  ok: true,
34979
35077
  result: await Effect.runPromise(closeOut(ctx, {
@@ -35063,7 +35161,7 @@ function bulkCloseOut(body) {
35063
35161
  const invalidIds = issueIds.filter((id) => !isValidIssueId(id));
35064
35162
  if (invalidIds.length > 0) return jsonResponse({ error: `Invalid issue ID format: ${invalidIds.join(", ")}` }, { status: 400 });
35065
35163
  const eventStore = yield* EventStoreService;
35066
- const { closeOut } = yield* Effect.promise(() => import("./lifecycle-DaCovZwn.js"));
35164
+ const { closeOut } = yield* Effect.promise(() => import("./lifecycle-DDZ7w-BY.js"));
35067
35165
  const issueDataService = getIssueDataService$5();
35068
35166
  const tasks = [];
35069
35167
  const agentChecks = yield* withConcurrencyLimit(issueIds.map((id) => Effect.promise(async () => {
@@ -35288,8 +35386,8 @@ const getIssueShipLogRoute = HttpRouter.add("GET", "/api/issues/:id/ship-log", h
35288
35386
  const id = (yield* HttpRouter.params)["id"] ?? "";
35289
35387
  if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
35290
35388
  return yield* Effect.promise(async () => {
35291
- const { getShipLog } = await import("./ship-log-ie0A_SqV.js");
35292
- const { getReviewStatusSync } = await import("./review-status-C_kQeeX0.js");
35389
+ const { getShipLog } = await import("./ship-log-D-CphNZx.js");
35390
+ const { getReviewStatusSync } = await import("./review-status-Bge_3XTR.js");
35293
35391
  const log = getShipLog(id);
35294
35392
  const rs = getReviewStatusSync(id);
35295
35393
  return jsonResponse({
@@ -35304,8 +35402,8 @@ const getIssueVerificationRoute = HttpRouter.add("GET", "/api/issues/:id/verific
35304
35402
  const id = (yield* HttpRouter.params)["id"] ?? "";
35305
35403
  if (!parseIssueIdSync(id)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
35306
35404
  return yield* Effect.promise(async () => {
35307
- const { readVerificationArtifact } = await import("./verification-artifact-D3viYe_t.js");
35308
- const { getReviewStatusSync } = await import("./review-status-C_kQeeX0.js");
35405
+ const { readVerificationArtifact } = await import("./verification-artifact-Cmhgq4b_.js");
35406
+ const { getReviewStatusSync } = await import("./review-status-Bge_3XTR.js");
35309
35407
  const { join } = await import("node:path");
35310
35408
  const resolved = resolveProjectFromIssueSync(id);
35311
35409
  const workspacePath = resolved ? join(resolved.projectPath, "workspaces", `feature-${id.toLowerCase()}`) : null;
@@ -41304,7 +41402,7 @@ Be specific: reference actual file names, function names, requirement text, disc
41304
41402
  const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
41305
41403
  const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
41306
41404
  const promptFile = join(planningDir, ".status-review-prompt.tmp");
41307
- const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-Dqgz3MY5.js");
41405
+ const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-Buv2wmFU.js");
41308
41406
  let providerEnvStr = "";
41309
41407
  let providerEnv = {};
41310
41408
  const statusProvider = getProviderForModelSync(statusModelId);
@@ -41387,7 +41485,7 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
41387
41485
  let safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "-");
41388
41486
  let processedContent = content;
41389
41487
  if (safeName.endsWith(".vtt")) {
41390
- const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-BSnAB-Og.js"));
41488
+ const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-Va--tv27.js"));
41391
41489
  processedContent = vttToMarkdown(content);
41392
41490
  safeName = safeName.replace(/\.vtt$/, ".md");
41393
41491
  }
@@ -42683,7 +42781,7 @@ const resolveAndSpeak = (options, deps) => Effect.tryPromise({
42683
42781
  //#endregion
42684
42782
  //#region services/tts-playback.ts
42685
42783
  const MAX_TTS_QUEUE_LENGTH = 20;
42686
- const state$1 = {
42784
+ const state$2 = {
42687
42785
  unsubscribe: null,
42688
42786
  startPromise: null,
42689
42787
  queue: [],
@@ -42728,16 +42826,16 @@ async function speakActivityTts(event) {
42728
42826
  }
42729
42827
  }
42730
42828
  async function drainQueue() {
42731
- if (state$1.processing) return;
42732
- state$1.processing = true;
42829
+ if (state$2.processing) return;
42830
+ state$2.processing = true;
42733
42831
  try {
42734
- while (state$1.queue.length > 0 && getTtsRuntimeConfig().enabled) {
42735
- const event = state$1.queue.shift();
42832
+ while (state$2.queue.length > 0 && getTtsRuntimeConfig().enabled) {
42833
+ const event = state$2.queue.shift();
42736
42834
  if (event) await speakActivityTts(event);
42737
42835
  }
42738
- if (!getTtsRuntimeConfig().enabled) state$1.queue = [];
42836
+ if (!getTtsRuntimeConfig().enabled) state$2.queue = [];
42739
42837
  } finally {
42740
- state$1.processing = false;
42838
+ state$2.processing = false;
42741
42839
  }
42742
42840
  }
42743
42841
  const LIFECYCLE_EVENT_TYPES = new Set([
@@ -42753,14 +42851,14 @@ function enqueueActivityTts(event) {
42753
42851
  const eventType = event.payload?.eventType;
42754
42852
  if (eventType && LIFECYCLE_EVENT_TYPES.has(eventType) && config.lifecycle === false) return;
42755
42853
  }
42756
- if (state$1.queue.length >= MAX_TTS_QUEUE_LENGTH) {
42854
+ if (state$2.queue.length >= MAX_TTS_QUEUE_LENGTH) {
42757
42855
  const priority = eventPriority(event) ?? 1;
42758
42856
  if (config.dropInfoWhenFull && priority >= 2) return;
42759
- const dropIndex = config.dropInfoWhenFull ? dropIndexForFullQueue(state$1.queue, priority) : 0;
42857
+ const dropIndex = config.dropInfoWhenFull ? dropIndexForFullQueue(state$2.queue, priority) : 0;
42760
42858
  if (dropIndex === void 0) return;
42761
- state$1.queue.splice(dropIndex, 1);
42859
+ state$2.queue.splice(dropIndex, 1);
42762
42860
  }
42763
- state$1.queue.push(event);
42861
+ state$2.queue.push(event);
42764
42862
  drainQueue();
42765
42863
  }
42766
42864
  function onEvent$1(event) {
@@ -42768,29 +42866,29 @@ function onEvent$1(event) {
42768
42866
  enqueueActivityTts(event);
42769
42867
  }
42770
42868
  async function startTtsPlayback() {
42771
- if (state$1.unsubscribe) return;
42772
- if (state$1.startPromise) return state$1.startPromise;
42869
+ if (state$2.unsubscribe) return;
42870
+ if (state$2.startPromise) return state$2.startPromise;
42773
42871
  if (!getTtsRuntimeConfig().enabled) {
42774
42872
  console.log("[tts-playback] Disabled (tts.enabled=false)");
42775
42873
  return;
42776
42874
  }
42777
- state$1.startPromise = (async () => {
42875
+ state$2.startPromise = (async () => {
42778
42876
  const store = await initEventStore();
42779
- if (state$1.unsubscribe) return;
42780
- state$1.unsubscribe = store.subscribe(onEvent$1);
42877
+ if (state$2.unsubscribe) return;
42878
+ state$2.unsubscribe = store.subscribe(onEvent$1);
42781
42879
  console.log("[tts-playback] Started");
42782
42880
  })();
42783
42881
  try {
42784
- await state$1.startPromise;
42882
+ await state$2.startPromise;
42785
42883
  } finally {
42786
- state$1.startPromise = null;
42884
+ state$2.startPromise = null;
42787
42885
  }
42788
42886
  }
42789
42887
  function stopTtsPlayback() {
42790
- state$1.queue = [];
42791
- if (state$1.unsubscribe) {
42792
- state$1.unsubscribe();
42793
- state$1.unsubscribe = null;
42888
+ state$2.queue = [];
42889
+ if (state$2.unsubscribe) {
42890
+ state$2.unsubscribe();
42891
+ state$2.unsubscribe = null;
42794
42892
  }
42795
42893
  }
42796
42894
  async function syncTtsPlaybackWithConfig() {
@@ -42901,6 +42999,24 @@ function unavailableProvider(provider, model, reason) {
42901
42999
  };
42902
43000
  }
42903
43001
  //#endregion
43002
+ //#region ../../lib/conversation-search/health.ts
43003
+ const state$1 = {
43004
+ lastErrorAt: null,
43005
+ lastErrorReason: null,
43006
+ lastSuccessAt: null
43007
+ };
43008
+ function recordConversationSearchFailure(reason) {
43009
+ state$1.lastErrorAt = (/* @__PURE__ */ new Date()).toISOString();
43010
+ state$1.lastErrorReason = reason instanceof Error ? reason.message : String(reason);
43011
+ }
43012
+ function recordConversationSearchSuccess() {
43013
+ state$1.lastSuccessAt = (/* @__PURE__ */ new Date()).toISOString();
43014
+ }
43015
+ /** Snapshot copy — callers must not mutate live state. */
43016
+ function getConversationSearchHealth() {
43017
+ return { ...state$1 };
43018
+ }
43019
+ //#endregion
42904
43020
  //#region ../../lib/database/conversation-embeddings-db.ts
42905
43021
  /**
42906
43022
  * Conversation Embeddings Sidecar Database (PAN-1395)
@@ -44096,7 +44212,12 @@ var ConversationSearchWatcher = class {
44096
44212
  }).then((result) => {
44097
44213
  if (signal.aborted || this.stopped) return;
44098
44214
  if (result.disabled) this.log.warn(`[conversation-search] startup index skipped: ${result.unavailableReason ?? "disabled"}`);
44099
- else {
44215
+ else if (result.errors.length > 0) {
44216
+ recordConversationSearchFailure(result.errors[result.errors.length - 1]?.message ?? "startup indexing reported errors");
44217
+ const prunedNote = result.sessionsPruned > 0 ? `, pruned ${result.sessionsPruned} stale session${result.sessionsPruned === 1 ? "" : "s"}` : "";
44218
+ this.log.warn(`[conversation-search] startup indexed with ${result.errors.length} error${result.errors.length === 1 ? "" : "s"} across ${result.filesScanned} file${result.filesScanned === 1 ? "" : "s"}${prunedNote}: ${result.errors[0]?.message}`);
44219
+ } else {
44220
+ recordConversationSearchSuccess();
44100
44221
  const prunedNote = result.sessionsPruned > 0 ? `, pruned ${result.sessionsPruned} stale session${result.sessionsPruned === 1 ? "" : "s"}` : "";
44101
44222
  this.log.log(`[conversation-search] startup indexed ${result.chunksIndexed} chunk${result.chunksIndexed === 1 ? "" : "s"} across ${result.filesScanned} file${result.filesScanned === 1 ? "" : "s"}${prunedNote}`);
44102
44223
  }
@@ -44179,8 +44300,16 @@ var ConversationSearchWatcher = class {
44179
44300
  filePath,
44180
44301
  config: this.config,
44181
44302
  signal
44182
- }).catch((error) => {
44183
- if (!isAbortError(error)) this.log.warn(`[conversation-search] failed to index ${filePath}:`, error);
44303
+ }).then((result) => {
44304
+ if (result.disabled) return;
44305
+ const firstError = result.errors[0];
44306
+ if (firstError) recordConversationSearchFailure(firstError.message);
44307
+ else recordConversationSearchSuccess();
44308
+ }, (error) => {
44309
+ if (!isAbortError(error)) {
44310
+ recordConversationSearchFailure(error);
44311
+ this.log.warn(`[conversation-search] failed to index ${filePath}:`, error);
44312
+ }
44184
44313
  }).finally(() => {
44185
44314
  this.activeTasks.delete(task);
44186
44315
  this.activeIndexers = Math.max(0, this.activeIndexers - 1);
@@ -45069,6 +45198,7 @@ const getConversationSearchStatusRoute = HttpRouter.add("GET", "/api/settings/co
45069
45198
  return yield* Effect.try({
45070
45199
  try: () => {
45071
45200
  const config = getConversationSearchConfigSync();
45201
+ const health = getConversationSearchHealth();
45072
45202
  if (!config.enabled) return jsonResponse({
45073
45203
  enabled: false,
45074
45204
  available: false,
@@ -45076,7 +45206,8 @@ const getConversationSearchStatusRoute = HttpRouter.add("GET", "/api/settings/co
45076
45206
  dbPath: config.dbPath,
45077
45207
  chunkCount: 0,
45078
45208
  indexedFileCount: 0,
45079
- lastIndexedAt: null
45209
+ lastIndexedAt: null,
45210
+ health
45080
45211
  });
45081
45212
  const provider = createConversationEmbeddingProvider({ config });
45082
45213
  if (!provider.enabled) return jsonResponse({
@@ -45086,7 +45217,8 @@ const getConversationSearchStatusRoute = HttpRouter.add("GET", "/api/settings/co
45086
45217
  dbPath: config.dbPath,
45087
45218
  chunkCount: 0,
45088
45219
  indexedFileCount: 0,
45089
- lastIndexedAt: null
45220
+ lastIndexedAt: null,
45221
+ health
45090
45222
  });
45091
45223
  const db = openEmbeddingsDb(config.dbPath, dimensionsForModel(config.model));
45092
45224
  try {
@@ -45096,7 +45228,8 @@ const getConversationSearchStatusRoute = HttpRouter.add("GET", "/api/settings/co
45096
45228
  available: db.available && provider.enabled,
45097
45229
  unavailableReason: db.unavailableReason,
45098
45230
  dbPath: config.dbPath,
45099
- ...stats
45231
+ ...stats,
45232
+ health
45100
45233
  });
45101
45234
  } finally {
45102
45235
  db.close();
@@ -45154,13 +45287,20 @@ const postConversationSearchReindexRoute = HttpRouter.add("POST", "/api/settings
45154
45287
  startedAt: Date.now()
45155
45288
  };
45156
45289
  try {
45157
- return jsonResponse(await fullReindexConversationSearch({ onProgress: (p) => {
45290
+ const result = await fullReindexConversationSearch({ onProgress: (p) => {
45158
45291
  conversationReindexProgress = {
45159
45292
  active: true,
45160
45293
  startedAt: conversationReindexProgress.startedAt,
45161
45294
  ...p
45162
45295
  };
45163
- } }));
45296
+ } });
45297
+ const firstError = result.errors[0];
45298
+ if (firstError) recordConversationSearchFailure(firstError.message);
45299
+ else if (!result.disabled) recordConversationSearchSuccess();
45300
+ return jsonResponse(result);
45301
+ } catch (error) {
45302
+ recordConversationSearchFailure(error);
45303
+ throw error;
45164
45304
  } finally {
45165
45305
  conversationReindexProgress = {
45166
45306
  ...conversationReindexProgress,
@@ -45858,7 +45998,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
45858
45998
  }, { status: 400 });
45859
45999
  return yield* Effect.promise(async () => {
45860
46000
  try {
45861
- const { RallyRestApi } = await import("./rally-api-Ij1Zt0NI.js");
46001
+ const { RallyRestApi } = await import("./rally-api-BoucQG1u.js");
45862
46002
  const api = new RallyRestApi({
45863
46003
  apiKey,
45864
46004
  server: server || "https://rally1.rallydev.com"
@@ -46242,7 +46382,7 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
46242
46382
  const remoteState = loadRemoteAgentState(sessionName);
46243
46383
  const isRemote = !!remoteState;
46244
46384
  const vmName = remoteState?.vmName ?? "";
46245
- const { getAgentStateSync } = await import("./agents-DpCuoF65.js");
46385
+ const { getAgentStateSync } = await import("./agents-DixZjXWm.js");
46246
46386
  const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
46247
46387
  let tmuxSessionAlive = false;
46248
46388
  if (!isRemote) try {
@@ -46386,7 +46526,7 @@ Continue the PLANNING session. Do NOT implement anything.
46386
46526
  const agentCwd = workspacePath;
46387
46527
  const harnessLaunch = await prepareHarnessLaunch("claude-code");
46388
46528
  if (existsSync$1(outputFile)) await rename(outputFile, join(planningDir, `output-${Date.now()}.jsonl`));
46389
- const { getAgentCommandSync } = await import("./settings-DhtPDmmI.js");
46529
+ const { getAgentCommandSync } = await import("./settings-ByDRfuuE.js");
46390
46530
  let msgPlanningModel = "claude-sonnet-5";
46391
46531
  try {
46392
46532
  msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
@@ -46509,7 +46649,7 @@ async function getIndexStats(rootPath, isMain) {
46509
46649
  }
46510
46650
  const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
46511
46651
  try {
46512
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BNQHwblU.js");
46652
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CRSAkhBx.js");
46513
46653
  const projectRoot = process.cwd();
46514
46654
  const venvPath = join(projectRoot, ".venv");
46515
46655
  const results = [];
@@ -46554,7 +46694,7 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
46554
46694
  }));
46555
46695
  const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
46556
46696
  try {
46557
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BNQHwblU.js");
46697
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CRSAkhBx.js");
46558
46698
  const projectRoot = process.cwd();
46559
46699
  const venvPath = join(projectRoot, ".venv");
46560
46700
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -46571,7 +46711,7 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
46571
46711
  }));
46572
46712
  const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
46573
46713
  try {
46574
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BNQHwblU.js");
46714
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CRSAkhBx.js");
46575
46715
  const projectRoot = process.cwd();
46576
46716
  const venvPath = join(projectRoot, ".venv");
46577
46717
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -46588,7 +46728,7 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
46588
46728
  }));
46589
46729
  const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
46590
46730
  try {
46591
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BNQHwblU.js");
46731
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-CRSAkhBx.js");
46592
46732
  const enabled = isTldrEnabledSync();
46593
46733
  const projectRoot = process.cwd();
46594
46734
  const targets = [];
@@ -46940,7 +47080,7 @@ function resolveRestartGateBoot(state, nowMs) {
46940
47080
  function emitThroughEventStore(snapshot) {
46941
47081
  (async () => {
46942
47082
  try {
46943
- const { getEventStore } = await import("./event-store-Db4w4YIY.js");
47083
+ const { getEventStore } = await import("./event-store-C50Qt-f1.js");
46944
47084
  getEventStore().emitOnly({
46945
47085
  type: "restart_gate.changed",
46946
47086
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -47228,7 +47368,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
47228
47368
  const version = await getOverdeckVersion();
47229
47369
  let supervisorUrl = null;
47230
47370
  try {
47231
- const { getSupervisorUrlSync } = await import("./supervisor-v0cYN2Vp.js");
47371
+ const { getSupervisorUrlSync } = await import("./supervisor-DSSWo4M2.js");
47232
47372
  supervisorUrl = getSupervisorUrlSync();
47233
47373
  } catch {}
47234
47374
  return jsonResponse({
@@ -47238,11 +47378,11 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
47238
47378
  });
47239
47379
  }));
47240
47380
  const getPrerequisitesRoute = HttpRouter.add("GET", "/api/prerequisites", Effect.promise(async () => {
47241
- const { checkSystemPrerequisites } = await import("./system-prerequisites-QKtIYXI2.js");
47381
+ const { checkSystemPrerequisites } = await import("./system-prerequisites-Lsx0jUUV.js");
47242
47382
  return jsonResponse(await checkSystemPrerequisites());
47243
47383
  }));
47244
47384
  const getSetupDiagnosticsRoute = HttpRouter.add("GET", "/api/diagnostics/setup", Effect.promise(async () => {
47245
- const { collectSetupDiagnostics } = await import("./system-prerequisites-QKtIYXI2.js");
47385
+ const { collectSetupDiagnostics } = await import("./system-prerequisites-Lsx0jUUV.js");
47246
47386
  return jsonResponse(await collectSetupDiagnostics(await getOverdeckVersion()));
47247
47387
  }));
47248
47388
  const getSyncStatusRoute = HttpRouter.add("GET", "/api/sync-status", Effect.sync(() => {
@@ -47422,7 +47562,7 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
47422
47562
  const projectPath = await getProjectPath(issuePrefix);
47423
47563
  const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
47424
47564
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
47425
- const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-BxiFrIKv.js");
47565
+ const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-BHZKPJhq.js");
47426
47566
  const config = {
47427
47567
  issueId,
47428
47568
  workspacePath,
@@ -47452,7 +47592,7 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
47452
47592
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
47453
47593
  const ghConfig = getGitHubConfig();
47454
47594
  if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
47455
- const { runObserverCycle } = await import("./shadow-engineering-BxiFrIKv.js");
47595
+ const { runObserverCycle } = await import("./shadow-engineering-BHZKPJhq.js");
47456
47596
  const firstRepo = ghConfig.repos[0];
47457
47597
  const config = {
47458
47598
  issueId,
@@ -47892,7 +48032,11 @@ async function searchConversationChunks(input) {
47892
48032
  searchVector: (embedding, candidateLimit) => handle.db.searchVector(embedding, candidateLimit)
47893
48033
  },
47894
48034
  provider: handle.provider
47895
- }).then((hits) => filterLiveHits(handle.db, hits)).then(resolve, (error) => {
48035
+ }).then((hits) => filterLiveHits(handle.db, hits)).then((hits) => {
48036
+ recordConversationSearchSuccess();
48037
+ resolve(hits);
48038
+ }, (error) => {
48039
+ recordConversationSearchFailure(error);
47896
48040
  console.error("[conversation-search] service search failed:", error);
47897
48041
  resolve([]);
47898
48042
  });
@@ -49618,6 +49762,7 @@ async function getConversationsPendingInputFeed(deps) {
49618
49762
  name: conv.name,
49619
49763
  title: conv.title ?? null,
49620
49764
  issueId: conv.issueId ?? null,
49765
+ harness: conv.harness ?? "claude-code",
49621
49766
  ...pending ? { pendingAskUserQuestion: pending } : {},
49622
49767
  ...pendingPlan ? { pendingProposedPlan: pendingPlan } : {},
49623
49768
  ...paneChoice ? { pendingPaneChoice: paneChoice } : {}
@@ -51005,19 +51150,22 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
51005
51150
  try {
51006
51151
  const [owner, repoName] = repo.split("/");
51007
51152
  if (!owner || !repoName) return;
51153
+ const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-BWziYCf3.js");
51154
+ const githubAppConfigured = isGitHubAppConfigured();
51155
+ if (!githubAppConfigured && isInGraphQLCooldown()) return;
51156
+ const status = await Effect.runPromise(getReviewStatus(issueId));
51157
+ if (!status || status.retiredAt) return;
51008
51158
  let mergeable;
51009
51159
  let mergeState;
51010
51160
  let isDraft;
51011
51161
  let checksFailed;
51012
- const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-Oi5hdn1n.js");
51013
- if (isGitHubAppConfigured()) {
51162
+ if (githubAppConfigured) {
51014
51163
  const prState = await Effect.runPromise(getPullRequestState(owner, repoName, prNumber));
51015
51164
  mergeable = prState.mergeable === null ? "UNKNOWN" : prState.mergeable ? "MERGEABLE" : "CONFLICTING";
51016
51165
  mergeState = (prState.mergeableState ?? "").toUpperCase();
51017
51166
  isDraft = prState.draft;
51018
51167
  checksFailed = prState.checksFailed;
51019
51168
  } else {
51020
- if (isInGraphQLCooldown()) return;
51021
51169
  const { execFile } = await import("child_process");
51022
51170
  const { promisify } = await import("util");
51023
51171
  const execFileAsync = promisify(execFile);
@@ -51046,8 +51194,6 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
51046
51194
  isDraft = pr.isDraft === true;
51047
51195
  checksFailed = (pr.statusCheckRollup ?? []).some((check) => !isAdvisoryCheckName(check.name ?? check.context) && FAILING_CHECK_CONCLUSIONS.has((check.conclusion || check.state || "").toUpperCase()));
51048
51196
  }
51049
- const status = await Effect.runPromise(getReviewStatus(issueId));
51050
- if (!status) return;
51051
51197
  const isConflicting = mergeable === "CONFLICTING" || mergeState === "DIRTY";
51052
51198
  const GH_NATIVE = new Set([
51053
51199
  "merge_conflict",
@@ -51177,19 +51323,19 @@ async function handlePullRequestPromise(payload) {
51177
51323
  "closed",
51178
51324
  "reopened"
51179
51325
  ].includes(payload.action ?? "")) try {
51180
- const { listProjectsSync, resolveProjectFromIssueSync } = await import("./projects-LftaVK99.js");
51326
+ const { listProjectsSync, resolveProjectFromIssueSync } = await import("./projects-BMuEf14J.js");
51181
51327
  const resolved = resolveProjectFromIssueSync(issueId);
51182
51328
  const project = resolved ? listProjectsSync().find((entry) => entry.key === resolved.projectKey)?.config : void 0;
51183
51329
  if (project) {
51184
- const { enqueueProjectResourceRefresh } = await import("./project-resource-refresh-queue-BaZC79S3.js");
51330
+ const { enqueueProjectResourceRefresh } = await import("./project-resource-refresh-queue-D2110Guc.js");
51185
51331
  enqueueProjectResourceRefresh(project, `pull_request:${payload.action}`);
51186
51332
  }
51187
51333
  } catch (err) {
51188
51334
  console.warn(`[webhook] Failed to enqueue membership refresh for ${issueId}: ${err?.message ?? err}`);
51189
51335
  }
51190
51336
  if (payload.action === "closed" && pr.merged === true) try {
51191
- const { postMergeLifecycle } = await import("./merge-agent-BuoC_PRZ.js");
51192
- const { resolveProjectFromIssueSync } = await import("./projects-LftaVK99.js");
51337
+ const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
51338
+ const { resolveProjectFromIssueSync } = await import("./projects-BMuEf14J.js");
51193
51339
  const project = resolveProjectFromIssueSync(issueId);
51194
51340
  if (project) {
51195
51341
  const branchName = pr.head.ref;
@@ -51202,12 +51348,17 @@ async function handlePullRequestPromise(payload) {
51202
51348
  const headMayHaveMoved = [
51203
51349
  "synchronize",
51204
51350
  "opened",
51205
- "reopened"
51351
+ "reopened",
51352
+ "closed"
51206
51353
  ].includes(payload.action ?? "");
51207
51354
  const status = await loadAndValidateStatus(issueId, repo, pr.number, headMayHaveMoved ? void 0 : pr.head.sha);
51208
51355
  if (!status) return;
51209
51356
  const update = {};
51210
51357
  let blockers = [...status.blockerReasons ?? []];
51358
+ if (payload.action === "closed" && pr.merged === false) {
51359
+ update.readyForMerge = false;
51360
+ update.retiredAt = (/* @__PURE__ */ new Date()).toISOString();
51361
+ }
51211
51362
  if (!status.prUrl) update.prUrl = pr.html_url ?? `https://github.com/${repo}/pull/${pr.number}`;
51212
51363
  if (!status.prNumber) update.prNumber = pr.number;
51213
51364
  if (pr.head.sha && (!status.prHeadSha || payload.action === "synchronize")) update.prHeadSha = pr.head.sha;
@@ -51623,7 +51774,8 @@ function buildForkRequest(params) {
51623
51774
  ...params.handoffFocus !== void 0 ? { handoffFocus: params.handoffFocus } : {},
51624
51775
  handoffAuthor: params.handoffAuthor,
51625
51776
  ...params.handoffAuthorModel !== void 0 ? { handoffAuthorModel: params.handoffAuthorModel } : {},
51626
- ...params.handoffAuthorHarness !== void 0 ? { handoffAuthorHarness: params.handoffAuthorHarness } : {}
51777
+ ...params.handoffAuthorHarness !== void 0 ? { handoffAuthorHarness: params.handoffAuthorHarness } : {},
51778
+ ...params.title !== void 0 ? { title: params.title } : {}
51627
51779
  };
51628
51780
  }
51629
51781
  async function handleConversationHandoffDoc(name) {
@@ -51737,7 +51889,7 @@ function handleForkPipelineFailure(name, err) {
51737
51889
  updateForkStatus(name, "failed", err instanceof Error ? err.message : String(err));
51738
51890
  markConversationEnded(name);
51739
51891
  }
51740
- async function runForkPipeline(convName, parentConv, sessionId, summaryModel, forkMode = "summary", localSummaryOnly = false, includeThinkingInSummary, summaryHarness, handoffFocus, handoffAuthor = "external", handoffAuthorModel, handoffAuthorHarness) {
51892
+ async function runForkPipeline(convName, parentConv, sessionId, summaryModel, forkMode = "summary", localSummaryOnly = false, includeThinkingInSummary, summaryHarness, handoffFocus, handoffAuthor = "external", handoffAuthorModel, handoffAuthorHarness, customTitle) {
51741
51893
  const conv = getConversationByName(convName);
51742
51894
  if (!conv) throw new Error(`Fork conversation ${convName} not found`);
51743
51895
  const parentSessionFile = await resolveForkSourceSessionFile(parentConv);
@@ -51814,7 +51966,7 @@ async function runForkPipeline(convName, parentConv, sessionId, summaryModel, fo
51814
51966
  }
51815
51967
  } else summary = await buildSummary();
51816
51968
  updateConversationForkFallbackReason(convName, forkFallbackReason);
51817
- updateConversationTitle(convName, effectiveForkMode === "handoff" ? handoffTitleFromFocus(handoffFocus, parentConv.title || parentConv.name) : `Summary Fork: ${parentConv.title || parentConv.name}`, "manual");
51969
+ updateConversationTitle(convName, customTitle ?? (effectiveForkMode === "handoff" ? handoffTitleFromFocus(handoffFocus, parentConv.title || parentConv.name) : `Summary Fork: ${parentConv.title || parentConv.name}`), "manual");
51818
51970
  if (handoffDocPath) recordConversationHandoff(parentConv.name, convName, handoffDocPath);
51819
51971
  updateForkStatus(convName, "spawning");
51820
51972
  await ensureForkSessionReady(conv, sessionId, false);
@@ -51900,7 +52052,7 @@ async function recoverStuckForks() {
51900
52052
  updateForkStatus(fork.name, "failed", `Parent conversation ${request.parentConversationName} not found`);
51901
52053
  continue;
51902
52054
  }
51903
- await registerInFlightForkPipeline(runForkPipeline(fork.name, parentConv, request.sessionId, request.summaryModel, request.forkMode, request.localSummaryOnly, request.includeThinkingInSummary, request.summaryHarness, request.handoffFocus, request.handoffAuthor, request.handoffAuthorModel, request.handoffAuthorHarness));
52055
+ await registerInFlightForkPipeline(runForkPipeline(fork.name, parentConv, request.sessionId, request.summaryModel, request.forkMode, request.localSummaryOnly, request.includeThinkingInSummary, request.summaryHarness, request.handoffFocus, request.handoffAuthor, request.handoffAuthorModel, request.handoffAuthorHarness, request.title));
51904
52056
  recovered += 1;
51905
52057
  } catch (error) {
51906
52058
  const message = error instanceof Error ? error.message : String(error);
@@ -52021,11 +52173,12 @@ async function handleConversationSummaryFork(name, body) {
52021
52173
  ...handoffFocus !== void 0 ? { handoffFocus } : {},
52022
52174
  handoffAuthor,
52023
52175
  ...handoffAuthorModel !== void 0 ? { handoffAuthorModel } : {},
52024
- ...handoffAuthorHarness !== void 0 ? { handoffAuthorHarness } : {}
52176
+ ...handoffAuthorHarness !== void 0 ? { handoffAuthorHarness } : {},
52177
+ ...customTitle !== void 0 ? { title: customTitle } : {}
52025
52178
  });
52026
52179
  setForkRequest(newConv.name, JSON.stringify(forkRequest));
52027
52180
  markConversationActive(newConv.name);
52028
- registerInFlightForkPipeline(runForkPipeline(newConv.name, conv, sessionId, summaryModel, forkMode, localSummaryOnly, includeThinkingInSummary, summaryHarness, handoffFocus, handoffAuthor, handoffAuthorModel, handoffAuthorHarness)).catch((err) => {
52181
+ registerInFlightForkPipeline(runForkPipeline(newConv.name, conv, sessionId, summaryModel, forkMode, localSummaryOnly, includeThinkingInSummary, summaryHarness, handoffFocus, handoffAuthor, handoffAuthorModel, handoffAuthorHarness, customTitle)).catch((err) => {
52029
52182
  handleForkPipelineFailure(newConv.name, err);
52030
52183
  });
52031
52184
  return jsonResponse({
@@ -52315,6 +52468,16 @@ const postConversationPaneChoiceRoute = HttpRouter.add("POST", "/api/conversatio
52315
52468
  return jsonResponse(result.body, { status: result.status });
52316
52469
  });
52317
52470
  }));
52471
+ const postConversationPiAskAnswerRoute = HttpRouter.add("POST", "/api/conversations/:id/pi-ask-answer", Effect.gen(function* () {
52472
+ const originCheck = validateOrigin$1(yield* HttpServerRequest.HttpServerRequest);
52473
+ if (!originCheck.ok) return jsonResponse({ error: originCheck.error }, { status: 403 });
52474
+ const rawId = (yield* HttpRouter.params)["id"] ?? "";
52475
+ const body = yield* readJsonBody$10;
52476
+ return yield* Effect.promise(async () => {
52477
+ const result = await handleConversationPiAskAnswer(rawId, body);
52478
+ return jsonResponse(result.body, { status: result.status });
52479
+ });
52480
+ }));
52318
52481
  const postConversationDeliveryMethodRoute = HttpRouter.add("POST", "/api/conversations/:name/delivery-method", Effect.gen(function* () {
52319
52482
  const originCheck = validateOrigin$1(yield* HttpServerRequest.HttpServerRequest);
52320
52483
  if (!originCheck.ok) return jsonResponse({ error: originCheck.error }, { status: 403 });
@@ -52516,7 +52679,7 @@ const getConversationAboutRoute = HttpRouter.add("GET", "/api/conversations/:nam
52516
52679
  return conversationReadJson(await getConversationAbout(name, new URL(request.url, "http://localhost").searchParams.get("refresh") === "1", conversationReadDependencies));
52517
52680
  });
52518
52681
  }));
52519
- const conversationsRouteLayer = Layer.mergeAll(getConversationsRoute, getConversationsPendingInputRoute, getArchivedConversationsRoute, getConversationRoute, getConversationHandoffDocRoute, postConversationRoute, patchConversationRoute, patchConversationMoveRoute, deleteConversationRoute, postConversationStopRoute, postConversationClearForkStateRoute, postConversationResumeRoute, postConversationSwitchModelRoute, postConversationThinkingLevelRoute, postConversationCompactRoute, postConversationAbortRoute, postConversationRestartAllRoute, postConversationArchiveRoute, postConversationUnarchiveRoute, getConversationMessagesRoute, getConversationMessageLocatorRoute, postConversationUploadImageRoute, postConversationDeleteImageRoute, postConversationMessageRoute, postConversationCodexApprovalRoute, postConversationPaneChoiceRoute, postConversationDeliveryMethodRoute, postConversationControlAckRoute, postConversationFavoriteRoute, deleteConversationFavoriteRoute, postConversationSummaryForkRoute, postConversationPlanActionRoute, getConversationDiffsRoute, getConversationDiffFullRoute, getConversationDiffTurnRoute, postConversationRetitleRoute, getConversationAboutRoute);
52682
+ const conversationsRouteLayer = Layer.mergeAll(getConversationsRoute, getConversationsPendingInputRoute, getArchivedConversationsRoute, getConversationRoute, getConversationHandoffDocRoute, postConversationRoute, patchConversationRoute, patchConversationMoveRoute, deleteConversationRoute, postConversationStopRoute, postConversationClearForkStateRoute, postConversationResumeRoute, postConversationSwitchModelRoute, postConversationThinkingLevelRoute, postConversationCompactRoute, postConversationAbortRoute, postConversationRestartAllRoute, postConversationArchiveRoute, postConversationUnarchiveRoute, getConversationMessagesRoute, getConversationMessageLocatorRoute, postConversationUploadImageRoute, postConversationDeleteImageRoute, postConversationMessageRoute, postConversationCodexApprovalRoute, postConversationPaneChoiceRoute, postConversationPiAskAnswerRoute, postConversationDeliveryMethodRoute, postConversationControlAckRoute, postConversationFavoriteRoute, deleteConversationFavoriteRoute, postConversationSummaryForkRoute, postConversationPlanActionRoute, getConversationDiffsRoute, getConversationDiffFullRoute, getConversationDiffTurnRoute, postConversationRetitleRoute, getConversationAboutRoute);
52520
52683
  //#endregion
52521
52684
  //#region routes/show.ts
52522
52685
  /**
@@ -52723,7 +52886,7 @@ async function registerProjectFromPath(opts) {
52723
52886
  registerProjectSync(key, projectConfig);
52724
52887
  const seededContextLayer = ensureProjectLayer(fullPath);
52725
52888
  try {
52726
- const { preTrustDirectorySync } = await import("./workspace-manager-jfkKAEuO.js");
52889
+ const { preTrustDirectorySync } = await import("./workspace-manager-BrbX90Rm.js");
52727
52890
  preTrustDirectorySync(fullPath);
52728
52891
  } catch {}
52729
52892
  let hooksInstalled = 0;
@@ -52886,7 +53049,7 @@ init_paths();
52886
53049
  init_resource_utils();
52887
53050
  const execAsync$3 = promisify(exec);
52888
53051
  async function getIssueDataService() {
52889
- const { getSharedIssueService } = await import("./issue-service-singleton-CvgNAWqK.js");
53052
+ const { getSharedIssueService } = await import("./issue-service-singleton-1Q0ER8Yc.js");
52890
53053
  return getSharedIssueService();
52891
53054
  }
52892
53055
  /** Returns true if the path exists (any type). */
@@ -53288,7 +53451,7 @@ const getProjectReleaseStatusRoute = HttpRouter.add("GET", "/api/projects/:proje
53288
53451
  const projectKey = (yield* HttpRouter.params)["projectKey"] ?? "";
53289
53452
  return jsonResponse(yield* Effect.tryPromise({
53290
53453
  try: async () => {
53291
- const { fetchProjectReleaseStatus } = await import("./project-pipelines-By_5WcT4.js");
53454
+ const { fetchProjectReleaseStatus } = await import("./project-pipelines-CUsa6U59.js");
53292
53455
  return fetchProjectReleaseStatus(projectKey);
53293
53456
  },
53294
53457
  catch: (err) => new Error(err instanceof Error ? err.message : String(err))
@@ -53599,7 +53762,7 @@ init_projects();
53599
53762
  const getProjectMergeTrainRoute = HttpRouter.add("GET", "/api/projects/:projectKey/merge-train", httpHandler(Effect.gen(function* () {
53600
53763
  const config = getProjectSync((yield* HttpRouter.params)["projectKey"] ?? "");
53601
53764
  if (!config) return jsonResponse({ error: "Project not found" }, { status: 404 });
53602
- const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-0m2Q087q.js"));
53765
+ const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-CYGsJy0u.js"));
53603
53766
  return jsonResponse({
53604
53767
  value: config.merge_train ?? null,
53605
53768
  effective: isMergeTrainEnabledForProject(config)
@@ -53613,7 +53776,7 @@ const postProjectMergeTrainRoute = HttpRouter.add("POST", "/api/projects/:projec
53613
53776
  if (!project) return jsonResponse({ error: "Project not found" }, { status: 404 });
53614
53777
  const v = (yield* readProjectJsonBody).value;
53615
53778
  if (v !== "enabled" && v !== "disabled" && v !== null) return jsonResponse({ error: "value must be 'enabled', 'disabled', or null" }, { status: 400 });
53616
- const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-0m2Q087q.js"));
53779
+ const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-CYGsJy0u.js"));
53617
53780
  yield* Effect.promise(() => setProjectMergeTrain(key, v));
53618
53781
  const updated = { ...project };
53619
53782
  if (v === null) delete updated.merge_train;
@@ -53640,6 +53803,7 @@ const projectsMergeTrainRouteLayer = Layer.mergeAll(getProjectMergeTrainRoute, p
53640
53803
  * frontend migrates — removing them is the remove-legacy-routes item.
53641
53804
  */
53642
53805
  init_projects();
53806
+ init_merge_eligibility();
53643
53807
  const readUnknownJsonBody$1 = Effect.gen(function* () {
53644
53808
  const text = yield* (yield* HttpServerRequest.HttpServerRequest).text;
53645
53809
  try {
@@ -53674,7 +53838,7 @@ async function queueEntryForProject(key, config, enabled) {
53674
53838
  queue: []
53675
53839
  };
53676
53840
  const projectPath = resolve(config.path);
53677
- const candidates = listEligibleCandidatesByProject(projectPath);
53841
+ const candidates = await listEligibleCandidatesByProject(projectPath);
53678
53842
  if (candidates.length === 0) return {
53679
53843
  ...base,
53680
53844
  queue: []
@@ -53691,7 +53855,7 @@ async function queueEntryForProject(key, config, enabled) {
53691
53855
  * not blank the whole response, so a failed project reports an empty queue.
53692
53856
  */
53693
53857
  async function getMergeTrainQueuesPayload() {
53694
- const { isMergeTrainEnabledForProject } = await import("./merge-sync-0m2Q087q.js");
53858
+ const { isMergeTrainEnabledForProject } = await import("./merge-sync-CYGsJy0u.js");
53695
53859
  const projects = listProjectsSync();
53696
53860
  return (await Promise.allSettled(projects.map(({ key, config }) => queueEntryForProject(key, config, isMergeTrainEnabledForProject(config))))).flatMap((outcome, i) => {
53697
53861
  if (outcome.status === "fulfilled") return [outcome.value];
@@ -53709,8 +53873,8 @@ async function getMergeTrainQueuesPayload() {
53709
53873
  }
53710
53874
  /** PAN-1696 AC2: per-project generation chains across every tracked project. */
53711
53875
  async function getMergeTrainGenerationsPayload() {
53712
- const { isMergeTrainEnabledForProject } = await import("./merge-sync-0m2Q087q.js");
53713
- const { getUatGenerationsPayload } = await import("./uat-train-CycEzpbE.js");
53876
+ const { isMergeTrainEnabledForProject } = await import("./merge-sync-CYGsJy0u.js");
53877
+ const { getUatGenerationsPayload } = await import("./uat-train-D7Ran2FB.js");
53714
53878
  return (await Promise.allSettled(listProjectsSync().map(async ({ key, config }) => ({
53715
53879
  projectKey: key,
53716
53880
  projectName: config.name,
@@ -53719,12 +53883,12 @@ async function getMergeTrainGenerationsPayload() {
53719
53883
  })))).flatMap((outcome) => outcome.status === "fulfilled" ? [outcome.value] : []);
53720
53884
  }
53721
53885
  async function defaultOrderedIssueIdsForProject(projectPath) {
53722
- const candidates = listEligibleCandidatesByProject(projectPath);
53886
+ const candidates = await listEligibleCandidatesByProject(projectPath);
53723
53887
  if (candidates.length === 0) return [];
53724
53888
  return (await Effect.runPromise(computeMergeQueueFromCandidates(candidates, projectPath).pipe(Effect.provide(layer)))).map((item) => item.issueId);
53725
53889
  }
53726
53890
  async function defaultMergeOne(issueId) {
53727
- const { triggerMerge } = await import("./merge-ops-DabXHp2i.js");
53891
+ const { triggerMerge } = await import("./merge-ops-Cf02szJ5.js");
53728
53892
  const r = await triggerMerge(issueId);
53729
53893
  return r.success ? { ok: true } : {
53730
53894
  ok: false,
@@ -53752,13 +53916,21 @@ async function postMergeTrainMergeNextPayload(payload, deps = {}) {
53752
53916
  status: 404,
53753
53917
  body: { error: `Unknown project key: ${projectKey}` }
53754
53918
  };
53755
- const { isMergeTrainEnabledForProject } = await import("./merge-sync-0m2Q087q.js");
53919
+ const { isMergeTrainEnabledForProject } = await import("./merge-sync-CYGsJy0u.js");
53756
53920
  if (!isMergeTrainEnabledForProject(config)) return {
53757
53921
  status: 409,
53758
53922
  body: { error: `merge-train is disabled for project ${projectKey}` }
53759
53923
  };
53760
53924
  const issueIds = (await (deps.getOrderedIssueIds ?? defaultOrderedIssueIdsForProject)(resolve(config.path))).slice(0, n);
53761
- const { shipMergeBatch } = await import("./merge-batch-B8bVjFWS.js");
53925
+ const memberships = await (deps.gatherEligibility ?? gatherMergeEligibility)(issueIds);
53926
+ for (const issueId of issueIds) {
53927
+ const membership = memberships.get(issueId.toUpperCase());
53928
+ if (!membership || !isMergeEligible(membership)) return {
53929
+ status: 409,
53930
+ body: { error: `${issueId} is not merge-eligible: ${membership?.reasons.join("; ") || "pipeline membership unavailable"}` }
53931
+ };
53932
+ }
53933
+ const { shipMergeBatch } = await import("./merge-batch-BJjzUUL7.js");
53762
53934
  return {
53763
53935
  status: 200,
53764
53936
  body: {
@@ -53788,7 +53960,7 @@ async function postMergeTrainAssemblePayload(payload) {
53788
53960
  status: 404,
53789
53961
  body: { error: `Unknown project key: ${projectKey}` }
53790
53962
  };
53791
- const { runUatTrainReconcile } = await import("./uat-train-CycEzpbE.js");
53963
+ const { runUatTrainReconcile } = await import("./uat-train-D7Ran2FB.js");
53792
53964
  return {
53793
53965
  status: 200,
53794
53966
  body: { projects: [{
@@ -53800,7 +53972,7 @@ async function postMergeTrainAssemblePayload(payload) {
53800
53972
  }] }
53801
53973
  };
53802
53974
  }
53803
- const { runUatTrainReconcileAllProjects } = await import("./uat-train-CycEzpbE.js");
53975
+ const { runUatTrainReconcileAllProjects } = await import("./uat-train-D7Ran2FB.js");
53804
53976
  return {
53805
53977
  status: 200,
53806
53978
  body: { projects: await runUatTrainReconcileAllProjects({ force: true }) }
@@ -53816,13 +53988,13 @@ function uatGenerationNameFromParam(param) {
53816
53988
  return decoded.startsWith("uat/") ? decoded : `uat/${decoded}`;
53817
53989
  }
53818
53990
  async function postMergeTrainGenerationShipPayload(name, version) {
53819
- const { getUatGenerationSync } = await import("./merge-sync-0m2Q087q.js");
53991
+ const { getUatGenerationSync } = await import("./merge-sync-CYGsJy0u.js");
53820
53992
  const generation = getUatGenerationSync(name);
53821
53993
  if (!generation) return {
53822
53994
  status: 404,
53823
53995
  body: { error: `No UAT generation named ${name}` }
53824
53996
  };
53825
- const { shipPromotedBatch, ShipPromotedBatchError } = await import("./ship-record-DHWH1hLz.js");
53997
+ const { shipPromotedBatch, ShipPromotedBatchError } = await import("./ship-record-BlvX8-xv.js");
53826
53998
  try {
53827
53999
  return {
53828
54000
  status: 200,
@@ -53850,7 +54022,7 @@ const postMergeTrainGenerationStackRoute = HttpRouter.add("POST", "/api/merge-tr
53850
54022
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
53851
54023
  if (authError) return authError;
53852
54024
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
53853
- const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-CycEzpbE.js"));
54025
+ const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-D7Ran2FB.js"));
53854
54026
  const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
53855
54027
  if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
53856
54028
  return jsonResponse({
@@ -53867,8 +54039,8 @@ const postMergeTrainGenerationPromoteRoute = HttpRouter.add("POST", "/api/merge-
53867
54039
  const rawShipVersion = parsed.body["shipVersion"];
53868
54040
  if (rawShipVersion !== void 0 && (typeof rawShipVersion !== "string" || !/^\d+\.\d+\.\d+$/.test(rawShipVersion))) return jsonResponse({ error: "shipVersion must look like 48.8.0" }, { status: 400 });
53869
54041
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
53870
- const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-CycEzpbE.js"));
53871
- const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-B-4zyE4Y.js"));
54042
+ const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-D7Ran2FB.js"));
54043
+ const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-Dx0zRTxX.js"));
53872
54044
  const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle, rawShipVersion));
53873
54045
  if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
53874
54046
  return jsonResponse(result);
@@ -55543,7 +55715,7 @@ function getCheckpointWorker() {
55543
55715
  return worker;
55544
55716
  }
55545
55717
  async function runInline(operation, payload) {
55546
- const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-Cb6CWT4S.js");
55718
+ const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-tm_w6Y4V.js");
55547
55719
  switch (operation) {
55548
55720
  case "claimTranscriptRange": return claimTranscriptRange(payload);
55549
55721
  case "commitTranscriptRange": return commitTranscriptRange(payload);
@@ -56705,7 +56877,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
56705
56877
  };
56706
56878
  }
56707
56879
  async function emitMemoryObservationCreated(observation, timestamp) {
56708
- const { initEventStore } = await import("./event-store-Db4w4YIY.js");
56880
+ const { initEventStore } = await import("./event-store-C50Qt-f1.js");
56709
56881
  await (await initEventStore()).appendAsync({
56710
56882
  type: "memory.observation_created",
56711
56883
  timestamp,
@@ -57742,6 +57914,21 @@ const CLEAR_ON = new Set([
57742
57914
  "StopFailure",
57743
57915
  "PermissionDenied"
57744
57916
  ]);
57917
+ /**
57918
+ * A hook arriving from a conversation's own Claude session is affirmative
57919
+ * evidence the harness is alive and executing turns. If the fork/handoff
57920
+ * pipeline previously marked this conversation failed (the submit-confirmation
57921
+ * check can false-negative: pane echo of the submitted summary keeps the
57922
+ * composer match positive after a successful Enter), heal the verdict. The
57923
+ * dashboard treats forkStatus='failed' as terminal — gray dot, no composer —
57924
+ * so a stale verdict leaves an alive, working session uninteractable.
57925
+ */
57926
+ function healFailedForkVerdictOnLiveActivity(conv) {
57927
+ if (conv.forkStatus !== "failed") return;
57928
+ console.log(`[hooks] clearing fork failure for ${conv.name} — hook activity proves the session is alive (was: ${conv.forkError ?? "failed"})`);
57929
+ clearConversationFailureState(conv.name);
57930
+ markConversationActive(conv.name);
57931
+ }
57745
57932
  const MemoryTurnHookPayload = Schema.Struct({
57746
57933
  session_id: Schema.String,
57747
57934
  transcript_path: Schema.String,
@@ -58061,6 +58248,7 @@ const postPermissionEventRoute = HttpRouter.add("POST", "/api/hooks/permission-e
58061
58248
  if (!sessionId || !hookEvent) return jsonResponse({ ok: true });
58062
58249
  const conv = getConversationByClaudeSessionId(sessionId);
58063
58250
  if (!conv) return jsonResponse({ ok: true });
58251
+ healFailedForkVerdictOnLiveActivity(conv);
58064
58252
  const waiting = hookEvent === "PermissionRequest";
58065
58253
  const clearing = CLEAR_ON.has(hookEvent);
58066
58254
  if (!waiting && !clearing) return jsonResponse({ ok: true });
@@ -58086,6 +58274,7 @@ async function handleUserPromptSubmitBody(body, options = {}) {
58086
58274
  if (!sessionId) return { ok: true };
58087
58275
  const conv = getConversationByClaudeSessionId(sessionId);
58088
58276
  if (!conv) return { ok: true };
58277
+ healFailedForkVerdictOnLiveActivity(conv);
58089
58278
  if (conv.titleSource === "default") {
58090
58279
  const derivedTitle = derivePromptTitle(prompt);
58091
58280
  if (derivedTitle) updateConversationTitle(conv.name, derivedTitle, "auto");
@@ -59503,12 +59692,12 @@ async function pauseFlywheelRunForDashboard() {
59503
59692
  if (before.activeRunId) try {
59504
59693
  const { readFile } = await import("node:fs/promises");
59505
59694
  const { join } = await import("node:path");
59506
- const { getAgentDir } = await import("./agents-DpCuoF65.js");
59695
+ const { getAgentDir } = await import("./agents-DixZjXWm.js");
59507
59696
  const sessionId = (await readFile(join(getAgentDir(FLYWHEEL_ORCHESTRATOR_AGENT_ID), "session.id"), "utf-8")).trim();
59508
59697
  if (sessionId) await saveResumeSessionId(before.activeRunId, sessionId);
59509
59698
  } catch {}
59510
59699
  await setPaused(true);
59511
- await import("./agents-DpCuoF65.js").then(({ stopAgent }) => Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID, "operator")));
59700
+ await import("./agents-DixZjXWm.js").then(({ stopAgent }) => Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID, "operator")));
59512
59701
  return {
59513
59702
  before,
59514
59703
  after: await readGateSnapshot(),
@@ -59518,7 +59707,7 @@ async function pauseFlywheelRunForDashboard() {
59518
59707
  async function abortFlywheelRunForDashboard() {
59519
59708
  const candidate = await getActiveRunId();
59520
59709
  if (!candidate) return { aborted: await resolveLiveFlywheelRunId() ?? null };
59521
- const { stopAgent } = await import("./agents-DpCuoF65.js");
59710
+ const { stopAgent } = await import("./agents-DixZjXWm.js");
59522
59711
  await Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID, "operator"));
59523
59712
  await abortFlywheelRun(candidate);
59524
59713
  return { aborted: candidate };
@@ -60197,7 +60386,7 @@ async function getFlywheelConversationPayload() {
60197
60386
  };
60198
60387
  }
60199
60388
  async function postFlywheelReportPayload() {
60200
- const { flywheelReportCommand } = await import("./flywheel-v1cCOBx-.js");
60389
+ const { flywheelReportCommand } = await import("./flywheel-CC4gE_rx.js");
60201
60390
  await flywheelReportCommand({ cwd: process.cwd() });
60202
60391
  return {
60203
60392
  status: 200,
@@ -60492,7 +60681,7 @@ const postFlywheelBriefRoute = HttpRouter.add("POST", "/api/flywheel/brief", htt
60492
60681
  });
60493
60682
  })));
60494
60683
  const getUatCandidateRoute = HttpRouter.add("GET", "/api/flywheel/uat-candidate", httpHandler(Effect.gen(function* () {
60495
- const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-CycEzpbE.js"));
60684
+ const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-D7Ran2FB.js"));
60496
60685
  return jsonResponse(yield* Effect.promise(() => getUatCandidatePayload()));
60497
60686
  })));
60498
60687
  const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
@@ -60703,7 +60892,7 @@ function previewBrief(book) {
60703
60892
  return `${lines.join("\n")}\n`;
60704
60893
  }
60705
60894
  async function defaultStartOrderBook(book, project) {
60706
- const { startFlywheelRun } = await import("./flywheel-v1cCOBx-.js");
60895
+ const { startFlywheelRun } = await import("./flywheel-CC4gE_rx.js");
60707
60896
  return startFlywheelRun({
60708
60897
  cwd: resolveProjectPath(project),
60709
60898
  orders: book.id
@@ -61853,6 +62042,7 @@ function initSchema(db) {
61853
62042
  release_notes TEXT,
61854
62043
  updated_at TEXT NOT NULL,
61855
62044
  ready_for_merge INTEGER NOT NULL DEFAULT 0,
62045
+ retired_at TEXT,
61856
62046
  auto_requeue_count INTEGER DEFAULT 0,
61857
62047
  merge_retry_count INTEGER DEFAULT 0,
61858
62048
  pr_url TEXT,
@@ -62396,7 +62586,7 @@ function initSchema(db) {
62396
62586
  CREATE INDEX IF NOT EXISTS idx_backlog_sequence_project_rank
62397
62587
  ON backlog_sequence(project_key, rank);
62398
62588
  `);
62399
- db.pragma(`user_version = 64`);
62589
+ db.pragma(`user_version = 65`);
62400
62590
  }
62401
62591
  /**
62402
62592
  * Run schema migrations if the database version is older than SCHEMA_VERSION.
@@ -62408,14 +62598,14 @@ function runMigrations(db, dbPath) {
62408
62598
  initSchema(db);
62409
62599
  return;
62410
62600
  }
62411
- if (currentVersion === 64) {
62601
+ if (currentVersion === 65) {
62412
62602
  tryIdempotentDdl(db, 61, "ALTER TABLE flywheel_substrate_bugs ADD COLUMN affected_criteria TEXT");
62413
62603
  tryIdempotentDdl(db, 61, "ALTER TABLE agents ADD COLUMN started_by TEXT");
62414
62604
  tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN review_cycle_history TEXT");
62415
62605
  tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN conflicts_since TEXT");
62416
62606
  return;
62417
62607
  }
62418
- if (currentVersion > 64) return;
62608
+ if (currentVersion > 65) return;
62419
62609
  if (currentVersion < 2) db.exec(`
62420
62610
  DELETE FROM status_history
62421
62611
  WHERE id NOT IN (
@@ -63083,7 +63273,8 @@ function runMigrations(db, dbPath) {
63083
63273
  tryIdempotentDdl(db, 64, "ALTER TABLE review_status ADD COLUMN uat_status TEXT");
63084
63274
  tryIdempotentDdl(db, 64, "ALTER TABLE review_status ADD COLUMN uat_notes TEXT");
63085
63275
  }
63086
- db.pragma(`user_version = 64`);
63276
+ if (currentVersion < 65) tryIdempotentDdl(db, 65, "ALTER TABLE review_status ADD COLUMN retired_at TEXT");
63277
+ db.pragma(`user_version = 65`);
63087
63278
  }
63088
63279
  //#endregion
63089
63280
  //#region ../../lib/database/index.ts
@@ -64408,6 +64599,7 @@ init_review_status();
64408
64599
  init_event_store();
64409
64600
  const POLL_INTERVAL_MS$2 = 6e4;
64410
64601
  let reconcileTimer = null;
64602
+ const reconcileTracking = /* @__PURE__ */ new Map();
64411
64603
  function reviewStatusPayload(event) {
64412
64604
  if (!event.payload || typeof event.payload !== "object") return null;
64413
64605
  const payload = event.payload;
@@ -64419,9 +64611,10 @@ async function reconcileOnce() {
64419
64611
  const canonicalByIssue = /* @__PURE__ */ new Map();
64420
64612
  for (const issueId of Object.keys(cached)) {
64421
64613
  const canonical = getReviewStatusSync(issueId);
64422
- if (!canonical) continue;
64614
+ if (!canonical || canonical.retiredAt) continue;
64423
64615
  canonicalByIssue.set(issueId.toUpperCase(), canonical);
64424
64616
  }
64617
+ for (const issueId of reconcileTracking.keys()) if (!canonicalByIssue.has(issueId)) reconcileTracking.delete(issueId);
64425
64618
  const store = getEventStore();
64426
64619
  const latestByIssue = /* @__PURE__ */ new Map();
64427
64620
  for (const event of store.queryLatestPerIssue("review.status_changed")) {
@@ -64432,10 +64625,25 @@ async function reconcileOnce() {
64432
64625
  const latest = latestByIssue.get(issueId);
64433
64626
  const latestPayload = latest ? reviewStatusPayload(latest) : null;
64434
64627
  const lastUpdatedAt = latestPayload?.status.updatedAt ?? "";
64435
- if (lastUpdatedAt > canonical.updatedAt) continue;
64436
- if (lastUpdatedAt === canonical.updatedAt && latestPayload && sameCanonicalReviewStatus(latestPayload.status, canonical)) continue;
64628
+ if (lastUpdatedAt > canonical.updatedAt) {
64629
+ reconcileTracking.delete(issueId);
64630
+ continue;
64631
+ }
64632
+ if (lastUpdatedAt === canonical.updatedAt && latestPayload && sameCanonicalReviewStatus(latestPayload.status, canonical)) {
64633
+ reconcileTracking.delete(issueId);
64634
+ continue;
64635
+ }
64636
+ const tracking = reconcileTracking.get(issueId);
64637
+ if (tracking?.healedUpdatedAt === canonical.updatedAt) {
64638
+ if (tracking.warnedUpdatedAt !== canonical.updatedAt) {
64639
+ console.warn(`[review-status-reconcile] NOT CONVERGING for ${issueId}: canonical=${canonical.updatedAt} event=${lastUpdatedAt}`);
64640
+ tracking.warnedUpdatedAt = canonical.updatedAt;
64641
+ }
64642
+ continue;
64643
+ }
64437
64644
  console.log(`[review-status-reconcile] re-emitting status for ${issueId} (canonical differs from last event — healing lost status_changed)`);
64438
64645
  emitReviewStatusChanged((event) => store.append(event), issueId, canonical);
64646
+ reconcileTracking.set(issueId, { healedUpdatedAt: canonical.updatedAt });
64439
64647
  }
64440
64648
  }
64441
64649
  function startReviewStatusReconcileService() {
@@ -65570,15 +65778,15 @@ async function announceNewRestart(deps = {}) {
65570
65778
  return true;
65571
65779
  }
65572
65780
  let timer$2 = null;
65573
- let running = false;
65781
+ let running$1 = false;
65574
65782
  let runToken = 0;
65575
65783
  function startRestartAnnouncer(deps = {}) {
65576
- if (running) return;
65577
- running = true;
65784
+ if (running$1) return;
65785
+ running$1 = true;
65578
65786
  const token = ++runToken;
65579
65787
  let remainingBootstrapPolls = BOOTSTRAP_FAST_POLL_COUNT;
65580
65788
  const schedule = (delayMs) => {
65581
- if (!running || token !== runToken) return;
65789
+ if (!running$1 || token !== runToken) return;
65582
65790
  timer$2 = setTimeout(pass, delayMs);
65583
65791
  timer$2.unref?.();
65584
65792
  };
@@ -65596,7 +65804,7 @@ function startRestartAnnouncer(deps = {}) {
65596
65804
  pass();
65597
65805
  }
65598
65806
  function stopRestartAnnouncer() {
65599
- running = false;
65807
+ running$1 = false;
65600
65808
  runToken += 1;
65601
65809
  if (timer$2) clearTimeout(timer$2);
65602
65810
  timer$2 = null;
@@ -66021,7 +66229,7 @@ const RESTART_MARKER = join$1(homedir(), ".overdeck", "dashboard-restarting.json
66021
66229
  * loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
66022
66230
  */
66023
66231
  async function defaultLifecycleRunner(pending) {
66024
- const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-BuoC_PRZ.js");
66232
+ const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-D-4_iQgy.js");
66025
66233
  await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
66026
66234
  if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
66027
66235
  }
@@ -66218,7 +66426,7 @@ function failureReason(result) {
66218
66426
  return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
66219
66427
  }
66220
66428
  async function defaultMergeIssue(issueId) {
66221
- const { triggerMerge } = await import("./merge-ops-DabXHp2i.js");
66429
+ const { triggerMerge } = await import("./merge-ops-Cf02szJ5.js");
66222
66430
  return triggerMerge(issueId);
66223
66431
  }
66224
66432
  function defaultAnnounceFailure(issueId, reason) {
@@ -66373,21 +66581,113 @@ async function warnIfAppCannotMerge(deps = {}) {
66373
66581
  }
66374
66582
  }
66375
66583
  //#endregion
66584
+ //#region services/conversation-rescan-scheduler.ts
66585
+ /**
66586
+ * Keeps the discovered-sessions FTS index fresh (PAN-3771 layer 2).
66587
+ * The Conversations-page search corpus previously only updated when someone
66588
+ * clicked Scan or ran `pan conv scan`, so installs that never rescanned had
66589
+ * weeks of invisible sessions. The scan is incremental: unchanged files are
66590
+ * skipped by size and mtime.
66591
+ */
66592
+ const BOOT_DELAY_MS = 45e3;
66593
+ const RESCAN_INTERVAL_MS = 360 * 60 * 1e3;
66594
+ const LOG_PREFIX = "[conversation-rescan]";
66595
+ let bootTimer = null;
66596
+ let intervalTimer = null;
66597
+ let running = false;
66598
+ let stopped = false;
66599
+ async function runScanOnce(trigger) {
66600
+ if (running || stopped) return;
66601
+ running = true;
66602
+ try {
66603
+ const result = await scan({ mode: "system" });
66604
+ const elapsedMs = Math.round(result.durationMs);
66605
+ const summary = `${result.inserted} inserted, ${result.updated} updated, ${result.skipped} skipped, ${result.errors} errors`;
66606
+ console.log(`${LOG_PREFIX} ${trigger} scan complete: ${summary} (${elapsedMs}ms)`);
66607
+ } catch (error) {
66608
+ console.warn(`${LOG_PREFIX} ${trigger} scan failed:`, error);
66609
+ } finally {
66610
+ running = false;
66611
+ }
66612
+ }
66613
+ function startConversationRescanScheduler() {
66614
+ if (bootTimer !== null || intervalTimer !== null) return;
66615
+ stopped = false;
66616
+ bootTimer = setTimeout(() => {
66617
+ runScanOnce("boot");
66618
+ }, BOOT_DELAY_MS);
66619
+ if (typeof bootTimer.unref === "function") bootTimer.unref();
66620
+ intervalTimer = setInterval(() => {
66621
+ runScanOnce("interval");
66622
+ }, RESCAN_INTERVAL_MS);
66623
+ if (typeof intervalTimer.unref === "function") intervalTimer.unref();
66624
+ }
66625
+ async function stopConversationRescanScheduler() {
66626
+ if (bootTimer !== null) {
66627
+ clearTimeout(bootTimer);
66628
+ bootTimer = null;
66629
+ }
66630
+ if (intervalTimer !== null) {
66631
+ clearInterval(intervalTimer);
66632
+ intervalTimer = null;
66633
+ }
66634
+ stopped = true;
66635
+ }
66636
+ //#endregion
66376
66637
  //#region services/cost-reconcile-service.ts
66638
+ /**
66639
+ * Periodic cost reconciliation delegates transcript walking and parsing to the
66640
+ * long DB worker lane. The main thread records returned events through the cost
66641
+ * write door and persists exact path/mtime/size skip verdicts for later sweeps.
66642
+ */
66377
66643
  const RECONCILE_INTERVAL_MS = 5 * 6e4;
66644
+ const RECONCILE_BATCH_EVENTS = 250;
66378
66645
  let timer = null;
66379
66646
  let inFlight$1 = null;
66380
66647
  async function runCostReconcileOnce(reason) {
66381
66648
  if (inFlight$1) return inFlight$1;
66382
66649
  inFlight$1 = (async () => {
66383
- const result = await reconcilePiTranscripts();
66384
- if (result.eventsImported > 0 || result.errors.length > 0) console.log(`[cost-reconciler] ${reason} sweep: ${result.eventsImported} imported, ${result.duplicatesSkipped} duplicate(s), ${result.errors.length} error(s)`);
66650
+ const result = {
66651
+ eventsImported: 0,
66652
+ duplicatesSkipped: 0,
66653
+ cacheSkipped: 0,
66654
+ errors: []
66655
+ };
66656
+ const piCollected = await runDashboardDbJob("costReconcileSweep", {
66657
+ source: "pi",
66658
+ maxEvents: RECONCILE_BATCH_EVENTS
66659
+ }, async (progress) => {
66660
+ const batch = progress;
66661
+ for (const { event, sourceFile } of batch.events) {
66662
+ const recorded = await recordCostEventsThroughOverdeck([event], sourceFile);
66663
+ result.eventsImported += recorded.inserted;
66664
+ result.duplicatesSkipped += recorded.duplicates;
66665
+ }
66666
+ for (const verdict of batch.verdicts) recordSkipVerdict(verdict.path, verdict.mtimeMs, verdict.size, verdict.verdict);
66667
+ });
66668
+ result.cacheSkipped += piCollected.stats.cacheSkipped;
66669
+ result.errors.push(...piCollected.errors);
66670
+ if (result.eventsImported > 0 || result.cacheSkipped > 0 || result.errors.length > 0) console.log(`[cost-reconciler] ${reason} sweep: ${result.eventsImported} imported, ${result.cacheSkipped} cache-skipped, ${result.duplicatesSkipped} duplicate(s), ${result.errors.length} error(s)`);
66385
66671
  if (result.errors.length > 0) for (const err of result.errors.slice(0, 5)) console.warn(`[cost-reconciler] ${err.path}: ${err.error}`);
66386
66672
  const backfillResult = reclassifyUnknownCostEventsSync();
66387
66673
  if (backfillResult.updated > 0) console.log(`[cost-reconciler] ${reason} UNKNOWN backfill: ${backfillResult.updated} updated`);
66388
66674
  try {
66389
- const codexResult = await Effect.runPromise(CostWriter.use((writer) => writer.reconcile({ source: "codex" })).pipe(Effect.provide(CostDoorLive)));
66390
- if (codexResult.imported > 0) console.log(`[cost-reconciler] ${reason} codex sweep: ${codexResult.imported} imported`);
66675
+ let imported = 0;
66676
+ const codexResult = await runDashboardDbJob("costReconcileSweep", {
66677
+ source: "codex",
66678
+ maxEvents: RECONCILE_BATCH_EVENTS
66679
+ }, async (progress) => {
66680
+ const batch = progress;
66681
+ for (const event of batch.events) {
66682
+ const normalized = {
66683
+ ...event,
66684
+ ts: new Date(event.ts)
66685
+ };
66686
+ if (await Effect.runPromise(CostWriter.use((writer) => writer.record(normalized)).pipe(Effect.provide(CostDoorLive)))) imported++;
66687
+ }
66688
+ for (const verdict of batch.verdicts) recordSkipVerdict(verdict.path, verdict.mtimeMs, verdict.size, verdict.verdict);
66689
+ });
66690
+ console.log(`[cost-reconciler] ${reason} codex sweep: ${codexResult.stats.scanned} scanned, ${codexResult.stats.cacheSkipped} cache-skipped, ${imported} imported`);
66391
66691
  } catch (err) {
66392
66692
  console.warn("[cost-reconciler] codex sweep failed:", err instanceof Error ? err.message : err);
66393
66693
  }
@@ -66721,7 +67021,7 @@ const defaultDependencies = {
66721
67021
  inspect: inspectStateMigration,
66722
67022
  ensureWorktree: ensureStateWorktree,
66723
67023
  migrate: async (projectKey, project, signal) => {
66724
- const { migrateProjectState } = await import("./state-migrate-C6H3jfHE.js");
67024
+ const { migrateProjectState } = await import("./state-migrate-C2Ouyd6e.js");
66725
67025
  await migrateProjectState(projectKey, { signal }, project);
66726
67026
  },
66727
67027
  clearCache: clearStateMigrationCache,
@@ -66933,7 +67233,7 @@ if (shouldStartStaleCheckRetriggerService()) {
66933
67233
  }
66934
67234
  if (process.env.OVERDECK_MODE === "desktop") (async () => {
66935
67235
  try {
66936
- const { provisionClaudeHooks } = await import("./claude-hooks-provision-C5JHpxTS.js");
67236
+ const { provisionClaudeHooks } = await import("./claude-hooks-provision-CTh9zxEi.js");
66937
67237
  const result = await provisionClaudeHooks();
66938
67238
  if (!result.ok) console.warn(`[overdeck] Claude hook provisioning skipped: ${result.reason}`);
66939
67239
  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` : ""}`);
@@ -67176,6 +67476,8 @@ startCostReconcileService();
67176
67476
  console.log("[overdeck] Cost reconciler started");
67177
67477
  const conversationSearchWatcher = startConversationSearchWatcher();
67178
67478
  console.log(conversationSearchWatcher ? "[overdeck] Conversation search watcher started" : "[overdeck] Conversation search watcher skipped (conversationSearch.enabled=false)");
67479
+ startConversationRescanScheduler();
67480
+ console.log("[overdeck] Conversation rescan scheduler started (boot pass + 6h interval)");
67179
67481
  let stopResourceRefreshServices = () => void 0;
67180
67482
  (async () => {
67181
67483
  const store = await initEventStore();
@@ -67278,7 +67580,7 @@ const handleShutdownSignal = async (signal) => {
67278
67580
  await stopAllKnowledgeViewers().catch((err) => console.warn("[knowledge-viewer] shutdown failed:", err?.message ?? err));
67279
67581
  await stopDeaconChild().catch((err) => console.warn("[deacon-supervisor] child shutdown failed:", err?.message ?? err));
67280
67582
  try {
67281
- const { killAllGateProcessGroups } = await import("./validation-CHovCoTT.js");
67583
+ const { killAllGateProcessGroups } = await import("./validation-nSrYiYvA.js");
67282
67584
  const reaped = killAllGateProcessGroups();
67283
67585
  if (reaped > 0) console.log(`[overdeck] reaped ${reaped} in-flight gate process group(s)`);
67284
67586
  } catch (err) {
@@ -67286,6 +67588,7 @@ const handleShutdownSignal = async (signal) => {
67286
67588
  }
67287
67589
  await Effect.runPromise(flushAllPendingAutoCommits()).catch((err) => console.warn("[pan-dir/auto-commit] shutdown flush failed:", err));
67288
67590
  await stopConversationSearchWatcher().catch((err) => console.warn("[conversation-search] watcher shutdown failed:", err));
67591
+ await stopConversationRescanScheduler();
67289
67592
  closeConversationSearchService();
67290
67593
  closeMemoryFtsDatabases();
67291
67594
  process.exit(0);
@@ -67320,7 +67623,7 @@ setTimeout(() => {
67320
67623
  });
67321
67624
  });
67322
67625
  }, 1e3);
67323
- fixStuckReadyForMerge();
67626
+ await fixStuckReadyForMerge();
67324
67627
  fixStuckCommentedReviews();
67325
67628
  reconcileStaleGitHubBlockers().then((n) => {
67326
67629
  if (n > 0) {
@@ -67334,7 +67637,7 @@ reconcileStaleGitHubBlockers().then((n) => {
67334
67637
  }).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
67335
67638
  await startProjectCiRefillAfterProjectionReady(900 * 1e3);
67336
67639
  try {
67337
- const { resetProcessingToQueued, requeueOrphanedMergingAutoMerges } = await import("./merge-sync-0m2Q087q.js");
67640
+ const { resetProcessingToQueued, requeueOrphanedMergingAutoMerges } = await import("./merge-sync-CYGsJy0u.js");
67338
67641
  const resetCount = resetProcessingToQueued();
67339
67642
  if (resetCount > 0) {
67340
67643
  console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);
@@ -67368,7 +67671,7 @@ else {
67368
67671
  console.log("[overdeck] Auto-merge executor started");
67369
67672
  }
67370
67673
  try {
67371
- const { reconcileInterruptedVerifications } = await import("./verification-runner-BuqGwm2t.js");
67674
+ const { reconcileInterruptedVerifications } = await import("./verification-runner-CFjAuv9u.js");
67372
67675
  const interrupted = reconcileInterruptedVerifications();
67373
67676
  if (interrupted > 0) console.log(`[overdeck] recovered ${interrupted} orphaned verification worker(s)`);
67374
67677
  } catch (err) {