@overdeck/desktop 0.49.1 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +1 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-Crw-xSJ3.js → acceptance-criteria-B_maCGZv.js} +2 -2
  4. package/server/{active-dashboard-bundle-CLwfD-Om.js → active-dashboard-bundle-CCqpFWiz.js} +2 -2
  5. package/server/activity-logger-B0X2JJwM.js +3 -0
  6. package/server/{activity-logger-BAVLrkR7.js → activity-logger-SlTXYCVf.js} +22 -4
  7. package/server/{advancing-selfheal-BQiJ7mIH.js → advancing-selfheal-BJAfiY-C.js} +12 -7
  8. package/server/{agent-gc-5E0lgxI1.js → agent-gc-bhikjoJ_.js} +11 -11
  9. package/server/agent-idle-D-UQ7gDv.js +745 -0
  10. package/server/agent-state-BrUPf_7Z.js +3 -0
  11. package/server/{agent-state-Bb3UUxQm.js → agent-state-FABw8neJ.js} +682 -454
  12. package/server/{agent-state-service-keg-x1bT.js → agent-state-service-BAQApt97.js} +1 -1
  13. package/server/{agent-state-service-BFbttwRA.js → agent-state-service-rDenYSlD.js} +5 -5
  14. package/server/agents-DixZjXWm.js +3 -0
  15. package/server/{agents-CqQJW75N.js → agents-DzpQidT8.js} +8 -8
  16. package/server/{archive-planning-BwEhu9Oq.js → archive-planning-BL1ABtW0.js} +20 -135
  17. package/server/archive-planning-D3gw32U9.js +2 -0
  18. package/server/{artifact-index-jobs-C6Lg2rKm.js → artifact-index-jobs-Cjdme0jS.js} +3 -3
  19. package/server/{assemble-DyTp2gSB.js → assemble-B_JgnCbG.js} +28 -9
  20. package/server/{auto-spawn-consent-BDfe4qz0.js → auto-spawn-consent-BesWchEi.js} +8 -7
  21. package/server/{backlog-auto-trigger-DuOGpdDW.js → backlog-auto-trigger-COLq639j.js} +3 -3
  22. package/server/{behavior-Bitko0mD.js → behavior-DCg8CIWC.js} +3 -3
  23. package/server/{bridge-pool-patrol-DiHEd13O.js → bridge-pool-patrol-BDohuMRt.js} +2 -2
  24. package/server/{briefing-freshness-CDJcmHHZ.js → briefing-freshness-ENa_hW_V.js} +2 -2
  25. package/server/build-info-Dx2qrVhb.js +2 -0
  26. package/server/{build-info-DTX8JwVP.js → build-info-WuZT6xyi.js} +3 -3
  27. package/server/{checkpoint-manager-BlOOdzLF.js → checkpoint-manager-CSZ7aVQF.js} +26 -9
  28. package/server/{checkpoint-manager-CKg1tn34.js → checkpoint-manager-DXhGRvg4.js} +1 -1
  29. package/server/checkpoint-worker.js +1 -1
  30. package/server/{checkpoints-BGfl0cHM.js → checkpoints-DUkUsPVS.js} +2 -2
  31. package/server/{checkpoints-DRALkfDS.js → checkpoints-tm_w6Y4V.js} +1 -1
  32. package/server/{claude-hooks-provision-B_tv3wzE.js → claude-hooks-provision-CTh9zxEi.js} +1 -1
  33. package/server/{claude-hooks-provision-BlGv6twJ.js → claude-hooks-provision-fRofvhTN.js} +2 -2
  34. package/server/{claude-permissions-aHgDcZi5.js → claude-permissions-DLrb9ovz.js} +18 -3
  35. package/server/{claude-settings-overlay-T2LWLteV.js → claude-settings-overlay-BYnXaTVc.js} +2 -2
  36. package/server/{claude-settings-overlay-CYOvFE3A.js → claude-settings-overlay-CMS5Jab5.js} +1 -1
  37. package/server/cli-BflmtEFM.js +2 -0
  38. package/server/{cli-Do8UpLoI.js → cli-CoQou1t_.js} +11 -11
  39. package/server/{cliproxy-CX6jHRDP.js → cliproxy-DXDQcR3I.js} +52 -17
  40. package/server/cliproxy-DdhFpcXU.js +3 -0
  41. package/server/{close-issue-J0_eWYT1.js → close-issue-CpQ0BWg-.js} +5 -5
  42. package/server/{closed-issue-reaper-bFppuk6F.js → closed-issue-reaper-CdcJRvUx.js} +13 -12
  43. package/server/{closed-issue-reaper-Cl2h9AfT.js → closed-issue-reaper-TymtZM37.js} +1 -1
  44. package/server/{codex-icapA4om.js → codex-BValsmtK.js} +1 -1
  45. package/server/{codex-OOea7lXs.js → codex-DYyZL8JD.js} +16 -10
  46. package/server/{compaction-continuation-D5voR1ME.js → compaction-continuation-CVjbdGKt.js} +3 -3
  47. package/server/{config-Cjleh3_U.js → config-CvKH7r7W.js} +1 -1
  48. package/server/{config-tucKBCCc.js → config-NxI9Yl2f.js} +2 -2
  49. package/server/{config-DC75T4Mr.js → config-_qaa1UXH.js} +2 -2
  50. package/server/{config-yaml-BwOEANMr.js → config-yaml-D60AnTIu.js} +55 -15
  51. package/server/{conflict-gate-DlpWCMd7.js → conflict-gate-0dD1kxjN.js} +1 -1
  52. package/server/{conflict-gate-D2L1kZeL.js → conflict-gate-hAUCL-un.js} +5 -5
  53. package/server/{context-layers-CSPGc2Hb.js → context-layers-CdpabJj0.js} +3 -3
  54. package/server/context-layers-Ds1MnEFI.js +4 -0
  55. package/server/{continue-U3Af0jUq.js → continue-CnvrUfxw.js} +3 -3
  56. package/server/{control-settings-5k6ixdFW.js → control-settings-Db0uXgVM.js} +310 -7
  57. package/server/{conversation-compaction-CSpVpxN6.js → conversation-compaction-B-1KETG9.js} +8 -8
  58. package/server/{conversation-compaction-Ciit9O6k.js → conversation-compaction-DzMXGRiJ.js} +1 -1
  59. package/server/{conversation-service-BxrB5lUT.js → conversation-service-BL-asWPX.js} +1 -1
  60. package/server/{conversation-service-BteE4ELK.js → conversation-service-BxIOd5ay.js} +21 -7
  61. package/server/conversations-CEMfwMt-.js +3 -0
  62. package/server/{conversations-DhwxsOru.js → conversations-nS6QgYpD.js} +12 -7
  63. package/server/cost-3FyqKK56.js +838 -0
  64. package/server/{cost-Bnf9NUC5.js → cost-Cctc-Q9M.js} +3 -3
  65. package/server/{cost-CQKI6OCu.js → cost-DTuIRE4y.js} +2 -2
  66. package/server/{cost-sync-B-ADeXKY.js → cost-sync-DfmvLT9L.js} +3 -3
  67. package/server/{dag-DI9LaK_q.js → dag-o-dUpw1L.js} +6 -19
  68. package/server/{dangerous-git-ops-akhA3iyF.js → dangerous-git-ops-BOtXCFkT.js} +1 -1
  69. package/server/dashboard-db-worker.js +61 -11
  70. package/server/{deacon-TPYssFYt.js → deacon-CsisLmPt.js} +1735 -172
  71. package/server/{deacon-canonical-state-DFYymrDw.js → deacon-canonical-state-DkdkQS5p.js} +3 -3
  72. package/server/deacon-e6py3jkM.js +4 -0
  73. package/server/{deacon-event-client-Te5v10-b.js → deacon-event-client-BCjHiGAY.js} +1 -1
  74. package/server/{deacon-event-client-BKOL4AcL.js → deacon-event-client-CMQswEHX.js} +2 -2
  75. package/server/{deacon-nudge-log-BtlTWgWu.js → deacon-nudge-log-pcliw8Dr.js} +1 -1
  76. package/server/{deacon-pending-lifecycle-DVHjOLje.js → deacon-pending-lifecycle-BzaE76Xo.js} +3 -3
  77. package/server/deacon.js +11 -11
  78. package/server/{dead-end-trip-P0IF1O0E.js → dead-end-trip-Bs3hxIn6.js} +3 -3
  79. package/server/dead-end-trip-DUbiRMtT.js +2 -0
  80. package/server/delivery-DhZGRShH.js +3 -0
  81. package/server/{deploy-patrol-BXjlvoV3.js → deploy-patrol-B8sKkA8h.js} +8 -8
  82. package/server/deploy-queue--smqHLhe.js +2 -0
  83. package/server/{deploy-queue-o7shYg1j.js → deploy-queue-CCGWXFkp.js} +2 -2
  84. package/server/{deploy-window-CNT6fOff.js → deploy-window-YuJewzmC.js} +4 -4
  85. package/server/{deploy-window-BMk5_oX6.js → deploy-window-hgsvZ3UZ.js} +1 -1
  86. package/server/{dev-supervisor-SR1CLOAK.js → dev-supervisor-4SBloJHV.js} +2 -2
  87. package/server/{devcontainer-renderer-enMmNDFa.js → devcontainer-renderer-BiJhwFNi.js} +3 -3
  88. package/server/{dist-CPTO_zMR.js → dist-CoR2sivG.js} +1 -1
  89. package/server/dist-FHv1s5ez.js +3 -0
  90. package/server/{docker-B7qUZptz.js → docker-CWO7dcIP.js} +3 -3
  91. package/server/{docker-KR3zSFKY.js → docker-DQzyMXkd.js} +1 -1
  92. package/server/{dod-gK835UMf.js → dod-BAk5arLF.js} +1 -1
  93. package/server/{done-preflight-CksRvh49.js → done-preflight-CGFA0M1b.js} +1 -1
  94. package/server/{done-preflight-Bk8aExAL.js → done-preflight-Cx9JGznT.js} +5 -5
  95. package/server/{driver-CmsY2RLl.js → driver-BtcFz-qu.js} +14 -3
  96. package/server/durable-review-pipeline-BOEZ0chh.js +3 -0
  97. package/server/{durable-review-pipeline-DgYHucN2.js → durable-review-pipeline-Djx_lvFd.js} +11 -2
  98. package/server/{ensure-devcontainer-BQ4YizSH.js → ensure-devcontainer-Dk6ZMOUC.js} +1 -1
  99. package/server/{ensure-devcontainer-ojerEqQg.js → ensure-devcontainer-DzYBBwnM.js} +4 -4
  100. package/server/{esm-shims-1htPASWs.js → esm-shims-deFq5Hhl.js} +1 -1
  101. package/server/{event-store-BgEjNsvk.js → event-store-C50Qt-f1.js} +1 -1
  102. package/server/{event-store-D7qcJXuZ.js → event-store-DTns2XZP.js} +5 -5
  103. package/server/{event-store-provider-BKvk2rDj.js → event-store-provider-Bu1Qrg6v.js} +1 -1
  104. package/server/{events-BIKGJZOT.js → events-B6xW8Cpm.js} +3 -3
  105. package/server/{dist-src-BM9eudEd.js → factory-CWVKwKFE.js} +714 -2
  106. package/server/{feature-registry-storage-ewNSIVsQ.js → feature-registry-storage-vaxRN3WO.js} +3 -3
  107. package/server/{features-CGopJXdU.js → features-DXWwktJB.js} +2 -2
  108. package/server/{feedback-stuck-retirement-B8-fX7NA.js → feedback-stuck-retirement-CXAYe2rU.js} +2 -2
  109. package/server/{feedback-target-CkyLYohm.js → feedback-target-DSVpi0gT.js} +1 -1
  110. package/server/{feedback-target-Ci6N5p4G.js → feedback-target-yPD_wclF.js} +10 -10
  111. package/server/{feedback-writer-DfuVjvH0.js → feedback-writer-BzN4qvaP.js} +1 -1
  112. package/server/{feedback-writer-D4ULO4qG.js → feedback-writer-Ds1Wjsz4.js} +5 -5
  113. package/server/{flywheel-DXI_WITn.js → flywheel-BCZS-FlW.js} +1 -1
  114. package/server/{flywheel-BwYPDlhK.js → flywheel-CC4gE_rx.js} +15 -15
  115. package/server/{flywheel-C7yek87O.js → flywheel-DWKd7bMc.js} +79 -29
  116. package/server/{flywheel-merge-order-C5m5bYBc.js → flywheel-merge-order-DDT3i57u.js} +1 -1
  117. package/server/{flywheel-merge-order-CXfU4M6l.js → flywheel-merge-order-DJwH2KpL.js} +17 -15
  118. package/server/forge-4VVCRcF7.js +2 -0
  119. package/server/{forge-DYX9sKzG.js → forge-CHADjOFs.js} +2 -2
  120. package/server/{from-DAdMxC29.js → from-C3dzmjSO.js} +1 -1
  121. package/server/{fs-lock-cw25uO_E.js → fs-lock-DQ_gUxfq.js} +2 -2
  122. package/server/{fts-operations-D_rzLxX5.js → fts-operations-asZo2fh1.js} +3 -3
  123. package/server/git-info-DMOSfJ9I.js +148 -0
  124. package/server/{git-utils-Y0zG25ez.js → git-utils-BAMwn9Nf.js} +1 -1
  125. package/server/{git-utils-DV4B9TRl.js → git-utils-BdHk8y7g.js} +4 -4
  126. package/server/{github-app-C33lDk9Z.js → github-app-BWziYCf3.js} +1 -1
  127. package/server/{github-app-4UX8VIr8.js → github-app-BlMSzSTw.js} +2 -2
  128. package/server/{github-client-nPj5ckZO.js → github-client-OK24qpol.js} +1 -1
  129. package/server/{github-client-DkJVR908.js → github-client-w6j5nVlz.js} +3 -3
  130. package/server/{github-pr-lookup-C9Vokb0W.js → github-pr-lookup-bGcsEvLE.js} +2 -2
  131. package/server/{harness-binary-BgXYDo2Z.js → harness-binary-DChiynaB.js} +2 -2
  132. package/server/{harness-resolve-1NZcVx7n.js → harness-resolve-BplBEbwn.js} +4 -4
  133. package/server/{health-events-jMfxrElt.js → health-events-BTqsmunw.js} +1 -1
  134. package/server/{health-events-DlX_FVAB.js → health-events-Bk3LjaJ9.js} +2 -2
  135. package/server/{hooks-NQ19vvlB.js → hooks-DJR1yR9w.js} +2 -2
  136. package/server/{hooks-W3REcb3h.js → hooks-EndRNrx9.js} +1 -1
  137. package/server/{hume-BFkid2PO.js → hume-1FJmNDTq.js} +2 -2
  138. package/server/hume-gXLmRhmN.js +3 -0
  139. package/server/{identity-Bwh6VGeL.js → identity-C3s8lyp0.js} +3 -3
  140. package/server/{idle-stack-reaper-CHtCNpvd.js → idle-stack-reaper-CBelVOE3.js} +1 -1
  141. package/server/{idle-stack-reaper-BeU_KxWx.js → idle-stack-reaper-DtoI4al6.js} +4 -4
  142. package/server/{in-flight-guard-pcwXKLGz.js → in-flight-guard-B7khcBdQ.js} +1 -1
  143. package/server/{infra-KTp9KV9u.js → infra-CJRi_5Wu.js} +36 -7
  144. package/server/{injection-67YyU6SC.js → injection-ADWQ3D0s.js} +8 -8
  145. package/server/{injection-BxbZKPDh.js → injection-BWsgHvrL.js} +1 -1
  146. package/server/{inspect-agent-VHSihlb7.js → inspect-agent-CCfNJjKr.js} +12 -12
  147. package/server/inspect-agent-Dhp3hCGp.js +2 -0
  148. package/server/{internal-token-B-z-sGBH.js → internal-token-BCTEqUCX.js} +1 -1
  149. package/server/{internal-token-zY75jrRJ.js → internal-token-BeIWG_kT.js} +2 -2
  150. package/server/{io-DfvO2xyh.js → io-BCtZoXHo.js} +5 -5
  151. package/server/{issue-closed-dvEWKO7Q.js → issue-closed-CiYAa6bX.js} +7 -7
  152. package/server/{issue-lifecycle-3N8XF7lP.js → issue-lifecycle-BETNVVLq.js} +206 -29
  153. package/server/{issue-lifecycle-BI6jAfp8.js → issue-lifecycle-DaKN57sx.js} +1 -1
  154. package/server/{issue-service-singleton-CL6hESX2.js → issue-service-singleton-1Q0ER8Yc.js} +1 -1
  155. package/server/{issue-service-singleton-BN_2MXp4.js → issue-service-singleton-C_sZ0HjP.js} +124 -11
  156. package/server/issue-title-fallback-B91iD66g.js +120 -0
  157. package/server/{issues-CkvUoAnq.js → issues-RGHQUKhB.js} +2 -2
  158. package/server/{jsonl-parser-CrEb2PWr.js → jsonl-parser-Dfs1dlYE.js} +3 -3
  159. package/server/jsonl-resolver-bFtftCDd.js +324 -0
  160. package/server/{kimi-code-DoMoGqIu.js → kimi-code-BxkDgaj4.js} +1 -1
  161. package/server/{kimi-code-C26gmGxM.js → kimi-code-CNYRA8Dd.js} +14 -12
  162. package/server/{kimi-parser-Dmhy3UlR.js → kimi-parser-OcWwmOqF.js} +2 -2
  163. package/server/{label-cleanup-X2lWfghH.js → label-cleanup-CefxK9tL.js} +3 -3
  164. package/server/{lifecycle-B0rL38D3.js → lifecycle-DDZ7w-BY.js} +6 -6
  165. package/server/{lifecycle-Bg44O-9x.js → lifecycle-DVXyUil2.js} +2 -2
  166. package/server/{lifecycle-io-DQDU0apV.js → lifecycle-io-D1oBiMce.js} +1 -1
  167. package/server/{lifecycle-io-CCBpRv5m.js → lifecycle-io-D7N0vQNj.js} +5 -5
  168. package/server/{linear-client-B0cIkTs4.js → linear-client-DUN7zCeb.js} +3 -3
  169. package/server/{linear-client-6V2E-DSa.js → linear-client-TL32snOy.js} +1 -1
  170. package/server/{linear-mcp-auth-LCo9AWUd.js → linear-mcp-auth-CtRKSHy5.js} +1 -1
  171. package/server/{linear-mcp-auth-Dsu9Io9r.js → linear-mcp-auth-bB0CPyjh.js} +5 -5
  172. package/server/memory-fts-worker.js +1 -1
  173. package/server/{memory-governor-A4O6vI9d.js → memory-governor-Cvv_9K0M.js} +88 -22
  174. package/server/{memory-pressure-patrol-BWlWywmA.js → memory-pressure-patrol-C6DJJQRA.js} +38 -14
  175. package/server/{merge-BGWcBxku.js → merge-DOCR6pHi.js} +1 -1
  176. package/server/{merge-vz80RvSE.js → merge-FTk4LsnM.js} +3 -3
  177. package/server/{merge-agent-GWhmnxFk.js → merge-agent-C-dsN9se.js} +37 -33
  178. package/server/{merge-agent-BRSz26Oh.js → merge-agent-D-4_iQgy.js} +2 -2
  179. package/server/{merge-batch-CFMEtTxv.js → merge-batch-BJjzUUL7.js} +1 -1
  180. package/server/{merge-completeness-CP347umA.js → merge-completeness-BOtBUwTU.js} +4 -4
  181. package/server/{merge-completeness-7ajHAIR-.js → merge-completeness-CoLJxfUY.js} +1 -1
  182. package/server/merge-eligibility-C4rTS97F.js +3 -0
  183. package/server/merge-eligibility-D7wRnJbj.js +51 -0
  184. package/server/merge-ops-Cf02szJ5.js +2 -0
  185. package/server/merge-rebase-Bj7eJAG4.js +2 -0
  186. package/server/{merge-rebase-C5htyEEH.js → merge-rebase-KBw4rdh3.js} +2 -2
  187. package/server/{merge-set-DsGW8fmc.js → merge-set-CVfEM57p.js} +1 -1
  188. package/server/{merge-set-eiE2nC6C.js → merge-set-CyW-xSn4.js} +4 -4
  189. package/server/{merge-sync-CM2-myXu.js → merge-sync-CYGsJy0u.js} +1 -1
  190. package/server/{merge-sync-Ct0-cxMX.js → merge-sync-YLvOPAry.js} +2 -2
  191. package/server/{merge-train-BOu3fN7O.js → merge-train-VxLn8Ms4.js} +4 -4
  192. package/server/{merge-train-deps-LXHGK61n.js → merge-train-deps-D0y4hBB9.js} +4 -4
  193. package/server/{merge-verification-BRp08IzI.js → merge-verification-BfJRNMiD.js} +6 -6
  194. package/server/{merged-docker-cleanup-worker-CwldDjHV.js → merged-docker-cleanup-worker-Bh5fKG_b.js} +4 -4
  195. package/server/{merged-docker-cleanup-worker-C8eGn78a.js → merged-docker-cleanup-worker-Ci9oeFAe.js} +1 -1
  196. package/server/messaging-Dfbhgjd6.js +3 -0
  197. package/server/{multipart-parser-OAuW7824.js → multipart-parser-BYwfKOVU.js} +2 -2
  198. package/server/{no-resume-mode-MWI6pnrK.js → no-resume-mode-DjMQRkId.js} +1 -1
  199. package/server/node_modules/.package-lock.json +24 -24
  200. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/AGENTS.md +14 -0
  201. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/CLAUDE.md +14 -0
  202. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +10 -3
  203. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/package.json +2 -2
  204. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/10_basics.ts +175 -0
  205. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/index.md +6 -0
  206. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/10_basics.ts +3 -1
  207. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/20_testing.ts +100 -0
  208. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/api/Users.ts +30 -14
  209. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/domain/User.ts +15 -6
  210. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +11 -10
  211. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +41 -32
  212. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users.ts +141 -20
  213. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/70_cli/10_basics.ts +31 -5
  214. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
  215. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +10 -9
  216. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
  217. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.d.ts.map +1 -1
  218. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js +12 -9
  219. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js.map +1 -1
  220. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js +1 -1
  221. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js.map +1 -1
  222. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js +4 -4
  223. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js.map +1 -1
  224. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.d.ts.map +1 -1
  225. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js +10 -4
  226. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js.map +1 -1
  227. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts +4 -0
  228. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts.map +1 -0
  229. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js +10 -0
  230. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js.map +1 -0
  231. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +7 -7
  232. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +16 -11
  233. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeClusterSocket.ts +15 -12
  234. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocket.ts +1 -1
  235. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocketServer.ts +4 -4
  236. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeStream.ts +10 -4
  237. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/internal/nodeChildProcessSpawner.ts +16 -0
  238. package/server/node_modules/@types/node/README.md +1 -1
  239. package/server/node_modules/@types/node/buffer.buffer.d.ts +5 -5
  240. package/server/node_modules/@types/node/crypto.d.ts +2 -2
  241. package/server/node_modules/@types/node/http.d.ts +16 -0
  242. package/server/node_modules/@types/node/http2.d.ts +10 -2
  243. package/server/node_modules/@types/node/package.json +2 -2
  244. package/server/node_modules/@types/node/process.d.ts +52 -0
  245. package/server/node_modules/@types/node/quic.d.ts +210 -28
  246. package/server/node_modules/@types/node/sqlite.d.ts +6 -2
  247. package/server/node_modules/@types/node/test.d.ts +36 -0
  248. package/server/node_modules/ansi-regex/index.js +3 -2
  249. package/server/node_modules/ansi-regex/package.json +1 -1
  250. package/server/node_modules/effect/node_modules/uuid/README.md +19 -19
  251. package/server/node_modules/effect/node_modules/uuid/dist/v1.js +7 -3
  252. package/server/node_modules/effect/node_modules/uuid/dist/v7.js +5 -2
  253. package/server/node_modules/effect/node_modules/uuid/dist-node/v1.js +7 -3
  254. package/server/node_modules/effect/node_modules/uuid/dist-node/v7.js +5 -2
  255. package/server/node_modules/effect/node_modules/uuid/package.json +4 -3
  256. package/server/node_modules/gaxios/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  257. package/server/node_modules/gaxios/build/esm/tsconfig.tsbuildinfo +1 -1
  258. package/server/node_modules/gaxios/package.json +3 -3
  259. package/server/node_modules/msgpackr/dist/index-no-eval.cjs +11 -5
  260. package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
  261. package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
  262. package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
  263. package/server/node_modules/msgpackr/dist/index.js +11 -5
  264. package/server/node_modules/msgpackr/dist/index.js.map +1 -1
  265. package/server/node_modules/msgpackr/dist/index.min.js +1 -1
  266. package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
  267. package/server/node_modules/msgpackr/dist/node.cjs +11 -5
  268. package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
  269. package/server/node_modules/msgpackr/dist/test.js +11 -5
  270. package/server/node_modules/msgpackr/dist/test.js.map +1 -1
  271. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +11 -5
  272. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
  273. package/server/node_modules/msgpackr/package.json +1 -1
  274. package/server/node_modules/msgpackr/unpack.js +11 -5
  275. package/server/node_modules/picomatch/lib/parse.js +10 -1
  276. package/server/node_modules/picomatch/lib/scan.js +30 -18
  277. package/server/node_modules/picomatch/package.json +1 -1
  278. package/server/{orphan-proposed-reconciler-BAE5AZ_e.js → orphan-proposed-reconciler-CnP0K2v3.js} +2 -2
  279. package/server/{orphan-proposed-reconciler-cV3URUqk.js → orphan-proposed-reconciler-nFUlquZt.js} +24 -23
  280. package/server/package-lock.json +25 -25
  281. package/server/package.json +1 -1
  282. package/server/{pan-dir-DDd91kMb.js → pan-dir-B4NfzOf3.js} +5 -5
  283. package/server/{deacon-merge-BOGFEV8_.js → parked-residue-8WbU0y1z.js} +188 -69
  284. package/server/{paths-CRLnDgcI.js → paths-rETQhTF2.js} +2 -2
  285. package/server/{pending-lifecycle-claim-CYgMiDAP.js → pending-lifecycle-claim-yAwDuGS4.js} +2 -2
  286. package/server/{pickup-BjJsSX12.js → pickup-Dle6k9Xt.js} +1 -1
  287. package/server/{pipeline-agent-reader-BLc43dVJ.js → pipeline-agent-reader-CeWhQzXC.js} +5 -5
  288. package/server/{pipeline-membership-BHZp_ShY.js → pipeline-membership-BV4hdkHm.js} +1 -1
  289. package/server/{pipeline-membership-5qlRz5Qg.js → pipeline-membership-C9ykcjsn.js} +1 -1
  290. package/server/{pipeline-membership-gather-CGFY1v-y.js → pipeline-membership-gather-Ba0wJNCR.js} +17 -12
  291. package/server/{pipeline-membership-gather-WhRc1yke.js → pipeline-membership-gather-C9E22B2W.js} +1 -1
  292. package/server/{pipeline-notifier-C4fZ2ito.js → pipeline-notifier-B5DPXvnr.js} +1 -1
  293. package/server/{pipeline-notifier-BmsLWM_2.js → pipeline-notifier-p190L97e.js} +2 -2
  294. package/server/{post-merge-lifecycle-worker-KK1RTKRE.js → post-merge-lifecycle-worker-OQoK8Ckg.js} +3 -3
  295. package/server/{post-merge-state-_Lj3LDLh.js → post-merge-state-DFaf7OI1.js} +4 -4
  296. package/server/prd-locations-F2oLSAhy.js +124 -0
  297. package/server/{project-pipelines-CCkebHOu.js → project-pipelines-CUsa6U59.js} +2 -2
  298. package/server/project-repos-BVdi9-ch.js +3 -0
  299. package/server/{project-repos-B4MK48j4.js → project-repos-CsfvLtmr.js} +29 -3
  300. package/server/project-resource-refresh-queue-BehrH4Ai.js +865 -0
  301. package/server/project-resource-refresh-queue-D2110Guc.js +2 -0
  302. package/server/{projects-DvPEAP18.js → projects-BMuEf14J.js} +1 -1
  303. package/server/{prompts-BiS5I2tZ.js → prompts-CKpDt8Jn.js} +2 -2
  304. package/server/providers-Buv2wmFU.js +3 -0
  305. package/server/{providers-DrfK0Ip8.js → providers-CxPKmyif.js} +7 -7
  306. package/server/public/assets/{chunk-BO2N2NFS-GtVe_o56.js → chunk-BO2N2NFS-DZOQVqV1.js} +4 -4
  307. package/server/public/assets/{diagram-OG6HWLK6-BvhcYYHc.js → diagram-OG6HWLK6-oKeXcbO1.js} +1 -1
  308. package/server/public/assets/{dist-CSmUXazd.js → dist-2qPmeRzT.js} +3 -3
  309. package/server/public/assets/{dist-D0ryefak.js → dist-ClBlE-Nm.js} +1 -1
  310. package/server/public/assets/{ganttDiagram-6RSMTGT7-BXA51DzM.js → ganttDiagram-6RSMTGT7-BwdG9fQv.js} +1 -1
  311. package/server/public/assets/{highlighted-body-OFNGDK62-mlV4EpWt.js → highlighted-body-OFNGDK62-BzGNdskQ.js} +1 -1
  312. package/server/public/assets/index-CdPveU3M.css +1 -0
  313. package/server/public/assets/index-Cg6tdZoY.js +860 -0
  314. package/server/public/assets/{linear-BPE7oswm.js → linear-DpEt1TJb.js} +1 -1
  315. package/server/public/assets/mermaid-GHXKKRXX-6KBD_3T_.js +1 -0
  316. package/server/public/assets/{pieDiagram-4H26LBE5-BguGGV3S.js → pieDiagram-4H26LBE5-9BpM4oRJ.js} +1 -1
  317. package/server/public/assets/{prod-aKDYUrXQ.js → prod-CzJiNNEG.js} +4 -4
  318. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bx3i4B6H.js → quadrantDiagram-W4KKPZXB-BXWVAoZx.js} +1 -1
  319. package/server/public/assets/{sankeyDiagram-5OEKKPKP-B5vuLjA4.js → sankeyDiagram-5OEKKPKP-5oxodGEw.js} +1 -1
  320. package/server/public/assets/{xychartDiagram-2RQKCTM6-HPlpkqsN.js → xychartDiagram-2RQKCTM6-BChDrHxZ.js} +1 -1
  321. package/server/public/index.html +2 -2
  322. package/server/pull-requests-CmlandI7.js +2 -0
  323. package/server/{pull-requests-BcHIsFJv.js → pull-requests-T0OV0Vn4.js} +3 -3
  324. package/server/{rally-B1OMtzch.js → rally-CUqj2oIN.js} +3 -3
  325. package/server/rally-DYIn9R2U.js +3 -0
  326. package/server/{rally-api-ShZ4kvn0.js → rally-api-BFPb2oSq.js} +2 -2
  327. package/server/{rally-api-u_vkr5c_.js → rally-api-BoucQG1u.js} +1 -1
  328. package/server/{rally-client-D6Feq1Ka.js → rally-client-16iObny7.js} +5 -5
  329. package/server/{rally-client-DgZvUZqX.js → rally-client-CsqLjLLa.js} +1 -1
  330. package/server/{reap-terminal-sessions-CRfiXLY0.js → reap-terminal-sessions-BaDSNR-k.js} +2 -2
  331. package/server/{reap-terminal-sessions-D7f3zSE9.js → reap-terminal-sessions-DgEIKMhH.js} +2 -2
  332. package/server/{rebuild-stack-CCwKHZb6.js → rebuild-stack-BcBVFJp3.js} +2 -2
  333. package/server/{rebuild-stack-DKxOnkpE.js → rebuild-stack-CyXMrj6K.js} +7 -7
  334. package/server/reconciler-caYiRnPy.js +657 -0
  335. package/server/{reconstruct-cache-BP8UIKt7.js → reconstruct-cache-3JzPOune.js} +7 -7
  336. package/server/{record-By-wp6pg.js → record-DYOg97Iv.js} +1 -1
  337. package/server/{record-update-D23jPU6b.js → record-update-BPqpBu3O.js} +9 -7
  338. package/server/{record-update-ByGtIlUK.js → record-update-CDPEX7BH.js} +1 -1
  339. package/server/{recovery-trip-C4dTl8DO.js → recovery-trip-CpfW6LCJ.js} +43 -10
  340. package/server/{recovery-trip-qloOYOFz.js → recovery-trip-xqKC07Gy.js} +1 -1
  341. package/server/{release-engine-Crc0Tjx-.js → release-engine-C_OOhCaK.js} +5 -5
  342. package/server/{release-set-DDXwbIK7.js → release-set-DOIDz2vw.js} +3 -3
  343. package/server/{remote-oEMfXlwT.js → remote-BTh-sjpX.js} +3 -3
  344. package/server/{remote-agents-Bgtc2nOO.js → remote-agents-DbbN7vSm.js} +6 -6
  345. package/server/{remote-agents-DQVGZVQ9.js → remote-agents-MuXx2gWm.js} +1 -1
  346. package/server/{remote-completion-DxUJ5HKR.js → remote-completion-LcWCpAm2.js} +13 -13
  347. package/server/{remote-CBpLi4Yy.js → remote-xY0B43Ho.js} +3 -3
  348. package/server/{resolver-CuAULbLs.js → resolver-C2QKOf09.js} +2 -2
  349. package/server/{resolver-C8rooxoz.js → resolver-D4nsxfGo.js} +31 -8
  350. package/server/resume-ByUrJUNX.js +3 -0
  351. package/server/{review-agent-7C2w5CzU.js → review-agent-BRBTm1qE.js} +43 -55
  352. package/server/review-agent-Caodi0PX.js +3 -0
  353. package/server/{review-artifacts-BJeEfm2r.js → review-artifacts-DgaDlbO4.js} +6 -6
  354. package/server/{review-convoy-liveness-DfF9eXjI.js → review-convoy-liveness-BBvyuRLC.js} +20 -11
  355. package/server/{review-run-recovery-ZjuDTNhZ.js → review-run-recovery-DCzWMMvE.js} +1 -1
  356. package/server/{review-run-recovery-7BKt2Es0.js → review-run-recovery-THHMKlXJ.js} +3 -3
  357. package/server/{review-status-CUnjjOUu.js → review-status-Bge_3XTR.js} +1 -1
  358. package/server/{review-status-DBnR5t4z.js → review-status-DpniqzPT.js} +113 -44
  359. package/server/{review-status-emit-Cg4tOb8U.js → review-status-emit-D7sM720S.js} +3 -3
  360. package/server/{review-status-enrichment-D-rQshu6.js → review-status-enrichment-PDI4-faj.js} +3 -3
  361. package/server/{review-status-source-DSn0glLa.js → review-status-source-D2PCWS6E.js} +1 -1
  362. package/server/{review-status-source-Ct912fv_.js → review-status-source-Jq0BXmn3.js} +1 -1
  363. package/server/{review-status-sync-B7V_Gg51.js → review-status-sync-C6ZKTI8f.js} +11 -8
  364. package/server/{review-status-sync-YthpOH_q.js → review-status-sync-CvpHWyvR.js} +1 -1
  365. package/server/{review-verdict-feedback-C-dBon_-.js → review-verdict-feedback-B2ojHFH5.js} +8 -8
  366. package/server/{review-verdict-feedback-DqXTuJk8.js → review-verdict-feedback-tyMoLT2L.js} +1 -1
  367. package/server/{review-verdict-writer-CKaJWp75.js → review-verdict-writer-Cy_1pnIj.js} +7 -7
  368. package/server/{review-verdict-writer-jldSh3Bm.js → review-verdict-writer-DjrJ64eS.js} +1 -1
  369. package/server/{rollup-DZwH4CLs.js → rollup-Cp0KEoOu.js} +1 -1
  370. package/server/{rollup-QCwYcBdP.js → rollup-DU3xBQu2.js} +8 -8
  371. package/server/{scanner-2aHeLC3W.js → scanner-BFKG3Gxv.js} +8 -8
  372. package/server/{search-DwHYaj66.js → search-DhtKwbBC.js} +2 -2
  373. package/server/{secret-redaction-B5G1xZ3k.js → secret-redaction-DLZ-VqHq.js} +1 -1
  374. package/server/{sequence-io-POKWdusG.js → sequence-io-C-Q19Jez.js} +4 -4
  375. package/server/{sequencer-agent-DS00KHVm.js → sequencer-agent-eN2P2lDz.js} +6 -6
  376. package/server/server.js +1499 -1350
  377. package/server/{service-BLb_CyPL.js → service-CThO0Sar.js} +80 -774
  378. package/server/{session-fork-DcTzVwex.js → session-fork-ZYTHtpBh.js} +2 -2
  379. package/server/settings-ByDRfuuE.js +2 -0
  380. package/server/{settings-Clw8UVNs.js → settings-CTywpFw5.js} +2 -2
  381. package/server/{settings-B9-H2K_E.js → settings-nAT-eK56.js} +3 -3
  382. package/server/{shadow-engineering-C6oO_PiR.js → shadow-engineering-BHZKPJhq.js} +3 -3
  383. package/server/{shadow-state-CEGrrECe.js → shadow-state-BTLi4Axs.js} +2 -2
  384. package/server/{shadow-state-e7250VUx.js → shadow-state-CZ_LnPsi.js} +1 -1
  385. package/server/{shadow-utils-xFk2Wusb.js → shadow-utils-CPLlPHdn.js} +2 -2
  386. package/server/{ship-log-7BnQHuKU.js → ship-log-D-CphNZx.js} +1 -1
  387. package/server/{ship-record-CwUX6Afo.js → ship-record-BaBla0l_.js} +7 -7
  388. package/server/{ship-record-BgUPnpT0.js → ship-record-BlvX8-xv.js} +1 -1
  389. package/server/{ship-status-Ce3_3edi.js → ship-status-rQbPQBsF.js} +2 -2
  390. package/server/{smart-compaction-BmfIi3oL.js → smart-compaction-CUXn8mfX.js} +1 -1
  391. package/server/{smart-compaction-Dy0gw1VH.js → smart-compaction-D1CNGdZx.js} +7 -7
  392. package/server/{spawn-planning-session-nH3b4Drz.js → spawn-planning-session-DCmO6COk.js} +19 -19
  393. package/server/{spawn-planning-session-CfhxRJoY.js → spawn-planning-session-DfEWyrVV.js} +2 -2
  394. package/server/{specialist-completion-CC1XJbTx.js → specialist-completion-BMv3K54P.js} +1 -1
  395. package/server/{specialist-context-cHwpcXSh.js → specialist-context-C1-CfYQb.js} +5 -5
  396. package/server/{specialist-handoff-logger-GqnGSYoJ.js → specialist-handoff-logger-BDKoz5Z9.js} +2 -2
  397. package/server/{specialist-logs-5OTnrV91.js → specialist-logs-BJQFkpdG.js} +3 -3
  398. package/server/specialists-CYt1U3Zm.js +4 -0
  399. package/server/{specialists-8LcQi9Np.js → specialists-D6MUU31Q.js} +21 -272
  400. package/server/{specialists-DocAK-7A.js → specialists-DhS79T9v.js} +369 -691
  401. package/server/{specialists-xXcJHAyg.js → specialists-Dx0zRTxX.js} +1 -1
  402. package/server/specialists-registry-BRLCi61y.js +3 -0
  403. package/server/specialists-registry-Bng0OFGH.js +277 -0
  404. package/server/specs-oRGyfz6C.js +3 -0
  405. package/server/{src-C2TAxwki.js → src-C7gGe4KU.js} +6 -6
  406. package/server/{src-DudQNYVw.js → src-CdwN6WY6.js} +344 -7
  407. package/server/{src-DUVvEA8Q.js → src-DMosbuSJ.js} +3 -3
  408. package/server/{stack-health-DKT4ySnA.js → stack-health-BKfNaqMm.js} +3 -3
  409. package/server/{stack-health-CbyiYS9H.js → stack-health-Bz711z1Y.js} +1 -1
  410. package/server/{stale-task-claims-PzFee70R.js → stale-task-claims-DMRLb5R2.js} +5 -5
  411. package/server/{staleness-D8UTEXV5.js → staleness-CxZaIhrn.js} +1 -1
  412. package/server/{staleness-BjOAq9-d.js → staleness-r_dkMyMG.js} +1 -1
  413. package/server/{stall-sweeper-DOyIfeLR.js → stall-sweeper-CBWqSWV2.js} +8 -8
  414. package/server/{state-home-DhAZlk5k.js → state-home-DhsMqg8W.js} +2 -2
  415. package/server/{state-mapping-BVSs84bO.js → state-mapping-D2yC81Vy.js} +1 -1
  416. package/server/{state-migrate-CJKEwpB0.js → state-migrate-C2Ouyd6e.js} +6 -6
  417. package/server/{state-mirror-Do7pag7W.js → state-mirror-BPXciz84.js} +3 -3
  418. package/server/stuck-remediation-DALieAkx.js +2 -0
  419. package/server/stuck-remediation-kta3KN7c.js +774 -0
  420. package/server/{substrate-bug-weights-service-BTNjHBnl.js → substrate-bug-weights-service-D_ICP7TI.js} +3 -3
  421. package/server/{summary-fork-CvB7Oyq9.js → summary-fork-CojrFKb6.js} +2 -2
  422. package/server/{summary-fork-CZ88rhVx.js → summary-fork-DhhaFhxZ.js} +113 -30
  423. package/server/supervisor/{pane-composer-BaLLspSj.js → pane-composer-CoiVkGIt.js} +8 -1
  424. package/server/supervisor/{paths-D6XUcR_g.js → paths-DTGbtcaP.js} +8 -4
  425. package/server/supervisor/pty-supervisor.js +3 -3
  426. package/server/supervisor/{pty-token-DjjHxoCq.js → pty-token-GVqnvU3U.js} +2 -2
  427. package/server/supervisor-DSSWo4M2.js +2 -0
  428. package/server/{supervisor-D4v0WfiQ.js → supervisor-DqH-laVL.js} +4 -4
  429. package/server/{swarm-readiness-D8R-LWX5.js → swarm-readiness-LF8ZF_hc.js} +3 -3
  430. package/server/{synthesis-verdict-N5Z11pg7.js → synthesis-verdict-CGFF8uQI.js} +2 -2
  431. package/server/{synthesis-verdict-B6wvLGcA.js → synthesis-verdict-DSoOFUIV.js} +1 -1
  432. package/server/{system-prerequisites-BbGZ_WHF.js → system-prerequisites-Lsx0jUUV.js} +2 -2
  433. package/server/{teardown-workspace-CYend-KY.js → teardown-workspace-DMwomEG1.js} +16 -16
  434. package/server/{test-agent-queue-BUtWhNcc.js → test-agent-queue-Cu0D6BYe.js} +6 -6
  435. package/server/{test-verdict-BWm3hgDj.js → test-verdict-9mvl7pQn.js} +1 -1
  436. package/server/{test-verdict-BWtRmdiR.js → test-verdict-oNSv1rVr.js} +2 -2
  437. package/server/{tldr-daemon-CneJ24eL.js → tldr-daemon-CRSAkhBx.js} +1 -1
  438. package/server/{tldr-daemon-CMVBT4kT.js → tldr-daemon-McqCk2X7.js} +2 -2
  439. package/server/tmux-CYucGrTl.js +4 -0
  440. package/server/{tmux-BqXzRuaH.js → tmux-wnT_hg-s.js} +91 -19
  441. package/server/{token-CO3INKbh.js → token-BdfZLRg1.js} +2 -2
  442. package/server/{token-util-DyJJyX_B.js → token-util-Crcay9j_.js} +1 -1
  443. package/server/token-util-DfUS3Lpp.js +3 -0
  444. package/server/{tracker-config-DVzhaUxO.js → tracker-config-tfAOWgng.js} +2 -2
  445. package/server/{tracker-utils-xnVJVrrO.js → tracker-utils-Dbg_pVZg.js} +2 -2
  446. package/server/{traefik-connect-A5k54mCv.js → traefik-connect-DoQvQ6oJ.js} +1 -1
  447. package/server/{tunnel-DauSR-rs.js → tunnel-B1MNIgkL.js} +1 -1
  448. package/server/{tunnel-CwOnS-PB.js → tunnel-skW68j9B.js} +3 -3
  449. package/server/{typed-errors-B-gfU2RB.js → typed-errors-CZ3GFBvo.js} +1 -1
  450. package/server/{typed-errors-DzC4zXbI.js → typed-errors-DXqf3RnP.js} +1 -1
  451. package/server/{types-DjpLVpsj.js → types-PW4zkxCM.js} +1 -1
  452. package/server/{types-DbxY2QB6.js → types-pLpbsNto.js} +1 -1
  453. package/server/{uat-failure-feedback-BVqsWlrr.js → uat-failure-feedback-ly8ZwtfC.js} +5 -5
  454. package/server/{uat-promote-verification-DmG097QS.js → uat-promote-verification-BBaMwfdc.js} +5 -5
  455. package/server/{uat-train-DVUNW03P.js → uat-train-BBEiYSep.js} +0 -0
  456. package/server/{uat-train-COSy-vEX.js → uat-train-D7Ran2FB.js} +1 -1
  457. package/server/{validate-Dvv83iBx.js → validate-BYcBcBwg.js} +3 -3
  458. package/server/{validation-DlHafKzu.js → validation-BfG2jW5C.js} +9 -6
  459. package/server/{validation-BdCjzWLN.js → validation-nSrYiYvA.js} +1 -1
  460. package/server/{verification-artifact-CaSbxUVg.js → verification-artifact-Cmhgq4b_.js} +1 -1
  461. package/server/{verification-artifact-0Zku8N-W.js → verification-artifact-DglwaHke.js} +1 -1
  462. package/server/{verification-runner-DwP2fUEF.js → verification-runner-BEq5ZF-h.js} +53 -27
  463. package/server/{verification-runner-C6wdZda2.js → verification-runner-CFjAuv9u.js} +1 -1
  464. package/server/{vtt-parser-luerJpYT.js → vtt-parser-Va--tv27.js} +1 -1
  465. package/server/work-agent-prompt-BnhKNAg7.js +3 -0
  466. package/server/{work-agent-prompt--9AWNYwZ.js → work-agent-prompt-CaD2ue8m.js} +14 -14
  467. package/server/{work-agent-start-BNQO65W7.js → work-agent-start-0nJ-6UeA.js} +2 -2
  468. package/server/{work-agent-start-DkzseQFl.js → work-agent-start-D8NEN5KD.js} +1 -1
  469. package/server/workflows-BtHRlFIm.js +2 -0
  470. package/server/{workflows-BYwR2aIN.js → workflows-C7mxM1qc.js} +114 -41
  471. package/server/{workspace-iTnTycOB.js → workspace-BAhMgMaO.js} +3 -3
  472. package/server/{workspace-B-QJa3Ps.js → workspace-Dbqv9ehn.js} +1 -1
  473. package/server/{workspace-anchor-drift-CHiGg8iu.js → workspace-anchor-drift-B_3kyyxJ.js} +4 -4
  474. package/server/{workspace-anchor-drift-DTt6h2Em.js → workspace-anchor-drift-Bpa3xoni.js} +1 -1
  475. package/server/{workspace-config-D0CavVtz.js → workspace-config-D-bNq2CF.js} +1 -1
  476. package/server/{workspace-manager-5BKPV6SY.js → workspace-manager-BrbX90Rm.js} +1 -1
  477. package/server/{workspace-manager-W1OnbvU5.js → workspace-manager-CM8RCrSc.js} +17 -17
  478. package/server/{workspace-metadata-tbbevEmP.js → workspace-metadata-BEOwJSdK.js} +1 -1
  479. package/server/{workspace-metadata-dJhXvZGQ.js → workspace-metadata-Cu6yfxBS.js} +2 -2
  480. package/server/{workspaces-BlpbOPZ7.js → workspaces-C7LAuZfe.js} +140 -709
  481. package/sync-sources/dev-skills/pan-style-guide/SKILL.md +90 -15
  482. package/sync-sources/hooks/linear-mcp-auth-hook +6 -1
  483. package/sync-sources/rules/agent-message-delivery.md +21 -14
  484. package/sync-sources/rules/handoff-isolate-cwd.md +4 -4
  485. package/sync-sources/rules/pan-handoff-focus-limit.md +14 -5
  486. package/sync-sources/rules/ste-writing.md +17 -0
  487. package/sync-sources/rules/work-agents-via-pan.md +2 -1
  488. package/sync-sources/rules/writing-style.md +3 -2
  489. package/sync-sources/skills/{skill-creator → claude-skill-creator}/SKILL.md +1 -1
  490. package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/init_skill.py +1 -1
  491. package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/package_skill.py +1 -1
  492. package/sync-sources/skills/pan-gauntlet-loop/SKILL.md +230 -0
  493. package/sync-sources/skills/pan-gauntlet-loop/assets/PROMPT.template.md +92 -0
  494. package/sync-sources/skills/pan-gauntlet-loop/assets/REFERENCE-BAR.template.md +53 -0
  495. package/sync-sources/skills/pan-gauntlet-loop/assets/STYLE.template.md +41 -0
  496. package/sync-sources/skills/pan-gauntlet-loop/assets/gauntlet-index.html +237 -0
  497. package/sync-sources/skills/pan-gauntlet-loop/references/domains.md +106 -0
  498. package/sync-sources/skills/pan-handoff/SKILL.md +24 -6
  499. package/sync-sources/skills/pan-help/SKILL.md +1 -1
  500. package/sync-sources/skills/pan-peer-review/SKILL.md +3 -3
  501. package/sync-sources/skills/pan-restart/SKILL.md +6 -3
  502. package/sync-sources/skills/pan-start/SKILL.md +3 -0
  503. package/sync-sources/skills/pan-swarm/SKILL.md +32 -44
  504. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  505. package/server/activity-logger-BejO16Am.js +0 -3
  506. package/server/agent-state-DH_-Jkua.js +0 -3
  507. package/server/agents-megfmQHM.js +0 -3
  508. package/server/archive-planning-C-H9cM_J.js +0 -2
  509. package/server/build-info-PQlh_Rhb.js +0 -2
  510. package/server/cli-TaZspPHS.js +0 -2
  511. package/server/cliproxy-36ncAXlu.js +0 -3
  512. package/server/context-layers-CF6zHws4.js +0 -4
  513. package/server/conversations-AnGJ5rtX.js +0 -3
  514. package/server/deacon-BEH-IY0v.js +0 -5
  515. package/server/deacon-swarm-BHX-kR1b.js +0 -2
  516. package/server/deacon-swarm-BiLfNm_v.js +0 -1522
  517. package/server/dead-end-trip-BWpDg1Qd.js +0 -2
  518. package/server/delivery-cJM6zRjJ.js +0 -3
  519. package/server/deploy-queue-CmVBZEja.js +0 -2
  520. package/server/dist-VKBfkdi7.js +0 -3
  521. package/server/durable-review-pipeline-DgcVCYDL.js +0 -3
  522. package/server/factory-D4V2wd_V.js +0 -717
  523. package/server/forge-CrP1L3i6.js +0 -2
  524. package/server/hume-1ubD_6O7.js +0 -3
  525. package/server/inspect-agent-CfxERkNt.js +0 -2
  526. package/server/merge-ops-DtHx17Vd.js +0 -2
  527. package/server/merge-rebase-BvB4UuNS.js +0 -2
  528. package/server/project-repos-BJiShUsN.js +0 -3
  529. package/server/providers-CStNGwze.js +0 -3
  530. package/server/public/assets/index-BFEwfmqX.js +0 -860
  531. package/server/public/assets/index-_USwyTAT.css +0 -1
  532. package/server/public/assets/mermaid-GHXKKRXX-Dsln95SK.js +0 -1
  533. package/server/pull-requests-C1Cqp2yo.js +0 -2
  534. package/server/rally-CjayjUIl.js +0 -3
  535. package/server/resume-D7JuMCRQ.js +0 -3
  536. package/server/review-agent-BUNTVJK2.js +0 -2
  537. package/server/settings-DBWB1gsG.js +0 -2
  538. package/server/specialists-D8gsOCwh.js +0 -3
  539. package/server/specs-BqkrRnU9.js +0 -3
  540. package/server/stuck-remediation-Di5JYkoo.js +0 -1164
  541. package/server/stuck-remediation-TNM1VhZb.js +0 -2
  542. package/server/supervisor-DX8VsPnb.js +0 -2
  543. package/server/tmux-CqNapnrr.js +0 -4
  544. package/server/token-util-Bu8bPF9f.js +0 -3
  545. package/server/workflows-Cf4LAnhg.js +0 -2
