@overdeck/desktop 0.49.2 → 0.50.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) 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-DFyrgxW5.js} +2 -2
  4. package/server/{active-dashboard-bundle-Byh6sP-q.js → active-dashboard-bundle-DbfgP8TS.js} +2 -2
  5. package/server/{activity-logger-Ck8qoluj.js → activity-logger-DtdKxzPh.js} +1 -1
  6. package/server/{activity-logger-BWZhVphb.js → activity-logger-ru8ggv-d.js} +3 -3
  7. package/server/{advancing-selfheal-65W4yUQi.js → advancing-selfheal-BdZ1iFJf.js} +11 -6
  8. package/server/{agent-gc-BNUudFnt.js → agent-gc-DBMg1vIc.js} +11 -11
  9. package/server/{agent-idle-ONBssBN_.js → agent-idle-CQlwmcRR.js} +11 -11
  10. package/server/{agent-state-CM8iVw5B.js → agent-state-B0v3fvGI.js} +1 -1
  11. package/server/{agent-state-BJhGIJZe.js → agent-state-BnyNoDWQ.js} +345 -402
  12. package/server/{agent-state-service-CiIuwzIs.js → agent-state-service-D95wBjA3.js} +5 -5
  13. package/server/{agent-state-service-CzHfoqKQ.js → agent-state-service-GK2Uy8zc.js} +1 -1
  14. package/server/{agents-DpCuoF65.js → agents-BdkVgjxC.js} +1 -1
  15. package/server/{agents-jXgqpHca.js → agents-DMs1aLRU.js} +4 -4
  16. package/server/{archive-planning-CGkU6UeL.js → archive-planning-CFf5FVHQ.js} +5 -5
  17. package/server/archive-planning-CNSWQPvz.js +2 -0
  18. package/server/{artifact-index-jobs-Ck4NRRkY.js → artifact-index-jobs-BdeB5RIY.js} +2 -2
  19. package/server/{assemble-CyvEBmmq.js → assemble-D88iFkP-.js} +2 -2
  20. package/server/{auto-spawn-consent-Dc4mtM-B.js → auto-spawn-consent-C1avLtkk.js} +7 -7
  21. package/server/{backlog-auto-trigger-CCEpr4YT.js → backlog-auto-trigger-oKIGNBzZ.js} +3 -3
  22. package/server/{behavior-BiCQzqyT.js → behavior-CPX0E2Fj.js} +49 -7
  23. package/server/{bridge-pool-patrol-Ce8rNPym.js → bridge-pool-patrol-DstxbANA.js} +2 -2
  24. package/server/{briefing-freshness-e_OEYZEe.js → briefing-freshness-FF0WLPMc.js} +2 -2
  25. package/server/build-info-Df2tkRrB.js +2 -0
  26. package/server/{build-info-BRw4QlYO.js → build-info-DiA6h4T6.js} +3 -3
  27. package/server/{checkpoint-manager-DOwRGFff.js → checkpoint-manager-CkXA-F6Z.js} +2 -2
  28. package/server/{checkpoint-manager-CKr42Usw.js → checkpoint-manager-D74ueYZp.js} +1 -1
  29. package/server/checkpoint-worker.js +1 -1
  30. package/server/{checkpoints-Cszp_0Np.js → checkpoints-Ds83fUb1.js} +2 -2
  31. package/server/{checkpoints-Cb6CWT4S.js → checkpoints-JIKy0UFv.js} +1 -1
  32. package/server/{claude-hooks-provision-C5JHpxTS.js → claude-hooks-provision-BJ8LNIAe.js} +1 -1
  33. package/server/{claude-hooks-provision-Cer2eFfj.js → claude-hooks-provision-D7Z8kANm.js} +2 -2
  34. package/server/{claude-permissions-Bc5kjX1q.js → claude-permissions-Bn53HCXr.js} +18 -3
  35. package/server/{claude-settings-overlay-m-VVZej1.js → claude-settings-overlay-CqJZjFqv.js} +2 -2
  36. package/server/{claude-settings-overlay-C7rWsnya.js → claude-settings-overlay-QByq1SQa.js} +1 -1
  37. package/server/{cli-BmczsfD6.js → cli-BXmAb7vN.js} +11 -11
  38. package/server/cli-BjznnCC3.js +2 -0
  39. package/server/{cliproxy-BpYpkogS.js → cliproxy-L_2OxNJf.js} +2 -2
  40. package/server/{cliproxy-_yUU0HRY.js → cliproxy-ltFu5xfR.js} +1 -1
  41. package/server/{close-issue-CxvRD0UI.js → close-issue-BZAf0Ii-.js} +5 -5
  42. package/server/{closed-issue-reaper-nMLRi5de.js → closed-issue-reaper-BJa8SbvQ.js} +13 -13
  43. package/server/{closed-issue-reaper-omOcUDBl.js → closed-issue-reaper-DVtyOI4C.js} +1 -1
  44. package/server/{codex-DZhFfcWu.js → codex-BqLZKVNm.js} +1 -1
  45. package/server/{codex-KaSKE-R3.js → codex-DSs-3aOm.js} +6 -6
  46. package/server/{compaction-continuation-Bjfi70G-.js → compaction-continuation-TG0HYkOq.js} +3 -3
  47. package/server/{config-ZGjvuR6J.js → config-Cx3N6gWz.js} +2 -2
  48. package/server/{config-Doq_tF-f.js → config-DP0VV7rX.js} +2 -2
  49. package/server/{config-CH1AqqIQ.js → config-DURnId0k.js} +1 -1
  50. package/server/{config-yaml-D9nfpEx1.js → config-yaml-OoH-ZpTb.js} +48 -9
  51. package/server/{conflict-gate-DcUTY4Gb.js → conflict-gate-SgOELW84.js} +5 -5
  52. package/server/{conflict-gate-D4XCtrm2.js → conflict-gate-pMfhBEVB.js} +1 -1
  53. package/server/{context-layers-BGj2Y9l3.js → context-layers-D0QBOPJJ.js} +2 -2
  54. package/server/{context-layers-BBTKP-Y4.js → context-layers-LY5zt0da.js} +3 -3
  55. package/server/{continue-i7Revg8D.js → continue-Cmzd6leL.js} +2 -2
  56. package/server/{control-settings-BMoDHY1G.js → control-settings-Bdud_B1j.js} +308 -5
  57. package/server/{conversation-compaction-DzIjYMfg.js → conversation-compaction-BX9UR8nl.js} +1 -1
  58. package/server/{conversation-compaction-D4VOmF7p.js → conversation-compaction-dFx_2wpa.js} +8 -8
  59. package/server/{conversation-service-CzZUJFEx.js → conversation-service-B3h1erHm.js} +1 -1
  60. package/server/{conversation-service-tQCIbBVZ.js → conversation-service-zgLM2g2D.js} +37 -13
  61. package/server/{conversations-bFDaD5YN.js → conversations-Ch7UGi0F.js} +1 -1
  62. package/server/{conversations-C75EFFjf.js → conversations-JyrMSeOh.js} +5 -5
  63. package/server/{cost-CiIwxH1D.js → cost-CxXv7ei-.js} +10 -2
  64. package/server/cost-DR57uJFP.js +838 -0
  65. package/server/{cost-BCWEkvro.js → cost-MZ7EZFDc.js} +3 -3
  66. package/server/{cost-sync-DOkdE_yB.js → cost-sync-Bq_dyq9k.js} +3 -3
  67. package/server/{dag-BPc74hwj.js → dag-CKUsr8wB.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-CzSZMtb-.js → deacon-BUOpTnmQ.js} +3 -3
  71. package/server/{deacon-B24dNzr8.js → deacon-C7qZxRuW.js} +125 -165
  72. package/server/{deacon-canonical-state-CkvxRPck.js → deacon-canonical-state-hcaZgjoT.js} +2 -2
  73. package/server/{deacon-event-client-Do6Z2gKl.js → deacon-event-client-Coiopt4u.js} +2 -2
  74. package/server/{deacon-event-client-BYIQBu0T.js → deacon-event-client-DJ71Tifg.js} +1 -1
  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-Dv0-8bZG.js} +3 -3
  77. package/server/deacon.js +11 -11
  78. package/server/dead-end-trip-B91w2PGV.js +2 -0
  79. package/server/{dead-end-trip-CnVmjnya.js → dead-end-trip-DH_hA7yS.js} +3 -3
  80. package/server/{delivery-gyce0vQ7.js → delivery-zJM4aIkf.js} +1 -1
  81. package/server/{deploy-patrol-CEwwEYDM.js → deploy-patrol-Cv96N0s6.js} +8 -8
  82. package/server/deploy-queue-2cN86Lg4.js +2 -0
  83. package/server/{deploy-queue-r96ojDI3.js → deploy-queue-EcksuKE2.js} +2 -2
  84. package/server/{deploy-window-D_3hhfxt.js → deploy-window-BXbzS0zN.js} +4 -4
  85. package/server/{deploy-window-DeJK8mTK.js → deploy-window-CHgL_TTN.js} +1 -1
  86. package/server/{dev-supervisor-DZWwpENk.js → dev-supervisor-lNaYB136.js} +2 -2
  87. package/server/{devcontainer-renderer-d-9dCV_2.js → devcontainer-renderer-q8q9aXRd.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-CRPHBylA.js → docker-BNd0tMdS.js} +1 -1
  91. package/server/{docker-B2mUBzGk.js → docker-Dk-shfga.js} +3 -3
  92. package/server/{dod-DWtilRLx.js → dod-BAk5arLF.js} +1 -1
  93. package/server/{done-preflight-BDVdWed5.js → done-preflight-AiXnYYAy.js} +1 -1
  94. package/server/{done-preflight-D4ukUf-S.js → done-preflight-CukR3Br8.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-BjMV_gdX.js} +1 -1
  98. package/server/{ensure-devcontainer-BUeBRjmm.js → ensure-devcontainer-YXncXZ5Q.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-CFnLP8w-.js} +1 -1
  101. package/server/{event-store-BCSgMubf.js → event-store-DbjldlXW.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-Bb2x5ijT.js} +3 -3
  104. package/server/{factory-BrdqXBeK.js → factory-DfIQG-qW.js} +4 -4
  105. package/server/{feature-registry-storage-zh3ZXW6f.js → feature-registry-storage-BzAGS4DA.js} +2 -2
  106. package/server/{features-BGntOWdy.js → features-KxOILHX8.js} +2 -2
  107. package/server/{feedback-stuck-retirement-DpA5u1kt.js → feedback-stuck-retirement-BqTHm-1Z.js} +2 -2
  108. package/server/{feedback-target-D7GxdUYG.js → feedback-target-BjLidX0M.js} +10 -10
  109. package/server/{feedback-target-Ddqk93NF.js → feedback-target-D2CIZFwc.js} +1 -1
  110. package/server/{feedback-writer-CH2846DP.js → feedback-writer-BrSQ4fC-.js} +1 -1
  111. package/server/{feedback-writer-C1gCLFmp.js → feedback-writer-Dgrma-L1.js} +5 -5
  112. package/server/{flywheel-CjW2L7BS.js → flywheel-D5FchYg4.js} +16 -16
  113. package/server/{flywheel-HJt7QdWP.js → flywheel-Ds0eOd1P.js} +1 -1
  114. package/server/{flywheel-v1cCOBx-.js → flywheel-X6kvGnf2.js} +15 -15
  115. package/server/{flywheel-merge-order-D_yyAlND.js → flywheel-merge-order-BTY73Efv.js} +17 -15
  116. package/server/{flywheel-merge-order-4fNRN2F2.js → flywheel-merge-order-PTHnouQS.js} +1 -1
  117. package/server/{forge-RVTCK_5X.js → forge-B08cRXEb.js} +2 -2
  118. package/server/forge-egNLsjVi.js +2 -0
  119. package/server/{from-BnLgKYvw.js → from-C3dzmjSO.js} +1 -1
  120. package/server/{fs-lock-C7J-ugIf.js → fs-lock-DfiYlr5u.js} +2 -2
  121. package/server/{fts-operations-CU0B5WUx.js → fts-operations-Do1SP0w4.js} +2 -2
  122. package/server/{git-info-BSrI9owC.js → git-info-DMOSfJ9I.js} +1 -1
  123. package/server/{git-utils-DW8-jIUJ.js → git-utils-DfpFkvwk.js} +4 -4
  124. package/server/{git-utils-CsKV0Dis.js → git-utils-fcK3ZRNj.js} +1 -1
  125. package/server/{github-app-7ywLhuZO.js → github-app-Co8ZhyUJ.js} +2 -2
  126. package/server/{github-app-Oi5hdn1n.js → github-app-HAqQZZRD.js} +1 -1
  127. package/server/{github-client-Cy0fSj1a.js → github-client-C7MUxFzX.js} +1 -1
  128. package/server/{github-client-DAbuXLuk.js → github-client-wqbDCmlL.js} +2 -2
  129. package/server/{github-pr-lookup-Dhh3ec1V.js → github-pr-lookup-DdLCDdu9.js} +2 -2
  130. package/server/{harness-binary-tMmgJfC1.js → harness-binary-BuakhXkB.js} +2 -2
  131. package/server/{harness-resolve-DusNpVEe.js → harness-resolve-CISjc9FR.js} +4 -4
  132. package/server/{health-events-BYDZ9n2i.js → health-events-9RhRGZK1.js} +1 -1
  133. package/server/{health-events-DNw9Mzw9.js → health-events-CIE7gy34.js} +2 -2
  134. package/server/{hooks-B4wj32l2.js → hooks-CmL3TXla.js} +1 -1
  135. package/server/{hooks-BjBjxqNh.js → hooks-D55VTdQS.js} +2 -2
  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-CZbJ0xpl.js} +3 -3
  139. package/server/{idle-stack-reaper-BSxb1bln.js → idle-stack-reaper-CjovDCet.js} +4 -4
  140. package/server/{idle-stack-reaper-Bw0rU9GC.js → idle-stack-reaper-DhbFdkWv.js} +1 -1
  141. package/server/{in-flight-guard-DuxabAHT.js → in-flight-guard-B7khcBdQ.js} +1 -1
  142. package/server/{infra-CHIvOb9q.js → infra-BbSWNOpH.js} +10 -4
  143. package/server/{injection-BYUt8ml1.js → injection-BSnn_10a.js} +8 -8
  144. package/server/{injection-BviePcm3.js → injection-DsQDBSEi.js} +1 -1
  145. package/server/inspect-agent-BuSYgRQs.js +2 -0
  146. package/server/{inspect-agent-sV_19NxZ.js → inspect-agent-DS8j2v6U.js} +12 -12
  147. package/server/{internal-token-DoVzb4b7.js → internal-token-CUKcTWSG.js} +2 -2
  148. package/server/{internal-token-BOtIRJU7.js → internal-token-CkrMLCLU.js} +1 -1
  149. package/server/{io-DKrWd3gX.js → io-BgzG56av.js} +4 -4
  150. package/server/{issue-closed-6RQsAjDX.js → issue-closed-DZEwD3ol.js} +7 -7
  151. package/server/{issue-lifecycle-DOPVv7xz.js → issue-lifecycle-Bnfbpkmk.js} +1 -1
  152. package/server/{issue-lifecycle-D9nLErvS.js → issue-lifecycle-LgYeE1o2.js} +25 -25
  153. package/server/{issue-service-singleton-B2xy-IS9.js → issue-service-singleton-Bsb0GaY8.js} +10 -10
  154. package/server/{issue-service-singleton-CvgNAWqK.js → issue-service-singleton-COEqWNKE.js} +1 -1
  155. package/server/{issue-title-fallback-DTSCQVu0.js → issue-title-fallback-D4_b2XwP.js} +3 -3
  156. package/server/{issues-e_Ck1Ln2.js → issues-DYAEUW45.js} +2 -2
  157. package/server/{jsonl-parser-DqxVCZ1k.js → jsonl-parser-1IqHI9Yb.js} +3 -3
  158. package/server/{jsonl-resolver-07OS3qOr.js → jsonl-resolver-BJ8Hg-yD.js} +8 -8
  159. package/server/{kimi-code-vtXl2DR5.js → kimi-code-Cdkk9vRU.js} +1 -1
  160. package/server/{kimi-code-BjtAHIz1.js → kimi-code-DwqLCWFw.js} +11 -11
  161. package/server/{kimi-parser-B1lgy2Vt.js → kimi-parser-DFsZQArz.js} +2 -2
  162. package/server/{label-cleanup-D2zUMasf.js → label-cleanup-Bej6xDZK.js} +3 -3
  163. package/server/{lifecycle-0NOEzomy.js → lifecycle-BibLMHBH.js} +2 -2
  164. package/server/{lifecycle-DaCovZwn.js → lifecycle-CMpSB9sn.js} +6 -6
  165. package/server/{lifecycle-io-6WL46dsB.js → lifecycle-io-CCCAMefe.js} +5 -5
  166. package/server/{lifecycle-io-BBMTaP7S.js → lifecycle-io-CLWwYZaR.js} +1 -1
  167. package/server/{linear-client-BTGApNLo.js → linear-client-BtYl16Cy.js} +1 -1
  168. package/server/{linear-client-7fQThJTc.js → linear-client-fpL-qJEa.js} +2 -2
  169. package/server/{linear-mcp-auth-B8pYRsiU.js → linear-mcp-auth-CQ7ROT1X.js} +1 -1
  170. package/server/{linear-mcp-auth-Nk5s3L9M.js → linear-mcp-auth-nAYWoUbH.js} +5 -5
  171. package/server/memory-fts-worker.js +1 -1
  172. package/server/{memory-governor-Cqvbusr4.js → memory-governor-Mi5zF5zw.js} +87 -21
  173. package/server/{memory-pressure-patrol-DPb8foam.js → memory-pressure-patrol-CDeDh46A.js} +38 -14
  174. package/server/{merge-BB_bjJ9a.js → merge-DCuDLiy9.js} +1 -1
  175. package/server/{merge-FZ78_cEz.js → merge-_XIivhkq.js} +3 -3
  176. package/server/{merge-agent-BuoC_PRZ.js → merge-agent-svBDRWB6.js} +2 -2
  177. package/server/{merge-agent-B3jRrlS1.js → merge-agent-zF9vqWqY.js} +31 -31
  178. package/server/{merge-batch-B8bVjFWS.js → merge-batch-BJjzUUL7.js} +1 -1
  179. package/server/{merge-completeness-DQt7Qa7i.js → merge-completeness-CQPqu-pI.js} +4 -4
  180. package/server/{merge-completeness-DkdabVch.js → merge-completeness-CeQheehh.js} +1 -1
  181. package/server/merge-eligibility-CJrBhQQe.js +3 -0
  182. package/server/merge-eligibility-DhxVE8qU.js +51 -0
  183. package/server/merge-ops-CUzpOPtO.js +2 -0
  184. package/server/{merge-rebase-qq40s91P.js → merge-rebase-Bjo45m3k.js} +2 -2
  185. package/server/merge-rebase-DkfcUT60.js +2 -0
  186. package/server/{merge-set-BmRRflt0.js → merge-set-COZvz2nx.js} +4 -4
  187. package/server/{merge-set-BTNYvxM3.js → merge-set-ChxZgjBB.js} +1 -1
  188. package/server/{merge-sync-CJpOa0cZ.js → merge-sync-CCi1Esdx.js} +2 -2
  189. package/server/{merge-sync-0m2Q087q.js → merge-sync-DuJ6Vkl3.js} +1 -1
  190. package/server/{merge-train-iwKqjtCF.js → merge-train-DTJXF8ph.js} +4 -4
  191. package/server/{merge-train-deps-CH5Mr3vN.js → merge-train-deps-C0P0qGKe.js} +4 -4
  192. package/server/{merge-verification-JJc5GC2t.js → merge-verification-C5FexOBZ.js} +6 -6
  193. package/server/{merged-docker-cleanup-worker-CrhTdxZV.js → merged-docker-cleanup-worker-0SEDG3Ao.js} +1 -1
  194. package/server/{merged-docker-cleanup-worker-BOqWA373.js → merged-docker-cleanup-worker-C-kSp_jw.js} +3 -3
  195. package/server/{messaging-nuwStbdQ.js → messaging-DQi-WEFB.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 +28 -28
  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 +10 -5
  211. package/server/node_modules/@types/node/buffer.d.ts +1 -0
  212. package/server/node_modules/@types/node/crypto.d.ts +2 -4
  213. package/server/node_modules/@types/node/dgram.d.ts +119 -4
  214. package/server/node_modules/@types/node/diagnostics_channel.d.ts +4 -4
  215. package/server/node_modules/@types/node/ffi.d.ts +1 -1
  216. package/server/node_modules/@types/node/fs/promises.d.ts +61 -65
  217. package/server/node_modules/@types/node/fs.d.ts +86 -76
  218. package/server/node_modules/@types/node/http.d.ts +18 -2
  219. package/server/node_modules/@types/node/http2.d.ts +12 -4
  220. package/server/node_modules/@types/node/index.d.ts +1 -0
  221. package/server/node_modules/@types/node/inspector.d.ts +2 -1
  222. package/server/node_modules/@types/node/net.d.ts +108 -16
  223. package/server/node_modules/@types/node/package.json +3 -3
  224. package/server/node_modules/@types/node/perf_hooks.d.ts +31 -19
  225. package/server/node_modules/@types/node/process.d.ts +52 -0
  226. package/server/node_modules/@types/node/quic.d.ts +252 -42
  227. package/server/node_modules/@types/node/sqlite.d.ts +6 -2
  228. package/server/node_modules/@types/node/stream/iter.d.ts +4 -4
  229. package/server/node_modules/@types/node/stream/web.d.ts +20 -0
  230. package/server/node_modules/@types/node/test.d.ts +36 -0
  231. package/server/node_modules/@types/node/tls.d.ts +50 -15
  232. package/server/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +5 -0
  233. package/server/node_modules/@types/node/ts5.6/index.d.ts +1 -0
  234. package/server/node_modules/@types/node/ts5.7/index.d.ts +1 -0
  235. package/server/node_modules/@types/node/tty.d.ts +4 -3
  236. package/server/node_modules/@types/node/vfs.d.ts +211 -0
  237. package/server/node_modules/@types/node/vm.d.ts +1 -1
  238. package/server/node_modules/@types/node/zlib.d.ts +17 -0
  239. package/server/node_modules/effect/node_modules/uuid/README.md +19 -19
  240. package/server/node_modules/effect/node_modules/uuid/dist/v1.js +7 -3
  241. package/server/node_modules/effect/node_modules/uuid/dist/v7.js +5 -2
  242. package/server/node_modules/effect/node_modules/uuid/dist-node/v1.js +7 -3
  243. package/server/node_modules/effect/node_modules/uuid/dist-node/v7.js +5 -2
  244. package/server/node_modules/effect/node_modules/uuid/package.json +4 -3
  245. package/server/node_modules/msgpackr/README.md +1 -0
  246. package/server/node_modules/msgpackr/dist/index-no-eval.cjs +13 -7
  247. package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
  248. package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
  249. package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
  250. package/server/node_modules/msgpackr/dist/index.js +13 -7
  251. package/server/node_modules/msgpackr/dist/index.js.map +1 -1
  252. package/server/node_modules/msgpackr/dist/index.min.js +1 -1
  253. package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
  254. package/server/node_modules/msgpackr/dist/node.cjs +13 -7
  255. package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
  256. package/server/node_modules/msgpackr/dist/test.js +63 -7
  257. package/server/node_modules/msgpackr/dist/test.js.map +1 -1
  258. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +11 -5
  259. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
  260. package/server/node_modules/msgpackr/index.d.cts +1 -0
  261. package/server/node_modules/msgpackr/index.d.ts +1 -0
  262. package/server/node_modules/msgpackr/pack.js +2 -2
  263. package/server/node_modules/msgpackr/package.json +1 -1
  264. package/server/node_modules/msgpackr/unpack.js +11 -5
  265. package/server/node_modules/picomatch/lib/parse.js +10 -1
  266. package/server/node_modules/picomatch/lib/scan.js +30 -18
  267. package/server/node_modules/picomatch/package.json +1 -1
  268. package/server/node_modules/protobufjs/dist/light/protobuf.js +59 -6
  269. package/server/node_modules/protobufjs/dist/light/protobuf.js.map +1 -1
  270. package/server/node_modules/protobufjs/dist/light/protobuf.min.js +3 -3
  271. package/server/node_modules/protobufjs/dist/light/protobuf.min.js.map +1 -1
  272. package/server/node_modules/protobufjs/dist/minimal/protobuf.js +22 -2
  273. package/server/node_modules/protobufjs/dist/minimal/protobuf.js.map +1 -1
  274. package/server/node_modules/protobufjs/dist/minimal/protobuf.min.js +3 -3
  275. package/server/node_modules/protobufjs/dist/minimal/protobuf.min.js.map +1 -1
  276. package/server/node_modules/protobufjs/dist/protobuf.js +59 -6
  277. package/server/node_modules/protobufjs/dist/protobuf.js.map +1 -1
  278. package/server/node_modules/protobufjs/dist/protobuf.min.js +3 -3
  279. package/server/node_modules/protobufjs/dist/protobuf.min.js.map +1 -1
  280. package/server/node_modules/protobufjs/package.json +1 -1
  281. package/server/node_modules/protobufjs/src/decoder.js +32 -3
  282. package/server/node_modules/protobufjs/src/reader.js +20 -0
  283. package/server/node_modules/protobufjs/src/wrappers.js +5 -1
  284. package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
  285. package/server/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +3 -2
  286. package/server/node_modules/undici/docs/docs/api/EventSource.md +4 -0
  287. package/server/node_modules/undici/docs/docs/api/Interceptors.md +7 -3
  288. package/server/node_modules/undici/docs/docs/api/Socks5ProxyAgent.md +7 -1
  289. package/server/node_modules/undici/lib/cache/memory-cache-store.js +2 -2
  290. package/server/node_modules/undici/lib/core/symbols.js +2 -0
  291. package/server/node_modules/undici/lib/dispatcher/agent.js +7 -2
  292. package/server/node_modules/undici/lib/dispatcher/balanced-pool.js +7 -4
  293. package/server/node_modules/undici/lib/dispatcher/client-h1.js +12 -4
  294. package/server/node_modules/undici/lib/dispatcher/client-h2.js +43 -3
  295. package/server/node_modules/undici/lib/dispatcher/client.js +3 -2
  296. package/server/node_modules/undici/lib/dispatcher/dispatcher-base.js +13 -1
  297. package/server/node_modules/undici/lib/dispatcher/dispatcher.js +15 -1
  298. package/server/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +3 -0
  299. package/server/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +10 -3
  300. package/server/node_modules/undici/lib/dispatcher/proxy-agent.js +18 -1
  301. package/server/node_modules/undici/lib/dispatcher/retry-agent.js +3 -0
  302. package/server/node_modules/undici/lib/dispatcher/round-robin-pool.js +1 -1
  303. package/server/node_modules/undici/lib/dispatcher/socks5-proxy-agent.js +91 -21
  304. package/server/node_modules/undici/lib/handler/cache-handler.js +29 -5
  305. package/server/node_modules/undici/lib/handler/decorator-handler.js +7 -1
  306. package/server/node_modules/undici/lib/handler/deduplication-handler.js +12 -6
  307. package/server/node_modules/undici/lib/handler/redirect-handler.js +21 -4
  308. package/server/node_modules/undici/lib/handler/retry-handler.js +148 -30
  309. package/server/node_modules/undici/lib/interceptor/cache.js +65 -12
  310. package/server/node_modules/undici/lib/interceptor/decompress.js +115 -13
  311. package/server/node_modules/undici/lib/interceptor/deduplicate.js +5 -4
  312. package/server/node_modules/undici/lib/interceptor/dns.js +7 -0
  313. package/server/node_modules/undici/lib/interceptor/dump.js +10 -23
  314. package/server/node_modules/undici/lib/mock/mock-agent.js +13 -1
  315. package/server/node_modules/undici/lib/mock/mock-utils.js +11 -10
  316. package/server/node_modules/undici/lib/util/cache.js +45 -3
  317. package/server/node_modules/undici/lib/web/cookies/parse.js +150 -147
  318. package/server/node_modules/undici/lib/web/eventsource/eventsource-stream.js +28 -1
  319. package/server/node_modules/undici/lib/web/eventsource/eventsource.js +13 -3
  320. package/server/node_modules/undici/lib/web/fetch/index.js +6 -0
  321. package/server/node_modules/undici/lib/web/fetch/request.js +2 -3
  322. package/server/node_modules/undici/lib/web/fetch/util.js +6 -1
  323. package/server/node_modules/undici/lib/web/webidl/index.js +3 -3
  324. package/server/node_modules/undici/lib/web/websocket/connection.js +1 -1
  325. package/server/node_modules/undici/lib/web/websocket/permessage-deflate.js +5 -0
  326. package/server/node_modules/undici/lib/web/websocket/stream/websocketstream.js +8 -10
  327. package/server/node_modules/undici/package.json +3 -3
  328. package/server/node_modules/undici/types/client.d.ts +10 -0
  329. package/server/node_modules/undici/types/interceptors.d.ts +2 -0
  330. package/server/node_modules/undici/types/mock-agent.d.ts +11 -10
  331. package/server/node_modules/undici/types/socks5-proxy-agent.d.ts +2 -0
  332. package/server/node_modules/undici-types/client.d.ts +8 -3
  333. package/server/node_modules/undici-types/connector.d.ts +1 -0
  334. package/server/node_modules/undici-types/cookies.d.ts +1 -1
  335. package/server/node_modules/undici-types/dispatcher.d.ts +3 -3
  336. package/server/node_modules/undici-types/errors.d.ts +10 -0
  337. package/server/node_modules/undici-types/fetch.d.ts +5 -1
  338. package/server/node_modules/undici-types/handlers.d.ts +2 -0
  339. package/server/node_modules/undici-types/interceptors.d.ts +1 -1
  340. package/server/node_modules/undici-types/mock-interceptor.d.ts +5 -1
  341. package/server/node_modules/undici-types/package.json +1 -1
  342. package/server/node_modules/undici-types/proxy-agent.d.ts +7 -0
  343. package/server/{orphan-proposed-reconciler-gf4TxfZb.js → orphan-proposed-reconciler--V8GIzmY.js} +2 -2
  344. package/server/{orphan-proposed-reconciler-Dmk0kO_p.js → orphan-proposed-reconciler-BSsKWmsB.js} +21 -21
  345. package/server/package-lock.json +29 -29
  346. package/server/package.json +1 -1
  347. package/server/{pan-dir-BMda7tQj.js → pan-dir-COaYhZel.js} +4 -4
  348. package/server/{parked-residue-BiHb8cD7.js → parked-residue-Dvr4W9P6.js} +68 -64
  349. package/server/{paths-DEe9j-kw.js → paths-Cm1Q7Old.js} +2 -2
  350. package/server/{pending-lifecycle-claim-J5uIIJPu.js → pending-lifecycle-claim-yAwDuGS4.js} +1 -1
  351. package/server/{pickup-D1UbSDPd.js → pickup-Dle6k9Xt.js} +1 -1
  352. package/server/{pipeline-agent-reader-D-6okryb.js → pipeline-agent-reader-DCCwbUj8.js} +3 -3
  353. package/server/{pipeline-membership-PGX3Pe8V.js → pipeline-membership-BV4hdkHm.js} +1 -1
  354. package/server/{pipeline-membership-CCbgBzNC.js → pipeline-membership-C9ykcjsn.js} +1 -1
  355. package/server/{pipeline-membership-gather-BRhU7XPx.js → pipeline-membership-gather-DGoDOfKO.js} +1 -1
  356. package/server/{pipeline-membership-gather-BK4dzh0X.js → pipeline-membership-gather-UN7kHpCD.js} +10 -10
  357. package/server/{pipeline-notifier-BNAV9kpa.js → pipeline-notifier-DfH2i_zP.js} +2 -2
  358. package/server/{pipeline-notifier-DvHLaXKb.js → pipeline-notifier-DsCfxoSU.js} +1 -1
  359. package/server/{post-merge-lifecycle-worker-DAWgzXQA.js → post-merge-lifecycle-worker-V51p8tSm.js} +2 -2
  360. package/server/{post-merge-state-DC2_0t12.js → post-merge-state-Cym5NVlB.js} +4 -4
  361. package/server/{prd-locations-BbAvqQmT.js → prd-locations-CPuMD55x.js} +3 -3
  362. package/server/{project-pipelines-By_5WcT4.js → project-pipelines-DdDKdXrG.js} +2 -2
  363. package/server/{project-repos-3bI6t4fO.js → project-repos-CNrLxJDg.js} +1 -1
  364. package/server/{project-repos--QeCg7yQ.js → project-repos-DqAT7YV6.js} +2 -2
  365. package/server/{project-resource-refresh-queue-BaZC79S3.js → project-resource-refresh-queue-C-umDazS.js} +1 -1
  366. package/server/{project-resource-refresh-queue-x-K9mvpP.js → project-resource-refresh-queue-Dh8k2SB7.js} +17 -17
  367. package/server/{projects-LftaVK99.js → projects-Crur9uCa.js} +1 -1
  368. package/server/{prompts-BotGu-6W.js → prompts-CvtVJUpG.js} +2 -2
  369. package/server/{providers-BL1I66sM.js → providers-1BlEh5x1.js} +7 -7
  370. package/server/{providers-Dqgz3MY5.js → providers-Bun8zer5.js} +1 -1
  371. package/server/public/assets/{chunk-BO2N2NFS-D5Fz5jND.js → chunk-BO2N2NFS-DzUNVdeo.js} +4 -4
  372. package/server/public/assets/{diagram-OG6HWLK6-Eux0gWFq.js → diagram-OG6HWLK6-D5iThVwA.js} +1 -1
  373. package/server/public/assets/{dist-D-JX_u7m.js → dist-BLq-IR2D.js} +3 -3
  374. package/server/public/assets/{dist-C3zShwhA.js → dist-RyrOs5EF.js} +1 -1
  375. package/server/public/assets/{ganttDiagram-6RSMTGT7-UH3aweia.js → ganttDiagram-6RSMTGT7-n8bUPXAS.js} +1 -1
  376. package/server/public/assets/{highlighted-body-OFNGDK62-ccIQ-WXS.js → highlighted-body-OFNGDK62-1npo3yiG.js} +1 -1
  377. package/server/public/assets/{index-BTVcdPve.js → index-BvN8bWpz.js} +149 -149
  378. package/server/public/assets/index-DgoS288w.css +1 -0
  379. package/server/public/assets/{linear-Cnnu4YQy.js → linear-Dd96gky1.js} +1 -1
  380. package/server/public/assets/mermaid-GHXKKRXX-fP93Za-W.js +1 -0
  381. package/server/public/assets/{pieDiagram-4H26LBE5-BD8-Tye6.js → pieDiagram-4H26LBE5-CynZvpYP.js} +1 -1
  382. package/server/public/assets/{prod-Ca6aKMts.js → prod-DBuCX9g-.js} +4 -4
  383. package/server/public/assets/{quadrantDiagram-W4KKPZXB-BmSrVyFD.js → quadrantDiagram-W4KKPZXB-BNlEKLKN.js} +1 -1
  384. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CEGy8Das.js → sankeyDiagram-5OEKKPKP-Cq0AMnkD.js} +1 -1
  385. package/server/public/assets/{xychartDiagram-2RQKCTM6-VnQ8iY8s.js → xychartDiagram-2RQKCTM6-D7GXcBy2.js} +1 -1
  386. package/server/public/index.html +2 -2
  387. package/server/pull-requests-DV_rJ-1u.js +2 -0
  388. package/server/{pull-requests-Cp_FDT8-.js → pull-requests-DrhWU9MW.js} +3 -3
  389. package/server/{rally-bQpBzUNf.js → rally-D5QkIZeb.js} +3 -3
  390. package/server/rally-DlXjOIAG.js +3 -0
  391. package/server/{rally-api-Ij1Zt0NI.js → rally-api-BdNfpNGk.js} +1 -1
  392. package/server/{rally-api-CqAIJ8RX.js → rally-api-CNlcoTFM.js} +2 -2
  393. package/server/{rally-client-CN5vh4Ac.js → rally-client-BCU7mVWE.js} +1 -1
  394. package/server/{rally-client-qKbCNRVW.js → rally-client-C3eB9TM-.js} +4 -4
  395. package/server/{rebuild-stack-DrMyA_mA.js → rebuild-stack-BupKggo5.js} +2 -2
  396. package/server/{rebuild-stack-BNOMVh7C.js → rebuild-stack-CNknXJHL.js} +6 -6
  397. package/server/reconciler-ComAOr_F.js +657 -0
  398. package/server/{reconstruct-cache-mxIYCnqs.js → reconstruct-cache-DbjgwKRi.js} +7 -7
  399. package/server/{record-Ug18Cp4V.js → record-C4JJCL2f.js} +1 -1
  400. package/server/{record-update-WyhsREoH.js → record-update-CWwZsp9Y.js} +1 -1
  401. package/server/{record-update-dBGxL9OC.js → record-update-Cl56NqoQ.js} +5 -5
  402. package/server/{recovery-trip-BKLrL6NX.js → recovery-trip-DA7tCXbp.js} +3 -3
  403. package/server/{recovery-trip-wFAixKsg.js → recovery-trip-DFtSA8h5.js} +1 -1
  404. package/server/{release-engine-D9gaCBn9.js → release-engine-Dk99C48O.js} +5 -5
  405. package/server/{release-set-DPHHzEGx.js → release-set-x8KH3nrE.js} +3 -3
  406. package/server/{remote-BUEeUic6.js → remote-BMZmJC5E.js} +3 -3
  407. package/server/{remote-BU6ONLpv.js → remote-DyZIg94K.js} +3 -3
  408. package/server/{remote-agents-CSaTLi3u.js → remote-agents-Blb0vO_M.js} +6 -6
  409. package/server/{remote-agents-BVtASiOF.js → remote-agents-MbWzm5Fh.js} +1 -1
  410. package/server/{remote-completion-CBV3b9TI.js → remote-completion-Bcd13o-J.js} +12 -12
  411. package/server/{resolver-DvSMXty7.js → resolver-CZVWKCx0.js} +7 -7
  412. package/server/{resolver-gxv97jsQ.js → resolver-tJeEkPK5.js} +2 -2
  413. package/server/{resume-DvHuF-bm.js → resume-DmF2andq.js} +1 -1
  414. package/server/{review-agent-esZ0QXdY.js → review-agent-CmJeQc0K.js} +30 -30
  415. package/server/{review-agent-DgkUPRx0.js → review-agent-DM9S22BL.js} +2 -2
  416. package/server/{review-artifacts-DGGEobLp.js → review-artifacts-DCiaejJK.js} +6 -6
  417. package/server/{review-convoy-liveness-DmO8dIBH.js → review-convoy-liveness-C9F1Q1LN.js} +8 -8
  418. package/server/{review-run-recovery-Ct0q7FkE.js → review-run-recovery-C5TEICtx.js} +2 -2
  419. package/server/{review-run-recovery-DHiiw7d8.js → review-run-recovery-CRGBh7xs.js} +1 -1
  420. package/server/{review-status-yOGD2MuK.js → review-status-C3PJkfjv.js} +55 -45
  421. package/server/{review-status-C_kQeeX0.js → review-status-CDs0jQV6.js} +1 -1
  422. package/server/{review-status-emit-BZz1Y_22.js → review-status-emit-De6PF3ZH.js} +3 -3
  423. package/server/{review-status-enrichment-BWH0XW_m.js → review-status-enrichment-CclcG8jk.js} +3 -3
  424. package/server/{review-status-sync-Bq00Loey.js → review-status-sync-B3GKewT_.js} +1 -1
  425. package/server/{review-status-sync-2C9lk85r.js → review-status-sync-wvgdR1yZ.js} +11 -8
  426. package/server/{review-verdict-feedback-CE_tr2iQ.js → review-verdict-feedback-20s9pG0w.js} +7 -7
  427. package/server/{review-verdict-feedback-Brjaxoda.js → review-verdict-feedback-DkMx_cKj.js} +1 -1
  428. package/server/{review-verdict-writer-Ca2V7QSY.js → review-verdict-writer-BcG5RBWF.js} +7 -7
  429. package/server/{review-verdict-writer-CD-4kDVx.js → review-verdict-writer-CaJPCD-q.js} +1 -1
  430. package/server/{rollup-B6g9Nr6L.js → rollup-C-GXHbTG.js} +8 -8
  431. package/server/{rollup--g9ik1XQ.js → rollup-DR250WyW.js} +1 -1
  432. package/server/{scanner-YxIv-fG1.js → scanner-BEAzmMNs.js} +18 -11
  433. package/server/{search-DqMN4__-.js → search-BN0MYpZW.js} +2 -2
  434. package/server/{sequence-io--b3_PsWq.js → sequence-io-BmVO0K-_.js} +4 -4
  435. package/server/{sequencer-agent-CqouKVZG.js → sequencer-agent-CuA9PA_R.js} +6 -6
  436. package/server/server.js +599 -290
  437. package/server/{service-CEp-3iow.js → service-D1SZCxH8.js} +77 -772
  438. package/server/{session-fork-GtoeCh2H.js → session-fork--SMYFKVu.js} +2 -2
  439. package/server/{settings-Ch2pCVtt.js → settings-CETdzCl6.js} +3 -3
  440. package/server/{settings-CLQcdkoD.js → settings-CFi7CdJo.js} +2 -2
  441. package/server/settings-EGNbGKpP.js +2 -0
  442. package/server/{shadow-engineering-BxiFrIKv.js → shadow-engineering-CNTXaC9O.js} +2 -2
  443. package/server/{shadow-state-nGhCNXT2.js → shadow-state-6jSyeXQ7.js} +1 -1
  444. package/server/{shadow-state-CSA1vtxr.js → shadow-state-CtYJGNXt.js} +2 -2
  445. package/server/{shadow-utils-7q5QDmMj.js → shadow-utils-Cq5eMfwI.js} +2 -2
  446. package/server/{ship-log-ie0A_SqV.js → ship-log-D-CphNZx.js} +1 -1
  447. package/server/{ship-record-BM3oVvnL.js → ship-record-STA0P11l.js} +5 -5
  448. package/server/{ship-record-DHWH1hLz.js → ship-record-neN0oUI9.js} +1 -1
  449. package/server/{ship-status-BEkddXMT.js → ship-status-DzDpufmj.js} +2 -2
  450. package/server/{smart-compaction-BkzjVpWL.js → smart-compaction-CdtKIcDk.js} +1 -1
  451. package/server/{smart-compaction-D0TE1lBD.js → smart-compaction-tndAhwoc.js} +7 -7
  452. package/server/{spawn-planning-session-s406rw1N.js → spawn-planning-session-1XLgDLjR.js} +2 -2
  453. package/server/{spawn-planning-session-CkGweSCC.js → spawn-planning-session-CAncCBLX.js} +17 -17
  454. package/server/{specialist-completion-CTAjwH5j.js → specialist-completion-BMv3K54P.js} +1 -1
  455. package/server/{specialist-context-CKasRfYu.js → specialist-context-B054OP_a.js} +5 -5
  456. package/server/{specialist-handoff-logger-DrjrOmmn.js → specialist-handoff-logger-B7jzypoX.js} +2 -2
  457. package/server/{specialist-logs-Du6quZ0_.js → specialist-logs-DVhOLpwy.js} +3 -3
  458. package/server/{specialists-x-kPMhrL.js → specialists-8Pc--yZI.js} +2 -2
  459. package/server/{specialists-B-4zyE4Y.js → specialists-BVBIMc4L.js} +1 -1
  460. package/server/{specialists-b0dMMjWq.js → specialists-CC_Mnc47.js} +333 -118
  461. package/server/{specialists-CuDWiNdB.js → specialists-ChvCD2a-.js} +19 -19
  462. package/server/{specialists-registry-BYjs04iK.js → specialists-registry-Cim1fPcM.js} +2 -2
  463. package/server/{specialists-registry-1y6Rt_F1.js → specialists-registry-CoPNlhud.js} +1 -1
  464. package/server/specs-Dvq4sOy6.js +3 -0
  465. package/server/{src-CZsPs61V.js → src-C7gGe4KU.js} +6 -6
  466. package/server/{src-CY2Wl8IX.js → src-CdwN6WY6.js} +8 -2
  467. package/server/{src-DeQwpuh6.js → src-DMosbuSJ.js} +3 -3
  468. package/server/{stack-health-ypIKtkbE.js → stack-health-CvdnSVBV.js} +1 -1
  469. package/server/{stack-health-BQFSJc0l.js → stack-health-DPXaoAus.js} +3 -3
  470. package/server/{stale-task-claims-C2e1zdMT.js → stale-task-claims-UoNLemTn.js} +5 -5
  471. package/server/{staleness-Fzx_3_Hr.js → staleness-CxZaIhrn.js} +1 -1
  472. package/server/{staleness-CRDK6LFG.js → staleness-r_dkMyMG.js} +1 -1
  473. package/server/{stall-sweeper-QNk4h9m6.js → stall-sweeper-C9S8FYKz.js} +8 -8
  474. package/server/{state-home-DdG8erBI.js → state-home-BhI8O5lU.js} +2 -2
  475. package/server/{state-migrate-C6H3jfHE.js → state-migrate-DtFHcOVZ.js} +6 -6
  476. package/server/{state-mirror-DF4Lfxm0.js → state-mirror-CpuHFxHb.js} +3 -3
  477. package/server/{stuck-remediation-BDa_tXgB.js → stuck-remediation-B4nKm7B2.js} +13 -13
  478. package/server/{stuck-remediation-BVNd9txd.js → stuck-remediation-hSOOYB9B.js} +1 -1
  479. package/server/{substrate-bug-weights-service-BbbCZEtJ.js → substrate-bug-weights-service-B9f0063E.js} +3 -3
  480. package/server/{summary-fork-BvcW6bq0.js → summary-fork-CUyEqFyc.js} +14 -15
  481. package/server/{summary-fork-DIQmtOuV.js → summary-fork-DZcsOvDD.js} +2 -2
  482. package/server/{supervisor-D3jC2c7A.js → supervisor-CGtOs9Em.js} +4 -4
  483. package/server/supervisor-DoJpD33i.js +2 -0
  484. package/server/{swarm-readiness-CMWAQuWM.js → swarm-readiness-0N2p9d2C.js} +3 -3
  485. package/server/{synthesis-verdict-C-pJOPsn.js → synthesis-verdict-CJdseCuz.js} +1 -1
  486. package/server/{synthesis-verdict-DVlrLF9A.js → synthesis-verdict-CQdLbK1-.js} +2 -2
  487. package/server/{system-prerequisites-QKtIYXI2.js → system-prerequisites-DkDOEjQP.js} +2 -2
  488. package/server/{teardown-workspace-cJea1OLo.js → teardown-workspace-BxFMcWu7.js} +16 -16
  489. package/server/{test-agent-queue-C5DI_gWX.js → test-agent-queue-Dxeae55k.js} +6 -6
  490. package/server/{test-verdict-C7kmd2_Y.js → test-verdict-CJ-to_Hc.js} +1 -1
  491. package/server/{test-verdict-DUbDHqeD.js → test-verdict-hW5kILg7.js} +2 -2
  492. package/server/{tldr-daemon-BNQHwblU.js → tldr-daemon-DKCumqHU.js} +1 -1
  493. package/server/{tldr-daemon-CO08YlfQ.js → tldr-daemon-caxXegkF.js} +2 -2
  494. package/server/{tmux-B8zsqD_6.js → tmux-C-hxv71f.js} +2 -2
  495. package/server/{tmux-DWEc4Ld9.js → tmux-CvAEO9yo.js} +2 -2
  496. package/server/{token-Bez-qCB2.js → token-BdfZLRg1.js} +1 -1
  497. package/server/{tracker-config-CJzPhSHv.js → tracker-config-BjqwtkcT.js} +2 -2
  498. package/server/{tracker-utils-DJAOAuMN.js → tracker-utils-0cDe6yil.js} +2 -2
  499. package/server/{traefik-connect-D3H5I6b9.js → traefik-connect-DoQvQ6oJ.js} +1 -1
  500. package/server/{tunnel-BSdKnW0U.js → tunnel-BEM7-jgE.js} +1 -1
  501. package/server/{tunnel-Cr3ctqxp.js → tunnel-SgALz_Pi.js} +3 -3
  502. package/server/{types-fzBp9cYi.js → types-PW4zkxCM.js} +1 -1
  503. package/server/{uat-failure-feedback-IZQ-J8jt.js → uat-failure-feedback-BQzpUFQ6.js} +5 -5
  504. package/server/{uat-promote-verification-DXApKcc2.js → uat-promote-verification-BUltWC-b.js} +5 -5
  505. package/server/{uat-train-CycEzpbE.js → uat-train-B71QG16n.js} +1 -1
  506. package/server/{uat-train-IIZlz7r3.js → uat-train-BLJ0AAIc.js} +0 -0
  507. package/server/{validate-Ur4xH5bN.js → validate-DqEp2Yb9.js} +3 -3
  508. package/server/{validation-Dr6V4PXx.js → validation-DHEsL3RP.js} +4 -4
  509. package/server/{validation-CHovCoTT.js → validation-k4EpMHm0.js} +1 -1
  510. package/server/{verification-artifact-D3viYe_t.js → verification-artifact-Cmhgq4b_.js} +1 -1
  511. package/server/{verification-artifact-k5Ftpg0c.js → verification-artifact-DglwaHke.js} +1 -1
  512. package/server/{verification-runner-Dl13mmsI.js → verification-runner-BC_zNOq5.js} +16 -16
  513. package/server/{verification-runner-BuqGwm2t.js → verification-runner-Bbc-8BbR.js} +1 -1
  514. package/server/{vtt-parser-BSnAB-Og.js → vtt-parser-Va--tv27.js} +1 -1
  515. package/server/{work-agent-prompt-CJJ4tXci.js → work-agent-prompt-CQWlmw_y.js} +1 -1
  516. package/server/{work-agent-prompt-CioeOuM4.js → work-agent-prompt-DM3uza0_.js} +10 -10
  517. package/server/{work-agent-start-Ct1HVh6z.js → work-agent-start-BColr1oI.js} +1 -1
  518. package/server/{work-agent-start-B65Gqn9N.js → work-agent-start-cKf7rly8.js} +2 -2
  519. package/server/workflows-CLrEiTds.js +2 -0
  520. package/server/{workflows-AgFul1xc.js → workflows-DrC85n8j.js} +28 -28
  521. package/server/{workspace-Cy4sDd3q.js → workspace-ChRFy_F9.js} +3 -3
  522. package/server/{workspace-Cu3XlMXt.js → workspace-G3Cus8e9.js} +1 -1
  523. package/server/{workspace-anchor-drift-BI0Hz6zI.js → workspace-anchor-drift-DBbyK_Mf.js} +1 -1
  524. package/server/{workspace-anchor-drift-CMaqvizr.js → workspace-anchor-drift-z7TjOORC.js} +4 -4
  525. package/server/{workspace-config-DRYDO7Zr.js → workspace-config-D-bNq2CF.js} +1 -1
  526. package/server/{workspace-manager-CgovxDrO.js → workspace-manager-Db3pCmr7.js} +16 -16
  527. package/server/{workspace-manager-jfkKAEuO.js → workspace-manager-gz9Amovn.js} +1 -1
  528. package/server/{workspace-metadata-BNzODIv6.js → workspace-metadata-C5Ie2FMZ.js} +2 -2
  529. package/server/{workspace-metadata-BDqXzGGK.js → workspace-metadata-Do-L6GFP.js} +1 -1
  530. package/server/{workspaces-BJdPqx_J.js → workspaces-D0MWw7Mx.js} +123 -696
  531. package/sync-sources/rules/agent-message-delivery.md +21 -14
  532. package/sync-sources/rules/pan-handoff-focus-limit.md +3 -1
  533. package/sync-sources/skills/pan-gauntlet-loop/SKILL.md +94 -46
  534. package/sync-sources/skills/pan-handoff/SKILL.md +13 -2
  535. package/server/archive-planning-BW4MKNI7.js +0 -2
  536. package/server/build-info-Bj2vQEMh.js +0 -2
  537. package/server/cli-BRuzUT_I.js +0 -2
  538. package/server/dead-end-trip-6V_CwveT.js +0 -2
  539. package/server/deploy-queue-CjLErpgw.js +0 -2
  540. package/server/dist-fCA6y2bH.js +0 -3
  541. package/server/forge-bvak6vXJ.js +0 -2
  542. package/server/hume-TYTb6fDU.js +0 -3
  543. package/server/inspect-agent-JFEaYTRa.js +0 -2
  544. package/server/merge-ops-DabXHp2i.js +0 -2
  545. package/server/merge-rebase-CXq0qsgR.js +0 -2
  546. package/server/public/assets/index-2wV4ipy_.css +0 -1
  547. package/server/public/assets/mermaid-GHXKKRXX-Bjto8iJh.js +0 -1
  548. package/server/pull-requests-jVGcVq5G.js +0 -2
  549. package/server/rally-CxhVgIQ6.js +0 -3
  550. package/server/settings-DhtPDmmI.js +0 -2
  551. package/server/specs-IYsFlM-L.js +0 -3
  552. package/server/supervisor-v0cYN2Vp.js +0 -2
  553. package/server/workflows-CfHm8lVd.js +0 -2
  554. 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-OoH-ZpTb.js";