@@ -1,58 +1,60 @@
1
1
  import { a as __toCommonJS } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { $n as canUseHarnessSync, $t as findProjectByPathSync, Di as encodeClaudeProjectDir, E as init_tier_table, Ei as claudeSessionTranscriptExists, Er as resolveModel, Fi as init_paths, Ft as isOverdeckWorkspaceRuntimePath, Gn as init_issue_id, Gt as shouldCommitLegacyWorkspaceArtifacts, Ht as init_state_read_home, Mt as init_state_plane, Nt as isGeneratedGitHookPath, O as resolveTieredExecutionEnabled, On as resolveProjectFromIssueSync, Pi as getOverdeckHome, Ri as packageRoot, Rt as parsePorcelainStatusPaths, Wn as extractPrefixSync, Wt as resolveStateReadHomeSync, _n as listProjectsAsync, ar as UnknownModelError, dr as init_providers, fn as init_projects, fr as piProviderForModel, g as jsYaml, h as init_js_yaml, k as resolveTieredExecutionEnabledForIssue, l as isClaudeCodeChannelsEnabled, on as getProjectSync, p as loadConfigSync, qn as parseIssueIdSync, t as init_config_yaml, tr as init_harness_policy, ur as getProviderForModelSync, zi as resolveOhmypiExtensionPath } from "./config-yaml-BwOEANMr.js";