3
+ import { i as shouldRefuseHostDashboardPort, n as isNonPrimaryCheckoutRoot, r as readHostDashboardApiPort, t as getDashboardIdentity } from "./identity-CZbJ0xpl.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-CC_Mnc47.js";
5
+ import { h as loadConfigSync$1, p as init_config, s as getDashboardApiUrlSync } from "./config-Cx3N6gWz.js";
6
+ import { c as emitDashboardLifecycleSync, l as init_activity_logger, o as emitActivityEntrySync, s as emitActivityTtsSync, t as appendDomainEventAsync } from "./activity-logger-ru8ggv-d.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-BbSWNOpH.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-Cl56NqoQ.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-CvAEO9yo.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-tJeEkPK5.js";
12
+ import { a as init_event_store, i as initEventStore, n as getEventStore } from "./event-store-DbjldlXW.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-LgYeE1o2.js";
15
+ import { c as init_agents, g as logAgentLifecycleSync, h as init_persistent_logger, n as AgentsResolverLive, u as listAllAgentsSync } from "./agents-DMs1aLRU.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-Cm1Q7Old.js";
17
+ import { i as recordBriefingSessionStart, n as ensureSessionContextBriefingFile, r as init_briefing_freshness, t as appendFreshBriefingUpdate } from "./briefing-freshness-FF0WLPMc.js";
18
+ import { n as listFeatureRegistryEntries, t as init_feature_registry_storage } from "./feature-registry-storage-BzAGS4DA.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-CkXA-F6Z.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-Bdud_B1j.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-Bq_dyq9k.js";
22
+ import { a as collectCodexCostEvents, i as CostWriter, n as CostResolver, r as CostResolverLive, s as recordSkipVerdict, t as CostDoorLive } from "./cost-DR57uJFP.js";
23
+ import { t as init_behavior } from "./behavior-CPX0E2Fj.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-BnyNoDWQ.js";
25
+ import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-KxOILHX8.js";
26
+ import { i as init_settings, r as getMemoryWorkerConcurrency, t as areMemoryObservationsEnabled } from "./settings-CETdzCl6.js";
27
+ import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers$1 } from "./providers-1BlEh5x1.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-L_2OxNJf.js";
29
+ import { i as ensureInternalTokenSync, o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-CUKcTWSG.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-JyrMSeOh.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-C1avLtkk.js";
32
+ import { a as init_claude_permissions, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-Bn53HCXr.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-D88iFkP-.js";
34
+ import { l as init_codex, s as findRolloutPath } from "./codex-DSs-3aOm.js";
35
+ import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-BuakhXkB.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-BgzG56av.js";
39
+ import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-CISjc9FR.js";
40
+ import { a as loadCloisterConfigSync, o as saveCloisterConfigSync, r as init_config$1, s as shouldAutoStart } from "./config-DP0VV7rX.js";
41
+ import { a as init_state_home, c as isStateMigrated, i as ensureStateWorktree, r as clearStateMigrationCache, s as inspectStateMigration } from "./state-home-BhI8O5lU.js";
42
+ import { i as checkPrdGateSync, s as promoteWorkspacePrdDraft, t as init_pan_dir } from "./pan-dir-COaYhZel.js";
43
+ import { a as init_lifecycle_io, t as appendContinueSessionEntryForIssue } from "./lifecycle-io-CCCAMefe.js";
44
+ import { a as init_tracker_config, i as initTrackerConfigCache, n as getLinearApiKey, r as getRallyConfig, t as getGitHubConfig } from "./tracker-config-BjqwtkcT.js";
45
+ import { r as init_swarm_readiness, t as analyzeSwarmReadiness } from "./swarm-readiness-0N2p9d2C.js";
46
+ import { n as AgentStateServiceLive } from "./agent-state-service-D95wBjA3.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-fpL-qJEa.js";
49
+ import { r as GitHubClientOptionalLive, t as GitHubClient } from "./github-client-wqbDCmlL.js";
50
+ import { r as RallyClientOptionalLive, t as RallyClient } from "./rally-client-C3eB9TM-.js";
51
+ import { n as resolveGitHubIssueSync, r as resolveTrackerTypeSync, t as init_tracker_utils } from "./tracker-utils-0cDe6yil.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-Bsb0GaY8.js";
53
+ import { a as setPipelineHandlerSync, t as init_pipeline_notifier } from "./pipeline-notifier-DfH2i_zP.js";
54
+ import { a as getMergeBlockerReconcileCandidates, l as init_review_status_sync } from "./review-status-sync-wvgdR1yZ.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-CCi1Esdx.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-C3PJkfjv.js";
57
+ import { a as clearQueryExpansionCache, i as resolveKnowledgeBundleRoot, n as init_injection, o as init_query_expansion, r as injectPromptTimeMemory } from "./injection-BSnn_10a.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-BN0MYpZW.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-Co8ZhyUJ.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-D0MWw7Mx.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-zgLM2g2D.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-BJ8Hg-yD.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-BEAzmMNs.js";
65
+ import { c as tailEventsSync, n as deduplicateEventsSync, s as readEventsSync } from "./events-Bb2x5ijT.js";
66
+ import { n as recordBackgroundAiCost, t as init_cost } from "./cost-MZ7EZFDc.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-B9f0063E.js";
68
+ import { i as reclassifyUnknownCostEventsSync, n as reconcile$1, r as recordCostEventsThroughOverdeck, t as collectPiCostEvents } from "./reconciler-ComAOr_F.js";
69
+ import { n as writeSequenceMd, t as parseSequenceMd } from "./sequence-io-BmVO0K-_.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-D5FchYg4.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-Mi5zF5zw.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-Db3pCmr7.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-C7qZxRuW.js";
77
+ import { a as generateHealthSummary, n as readCloisterStateFile, o as getAgentHealth, s as getAgentsNeedingAttention, t as getCloisterService } from "./service-D1SZCxH8.js";
78
+ import { i as getRuntimeForAgent } from "./agent-idle-CQlwmcRR.js";
79
+ import { a as getShadowState, s as init_shadow_state } from "./shadow-state-CtYJGNXt.js";
80
+ import { n as init_issue_closed, t as clearIssueClosedCache } from "./issue-closed-DZEwD3ol.js";
81
+ import { r as parseArtifactRef } from "./forge-B08cRXEb.js";
82
+ import "./parked-residue-Dvr4W9P6.js";
83
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-Dgrma-L1.js";
84
+ import { t as init_specialists } from "./specialists-ChvCD2a-.js";
85
+ import { a as getReviewerSessionName } from "./specialists-registry-Cim1fPcM.js";
86
+ import { a as readPrdContent, r as findPrdAnywhereSync } from "./prd-locations-CPuMD55x.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-UN7kHpCD.js";
90
+ import { a as spawnPlanningSession, r as resolveAutoSpawnOnFinalize } from "./spawn-planning-session-CAncCBLX.js";
91
+ import { r as computeMergeQueueFromCandidates, s as listEligibleCandidatesByProject } from "./flywheel-merge-order-BTY73Efv.js";
92
+ import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-C5Ie2FMZ.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-Blb0vO_M.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-Dh8k2SB7.js";
95
+ import { r as spawnInspectAgent } from "./inspect-agent-DS8j2v6U.js";
96
+ import { r as lookupPullRequestNumberForBranch, t as githubPrLookupSource } from "./github-pr-lookup-DdLCDdu9.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-DrhWU9MW.js";
98
+ import { n as DOD_ROWS } from "./dod-BAk5arLF.js";
99
+ import { n as resolveParkedPopulation, r as summarizeParked } from "./resolver-CZVWKCx0.js";
100
+ import { a as readCurrentStatus, l as maybeTriggerStatusRollup, s as readRecentObservations, u as writePendingTurn } from "./rollup-C-GXHbTG.js";
101
+ import { r as isExtendedReviewEnabled } from "./review-agent-CmJeQc0K.js";
102
+ import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-caxXegkF.js";
103
+ import { S as ensureSyncGitQuiescent, x as listGitOperationsSync } from "./merge-agent-zF9vqWqY.js";
104
+ import { t as readVerificationArtifact } from "./verification-artifact-DglwaHke.js";
105
+ import { t as getAgentCommandSync } from "./settings-CFi7CdJo.js";
106
+ import { r as isRemoteAvailable, t as createFlyProviderFromConfig } from "./remote-DyZIg94K.js";
107
+ import { n as init_claude_settings_overlay, t as detectProviderEnvConflicts } from "./claude-settings-overlay-CqJZjFqv.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-CUyEqFyc.js";
109
+ import { a as init_conversation_compaction, c as shouldInterceptManualCompact, n as compactConversationNative, o as isCompacting } from "./conversation-compaction-dFx_2wpa.js";
110
+ import { n as loadShipRecords, r as publicShipStatus, t as aggregateGenerationShipStatus } from "./ship-status-DzDpufmj.js";
111
+ import { t as init_context_layers } from "./context-layers-LY5zt0da.js";
112
+ import { n as init_merge_eligibility, r as isMergeEligible, t as gatherMergeEligibility } from "./merge-eligibility-DhxVE8qU.js";
113
+ import { a as appendLinearMcpAuthHealthyEvent, r as appendLinearMcpAuthCallbackRelayedEvent, u as resolveLinearMcpAuthIntervention } from "./linear-mcp-auth-nAYWoUbH.js";
114
+ import { i as getMergeBlockersPayload, n as hasOrderIssuePrd, r as validateBookForStart, t as createOrderPrdLookup } from "./validate-DqEp2Yb9.js";
115
+ import { i as spawnSequencerAgent, n as clearFinishedSequencerRun, r as getSequencerRunStatus, t as SEQUENCER_AGENT_ID } from "./sequencer-agent-CuA9PA_R.js";
116
+ import { n as sameCanonicalReviewStatus, t as emitReviewStatusChanged } from "./review-status-emit-De6PF3ZH.js";
117
+ import "./supervisor-CGtOs9Em.js";
118
+ import { l as startUatTrainReconciler, u as stopUatTrainReconciler } from "./uat-train-BLJ0AAIc.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-Ds83fUb1.js";
121
+ import { r as readPendingDeploy } from "./deploy-queue-EcksuKE2.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-BdkVgjxC.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-1XLgDLjR.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-BdkVgjxC.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-BdkVgjxC.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-CLrEiTds.js");
815
+ const { resolveProjectFromIssueSync } = await import("./projects-Crur9uCa.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-gz9Amovn.js");
875
+ const { loadProjectsConfigSync } = await import("./projects-Crur9uCa.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-gz9Amovn.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-gz9Amovn.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-BjMV_gdX.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-BdeB5RIY.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-BdeB5RIY.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-BdeB5RIY.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-COEqWNKE.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-CDs0jQV6.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-CMpSB9sn.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-CLWwYZaR.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-DM9S22BL.js");
33513
+ const { resolveProjectFromIssueSync } = await import("./projects-Crur9uCa.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-svBDRWB6.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-CMpSB9sn.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-svBDRWB6.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-6jSyeXQ7.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-gz9Amovn.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-CMpSB9sn.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-CMpSB9sn.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-CDs0jQV6.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-CDs0jQV6.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;
@@ -40119,9 +40217,10 @@ function getAvailableModelsApi() {
40119
40217
  }
40120
40218
  }
40121
40219
  const openaiOrder = {
40122
- "gpt-5.6-sol": 0,
40123
- "gpt-5.6-terra": 1,
40124
- "gpt-5.6-luna": 2,
40220
+ "gpt-6-astra": 0,
40221
+ "gpt-5.6-sol": 1,
40222
+ "gpt-5.6-terra": 2,
40223
+ "gpt-5.6-luna": 3,
40125
40224
  "gpt-5.5": 10,
40126
40225
  "gpt-5.5-pro": 11,
40127
40226
  "gpt-5.4": 20,
@@ -41304,7 +41403,7 @@ Be specific: reference actual file names, function names, requirement text, disc
41304
41403
  const { command: cliCmd, args: cliArgs } = getAgentCommandSync(statusModelId);
41305
41404
  const modelFlag = cliArgs.length > 0 ? ` ${cliArgs.join(" ")}` : "";
41306
41405
  const promptFile = join(planningDir, ".status-review-prompt.tmp");
41307
- const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-Dqgz3MY5.js");
41406
+ const { getProviderForModelSync, getProviderEnvSync } = await import("./providers-Bun8zer5.js");
41308
41407
  let providerEnvStr = "";
41309
41408
  let providerEnv = {};
41310
41409
  const statusProvider = getProviderForModelSync(statusModelId);
@@ -41387,7 +41486,7 @@ const postMissionControlUploadRoute = HttpRouter.add("POST", "/api/command-deck/
41387
41486
  let safeName = filename.replace(/[^a-zA-Z0-9._-]/g, "-");
41388
41487
  let processedContent = content;
41389
41488
  if (safeName.endsWith(".vtt")) {
41390
- const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-BSnAB-Og.js"));
41489
+ const { vttToMarkdown } = yield* Effect.promise(() => import("./vtt-parser-Va--tv27.js"));
41391
41490
  processedContent = vttToMarkdown(content);
41392
41491
  safeName = safeName.replace(/\.vtt$/, ".md");
41393
41492
  }
@@ -42683,7 +42782,7 @@ const resolveAndSpeak = (options, deps) => Effect.tryPromise({
42683
42782
  //#endregion
42684
42783
  //#region services/tts-playback.ts
42685
42784
  const MAX_TTS_QUEUE_LENGTH = 20;
42686
- const state$1 = {
42785
+ const state$2 = {
42687
42786
  unsubscribe: null,
42688
42787
  startPromise: null,
42689
42788
  queue: [],
@@ -42728,16 +42827,16 @@ async function speakActivityTts(event) {
42728
42827
  }
42729
42828
  }
42730
42829
  async function drainQueue() {
42731
- if (state$1.processing) return;
42732
- state$1.processing = true;
42830
+ if (state$2.processing) return;
42831
+ state$2.processing = true;
42733
42832
  try {
42734
- while (state$1.queue.length > 0 && getTtsRuntimeConfig().enabled) {
42735
- const event = state$1.queue.shift();
42833
+ while (state$2.queue.length > 0 && getTtsRuntimeConfig().enabled) {
42834
+ const event = state$2.queue.shift();
42736
42835
  if (event) await speakActivityTts(event);
42737
42836
  }
42738
- if (!getTtsRuntimeConfig().enabled) state$1.queue = [];
42837
+ if (!getTtsRuntimeConfig().enabled) state$2.queue = [];
42739
42838
  } finally {
42740
- state$1.processing = false;
42839
+ state$2.processing = false;
42741
42840
  }
42742
42841
  }
42743
42842
  const LIFECYCLE_EVENT_TYPES = new Set([
@@ -42753,14 +42852,14 @@ function enqueueActivityTts(event) {
42753
42852
  const eventType = event.payload?.eventType;
42754
42853
  if (eventType && LIFECYCLE_EVENT_TYPES.has(eventType) && config.lifecycle === false) return;
42755
42854
  }
42756
- if (state$1.queue.length >= MAX_TTS_QUEUE_LENGTH) {
42855
+ if (state$2.queue.length >= MAX_TTS_QUEUE_LENGTH) {
42757
42856
  const priority = eventPriority(event) ?? 1;
42758
42857
  if (config.dropInfoWhenFull && priority >= 2) return;
42759
- const dropIndex = config.dropInfoWhenFull ? dropIndexForFullQueue(state$1.queue, priority) : 0;
42858
+ const dropIndex = config.dropInfoWhenFull ? dropIndexForFullQueue(state$2.queue, priority) : 0;
42760
42859
  if (dropIndex === void 0) return;
42761
- state$1.queue.splice(dropIndex, 1);
42860
+ state$2.queue.splice(dropIndex, 1);
42762
42861
  }
42763
- state$1.queue.push(event);
42862
+ state$2.queue.push(event);
42764
42863
  drainQueue();
42765
42864
  }
42766
42865
  function onEvent$1(event) {
@@ -42768,29 +42867,29 @@ function onEvent$1(event) {
42768
42867
  enqueueActivityTts(event);
42769
42868
  }
42770
42869
  async function startTtsPlayback() {
42771
- if (state$1.unsubscribe) return;
42772
- if (state$1.startPromise) return state$1.startPromise;
42870
+ if (state$2.unsubscribe) return;
42871
+ if (state$2.startPromise) return state$2.startPromise;
42773
42872
  if (!getTtsRuntimeConfig().enabled) {
42774
42873
  console.log("[tts-playback] Disabled (tts.enabled=false)");
42775
42874
  return;
42776
42875
  }
42777
- state$1.startPromise = (async () => {
42876
+ state$2.startPromise = (async () => {
42778
42877
  const store = await initEventStore();
42779
- if (state$1.unsubscribe) return;
42780
- state$1.unsubscribe = store.subscribe(onEvent$1);
42878
+ if (state$2.unsubscribe) return;
42879
+ state$2.unsubscribe = store.subscribe(onEvent$1);
42781
42880
  console.log("[tts-playback] Started");
42782
42881
  })();
42783
42882
  try {
42784
- await state$1.startPromise;
42883
+ await state$2.startPromise;
42785
42884
  } finally {
42786
- state$1.startPromise = null;
42885
+ state$2.startPromise = null;
42787
42886
  }
42788
42887
  }
42789
42888
  function stopTtsPlayback() {
42790
- state$1.queue = [];
42791
- if (state$1.unsubscribe) {
42792
- state$1.unsubscribe();
42793
- state$1.unsubscribe = null;
42889
+ state$2.queue = [];
42890
+ if (state$2.unsubscribe) {
42891
+ state$2.unsubscribe();
42892
+ state$2.unsubscribe = null;
42794
42893
  }
42795
42894
  }
42796
42895
  async function syncTtsPlaybackWithConfig() {
@@ -42901,6 +43000,24 @@ function unavailableProvider(provider, model, reason) {
42901
43000
  };
42902
43001
  }
42903
43002
  //#endregion
43003
+ //#region ../../lib/conversation-search/health.ts
43004
+ const state$1 = {
43005
+ lastErrorAt: null,
43006
+ lastErrorReason: null,
43007
+ lastSuccessAt: null
43008
+ };
43009
+ function recordConversationSearchFailure(reason) {
43010
+ state$1.lastErrorAt = (/* @__PURE__ */ new Date()).toISOString();
43011
+ state$1.lastErrorReason = reason instanceof Error ? reason.message : String(reason);
43012
+ }
43013
+ function recordConversationSearchSuccess() {
43014
+ state$1.lastSuccessAt = (/* @__PURE__ */ new Date()).toISOString();
43015
+ }
43016
+ /** Snapshot copy — callers must not mutate live state. */
43017
+ function getConversationSearchHealth() {
43018
+ return { ...state$1 };
43019
+ }
43020
+ //#endregion
42904
43021
  //#region ../../lib/database/conversation-embeddings-db.ts
42905
43022
  /**
42906
43023
  * Conversation Embeddings Sidecar Database (PAN-1395)
@@ -44096,7 +44213,12 @@ var ConversationSearchWatcher = class {
44096
44213
  }).then((result) => {
44097
44214
  if (signal.aborted || this.stopped) return;
44098
44215
  if (result.disabled) this.log.warn(`[conversation-search] startup index skipped: ${result.unavailableReason ?? "disabled"}`);
44099
- else {
44216
+ else if (result.errors.length > 0) {
44217
+ recordConversationSearchFailure(result.errors[result.errors.length - 1]?.message ?? "startup indexing reported errors");
44218
+ const prunedNote = result.sessionsPruned > 0 ? `, pruned ${result.sessionsPruned} stale session${result.sessionsPruned === 1 ? "" : "s"}` : "";
44219
+ 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}`);
44220
+ } else {
44221
+ recordConversationSearchSuccess();
44100
44222
  const prunedNote = result.sessionsPruned > 0 ? `, pruned ${result.sessionsPruned} stale session${result.sessionsPruned === 1 ? "" : "s"}` : "";
44101
44223
  this.log.log(`[conversation-search] startup indexed ${result.chunksIndexed} chunk${result.chunksIndexed === 1 ? "" : "s"} across ${result.filesScanned} file${result.filesScanned === 1 ? "" : "s"}${prunedNote}`);
44102
44224
  }
@@ -44179,8 +44301,16 @@ var ConversationSearchWatcher = class {
44179
44301
  filePath,
44180
44302
  config: this.config,
44181
44303
  signal
44182
- }).catch((error) => {
44183
- if (!isAbortError(error)) this.log.warn(`[conversation-search] failed to index ${filePath}:`, error);
44304
+ }).then((result) => {
44305
+ if (result.disabled) return;
44306
+ const firstError = result.errors[0];
44307
+ if (firstError) recordConversationSearchFailure(firstError.message);
44308
+ else recordConversationSearchSuccess();
44309
+ }, (error) => {
44310
+ if (!isAbortError(error)) {
44311
+ recordConversationSearchFailure(error);
44312
+ this.log.warn(`[conversation-search] failed to index ${filePath}:`, error);
44313
+ }
44184
44314
  }).finally(() => {
44185
44315
  this.activeTasks.delete(task);
44186
44316
  this.activeIndexers = Math.max(0, this.activeIndexers - 1);
@@ -45069,6 +45199,7 @@ const getConversationSearchStatusRoute = HttpRouter.add("GET", "/api/settings/co
45069
45199
  return yield* Effect.try({
45070
45200
  try: () => {
45071
45201
  const config = getConversationSearchConfigSync();
45202
+ const health = getConversationSearchHealth();
45072
45203
  if (!config.enabled) return jsonResponse({
45073
45204
  enabled: false,
45074
45205
  available: false,
@@ -45076,7 +45207,8 @@ const getConversationSearchStatusRoute = HttpRouter.add("GET", "/api/settings/co
45076
45207
  dbPath: config.dbPath,
45077
45208
  chunkCount: 0,
45078
45209
  indexedFileCount: 0,
45079
- lastIndexedAt: null
45210
+ lastIndexedAt: null,
45211
+ health
45080
45212
  });
45081
45213
  const provider = createConversationEmbeddingProvider({ config });
45082
45214
  if (!provider.enabled) return jsonResponse({
@@ -45086,7 +45218,8 @@ const getConversationSearchStatusRoute = HttpRouter.add("GET", "/api/settings/co
45086
45218
  dbPath: config.dbPath,
45087
45219
  chunkCount: 0,
45088
45220
  indexedFileCount: 0,
45089
- lastIndexedAt: null
45221
+ lastIndexedAt: null,
45222
+ health
45090
45223
  });
45091
45224
  const db = openEmbeddingsDb(config.dbPath, dimensionsForModel(config.model));
45092
45225
  try {
@@ -45096,7 +45229,8 @@ const getConversationSearchStatusRoute = HttpRouter.add("GET", "/api/settings/co
45096
45229
  available: db.available && provider.enabled,
45097
45230
  unavailableReason: db.unavailableReason,
45098
45231
  dbPath: config.dbPath,
45099
- ...stats
45232
+ ...stats,
45233
+ health
45100
45234
  });
45101
45235
  } finally {
45102
45236
  db.close();
@@ -45154,13 +45288,20 @@ const postConversationSearchReindexRoute = HttpRouter.add("POST", "/api/settings
45154
45288
  startedAt: Date.now()
45155
45289
  };
45156
45290
  try {
45157
- return jsonResponse(await fullReindexConversationSearch({ onProgress: (p) => {
45291
+ const result = await fullReindexConversationSearch({ onProgress: (p) => {
45158
45292
  conversationReindexProgress = {
45159
45293
  active: true,
45160
45294
  startedAt: conversationReindexProgress.startedAt,
45161
45295
  ...p
45162
45296
  };
45163
- } }));
45297
+ } });
45298
+ const firstError = result.errors[0];
45299
+ if (firstError) recordConversationSearchFailure(firstError.message);
45300
+ else if (!result.disabled) recordConversationSearchSuccess();
45301
+ return jsonResponse(result);
45302
+ } catch (error) {
45303
+ recordConversationSearchFailure(error);
45304
+ throw error;
45164
45305
  } finally {
45165
45306
  conversationReindexProgress = {
45166
45307
  ...conversationReindexProgress,
@@ -45858,7 +45999,7 @@ const postRallyValidateRoute = HttpRouter.add("POST", "/api/rally/validate", Eff
45858
45999
  }, { status: 400 });
45859
46000
  return yield* Effect.promise(async () => {
45860
46001
  try {
45861
- const { RallyRestApi } = await import("./rally-api-Ij1Zt0NI.js");
46002
+ const { RallyRestApi } = await import("./rally-api-BdNfpNGk.js");
45862
46003
  const api = new RallyRestApi({
45863
46004
  apiKey,
45864
46005
  server: server || "https://rally1.rallydev.com"
@@ -46242,7 +46383,7 @@ const getPlanningStatusRoute = HttpRouter.add("GET", "/api/planning/:issueId/sta
46242
46383
  const remoteState = loadRemoteAgentState(sessionName);
46243
46384
  const isRemote = !!remoteState;
46244
46385
  const vmName = remoteState?.vmName ?? "";
46245
- const { getAgentStateSync } = await import("./agents-DpCuoF65.js");
46386
+ const { getAgentStateSync } = await import("./agents-BdkVgjxC.js");
46246
46387
  const agentStarting = getAgentStateSync(sessionName)?.status === "starting";
46247
46388
  let tmuxSessionAlive = false;
46248
46389
  if (!isRemote) try {
@@ -46386,7 +46527,7 @@ Continue the PLANNING session. Do NOT implement anything.
46386
46527
  const agentCwd = workspacePath;
46387
46528
  const harnessLaunch = await prepareHarnessLaunch("claude-code");
46388
46529
  if (existsSync$1(outputFile)) await rename(outputFile, join(planningDir, `output-${Date.now()}.jsonl`));
46389
- const { getAgentCommandSync } = await import("./settings-DhtPDmmI.js");
46530
+ const { getAgentCommandSync } = await import("./settings-EGNbGKpP.js");
46390
46531
  let msgPlanningModel = "claude-sonnet-5";
46391
46532
  try {
46392
46533
  msgPlanningModel = resolveModel("plan", void 0, loadConfigSync().config);
@@ -46509,7 +46650,7 @@ async function getIndexStats(rootPath, isMain) {
46509
46650
  }
46510
46651
  const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Effect.promise(async () => {
46511
46652
  try {
46512
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BNQHwblU.js");
46653
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-DKCumqHU.js");
46513
46654
  const projectRoot = process.cwd();
46514
46655
  const venvPath = join(projectRoot, ".venv");
46515
46656
  const results = [];
@@ -46554,7 +46695,7 @@ const getTldrStatusRoute = HttpRouter.add("GET", "/api/services/tldr/status", Ef
46554
46695
  }));
46555
46696
  const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Effect.promise(async () => {
46556
46697
  try {
46557
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BNQHwblU.js");
46698
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-DKCumqHU.js");
46558
46699
  const projectRoot = process.cwd();
46559
46700
  const venvPath = join(projectRoot, ".venv");
46560
46701
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -46571,7 +46712,7 @@ const postTldrStartRoute = HttpRouter.add("POST", "/api/services/tldr/start", Ef
46571
46712
  }));
46572
46713
  const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effect.promise(async () => {
46573
46714
  try {
46574
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BNQHwblU.js");
46715
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-DKCumqHU.js");
46575
46716
  const projectRoot = process.cwd();
46576
46717
  const venvPath = join(projectRoot, ".venv");
46577
46718
  if (!existsSync$1(venvPath)) return jsonResponse({ error: "No .venv found in project root" }, { status: 404 });
@@ -46588,7 +46729,7 @@ const postTldrStopRoute = HttpRouter.add("POST", "/api/services/tldr/stop", Effe
46588
46729
  }));
46589
46730
  const postTldrReloadRoute = HttpRouter.add("POST", "/api/services/tldr/reload", Effect.promise(async () => {
46590
46731
  try {
46591
- const { getTldrDaemonServiceSync } = await import("./tldr-daemon-BNQHwblU.js");
46732
+ const { getTldrDaemonServiceSync } = await import("./tldr-daemon-DKCumqHU.js");
46592
46733
  const enabled = isTldrEnabledSync();
46593
46734
  const projectRoot = process.cwd();
46594
46735
  const targets = [];
@@ -46940,7 +47081,7 @@ function resolveRestartGateBoot(state, nowMs) {
46940
47081
  function emitThroughEventStore(snapshot) {
46941
47082
  (async () => {
46942
47083
  try {
46943
- const { getEventStore } = await import("./event-store-Db4w4YIY.js");
47084
+ const { getEventStore } = await import("./event-store-CFnLP8w-.js");
46944
47085
  getEventStore().emitOnly({
46945
47086
  type: "restart_gate.changed",
46946
47087
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -47228,7 +47369,7 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
47228
47369
  const version = await getOverdeckVersion();
47229
47370
  let supervisorUrl = null;
47230
47371
  try {
47231
- const { getSupervisorUrlSync } = await import("./supervisor-v0cYN2Vp.js");
47372
+ const { getSupervisorUrlSync } = await import("./supervisor-DoJpD33i.js");
47232
47373
  supervisorUrl = getSupervisorUrlSync();
47233
47374
  } catch {}
47234
47375
  return jsonResponse({
@@ -47238,11 +47379,11 @@ const getVersionRoute = HttpRouter.add("GET", "/api/version", Effect.promise(asy
47238
47379
  });
47239
47380
  }));
47240
47381
  const getPrerequisitesRoute = HttpRouter.add("GET", "/api/prerequisites", Effect.promise(async () => {
47241
- const { checkSystemPrerequisites } = await import("./system-prerequisites-QKtIYXI2.js");
47382
+ const { checkSystemPrerequisites } = await import("./system-prerequisites-DkDOEjQP.js");
47242
47383
  return jsonResponse(await checkSystemPrerequisites());
47243
47384
  }));
47244
47385
  const getSetupDiagnosticsRoute = HttpRouter.add("GET", "/api/diagnostics/setup", Effect.promise(async () => {
47245
- const { collectSetupDiagnostics } = await import("./system-prerequisites-QKtIYXI2.js");
47386
+ const { collectSetupDiagnostics } = await import("./system-prerequisites-DkDOEjQP.js");
47246
47387
  return jsonResponse(await collectSetupDiagnostics(await getOverdeckVersion()));
47247
47388
  }));
47248
47389
  const getSyncStatusRoute = HttpRouter.add("GET", "/api/sync-status", Effect.sync(() => {
@@ -47422,7 +47563,7 @@ const postShadowMonitorRoute = HttpRouter.add("POST", "/api/shadow/:issueId/moni
47422
47563
  const projectPath = await getProjectPath(issuePrefix);
47423
47564
  const workspacePath = join(projectPath, "workspaces", `feature-${issueLower}`);
47424
47565
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
47425
- const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-BxiFrIKv.js");
47566
+ const { gatherArtifacts, generateBasicInference, updateInferenceDocumentSync } = await import("./shadow-engineering-CNTXaC9O.js");
47426
47567
  const config = {
47427
47568
  issueId,
47428
47569
  workspacePath,
@@ -47452,7 +47593,7 @@ const postShadowObserveRoute = HttpRouter.add("POST", "/api/shadow/:issueId/obse
47452
47593
  if (!existsSync$1(workspacePath)) return jsonResponse({ error: "Workspace not found" }, { status: 404 });
47453
47594
  const ghConfig = getGitHubConfig();
47454
47595
  if (!ghConfig) return jsonResponse({ error: "GitHub not configured - Observer requires GitHub" }, { status: 400 });
47455
- const { runObserverCycle } = await import("./shadow-engineering-BxiFrIKv.js");
47596
+ const { runObserverCycle } = await import("./shadow-engineering-CNTXaC9O.js");
47456
47597
  const firstRepo = ghConfig.repos[0];
47457
47598
  const config = {
47458
47599
  issueId,
@@ -47892,7 +48033,11 @@ async function searchConversationChunks(input) {
47892
48033
  searchVector: (embedding, candidateLimit) => handle.db.searchVector(embedding, candidateLimit)
47893
48034
  },
47894
48035
  provider: handle.provider
47895
- }).then((hits) => filterLiveHits(handle.db, hits)).then(resolve, (error) => {
48036
+ }).then((hits) => filterLiveHits(handle.db, hits)).then((hits) => {
48037
+ recordConversationSearchSuccess();
48038
+ resolve(hits);
48039
+ }, (error) => {
48040
+ recordConversationSearchFailure(error);
47896
48041
  console.error("[conversation-search] service search failed:", error);
47897
48042
  resolve([]);
47898
48043
  });
@@ -49618,6 +49763,7 @@ async function getConversationsPendingInputFeed(deps) {
49618
49763
  name: conv.name,
49619
49764
  title: conv.title ?? null,
49620
49765
  issueId: conv.issueId ?? null,
49766
+ harness: conv.harness ?? "claude-code",
49621
49767
  ...pending ? { pendingAskUserQuestion: pending } : {},
49622
49768
  ...pendingPlan ? { pendingProposedPlan: pendingPlan } : {},
49623
49769
  ...paneChoice ? { pendingPaneChoice: paneChoice } : {}
@@ -49631,8 +49777,7 @@ async function getConversationsPendingInputFeed(deps) {
49631
49777
  }
49632
49778
  async function getConversationRead(rawId, deps) {
49633
49779
  try {
49634
- const numericId = Number(rawId);
49635
- const conv = !Number.isNaN(numericId) && /^\d+$/.test(rawId) ? getConversationById(numericId) : getConversationByName(rawId);
49780
+ const conv = resolveConversationKey(rawId);
49636
49781
  if (!conv) return result({ error: "Conversation not found" }, 404);
49637
49782
  const sessionAlive = conv.status === "active" && !conv.forkStatus && await deps.tmuxSessionExists(conv.tmuxSession);
49638
49783
  const convSf = await deps.resolveSessionFile(conv);
@@ -49877,8 +50022,14 @@ async function generateAiTitle(conversationName, firstMessage, deps) {
49877
50022
  console.log(`[claude-invoke] SUCCESS purpose=conversation-title | model=${CONVERSATION_TITLE_MODEL} | conversation=${conversationName} | outputChars=${sanitized.length}`);
49878
50023
  }
49879
50024
  const MAX_TITLE_LENGTH = 200;
49880
- function patchConversationTitle(name, body) {
49881
- if (!getConversationByName(name)) return {
50025
+ function resolveConversationKey(key) {
50026
+ const numericId = Number(key);
50027
+ if (!Number.isNaN(numericId) && /^\d+$/.test(key)) return getConversationById(numericId);
50028
+ return getConversationByName(key) ?? getConversationByTmuxSession(key);
50029
+ }
50030
+ function patchConversationTitle(key, body) {
50031
+ const conv = resolveConversationKey(key);
50032
+ if (!conv) return {
49882
50033
  status: 404,
49883
50034
  body: { error: "Conversation not found" }
49884
50035
  };
@@ -49888,7 +50039,7 @@ function patchConversationTitle(name, body) {
49888
50039
  status: 400,
49889
50040
  body: { error: `Title exceeds maximum length of ${MAX_TITLE_LENGTH} characters` }
49890
50041
  };
49891
- updateConversationTitle(name, trimmed, "manual");
50042
+ updateConversationTitle(conv.name, trimmed, "manual");
49892
50043
  }
49893
50044
  return {
49894
50045
  status: 200,
@@ -51005,19 +51156,22 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
51005
51156
  try {
51006
51157
  const [owner, repoName] = repo.split("/");
51007
51158
  if (!owner || !repoName) return;
51159
+ const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-HAqQZZRD.js");
51160
+ const githubAppConfigured = isGitHubAppConfigured();
51161
+ if (!githubAppConfigured && isInGraphQLCooldown()) return;
51162
+ const status = await Effect.runPromise(getReviewStatus(issueId));
51163
+ if (!status || status.retiredAt) return;
51008
51164
  let mergeable;
51009
51165
  let mergeState;
51010
51166
  let isDraft;
51011
51167
  let checksFailed;
51012
- const { isGitHubAppConfigured, getPullRequestState } = await import("./github-app-Oi5hdn1n.js");
51013
- if (isGitHubAppConfigured()) {
51168
+ if (githubAppConfigured) {
51014
51169
  const prState = await Effect.runPromise(getPullRequestState(owner, repoName, prNumber));
51015
51170
  mergeable = prState.mergeable === null ? "UNKNOWN" : prState.mergeable ? "MERGEABLE" : "CONFLICTING";
51016
51171
  mergeState = (prState.mergeableState ?? "").toUpperCase();
51017
51172
  isDraft = prState.draft;
51018
51173
  checksFailed = prState.checksFailed;
51019
51174
  } else {
51020
- if (isInGraphQLCooldown()) return;
51021
51175
  const { execFile } = await import("child_process");
51022
51176
  const { promisify } = await import("util");
51023
51177
  const execFileAsync = promisify(execFile);
@@ -51046,8 +51200,6 @@ async function refreshMergeStateFromGitHub(issueId, repo, prNumber) {
51046
51200
  isDraft = pr.isDraft === true;
51047
51201
  checksFailed = (pr.statusCheckRollup ?? []).some((check) => !isAdvisoryCheckName(check.name ?? check.context) && FAILING_CHECK_CONCLUSIONS.has((check.conclusion || check.state || "").toUpperCase()));
51048
51202
  }
51049
- const status = await Effect.runPromise(getReviewStatus(issueId));
51050
- if (!status) return;
51051
51203
  const isConflicting = mergeable === "CONFLICTING" || mergeState === "DIRTY";
51052
51204
  const GH_NATIVE = new Set([
51053
51205
  "merge_conflict",
@@ -51177,19 +51329,19 @@ async function handlePullRequestPromise(payload) {
51177
51329
  "closed",
51178
51330
  "reopened"
51179
51331
  ].includes(payload.action ?? "")) try {
51180
- const { listProjectsSync, resolveProjectFromIssueSync } = await import("./projects-LftaVK99.js");
51332
+ const { listProjectsSync, resolveProjectFromIssueSync } = await import("./projects-Crur9uCa.js");
51181
51333
  const resolved = resolveProjectFromIssueSync(issueId);
51182
51334
  const project = resolved ? listProjectsSync().find((entry) => entry.key === resolved.projectKey)?.config : void 0;
51183
51335
  if (project) {
51184
- const { enqueueProjectResourceRefresh } = await import("./project-resource-refresh-queue-BaZC79S3.js");
51336
+ const { enqueueProjectResourceRefresh } = await import("./project-resource-refresh-queue-C-umDazS.js");
51185
51337
  enqueueProjectResourceRefresh(project, `pull_request:${payload.action}`);
51186
51338
  }
51187
51339
  } catch (err) {
51188
51340
  console.warn(`[webhook] Failed to enqueue membership refresh for ${issueId}: ${err?.message ?? err}`);
51189
51341
  }
51190
51342
  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");
51343
+ const { postMergeLifecycle } = await import("./merge-agent-svBDRWB6.js");
51344
+ const { resolveProjectFromIssueSync } = await import("./projects-Crur9uCa.js");
51193
51345
  const project = resolveProjectFromIssueSync(issueId);
51194
51346
  if (project) {
51195
51347
  const branchName = pr.head.ref;
@@ -51202,12 +51354,17 @@ async function handlePullRequestPromise(payload) {
51202
51354
  const headMayHaveMoved = [
51203
51355
  "synchronize",
51204
51356
  "opened",
51205
- "reopened"
51357
+ "reopened",
51358
+ "closed"
51206
51359
  ].includes(payload.action ?? "");
51207
51360
  const status = await loadAndValidateStatus(issueId, repo, pr.number, headMayHaveMoved ? void 0 : pr.head.sha);
51208
51361
  if (!status) return;
51209
51362
  const update = {};
51210
51363
  let blockers = [...status.blockerReasons ?? []];
51364
+ if (payload.action === "closed" && pr.merged === false) {
51365
+ update.readyForMerge = false;
51366
+ update.retiredAt = (/* @__PURE__ */ new Date()).toISOString();
51367
+ }
51211
51368
  if (!status.prUrl) update.prUrl = pr.html_url ?? `https://github.com/${repo}/pull/${pr.number}`;
51212
51369
  if (!status.prNumber) update.prNumber = pr.number;
51213
51370
  if (pr.head.sha && (!status.prHeadSha || payload.action === "synchronize")) update.prHeadSha = pr.head.sha;
@@ -51623,7 +51780,8 @@ function buildForkRequest(params) {
51623
51780
  ...params.handoffFocus !== void 0 ? { handoffFocus: params.handoffFocus } : {},
51624
51781
  handoffAuthor: params.handoffAuthor,
51625
51782
  ...params.handoffAuthorModel !== void 0 ? { handoffAuthorModel: params.handoffAuthorModel } : {},
51626
- ...params.handoffAuthorHarness !== void 0 ? { handoffAuthorHarness: params.handoffAuthorHarness } : {}
51783
+ ...params.handoffAuthorHarness !== void 0 ? { handoffAuthorHarness: params.handoffAuthorHarness } : {},
51784
+ ...params.title !== void 0 ? { title: params.title } : {}
51627
51785
  };
51628
51786
  }
51629
51787
  async function handleConversationHandoffDoc(name) {
@@ -51737,7 +51895,7 @@ function handleForkPipelineFailure(name, err) {
51737
51895
  updateForkStatus(name, "failed", err instanceof Error ? err.message : String(err));
51738
51896
  markConversationEnded(name);
51739
51897
  }
51740
- async function runForkPipeline(convName, parentConv, sessionId, summaryModel, forkMode = "summary", localSummaryOnly = false, includeThinkingInSummary, summaryHarness, handoffFocus, handoffAuthor = "external", handoffAuthorModel, handoffAuthorHarness) {
51898
+ async function runForkPipeline(convName, parentConv, sessionId, summaryModel, forkMode = "summary", localSummaryOnly = false, includeThinkingInSummary, summaryHarness, handoffFocus, handoffAuthor = "external", handoffAuthorModel, handoffAuthorHarness, customTitle) {
51741
51899
  const conv = getConversationByName(convName);
51742
51900
  if (!conv) throw new Error(`Fork conversation ${convName} not found`);
51743
51901
  const parentSessionFile = await resolveForkSourceSessionFile(parentConv);
@@ -51814,7 +51972,7 @@ async function runForkPipeline(convName, parentConv, sessionId, summaryModel, fo
51814
51972
  }
51815
51973
  } else summary = await buildSummary();
51816
51974
  updateConversationForkFallbackReason(convName, forkFallbackReason);
51817
- updateConversationTitle(convName, effectiveForkMode === "handoff" ? handoffTitleFromFocus(handoffFocus, parentConv.title || parentConv.name) : `Summary Fork: ${parentConv.title || parentConv.name}`, "manual");
51975
+ updateConversationTitle(convName, customTitle ?? (effectiveForkMode === "handoff" ? handoffTitleFromFocus(handoffFocus, parentConv.title || parentConv.name) : `Summary Fork: ${parentConv.title || parentConv.name}`), "manual");
51818
51976
  if (handoffDocPath) recordConversationHandoff(parentConv.name, convName, handoffDocPath);
51819
51977
  updateForkStatus(convName, "spawning");
51820
51978
  await ensureForkSessionReady(conv, sessionId, false);
@@ -51900,7 +52058,7 @@ async function recoverStuckForks() {
51900
52058
  updateForkStatus(fork.name, "failed", `Parent conversation ${request.parentConversationName} not found`);
51901
52059
  continue;
51902
52060
  }
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));
52061
+ 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
52062
  recovered += 1;
51905
52063
  } catch (error) {
51906
52064
  const message = error instanceof Error ? error.message : String(error);
@@ -52021,11 +52179,12 @@ async function handleConversationSummaryFork(name, body) {
52021
52179
  ...handoffFocus !== void 0 ? { handoffFocus } : {},
52022
52180
  handoffAuthor,
52023
52181
  ...handoffAuthorModel !== void 0 ? { handoffAuthorModel } : {},
52024
- ...handoffAuthorHarness !== void 0 ? { handoffAuthorHarness } : {}
52182
+ ...handoffAuthorHarness !== void 0 ? { handoffAuthorHarness } : {},
52183
+ ...customTitle !== void 0 ? { title: customTitle } : {}
52025
52184
  });
52026
52185
  setForkRequest(newConv.name, JSON.stringify(forkRequest));
52027
52186
  markConversationActive(newConv.name);
52028
- registerInFlightForkPipeline(runForkPipeline(newConv.name, conv, sessionId, summaryModel, forkMode, localSummaryOnly, includeThinkingInSummary, summaryHarness, handoffFocus, handoffAuthor, handoffAuthorModel, handoffAuthorHarness)).catch((err) => {
52187
+ registerInFlightForkPipeline(runForkPipeline(newConv.name, conv, sessionId, summaryModel, forkMode, localSummaryOnly, includeThinkingInSummary, summaryHarness, handoffFocus, handoffAuthor, handoffAuthorModel, handoffAuthorHarness, customTitle)).catch((err) => {
52029
52188
  handleForkPipelineFailure(newConv.name, err);
52030
52189
  });
52031
52190
  return jsonResponse({
@@ -52315,6 +52474,16 @@ const postConversationPaneChoiceRoute = HttpRouter.add("POST", "/api/conversatio
52315
52474
  return jsonResponse(result.body, { status: result.status });
52316
52475
  });
52317
52476
  }));
52477
+ const postConversationPiAskAnswerRoute = HttpRouter.add("POST", "/api/conversations/:id/pi-ask-answer", Effect.gen(function* () {
52478
+ const originCheck = validateOrigin$1(yield* HttpServerRequest.HttpServerRequest);
52479
+ if (!originCheck.ok) return jsonResponse({ error: originCheck.error }, { status: 403 });
52480
+ const rawId = (yield* HttpRouter.params)["id"] ?? "";
52481
+ const body = yield* readJsonBody$10;
52482
+ return yield* Effect.promise(async () => {
52483
+ const result = await handleConversationPiAskAnswer(rawId, body);
52484
+ return jsonResponse(result.body, { status: result.status });
52485
+ });
52486
+ }));
52318
52487
  const postConversationDeliveryMethodRoute = HttpRouter.add("POST", "/api/conversations/:name/delivery-method", Effect.gen(function* () {
52319
52488
  const originCheck = validateOrigin$1(yield* HttpServerRequest.HttpServerRequest);
52320
52489
  if (!originCheck.ok) return jsonResponse({ error: originCheck.error }, { status: 403 });
@@ -52516,7 +52685,7 @@ const getConversationAboutRoute = HttpRouter.add("GET", "/api/conversations/:nam
52516
52685
  return conversationReadJson(await getConversationAbout(name, new URL(request.url, "http://localhost").searchParams.get("refresh") === "1", conversationReadDependencies));
52517
52686
  });
52518
52687
  }));
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);
52688
+ 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
52689
  //#endregion
52521
52690
  //#region routes/show.ts
52522
52691
  /**
@@ -52723,7 +52892,7 @@ async function registerProjectFromPath(opts) {
52723
52892
  registerProjectSync(key, projectConfig);
52724
52893
  const seededContextLayer = ensureProjectLayer(fullPath);
52725
52894
  try {
52726
- const { preTrustDirectorySync } = await import("./workspace-manager-jfkKAEuO.js");
52895
+ const { preTrustDirectorySync } = await import("./workspace-manager-gz9Amovn.js");
52727
52896
  preTrustDirectorySync(fullPath);
52728
52897
  } catch {}
52729
52898
  let hooksInstalled = 0;
@@ -52886,7 +53055,7 @@ init_paths();
52886
53055
  init_resource_utils();
52887
53056
  const execAsync$3 = promisify(exec);
52888
53057
  async function getIssueDataService() {
52889
- const { getSharedIssueService } = await import("./issue-service-singleton-CvgNAWqK.js");
53058
+ const { getSharedIssueService } = await import("./issue-service-singleton-COEqWNKE.js");
52890
53059
  return getSharedIssueService();
52891
53060
  }
52892
53061
  /** Returns true if the path exists (any type). */
@@ -53288,7 +53457,7 @@ const getProjectReleaseStatusRoute = HttpRouter.add("GET", "/api/projects/:proje
53288
53457
  const projectKey = (yield* HttpRouter.params)["projectKey"] ?? "";
53289
53458
  return jsonResponse(yield* Effect.tryPromise({
53290
53459
  try: async () => {
53291
- const { fetchProjectReleaseStatus } = await import("./project-pipelines-By_5WcT4.js");
53460
+ const { fetchProjectReleaseStatus } = await import("./project-pipelines-DdDKdXrG.js");
53292
53461
  return fetchProjectReleaseStatus(projectKey);
53293
53462
  },
53294
53463
  catch: (err) => new Error(err instanceof Error ? err.message : String(err))
@@ -53599,7 +53768,7 @@ init_projects();
53599
53768
  const getProjectMergeTrainRoute = HttpRouter.add("GET", "/api/projects/:projectKey/merge-train", httpHandler(Effect.gen(function* () {
53600
53769
  const config = getProjectSync((yield* HttpRouter.params)["projectKey"] ?? "");
53601
53770
  if (!config) return jsonResponse({ error: "Project not found" }, { status: 404 });
53602
- const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-0m2Q087q.js"));
53771
+ const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-DuJ6Vkl3.js"));
53603
53772
  return jsonResponse({
53604
53773
  value: config.merge_train ?? null,
53605
53774
  effective: isMergeTrainEnabledForProject(config)
@@ -53613,7 +53782,7 @@ const postProjectMergeTrainRoute = HttpRouter.add("POST", "/api/projects/:projec
53613
53782
  if (!project) return jsonResponse({ error: "Project not found" }, { status: 404 });
53614
53783
  const v = (yield* readProjectJsonBody).value;
53615
53784
  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"));
53785
+ const { isMergeTrainEnabledForProject } = yield* Effect.promise(() => import("./merge-sync-DuJ6Vkl3.js"));
53617
53786
  yield* Effect.promise(() => setProjectMergeTrain(key, v));
53618
53787
  const updated = { ...project };
53619
53788
  if (v === null) delete updated.merge_train;
@@ -53640,6 +53809,7 @@ const projectsMergeTrainRouteLayer = Layer.mergeAll(getProjectMergeTrainRoute, p
53640
53809
  * frontend migrates — removing them is the remove-legacy-routes item.
53641
53810
  */
53642
53811
  init_projects();
53812
+ init_merge_eligibility();
53643
53813
  const readUnknownJsonBody$1 = Effect.gen(function* () {
53644
53814
  const text = yield* (yield* HttpServerRequest.HttpServerRequest).text;
53645
53815
  try {
@@ -53674,7 +53844,7 @@ async function queueEntryForProject(key, config, enabled) {
53674
53844
  queue: []
53675
53845
  };
53676
53846
  const projectPath = resolve(config.path);
53677
- const candidates = listEligibleCandidatesByProject(projectPath);
53847
+ const candidates = await listEligibleCandidatesByProject(projectPath);
53678
53848
  if (candidates.length === 0) return {
53679
53849
  ...base,
53680
53850
  queue: []
@@ -53691,7 +53861,7 @@ async function queueEntryForProject(key, config, enabled) {
53691
53861
  * not blank the whole response, so a failed project reports an empty queue.
53692
53862
  */
53693
53863
  async function getMergeTrainQueuesPayload() {
53694
- const { isMergeTrainEnabledForProject } = await import("./merge-sync-0m2Q087q.js");
53864
+ const { isMergeTrainEnabledForProject } = await import("./merge-sync-DuJ6Vkl3.js");
53695
53865
  const projects = listProjectsSync();
53696
53866
  return (await Promise.allSettled(projects.map(({ key, config }) => queueEntryForProject(key, config, isMergeTrainEnabledForProject(config))))).flatMap((outcome, i) => {
53697
53867
  if (outcome.status === "fulfilled") return [outcome.value];
@@ -53709,8 +53879,8 @@ async function getMergeTrainQueuesPayload() {
53709
53879
  }
53710
53880
  /** PAN-1696 AC2: per-project generation chains across every tracked project. */
53711
53881
  async function getMergeTrainGenerationsPayload() {
53712
- const { isMergeTrainEnabledForProject } = await import("./merge-sync-0m2Q087q.js");
53713
- const { getUatGenerationsPayload } = await import("./uat-train-CycEzpbE.js");
53882
+ const { isMergeTrainEnabledForProject } = await import("./merge-sync-DuJ6Vkl3.js");
53883
+ const { getUatGenerationsPayload } = await import("./uat-train-B71QG16n.js");
53714
53884
  return (await Promise.allSettled(listProjectsSync().map(async ({ key, config }) => ({
53715
53885
  projectKey: key,
53716
53886
  projectName: config.name,
@@ -53719,12 +53889,12 @@ async function getMergeTrainGenerationsPayload() {
53719
53889
  })))).flatMap((outcome) => outcome.status === "fulfilled" ? [outcome.value] : []);
53720
53890
  }
53721
53891
  async function defaultOrderedIssueIdsForProject(projectPath) {
53722
- const candidates = listEligibleCandidatesByProject(projectPath);
53892
+ const candidates = await listEligibleCandidatesByProject(projectPath);
53723
53893
  if (candidates.length === 0) return [];
53724
53894
  return (await Effect.runPromise(computeMergeQueueFromCandidates(candidates, projectPath).pipe(Effect.provide(layer)))).map((item) => item.issueId);
53725
53895
  }
53726
53896
  async function defaultMergeOne(issueId) {
53727
- const { triggerMerge } = await import("./merge-ops-DabXHp2i.js");
53897
+ const { triggerMerge } = await import("./merge-ops-CUzpOPtO.js");
53728
53898
  const r = await triggerMerge(issueId);
53729
53899
  return r.success ? { ok: true } : {
53730
53900
  ok: false,
@@ -53752,13 +53922,21 @@ async function postMergeTrainMergeNextPayload(payload, deps = {}) {
53752
53922
  status: 404,
53753
53923
  body: { error: `Unknown project key: ${projectKey}` }
53754
53924
  };
53755
- const { isMergeTrainEnabledForProject } = await import("./merge-sync-0m2Q087q.js");
53925
+ const { isMergeTrainEnabledForProject } = await import("./merge-sync-DuJ6Vkl3.js");
53756
53926
  if (!isMergeTrainEnabledForProject(config)) return {
53757
53927
  status: 409,
53758
53928
  body: { error: `merge-train is disabled for project ${projectKey}` }
53759
53929
  };
53760
53930
  const issueIds = (await (deps.getOrderedIssueIds ?? defaultOrderedIssueIdsForProject)(resolve(config.path))).slice(0, n);
53761
- const { shipMergeBatch } = await import("./merge-batch-B8bVjFWS.js");
53931
+ const memberships = await (deps.gatherEligibility ?? gatherMergeEligibility)(issueIds);
53932
+ for (const issueId of issueIds) {
53933
+ const membership = memberships.get(issueId.toUpperCase());
53934
+ if (!membership || !isMergeEligible(membership)) return {
53935
+ status: 409,
53936
+ body: { error: `${issueId} is not merge-eligible: ${membership?.reasons.join("; ") || "pipeline membership unavailable"}` }
53937
+ };
53938
+ }
53939
+ const { shipMergeBatch } = await import("./merge-batch-BJjzUUL7.js");
53762
53940
  return {
53763
53941
  status: 200,
53764
53942
  body: {
@@ -53788,7 +53966,7 @@ async function postMergeTrainAssemblePayload(payload) {
53788
53966
  status: 404,
53789
53967
  body: { error: `Unknown project key: ${projectKey}` }
53790
53968
  };
53791
- const { runUatTrainReconcile } = await import("./uat-train-CycEzpbE.js");
53969
+ const { runUatTrainReconcile } = await import("./uat-train-B71QG16n.js");
53792
53970
  return {
53793
53971
  status: 200,
53794
53972
  body: { projects: [{
@@ -53800,7 +53978,7 @@ async function postMergeTrainAssemblePayload(payload) {
53800
53978
  }] }
53801
53979
  };
53802
53980
  }
53803
- const { runUatTrainReconcileAllProjects } = await import("./uat-train-CycEzpbE.js");
53981
+ const { runUatTrainReconcileAllProjects } = await import("./uat-train-B71QG16n.js");
53804
53982
  return {
53805
53983
  status: 200,
53806
53984
  body: { projects: await runUatTrainReconcileAllProjects({ force: true }) }
@@ -53816,13 +53994,13 @@ function uatGenerationNameFromParam(param) {
53816
53994
  return decoded.startsWith("uat/") ? decoded : `uat/${decoded}`;
53817
53995
  }
53818
53996
  async function postMergeTrainGenerationShipPayload(name, version) {
53819
- const { getUatGenerationSync } = await import("./merge-sync-0m2Q087q.js");
53997
+ const { getUatGenerationSync } = await import("./merge-sync-DuJ6Vkl3.js");
53820
53998
  const generation = getUatGenerationSync(name);
53821
53999
  if (!generation) return {
53822
54000
  status: 404,
53823
54001
  body: { error: `No UAT generation named ${name}` }
53824
54002
  };
53825
- const { shipPromotedBatch, ShipPromotedBatchError } = await import("./ship-record-DHWH1hLz.js");
54003
+ const { shipPromotedBatch, ShipPromotedBatchError } = await import("./ship-record-neN0oUI9.js");
53826
54004
  try {
53827
54005
  return {
53828
54006
  status: 200,
@@ -53850,7 +54028,7 @@ const postMergeTrainGenerationStackRoute = HttpRouter.add("POST", "/api/merge-tr
53850
54028
  const authError = rejectUnsafeDashboardMutationRequest(yield* HttpServerRequest.HttpServerRequest);
53851
54029
  if (authError) return authError;
53852
54030
  const name = uatGenerationNameFromParam((yield* HttpRouter.params)["name"] ?? "");
53853
- const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-CycEzpbE.js"));
54031
+ const { postUatGenerationStackPayload } = yield* Effect.promise(() => import("./uat-train-B71QG16n.js"));
53854
54032
  const result = yield* Effect.promise(() => postUatGenerationStackPayload(name));
53855
54033
  if (!result.ok) return jsonResponse({ error: result.error }, { status: result.status });
53856
54034
  return jsonResponse({
@@ -53867,8 +54045,8 @@ const postMergeTrainGenerationPromoteRoute = HttpRouter.add("POST", "/api/merge-
53867
54045
  const rawShipVersion = parsed.body["shipVersion"];
53868
54046
  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
54047
  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"));
54048
+ const { postUatGenerationPromotePayload } = yield* Effect.promise(() => import("./uat-train-B71QG16n.js"));
54049
+ const { firePostMergeLifecycle } = yield* Effect.promise(() => import("./specialists-BVBIMc4L.js"));
53872
54050
  const result = yield* Effect.promise(() => postUatGenerationPromotePayload(name, firePostMergeLifecycle, rawShipVersion));
53873
54051
  if (!result.success) return jsonResponse(result, { status: result.reason === "not-found" ? 404 : result.reason === "merge-failed" ? 500 : 409 });
53874
54052
  return jsonResponse(result);
@@ -55543,7 +55721,7 @@ function getCheckpointWorker() {
55543
55721
  return worker;
55544
55722
  }
55545
55723
  async function runInline(operation, payload) {
55546
- const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-Cb6CWT4S.js");
55724
+ const { claimTranscriptRange, commitTranscriptRange, releaseTranscriptRange, getTranscriptCheckpoint, listTranscriptCheckpoints } = await import("./checkpoints-JIKy0UFv.js");
55547
55725
  switch (operation) {
55548
55726
  case "claimTranscriptRange": return claimTranscriptRange(payload);
55549
55727
  case "commitTranscriptRange": return commitTranscriptRange(payload);
@@ -56705,7 +56883,7 @@ function buildPendingTurn(input, fromOffset, toOffset, compressed) {
56705
56883
  };
56706
56884
  }
56707
56885
  async function emitMemoryObservationCreated(observation, timestamp) {
56708
- const { initEventStore } = await import("./event-store-Db4w4YIY.js");
56886
+ const { initEventStore } = await import("./event-store-CFnLP8w-.js");
56709
56887
  await (await initEventStore()).appendAsync({
56710
56888
  type: "memory.observation_created",
56711
56889
  timestamp,
@@ -57742,6 +57920,21 @@ const CLEAR_ON = new Set([
57742
57920
  "StopFailure",
57743
57921
  "PermissionDenied"
57744
57922
  ]);
57923
+ /**
57924
+ * A hook arriving from a conversation's own Claude session is affirmative
57925
+ * evidence the harness is alive and executing turns. If the fork/handoff
57926
+ * pipeline previously marked this conversation failed (the submit-confirmation
57927
+ * check can false-negative: pane echo of the submitted summary keeps the
57928
+ * composer match positive after a successful Enter), heal the verdict. The
57929
+ * dashboard treats forkStatus='failed' as terminal — gray dot, no composer —
57930
+ * so a stale verdict leaves an alive, working session uninteractable.
57931
+ */
57932
+ function healFailedForkVerdictOnLiveActivity(conv) {
57933
+ if (conv.forkStatus !== "failed") return;
57934
+ console.log(`[hooks] clearing fork failure for ${conv.name} — hook activity proves the session is alive (was: ${conv.forkError ?? "failed"})`);
57935
+ clearConversationFailureState(conv.name);
57936
+ markConversationActive(conv.name);
57937
+ }
57745
57938
  const MemoryTurnHookPayload = Schema.Struct({
57746
57939
  session_id: Schema.String,
57747
57940
  transcript_path: Schema.String,
@@ -58061,6 +58254,7 @@ const postPermissionEventRoute = HttpRouter.add("POST", "/api/hooks/permission-e
58061
58254
  if (!sessionId || !hookEvent) return jsonResponse({ ok: true });
58062
58255
  const conv = getConversationByClaudeSessionId(sessionId);
58063
58256
  if (!conv) return jsonResponse({ ok: true });
58257
+ healFailedForkVerdictOnLiveActivity(conv);
58064
58258
  const waiting = hookEvent === "PermissionRequest";
58065
58259
  const clearing = CLEAR_ON.has(hookEvent);
58066
58260
  if (!waiting && !clearing) return jsonResponse({ ok: true });
@@ -58086,6 +58280,7 @@ async function handleUserPromptSubmitBody(body, options = {}) {
58086
58280
  if (!sessionId) return { ok: true };
58087
58281
  const conv = getConversationByClaudeSessionId(sessionId);
58088
58282
  if (!conv) return { ok: true };
58283
+ healFailedForkVerdictOnLiveActivity(conv);
58089
58284
  if (conv.titleSource === "default") {
58090
58285
  const derivedTitle = derivePromptTitle(prompt);
58091
58286
  if (derivedTitle) updateConversationTitle(conv.name, derivedTitle, "auto");
@@ -59503,12 +59698,12 @@ async function pauseFlywheelRunForDashboard() {
59503
59698
  if (before.activeRunId) try {
59504
59699
  const { readFile } = await import("node:fs/promises");
59505
59700
  const { join } = await import("node:path");
59506
- const { getAgentDir } = await import("./agents-DpCuoF65.js");
59701
+ const { getAgentDir } = await import("./agents-BdkVgjxC.js");
59507
59702
  const sessionId = (await readFile(join(getAgentDir(FLYWHEEL_ORCHESTRATOR_AGENT_ID), "session.id"), "utf-8")).trim();
59508
59703
  if (sessionId) await saveResumeSessionId(before.activeRunId, sessionId);
59509
59704
  } catch {}
59510
59705
  await setPaused(true);
59511
- await import("./agents-DpCuoF65.js").then(({ stopAgent }) => Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID, "operator")));
59706
+ await import("./agents-BdkVgjxC.js").then(({ stopAgent }) => Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID, "operator")));
59512
59707
  return {
59513
59708
  before,
59514
59709
  after: await readGateSnapshot(),
@@ -59518,7 +59713,7 @@ async function pauseFlywheelRunForDashboard() {
59518
59713
  async function abortFlywheelRunForDashboard() {
59519
59714
  const candidate = await getActiveRunId();
59520
59715
  if (!candidate) return { aborted: await resolveLiveFlywheelRunId() ?? null };
59521
- const { stopAgent } = await import("./agents-DpCuoF65.js");
59716
+ const { stopAgent } = await import("./agents-BdkVgjxC.js");
59522
59717
  await Effect.runPromise(stopAgent(FLYWHEEL_ORCHESTRATOR_AGENT_ID, "operator"));
59523
59718
  await abortFlywheelRun(candidate);
59524
59719
  return { aborted: candidate };
@@ -60197,7 +60392,7 @@ async function getFlywheelConversationPayload() {
60197
60392
  };
60198
60393
  }
60199
60394
  async function postFlywheelReportPayload() {
60200
- const { flywheelReportCommand } = await import("./flywheel-v1cCOBx-.js");
60395
+ const { flywheelReportCommand } = await import("./flywheel-X6kvGnf2.js");
60201
60396
  await flywheelReportCommand({ cwd: process.cwd() });
60202
60397
  return {
60203
60398
  status: 200,
@@ -60492,7 +60687,7 @@ const postFlywheelBriefRoute = HttpRouter.add("POST", "/api/flywheel/brief", htt
60492
60687
  });
60493
60688
  })));
60494
60689
  const getUatCandidateRoute = HttpRouter.add("GET", "/api/flywheel/uat-candidate", httpHandler(Effect.gen(function* () {
60495
- const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-CycEzpbE.js"));
60690
+ const { getUatCandidatePayload } = yield* Effect.promise(() => import("./uat-train-B71QG16n.js"));
60496
60691
  return jsonResponse(yield* Effect.promise(() => getUatCandidatePayload()));
60497
60692
  })));
60498
60693
  const getFlywheelStateRoute = HttpRouter.add("GET", "/api/flywheel/state", httpHandler(Effect.gen(function* () {
@@ -60703,7 +60898,7 @@ function previewBrief(book) {
60703
60898
  return `${lines.join("\n")}\n`;
60704
60899
  }
60705
60900
  async function defaultStartOrderBook(book, project) {
60706
- const { startFlywheelRun } = await import("./flywheel-v1cCOBx-.js");
60901
+ const { startFlywheelRun } = await import("./flywheel-X6kvGnf2.js");
60707
60902
  return startFlywheelRun({
60708
60903
  cwd: resolveProjectPath(project),
60709
60904
  orders: book.id
@@ -61853,6 +62048,7 @@ function initSchema(db) {
61853
62048
  release_notes TEXT,
61854
62049
  updated_at TEXT NOT NULL,
61855
62050
  ready_for_merge INTEGER NOT NULL DEFAULT 0,
62051
+ retired_at TEXT,
61856
62052
  auto_requeue_count INTEGER DEFAULT 0,
61857
62053
  merge_retry_count INTEGER DEFAULT 0,
61858
62054
  pr_url TEXT,
@@ -62396,7 +62592,7 @@ function initSchema(db) {
62396
62592
  CREATE INDEX IF NOT EXISTS idx_backlog_sequence_project_rank
62397
62593
  ON backlog_sequence(project_key, rank);
62398
62594
  `);
62399
- db.pragma(`user_version = 64`);
62595
+ db.pragma(`user_version = 65`);
62400
62596
  }
62401
62597
  /**
62402
62598
  * Run schema migrations if the database version is older than SCHEMA_VERSION.
@@ -62408,14 +62604,14 @@ function runMigrations(db, dbPath) {
62408
62604
  initSchema(db);
62409
62605
  return;
62410
62606
  }
62411
- if (currentVersion === 64) {
62607
+ if (currentVersion === 65) {
62412
62608
  tryIdempotentDdl(db, 61, "ALTER TABLE flywheel_substrate_bugs ADD COLUMN affected_criteria TEXT");
62413
62609
  tryIdempotentDdl(db, 61, "ALTER TABLE agents ADD COLUMN started_by TEXT");
62414
62610
  tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN review_cycle_history TEXT");
62415
62611
  tryIdempotentDdl(db, 62, "ALTER TABLE review_status ADD COLUMN conflicts_since TEXT");
62416
62612
  return;
62417
62613
  }
62418
- if (currentVersion > 64) return;
62614
+ if (currentVersion > 65) return;
62419
62615
  if (currentVersion < 2) db.exec(`
62420
62616
  DELETE FROM status_history
62421
62617
  WHERE id NOT IN (
@@ -63083,7 +63279,8 @@ function runMigrations(db, dbPath) {
63083
63279
  tryIdempotentDdl(db, 64, "ALTER TABLE review_status ADD COLUMN uat_status TEXT");
63084
63280
  tryIdempotentDdl(db, 64, "ALTER TABLE review_status ADD COLUMN uat_notes TEXT");
63085
63281
  }
63086
- db.pragma(`user_version = 64`);
63282
+ if (currentVersion < 65) tryIdempotentDdl(db, 65, "ALTER TABLE review_status ADD COLUMN retired_at TEXT");
63283
+ db.pragma(`user_version = 65`);
63087
63284
  }
63088
63285
  //#endregion
63089
63286
  //#region ../../lib/database/index.ts
@@ -64408,6 +64605,7 @@ init_review_status();
64408
64605
  init_event_store();
64409
64606
  const POLL_INTERVAL_MS$2 = 6e4;
64410
64607
  let reconcileTimer = null;
64608
+ const reconcileTracking = /* @__PURE__ */ new Map();
64411
64609
  function reviewStatusPayload(event) {
64412
64610
  if (!event.payload || typeof event.payload !== "object") return null;
64413
64611
  const payload = event.payload;
@@ -64419,9 +64617,10 @@ async function reconcileOnce() {
64419
64617
  const canonicalByIssue = /* @__PURE__ */ new Map();
64420
64618
  for (const issueId of Object.keys(cached)) {
64421
64619
  const canonical = getReviewStatusSync(issueId);
64422
- if (!canonical) continue;
64620
+ if (!canonical || canonical.retiredAt) continue;
64423
64621
  canonicalByIssue.set(issueId.toUpperCase(), canonical);
64424
64622
  }
64623
+ for (const issueId of reconcileTracking.keys()) if (!canonicalByIssue.has(issueId)) reconcileTracking.delete(issueId);
64425
64624
  const store = getEventStore();
64426
64625
  const latestByIssue = /* @__PURE__ */ new Map();
64427
64626
  for (const event of store.queryLatestPerIssue("review.status_changed")) {
@@ -64432,10 +64631,25 @@ async function reconcileOnce() {
64432
64631
  const latest = latestByIssue.get(issueId);
64433
64632
  const latestPayload = latest ? reviewStatusPayload(latest) : null;
64434
64633
  const lastUpdatedAt = latestPayload?.status.updatedAt ?? "";
64435
- if (lastUpdatedAt > canonical.updatedAt) continue;
64436
- if (lastUpdatedAt === canonical.updatedAt && latestPayload && sameCanonicalReviewStatus(latestPayload.status, canonical)) continue;
64634
+ if (lastUpdatedAt > canonical.updatedAt) {
64635
+ reconcileTracking.delete(issueId);
64636
+ continue;
64637
+ }
64638
+ if (lastUpdatedAt === canonical.updatedAt && latestPayload && sameCanonicalReviewStatus(latestPayload.status, canonical)) {
64639
+ reconcileTracking.delete(issueId);
64640
+ continue;
64641
+ }
64642
+ const tracking = reconcileTracking.get(issueId);
64643
+ if (tracking?.healedUpdatedAt === canonical.updatedAt) {
64644
+ if (tracking.warnedUpdatedAt !== canonical.updatedAt) {
64645
+ console.warn(`[review-status-reconcile] NOT CONVERGING for ${issueId}: canonical=${canonical.updatedAt} event=${lastUpdatedAt}`);
64646
+ tracking.warnedUpdatedAt = canonical.updatedAt;
64647
+ }
64648
+ continue;
64649
+ }
64437
64650
  console.log(`[review-status-reconcile] re-emitting status for ${issueId} (canonical differs from last event — healing lost status_changed)`);
64438
64651
  emitReviewStatusChanged((event) => store.append(event), issueId, canonical);
64652
+ reconcileTracking.set(issueId, { healedUpdatedAt: canonical.updatedAt });
64439
64653
  }
64440
64654
  }
64441
64655
  function startReviewStatusReconcileService() {
@@ -65570,15 +65784,15 @@ async function announceNewRestart(deps = {}) {
65570
65784
  return true;
65571
65785
  }
65572
65786
  let timer$2 = null;
65573
- let running = false;
65787
+ let running$1 = false;
65574
65788
  let runToken = 0;
65575
65789
  function startRestartAnnouncer(deps = {}) {
65576
- if (running) return;
65577
- running = true;
65790
+ if (running$1) return;
65791
+ running$1 = true;
65578
65792
  const token = ++runToken;
65579
65793
  let remainingBootstrapPolls = BOOTSTRAP_FAST_POLL_COUNT;
65580
65794
  const schedule = (delayMs) => {
65581
- if (!running || token !== runToken) return;
65795
+ if (!running$1 || token !== runToken) return;
65582
65796
  timer$2 = setTimeout(pass, delayMs);
65583
65797
  timer$2.unref?.();
65584
65798
  };
@@ -65596,7 +65810,7 @@ function startRestartAnnouncer(deps = {}) {
65596
65810
  pass();
65597
65811
  }
65598
65812
  function stopRestartAnnouncer() {
65599
- running = false;
65813
+ running$1 = false;
65600
65814
  runToken += 1;
65601
65815
  if (timer$2) clearTimeout(timer$2);
65602
65816
  timer$2 = null;
@@ -66021,7 +66235,7 @@ const RESTART_MARKER = join$1(homedir(), ".overdeck", "dashboard-restarting.json
66021
66235
  * loads new content-hashed chunk filenames (no ERR_MODULE_NOT_FOUND after rebuild).
66022
66236
  */
66023
66237
  async function defaultLifecycleRunner(pending) {
66024
- const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-BuoC_PRZ.js");
66238
+ const { postMergeLifecycle, notifyTldrDaemon } = await import("./merge-agent-svBDRWB6.js");
66025
66239
  await postMergeLifecycle(pending.issueId, pending.projectPath, pending.sourceBranch, { skipDeploy: true });
66026
66240
  if (pending.sourceBranch) await notifyTldrDaemon(pending.projectPath, pending.sourceBranch);
66027
66241
  }
@@ -66218,7 +66432,7 @@ function failureReason(result) {
66218
66432
  return result.error ?? result.message ?? `merge returned status ${result.statusCode ?? "unknown"}`;
66219
66433
  }
66220
66434
  async function defaultMergeIssue(issueId) {
66221
- const { triggerMerge } = await import("./merge-ops-DabXHp2i.js");
66435
+ const { triggerMerge } = await import("./merge-ops-CUzpOPtO.js");
66222
66436
  return triggerMerge(issueId);
66223
66437
  }
66224
66438
  function defaultAnnounceFailure(issueId, reason) {
@@ -66373,21 +66587,113 @@ async function warnIfAppCannotMerge(deps = {}) {
66373
66587
  }
66374
66588
  }
66375
66589
  //#endregion
66590
+ //#region services/conversation-rescan-scheduler.ts
66591
+ /**
66592
+ * Keeps the discovered-sessions FTS index fresh (PAN-3771 layer 2).
66593
+ * The Conversations-page search corpus previously only updated when someone
66594
+ * clicked Scan or ran `pan conv scan`, so installs that never rescanned had
66595
+ * weeks of invisible sessions. The scan is incremental: unchanged files are
66596
+ * skipped by size and mtime.
66597
+ */
66598
+ const BOOT_DELAY_MS = 45e3;
66599
+ const RESCAN_INTERVAL_MS = 360 * 60 * 1e3;
66600
+ const LOG_PREFIX = "[conversation-rescan]";
66601
+ let bootTimer = null;
66602
+ let intervalTimer = null;
66603
+ let running = false;
66604
+ let stopped = false;
66605
+ async function runScanOnce(trigger) {
66606
+ if (running || stopped) return;
66607
+ running = true;
66608
+ try {
66609
+ const result = await scan({ mode: "system" });
66610
+ const elapsedMs = Math.round(result.durationMs);
66611
+ const summary = `${result.inserted} inserted, ${result.updated} updated, ${result.skipped} skipped, ${result.errors} errors`;
66612
+ console.log(`${LOG_PREFIX} ${trigger} scan complete: ${summary} (${elapsedMs}ms)`);
66613
+ } catch (error) {
66614
+ console.warn(`${LOG_PREFIX} ${trigger} scan failed:`, error);
66615
+ } finally {
66616
+ running = false;
66617
+ }
66618
+ }
66619
+ function startConversationRescanScheduler() {
66620
+ if (bootTimer !== null || intervalTimer !== null) return;
66621
+ stopped = false;
66622
+ bootTimer = setTimeout(() => {
66623
+ runScanOnce("boot");
66624
+ }, BOOT_DELAY_MS);
66625
+ if (typeof bootTimer.unref === "function") bootTimer.unref();
66626
+ intervalTimer = setInterval(() => {
66627
+ runScanOnce("interval");
66628
+ }, RESCAN_INTERVAL_MS);
66629
+ if (typeof intervalTimer.unref === "function") intervalTimer.unref();
66630
+ }
66631
+ async function stopConversationRescanScheduler() {
66632
+ if (bootTimer !== null) {
66633
+ clearTimeout(bootTimer);
66634
+ bootTimer = null;
66635
+ }
66636
+ if (intervalTimer !== null) {
66637
+ clearInterval(intervalTimer);
66638
+ intervalTimer = null;
66639
+ }
66640
+ stopped = true;
66641
+ }
66642
+ //#endregion
66376
66643
  //#region services/cost-reconcile-service.ts
66644
+ /**
66645
+ * Periodic cost reconciliation delegates transcript walking and parsing to the
66646
+ * long DB worker lane. The main thread records returned events through the cost
66647
+ * write door and persists exact path/mtime/size skip verdicts for later sweeps.
66648
+ */
66377
66649
  const RECONCILE_INTERVAL_MS = 5 * 6e4;
66650
+ const RECONCILE_BATCH_EVENTS = 250;
66378
66651
  let timer = null;
66379
66652
  let inFlight$1 = null;
66380
66653
  async function runCostReconcileOnce(reason) {
66381
66654
  if (inFlight$1) return inFlight$1;
66382
66655
  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)`);
66656
+ const result = {
66657
+ eventsImported: 0,
66658
+ duplicatesSkipped: 0,
66659
+ cacheSkipped: 0,
66660
+ errors: []
66661
+ };
66662
+ const piCollected = await runDashboardDbJob("costReconcileSweep", {
66663
+ source: "pi",
66664
+ maxEvents: RECONCILE_BATCH_EVENTS
66665
+ }, async (progress) => {
66666
+ const batch = progress;
66667
+ for (const { event, sourceFile } of batch.events) {
66668
+ const recorded = await recordCostEventsThroughOverdeck([event], sourceFile);
66669
+ result.eventsImported += recorded.inserted;
66670
+ result.duplicatesSkipped += recorded.duplicates;
66671
+ }
66672
+ for (const verdict of batch.verdicts) recordSkipVerdict(verdict.path, verdict.mtimeMs, verdict.size, verdict.verdict);
66673
+ });
66674
+ result.cacheSkipped += piCollected.stats.cacheSkipped;
66675
+ result.errors.push(...piCollected.errors);
66676
+ 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
66677
  if (result.errors.length > 0) for (const err of result.errors.slice(0, 5)) console.warn(`[cost-reconciler] ${err.path}: ${err.error}`);
66386
66678
  const backfillResult = reclassifyUnknownCostEventsSync();
66387
66679
  if (backfillResult.updated > 0) console.log(`[cost-reconciler] ${reason} UNKNOWN backfill: ${backfillResult.updated} updated`);
66388
66680
  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`);
66681
+ let imported = 0;
66682
+ const codexResult = await runDashboardDbJob("costReconcileSweep", {
66683
+ source: "codex",
66684
+ maxEvents: RECONCILE_BATCH_EVENTS
66685
+ }, async (progress) => {
66686
+ const batch = progress;
66687
+ for (const event of batch.events) {
66688
+ const normalized = {
66689
+ ...event,
66690
+ ts: new Date(event.ts)
66691
+ };
66692
+ if (await Effect.runPromise(CostWriter.use((writer) => writer.record(normalized)).pipe(Effect.provide(CostDoorLive)))) imported++;
66693
+ }
66694
+ for (const verdict of batch.verdicts) recordSkipVerdict(verdict.path, verdict.mtimeMs, verdict.size, verdict.verdict);
66695
+ });
66696
+ console.log(`[cost-reconciler] ${reason} codex sweep: ${codexResult.stats.scanned} scanned, ${codexResult.stats.cacheSkipped} cache-skipped, ${imported} imported`);
66391
66697
  } catch (err) {
66392
66698
  console.warn("[cost-reconciler] codex sweep failed:", err instanceof Error ? err.message : err);
66393
66699
  }
@@ -66721,7 +67027,7 @@ const defaultDependencies = {
66721
67027
  inspect: inspectStateMigration,
66722
67028
  ensureWorktree: ensureStateWorktree,
66723
67029
  migrate: async (projectKey, project, signal) => {
66724
- const { migrateProjectState } = await import("./state-migrate-C6H3jfHE.js");
67030
+ const { migrateProjectState } = await import("./state-migrate-DtFHcOVZ.js");
66725
67031
  await migrateProjectState(projectKey, { signal }, project);
66726
67032
  },
66727
67033
  clearCache: clearStateMigrationCache,
@@ -66933,7 +67239,7 @@ if (shouldStartStaleCheckRetriggerService()) {
66933
67239
  }
66934
67240
  if (process.env.OVERDECK_MODE === "desktop") (async () => {
66935
67241
  try {
66936
- const { provisionClaudeHooks } = await import("./claude-hooks-provision-C5JHpxTS.js");
67242
+ const { provisionClaudeHooks } = await import("./claude-hooks-provision-BJ8LNIAe.js");
66937
67243
  const result = await provisionClaudeHooks();
66938
67244
  if (!result.ok) console.warn(`[overdeck] Claude hook provisioning skipped: ${result.reason}`);
66939
67245
  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 +67482,8 @@ startCostReconcileService();
67176
67482
  console.log("[overdeck] Cost reconciler started");
67177
67483
  const conversationSearchWatcher = startConversationSearchWatcher();
67178
67484
  console.log(conversationSearchWatcher ? "[overdeck] Conversation search watcher started" : "[overdeck] Conversation search watcher skipped (conversationSearch.enabled=false)");
67485
+ startConversationRescanScheduler();
67486
+ console.log("[overdeck] Conversation rescan scheduler started (boot pass + 6h interval)");
67179
67487
  let stopResourceRefreshServices = () => void 0;
67180
67488
  (async () => {
67181
67489
  const store = await initEventStore();
@@ -67278,7 +67586,7 @@ const handleShutdownSignal = async (signal) => {
67278
67586
  await stopAllKnowledgeViewers().catch((err) => console.warn("[knowledge-viewer] shutdown failed:", err?.message ?? err));
67279
67587
  await stopDeaconChild().catch((err) => console.warn("[deacon-supervisor] child shutdown failed:", err?.message ?? err));
67280
67588
  try {
67281
- const { killAllGateProcessGroups } = await import("./validation-CHovCoTT.js");
67589
+ const { killAllGateProcessGroups } = await import("./validation-k4EpMHm0.js");
67282
67590
  const reaped = killAllGateProcessGroups();
67283
67591
  if (reaped > 0) console.log(`[overdeck] reaped ${reaped} in-flight gate process group(s)`);
67284
67592
  } catch (err) {
@@ -67286,6 +67594,7 @@ const handleShutdownSignal = async (signal) => {
67286
67594
  }
67287
67595
  await Effect.runPromise(flushAllPendingAutoCommits()).catch((err) => console.warn("[pan-dir/auto-commit] shutdown flush failed:", err));
67288
67596
  await stopConversationSearchWatcher().catch((err) => console.warn("[conversation-search] watcher shutdown failed:", err));
67597
+ await stopConversationRescanScheduler();
67289
67598
  closeConversationSearchService();
67290
67599
  closeMemoryFtsDatabases();
67291
67600
  process.exit(0);
@@ -67320,7 +67629,7 @@ setTimeout(() => {
67320
67629
  });
67321
67630
  });
67322
67631
  }, 1e3);
67323
- fixStuckReadyForMerge();
67632
+ await fixStuckReadyForMerge();
67324
67633
  fixStuckCommentedReviews();
67325
67634
  reconcileStaleGitHubBlockers().then((n) => {
67326
67635
  if (n > 0) {
@@ -67334,7 +67643,7 @@ reconcileStaleGitHubBlockers().then((n) => {
67334
67643
  }).catch((err) => console.warn(`[overdeck] Startup blocker reconciliation failed: ${err.message}`));
67335
67644
  await startProjectCiRefillAfterProjectionReady(900 * 1e3);
67336
67645
  try {
67337
- const { resetProcessingToQueued, requeueOrphanedMergingAutoMerges } = await import("./merge-sync-0m2Q087q.js");
67646
+ const { resetProcessingToQueued, requeueOrphanedMergingAutoMerges } = await import("./merge-sync-DuJ6Vkl3.js");
67338
67647
  const resetCount = resetProcessingToQueued();
67339
67648
  if (resetCount > 0) {
67340
67649
  console.log(`[overdeck] Reset ${resetCount} stuck merge queue entries to queued`);
@@ -67368,7 +67677,7 @@ else {
67368
67677
  console.log("[overdeck] Auto-merge executor started");
67369
67678
  }
67370
67679
  try {
67371
- const { reconcileInterruptedVerifications } = await import("./verification-runner-BuqGwm2t.js");
67680
+ const { reconcileInterruptedVerifications } = await import("./verification-runner-Bbc-8BbR.js");
67372
67681
  const interrupted = reconcileInterruptedVerifications();
67373
67682
  if (interrupted > 0) console.log(`[overdeck] recovered ${interrupted} orphaned verification worker(s)`);
67374
67683
  } catch (err) {