3
- import { c as getDashboardLoopbackApiUrlSync, p as init_config } from "./config-tucKBCCc.js";
4
- import { a as emitActivityEntrySync, c as init_activity_logger, n as emitActivityEntryDurable } from "./activity-logger-BAVLrkR7.js";
5
- import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-KTp9KV9u.js";
6
- import { A as listSessionNames, B as sessionExists, C as isHarnessProcessAlive, H as setOption, J as buildChoiceKeystrokes, Q as parsePaneChoiceMenu, R as sendKeysAsync, S as init_tmux, T as killSession, V as sessionExistsSync, X as paneChoiceMenuSignature, Y as init_pane_choice_menu, Z as paneHasBlockingChoiceMenu, a as capturePaneText, f as exactPaneTarget, it as BLANKED_PROVIDER_ENV, j as listSessions, m as findManagedServerPidSync, o as createSession, ot as buildChildEnvWithoutTmuxSync, r as capturePane, st as init_child_env, z as sendRawKeystroke } from "./tmux-BqXzRuaH.js";
7
- import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-CuAULbLs.js";
8
- import { a as init_event_store, n as getEventStore } from "./event-store-D7qcJXuZ.js";
9
- import { N as normalizeChannelReplyPayload, T as DomainEvent, n as COMPOSER_COMMAND_MANIFEST, s as getHarnessBehavior, t as init_src } from "./src-DudQNYVw.js";
10
- import { f as init_agent_state_sync, h as stateToOverdeckParamsForDb, u as AGENT_COLUMNS_FOR_DB } from "./pipeline-agent-reader-BLc43dVJ.js";
11
- import { i as EventStoreService, l as getClosedIssueIdsForReadSource, o as ReadModelService, t as IssueLifecycle } from "./issue-lifecycle-3N8XF7lP.js";
12
- import { c as init_agents, g as logAgentLifecycleSync, h as init_persistent_logger, m as isTerminalIssueStage, p as getIssueStageSync } from "./agents-CqQJW75N.js";
13
- import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-CDJcmHHZ.js";
14
- import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-CQKI6OCu.js";
15
- import { $r as determineModel, Ar as getAcpLauncherFields, At as parseCodexApprovalPrompt, B as waitForReadySignal, Bt as init_operator_interventions, Ct as isBlockedOnPendingInput, D as saveAgentState, Et as detectAwaitingInputForAgent, F as clearReadySignal, Fr as getProviderAuthMode, G as init_agents$1, Gr as init_ohmypi_fifo, Gt as getLatestSessionIdSync, H as getAgentRuntimeStateSync, Hr as waitForPromptReady, Jt as saveSessionId, Kr as ohmypiFifoPaths, Kt as getSessionId, L as normalizeAgentId, M as wipeAgentStateDirs, N as writeAgentStateJsonSync, Nt as resumeAgent, O as saveAgentStateSync, Ot as init_agent_input_detection, Rr as init_runtime_command, Rt as messageAgent, Sr as init_staffing, St as init_agent_enrichment, Tr as resolveStaffing, Tt as scanPendingInputsPromise, Ur as init_pi_fifo, Ut as getActivity, V as getAgentRuntimeState, Vr as waitForAcpHostReady, Vt as operatorInterventionEvent, W as saveAgentRuntimeState, Wr as piFifoPaths, Wt as getLatestSessionId, Xn as deliverAgentMessage, Zn as deliverAgentPermissionDecision, _i as init_pty_token, at as decideEscalation, b as markAgentStoppedState, bi as resolvePtySupervisorScriptPath, br as transitionIssueToInProgress, bt as getAgentPendingQuestions$1, cn as listAgentStates, cr as init_bridge_token, di as dismissDevChannelsDialog, dr as checkCodexAuthStatus, f as getAgentState, fi as hasCompletionMarkerForAgent, fr as init_codex_auth, ft as recoverAgent, gi as init_resume_contract, gt as computeAgentEnrichment, hi as buildResumeContract, hr as assertWorkspaceStackHealthyForSpawn, ht as init_pending_decision_gate, i as clearAgentPaused, ii as validateProviderHealth, in as stopAgent, jr as getAgentRuntimeBaseCommand, k as setAgentPaused, kt as normalizeAwaitingInputPrompt, ln as listRunningAgents, lr as writeBridgeTokenSync, m as getAgentStateSync, mi as writeChannelsBridgeMcpConfig, mt as detectPendingOperatorDecision, o as clearAgentTroubled, ot as init_tier_escalation, pi as init_supervisor_channels, pt as restartAgent, ri as init_provider_health, rr as setAgentDeliveryMethod, sr as BRIDGE_TOKEN_HEADER, ti as getProviderExportsForModel, u as getAgentDir, vi as writePtyToken, vr as init_spawn_prep, wr as resolveIssueWorkModel, xt as getAgentWorkspace$1, yi as init_pty_supervisor_locate, yt as getAgentJsonlPath$1 } from "./agent-state-Bb3UUxQm.js";
16
- import { t as init_behavior } from "./behavior-Bitko0mD.js";
17
- import { i as performHandoff, o as getAgentHealth, r as checkAllTriggers, t as getCloisterService } from "./service-BLb_CyPL.js";
18
- import { a as init_feature_registry_population, o as recordFeatureRegistryLifecycle } from "./post-merge-state-_Lj3LDLh.js";
19
- import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-zY75jrRJ.js";
20
- import { E as hasOtherActiveConversationOnTmuxSession, F as markConversationActive, G as setConversationEffort, I as markConversationEnded, K as setConversationHarness, N as listConversations, S as getConversationByName, V as removeFavorite, at as updateSpawnError, et as updateConversationDeliveryMethod, g as backfillConversationModel, h as archiveConversation, it as updateLastAttached, k as init_conversations, q as setConversationModel, x as getConversationById, y as createConversation } from "./conversations-DhwxsOru.js";
21
- import { C as generateLauncherScriptSync, D as normalizeModelOverrideSync, E as init_model_validation, O as requireModelOverrideSync, S as normalizeFlywheelRunId, T as MODEL_ID_PATTERN, b as init_provenance, w as init_launcher_generator } from "./auto-spawn-consent-BDfe4qz0.js";
22
- import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-aHgDcZi5.js";
23
- import { E as init_layers, I as workspaceContextFile, k as piGlobalContextFile } from "./assemble-DyTp2gSB.js";
24
- import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-BgXYDo2Z.js";
25
- import { c as init_stack_health, o as getWorkspaceStackHealth } from "./stack-health-DKT4ySnA.js";
26
- import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-DbxY2QB6.js";
27
- import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-Bg44O-9x.js";
28
- import { C as init_specs, O as writeSpecForIssue, d as readPlan, g as recordTierPromotion, h as readWorkspacePlanSync, p as readTierOverrides, r as findPlan, s as init_io } from "./io-DfvO2xyh.js";
29
- import { l as init_dag, o as getDispatchableItems } from "./dag-DI9LaK_q.js";
30
- import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-1NZcVx7n.js";
31
- import { a as loadCloisterConfigSync, r as init_config$1 } from "./config-DC75T4Mr.js";
32
- import { a as init_state_home, c as isStateMigrated } from "./state-home-DhAZlk5k.js";
33
- import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-CCBpRv5m.js";
34
- import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-DVzhaUxO.js";
35
- import { i as issue_service_singleton_exports, n as init_issue_service_singleton } from "./issue-service-singleton-BN_2MXp4.js";
36
- import { i as init_project_repos, s as resolvePrimaryWorkspaceRepoDirSync, u as resolveWorkspaceRepoRootsSync } from "./project-repos-B4MK48j4.js";
37
- import { d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, w as setReviewStatusSync } from "./review-status-DBnR5t4z.js";
38
- import { S as parseAcpConversationMessages, b as parseCodexConversationMessages, c as parseEntireConversation, g as init_ohmypi_conversation_parser, h as parsePiConversationMessages, p as init_pi_conversation_parser, t as init_conversation_service, v as parseOhmypiConversationMessages, x as init_acp_conversation_parser, y as init_codex_conversation_parser } from "./conversation-service-BteE4ELK.js";
39
- import { G as liveOrderIssueLookup, H as getBook, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-C7yek87O.js";
40
- import { d as getResourceConfig, n as classifyMemoryPressure, p as getSystemHealthSnapshot } from "./memory-governor-A4O6vI9d.js";
41
- import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-W1OnbvU5.js";
42
- import "./deacon-TPYssFYt.js";
43
- import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-CrEb2PWr.js";
44
- import { s as getRuntimeForAgent } from "./stuck-remediation-Di5JYkoo.js";
45
- import { t as recordReviewVerdict } from "./review-verdict-writer-CKaJWp75.js";
46
- import { r as REVIEW_SUB_ROLES } from "./review-convoy-liveness-DfF9eXjI.js";
47
- import { t as createInFlightGuard } from "./in-flight-guard-pcwXKLGz.js";
48
- import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-dJhXvZGQ.js";
49
- import { t as resolveReviewParentRunState } from "./review-run-recovery-7BKt2Es0.js";
2
+ import { $t as findProjectByPathSync, Ai as encodeClaudeProjectDir, E as init_tier_table, Ft as isOverdeckWorkspaceRuntimePath, Gt as shouldCommitLegacyWorkspaceArtifacts, Hi as packageRoot, Ht as init_state_read_home, Kn as extractPrefixSync, Mt as init_state_plane, Nt as isGeneratedGitHookPath, O as resolveTieredExecutionEnabled, On as resolveProjectFromIssueSync, Or as resolveModel, Ri as getOverdeckHome, Rt as parsePorcelainStatusPaths, Ui as resolveOhmypiExtensionPath, Wt as resolveStateReadHomeSync, Yn as parseIssueIdSync, _n as listProjectsAsync, fn as init_projects, fr as getProviderForModelSync, g as jsYaml, h as init_js_yaml, k as resolveTieredExecutionEnabledForIssue, ki as claudeSessionTranscriptExists, l as isClaudeCodeChannelsEnabled, mr as piProviderForModel, on as getProjectSync, p as loadConfigSync, pr as init_providers, qn as init_issue_id, rr as init_harness_policy, sr as UnknownModelError, t as init_config_yaml, tr as canUseHarnessSync, zi as init_paths } from "./config-yaml-D60AnTIu.js";
3
+ import { c as getDashboardLoopbackApiUrlSync, p as init_config } from "./config-NxI9Yl2f.js";
4
+ import { l as init_activity_logger, o as emitActivityEntrySync, r as emitActivityEntryDurable } from "./activity-logger-SlTXYCVf.js";
5
+ import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CJRi_5Wu.js";
6
+ import { $ as init_pane_choice_menu, C as init_tmux, E as killSession, G as setOption, H as sendRawKeystroke, K as tmuxExecAsync, N as listSessions, U as sessionExists, V as sendKeysAsync, W as sessionExistsSync, a as capturePaneText, ct as BLANKED_PROVIDER_ENV, dt as init_child_env, h as findManagedServerPidSync, j as listSessionNames, p as exactPaneTarget, r as capturePane, s as createSession, tt as paneHasBlockingChoiceMenu, ut as buildChildEnvWithoutTmuxSync, w as isHarnessProcessAlive } from "./tmux-wnT_hg-s.js";
7
+ import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-C2QKOf09.js";
8
+ import { a as init_event_store, n as getEventStore } from "./event-store-DTns2XZP.js";
9
+ import { N as normalizeChannelReplyPayload, T as DomainEvent, n as COMPOSER_COMMAND_MANIFEST, s as getHarnessBehavior, t as init_src } from "./src-CdwN6WY6.js";
10
+ import { f as init_agent_state_sync, h as stateToOverdeckParamsForDb, u as AGENT_COLUMNS_FOR_DB } from "./pipeline-agent-reader-CeWhQzXC.js";
11
+ import { c as ReadModelService, d as getClosedIssueIdsForReadSource, i as EventStoreService, t as IssueLifecycle } from "./issue-lifecycle-BETNVVLq.js";
12
+ import { c as init_agents, g as logAgentLifecycleSync, h as init_persistent_logger, m as isTerminalIssueStage, p as getIssueStageSync } from "./agents-DzpQidT8.js";
13
+ import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-ENa_hW_V.js";
14
+ import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-DTuIRE4y.js";
15
+ import { t as init_behavior } from "./behavior-DCg8CIWC.js";
16
+ import { $r as piFifoPaths, A as saveAgentStateSync, At as init_agent_input_detection, Br as getAgentRuntimeBaseCommand, Ci as writeChannelsBridgeMcpConfig, Ct as getAgentWorkspace$1, Di as writePtyToken, Dr as init_spawn_prep, Dt as scanPendingInputsPromise, Ei as init_pty_token, F as writeAgentStateJsonSync, Ft as resumeAgent, H as waitForReadySignal, It as answerSessionPaneChoice, K as saveAgentRuntimeState, Kt as init_operator_interventions, L as clearReadySignal, Lt as captureSessionPaneChoice, Mt as parseCodexApprovalPrompt, Nr as resolveIssueWorkModel, Oi as init_pty_supervisor_locate, Ot as detectAwaitingInputForAgent, P as wipeAgentStateDirs, Pr as resolveStaffing, Qr as init_pi_fifo, Qt as getSessionId, Rt as init_session_pane_choice, S as markAgentStoppedState, Si as init_supervisor_channels, St as getAgentPendingQuestions$1, Ti as init_resume_contract, Tt as isBlockedOnPendingInput, U as getAgentRuntimeState, Ut as messageAgent, W as getAgentRuntimeStateSync, Wr as getProviderAuthMode, Xr as waitForAcpHostReady, Xt as getLatestSessionId, Yt as getActivity, Zr as waitForPromptReady, Zt as getLatestSessionIdSync, _n as listAgentStates, _r as init_bridge_token, _t as init_pending_decision_gate, ar as deliverAgentMessage, bi as dismissDevChannelsDialog, br as checkCodexAuthStatus, c as clearAgentTroubled, ci as determineModel, ct as init_tier_escalation, ei as init_ohmypi_fifo, f as getAgentDir, fi as init_provider_health, fr as setAgentDeliveryMethod, g as getAgentStateSync, gr as BRIDGE_TOKEN_HEADER, gt as detectPendingOperatorDecision, ht as restartAgent, j as setAgentPaused, jr as init_staffing, jt as normalizeAwaitingInputPrompt, k as saveAgentState, ki as resolvePtySupervisorScriptPath, kr as transitionIssueToInProgress, m as getAgentState, mt as recoverAgent, o as clearAgentPaused, or as deliverAgentPermissionDecision, pi as validateProviderHealth, pn as stopAgent, q as init_agents$1, qr as init_runtime_command, qt as operatorInterventionEvent, st as decideEscalation, ti as ohmypiFifoPaths, tn as saveSessionId, ui as getProviderExportsForModel, vn as listRunningAgents, vr as writeBridgeTokenSync, vt as computeAgentEnrichment, wi as buildResumeContract, wr as assertWorkspaceStackHealthyForSpawn, wt as init_agent_enrichment, xi as hasCompletionMarkerForAgent, xr as init_codex_auth, xt as getAgentJsonlPath$1, z as normalizeAgentId, zr as getAcpLauncherFields } from "./agent-state-FABw8neJ.js";
17
+ import { a as init_feature_registry_population, o as recordFeatureRegistryLifecycle } from "./post-merge-state-DFaf7OI1.js";
18
+ import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-BeIWG_kT.js";
19
+ import { A as init_conversations, C as getConversationByName, D as hasOtherActiveConversationOnTmuxSession, H as removeFavorite, I as markConversationActive, J as setConversationModel, K as setConversationEffort, L as markConversationEnded, P as listConversations, S as getConversationById, at as updateLastAttached, b as createConversation, g as backfillConversationModel, h as archiveConversation, ot as updateSpawnError, q as setConversationHarness, tt as updateConversationDeliveryMethod, y as clearConversationFailureState } from "./conversations-nS6QgYpD.js";
20
+ import { C as generateLauncherScriptSync, D as normalizeModelOverrideSync, E as init_model_validation, O as requireModelOverrideSync, S as normalizeFlywheelRunId, T as MODEL_ID_PATTERN, b as init_provenance, w as init_launcher_generator } from "./auto-spawn-consent-BesWchEi.js";
21
+ import { a as init_claude_permissions, n as ensureClaudePermissionFlagSync, r as getClaudePermissionFlagsStringSync } from "./claude-permissions-DLrb9ovz.js";
22
+ import { A as piGlobalContextFile, D as init_layers, L as workspaceContextFile } from "./assemble-B_JgnCbG.js";
23
+ import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-DChiynaB.js";
24
+ import { c as init_stack_health, o as getWorkspaceStackHealth } from "./stack-health-BKfNaqMm.js";
25
+ import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-pLpbsNto.js";
26
+ import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-DVXyUil2.js";
27
+ import { C as init_specs, O as writeSpecForIssue, d as readPlan, g as recordTierPromotion, h as readWorkspacePlanSync, p as readTierOverrides, r as findPlan, s as init_io } from "./io-BCtZoXHo.js";
28
+ import { a as getDispatchableItems, c as init_dag } from "./dag-o-dUpw1L.js";
29
+ import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-BplBEbwn.js";
30
+ import { a as loadCloisterConfigSync, r as init_config$1 } from "./config-_qaa1UXH.js";
31
+ import { a as init_state_home, c as isStateMigrated } from "./state-home-DhsMqg8W.js";
32
+ import { d as resolveWorkspaceRepoRootsSync, i as init_project_repos, s as resolvePrimaryWorkspaceRepoDirSync } from "./project-repos-CsfvLtmr.js";
33
+ import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-D7N0vQNj.js";
34
+ import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-tfAOWgng.js";
35
+ import { i as issue_service_singleton_exports, n as init_issue_service_singleton } from "./issue-service-singleton-C_sZ0HjP.js";
36
+ import { d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, w as setReviewStatusSync } from "./review-status-DpniqzPT.js";
37
+ import { S as parseAcpConversationMessages, b as parseCodexConversationMessages, c as parseEntireConversation, g as init_ohmypi_conversation_parser, h as parsePiConversationMessages, p as init_pi_conversation_parser, t as init_conversation_service, v as parseOhmypiConversationMessages, x as init_acp_conversation_parser, y as init_codex_conversation_parser } from "./conversation-service-BxIOd5ay.js";
38
+ import { i as resolveAgentHarness, l as resolvePiSessionPath, n as readLauncherPinnedSessionId, o as resolveCodexRolloutPath, r as resolveAcpTranscriptPath, t as init_jsonl_resolver } from "./jsonl-resolver-bFtftCDd.js";
39
+ import { G as liveOrderIssueLookup, H as getBook, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-DWKd7bMc.js";
40
+ import { t as resolveAgentGitInfo } from "./git-info-DMOSfJ9I.js";
41
+ import { f as getResourceConfig, m as getSystemHealthSnapshot, n as classifyMemoryPressure } from "./memory-governor-Cvv_9K0M.js";
42
+ import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-CM8RCrSc.js";
43
+ import "./deacon-CsisLmPt.js";
44
+ import { i as performHandoff, o as getAgentHealth, r as checkAllTriggers, t as getCloisterService } from "./service-CThO0Sar.js";
45
+ import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-Dfs1dlYE.js";
46
+ import { i as getRuntimeForAgent } from "./agent-idle-D-UQ7gDv.js";
47
+ import { t as recordReviewVerdict } from "./review-verdict-writer-Cy_1pnIj.js";
48
+ import { r as REVIEW_SUB_ROLES } from "./review-convoy-liveness-BBvyuRLC.js";
49
+ import { t as createInFlightGuard } from "./in-flight-guard-B7khcBdQ.js";
50
+ import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-Cu6yfxBS.js";
51
+ import { t as resolveReviewParentRunState } from "./review-run-recovery-THHMKlXJ.js";
50
52
  import { basename, delimiter, dirname, isAbsolute, join, resolve, sep } from "node:path";
51
53
  import { Cause, Data, Effect, Layer, Option, Schema, Stream } from "effect";
52
- import { homedir, networkInterfaces } from "node:os";
54
+ import { homedir, networkInterfaces, tmpdir } from "node:os";
53
55
  import { createReadStream, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync } from "node:fs";
54
56
  import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
55
- import { access, appendFile, chmod, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat, writeFile } from "node:fs/promises";
57
+ import { access, appendFile, chmod, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
56
58
  import { randomUUID } from "crypto";
57
59
  import { createHash as createHash$1, createHmac, randomBytes, randomUUID as randomUUID$1, timingSafeEqual } from "node:crypto";
58
60
  import { exec, execFile, spawn } from "node:child_process";
@@ -131,6 +133,7 @@ init_staffing();
131
133
  init_spawn_prep();
132
134
  init_harness_resolve();
133
135
  init_bridge_token();
136
+ init_project_repos();
134
137
  init_operator_interventions();
135
138
  init_lifecycle_io();
136
139
  init_agent_input_detection();
@@ -138,7 +141,6 @@ init_tracker_config();
138
141
  init_agent_enrichment();
139
142
  init_pending_decision_gate();
140
143
  init_agents$1();
141
- init_project_repos();
142
144
  init_review_status();
143
145
  /**
144
146
  * Resolve the default cwd used when no project is selected — the "devroot"
@@ -413,6 +415,7 @@ init_agents();
413
415
  init_codex_auth();
414
416
  init_config$1();
415
417
  init_state_home();
418
+ init_session_pane_choice();
416
419
  init_internal_token();
417
420
  const DASHBOARD_SESSION_COOKIE = "overdeck_session";
418
421
  const DASHBOARD_CSRF_HEADER = "x-overdeck-csrf-token";
@@ -612,331 +615,7 @@ function rejectUnauthorizedDashboardRequest(request) {
612
615
  return null;
613
616
  }
614
617
  //#endregion
615
- //#region routes/jsonl-resolver.ts
616
- init_acp_conversation_parser();
617
- init_codex_conversation_parser();
618
- init_ohmypi_conversation_parser();
619
- init_pi_conversation_parser();
620
- init_conversation_service();
621
- /**
622
- * JSONL transcript resolver for the Command Deck (PAN-830).
623
- *
624
- * Maps an agent ID (e.g. `agent-pan-830`, `planning-pan-830`, or a canonical
625
- * specialist tmux session name) to the agent's JSONL transcript file on disk.
626
- *
627
- * Codex agents (PAN-1805) write rollout JSONLs under the per-agent
628
- * `codex-home/sessions/` tree — resolution dispatches on the harness recorded
629
- * in state.json (thread-id fast path, then latest-rollout fallback).
630
- *
631
- * For claude-code agents the JSONL filename is the *Claude session ID* (a UUID
632
- * written by Claude Code itself), NOT the agent/tmux name. Lookup order:
633
- * 1. session.id — UUID pinned before fresh work-agent launch and updated
634
- * by auto-suspend/resume flows
635
- * 2. sessions.json — array of UUIDs the agent has used; the heartbeat hook
636
- * APPENDS new IDs and dedupes, so once a session has been
637
- * seen its array index never moves. After a `pan resume`
638
- * brings an older session back as the live one, the array
639
- * order no longer reflects time-recency. We disambiguate
640
- * across all listed IDs by JSONL mtime.
641
- * 3. runtime state — in-process mirror, populated by hooks
642
- * 4. agents registry — the DB row's session_id recorded at spawn; survives
643
- * janitor removal of the agent directory
644
- *
645
- * Async-only (fs/promises) because this code path runs inside the dashboard
646
- * server's event loop.
647
- */
648
- const transcriptResolutionSignatures = /* @__PURE__ */ new Map();
649
- function logTranscriptResolution(agentId, signature, message, opts) {
650
- const signatureKey = `${agentId}:${opts.agentsDirOverride ?? "live"}`;
651
- if (transcriptResolutionSignatures.get(signatureKey) === signature) return;
652
- transcriptResolutionSignatures.set(signatureKey, signature);
653
- (opts.logDiagnostic ?? (opts.agentsDirOverride ? void 0 : logAgentLifecycleSync))?.(agentId, `transcript resolution: ${message}`);
654
- }
655
- async function pathExists$1(p) {
656
- return access(p).then(() => true, () => false);
657
- }
658
- async function readOptional(p) {
659
- return readFile(p, "utf-8").catch(() => null);
660
- }
661
- function behaviorForHarness(harness) {
662
- return getHarnessBehavior(harness);
663
- }
664
- /**
665
- * Pick the candidate UUID whose JSONL transcript has the most recent mtime.
666
- *
667
- * The heartbeat hook appends to sessions.json and dedupes — so once an ID is
668
- * recorded, its array index never moves even if a later resume makes it the
669
- * current session again. Choosing by JSONL mtime is the only reliable signal
670
- * for "which session is actually live right now."
671
- *
672
- * Returns null if no candidate has a corresponding JSONL on disk. Falls back
673
- * to scanning every project dir if the workspace path can't be resolved
674
- * (covers specialist sessions whose workspace lives elsewhere).
675
- */
676
- async function pickFreshestSessionId(candidates, agentId, opts) {
677
- if (candidates.length === 0) return null;
678
- if (candidates.length === 1) return candidates[0];
679
- const projectsRoot = opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects");
680
- let candidatePaths = [];
681
- try {
682
- const workspace = await Effect.runPromise(getAgentWorkspace$1(agentId));
683
- if (workspace) {
684
- const projectDir = join(projectsRoot, encodeClaudeProjectDir(workspace));
685
- candidatePaths = candidates.map((id) => ({
686
- id,
687
- path: join(projectDir, `${id}.jsonl`)
688
- }));
689
- }
690
- } catch {}
691
- if (candidatePaths.length === 0) try {
692
- const dirs = await readdir(projectsRoot);
693
- const SAFE_DIR = /^[a-zA-Z0-9_.-]+$/;
694
- for (const id of candidates) for (const dir of dirs) {
695
- if (!SAFE_DIR.test(dir)) continue;
696
- candidatePaths.push({
697
- id,
698
- path: join(projectsRoot, dir, `${id}.jsonl`)
699
- });
700
- }
701
- } catch {}
702
- let best = null;
703
- for (const { id, path } of candidatePaths) try {
704
- const s = await stat(path);
705
- if (!best || s.mtimeMs > best.mtimeMs) best = {
706
- id,
707
- mtimeMs: s.mtimeMs
708
- };
709
- } catch {}
710
- return best ? best.id : candidates[candidates.length - 1] ?? null;
711
- }
712
- /** Async equivalent of getLatestSessionId from lib/agents.ts. */
713
- async function resolveClaudeSessionId(agentId, opts = {}) {
714
- const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
715
- const sessionIdTrimmed = (await readOptional(join(agentDir, "session.id")))?.trim();
716
- if (sessionIdTrimmed) return sessionIdTrimmed;
717
- const sessionsRaw = await readOptional(join(agentDir, "sessions.json"));
718
- if (sessionsRaw) try {
719
- const parsed = JSON.parse(sessionsRaw);
720
- if (Array.isArray(parsed)) {
721
- const fresh = await pickFreshestSessionId(parsed.filter((v) => typeof v === "string" && v.trim().length > 0), agentId, opts);
722
- if (fresh) return fresh;
723
- }
724
- } catch {}
725
- try {
726
- const runtimeState = await (opts.getRuntimeStateAsync ?? ((id) => Effect.runPromise(getAgentRuntimeState(id))))(agentId);
727
- if (runtimeState?.claudeSessionId) return runtimeState.claudeSessionId;
728
- } catch {}
729
- if (!opts.agentsDirOverride) {
730
- const registrySessionId = getAgentStateSync(agentId)?.sessionId?.trim();
731
- if (registrySessionId) return registrySessionId;
732
- }
733
- return null;
734
- }
735
- /**
736
- * Read the Claude session id PINNED into an agent/conversation launcher.sh.
737
- *
738
- * The launcher is what spawns the live tmux pane: it runs
739
- * `claude … --session-id <uuid>` (or `--resume <uuid>`), so the pinned id is the
740
- * EXACT session the Terminal tab attaches to — the only deterministic ground
741
- * truth for "which session is live right now." Resolving the transcript panel
742
- * from this id makes the Conversation tab match the Terminal tab by construction,
743
- * instead of guessing via JSONL mtime (racy: an older session's file gets touched
744
- * by a compaction summary write-back or a transient relaunch, its mtime jumps
745
- * ahead of the live session's, and the panel renders the wrong transcript).
746
- *
747
- * Checks the conversation launcher dir first, then the agent launcher dir.
748
- * Returns the uuid, or null when no launcher exists or it pins no session id.
749
- */
750
- const LAUNCHER_UUID = "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}";
751
- const LAUNCHER_SESSION_ID_RE = new RegExp(`--session-id\\s+'?(${LAUNCHER_UUID})'?`);
752
- const LAUNCHER_RESUME_RE = new RegExp(`--resume\\s+'?(${LAUNCHER_UUID})'?`);
753
- async function readLauncherPinnedSessionId(tmuxSession, opts = {}) {
754
- const home = opts.overdeckHomeOverride ?? getOverdeckHome();
755
- const candidates = [join(home, "conversations", tmuxSession, "launcher.sh"), join(home, "agents", tmuxSession, "launcher.sh")];
756
- for (const path of candidates) {
757
- const text = await readOptional(path);
758
- if (!text) continue;
759
- const match = LAUNCHER_SESSION_ID_RE.exec(text) ?? LAUNCHER_RESUME_RE.exec(text);
760
- if (match) return match[1];
761
- }
762
- return null;
763
- }
764
- /**
765
- * Read the harness + workspace recorded for an agent, honoring the test
766
- * override dir. Used by resolveAgentHarness / agentHasClaudeTranscript so the
767
- * stale-harness self-correction runs identically in prod and under test.
768
- */
769
- async function readRecordedState(agentId, opts) {
770
- if (opts.agentsDirOverride) try {
771
- const raw = await readFile(join(opts.agentsDirOverride, agentId, "state.json"), "utf8");
772
- const s = JSON.parse(raw);
773
- return {
774
- harness: typeof s.harness === "string" ? s.harness : null,
775
- workspace: typeof s.workspace === "string" ? s.workspace : void 0
776
- };
777
- } catch {
778
- return { harness: null };
779
- }
780
- const st = getAgentStateSync(agentId);
781
- return {
782
- harness: st?.harness ?? null,
783
- workspace: st?.workspace
784
- };
785
- }
786
- /**
787
- * Resolve the harness for transcript routing. Reads state.json, then
788
- * self-corrects when the recorded value is stale.
789
- *
790
- * Trust an explicit non-default harness (codex / pi / ohmypi / acp) — it was chosen
791
- * by resolveHarness at spawn time and is not the generic fallback. The
792
- * 'claude-code' default, however, goes stale in one observed case: a
793
- * wipe-and-respawn that changed the provider-default harness left state.json
794
- * carrying the pre-respawn 'claude-code' while the fresh launch was
795
- * codex/ohmypi. The resolver then took the claude-code branch, found no
796
- * claudeSessionId, and the dashboard showed "No conversation data available"
797
- * for a live agent whose real transcript sat untouched under codex-home.
798
- *
799
- * Self-correction (claude-code/null recorded only): if the agent has NO
800
- * claude-code transcript on disk but DOES have a codex rollout / pi session,
801
- * the on-disk runtime wins — those artifacts are written only by that runtime,
802
- * so this cannot surface a wrong transcript. When a claude-code transcript IS
803
- * present it always wins, so a past codex run's codex-home can't shadow a
804
- * current claude-code session.
805
- */
806
- async function resolveAgentHarness(agentId, opts = {}) {
807
- const recorded = (await readRecordedState(agentId, opts)).harness;
808
- if (recorded === "codex" || recorded === "pi" || recorded === "ohmypi" || recorded === "acp" || recorded === "kimi-code") return recorded;
809
- if (await agentHasClaudeTranscript(agentId, opts)) return recorded ?? "claude-code";
810
- if (await resolveAcpTranscriptPath(agentId, opts)) return "acp";
811
- if (await resolveCodexRolloutPath(agentId, opts)) return "codex";
812
- if (await resolvePiSessionPath(agentId, opts)) return "ohmypi";
813
- if (await resolveKimiWirePath(agentId, opts)) return "kimi-code";
814
- return recorded;
815
- }
816
- /**
817
- * Whether the agent has a resolvable claude-code transcript on disk. Used by
818
- * resolveAgentHarness to decide if a claude-code recording is still live
819
- * (vs. a stale default that should be corrected to codex/ohmypi).
820
- */
821
- async function agentHasClaudeTranscript(agentId, opts = {}) {
822
- const sessionId = await resolveClaudeSessionId(agentId, opts);
823
- if (!sessionId) return false;
824
- const workspace = (await readRecordedState(agentId, opts)).workspace;
825
- if (!workspace) return false;
826
- return pathExists$1(join(opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects"), encodeClaudeProjectDir(workspace), `${sessionId}.jsonl`));
827
- }
828
- /**
829
- * Resolve the Codex rollout JSONL for a codex-harness agent (PAN-1805).
830
- *
831
- * Fast path: the persisted codex-thread-id maps directly to its rollout file.
832
- * Lazy fallback (same shape as the conversation panel's PAN-1690 fix): codex
833
- * writes the rollout only on the first turn, so a spawn-time thread-id capture
834
- * can miss it — the per-agent CODEX_HOME holds only this agent's rollouts, so
835
- * the newest one is its current thread.
836
- */
837
- async function resolveCodexRolloutPath(agentId, opts = {}) {
838
- const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
839
- const codexHome = join(agentDir, "codex-home");
840
- if (!await pathExists$1(codexHome)) return null;
841
- const { findRolloutPath, findLatestRollout } = await import("./codex-icapA4om.js");
842
- const threadId = (await readOptional(join(agentDir, "codex-thread-id")))?.trim();
843
- if (threadId) {
844
- const rollout = findRolloutPath(codexHome, threadId);
845
- if (rollout) return rollout;
846
- }
847
- return findLatestRollout(codexHome);
848
- }
849
- /** Resolve the normalized transcript written by the persistent ACP host. */
850
- async function resolveAcpTranscriptPath(agentId, opts = {}) {
851
- const transcriptPath = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId, "acp-session.jsonl");
852
- return await pathExists$1(transcriptPath) ? transcriptPath : null;
853
- }
854
- /**
855
- * Resolve the native Kimi Code CLI wire.jsonl for a kimi-code-harness agent
856
- * (PAN-1837 wi8a). Fast path: the per-agent kimi-session-id (persisted by
857
- * wi5's spawnAgent) maps directly to
858
- * `<kimiHome>/sessions/<workDirKey>/<sessionId>/agents/main/wire.jsonl`.
859
- * Fallback (no captured id): the newest session directory by wire.jsonl mtime
860
- * under the workspace's workDirKey bucket — same shape as the codex/pi lazy
861
- * fallbacks above, since Kimi may not have finished writing its first turn
862
- * when the id was captured.
863
- */
864
- async function resolveKimiWirePath(agentId, opts = {}) {
865
- const workspace = opts.workspaceOverride ?? (await readRecordedState(agentId, opts)).workspace;
866
- if (!workspace) return null;
867
- const sessionId = (await readOptional(join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId, "kimi-session-id")))?.trim() || null;
868
- const kimiHome = opts.kimiHomeOverride ?? join(homedir(), ".kimi-code");
869
- const { findKimiWirePathAsync } = await import("./kimi-code-DoMoGqIu.js");
870
- return findKimiWirePathAsync(kimiHome, workspace, sessionId);
871
- }
872
- /**
873
- * Resolve the pi/kimi session JSONL (PAN-1908). Pi writes its session transcript
874
- * as `<iso-ts>_<session-id>.jsonl` either in the agent dir's `sessions/` subdir
875
- * (conversations) OR in the agent dir root (work agents) — so check both. The dir
876
- * also holds `cost-events.jsonl` / `activity.jsonl`, which are NOT transcripts.
877
- * Return the freshest transcript by mtime, or null if pi hasn't written one yet.
878
- */
879
- async function resolvePiSessionPath(agentId, opts = {}) {
880
- const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
881
- const NON_TRANSCRIPT = new Set([
882
- "acp-session.jsonl",
883
- "cost-events.jsonl",
884
- "activity.jsonl",
885
- "pending-events.jsonl"
886
- ]);
887
- let best = null;
888
- for (const dir of [join(agentDir, "sessions"), agentDir]) {
889
- let entries;
890
- try {
891
- entries = await readdir(dir);
892
- } catch {
893
- continue;
894
- }
895
- for (const name of entries) {
896
- if (!name.endsWith(".jsonl") || NON_TRANSCRIPT.has(name)) continue;
897
- const p = join(dir, name);
898
- try {
899
- const m = (await stat(p)).mtimeMs;
900
- if (!best || m > best.mtime) best = {
901
- path: p,
902
- mtime: m
903
- };
904
- } catch {}
905
- }
906
- }
907
- return best?.path ?? null;
908
- }
909
- /**
910
- * Resolve the JSONL transcript for an agent.
911
- *
912
- * Codex agents resolve to their rollout JSONL (PAN-1805). For claude-code
913
- * agents, returns the absolute path if both the claudeSessionId is known AND
914
- * the corresponding JSONL file exists; otherwise null.
915
- */
916
- async function resolveJsonlPath(agentId, workspacePath, opts = {}) {
917
- const harness = await resolveAgentHarness(agentId, opts);
918
- const behavior = behaviorForHarness(harness);
919
- if (behavior.transcriptKind === "codex-rollout-jsonl") return resolveCodexRolloutPath(agentId, opts);
920
- if (behavior.transcriptKind === "ohmypi-jsonl") return resolvePiSessionPath(agentId, opts);
921
- if (behavior.transcriptKind === "acp-jsonl") return resolveAcpTranscriptPath(agentId, opts);
922
- if (behavior.transcriptKind === "kimi-wire-jsonl") return resolveKimiWirePath(agentId, opts);
923
- const claudeSessionId = await resolveClaudeSessionId(agentId, opts);
924
- if (!claudeSessionId) {
925
- logTranscriptResolution(agentId, `missing-session-id:${harness ?? "unknown"}`, `failed harness=${harness ?? "unknown"} reason=no-session-id checked=session.id,sessions.json,runtime-state`, opts);
926
- return null;
927
- }
928
- const effectiveWorkspacePath = (await readRecordedState(agentId, opts)).workspace ?? workspacePath;
929
- const jsonlPath = join(opts.claudeProjectsDirOverride ?? join(homedir(), ".claude", "projects"), encodeClaudeProjectDir(effectiveWorkspacePath), `${claudeSessionId}.jsonl`);
930
- if (await pathExists$1(jsonlPath)) {
931
- logTranscriptResolution(agentId, `resolved:${jsonlPath}`, `resolved harness=${harness ?? "claude-code"} sessionId=${claudeSessionId} path=${jsonlPath}`, opts);
932
- return jsonlPath;
933
- }
934
- logTranscriptResolution(agentId, `missing-jsonl:${jsonlPath}`, `failed harness=${harness ?? "claude-code"} reason=jsonl-missing sessionId=${claudeSessionId} workspace=${effectiveWorkspacePath} expectedPath=${jsonlPath}`, opts);
935
- return null;
936
- }
937
- //#endregion
938
618
  //#region ../../lib/pan-cli-invocation.ts
939
- init_paths();
940
619
  /**
941
620
  * Invoke Overdeck's bundled CLI without relying on the dashboard process PATH.
942
621
  * GUI/service launches often omit the package-manager bin directory that owns
@@ -955,7 +634,6 @@ function spawnPanCli(args, options = {}) {
955
634
  }
956
635
  //#endregion
957
636
  //#region ../../lib/work-agent-lifecycle.ts
958
- init_agents$1();
959
637
  init_paths();
960
638
  init_tmux();
961
639
  function sessionResetRequiredReason(agentId, agentOrIssueId) {
@@ -1159,147 +837,6 @@ async function getWorkAgentLifecycleStateSnapshot(agentOrIssueId) {
1159
837
  Data.TaggedError("WorkAgentLifecycleViolation");
1160
838
  const getWorkAgentLifecycleState = (agentOrIssueId) => Effect.promise(() => getWorkAgentLifecycleStateSnapshot(agentOrIssueId));
1161
839
  //#endregion
1162
- //#region services/git-info.ts
1163
- /**
1164
- * Git info enricher (PAN-1523)
1165
- *
1166
- * Derives branch + worktree-status for an absolute filesystem path. Used to
1167
- * surface branch/worktree chips on conversation rows, conversation terminals,
1168
- * and agent terminals.
1169
- *
1170
- * Two enricher entrypoints with different semantics:
1171
- * - resolveConversationGitInfo() — best-effort: returns null branch when
1172
- * the path isn't a git repo. Used for conversations whose cwd can be
1173
- * anywhere.
1174
- * - resolveAgentGitInfo() — verifies a work-agent workspace against its
1175
- * expected feature branch. Reports drift and missing-workspace state
1176
- * because both are silent failure modes today.
1177
- *
1178
- * Cache: in-memory, keyed by absolute path and invalidated when the mtime of
1179
- * <path>/.git/HEAD changes. Every read still stats HEAD, so a checkout under a
1180
- * live conversation is picked up immediately without periodically respawning
1181
- * two git processes for every unchanged workspace.
1182
- *
1183
- * All I/O is async (execFile / fs.promises). No execSync, no readFileSync.
1184
- */
1185
- const execFileAsync$3 = promisify(execFile);
1186
- const GIT_INFO_TIMEOUT_MS = 2e3;
1187
- const cache = /* @__PURE__ */ new Map();
1188
- /**
1189
- * Locate the HEAD file for a working tree at `absPath`.
1190
- *
1191
- * In a primary checkout `.git` is a directory and HEAD lives at `.git/HEAD`.
1192
- * In a secondary worktree `.git` is a small text file containing
1193
- * `gitdir: /abs/path/to/.git/worktrees/<name>` and HEAD lives at
1194
- * `<that-gitdir>/HEAD`. We follow the pointer so the mtime check actually
1195
- * sees branch flips in worktrees.
1196
- */
1197
- async function locateHeadPath(absPath) {
1198
- const gitMarker = join(absPath, ".git");
1199
- let markerStat;
1200
- try {
1201
- markerStat = await stat(gitMarker);
1202
- } catch {
1203
- return null;
1204
- }
1205
- if (markerStat.isDirectory()) return join(gitMarker, "HEAD");
1206
- if (markerStat.isFile()) try {
1207
- const match = (await readFile(gitMarker, "utf-8")).match(/^gitdir:\s*(.+)$/m);
1208
- if (!match) return null;
1209
- return join(match[1].trim(), "HEAD");
1210
- } catch {
1211
- return null;
1212
- }
1213
- return null;
1214
- }
1215
- async function readHeadMtimeMs(absPath) {
1216
- const headPath = await locateHeadPath(absPath);
1217
- if (headPath === null) return null;
1218
- try {
1219
- return (await stat(headPath)).mtimeMs;
1220
- } catch {
1221
- return null;
1222
- }
1223
- }
1224
- async function readGitInfoFresh(absPath) {
1225
- const [branchResult, worktreeResult] = await Promise.all([execFileAsync$3("git", [
1226
- "-C",
1227
- absPath,
1228
- "rev-parse",
1229
- "--abbrev-ref",
1230
- "HEAD"
1231
- ], {
1232
- encoding: "utf-8",
1233
- timeout: GIT_INFO_TIMEOUT_MS
1234
- }).catch(() => null), execFileAsync$3("git", [
1235
- "-C",
1236
- absPath,
1237
- "rev-parse",
1238
- "--git-common-dir",
1239
- "--git-dir"
1240
- ], {
1241
- encoding: "utf-8",
1242
- timeout: GIT_INFO_TIMEOUT_MS
1243
- }).catch(() => null)]);
1244
- if (!branchResult) return {
1245
- branch: null,
1246
- isWorktree: false
1247
- };
1248
- const branch = branchResult.stdout.trim() || null;
1249
- let isWorktree = false;
1250
- if (worktreeResult) {
1251
- const [commonDir, gitDir] = worktreeResult.stdout.trim().split("\n").map((line) => line.trim());
1252
- if (commonDir && gitDir && commonDir !== gitDir) isWorktree = true;
1253
- }
1254
- return {
1255
- branch,
1256
- isWorktree
1257
- };
1258
- }
1259
- /**
1260
- * Resolve branch + worktree status for a conversation cwd. Cached until the
1261
- * HEAD mtime changes.
1262
- */
1263
- async function resolveConversationGitInfo(absPath) {
1264
- const headMtimeMs = await readHeadMtimeMs(absPath);
1265
- if (headMtimeMs === null) return {
1266
- branch: null,
1267
- isWorktree: false
1268
- };
1269
- const cached = cache.get(absPath);
1270
- if (cached && cached.headMtimeMs === headMtimeMs) return cached.value;
1271
- const value = await readGitInfoFresh(absPath);
1272
- cache.set(absPath, {
1273
- value,
1274
- headMtimeMs
1275
- });
1276
- return value;
1277
- }
1278
- /**
1279
- * Resolve drift + missing-workspace state for a work-agent workspace.
1280
- * `expectedBranch` is the deterministic feature/<issue-id> branch from
1281
- * resource-discovery. Reuses the conversation cache for the branch read,
1282
- * then layers drift detection on top.
1283
- */
1284
- async function resolveAgentGitInfo(workspacePath, expectedBranch) {
1285
- if (await readHeadMtimeMs(workspacePath) === null) return {
1286
- actualBranch: null,
1287
- branchDrifted: false,
1288
- workspaceMissing: true
1289
- };
1290
- const info = await resolveConversationGitInfo(workspacePath);
1291
- if (info.branch === null) return {
1292
- actualBranch: null,
1293
- branchDrifted: false,
1294
- workspaceMissing: true
1295
- };
1296
- return {
1297
- actualBranch: info.branch,
1298
- branchDrifted: info.branch !== expectedBranch,
1299
- workspaceMissing: false
1300
- };
1301
- }
1302
- //#endregion
1303
840
  //#region ../../lib/composer-commands/executors.ts
1304
841
  const CAPTURED_COMMAND_MAX_OUTPUT_BYTES = 64 * 1024;
1305
842
  const TRUNCATION_MESSAGE = "\n\nOutput was truncated after 65,536 bytes.";
@@ -1610,7 +1147,6 @@ async function runDetachedCommand(argv, dependencies = {}) {
1610
1147
  //#region routes/agents/shared.ts
1611
1148
  init_paths();
1612
1149
  init_agents$1();
1613
- init_agent_enrichment();
1614
1150
  init_supervisor_channels();
1615
1151
  init_activity_logger();
1616
1152
  init_tmux();
@@ -2331,6 +1867,12 @@ const getAgentHasSessionRoute = HttpRouter.add("GET", "/api/agents/:id/has-sessi
2331
1867
  init_paths();
2332
1868
  init_agents$1();
2333
1869
  init_tmux();
1870
+ init_conversation_service();
1871
+ init_pi_conversation_parser();
1872
+ init_ohmypi_conversation_parser();
1873
+ init_codex_conversation_parser();
1874
+ init_acp_conversation_parser();
1875
+ init_jsonl_resolver();
2334
1876
  const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", httpHandler(Effect.gen(function* () {
2335
1877
  const id = (yield* HttpRouter.params)["id"] ?? "";
2336
1878
  const request = yield* HttpServerRequest.HttpServerRequest;
@@ -2351,7 +1893,7 @@ const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", http
2351
1893
  } catch {}
2352
1894
  let stdout;
2353
1895
  if (isRemote && vmName) {
2354
- const { getRemoteAgentOutput } = await import("./remote-agents-DQVGZVQ9.js");
1896
+ const { getRemoteAgentOutput } = await import("./remote-agents-MuXx2gWm.js");
2355
1897
  stdout = await getRemoteAgentOutput(id, vmName, parseInt(String(lines), 10) || 100);
2356
1898
  } else stdout = await Effect.runPromise(capturePane(id, parseInt(String(lines), 10) || 100));
2357
1899
  if (!stdout || stdout.trim() === "" || stdout.trim() === "Session not found") {
@@ -3182,7 +2724,7 @@ async function cleanupConversationAttachments(name) {
3182
2724
  * sessions that the lifecycle poller missed. */
3183
2725
  async function cleanupOrphanedConversationAttachments() {
3184
2726
  try {
3185
- const { listConversations } = await import("./conversations-AnGJ5rtX.js");
2727
+ const { listConversations } = await import("./conversations-CEMfwMt-.js");
3186
2728
  const convNames = new Set(listConversations().map((c) => c.name));
3187
2729
  const root = getConversationAttachmentsRoot();
3188
2730
  await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join(root, entry.name)), 10, (path) => rm(path, {
@@ -3366,7 +2908,8 @@ async function removeConversationAttachment(name, attachmentPath) {
3366
2908
  //#region ../../lib/overdeck/resume-contract-delivery.ts
3367
2909
  init_agents$1();
3368
2910
  init_tmux();
3369
- async function deliverResumeContractUnlessGated(tmuxSession, contract, caller, method) {
2911
+ async function deliverResumeContractUnlessGated(tmuxSession, contract, caller, method, requested = true) {
2912
+ if (!requested) return "skipped-user";
3370
2913
  const resumeGatePane = await capturePaneText(tmuxSession, 90).catch(() => "");
3371
2914
  if (resumeGatePane && paneHasBlockingChoiceMenu(resumeGatePane)) {
3372
2915
  console.log(`[conversations] resume contract skipped for ${tmuxSession} — the harness is showing a blocking choice menu; the operator answers it`);
@@ -3385,8 +2928,8 @@ async function deliverResumeContractUnlessGated(tmuxSession, contract, caller, m
3385
2928
  init_projects();
3386
2929
  init_tmux();
3387
2930
  init_agents$1();
3388
- init_behavior();
3389
2931
  init_paths();
2932
+ init_jsonl_resolver();
3390
2933
  const execAsync$1 = promisify(exec);
3391
2934
  const execFileAsync$1 = promisify(execFile);
3392
2935
  const PROCESS_CLEANUP_GRACE_MS = 750;
@@ -3528,12 +3071,16 @@ async function waitForClaudeReady(tmuxSession) {
3528
3071
  console.warn(`[conversations] Timed out waiting for Claude Code prompt in ${tmuxSession}`);
3529
3072
  }
3530
3073
  function isPiTuiInputReady(snapshot) {
3531
- return /^\s*[❯›>]\s/m.test(snapshot) || /(?:^|\s)0(?:\.\d+)?%\s+context\s+used\b/i.test(snapshot) || /⬢[^\n]*◕/.test(snapshot);
3074
+ return /^\s*[❯›>]\s/m.test(snapshot) || /(?:^|\s)0(?:\.\d+)?%\s+context\s+used\b/i.test(snapshot);
3532
3075
  }
3533
3076
  async function waitForPiTuiReady(tmuxSession, timeoutMs = 6e4) {
3534
3077
  const deadline = Date.now() + timeoutMs;
3078
+ let stableV17FooterPolls = 0;
3535
3079
  while (Date.now() < deadline) {
3536
- if (isPiTuiInputReady(await Effect.runPromise(capturePane(tmuxSession, 40).pipe(Effect.catch(() => Effect.succeed("")))))) {
3080
+ const snapshot = await Effect.runPromise(capturePane(tmuxSession, 40).pipe(Effect.catch(() => Effect.succeed(""))));
3081
+ const mcpConnecting = /Connecting to MCP servers/i.test(snapshot) && !/MCP finished/i.test(snapshot);
3082
+ stableV17FooterPolls = /⬢[^\n]*[◕◉]/.test(snapshot) && !mcpConnecting ? stableV17FooterPolls + 1 : 0;
3083
+ if (isPiTuiInputReady(snapshot) || stableV17FooterPolls >= 21) {
3537
3084
  console.log(`[conversations] Pi TUI ready for ${tmuxSession}`);
3538
3085
  return true;
3539
3086
  }
@@ -3636,9 +3183,7 @@ function getPtySupervisorSocketPath(agentId) {
3636
3183
  * an operator hunting the memory governor instead (PAN-3172).
3637
3184
  */
3638
3185
  function extractSupervisorFailure(paneText) {
3639
- const lines = paneText.split("\n").map((line) => line.trim()).filter(Boolean);
3640
- const errors = lines.filter((line) => /error|cannot find|ERR_[A-Z_]+|pty-supervisor:/i.test(line));
3641
- const chosen = (errors.length > 0 ? errors : lines).slice(-3);
3186
+ const chosen = paneText.split("\n").map((line) => line.trim()).filter(Boolean).filter((line) => /error|cannot find|ERR_[A-Z_]+|pty-supervisor:/i.test(line)).slice(-3);
3642
3187
  if (chosen.length === 0) return null;
3643
3188
  return chosen.join(" | ").slice(0, 500);
3644
3189
  }
@@ -3652,7 +3197,16 @@ async function waitForPtySupervisorSocket(agentId, timeoutMs = PTY_SUPERVISOR_SO
3652
3197
  await new Promise((r) => setTimeout(r, 250));
3653
3198
  }
3654
3199
  const failure = extractSupervisorFailure(await capturePaneText(agentId, 40));
3655
- throw new Error(`Timed out waiting for PTY supervisor socket ${socketPath}` + (failure ? ` — supervisor output: ${failure}` : ""));
3200
+ const detail = failure ? `supervisor output: ${failure}` : "the supervisor pane shows no error output (a healthy harness statusline); the supervisor may have bound its socket under a different OVERDECK_HOME";
3201
+ throw new Error(`Timed out waiting for PTY supervisor socket ${socketPath} — ${detail}`);
3202
+ }
3203
+ async function waitForPtySupervisorOrFallback(agentId, timeoutMs = PTY_SUPERVISOR_SOCKET_WAIT_MS, sessionAlive = tmuxSessionExists) {
3204
+ try {
3205
+ await waitForPtySupervisorSocket(agentId, timeoutMs);
3206
+ } catch (error) {
3207
+ if (!await sessionAlive(agentId)) throw error;
3208
+ console.warn(`[conversations] PTY supervisor socket unavailable for ${agentId}; continuing with fallback delivery: ${error instanceof Error ? error.message : String(error)}`);
3209
+ }
3656
3210
  }
3657
3211
  async function extractModelFromSessionFile(sessionFile) {
3658
3212
  try {
@@ -3779,8 +3333,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3779
3333
  } else if (model) {
3780
3334
  if (!SAFE_MODEL_PATTERN.test(model)) throw new Error("Invalid model name");
3781
3335
  runtimeCommand = await getAgentRuntimeBaseCommand(model, void 0, void 0, harness);
3782
- const mode = resolvePermissionModeSync();
3783
- if (!runtimeCommand.includes("--permission-mode")) runtimeCommand = `${runtimeCommand} --permission-mode ${mode === "auto" ? "auto" : BYPASS_PERMISSION_MODE}`;
3336
+ runtimeCommand = ensureClaudePermissionFlagSync(runtimeCommand);
3784
3337
  providerExportsStr = (await getProviderExportsForModel(model, harness)).trim();
3785
3338
  if (behavior.transcriptKind === "ohmypi-jsonl") {
3786
3339
  if (getProviderForModelSync(model).name === "openai") {
@@ -3813,7 +3366,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3813
3366
  const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
3814
3367
  const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
3815
3368
  const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
3816
- const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-icapA4om.js");
3369
+ const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-BValsmtK.js");
3817
3370
  initCodexHome(codexHome, {
3818
3371
  trustedDir: cwd,
3819
3372
  approvalPolicy: codexApprovalPolicy,
@@ -3833,7 +3386,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3833
3386
  if (resume) {
3834
3387
  const pinnedId = await readFile(join(getOverdeckHome(), "agents", tmuxSession, "kimi-session-id"), "utf-8").then((value) => value.trim() || void 0).catch(() => void 0);
3835
3388
  if (pinnedId) {
3836
- const { kimiSessionsRoot } = await import("./kimi-code-DoMoGqIu.js");
3389
+ const { kimiSessionsRoot } = await import("./kimi-code-BxkDgaj4.js");
3837
3390
  if (await stat(join(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd), pinnedId, "agents", "main", "wire.jsonl")).then(() => true, () => false)) kimiResumeSessionId = pinnedId;
3838
3391
  }
3839
3392
  }
@@ -3866,7 +3419,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3866
3419
  const launchTmuxAndCaptureSession = async () => {
3867
3420
  let kimiExistingSessionsBefore;
3868
3421
  if (kimiCodeFields && !kimiCodeFields.resumeSessionId) try {
3869
- const { kimiSessionsRoot } = await import("./kimi-code-DoMoGqIu.js");
3422
+ const { kimiSessionsRoot } = await import("./kimi-code-BxkDgaj4.js");
3870
3423
  kimiExistingSessionsBefore = new Set(await readdir(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd)));
3871
3424
  } catch {
3872
3425
  kimiExistingSessionsBefore = /* @__PURE__ */ new Set();
@@ -3905,7 +3458,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3905
3458
  } catch {}
3906
3459
  console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
3907
3460
  try {
3908
- const { preTrustDirectory } = await import("./workspace-manager-5BKPV6SY.js");
3461
+ const { preTrustDirectory } = await import("./workspace-manager-BrbX90Rm.js");
3909
3462
  preTrustDirectory(cwd);
3910
3463
  } catch {}
3911
3464
  try {
@@ -3917,12 +3470,12 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3917
3470
  if (err?.code === "ENOENT") throw new Error("tmux is not installed. Install it with: brew install tmux (macOS) or sudo apt-get install tmux (Linux)");
3918
3471
  throw err;
3919
3472
  }
3920
- if (useSupervisor) await waitForPtySupervisorSocket(tmuxSession);
3473
+ if (useSupervisor) await waitForPtySupervisorOrFallback(tmuxSession);
3921
3474
  if (behavior.usesCodexHome && codexFields?.codexHome && codexTransport === "tui") {
3922
3475
  const codexHomeDir = codexFields.codexHome;
3923
3476
  (async () => {
3924
3477
  try {
3925
- const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-icapA4om.js");
3478
+ const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-BValsmtK.js");
3926
3479
  const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
3927
3480
  if (rollout) {
3928
3481
  const threadId = extractThreadIdFromRollout(rollout);
@@ -3932,14 +3485,14 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3932
3485
  })();
3933
3486
  }
3934
3487
  if (kimiCodeFields && kimiExistingSessionsBefore) {
3935
- const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-DoMoGqIu.js");
3488
+ const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-BxkDgaj4.js");
3936
3489
  const sessionId = await waitForNewKimiSessionAsync(join(homedir(), ".kimi-code"), cwd, kimiExistingSessionsBefore);
3937
3490
  if (!sessionId) throw new Error(`kimi-code session capture timed out for ${tmuxSession} — no new session directory appeared under the workspace bucket`);
3938
3491
  writeKimiSessionId(tmuxSession, sessionId);
3939
3492
  }
3940
3493
  };
3941
3494
  if (kimiCodeFields) {
3942
- const { withKimiSessionCaptureLock } = await import("./kimi-code-DoMoGqIu.js");
3495
+ const { withKimiSessionCaptureLock } = await import("./kimi-code-BxkDgaj4.js");
3943
3496
  await withKimiSessionCaptureLock(join(homedir(), ".kimi-code"), cwd, launchTmuxAndCaptureSession);
3944
3497
  } else await launchTmuxAndCaptureSession();
3945
3498
  if (channelsBridgeMcpConfig) dismissDevChannelsDialog(tmuxSession).catch((err) => {
@@ -4076,6 +3629,16 @@ async function handleConversationStop(name, deps) {
4076
3629
  return jsonResponse({ error: "Internal server error" }, { status: 500 });
4077
3630
  }
4078
3631
  }
3632
+ async function handleConversationClearForkState(name, deps = {}) {
3633
+ const conv = getConversationByName(name);
3634
+ if (!conv) return jsonResponse({ error: "Conversation not found" }, { status: 404 });
3635
+ if (!await (deps.sessionExists ?? tmuxSessionExists)(conv.tmuxSession)) return jsonResponse({ error: "Cannot clear failure state while the tmux session is not alive" }, { status: 409 });
3636
+ (deps.clearFailureState ?? clearConversationFailureState)(name);
3637
+ return jsonResponse({
3638
+ ...getConversationByName(name) ?? conv,
3639
+ sessionAlive: true
3640
+ });
3641
+ }
4079
3642
  async function handleConversationResume(name, body, deps) {
4080
3643
  try {
4081
3644
  const conv = getConversationByName(name);
@@ -4091,8 +3654,7 @@ async function handleConversationResume(name, body, deps) {
4091
3654
  reattached: true
4092
3655
  });
4093
3656
  }
4094
- const oldSessionId = conv.claudeSessionId;
4095
- const resumeCause = conv.status === "ended" ? "operator" : "system";
3657
+ const oldSessionId = conv.claudeSessionId, resumeCause = conv.status === "ended" ? "operator" : "system", sendResumeContract = body["sendResumeContract"] !== false;
4096
3658
  const harness = conv.harness ?? "claude-code";
4097
3659
  const modelChanged = !!model && model !== conv.model;
4098
3660
  if (!await validateCwdContainment(conv.cwd)) return jsonResponse({ error: "Invalid cwd" }, { status: 400 });
@@ -4111,7 +3673,7 @@ async function handleConversationResume(name, body, deps) {
4111
3673
  await spawnConversationSession(conv.tmuxSession, conv.cwd, oldSessionId ?? randomUUID$1(), model, effort, conv.issueId ?? void 0, canResume, harness);
4112
3674
  await waitForTmuxSession(conv.tmuxSession);
4113
3675
  await waitForConversationRuntimeReady(conv.tmuxSession, harness, "respawn");
4114
- await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv));
3676
+ await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv), sendResumeContract);
4115
3677
  markConversationActive(name);
4116
3678
  return jsonResponse({
4117
3679
  ...conv,
@@ -4200,6 +3762,184 @@ async function handleConversationRestartAll(deps) {
4200
3762
  }
4201
3763
  }
4202
3764
  //#endregion
3765
+ //#region ../../lib/pi-ask-modal.ts
3766
+ /**
3767
+ * PAN-3766 follow-up — answer an ohmypi `ask` modal from the dashboard.
3768
+ *
3769
+ * The conversation message route cannot answer a pi ask: the control channel's
3770
+ * steer/prompt lands in pi's input queue, but the modal holds the UI, so the
3771
+ * answer is swallowed and the agent stays parked. The only way through is to
3772
+ * drive the modal itself with keystrokes, exactly like the codex-approval and
3773
+ * pane-choice paths do for their native menus.
3774
+ *
3775
+ * Safety model mirrors answerSessionPaneChoice: re-verify the live state before
3776
+ * touching the session (pending ask in the transcript, modal footer and
3777
+ * question text on screen, cursor position parsed from the pane), then confirm
3778
+ * the modal is gone afterwards. Any drift returns 409 and the operator answers
3779
+ * in the terminal instead.
3780
+ */
3781
+ init_agent_enrichment();
3782
+ init_jsonl_resolver();
3783
+ init_tmux();
3784
+ const PANE_CAPTURE_LINES = 90;
3785
+ const KEYSTROKE_GAP_MS = 60;
3786
+ const DELIVERY_CONFIRM_WAIT_MS = 700;
3787
+ /** The modal footer hint — the same signature the pane detector keys on. */
3788
+ const PI_ASK_FOOTER_RE = /Enter\s+select\b.*Esc\s+cancel/i;
3789
+ /** Cursor on a numbered option: "❯ ○ 1 · Label" (boxed) or "❯ 1 - Label". */
3790
+ const PI_ASK_CURSOR_NUMBERED_RE = /❯\s*○?\s*(\d+)\s*[·.\-]/;
3791
+ const PI_ASK_CURSOR_OTHER_RE = /❯\s*○?\s*Other\b/i;
3792
+ /** Strip box-drawing chrome and collapse whitespace so wrapped pane lines compare cleanly. */
3793
+ function normalizePaneText(text) {
3794
+ return text.replace(/[╭╮╰╯│├┤┌┐└┘─┬┴┼]/g, " ").replace(/\s+/g, " ").trim();
3795
+ }
3796
+ /** Paste text into the modal's Other input — no Enter; the caller sends that separately. */
3797
+ async function pasteTextIntoSession(sessionName, text) {
3798
+ const sendId = randomUUID$1();
3799
+ const tmpFile = join(tmpdir(), `pan-pi-ask-${sendId}.txt`);
3800
+ const bufferName = `pan-pi-ask-${sendId}`;
3801
+ try {
3802
+ await writeFile(tmpFile, text, "utf-8");
3803
+ await tmuxExecAsync([
3804
+ "load-buffer",
3805
+ "-b",
3806
+ bufferName,
3807
+ tmpFile
3808
+ ], { encoding: "utf-8" });
3809
+ await tmuxExecAsync([
3810
+ "paste-buffer",
3811
+ "-b",
3812
+ bufferName,
3813
+ "-p",
3814
+ "-t",
3815
+ exactPaneTarget(sessionName)
3816
+ ], { encoding: "utf-8" });
3817
+ } finally {
3818
+ await unlink(tmpFile).catch(() => {});
3819
+ }
3820
+ }
3821
+ /**
3822
+ * The cursor's current item position (0-based): numbered options come first,
3823
+ * then "Other (type your own)" as the final item. Null when unparseable.
3824
+ */
3825
+ function piAskCursorPosition(pane, optionCount) {
3826
+ const lines = pane.split("\n");
3827
+ for (let i = lines.length - 1; i >= 0; i--) {
3828
+ const line = lines[i];
3829
+ const numbered = PI_ASK_CURSOR_NUMBERED_RE.exec(line);
3830
+ if (numbered) {
3831
+ const n = Number(numbered[1]);
3832
+ if (n >= 1 && n <= optionCount) return n - 1;
3833
+ return null;
3834
+ }
3835
+ if (PI_ASK_CURSOR_OTHER_RE.test(line)) return optionCount;
3836
+ }
3837
+ return null;
3838
+ }
3839
+ async function answerPiAskModal(sessionName, body, deps = {}) {
3840
+ try {
3841
+ const toolUseId = typeof body["toolUseId"] === "string" ? body["toolUseId"] : "";
3842
+ if (!toolUseId) return {
3843
+ body: { error: "toolUseId is required" },
3844
+ status: 400
3845
+ };
3846
+ const answers = body["answers"];
3847
+ if (!Array.isArray(answers) || answers.length !== 1 || typeof answers[0] !== "string" || !answers[0].trim()) return {
3848
+ body: { error: "answers must contain exactly one non-empty string" },
3849
+ status: 400
3850
+ };
3851
+ const answer = answers[0].trim();
3852
+ if (!await (deps.sessionExists ?? ((name) => Effect.runPromise(sessionExists(name))))(sessionName)) return {
3853
+ body: { error: "Conversation session is not running" },
3854
+ status: 409
3855
+ };
3856
+ const resolveTranscript = deps.resolveTranscript ?? ((name) => resolvePiSessionPath(name));
3857
+ const scanTranscript = deps.scanTranscript ?? scanPendingInputsPromise;
3858
+ const transcript = await resolveTranscript(sessionName);
3859
+ const pending = (transcript ? await scanTranscript(transcript) : null)?.askUserQuestions.find((q) => q.toolId === toolUseId);
3860
+ if (!pending) return {
3861
+ body: {
3862
+ error: "The question is no longer pending — it was answered or superseded",
3863
+ code: "ask-gone"
3864
+ },
3865
+ status: 409
3866
+ };
3867
+ if (pending.questions.length !== 1) return {
3868
+ body: {
3869
+ error: "This ask has multiple questions; answer it in the terminal",
3870
+ code: "multi-question-unsupported"
3871
+ },
3872
+ status: 409
3873
+ };
3874
+ const question = pending.questions[0];
3875
+ const capture = deps.capture ?? capturePaneText;
3876
+ const sendKey = deps.sendKey ?? ((name, key) => Effect.runPromise(sendRawKeystroke(name, key, "pi-ask-answer")));
3877
+ const sendText = deps.sendText ?? pasteTextIntoSession;
3878
+ const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
3879
+ const pane = await capture(sessionName, PANE_CAPTURE_LINES);
3880
+ if (!PI_ASK_FOOTER_RE.test(pane)) return {
3881
+ body: {
3882
+ error: "The ask modal is no longer on screen",
3883
+ code: "modal-gone"
3884
+ },
3885
+ status: 409
3886
+ };
3887
+ const paneNorm = normalizePaneText(pane);
3888
+ const questionNorm = normalizePaneText(question.question).slice(0, 40);
3889
+ if (questionNorm.length >= 12 && !paneNorm.includes(questionNorm)) return {
3890
+ body: {
3891
+ error: "The ask modal changed since the dialog was rendered — refresh and re-answer",
3892
+ code: "modal-changed"
3893
+ },
3894
+ status: 409
3895
+ };
3896
+ const optionIndex = question.options.findIndex((o) => o.label.trim() === answer);
3897
+ const isCustomText = optionIndex < 0;
3898
+ const targetPosition = isCustomText ? question.options.length : optionIndex;
3899
+ const cursor = piAskCursorPosition(pane, question.options.length);
3900
+ if (cursor === null) return {
3901
+ body: {
3902
+ error: "Could not read the modal cursor — answer it from the terminal",
3903
+ code: "cursor-unknown"
3904
+ },
3905
+ status: 409
3906
+ };
3907
+ const delta = targetPosition - cursor;
3908
+ const navKey = delta > 0 ? "Down" : "Up";
3909
+ for (let i = 0; i < Math.abs(delta); i++) {
3910
+ await sendKey(sessionName, navKey);
3911
+ await sleep(KEYSTROKE_GAP_MS);
3912
+ }
3913
+ await sendKey(sessionName, "Enter");
3914
+ if (isCustomText) {
3915
+ await sleep(KEYSTROKE_GAP_MS * 3);
3916
+ await sendText(sessionName, answer);
3917
+ await sleep(KEYSTROKE_GAP_MS);
3918
+ await sendKey(sessionName, "Enter");
3919
+ }
3920
+ await sleep(DELIVERY_CONFIRM_WAIT_MS);
3921
+ const after = await capture(sessionName, PANE_CAPTURE_LINES);
3922
+ if (PI_ASK_FOOTER_RE.test(after)) return {
3923
+ body: {
3924
+ error: "Keystrokes were sent but the modal is still on screen — answer it from the terminal",
3925
+ code: "delivery-unconfirmed"
3926
+ },
3927
+ status: 409
3928
+ };
3929
+ return { body: {
3930
+ ok: true,
3931
+ answeredLabel: isCustomText ? answer : question.options[optionIndex].label
3932
+ } };
3933
+ } catch (error) {
3934
+ const message = error instanceof Error ? error.message : String(error);
3935
+ console.error("[sessions] pi-ask answer failed:", message);
3936
+ return {
3937
+ body: { error: "Internal server error" },
3938
+ status: 500
3939
+ };
3940
+ }
3941
+ }
3942
+ //#endregion
4203
3943
  //#region ../../lib/overdeck/conversation-delivery.ts
4204
3944
  init_agent_input_detection();
4205
3945
  init_conversations();
@@ -4413,6 +4153,40 @@ async function deliverConversationViaControlChannel(conv, message, options) {
4413
4153
  source: options.source
4414
4154
  });
4415
4155
  }
4156
+ /**
4157
+ * PAN-3766 follow-up — answer a pi conversation's `ask` modal. The control
4158
+ * channel cannot do it: a steer queues behind the modal and is never seen.
4159
+ * The answer must drive the modal with keystrokes (see pi-ask-modal.ts).
4160
+ */
4161
+ async function handleConversationPiAskAnswer(rawId, body, deps = {}) {
4162
+ try {
4163
+ const numericId = Number(rawId);
4164
+ const conv = !Number.isNaN(numericId) && /^\d+$/.test(rawId) ? getConversationById(numericId) : getConversationByName(rawId);
4165
+ if (!conv) return {
4166
+ body: { error: "Conversation not found" },
4167
+ status: 404
4168
+ };
4169
+ if (!isPiControlChannelHarness(conv.harness ?? "claude-code")) return {
4170
+ body: { error: "Not a Pi conversation" },
4171
+ status: 400
4172
+ };
4173
+ if (conv.status === "ended") return {
4174
+ body: { error: "Session has ended — start a new run to interact" },
4175
+ status: 422
4176
+ };
4177
+ return await answerPiAskModal(conv.tmuxSession, body, {
4178
+ ...deps,
4179
+ sessionExists: deps.sessionExists ?? tmuxSessionExists
4180
+ });
4181
+ } catch (error) {
4182
+ const msg = error instanceof Error ? error.message : String(error);
4183
+ console.error("[conversations] pi ask answer failed:", msg);
4184
+ return {
4185
+ body: { error: "Internal server error" },
4186
+ status: 500
4187
+ };
4188
+ }
4189
+ }
4416
4190
  async function handleConversationThinkingLevel(name, body) {
4417
4191
  const conv = getConversationByName(name);
4418
4192
  if (!conv) return jsonResponse({ error: "Conversation not found" }, { status: 404 });
@@ -4594,101 +4368,6 @@ function asRecord(value) {
4594
4368
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
4595
4369
  }
4596
4370
  //#endregion
4597
- //#region ../../lib/session-pane-choice.ts
4598
- init_pane_choice_menu();
4599
- init_tmux();
4600
- const PANE_CAPTURE_LINES = 90;
4601
- const KEYSTROKE_GAP_MS = 60;
4602
- const DELIVERY_CONFIRM_WAIT_MS = 700;
4603
- async function captureSessionPaneChoice(sessionName, capture = capturePaneText) {
4604
- let pane;
4605
- try {
4606
- pane = await capture(sessionName, PANE_CAPTURE_LINES);
4607
- } catch {
4608
- return null;
4609
- }
4610
- const menu = parsePaneChoiceMenu(pane);
4611
- if (!menu) return null;
4612
- return {
4613
- signature: paneChoiceMenuSignature(menu),
4614
- title: menu.title,
4615
- contextLines: menu.contextLines,
4616
- options: menu.options.map((option) => ({
4617
- number: option.number,
4618
- label: option.label,
4619
- recommended: option.recommended
4620
- })),
4621
- selectedIndex: menu.selectedIndex,
4622
- footerHint: menu.footerHint,
4623
- confidence: menu.confidence
4624
- };
4625
- }
4626
- async function answerSessionPaneChoice(sessionName, body, deps = {}) {
4627
- try {
4628
- const selectedIndex = Number(body.selectedIndex);
4629
- const signature = typeof body.signature === "string" ? body.signature : "";
4630
- if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex > 8) return {
4631
- body: { error: "selectedIndex must be an integer 0-8" },
4632
- status: 400
4633
- };
4634
- if (!signature) return {
4635
- body: { error: "signature is required" },
4636
- status: 400
4637
- };
4638
- if (!await (deps.sessionExists ?? ((name) => Effect.runPromise(sessionExists(name))))(sessionName)) return {
4639
- body: { error: "Conversation session is not running" },
4640
- status: 409
4641
- };
4642
- const capture = deps.capture ?? capturePaneText;
4643
- const sendKey = deps.sendKey ?? ((name, key) => Effect.runPromise(sendRawKeystroke(name, key, "pane-choice")));
4644
- const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
4645
- const menu = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
4646
- if (!menu) return {
4647
- body: {
4648
- error: "The choice menu is no longer on screen",
4649
- code: "menu-gone"
4650
- },
4651
- status: 409
4652
- };
4653
- if (paneChoiceMenuSignature(menu) !== signature) return {
4654
- body: {
4655
- error: "The choice menu changed since the card was rendered — refresh and re-answer",
4656
- code: "menu-changed"
4657
- },
4658
- status: 409
4659
- };
4660
- if (selectedIndex >= menu.options.length) return {
4661
- body: { error: `selectedIndex out of range (0-${menu.options.length - 1})` },
4662
- status: 400
4663
- };
4664
- const keys = buildChoiceKeystrokes(menu, selectedIndex);
4665
- for (const key of keys) {
4666
- await sendKey(sessionName, key);
4667
- await sleep(KEYSTROKE_GAP_MS);
4668
- }
4669
- await sleep(DELIVERY_CONFIRM_WAIT_MS);
4670
- const after = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
4671
- if (after && paneChoiceMenuSignature(after) === signature) return {
4672
- body: {
4673
- error: "Keystrokes were sent but the menu is still on screen — answer it from the terminal",
4674
- code: "delivery-unconfirmed"
4675
- },
4676
- status: 409
4677
- };
4678
- return { body: {
4679
- ok: true,
4680
- answeredLabel: menu.options[selectedIndex].label
4681
- } };
4682
- } catch (error) {
4683
- const message = error instanceof Error ? error.message : String(error);
4684
- console.error("[sessions] pane-choice answer failed:", message);
4685
- return {
4686
- body: { error: "Internal server error" },
4687
- status: 500
4688
- };
4689
- }
4690
- }
4691
- //#endregion
4692
4371
  //#region ../../lib/channels/permission-payload.ts
4693
4372
  const CHANNEL_PERMISSION_LIMITS = {
4694
4373
  requestIdBytes: 128,
@@ -4983,7 +4662,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
4983
4662
  error: "missing agent id"
4984
4663
  }, { status: 400 });
4985
4664
  const request = yield* HttpServerRequest.HttpServerRequest;
4986
- const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-B-z-sGBH.js"));
4665
+ const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-BCTEqUCX.js"));
4987
4666
  const expected = getInternalTokenSync();
4988
4667
  if (!expected) return jsonResponse({
4989
4668
  ok: false,
@@ -5280,7 +4959,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
5280
4959
  const request = yield* HttpServerRequest.HttpServerRequest;
5281
4960
  const urlOpt = HttpServerRequest.toURL(request);
5282
4961
  const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
5283
- const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-jMfxrElt.js"));
4962
+ const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-BTqsmunw.js"));
5284
4963
  const endTime = /* @__PURE__ */ new Date();
5285
4964
  const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
5286
4965
  const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
@@ -5295,7 +4974,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
5295
4974
  return Effect.gen(function* () {
5296
4975
  let eventBody = body;
5297
4976
  if (body["kind"] === "linear_mcp_auth_required" || body["kind"] === "linear_mcp_auth_healthy") {
5298
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-keg-x1bT.js"));
4977
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-BAQApt97.js"));
5299
4978
  const snapshot = yield* (yield* AgentStateService).get(id);
5300
4979
  eventBody = {
5301
4980
  ...body,
@@ -5330,7 +5009,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
5330
5009
  detail: String(decoded.failure)
5331
5010
  }, { status: 400 })
5332
5011
  };
5333
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-keg-x1bT.js"));
5012
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-BAQApt97.js"));
5334
5013
  yield* (yield* AgentStateService).emit(decoded.success);
5335
5014
  return {
5336
5015
  ok: true,
@@ -5411,13 +5090,13 @@ const postAgentPlanChecklistRoute = HttpRouter.add("POST", "/api/agents/:id/plan
5411
5090
  const auth = yield* Effect.promise(() => validateAgentRuntimeEventAuth(request));
5412
5091
  if (!auth.ok) return auth.response;
5413
5092
  const id = (yield* HttpRouter.params)["id"] ?? "";
5414
- const { getAgentState } = yield* Effect.promise(() => import("./agents-megfmQHM.js"));
5093
+ const { getAgentState } = yield* Effect.promise(() => import("./agents-DixZjXWm.js"));
5415
5094
  const state = yield* getAgentState(id);
5416
5095
  if (!state?.workspace || !state.issueId) return jsonResponse({
5417
5096
  success: false,
5418
5097
  error: "agent has no resolvable workspace or issue id"
5419
5098
  }, { status: 422 });
5420
- const { checkIncompletePlanItemsPromise } = yield* Effect.promise(() => import("./done-preflight-CksRvh49.js"));
5099
+ const { checkIncompletePlanItemsPromise } = yield* Effect.promise(() => import("./done-preflight-CGFA0M1b.js"));
5421
5100
  const incomplete = yield* Effect.promise(() => checkIncompletePlanItemsPromise(state.workspace, state.issueId));
5422
5101
  return jsonResponse({
5423
5102
  success: true,
@@ -5431,7 +5110,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
5431
5110
  success: false,
5432
5111
  error: "missing agent id"
5433
5112
  }, { status: 400 });
5434
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-keg-x1bT.js"));
5113
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-BAQApt97.js"));
5435
5114
  const snapshot = yield* (yield* AgentStateService).get(id);
5436
5115
  if (!snapshot) return jsonResponse({
5437
5116
  success: false,
@@ -5459,7 +5138,6 @@ init_workspace_manager();
5459
5138
  */
5460
5139
  init_event_store();
5461
5140
  init_agents$1();
5462
- init_persistent_logger();
5463
5141
  function prepareAgentStateForSave(state) {
5464
5142
  if (state.status === "running" || state.status === "starting") delete state.stoppedAt;
5465
5143
  else if (state.status === "stopped" && !state.stoppedAt) state.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -5623,8 +5301,8 @@ function createAgentStopHandler(lifecycleEvent) {
5623
5301
  yield* stopAgent(id, "operator");
5624
5302
  if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
5625
5303
  try {
5626
- const { resolveProjectFromIssueSync } = await import("./projects-DvPEAP18.js");
5627
- const { findWorkspacePath } = await import("./archive-planning-C-H9cM_J.js");
5304
+ const { resolveProjectFromIssueSync } = await import("./projects-BMuEf14J.js");
5305
+ const { findWorkspacePath } = await import("./archive-planning-D3gw32U9.js");
5628
5306
  const issueLower = stateBeforeStop.issueId.toLowerCase();
5629
5307
  const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
5630
5308
  if (workspacePath) {
@@ -5764,7 +5442,7 @@ const postAgentUnpauseRoute = HttpRouter.add("POST", "/api/agents/:id/unpause",
5764
5442
  if ((yield* getWorkAgentLifecycleState(id)).canResumeSession && updatedState.troubled !== true) {
5765
5443
  resumeTriggered = true;
5766
5444
  yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.unpause_immediate_resume_triggered"));
5767
- import("./resume-D7JuMCRQ.js").then(({ resumeAgent }) => resumeAgent(id)).then((result) => {
5445
+ import("./resume-ByUrJUNX.js").then(({ resumeAgent }) => resumeAgent(id)).then((result) => {
5768
5446
  if (!result.success) console.warn(`[agents] immediate resume after unpause failed for ${id}: ${result.error}`);
5769
5447
  }).catch((err) => console.warn(`[agents] immediate resume after unpause errored for ${id}:`, err));
5770
5448
  }
@@ -7177,15 +6855,15 @@ async function requestWorkStartAfterContainers(input) {
7177
6855
  function handleRemoteAgentSpawn(input) {
7178
6856
  return Effect.gen(function* () {
7179
6857
  const { issueId, workspacePath, workspaceMetadata, spawnModel, startedBy, autoSpawnConsentRequired, projectPath, spawnGuardrails, lifecycle } = input;
7180
- const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-DQVGZVQ9.js"));
7181
- const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-oEMfXlwT.js"));
7182
- const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-Cjleh3_U.js"));
6858
+ const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-MuXx2gWm.js"));
6859
+ const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-BTh-sjpX.js"));
6860
+ const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-CvKH7r7W.js"));
7183
6861
  const panConfig = loadPanConfig();
7184
6862
  const spendCap = checkRemoteSpendCap(panConfig);
7185
6863
  if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
7186
6864
  const fly = createFlyProviderFromConfig(panConfig.remote);
7187
6865
  yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
7188
- const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt--9AWNYwZ.js"));
6866
+ const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-BnhKNAg7.js"));
7189
6867
  const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
7190
6868
  const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
7191
6869
  issueId,
@@ -7919,7 +7597,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
7919
7597
  console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
7920
7598
  }
7921
7599
  try {
7922
- const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-By-wp6pg.js");
7600
+ const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
7923
7601
  await appendSessionEntry(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId, {
7924
7602
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
7925
7603
  reason: "start",
@@ -8367,14 +8045,14 @@ function firePostMergeLifecycle(issueId, options) {
8367
8045
  const normalizedIssueId = parsedIssueId.normalized.toUpperCase();
8368
8046
  const started = postMergeGuard.run(normalizedIssueId, async () => {
8369
8047
  const projectPath = getProjectPathForIssue(parsedIssueId.prefix);
8370
- const { postMergeLifecycle } = await import("./merge-agent-BRSz26Oh.js");
8048
+ const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
8371
8049
  const lifecycleOptions = {
8372
8050
  ...options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : {},
8373
8051
  ...options?.verifiedMergedRepos?.length ? { verifiedMergedRepos: options.verifiedMergedRepos } : {}
8374
8052
  };
8375
8053
  await postMergeLifecycle(normalizedIssueId, projectPath, options?.sourceBranch, Object.keys(lifecycleOptions).length > 0 ? lifecycleOptions : void 0);
8376
8054
  console.log(`[merge] post-merge lifecycle completed for ${normalizedIssueId}`);
8377
- const { runMergeTrainReconcile } = await import("./merge-train-BOu3fN7O.js");
8055
+ const { runMergeTrainReconcile } = await import("./merge-train-VxLn8Ms4.js");
8378
8056
  const outcomes = await runMergeTrainReconcile(normalizedIssueId);
8379
8057
  if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${normalizedIssueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
8380
8058
  }, (err) => console.error(`[merge] post-merge lifecycle failed for ${normalizedIssueId}:`, err));
@@ -8394,15 +8072,15 @@ init_review_status();
8394
8072
  init_io();
8395
8073
  init_tmux();
8396
8074
  const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
8397
- const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8075
+ const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
8398
8076
  return jsonResponse({
8399
8077
  specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
8400
8078
  projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
8401
8079
  });
8402
8080
  })));
8403
8081
  const postSpecialistsResetAllRoute = HttpRouter.add("POST", "/api/specialists/reset-all", httpHandler(Effect.gen(function* () {
8404
- const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8405
- const { clearHookSync } = yield* Effect.promise(() => import("./hooks-W3REcb3h.js"));
8082
+ const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
8083
+ const { clearHookSync } = yield* Effect.promise(() => import("./hooks-EndRNrx9.js"));
8406
8084
  const specialists = getAllSpecialists();
8407
8085
  const results = [];
8408
8086
  for (const specialist of specialists) {
@@ -8461,7 +8139,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8461
8139
  }
8462
8140
  console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
8463
8141
  if (specialist === "merge") {
8464
- const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-CC1XJbTx.js"));
8142
+ const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-BMv3K54P.js"));
8465
8143
  if (yield* reportSpecialistCompletion(normalizedIssueId, {
8466
8144
  status,
8467
8145
  notes
@@ -8488,7 +8166,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8488
8166
  if (project) {
8489
8167
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8490
8168
  if (existsSync(workspacePath)) {
8491
- const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-Y0zG25ez.js");
8169
+ const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-BAMwn9Nf.js");
8492
8170
  reviewEvidenceHead = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
8493
8171
  }
8494
8172
  }
@@ -8537,7 +8215,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8537
8215
  if (project && failedItemId) {
8538
8216
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8539
8217
  if (existsSync(workspacePath)) {
8540
- const { onInspectComplete } = await import("./inspect-agent-CfxERkNt.js");
8218
+ const { onInspectComplete } = await import("./inspect-agent-Dhp3hCGp.js");
8541
8219
  await Effect.runPromise(onInspectComplete(project.projectKey, normalizedIssueId, failedItemId, "failed", workspacePath, notes));
8542
8220
  }
8543
8221
  }
@@ -8548,7 +8226,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8548
8226
  }
8549
8227
  yield* Effect.promise(async () => {
8550
8228
  try {
8551
- const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-D8gsOCwh.js");
8229
+ const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-CYt1U3Zm.js");
8552
8230
  const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
8553
8231
  const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
8554
8232
  saveAgentRuntimeState(tmuxSession, {
@@ -8567,7 +8245,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8567
8245
  });
8568
8246
  console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
8569
8247
  }
8570
- const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-GqnGSYoJ.js");
8248
+ const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-BDKoz5Z9.js");
8571
8249
  if (await Effect.runPromise(updateSpecialistHandoffStatus(normalizedIssueId, `${specialist}-agent`, status === "passed" ? "completed" : "failed", status === "passed" ? "success" : "failure"))) console.log(`[specialists/done] Updated handoff log: ${specialist}-agent ${normalizedIssueId} → ${status}`);
8572
8250
  } catch (err) {
8573
8251
  console.error(`[specialists/done] Error managing specialist state:`, err);
@@ -8579,7 +8257,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8579
8257
  if (project) {
8580
8258
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8581
8259
  if (existsSync(workspacePath)) {
8582
- const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-Y0zG25ez.js");
8260
+ const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-BAMwn9Nf.js");
8583
8261
  const headAnchor = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
8584
8262
  if (headAnchor) {
8585
8263
  setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: headAnchor });
@@ -8593,7 +8271,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8593
8271
  });
8594
8272
  if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
8595
8273
  try {
8596
- const { onInspectComplete } = await import("./inspect-agent-CfxERkNt.js");
8274
+ const { onInspectComplete } = await import("./inspect-agent-Dhp3hCGp.js");
8597
8275
  const project = resolveProjectFromIssueSync(normalizedIssueId);
8598
8276
  if (project) {
8599
8277
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
@@ -8609,7 +8287,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8609
8287
  if (project) {
8610
8288
  if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
8611
8289
  setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
8612
- const { initEventStore } = await import("./event-store-BgEjNsvk.js");
8290
+ const { initEventStore } = await import("./event-store-C50Qt-f1.js");
8613
8291
  await (await initEventStore()).appendAsync({
8614
8292
  type: "test.passed",
8615
8293
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -8662,8 +8340,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8662
8340
  if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
8663
8341
  try {
8664
8342
  const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
8665
- const { sessionExists } = await import("./tmux-CqNapnrr.js");
8666
- const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-megfmQHM.js");
8343
+ const { sessionExists } = await import("./tmux-CYucGrTl.js");
8344
+ const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-DixZjXWm.js");
8667
8345
  if (await Effect.runPromise(sessionExists(workAgentId))) {
8668
8346
  await messageAgent(workAgentId, `MERGE CONFLICT: The merge-agent could not rebase your branch onto main due to conflicts. Please fix this now:\n\n1. git fetch origin main\n2. git rebase origin/main\n3. Resolve any conflicts (git add <file> && git rebase --continue)\n4. git push --force-with-lease\n5. Resubmit: curl -s -X POST http://localhost:3011/api/review/${normalizedIssueId}/request -H "Content-Type: application/json" -d "{}"\n\nConflict details: ${notes}`);
8669
8347
  console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
@@ -8677,7 +8355,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8677
8355
  try {
8678
8356
  const project = resolveProjectFromIssueSync(normalizedIssueId);
8679
8357
  const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
8680
- const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-DqXTuJk8.js");
8358
+ const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-tyMoLT2L.js");
8681
8359
  const result = await Effect.runPromise(deliverReviewVerdictFeedback({
8682
8360
  issueId: normalizedIssueId,
8683
8361
  verdict: status === "failed" ? "failed" : "blocked",
@@ -8697,7 +8375,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8697
8375
  if (project) {
8698
8376
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8699
8377
  if (existsSync(workspacePath)) {
8700
- const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-Y0zG25ez.js");
8378
+ const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-BAMwn9Nf.js");
8701
8379
  const reviewedAtCommit = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
8702
8380
  if (reviewedAtCommit) {
8703
8381
  setReviewStatusSync(normalizedIssueId, { reviewedAtCommit });
@@ -8737,7 +8415,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8737
8415
  });
8738
8416
  })));
8739
8417
  const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/specialists/logs/cleanup-all", httpHandler(Effect.gen(function* () {
8740
- const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-5OTnrV91.js"));
8418
+ const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
8741
8419
  const results = cleanupAllLogsSync();
8742
8420
  return jsonResponse({
8743
8421
  success: true,
@@ -8747,7 +8425,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
8747
8425
  });
8748
8426
  })));
8749
8427
  const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
8750
- const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8428
+ const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
8751
8429
  return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
8752
8430
  })));
8753
8431
  const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
@@ -8791,7 +8469,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
8791
8469
  "blocked",
8792
8470
  "failed"
8793
8471
  ].includes(status)) {
8794
- const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8472
+ const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
8795
8473
  saveAgentRuntimeState(getTmuxSessionName(name), {
8796
8474
  state: "idle",
8797
8475
  lastActivity: (/* @__PURE__ */ new Date()).toISOString()
@@ -8913,7 +8591,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
8913
8591
  const issueId = params["issueId"];
8914
8592
  const type = params["type"];
8915
8593
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
8916
- const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8594
+ const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
8917
8595
  const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
8918
8596
  yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
8919
8597
  saveAgentRuntimeState(tmuxSession, {
@@ -8940,7 +8618,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
8940
8618
  if (limitParam) limit = parseInt(limitParam, 10);
8941
8619
  if (offsetParam) offset = parseInt(offsetParam, 10);
8942
8620
  }
8943
- const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-5OTnrV91.js"));
8621
+ const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
8944
8622
  return jsonResponse(listRunLogsSync(project, type, {
8945
8623
  limit,
8946
8624
  offset
@@ -8951,7 +8629,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
8951
8629
  const project = params["project"];
8952
8630
  const type = params["type"];
8953
8631
  const runId = params["runId"];
8954
- const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-5OTnrV91.js"));
8632
+ const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
8955
8633
  const logPath = getRunLogPath(project, type, runId);
8956
8634
  if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
8957
8635
  const encoder = new TextEncoder();
@@ -9010,7 +8688,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
9010
8688
  const project = params["project"];
9011
8689
  const type = params["type"];
9012
8690
  const runId = params["runId"];
9013
- const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-5OTnrV91.js"));
8691
+ const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
9014
8692
  const content = getRunLogSync(project, type, runId);
9015
8693
  if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
9016
8694
  return jsonResponse({
@@ -9024,7 +8702,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
9024
8702
  const project = params["project"];
9025
8703
  const type = params["type"];
9026
8704
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
9027
- const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8705
+ const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
9028
8706
  yield* Effect.promise(() => terminateSpecialist(project, type));
9029
8707
  return jsonResponse({
9030
8708
  success: true,
@@ -9036,7 +8714,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
9036
8714
  const project = params["project"];
9037
8715
  const type = params["type"];
9038
8716
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
9039
- const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8717
+ const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
9040
8718
  if (pauseGracePeriod(project, type)) return jsonResponse({
9041
8719
  success: true,
9042
8720
  message: "Grace period paused"
@@ -9048,7 +8726,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
9048
8726
  const project = params["project"];
9049
8727
  const type = params["type"];
9050
8728
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
9051
- const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8729
+ const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
9052
8730
  if (resumeGracePeriod(project, type)) return jsonResponse({
9053
8731
  success: true,
9054
8732
  message: "Grace period resumed"
@@ -9060,7 +8738,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
9060
8738
  const project = params["project"];
9061
8739
  const type = params["type"];
9062
8740
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
9063
- const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8741
+ const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
9064
8742
  exitGracePeriod(project, type);
9065
8743
  return jsonResponse({
9066
8744
  success: true,
@@ -9072,7 +8750,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
9072
8750
  const project = params["project"];
9073
8751
  const type = params["type"];
9074
8752
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
9075
- const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8753
+ const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
9076
8754
  const state = getGracePeriodState(project, type);
9077
8755
  if (state) return jsonResponse(state);
9078
8756
  else return jsonResponse({ error: "No active grace period" }, { status: 404 });
@@ -9081,7 +8759,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
9081
8759
  const params = yield* HttpRouter.params;
9082
8760
  const project = params["project"];
9083
8761
  const type = params["type"];
9084
- const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-cHwpcXSh.js"));
8762
+ const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-C1-CfYQb.js"));
9085
8763
  const digest = loadContextDigest(project, type);
9086
8764
  if (digest) return jsonResponse({ digest });
9087
8765
  else return jsonResponse({ error: "No context digest found" }, { status: 404 });
@@ -9090,7 +8768,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
9090
8768
  const params = yield* HttpRouter.params;
9091
8769
  const project = params["project"];
9092
8770
  const type = params["type"];
9093
- const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-cHwpcXSh.js"));
8771
+ const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-C1-CfYQb.js"));
9094
8772
  const digest = yield* regenerateContextDigest(project, type);
9095
8773
  if (digest) return jsonResponse({
9096
8774
  digest,
@@ -9109,7 +8787,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
9109
8787
  "blocked"
9110
8788
  ].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
9111
8789
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
9112
- const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8790
+ const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
9113
8791
  signalSpecialistCompletion(project, type, {
9114
8792
  status,
9115
8793
  notes
@@ -9143,8 +8821,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
9143
8821
  const params = yield* HttpRouter.params;
9144
8822
  const project = params["project"];
9145
8823
  const type = params["type"];
9146
- const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-5OTnrV91.js"));
9147
- const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-DvPEAP18.js"));
8824
+ const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-BJQFkpdG.js"));
8825
+ const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-BMuEf14J.js"));
9148
8826
  const retention = getSpecialistRetention(project);
9149
8827
  const deleted = cleanupOldLogsSync(project, type, {
9150
8828
  maxDays: retention.max_days,
@@ -9165,7 +8843,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
9165
8843
  const project = params["project"];
9166
8844
  const issueId = params["issueId"];
9167
8845
  const { model, harness } = yield* readJsonBody;
9168
- const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-BUNTVJK2.js"));
8846
+ const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
9169
8847
  const killResult = yield* killAllReviewerSessions(project, issueId);
9170
8848
  const projectConfig = resolveProjectFromIssueSync(issueId);
9171
8849
  if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
@@ -9181,7 +8859,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
9181
8859
  }));
9182
8860
  branch = stdout.trim() || primaryRepo.sourceBranch;
9183
8861
  } catch {}
9184
- const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-BUNTVJK2.js"));
8862
+ const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
9185
8863
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
9186
8864
  const result = yield* spawnReviewRoleForIssue({
9187
8865
  issueId,
@@ -9225,7 +8903,7 @@ const postProjectReviewerRoleRestartRoute = HttpRouter.add("POST", "/api/special
9225
8903
  const { model } = yield* readJsonBody;
9226
8904
  const reviewer = getAgentStateSync(reviewerId);
9227
8905
  yield* Effect.promise(() => Effect.runPromise(killSession(reviewerId)).catch(() => void 0));
9228
- const { spawnReviewSubRoleForIssue } = yield* Effect.promise(() => import("./review-agent-BUNTVJK2.js"));
8906
+ const { spawnReviewSubRoleForIssue } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
9229
8907
  const result = yield* spawnReviewSubRoleForIssue({
9230
8908
  issueId,
9231
8909
  workspace: parent.workspace,
@@ -9353,6 +9031,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
9353
9031
  */
9354
9032
  const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
9355
9033
  //#endregion
9356
- export { resolvePolicy as $, handleConversationSwitchModel as A, validateOrigin as At, waitForTmuxSession as B, conversationNeedsRunningRepair as C, rejectUnauthorizedDashboardRequest as Ct, handleConversationRestartAll as D, waitForSessionRespawn as Dt, handleConversationDelete as E, isRespawnPending as Et, spawnConversationSession as F, jsonStringResponse as Ft, extractConversationAttachmentPaths as G, cleanupOrphanedConversationAttachments as H, startConversationModelBackfill as I, isManagedConversationAttachmentPath as J, getConversationAttachmentsRoot as K, stopConversationRuntime as L, resolveAllowedHarness as M, httpHandler as Mt, resolveRegisteredProject as N, getDefaultCwd as Nt, handleConversationResume as O, getHeaderFromMap as Ot, shouldReportUnresolvedLiveSession as P, jsonResponse as Pt, handleComposerCommandMessage as Q, tmuxSessionExists as R, validateConversationControlAckOrigin as S, hasDashboardInternalToken as St, handleConversationCreate as T, rejectUnsafeDashboardMutationRequest as Tt, cleanupUnreferencedConversationAttachments as U, cleanupConversationAttachments as V, ensureConversationAttachmentDir as W, runInBatches as X, removeConversationAttachment as Y, composerCommandResultHttpStatus as Z, handleConversationPlanAction as _, resolveJsonlPath as _t, agentsRouteLayer as a, isInternalAgentRequest as at, pickDeliverAs as b, dashboardCsrfToken as bt, answerSessionPaneChoice as c, resolveConversationGitInfo as ct, deliverConversationViaControlChannel as d, spawnPanCli as dt, ComposerCommandParseError as et, handleConversationAbort as f, readLauncherPinnedSessionId as ft, handleConversationDeliveryMethod as g, resolveCodexRolloutPath as gt, handleConversationControlAck as h, resolveClaudeSessionId as ht, validateSpecialistAutoCompleteMetadata as i, invalidateAgentsCache as it, isInsideGitWorkTree as j, validateOriginHeaders as jt, handleConversationStop as k, isTrustedOriginForHost as kt, captureSessionPaneChoice as l, getWorkAgentLifecycleStateSync as lt, handleConversationCompact as m, resolveAgentHarness as mt, _serverManagedMerges as n, composerCommandConfirmationFromBody as nt, saveAgentStateAndEmitEvent as o, resolveRequestedStartedBy as ot, handleConversationCodexApproval as p, resolveAcpTranscriptPath as pt, hasConversationAttachment as q, firePostMergeLifecycle as r, evaluateSpawnGuardrails as rt, saveAgentStateAndEmitEventProgram as s, resolveAgentGitInfo as st, specialistsRouteLayer as t, ComposerCommandConfirmationError as tt, codexConversationPendingInput as u, panCliInvocation as ut, handleConversationThinkingLevel as v, resolveKimiWirePath as vt, conversationSessionAliveFromState as w, rejectUnauthorizedDashboardSessionMintRequest as wt, resolveConversationDeliveryMethod as x, dashboardSessionCookieHeader as xt, isPiControlChannelHarness as y, resolvePiSessionPath as yt, waitForPiTuiReady as z };
9034
+ export { resolvePolicy as $, handleConversationSwitchModel as A, waitForTmuxSession as B, conversationSessionAliveFromState as C, getDefaultCwd as Ct, handleConversationRestartAll as D, handleConversationDelete as E, spawnConversationSession as F, extractConversationAttachmentPaths as G, cleanupOrphanedConversationAttachments as H, startConversationModelBackfill as I, isManagedConversationAttachmentPath as J, getConversationAttachmentsRoot as K, stopConversationRuntime as L, resolveAllowedHarness as M, resolveRegisteredProject as N, handleConversationResume as O, shouldReportUnresolvedLiveSession as P, handleComposerCommandMessage as Q, tmuxSessionExists as R, conversationNeedsRunningRepair as S, httpHandler as St, handleConversationCreate as T, jsonStringResponse as Tt, cleanupUnreferencedConversationAttachments as U, cleanupConversationAttachments as V, ensureConversationAttachmentDir as W, runInBatches as X, removeConversationAttachment as Y, composerCommandResultHttpStatus as Z, handleConversationThinkingLevel as _, waitForSessionRespawn as _t, agentsRouteLayer as a, isInternalAgentRequest as at, resolveConversationDeliveryMethod as b, validateOrigin as bt, codexConversationPendingInput as c, panCliInvocation as ct, handleConversationCodexApproval as d, dashboardSessionCookieHeader as dt, ComposerCommandParseError as et, handleConversationCompact as f, hasDashboardInternalToken as ft, handleConversationPlanAction as g, isRespawnPending as gt, handleConversationPiAskAnswer as h, rejectUnsafeDashboardMutationRequest as ht, validateSpecialistAutoCompleteMetadata as i, invalidateAgentsCache as it, isInsideGitWorkTree as j, handleConversationStop as k, deliverConversationViaControlChannel as l, spawnPanCli as lt, handleConversationDeliveryMethod as m, rejectUnauthorizedDashboardSessionMintRequest as mt, _serverManagedMerges as n, composerCommandConfirmationFromBody as nt, saveAgentStateAndEmitEvent as o, resolveRequestedStartedBy as ot, handleConversationControlAck as p, rejectUnauthorizedDashboardRequest as pt, hasConversationAttachment as q, firePostMergeLifecycle as r, evaluateSpawnGuardrails as rt, saveAgentStateAndEmitEventProgram as s, getWorkAgentLifecycleStateSync as st, specialistsRouteLayer as t, ComposerCommandConfirmationError as tt, handleConversationAbort as u, dashboardCsrfToken as ut, isPiControlChannelHarness as v, getHeaderFromMap as vt, handleConversationClearForkState as w, jsonResponse as wt, validateConversationControlAckOrigin as x, validateOriginHeaders as xt, pickDeliverAs as y, isTrustedOriginForHost as yt, waitForPiTuiReady as z };
9357
9035
 
9358
- //# sourceMappingURL=specialists-DocAK-7A.js.map
9036
+ //# sourceMappingURL=specialists-DhS79T9v.js.map