@overdeck/desktop 0.49.1 → 0.49.2

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 (497) hide show
  1. package/package.json +1 -1
  2. package/server/{acceptance-criteria-Crw-xSJ3.js → acceptance-criteria-CHtDkHEL.js} +2 -2
  3. package/server/{active-dashboard-bundle-CLwfD-Om.js → active-dashboard-bundle-Byh6sP-q.js} +2 -2
  4. package/server/{activity-logger-BAVLrkR7.js → activity-logger-BWZhVphb.js} +22 -4
  5. package/server/activity-logger-Ck8qoluj.js +3 -0
  6. package/server/{advancing-selfheal-BQiJ7mIH.js → advancing-selfheal-65W4yUQi.js} +6 -6
  7. package/server/{agent-gc-5E0lgxI1.js → agent-gc-BNUudFnt.js} +10 -10
  8. package/server/agent-idle-ONBssBN_.js +745 -0
  9. package/server/{agent-state-Bb3UUxQm.js → agent-state-BJhGIJZe.js} +421 -135
  10. package/server/agent-state-CM8iVw5B.js +3 -0
  11. package/server/{agent-state-service-BFbttwRA.js → agent-state-service-CiIuwzIs.js} +5 -5
  12. package/server/{agent-state-service-keg-x1bT.js → agent-state-service-CzHfoqKQ.js} +1 -1
  13. package/server/agents-DpCuoF65.js +3 -0
  14. package/server/{agents-CqQJW75N.js → agents-jXgqpHca.js} +8 -8
  15. package/server/archive-planning-BW4MKNI7.js +2 -0
  16. package/server/{archive-planning-BwEhu9Oq.js → archive-planning-CGkU6UeL.js} +20 -135
  17. package/server/{artifact-index-jobs-C6Lg2rKm.js → artifact-index-jobs-Ck4NRRkY.js} +3 -3
  18. package/server/{assemble-DyTp2gSB.js → assemble-CyvEBmmq.js} +28 -9
  19. package/server/{auto-spawn-consent-BDfe4qz0.js → auto-spawn-consent-Dc4mtM-B.js} +8 -7
  20. package/server/{backlog-auto-trigger-DuOGpdDW.js → backlog-auto-trigger-CCEpr4YT.js} +3 -3
  21. package/server/{behavior-Bitko0mD.js → behavior-BiCQzqyT.js} +3 -3
  22. package/server/{bridge-pool-patrol-DiHEd13O.js → bridge-pool-patrol-Ce8rNPym.js} +2 -2
  23. package/server/{briefing-freshness-CDJcmHHZ.js → briefing-freshness-e_OEYZEe.js} +2 -2
  24. package/server/{build-info-DTX8JwVP.js → build-info-BRw4QlYO.js} +3 -3
  25. package/server/build-info-Bj2vQEMh.js +2 -0
  26. package/server/{checkpoint-manager-CKg1tn34.js → checkpoint-manager-CKr42Usw.js} +1 -1
  27. package/server/{checkpoint-manager-BlOOdzLF.js → checkpoint-manager-DOwRGFff.js} +26 -9
  28. package/server/checkpoint-worker.js +1 -1
  29. package/server/{checkpoints-DRALkfDS.js → checkpoints-Cb6CWT4S.js} +1 -1
  30. package/server/{checkpoints-BGfl0cHM.js → checkpoints-Cszp_0Np.js} +2 -2
  31. package/server/{claude-hooks-provision-B_tv3wzE.js → claude-hooks-provision-C5JHpxTS.js} +1 -1
  32. package/server/{claude-hooks-provision-BlGv6twJ.js → claude-hooks-provision-Cer2eFfj.js} +2 -2
  33. package/server/{claude-permissions-aHgDcZi5.js → claude-permissions-Bc5kjX1q.js} +2 -2
  34. package/server/{claude-settings-overlay-CYOvFE3A.js → claude-settings-overlay-C7rWsnya.js} +1 -1
  35. package/server/{claude-settings-overlay-T2LWLteV.js → claude-settings-overlay-m-VVZej1.js} +2 -2
  36. package/server/cli-BRuzUT_I.js +2 -0
  37. package/server/{cli-Do8UpLoI.js → cli-BmczsfD6.js} +11 -11
  38. package/server/{cliproxy-CX6jHRDP.js → cliproxy-BpYpkogS.js} +52 -17
  39. package/server/cliproxy-_yUU0HRY.js +3 -0
  40. package/server/{close-issue-J0_eWYT1.js → close-issue-CxvRD0UI.js} +5 -5
  41. package/server/{closed-issue-reaper-bFppuk6F.js → closed-issue-reaper-nMLRi5de.js} +13 -12
  42. package/server/{closed-issue-reaper-Cl2h9AfT.js → closed-issue-reaper-omOcUDBl.js} +1 -1
  43. package/server/{codex-icapA4om.js → codex-DZhFfcWu.js} +1 -1
  44. package/server/{codex-OOea7lXs.js → codex-KaSKE-R3.js} +16 -10
  45. package/server/{compaction-continuation-D5voR1ME.js → compaction-continuation-Bjfi70G-.js} +3 -3
  46. package/server/{config-Cjleh3_U.js → config-CH1AqqIQ.js} +1 -1
  47. package/server/{config-DC75T4Mr.js → config-Doq_tF-f.js} +2 -2
  48. package/server/{config-tucKBCCc.js → config-ZGjvuR6J.js} +2 -2
  49. package/server/{config-yaml-BwOEANMr.js → config-yaml-D9nfpEx1.js} +33 -8
  50. package/server/{conflict-gate-DlpWCMd7.js → conflict-gate-D4XCtrm2.js} +1 -1
  51. package/server/{conflict-gate-D2L1kZeL.js → conflict-gate-DcUTY4Gb.js} +4 -4
  52. package/server/{context-layers-CSPGc2Hb.js → context-layers-BBTKP-Y4.js} +3 -3
  53. package/server/context-layers-BGj2Y9l3.js +4 -0
  54. package/server/{continue-U3Af0jUq.js → continue-i7Revg8D.js} +3 -3
  55. package/server/{control-settings-5k6ixdFW.js → control-settings-BMoDHY1G.js} +6 -6
  56. package/server/{conversation-compaction-CSpVpxN6.js → conversation-compaction-D4VOmF7p.js} +8 -8
  57. package/server/{conversation-compaction-Ciit9O6k.js → conversation-compaction-DzIjYMfg.js} +1 -1
  58. package/server/{conversation-service-BxrB5lUT.js → conversation-service-CzZUJFEx.js} +1 -1
  59. package/server/{conversation-service-BteE4ELK.js → conversation-service-tQCIbBVZ.js} +6 -6
  60. package/server/{conversations-DhwxsOru.js → conversations-C75EFFjf.js} +12 -7
  61. package/server/conversations-bFDaD5YN.js +3 -0
  62. package/server/{cost-Bnf9NUC5.js → cost-BCWEkvro.js} +3 -3
  63. package/server/{cost-CQKI6OCu.js → cost-CiIwxH1D.js} +2 -2
  64. package/server/{cost-sync-B-ADeXKY.js → cost-sync-DOkdE_yB.js} +3 -3
  65. package/server/{dag-DI9LaK_q.js → dag-BPc74hwj.js} +6 -19
  66. package/server/{dangerous-git-ops-akhA3iyF.js → dangerous-git-ops-By9iguTP.js} +1 -1
  67. package/server/dashboard-db-worker.js +7 -7
  68. package/server/{deacon-TPYssFYt.js → deacon-B24dNzr8.js} +1774 -171
  69. package/server/deacon-CzSZMtb-.js +4 -0
  70. package/server/{deacon-canonical-state-DFYymrDw.js → deacon-canonical-state-CkvxRPck.js} +3 -3
  71. package/server/{deacon-event-client-Te5v10-b.js → deacon-event-client-BYIQBu0T.js} +1 -1
  72. package/server/{deacon-event-client-BKOL4AcL.js → deacon-event-client-Do6Z2gKl.js} +2 -2
  73. package/server/{deacon-nudge-log-BtlTWgWu.js → deacon-nudge-log-CzM9JA9t.js} +1 -1
  74. package/server/{deacon-pending-lifecycle-DVHjOLje.js → deacon-pending-lifecycle-BObEdT-L.js} +3 -3
  75. package/server/deacon.js +11 -11
  76. package/server/dead-end-trip-6V_CwveT.js +2 -0
  77. package/server/{dead-end-trip-P0IF1O0E.js → dead-end-trip-CnVmjnya.js} +3 -3
  78. package/server/delivery-gyce0vQ7.js +3 -0
  79. package/server/{deploy-patrol-BXjlvoV3.js → deploy-patrol-CEwwEYDM.js} +8 -8
  80. package/server/deploy-queue-CjLErpgw.js +2 -0
  81. package/server/{deploy-queue-o7shYg1j.js → deploy-queue-r96ojDI3.js} +2 -2
  82. package/server/{deploy-window-CNT6fOff.js → deploy-window-D_3hhfxt.js} +4 -4
  83. package/server/{deploy-window-BMk5_oX6.js → deploy-window-DeJK8mTK.js} +1 -1
  84. package/server/{dev-supervisor-SR1CLOAK.js → dev-supervisor-DZWwpENk.js} +2 -2
  85. package/server/{devcontainer-renderer-enMmNDFa.js → devcontainer-renderer-d-9dCV_2.js} +3 -3
  86. package/server/{dist-CPTO_zMR.js → dist-DsLAsFSh.js} +1 -1
  87. package/server/dist-fCA6y2bH.js +3 -0
  88. package/server/{docker-B7qUZptz.js → docker-B2mUBzGk.js} +3 -3
  89. package/server/{docker-KR3zSFKY.js → docker-CRPHBylA.js} +1 -1
  90. package/server/{dod-gK835UMf.js → dod-DWtilRLx.js} +1 -1
  91. package/server/{done-preflight-CksRvh49.js → done-preflight-BDVdWed5.js} +1 -1
  92. package/server/{done-preflight-Bk8aExAL.js → done-preflight-D4ukUf-S.js} +5 -5
  93. package/server/{driver-CmsY2RLl.js → driver-BtcFz-qu.js} +14 -3
  94. package/server/{durable-review-pipeline-DgYHucN2.js → durable-review-pipeline-B3OS2_He.js} +11 -2
  95. package/server/durable-review-pipeline-CaCbEJSt.js +3 -0
  96. package/server/{ensure-devcontainer-ojerEqQg.js → ensure-devcontainer-BUeBRjmm.js} +4 -4
  97. package/server/{ensure-devcontainer-BQ4YizSH.js → ensure-devcontainer-rGSh0JHK.js} +1 -1
  98. package/server/{esm-shims-1htPASWs.js → esm-shims-oAaKIa-a.js} +1 -1
  99. package/server/{event-store-D7qcJXuZ.js → event-store-BCSgMubf.js} +5 -5
  100. package/server/{event-store-BgEjNsvk.js → event-store-Db4w4YIY.js} +1 -1
  101. package/server/{event-store-provider-BKvk2rDj.js → event-store-provider-DlSQND3V.js} +1 -1
  102. package/server/{events-BIKGJZOT.js → events-B6zioJA_.js} +3 -3
  103. package/server/{dist-src-BM9eudEd.js → factory-BrdqXBeK.js} +714 -2
  104. package/server/{feature-registry-storage-ewNSIVsQ.js → feature-registry-storage-zh3ZXW6f.js} +3 -3
  105. package/server/{features-CGopJXdU.js → features-BGntOWdy.js} +2 -2
  106. package/server/{feedback-stuck-retirement-B8-fX7NA.js → feedback-stuck-retirement-DpA5u1kt.js} +2 -2
  107. package/server/{feedback-target-Ci6N5p4G.js → feedback-target-D7GxdUYG.js} +10 -10
  108. package/server/{feedback-target-CkyLYohm.js → feedback-target-Ddqk93NF.js} +1 -1
  109. package/server/{feedback-writer-D4ULO4qG.js → feedback-writer-C1gCLFmp.js} +5 -5
  110. package/server/{feedback-writer-DfuVjvH0.js → feedback-writer-CH2846DP.js} +1 -1
  111. package/server/{flywheel-C7yek87O.js → flywheel-CjW2L7BS.js} +79 -29
  112. package/server/{flywheel-DXI_WITn.js → flywheel-HJt7QdWP.js} +1 -1
  113. package/server/{flywheel-merge-order-C5m5bYBc.js → flywheel-merge-order-4fNRN2F2.js} +1 -1
  114. package/server/{flywheel-merge-order-CXfU4M6l.js → flywheel-merge-order-D_yyAlND.js} +7 -7
  115. package/server/{flywheel-BwYPDlhK.js → flywheel-v1cCOBx-.js} +14 -14
  116. package/server/{forge-DYX9sKzG.js → forge-RVTCK_5X.js} +2 -2
  117. package/server/forge-bvak6vXJ.js +2 -0
  118. package/server/{from-DAdMxC29.js → from-BnLgKYvw.js} +1 -1
  119. package/server/{fs-lock-cw25uO_E.js → fs-lock-C7J-ugIf.js} +2 -2
  120. package/server/{fts-operations-D_rzLxX5.js → fts-operations-CU0B5WUx.js} +3 -3
  121. package/server/git-info-BSrI9owC.js +148 -0
  122. package/server/{git-utils-Y0zG25ez.js → git-utils-CsKV0Dis.js} +1 -1
  123. package/server/{git-utils-DV4B9TRl.js → git-utils-DW8-jIUJ.js} +4 -4
  124. package/server/{github-app-4UX8VIr8.js → github-app-7ywLhuZO.js} +2 -2
  125. package/server/{github-app-C33lDk9Z.js → github-app-Oi5hdn1n.js} +1 -1
  126. package/server/{github-client-nPj5ckZO.js → github-client-Cy0fSj1a.js} +1 -1
  127. package/server/{github-client-DkJVR908.js → github-client-DAbuXLuk.js} +3 -3
  128. package/server/{github-pr-lookup-C9Vokb0W.js → github-pr-lookup-Dhh3ec1V.js} +2 -2
  129. package/server/{harness-binary-BgXYDo2Z.js → harness-binary-tMmgJfC1.js} +2 -2
  130. package/server/{harness-resolve-1NZcVx7n.js → harness-resolve-DusNpVEe.js} +4 -4
  131. package/server/{health-events-jMfxrElt.js → health-events-BYDZ9n2i.js} +1 -1
  132. package/server/{health-events-DlX_FVAB.js → health-events-DNw9Mzw9.js} +2 -2
  133. package/server/{hooks-W3REcb3h.js → hooks-B4wj32l2.js} +1 -1
  134. package/server/{hooks-NQ19vvlB.js → hooks-BjBjxqNh.js} +2 -2
  135. package/server/{hume-BFkid2PO.js → hume-BP9YbxaE.js} +2 -2
  136. package/server/hume-TYTb6fDU.js +3 -0
  137. package/server/{identity-Bwh6VGeL.js → identity-C23uY8dZ.js} +3 -3
  138. package/server/{idle-stack-reaper-BeU_KxWx.js → idle-stack-reaper-BSxb1bln.js} +4 -4
  139. package/server/{idle-stack-reaper-CHtCNpvd.js → idle-stack-reaper-Bw0rU9GC.js} +1 -1
  140. package/server/{in-flight-guard-pcwXKLGz.js → in-flight-guard-DuxabAHT.js} +1 -1
  141. package/server/{infra-KTp9KV9u.js → infra-CHIvOb9q.js} +30 -7
  142. package/server/{injection-67YyU6SC.js → injection-BYUt8ml1.js} +8 -8
  143. package/server/{injection-BxbZKPDh.js → injection-BviePcm3.js} +1 -1
  144. package/server/inspect-agent-JFEaYTRa.js +2 -0
  145. package/server/{inspect-agent-VHSihlb7.js → inspect-agent-sV_19NxZ.js} +12 -12
  146. package/server/{internal-token-B-z-sGBH.js → internal-token-BOtIRJU7.js} +1 -1
  147. package/server/{internal-token-zY75jrRJ.js → internal-token-DoVzb4b7.js} +2 -2
  148. package/server/{io-DfvO2xyh.js → io-DKrWd3gX.js} +5 -5
  149. package/server/{issue-closed-dvEWKO7Q.js → issue-closed-6RQsAjDX.js} +7 -7
  150. package/server/{issue-lifecycle-3N8XF7lP.js → issue-lifecycle-D9nLErvS.js} +206 -29
  151. package/server/{issue-lifecycle-BI6jAfp8.js → issue-lifecycle-DOPVv7xz.js} +1 -1
  152. package/server/{issue-service-singleton-BN_2MXp4.js → issue-service-singleton-B2xy-IS9.js} +124 -11
  153. package/server/{issue-service-singleton-CL6hESX2.js → issue-service-singleton-CvgNAWqK.js} +1 -1
  154. package/server/issue-title-fallback-DTSCQVu0.js +120 -0
  155. package/server/{issues-CkvUoAnq.js → issues-e_Ck1Ln2.js} +2 -2
  156. package/server/{jsonl-parser-CrEb2PWr.js → jsonl-parser-DqxVCZ1k.js} +3 -3
  157. package/server/jsonl-resolver-07OS3qOr.js +324 -0
  158. package/server/{kimi-code-C26gmGxM.js → kimi-code-BjtAHIz1.js} +14 -12
  159. package/server/{kimi-code-DoMoGqIu.js → kimi-code-vtXl2DR5.js} +1 -1
  160. package/server/{kimi-parser-Dmhy3UlR.js → kimi-parser-B1lgy2Vt.js} +2 -2
  161. package/server/{label-cleanup-X2lWfghH.js → label-cleanup-D2zUMasf.js} +3 -3
  162. package/server/{lifecycle-Bg44O-9x.js → lifecycle-0NOEzomy.js} +2 -2
  163. package/server/{lifecycle-B0rL38D3.js → lifecycle-DaCovZwn.js} +6 -6
  164. package/server/{lifecycle-io-CCBpRv5m.js → lifecycle-io-6WL46dsB.js} +5 -5
  165. package/server/{lifecycle-io-DQDU0apV.js → lifecycle-io-BBMTaP7S.js} +1 -1
  166. package/server/{linear-client-B0cIkTs4.js → linear-client-7fQThJTc.js} +3 -3
  167. package/server/{linear-client-6V2E-DSa.js → linear-client-BTGApNLo.js} +1 -1
  168. package/server/{linear-mcp-auth-LCo9AWUd.js → linear-mcp-auth-B8pYRsiU.js} +1 -1
  169. package/server/{linear-mcp-auth-Dsu9Io9r.js → linear-mcp-auth-Nk5s3L9M.js} +5 -5
  170. package/server/memory-fts-worker.js +1 -1
  171. package/server/{memory-governor-A4O6vI9d.js → memory-governor-Cqvbusr4.js} +14 -14
  172. package/server/{memory-pressure-patrol-BWlWywmA.js → memory-pressure-patrol-DPb8foam.js} +5 -5
  173. package/server/{merge-BGWcBxku.js → merge-BB_bjJ9a.js} +1 -1
  174. package/server/{merge-vz80RvSE.js → merge-FZ78_cEz.js} +3 -3
  175. package/server/{merge-agent-GWhmnxFk.js → merge-agent-B3jRrlS1.js} +37 -33
  176. package/server/{merge-agent-BRSz26Oh.js → merge-agent-BuoC_PRZ.js} +2 -2
  177. package/server/{merge-batch-CFMEtTxv.js → merge-batch-B8bVjFWS.js} +1 -1
  178. package/server/{merge-completeness-CP347umA.js → merge-completeness-DQt7Qa7i.js} +4 -4
  179. package/server/{merge-completeness-7ajHAIR-.js → merge-completeness-DkdabVch.js} +1 -1
  180. package/server/merge-ops-DabXHp2i.js +2 -0
  181. package/server/merge-rebase-CXq0qsgR.js +2 -0
  182. package/server/{merge-rebase-C5htyEEH.js → merge-rebase-qq40s91P.js} +2 -2
  183. package/server/{merge-set-DsGW8fmc.js → merge-set-BTNYvxM3.js} +1 -1
  184. package/server/{merge-set-eiE2nC6C.js → merge-set-BmRRflt0.js} +4 -4
  185. package/server/{merge-sync-CM2-myXu.js → merge-sync-0m2Q087q.js} +1 -1
  186. package/server/{merge-sync-Ct0-cxMX.js → merge-sync-CJpOa0cZ.js} +2 -2
  187. package/server/{merge-train-deps-LXHGK61n.js → merge-train-deps-CH5Mr3vN.js} +4 -4
  188. package/server/{merge-train-BOu3fN7O.js → merge-train-iwKqjtCF.js} +4 -4
  189. package/server/{merge-verification-BRp08IzI.js → merge-verification-JJc5GC2t.js} +6 -6
  190. package/server/{merged-docker-cleanup-worker-CwldDjHV.js → merged-docker-cleanup-worker-BOqWA373.js} +4 -4
  191. package/server/{merged-docker-cleanup-worker-C8eGn78a.js → merged-docker-cleanup-worker-CrhTdxZV.js} +1 -1
  192. package/server/messaging-nuwStbdQ.js +3 -0
  193. package/server/{multipart-parser-OAuW7824.js → multipart-parser-DxuW_rZV.js} +2 -2
  194. package/server/{no-resume-mode-MWI6pnrK.js → no-resume-mode-xuYLFhLw.js} +1 -1
  195. package/server/node_modules/.package-lock.json +11 -11
  196. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/AGENTS.md +14 -0
  197. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/CLAUDE.md +14 -0
  198. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +10 -3
  199. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/10_basics.ts +175 -0
  200. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/index.md +6 -0
  201. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/10_basics.ts +3 -1
  202. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/20_testing.ts +100 -0
  203. 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
  204. 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
  205. 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
  206. 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
  207. 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
  208. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/70_cli/10_basics.ts +27 -3
  209. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
  210. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +10 -9
  211. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
  212. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js +4 -4
  213. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js.map +1 -1
  214. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.d.ts.map +1 -1
  215. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js +10 -4
  216. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js.map +1 -1
  217. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts +4 -0
  218. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts.map +1 -0
  219. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js +10 -0
  220. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js.map +1 -0
  221. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +4 -4
  222. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +16 -11
  223. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocketServer.ts +4 -4
  224. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeStream.ts +10 -4
  225. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/internal/nodeChildProcessSpawner.ts +16 -0
  226. package/server/node_modules/ansi-regex/index.js +3 -2
  227. package/server/node_modules/ansi-regex/package.json +1 -1
  228. package/server/node_modules/gaxios/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  229. package/server/node_modules/gaxios/build/esm/tsconfig.tsbuildinfo +1 -1
  230. package/server/node_modules/gaxios/package.json +3 -3
  231. package/server/{orphan-proposed-reconciler-cV3URUqk.js → orphan-proposed-reconciler-Dmk0kO_p.js} +24 -23
  232. package/server/{orphan-proposed-reconciler-BAE5AZ_e.js → orphan-proposed-reconciler-gf4TxfZb.js} +2 -2
  233. package/server/package-lock.json +12 -12
  234. package/server/package.json +1 -1
  235. package/server/{pan-dir-DDd91kMb.js → pan-dir-BMda7tQj.js} +5 -5
  236. package/server/{deacon-merge-BOGFEV8_.js → parked-residue-BiHb8cD7.js} +150 -35
  237. package/server/{paths-CRLnDgcI.js → paths-DEe9j-kw.js} +2 -2
  238. package/server/{pending-lifecycle-claim-CYgMiDAP.js → pending-lifecycle-claim-J5uIIJPu.js} +2 -2
  239. package/server/{pickup-BjJsSX12.js → pickup-D1UbSDPd.js} +1 -1
  240. package/server/{pipeline-agent-reader-BLc43dVJ.js → pipeline-agent-reader-D-6okryb.js} +5 -5
  241. package/server/{pipeline-membership-5qlRz5Qg.js → pipeline-membership-CCbgBzNC.js} +1 -1
  242. package/server/{pipeline-membership-BHZp_ShY.js → pipeline-membership-PGX3Pe8V.js} +1 -1
  243. package/server/{pipeline-membership-gather-CGFY1v-y.js → pipeline-membership-gather-BK4dzh0X.js} +17 -12
  244. package/server/{pipeline-membership-gather-WhRc1yke.js → pipeline-membership-gather-BRhU7XPx.js} +1 -1
  245. package/server/{pipeline-notifier-BmsLWM_2.js → pipeline-notifier-BNAV9kpa.js} +2 -2
  246. package/server/{pipeline-notifier-C4fZ2ito.js → pipeline-notifier-DvHLaXKb.js} +1 -1
  247. package/server/{post-merge-lifecycle-worker-KK1RTKRE.js → post-merge-lifecycle-worker-DAWgzXQA.js} +3 -3
  248. package/server/{post-merge-state-_Lj3LDLh.js → post-merge-state-DC2_0t12.js} +4 -4
  249. package/server/prd-locations-BbAvqQmT.js +124 -0
  250. package/server/{project-pipelines-CCkebHOu.js → project-pipelines-By_5WcT4.js} +2 -2
  251. package/server/{project-repos-B4MK48j4.js → project-repos--QeCg7yQ.js} +29 -3
  252. package/server/project-repos-3bI6t4fO.js +3 -0
  253. package/server/project-resource-refresh-queue-BaZC79S3.js +2 -0
  254. package/server/project-resource-refresh-queue-x-K9mvpP.js +865 -0
  255. package/server/{projects-DvPEAP18.js → projects-LftaVK99.js} +1 -1
  256. package/server/{prompts-BiS5I2tZ.js → prompts-BotGu-6W.js} +2 -2
  257. package/server/{providers-DrfK0Ip8.js → providers-BL1I66sM.js} +7 -7
  258. package/server/providers-Dqgz3MY5.js +3 -0
  259. package/server/public/assets/{chunk-BO2N2NFS-GtVe_o56.js → chunk-BO2N2NFS-D5Fz5jND.js} +4 -4
  260. package/server/public/assets/{diagram-OG6HWLK6-BvhcYYHc.js → diagram-OG6HWLK6-Eux0gWFq.js} +1 -1
  261. package/server/public/assets/{dist-D0ryefak.js → dist-C3zShwhA.js} +1 -1
  262. package/server/public/assets/{dist-CSmUXazd.js → dist-D-JX_u7m.js} +3 -3
  263. package/server/public/assets/{ganttDiagram-6RSMTGT7-BXA51DzM.js → ganttDiagram-6RSMTGT7-UH3aweia.js} +1 -1
  264. package/server/public/assets/{highlighted-body-OFNGDK62-mlV4EpWt.js → highlighted-body-OFNGDK62-ccIQ-WXS.js} +1 -1
  265. package/server/public/assets/index-2wV4ipy_.css +1 -0
  266. package/server/public/assets/index-BTVcdPve.js +860 -0
  267. package/server/public/assets/{linear-BPE7oswm.js → linear-Cnnu4YQy.js} +1 -1
  268. package/server/public/assets/mermaid-GHXKKRXX-Bjto8iJh.js +1 -0
  269. package/server/public/assets/{pieDiagram-4H26LBE5-BguGGV3S.js → pieDiagram-4H26LBE5-BD8-Tye6.js} +1 -1
  270. package/server/public/assets/{prod-aKDYUrXQ.js → prod-Ca6aKMts.js} +4 -4
  271. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bx3i4B6H.js → quadrantDiagram-W4KKPZXB-BmSrVyFD.js} +1 -1
  272. package/server/public/assets/{sankeyDiagram-5OEKKPKP-B5vuLjA4.js → sankeyDiagram-5OEKKPKP-CEGy8Das.js} +1 -1
  273. package/server/public/assets/{xychartDiagram-2RQKCTM6-HPlpkqsN.js → xychartDiagram-2RQKCTM6-VnQ8iY8s.js} +1 -1
  274. package/server/public/index.html +2 -2
  275. package/server/{pull-requests-BcHIsFJv.js → pull-requests-Cp_FDT8-.js} +3 -3
  276. package/server/pull-requests-jVGcVq5G.js +2 -0
  277. package/server/rally-CxhVgIQ6.js +3 -0
  278. package/server/{rally-api-ShZ4kvn0.js → rally-api-CqAIJ8RX.js} +2 -2
  279. package/server/{rally-api-u_vkr5c_.js → rally-api-Ij1Zt0NI.js} +1 -1
  280. package/server/{rally-B1OMtzch.js → rally-bQpBzUNf.js} +3 -3
  281. package/server/{rally-client-DgZvUZqX.js → rally-client-CN5vh4Ac.js} +1 -1
  282. package/server/{rally-client-D6Feq1Ka.js → rally-client-qKbCNRVW.js} +5 -5
  283. package/server/{reap-terminal-sessions-CRfiXLY0.js → reap-terminal-sessions-BaDSNR-k.js} +2 -2
  284. package/server/{reap-terminal-sessions-D7f3zSE9.js → reap-terminal-sessions-DgEIKMhH.js} +2 -2
  285. package/server/{rebuild-stack-DKxOnkpE.js → rebuild-stack-BNOMVh7C.js} +7 -7
  286. package/server/{rebuild-stack-CCwKHZb6.js → rebuild-stack-DrMyA_mA.js} +2 -2
  287. package/server/{reconstruct-cache-BP8UIKt7.js → reconstruct-cache-mxIYCnqs.js} +7 -7
  288. package/server/{record-By-wp6pg.js → record-Ug18Cp4V.js} +1 -1
  289. package/server/{record-update-ByGtIlUK.js → record-update-WyhsREoH.js} +1 -1
  290. package/server/{record-update-D23jPU6b.js → record-update-dBGxL9OC.js} +8 -6
  291. package/server/{recovery-trip-C4dTl8DO.js → recovery-trip-BKLrL6NX.js} +43 -10
  292. package/server/{recovery-trip-qloOYOFz.js → recovery-trip-wFAixKsg.js} +1 -1
  293. package/server/{release-engine-Crc0Tjx-.js → release-engine-D9gaCBn9.js} +5 -5
  294. package/server/{release-set-DDXwbIK7.js → release-set-DPHHzEGx.js} +3 -3
  295. package/server/{remote-CBpLi4Yy.js → remote-BU6ONLpv.js} +3 -3
  296. package/server/{remote-oEMfXlwT.js → remote-BUEeUic6.js} +3 -3
  297. package/server/{remote-agents-DQVGZVQ9.js → remote-agents-BVtASiOF.js} +1 -1
  298. package/server/{remote-agents-Bgtc2nOO.js → remote-agents-CSaTLi3u.js} +6 -6
  299. package/server/{remote-completion-DxUJ5HKR.js → remote-completion-CBV3b9TI.js} +13 -13
  300. package/server/{resolver-C8rooxoz.js → resolver-DvSMXty7.js} +31 -8
  301. package/server/{resolver-CuAULbLs.js → resolver-gxv97jsQ.js} +2 -2
  302. package/server/resume-DvHuF-bm.js +3 -0
  303. package/server/review-agent-DgkUPRx0.js +3 -0
  304. package/server/{review-agent-7C2w5CzU.js → review-agent-esZ0QXdY.js} +43 -55
  305. package/server/{review-artifacts-BJeEfm2r.js → review-artifacts-DGGEobLp.js} +6 -6
  306. package/server/{review-convoy-liveness-DfF9eXjI.js → review-convoy-liveness-DmO8dIBH.js} +20 -11
  307. package/server/{review-run-recovery-7BKt2Es0.js → review-run-recovery-Ct0q7FkE.js} +3 -3
  308. package/server/{review-run-recovery-ZjuDTNhZ.js → review-run-recovery-DHiiw7d8.js} +1 -1
  309. package/server/{review-status-CUnjjOUu.js → review-status-C_kQeeX0.js} +1 -1
  310. package/server/{review-status-emit-Cg4tOb8U.js → review-status-emit-BZz1Y_22.js} +3 -3
  311. package/server/{review-status-enrichment-D-rQshu6.js → review-status-enrichment-BWH0XW_m.js} +3 -3
  312. package/server/{review-status-source-DSn0glLa.js → review-status-source-D2PCWS6E.js} +1 -1
  313. package/server/{review-status-source-Ct912fv_.js → review-status-source-Jq0BXmn3.js} +1 -1
  314. package/server/{review-status-sync-B7V_Gg51.js → review-status-sync-2C9lk85r.js} +2 -2
  315. package/server/{review-status-sync-YthpOH_q.js → review-status-sync-Bq00Loey.js} +1 -1
  316. package/server/{review-status-DBnR5t4z.js → review-status-yOGD2MuK.js} +86 -27
  317. package/server/{review-verdict-feedback-DqXTuJk8.js → review-verdict-feedback-Brjaxoda.js} +1 -1
  318. package/server/{review-verdict-feedback-C-dBon_-.js → review-verdict-feedback-CE_tr2iQ.js} +8 -8
  319. package/server/{review-verdict-writer-jldSh3Bm.js → review-verdict-writer-CD-4kDVx.js} +1 -1
  320. package/server/{review-verdict-writer-CKaJWp75.js → review-verdict-writer-Ca2V7QSY.js} +7 -7
  321. package/server/{rollup-DZwH4CLs.js → rollup--g9ik1XQ.js} +1 -1
  322. package/server/{rollup-QCwYcBdP.js → rollup-B6g9Nr6L.js} +8 -8
  323. package/server/{scanner-2aHeLC3W.js → scanner-YxIv-fG1.js} +8 -8
  324. package/server/{search-DwHYaj66.js → search-DqMN4__-.js} +2 -2
  325. package/server/{secret-redaction-B5G1xZ3k.js → secret-redaction-DLZ-VqHq.js} +1 -1
  326. package/server/{sequence-io-POKWdusG.js → sequence-io--b3_PsWq.js} +4 -4
  327. package/server/{sequencer-agent-DS00KHVm.js → sequencer-agent-CqouKVZG.js} +6 -6
  328. package/server/server.js +1115 -1269
  329. package/server/{service-BLb_CyPL.js → service-CEp-3iow.js} +64 -63
  330. package/server/{session-fork-DcTzVwex.js → session-fork-GtoeCh2H.js} +2 -2
  331. package/server/{settings-Clw8UVNs.js → settings-CLQcdkoD.js} +2 -2
  332. package/server/{settings-B9-H2K_E.js → settings-Ch2pCVtt.js} +3 -3
  333. package/server/settings-DhtPDmmI.js +2 -0
  334. package/server/{shadow-engineering-C6oO_PiR.js → shadow-engineering-BxiFrIKv.js} +3 -3
  335. package/server/{shadow-state-CEGrrECe.js → shadow-state-CSA1vtxr.js} +2 -2
  336. package/server/{shadow-state-e7250VUx.js → shadow-state-nGhCNXT2.js} +1 -1
  337. package/server/{shadow-utils-xFk2Wusb.js → shadow-utils-7q5QDmMj.js} +2 -2
  338. package/server/{ship-log-7BnQHuKU.js → ship-log-ie0A_SqV.js} +1 -1
  339. package/server/{ship-record-CwUX6Afo.js → ship-record-BM3oVvnL.js} +7 -7
  340. package/server/{ship-record-BgUPnpT0.js → ship-record-DHWH1hLz.js} +1 -1
  341. package/server/{ship-status-Ce3_3edi.js → ship-status-BEkddXMT.js} +2 -2
  342. package/server/{smart-compaction-BmfIi3oL.js → smart-compaction-BkzjVpWL.js} +1 -1
  343. package/server/{smart-compaction-Dy0gw1VH.js → smart-compaction-D0TE1lBD.js} +7 -7
  344. package/server/{spawn-planning-session-nH3b4Drz.js → spawn-planning-session-CkGweSCC.js} +19 -19
  345. package/server/{spawn-planning-session-CfhxRJoY.js → spawn-planning-session-s406rw1N.js} +2 -2
  346. package/server/{specialist-completion-CC1XJbTx.js → specialist-completion-CTAjwH5j.js} +1 -1
  347. package/server/{specialist-context-cHwpcXSh.js → specialist-context-CKasRfYu.js} +5 -5
  348. package/server/{specialist-handoff-logger-GqnGSYoJ.js → specialist-handoff-logger-DrjrOmmn.js} +2 -2
  349. package/server/{specialist-logs-5OTnrV91.js → specialist-logs-Du6quZ0_.js} +3 -3
  350. package/server/{specialists-xXcJHAyg.js → specialists-B-4zyE4Y.js} +1 -1
  351. package/server/{specialists-8LcQi9Np.js → specialists-CuDWiNdB.js} +21 -272
  352. package/server/{specialists-DocAK-7A.js → specialists-b0dMMjWq.js} +148 -685
  353. package/server/specialists-registry-1y6Rt_F1.js +3 -0
  354. package/server/specialists-registry-BYjs04iK.js +277 -0
  355. package/server/specialists-x-kPMhrL.js +4 -0
  356. package/server/specs-IYsFlM-L.js +3 -0
  357. package/server/{src-DudQNYVw.js → src-CY2Wl8IX.js} +337 -6
  358. package/server/{src-C2TAxwki.js → src-CZsPs61V.js} +6 -6
  359. package/server/{src-DUVvEA8Q.js → src-DeQwpuh6.js} +3 -3
  360. package/server/{stack-health-DKT4ySnA.js → stack-health-BQFSJc0l.js} +3 -3
  361. package/server/{stack-health-CbyiYS9H.js → stack-health-ypIKtkbE.js} +1 -1
  362. package/server/{stale-task-claims-PzFee70R.js → stale-task-claims-C2e1zdMT.js} +5 -5
  363. package/server/{staleness-BjOAq9-d.js → staleness-CRDK6LFG.js} +1 -1
  364. package/server/{staleness-D8UTEXV5.js → staleness-Fzx_3_Hr.js} +1 -1
  365. package/server/{stall-sweeper-DOyIfeLR.js → stall-sweeper-QNk4h9m6.js} +8 -8
  366. package/server/{state-home-DhAZlk5k.js → state-home-DdG8erBI.js} +2 -2
  367. package/server/{state-mapping-BVSs84bO.js → state-mapping-D2yC81Vy.js} +1 -1
  368. package/server/{state-migrate-CJKEwpB0.js → state-migrate-C6H3jfHE.js} +6 -6
  369. package/server/{state-mirror-Do7pag7W.js → state-mirror-DF4Lfxm0.js} +3 -3
  370. package/server/stuck-remediation-BDa_tXgB.js +774 -0
  371. package/server/stuck-remediation-BVNd9txd.js +2 -0
  372. package/server/{substrate-bug-weights-service-BTNjHBnl.js → substrate-bug-weights-service-BbbCZEtJ.js} +3 -3
  373. package/server/{summary-fork-CZ88rhVx.js → summary-fork-BvcW6bq0.js} +113 -30
  374. package/server/{summary-fork-CvB7Oyq9.js → summary-fork-DIQmtOuV.js} +2 -2
  375. package/server/supervisor/{pane-composer-BaLLspSj.js → pane-composer-CoiVkGIt.js} +8 -1
  376. package/server/supervisor/{paths-D6XUcR_g.js → paths-DTGbtcaP.js} +8 -4
  377. package/server/supervisor/pty-supervisor.js +3 -3
  378. package/server/supervisor/{pty-token-DjjHxoCq.js → pty-token-GVqnvU3U.js} +2 -2
  379. package/server/{supervisor-D4v0WfiQ.js → supervisor-D3jC2c7A.js} +4 -4
  380. package/server/supervisor-v0cYN2Vp.js +2 -0
  381. package/server/{swarm-readiness-D8R-LWX5.js → swarm-readiness-CMWAQuWM.js} +3 -3
  382. package/server/{synthesis-verdict-B6wvLGcA.js → synthesis-verdict-C-pJOPsn.js} +1 -1
  383. package/server/{synthesis-verdict-N5Z11pg7.js → synthesis-verdict-DVlrLF9A.js} +2 -2
  384. package/server/{system-prerequisites-BbGZ_WHF.js → system-prerequisites-QKtIYXI2.js} +2 -2
  385. package/server/{teardown-workspace-CYend-KY.js → teardown-workspace-cJea1OLo.js} +16 -16
  386. package/server/{test-agent-queue-BUtWhNcc.js → test-agent-queue-C5DI_gWX.js} +6 -6
  387. package/server/{test-verdict-BWm3hgDj.js → test-verdict-C7kmd2_Y.js} +1 -1
  388. package/server/{test-verdict-BWtRmdiR.js → test-verdict-DUbDHqeD.js} +2 -2
  389. package/server/{tldr-daemon-CneJ24eL.js → tldr-daemon-BNQHwblU.js} +1 -1
  390. package/server/{tldr-daemon-CMVBT4kT.js → tldr-daemon-CO08YlfQ.js} +2 -2
  391. package/server/tmux-B8zsqD_6.js +4 -0
  392. package/server/{tmux-BqXzRuaH.js → tmux-DWEc4Ld9.js} +91 -19
  393. package/server/{token-CO3INKbh.js → token-Bez-qCB2.js} +2 -2
  394. package/server/{token-util-DyJJyX_B.js → token-util-Crcay9j_.js} +1 -1
  395. package/server/token-util-DfUS3Lpp.js +3 -0
  396. package/server/{tracker-config-DVzhaUxO.js → tracker-config-CJzPhSHv.js} +2 -2
  397. package/server/{tracker-utils-xnVJVrrO.js → tracker-utils-DJAOAuMN.js} +2 -2
  398. package/server/{traefik-connect-A5k54mCv.js → traefik-connect-D3H5I6b9.js} +1 -1
  399. package/server/{tunnel-DauSR-rs.js → tunnel-BSdKnW0U.js} +1 -1
  400. package/server/{tunnel-CwOnS-PB.js → tunnel-Cr3ctqxp.js} +3 -3
  401. package/server/{typed-errors-B-gfU2RB.js → typed-errors-CZ3GFBvo.js} +1 -1
  402. package/server/{typed-errors-DzC4zXbI.js → typed-errors-DXqf3RnP.js} +1 -1
  403. package/server/{types-DjpLVpsj.js → types-fzBp9cYi.js} +1 -1
  404. package/server/{types-DbxY2QB6.js → types-pLpbsNto.js} +1 -1
  405. package/server/{uat-failure-feedback-BVqsWlrr.js → uat-failure-feedback-IZQ-J8jt.js} +5 -5
  406. package/server/{uat-promote-verification-DmG097QS.js → uat-promote-verification-DXApKcc2.js} +5 -5
  407. package/server/{uat-train-COSy-vEX.js → uat-train-CycEzpbE.js} +1 -1
  408. package/server/{uat-train-DVUNW03P.js → uat-train-IIZlz7r3.js} +0 -0
  409. package/server/{validate-Dvv83iBx.js → validate-Ur4xH5bN.js} +3 -3
  410. package/server/{validation-BdCjzWLN.js → validation-CHovCoTT.js} +1 -1
  411. package/server/{validation-DlHafKzu.js → validation-Dr6V4PXx.js} +9 -6
  412. package/server/{verification-artifact-CaSbxUVg.js → verification-artifact-D3viYe_t.js} +1 -1
  413. package/server/{verification-artifact-0Zku8N-W.js → verification-artifact-k5Ftpg0c.js} +1 -1
  414. package/server/{verification-runner-C6wdZda2.js → verification-runner-BuqGwm2t.js} +1 -1
  415. package/server/{verification-runner-DwP2fUEF.js → verification-runner-Dl13mmsI.js} +53 -27
  416. package/server/{vtt-parser-luerJpYT.js → vtt-parser-BSnAB-Og.js} +1 -1
  417. package/server/work-agent-prompt-CJJ4tXci.js +3 -0
  418. package/server/{work-agent-prompt--9AWNYwZ.js → work-agent-prompt-CioeOuM4.js} +14 -14
  419. package/server/{work-agent-start-BNQO65W7.js → work-agent-start-B65Gqn9N.js} +2 -2
  420. package/server/{work-agent-start-DkzseQFl.js → work-agent-start-Ct1HVh6z.js} +1 -1
  421. package/server/{workflows-BYwR2aIN.js → workflows-AgFul1xc.js} +114 -41
  422. package/server/workflows-CfHm8lVd.js +2 -0
  423. package/server/{workspace-B-QJa3Ps.js → workspace-Cu3XlMXt.js} +1 -1
  424. package/server/{workspace-iTnTycOB.js → workspace-Cy4sDd3q.js} +3 -3
  425. package/server/{workspace-anchor-drift-DTt6h2Em.js → workspace-anchor-drift-BI0Hz6zI.js} +1 -1
  426. package/server/{workspace-anchor-drift-CHiGg8iu.js → workspace-anchor-drift-CMaqvizr.js} +4 -4
  427. package/server/{workspace-config-D0CavVtz.js → workspace-config-DRYDO7Zr.js} +1 -1
  428. package/server/{workspace-manager-W1OnbvU5.js → workspace-manager-CgovxDrO.js} +17 -17
  429. package/server/{workspace-manager-5BKPV6SY.js → workspace-manager-jfkKAEuO.js} +1 -1
  430. package/server/{workspace-metadata-tbbevEmP.js → workspace-metadata-BDqXzGGK.js} +1 -1
  431. package/server/{workspace-metadata-dJhXvZGQ.js → workspace-metadata-BNzODIv6.js} +2 -2
  432. package/server/{workspaces-BlpbOPZ7.js → workspaces-BJdPqx_J.js} +131 -127
  433. package/sync-sources/dev-skills/pan-style-guide/SKILL.md +90 -15
  434. package/sync-sources/hooks/linear-mcp-auth-hook +6 -1
  435. package/sync-sources/rules/handoff-isolate-cwd.md +4 -4
  436. package/sync-sources/rules/pan-handoff-focus-limit.md +12 -5
  437. package/sync-sources/rules/ste-writing.md +17 -0
  438. package/sync-sources/rules/work-agents-via-pan.md +2 -1
  439. package/sync-sources/rules/writing-style.md +3 -2
  440. package/sync-sources/skills/{skill-creator → claude-skill-creator}/SKILL.md +1 -1
  441. package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/init_skill.py +1 -1
  442. package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/package_skill.py +1 -1
  443. package/sync-sources/skills/pan-gauntlet-loop/SKILL.md +182 -0
  444. package/sync-sources/skills/pan-gauntlet-loop/assets/PROMPT.template.md +92 -0
  445. package/sync-sources/skills/pan-gauntlet-loop/assets/REFERENCE-BAR.template.md +53 -0
  446. package/sync-sources/skills/pan-gauntlet-loop/assets/STYLE.template.md +41 -0
  447. package/sync-sources/skills/pan-gauntlet-loop/assets/gauntlet-index.html +237 -0
  448. package/sync-sources/skills/pan-gauntlet-loop/references/domains.md +106 -0
  449. package/sync-sources/skills/pan-gauntlet-loop/references/lessons.md +60 -0
  450. package/sync-sources/skills/pan-handoff/SKILL.md +13 -6
  451. package/sync-sources/skills/pan-help/SKILL.md +1 -1
  452. package/sync-sources/skills/pan-peer-review/SKILL.md +3 -3
  453. package/sync-sources/skills/pan-restart/SKILL.md +6 -3
  454. package/sync-sources/skills/pan-start/SKILL.md +3 -0
  455. package/sync-sources/skills/pan-swarm/SKILL.md +32 -44
  456. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  457. package/server/activity-logger-BejO16Am.js +0 -3
  458. package/server/agent-state-DH_-Jkua.js +0 -3
  459. package/server/agents-megfmQHM.js +0 -3
  460. package/server/archive-planning-C-H9cM_J.js +0 -2
  461. package/server/build-info-PQlh_Rhb.js +0 -2
  462. package/server/cli-TaZspPHS.js +0 -2
  463. package/server/cliproxy-36ncAXlu.js +0 -3
  464. package/server/context-layers-CF6zHws4.js +0 -4
  465. package/server/conversations-AnGJ5rtX.js +0 -3
  466. package/server/deacon-BEH-IY0v.js +0 -5
  467. package/server/deacon-swarm-BHX-kR1b.js +0 -2
  468. package/server/deacon-swarm-BiLfNm_v.js +0 -1522
  469. package/server/dead-end-trip-BWpDg1Qd.js +0 -2
  470. package/server/delivery-cJM6zRjJ.js +0 -3
  471. package/server/deploy-queue-CmVBZEja.js +0 -2
  472. package/server/dist-VKBfkdi7.js +0 -3
  473. package/server/durable-review-pipeline-DgcVCYDL.js +0 -3
  474. package/server/factory-D4V2wd_V.js +0 -717
  475. package/server/forge-CrP1L3i6.js +0 -2
  476. package/server/hume-1ubD_6O7.js +0 -3
  477. package/server/inspect-agent-CfxERkNt.js +0 -2
  478. package/server/merge-ops-DtHx17Vd.js +0 -2
  479. package/server/merge-rebase-BvB4UuNS.js +0 -2
  480. package/server/project-repos-BJiShUsN.js +0 -3
  481. package/server/providers-CStNGwze.js +0 -3
  482. package/server/public/assets/index-BFEwfmqX.js +0 -860
  483. package/server/public/assets/index-_USwyTAT.css +0 -1
  484. package/server/public/assets/mermaid-GHXKKRXX-Dsln95SK.js +0 -1
  485. package/server/pull-requests-C1Cqp2yo.js +0 -2
  486. package/server/rally-CjayjUIl.js +0 -3
  487. package/server/resume-D7JuMCRQ.js +0 -3
  488. package/server/review-agent-BUNTVJK2.js +0 -2
  489. package/server/settings-DBWB1gsG.js +0 -2
  490. package/server/specialists-D8gsOCwh.js +0 -3
  491. package/server/specs-BqkrRnU9.js +0 -3
  492. package/server/stuck-remediation-Di5JYkoo.js +0 -1164
  493. package/server/stuck-remediation-TNM1VhZb.js +0 -2
  494. package/server/supervisor-DX8VsPnb.js +0 -2
  495. package/server/tmux-CqNapnrr.js +0 -4
  496. package/server/token-util-Bu8bPF9f.js +0 -3
  497. package/server/workflows-Cf4LAnhg.js +0 -2
@@ -1,52 +1,54 @@
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, E as init_tier_table, Ft as isOverdeckWorkspaceRuntimePath, Gt as shouldCommitLegacyWorkspaceArtifacts, Hi as resolveOhmypiExtensionPath, Ht as init_state_read_home, Kn as extractPrefixSync, Li as getOverdeckHome, Mt as init_state_plane, Nt as isGeneratedGitHookPath, O as resolveTieredExecutionEnabled, Oi as claudeSessionTranscriptExists, On as resolveProjectFromIssueSync, Or as resolveModel, Ri as init_paths, Rt as parsePorcelainStatusPaths, Vi as packageRoot, 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 encodeClaudeProjectDir, 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 } from "./config-yaml-D9nfpEx1.js";
3
+ import { c as getDashboardLoopbackApiUrlSync, p as init_config } from "./config-ZGjvuR6J.js";
4
+ import { l as init_activity_logger, o as emitActivityEntrySync, r as emitActivityEntryDurable } from "./activity-logger-BWZhVphb.js";
5
+ import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CHIvOb9q.js";
6
+ import { $ as init_pane_choice_menu, C as init_tmux, E as killSession, G as setOption, H as sendRawKeystroke, 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-DWEc4Ld9.js";
7
+ import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-gxv97jsQ.js";
8
+ import { a as init_event_store, n as getEventStore } from "./event-store-BCSgMubf.js";
9
+ import { N as normalizeChannelReplyPayload, T as DomainEvent, n as COMPOSER_COMMAND_MANIFEST, s as getHarnessBehavior, t as init_src } from "./src-CY2Wl8IX.js";
10
+ import { f as init_agent_state_sync, h as stateToOverdeckParamsForDb, u as AGENT_COLUMNS_FOR_DB } from "./pipeline-agent-reader-D-6okryb.js";
11
+ import { c as ReadModelService, d as getClosedIssueIdsForReadSource, i as EventStoreService, t as IssueLifecycle } from "./issue-lifecycle-D9nLErvS.js";
12
+ import { c as init_agents, g as logAgentLifecycleSync, h as init_persistent_logger, m as isTerminalIssueStage, p as getIssueStageSync } from "./agents-jXgqpHca.js";
13
+ import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-e_OEYZEe.js";
14
+ import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-CiIwxH1D.js";
15
+ 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-BJhGIJZe.js";
16
+ import { t as init_behavior } from "./behavior-BiCQzqyT.js";
17
+ import { i as performHandoff, o as getAgentHealth, r as checkAllTriggers, t as getCloisterService } from "./service-CEp-3iow.js";
18
+ import { a as init_feature_registry_population, o as recordFeatureRegistryLifecycle } from "./post-merge-state-DC2_0t12.js";
19
+ import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-DoVzb4b7.js";
20
+ 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-C75EFFjf.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-Dc4mtM-B.js";
22
+ import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-Bc5kjX1q.js";
23
+ import { A as piGlobalContextFile, D as init_layers, L as workspaceContextFile } from "./assemble-CyvEBmmq.js";
24
+ import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-tMmgJfC1.js";
25
+ import { c as init_stack_health, o as getWorkspaceStackHealth } from "./stack-health-BQFSJc0l.js";
26
+ import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-pLpbsNto.js";
27
+ import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-0NOEzomy.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-DKrWd3gX.js";
29
+ import { a as getDispatchableItems, c as init_dag } from "./dag-BPc74hwj.js";
30
+ import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-DusNpVEe.js";
31
+ import { a as loadCloisterConfigSync, r as init_config$1 } from "./config-Doq_tF-f.js";
32
+ import { a as init_state_home, c as isStateMigrated } from "./state-home-DdG8erBI.js";
33
+ import { d as resolveWorkspaceRepoRootsSync, i as init_project_repos, s as resolvePrimaryWorkspaceRepoDirSync } from "./project-repos--QeCg7yQ.js";
34
+ import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-6WL46dsB.js";
35
+ import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-CJzPhSHv.js";
36
+ import { i as issue_service_singleton_exports, n as init_issue_service_singleton } from "./issue-service-singleton-B2xy-IS9.js";
37
+ import { d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, w as setReviewStatusSync } from "./review-status-yOGD2MuK.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-tQCIbBVZ.js";
39
+ import { i as resolveAgentHarness, l as resolvePiSessionPath, n as readLauncherPinnedSessionId, o as resolveCodexRolloutPath, r as resolveAcpTranscriptPath, t as init_jsonl_resolver } from "./jsonl-resolver-07OS3qOr.js";
40
+ import { G as liveOrderIssueLookup, H as getBook, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-CjW2L7BS.js";
41
+ import { t as resolveAgentGitInfo } from "./git-info-BSrI9owC.js";
42
+ import { d as getResourceConfig, n as classifyMemoryPressure, p as getSystemHealthSnapshot } from "./memory-governor-Cqvbusr4.js";
43
+ import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-CgovxDrO.js";
44
+ import "./deacon-B24dNzr8.js";
45
+ import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-DqxVCZ1k.js";
46
+ import { i as getRuntimeForAgent } from "./agent-idle-ONBssBN_.js";
47
+ import { t as recordReviewVerdict } from "./review-verdict-writer-Ca2V7QSY.js";
48
+ import { r as REVIEW_SUB_ROLES } from "./review-convoy-liveness-DmO8dIBH.js";
49
+ import { t as createInFlightGuard } from "./in-flight-guard-DuxabAHT.js";
50
+ import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-BNzODIv6.js";
51
+ import { t as resolveReviewParentRunState } from "./review-run-recovery-Ct0q7FkE.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
54
  import { homedir, networkInterfaces } from "node:os";
@@ -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-BVtASiOF.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-bFDaD5YN.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;
@@ -3636,9 +3179,7 @@ function getPtySupervisorSocketPath(agentId) {
3636
3179
  * an operator hunting the memory governor instead (PAN-3172).
3637
3180
  */
3638
3181
  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);
3182
+ 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
3183
  if (chosen.length === 0) return null;
3643
3184
  return chosen.join(" | ").slice(0, 500);
3644
3185
  }
@@ -3652,7 +3193,16 @@ async function waitForPtySupervisorSocket(agentId, timeoutMs = PTY_SUPERVISOR_SO
3652
3193
  await new Promise((r) => setTimeout(r, 250));
3653
3194
  }
3654
3195
  const failure = extractSupervisorFailure(await capturePaneText(agentId, 40));
3655
- throw new Error(`Timed out waiting for PTY supervisor socket ${socketPath}` + (failure ? ` — supervisor output: ${failure}` : ""));
3196
+ 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";
3197
+ throw new Error(`Timed out waiting for PTY supervisor socket ${socketPath} — ${detail}`);
3198
+ }
3199
+ async function waitForPtySupervisorOrFallback(agentId, timeoutMs = PTY_SUPERVISOR_SOCKET_WAIT_MS, sessionAlive = tmuxSessionExists) {
3200
+ try {
3201
+ await waitForPtySupervisorSocket(agentId, timeoutMs);
3202
+ } catch (error) {
3203
+ if (!await sessionAlive(agentId)) throw error;
3204
+ console.warn(`[conversations] PTY supervisor socket unavailable for ${agentId}; continuing with fallback delivery: ${error instanceof Error ? error.message : String(error)}`);
3205
+ }
3656
3206
  }
3657
3207
  async function extractModelFromSessionFile(sessionFile) {
3658
3208
  try {
@@ -3813,7 +3363,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3813
3363
  const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
3814
3364
  const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
3815
3365
  const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
3816
- const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-icapA4om.js");
3366
+ const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-DZhFfcWu.js");
3817
3367
  initCodexHome(codexHome, {
3818
3368
  trustedDir: cwd,
3819
3369
  approvalPolicy: codexApprovalPolicy,
@@ -3833,7 +3383,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3833
3383
  if (resume) {
3834
3384
  const pinnedId = await readFile(join(getOverdeckHome(), "agents", tmuxSession, "kimi-session-id"), "utf-8").then((value) => value.trim() || void 0).catch(() => void 0);
3835
3385
  if (pinnedId) {
3836
- const { kimiSessionsRoot } = await import("./kimi-code-DoMoGqIu.js");
3386
+ const { kimiSessionsRoot } = await import("./kimi-code-vtXl2DR5.js");
3837
3387
  if (await stat(join(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd), pinnedId, "agents", "main", "wire.jsonl")).then(() => true, () => false)) kimiResumeSessionId = pinnedId;
3838
3388
  }
3839
3389
  }
@@ -3866,7 +3416,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3866
3416
  const launchTmuxAndCaptureSession = async () => {
3867
3417
  let kimiExistingSessionsBefore;
3868
3418
  if (kimiCodeFields && !kimiCodeFields.resumeSessionId) try {
3869
- const { kimiSessionsRoot } = await import("./kimi-code-DoMoGqIu.js");
3419
+ const { kimiSessionsRoot } = await import("./kimi-code-vtXl2DR5.js");
3870
3420
  kimiExistingSessionsBefore = new Set(await readdir(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd)));
3871
3421
  } catch {
3872
3422
  kimiExistingSessionsBefore = /* @__PURE__ */ new Set();
@@ -3905,7 +3455,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3905
3455
  } catch {}
3906
3456
  console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
3907
3457
  try {
3908
- const { preTrustDirectory } = await import("./workspace-manager-5BKPV6SY.js");
3458
+ const { preTrustDirectory } = await import("./workspace-manager-jfkKAEuO.js");
3909
3459
  preTrustDirectory(cwd);
3910
3460
  } catch {}
3911
3461
  try {
@@ -3917,12 +3467,12 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3917
3467
  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
3468
  throw err;
3919
3469
  }
3920
- if (useSupervisor) await waitForPtySupervisorSocket(tmuxSession);
3470
+ if (useSupervisor) await waitForPtySupervisorOrFallback(tmuxSession);
3921
3471
  if (behavior.usesCodexHome && codexFields?.codexHome && codexTransport === "tui") {
3922
3472
  const codexHomeDir = codexFields.codexHome;
3923
3473
  (async () => {
3924
3474
  try {
3925
- const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-icapA4om.js");
3475
+ const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-DZhFfcWu.js");
3926
3476
  const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
3927
3477
  if (rollout) {
3928
3478
  const threadId = extractThreadIdFromRollout(rollout);
@@ -3932,14 +3482,14 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3932
3482
  })();
3933
3483
  }
3934
3484
  if (kimiCodeFields && kimiExistingSessionsBefore) {
3935
- const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-DoMoGqIu.js");
3485
+ const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-vtXl2DR5.js");
3936
3486
  const sessionId = await waitForNewKimiSessionAsync(join(homedir(), ".kimi-code"), cwd, kimiExistingSessionsBefore);
3937
3487
  if (!sessionId) throw new Error(`kimi-code session capture timed out for ${tmuxSession} — no new session directory appeared under the workspace bucket`);
3938
3488
  writeKimiSessionId(tmuxSession, sessionId);
3939
3489
  }
3940
3490
  };
3941
3491
  if (kimiCodeFields) {
3942
- const { withKimiSessionCaptureLock } = await import("./kimi-code-DoMoGqIu.js");
3492
+ const { withKimiSessionCaptureLock } = await import("./kimi-code-vtXl2DR5.js");
3943
3493
  await withKimiSessionCaptureLock(join(homedir(), ".kimi-code"), cwd, launchTmuxAndCaptureSession);
3944
3494
  } else await launchTmuxAndCaptureSession();
3945
3495
  if (channelsBridgeMcpConfig) dismissDevChannelsDialog(tmuxSession).catch((err) => {
@@ -4076,6 +3626,16 @@ async function handleConversationStop(name, deps) {
4076
3626
  return jsonResponse({ error: "Internal server error" }, { status: 500 });
4077
3627
  }
4078
3628
  }
3629
+ async function handleConversationClearForkState(name, deps = {}) {
3630
+ const conv = getConversationByName(name);
3631
+ if (!conv) return jsonResponse({ error: "Conversation not found" }, { status: 404 });
3632
+ if (!await (deps.sessionExists ?? tmuxSessionExists)(conv.tmuxSession)) return jsonResponse({ error: "Cannot clear failure state while the tmux session is not alive" }, { status: 409 });
3633
+ (deps.clearFailureState ?? clearConversationFailureState)(name);
3634
+ return jsonResponse({
3635
+ ...getConversationByName(name) ?? conv,
3636
+ sessionAlive: true
3637
+ });
3638
+ }
4079
3639
  async function handleConversationResume(name, body, deps) {
4080
3640
  try {
4081
3641
  const conv = getConversationByName(name);
@@ -4091,8 +3651,7 @@ async function handleConversationResume(name, body, deps) {
4091
3651
  reattached: true
4092
3652
  });
4093
3653
  }
4094
- const oldSessionId = conv.claudeSessionId;
4095
- const resumeCause = conv.status === "ended" ? "operator" : "system";
3654
+ const oldSessionId = conv.claudeSessionId, resumeCause = conv.status === "ended" ? "operator" : "system", sendResumeContract = body["sendResumeContract"] !== false;
4096
3655
  const harness = conv.harness ?? "claude-code";
4097
3656
  const modelChanged = !!model && model !== conv.model;
4098
3657
  if (!await validateCwdContainment(conv.cwd)) return jsonResponse({ error: "Invalid cwd" }, { status: 400 });
@@ -4111,7 +3670,7 @@ async function handleConversationResume(name, body, deps) {
4111
3670
  await spawnConversationSession(conv.tmuxSession, conv.cwd, oldSessionId ?? randomUUID$1(), model, effort, conv.issueId ?? void 0, canResume, harness);
4112
3671
  await waitForTmuxSession(conv.tmuxSession);
4113
3672
  await waitForConversationRuntimeReady(conv.tmuxSession, harness, "respawn");
4114
- await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv));
3673
+ await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv), sendResumeContract);
4115
3674
  markConversationActive(name);
4116
3675
  return jsonResponse({
4117
3676
  ...conv,
@@ -4594,101 +4153,6 @@ function asRecord(value) {
4594
4153
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
4595
4154
  }
4596
4155
  //#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
4156
  //#region ../../lib/channels/permission-payload.ts
4693
4157
  const CHANNEL_PERMISSION_LIMITS = {
4694
4158
  requestIdBytes: 128,
@@ -4983,7 +4447,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
4983
4447
  error: "missing agent id"
4984
4448
  }, { status: 400 });
4985
4449
  const request = yield* HttpServerRequest.HttpServerRequest;
4986
- const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-B-z-sGBH.js"));
4450
+ const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-BOtIRJU7.js"));
4987
4451
  const expected = getInternalTokenSync();
4988
4452
  if (!expected) return jsonResponse({
4989
4453
  ok: false,
@@ -5280,7 +4744,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
5280
4744
  const request = yield* HttpServerRequest.HttpServerRequest;
5281
4745
  const urlOpt = HttpServerRequest.toURL(request);
5282
4746
  const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
5283
- const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-jMfxrElt.js"));
4747
+ const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-BYDZ9n2i.js"));
5284
4748
  const endTime = /* @__PURE__ */ new Date();
5285
4749
  const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
5286
4750
  const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
@@ -5295,7 +4759,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
5295
4759
  return Effect.gen(function* () {
5296
4760
  let eventBody = body;
5297
4761
  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"));
4762
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CzHfoqKQ.js"));
5299
4763
  const snapshot = yield* (yield* AgentStateService).get(id);
5300
4764
  eventBody = {
5301
4765
  ...body,
@@ -5330,7 +4794,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
5330
4794
  detail: String(decoded.failure)
5331
4795
  }, { status: 400 })
5332
4796
  };
5333
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-keg-x1bT.js"));
4797
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CzHfoqKQ.js"));
5334
4798
  yield* (yield* AgentStateService).emit(decoded.success);
5335
4799
  return {
5336
4800
  ok: true,
@@ -5411,13 +4875,13 @@ const postAgentPlanChecklistRoute = HttpRouter.add("POST", "/api/agents/:id/plan
5411
4875
  const auth = yield* Effect.promise(() => validateAgentRuntimeEventAuth(request));
5412
4876
  if (!auth.ok) return auth.response;
5413
4877
  const id = (yield* HttpRouter.params)["id"] ?? "";
5414
- const { getAgentState } = yield* Effect.promise(() => import("./agents-megfmQHM.js"));
4878
+ const { getAgentState } = yield* Effect.promise(() => import("./agents-DpCuoF65.js"));
5415
4879
  const state = yield* getAgentState(id);
5416
4880
  if (!state?.workspace || !state.issueId) return jsonResponse({
5417
4881
  success: false,
5418
4882
  error: "agent has no resolvable workspace or issue id"
5419
4883
  }, { status: 422 });
5420
- const { checkIncompletePlanItemsPromise } = yield* Effect.promise(() => import("./done-preflight-CksRvh49.js"));
4884
+ const { checkIncompletePlanItemsPromise } = yield* Effect.promise(() => import("./done-preflight-BDVdWed5.js"));
5421
4885
  const incomplete = yield* Effect.promise(() => checkIncompletePlanItemsPromise(state.workspace, state.issueId));
5422
4886
  return jsonResponse({
5423
4887
  success: true,
@@ -5431,7 +4895,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
5431
4895
  success: false,
5432
4896
  error: "missing agent id"
5433
4897
  }, { status: 400 });
5434
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-keg-x1bT.js"));
4898
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-CzHfoqKQ.js"));
5435
4899
  const snapshot = yield* (yield* AgentStateService).get(id);
5436
4900
  if (!snapshot) return jsonResponse({
5437
4901
  success: false,
@@ -5459,7 +4923,6 @@ init_workspace_manager();
5459
4923
  */
5460
4924
  init_event_store();
5461
4925
  init_agents$1();
5462
- init_persistent_logger();
5463
4926
  function prepareAgentStateForSave(state) {
5464
4927
  if (state.status === "running" || state.status === "starting") delete state.stoppedAt;
5465
4928
  else if (state.status === "stopped" && !state.stoppedAt) state.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -5623,8 +5086,8 @@ function createAgentStopHandler(lifecycleEvent) {
5623
5086
  yield* stopAgent(id, "operator");
5624
5087
  if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
5625
5088
  try {
5626
- const { resolveProjectFromIssueSync } = await import("./projects-DvPEAP18.js");
5627
- const { findWorkspacePath } = await import("./archive-planning-C-H9cM_J.js");
5089
+ const { resolveProjectFromIssueSync } = await import("./projects-LftaVK99.js");
5090
+ const { findWorkspacePath } = await import("./archive-planning-BW4MKNI7.js");
5628
5091
  const issueLower = stateBeforeStop.issueId.toLowerCase();
5629
5092
  const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
5630
5093
  if (workspacePath) {
@@ -5764,7 +5227,7 @@ const postAgentUnpauseRoute = HttpRouter.add("POST", "/api/agents/:id/unpause",
5764
5227
  if ((yield* getWorkAgentLifecycleState(id)).canResumeSession && updatedState.troubled !== true) {
5765
5228
  resumeTriggered = true;
5766
5229
  yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.unpause_immediate_resume_triggered"));
5767
- import("./resume-D7JuMCRQ.js").then(({ resumeAgent }) => resumeAgent(id)).then((result) => {
5230
+ import("./resume-DvHuF-bm.js").then(({ resumeAgent }) => resumeAgent(id)).then((result) => {
5768
5231
  if (!result.success) console.warn(`[agents] immediate resume after unpause failed for ${id}: ${result.error}`);
5769
5232
  }).catch((err) => console.warn(`[agents] immediate resume after unpause errored for ${id}:`, err));
5770
5233
  }
@@ -7177,15 +6640,15 @@ async function requestWorkStartAfterContainers(input) {
7177
6640
  function handleRemoteAgentSpawn(input) {
7178
6641
  return Effect.gen(function* () {
7179
6642
  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"));
6643
+ const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-BVtASiOF.js"));
6644
+ const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-BUEeUic6.js"));
6645
+ const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-CH1AqqIQ.js"));
7183
6646
  const panConfig = loadPanConfig();
7184
6647
  const spendCap = checkRemoteSpendCap(panConfig);
7185
6648
  if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
7186
6649
  const fly = createFlyProviderFromConfig(panConfig.remote);
7187
6650
  yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
7188
- const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt--9AWNYwZ.js"));
6651
+ const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-CJJ4tXci.js"));
7189
6652
  const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
7190
6653
  const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
7191
6654
  issueId,
@@ -7919,7 +7382,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
7919
7382
  console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
7920
7383
  }
7921
7384
  try {
7922
- const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-By-wp6pg.js");
7385
+ const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-Ug18Cp4V.js");
7923
7386
  await appendSessionEntry(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId, {
7924
7387
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
7925
7388
  reason: "start",
@@ -8367,14 +7830,14 @@ function firePostMergeLifecycle(issueId, options) {
8367
7830
  const normalizedIssueId = parsedIssueId.normalized.toUpperCase();
8368
7831
  const started = postMergeGuard.run(normalizedIssueId, async () => {
8369
7832
  const projectPath = getProjectPathForIssue(parsedIssueId.prefix);
8370
- const { postMergeLifecycle } = await import("./merge-agent-BRSz26Oh.js");
7833
+ const { postMergeLifecycle } = await import("./merge-agent-BuoC_PRZ.js");
8371
7834
  const lifecycleOptions = {
8372
7835
  ...options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : {},
8373
7836
  ...options?.verifiedMergedRepos?.length ? { verifiedMergedRepos: options.verifiedMergedRepos } : {}
8374
7837
  };
8375
7838
  await postMergeLifecycle(normalizedIssueId, projectPath, options?.sourceBranch, Object.keys(lifecycleOptions).length > 0 ? lifecycleOptions : void 0);
8376
7839
  console.log(`[merge] post-merge lifecycle completed for ${normalizedIssueId}`);
8377
- const { runMergeTrainReconcile } = await import("./merge-train-BOu3fN7O.js");
7840
+ const { runMergeTrainReconcile } = await import("./merge-train-iwKqjtCF.js");
8378
7841
  const outcomes = await runMergeTrainReconcile(normalizedIssueId);
8379
7842
  if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${normalizedIssueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
8380
7843
  }, (err) => console.error(`[merge] post-merge lifecycle failed for ${normalizedIssueId}:`, err));
@@ -8394,15 +7857,15 @@ init_review_status();
8394
7857
  init_io();
8395
7858
  init_tmux();
8396
7859
  const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
8397
- const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
7860
+ const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
8398
7861
  return jsonResponse({
8399
7862
  specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
8400
7863
  projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
8401
7864
  });
8402
7865
  })));
8403
7866
  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"));
7867
+ const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
7868
+ const { clearHookSync } = yield* Effect.promise(() => import("./hooks-B4wj32l2.js"));
8406
7869
  const specialists = getAllSpecialists();
8407
7870
  const results = [];
8408
7871
  for (const specialist of specialists) {
@@ -8461,7 +7924,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8461
7924
  }
8462
7925
  console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
8463
7926
  if (specialist === "merge") {
8464
- const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-CC1XJbTx.js"));
7927
+ const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-CTAjwH5j.js"));
8465
7928
  if (yield* reportSpecialistCompletion(normalizedIssueId, {
8466
7929
  status,
8467
7930
  notes
@@ -8488,7 +7951,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8488
7951
  if (project) {
8489
7952
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8490
7953
  if (existsSync(workspacePath)) {
8491
- const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-Y0zG25ez.js");
7954
+ const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-CsKV0Dis.js");
8492
7955
  reviewEvidenceHead = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
8493
7956
  }
8494
7957
  }
@@ -8537,7 +8000,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8537
8000
  if (project && failedItemId) {
8538
8001
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8539
8002
  if (existsSync(workspacePath)) {
8540
- const { onInspectComplete } = await import("./inspect-agent-CfxERkNt.js");
8003
+ const { onInspectComplete } = await import("./inspect-agent-JFEaYTRa.js");
8541
8004
  await Effect.runPromise(onInspectComplete(project.projectKey, normalizedIssueId, failedItemId, "failed", workspacePath, notes));
8542
8005
  }
8543
8006
  }
@@ -8548,7 +8011,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8548
8011
  }
8549
8012
  yield* Effect.promise(async () => {
8550
8013
  try {
8551
- const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-D8gsOCwh.js");
8014
+ const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-x-kPMhrL.js");
8552
8015
  const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
8553
8016
  const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
8554
8017
  saveAgentRuntimeState(tmuxSession, {
@@ -8567,7 +8030,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8567
8030
  });
8568
8031
  console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
8569
8032
  }
8570
- const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-GqnGSYoJ.js");
8033
+ const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-DrjrOmmn.js");
8571
8034
  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
8035
  } catch (err) {
8573
8036
  console.error(`[specialists/done] Error managing specialist state:`, err);
@@ -8579,7 +8042,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8579
8042
  if (project) {
8580
8043
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8581
8044
  if (existsSync(workspacePath)) {
8582
- const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-Y0zG25ez.js");
8045
+ const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-CsKV0Dis.js");
8583
8046
  const headAnchor = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
8584
8047
  if (headAnchor) {
8585
8048
  setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: headAnchor });
@@ -8593,7 +8056,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8593
8056
  });
8594
8057
  if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
8595
8058
  try {
8596
- const { onInspectComplete } = await import("./inspect-agent-CfxERkNt.js");
8059
+ const { onInspectComplete } = await import("./inspect-agent-JFEaYTRa.js");
8597
8060
  const project = resolveProjectFromIssueSync(normalizedIssueId);
8598
8061
  if (project) {
8599
8062
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
@@ -8609,7 +8072,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8609
8072
  if (project) {
8610
8073
  if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
8611
8074
  setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
8612
- const { initEventStore } = await import("./event-store-BgEjNsvk.js");
8075
+ const { initEventStore } = await import("./event-store-Db4w4YIY.js");
8613
8076
  await (await initEventStore()).appendAsync({
8614
8077
  type: "test.passed",
8615
8078
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -8662,8 +8125,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8662
8125
  if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
8663
8126
  try {
8664
8127
  const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
8665
- const { sessionExists } = await import("./tmux-CqNapnrr.js");
8666
- const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-megfmQHM.js");
8128
+ const { sessionExists } = await import("./tmux-B8zsqD_6.js");
8129
+ const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-DpCuoF65.js");
8667
8130
  if (await Effect.runPromise(sessionExists(workAgentId))) {
8668
8131
  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
8132
  console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
@@ -8677,7 +8140,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8677
8140
  try {
8678
8141
  const project = resolveProjectFromIssueSync(normalizedIssueId);
8679
8142
  const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
8680
- const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-DqXTuJk8.js");
8143
+ const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-Brjaxoda.js");
8681
8144
  const result = await Effect.runPromise(deliverReviewVerdictFeedback({
8682
8145
  issueId: normalizedIssueId,
8683
8146
  verdict: status === "failed" ? "failed" : "blocked",
@@ -8697,7 +8160,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8697
8160
  if (project) {
8698
8161
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8699
8162
  if (existsSync(workspacePath)) {
8700
- const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-Y0zG25ez.js");
8163
+ const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-CsKV0Dis.js");
8701
8164
  const reviewedAtCommit = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
8702
8165
  if (reviewedAtCommit) {
8703
8166
  setReviewStatusSync(normalizedIssueId, { reviewedAtCommit });
@@ -8737,7 +8200,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8737
8200
  });
8738
8201
  })));
8739
8202
  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"));
8203
+ const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
8741
8204
  const results = cleanupAllLogsSync();
8742
8205
  return jsonResponse({
8743
8206
  success: true,
@@ -8747,7 +8210,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
8747
8210
  });
8748
8211
  })));
8749
8212
  const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
8750
- const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8213
+ const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
8751
8214
  return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
8752
8215
  })));
8753
8216
  const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
@@ -8791,7 +8254,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
8791
8254
  "blocked",
8792
8255
  "failed"
8793
8256
  ].includes(status)) {
8794
- const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-D8gsOCwh.js"));
8257
+ const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
8795
8258
  saveAgentRuntimeState(getTmuxSessionName(name), {
8796
8259
  state: "idle",
8797
8260
  lastActivity: (/* @__PURE__ */ new Date()).toISOString()
@@ -8913,7 +8376,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
8913
8376
  const issueId = params["issueId"];
8914
8377
  const type = params["type"];
8915
8378
  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"));
8379
+ const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
8917
8380
  const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
8918
8381
  yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
8919
8382
  saveAgentRuntimeState(tmuxSession, {
@@ -8940,7 +8403,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
8940
8403
  if (limitParam) limit = parseInt(limitParam, 10);
8941
8404
  if (offsetParam) offset = parseInt(offsetParam, 10);
8942
8405
  }
8943
- const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-5OTnrV91.js"));
8406
+ const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
8944
8407
  return jsonResponse(listRunLogsSync(project, type, {
8945
8408
  limit,
8946
8409
  offset
@@ -8951,7 +8414,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
8951
8414
  const project = params["project"];
8952
8415
  const type = params["type"];
8953
8416
  const runId = params["runId"];
8954
- const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-5OTnrV91.js"));
8417
+ const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
8955
8418
  const logPath = getRunLogPath(project, type, runId);
8956
8419
  if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
8957
8420
  const encoder = new TextEncoder();
@@ -9010,7 +8473,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
9010
8473
  const project = params["project"];
9011
8474
  const type = params["type"];
9012
8475
  const runId = params["runId"];
9013
- const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-5OTnrV91.js"));
8476
+ const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
9014
8477
  const content = getRunLogSync(project, type, runId);
9015
8478
  if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
9016
8479
  return jsonResponse({
@@ -9024,7 +8487,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
9024
8487
  const project = params["project"];
9025
8488
  const type = params["type"];
9026
8489
  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"));
8490
+ const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
9028
8491
  yield* Effect.promise(() => terminateSpecialist(project, type));
9029
8492
  return jsonResponse({
9030
8493
  success: true,
@@ -9036,7 +8499,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
9036
8499
  const project = params["project"];
9037
8500
  const type = params["type"];
9038
8501
  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"));
8502
+ const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
9040
8503
  if (pauseGracePeriod(project, type)) return jsonResponse({
9041
8504
  success: true,
9042
8505
  message: "Grace period paused"
@@ -9048,7 +8511,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
9048
8511
  const project = params["project"];
9049
8512
  const type = params["type"];
9050
8513
  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"));
8514
+ const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
9052
8515
  if (resumeGracePeriod(project, type)) return jsonResponse({
9053
8516
  success: true,
9054
8517
  message: "Grace period resumed"
@@ -9060,7 +8523,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
9060
8523
  const project = params["project"];
9061
8524
  const type = params["type"];
9062
8525
  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"));
8526
+ const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
9064
8527
  exitGracePeriod(project, type);
9065
8528
  return jsonResponse({
9066
8529
  success: true,
@@ -9072,7 +8535,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
9072
8535
  const project = params["project"];
9073
8536
  const type = params["type"];
9074
8537
  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"));
8538
+ const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
9076
8539
  const state = getGracePeriodState(project, type);
9077
8540
  if (state) return jsonResponse(state);
9078
8541
  else return jsonResponse({ error: "No active grace period" }, { status: 404 });
@@ -9081,7 +8544,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
9081
8544
  const params = yield* HttpRouter.params;
9082
8545
  const project = params["project"];
9083
8546
  const type = params["type"];
9084
- const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-cHwpcXSh.js"));
8547
+ const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-CKasRfYu.js"));
9085
8548
  const digest = loadContextDigest(project, type);
9086
8549
  if (digest) return jsonResponse({ digest });
9087
8550
  else return jsonResponse({ error: "No context digest found" }, { status: 404 });
@@ -9090,7 +8553,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
9090
8553
  const params = yield* HttpRouter.params;
9091
8554
  const project = params["project"];
9092
8555
  const type = params["type"];
9093
- const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-cHwpcXSh.js"));
8556
+ const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-CKasRfYu.js"));
9094
8557
  const digest = yield* regenerateContextDigest(project, type);
9095
8558
  if (digest) return jsonResponse({
9096
8559
  digest,
@@ -9109,7 +8572,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
9109
8572
  "blocked"
9110
8573
  ].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
9111
8574
  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"));
8575
+ const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
9113
8576
  signalSpecialistCompletion(project, type, {
9114
8577
  status,
9115
8578
  notes
@@ -9143,8 +8606,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
9143
8606
  const params = yield* HttpRouter.params;
9144
8607
  const project = params["project"];
9145
8608
  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"));
8609
+ const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-Du6quZ0_.js"));
8610
+ const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-LftaVK99.js"));
9148
8611
  const retention = getSpecialistRetention(project);
9149
8612
  const deleted = cleanupOldLogsSync(project, type, {
9150
8613
  maxDays: retention.max_days,
@@ -9165,7 +8628,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
9165
8628
  const project = params["project"];
9166
8629
  const issueId = params["issueId"];
9167
8630
  const { model, harness } = yield* readJsonBody;
9168
- const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-BUNTVJK2.js"));
8631
+ const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-DgkUPRx0.js"));
9169
8632
  const killResult = yield* killAllReviewerSessions(project, issueId);
9170
8633
  const projectConfig = resolveProjectFromIssueSync(issueId);
9171
8634
  if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
@@ -9181,7 +8644,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
9181
8644
  }));
9182
8645
  branch = stdout.trim() || primaryRepo.sourceBranch;
9183
8646
  } catch {}
9184
- const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-BUNTVJK2.js"));
8647
+ const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-DgkUPRx0.js"));
9185
8648
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
9186
8649
  const result = yield* spawnReviewRoleForIssue({
9187
8650
  issueId,
@@ -9225,7 +8688,7 @@ const postProjectReviewerRoleRestartRoute = HttpRouter.add("POST", "/api/special
9225
8688
  const { model } = yield* readJsonBody;
9226
8689
  const reviewer = getAgentStateSync(reviewerId);
9227
8690
  yield* Effect.promise(() => Effect.runPromise(killSession(reviewerId)).catch(() => void 0));
9228
- const { spawnReviewSubRoleForIssue } = yield* Effect.promise(() => import("./review-agent-BUNTVJK2.js"));
8691
+ const { spawnReviewSubRoleForIssue } = yield* Effect.promise(() => import("./review-agent-DgkUPRx0.js"));
9229
8692
  const result = yield* spawnReviewSubRoleForIssue({
9230
8693
  issueId,
9231
8694
  workspace: parent.workspace,
@@ -9353,6 +8816,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
9353
8816
  */
9354
8817
  const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
9355
8818
  //#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 };
8819
+ export { ComposerCommandParseError as $, isInsideGitWorkTree as A, cleanupConversationAttachments as B, handleConversationClearForkState as C, jsonResponse as Ct, handleConversationResume as D, handleConversationRestartAll as E, startConversationModelBackfill as F, getConversationAttachmentsRoot as G, cleanupUnreferencedConversationAttachments as H, stopConversationRuntime as I, removeConversationAttachment as J, hasConversationAttachment as K, tmuxSessionExists as L, resolveRegisteredProject as M, shouldReportUnresolvedLiveSession as N, handleConversationStop as O, spawnConversationSession as P, resolvePolicy as Q, waitForPiTuiReady as R, conversationSessionAliveFromState as S, getDefaultCwd as St, handleConversationDelete as T, ensureConversationAttachmentDir as U, cleanupOrphanedConversationAttachments as V, extractConversationAttachmentPaths as W, composerCommandResultHttpStatus as X, runInBatches as Y, handleComposerCommandMessage as Z, isPiControlChannelHarness as _, getHeaderFromMap as _t, agentsRouteLayer as a, resolveRequestedStartedBy as at, validateConversationControlAckOrigin as b, validateOriginHeaders as bt, codexConversationPendingInput as c, spawnPanCli as ct, handleConversationCodexApproval as d, hasDashboardInternalToken as dt, ComposerCommandConfirmationError as et, handleConversationCompact as f, rejectUnauthorizedDashboardRequest as ft, handleConversationThinkingLevel as g, waitForSessionRespawn as gt, handleConversationPlanAction as h, isRespawnPending as ht, validateSpecialistAutoCompleteMetadata as i, isInternalAgentRequest as it, resolveAllowedHarness as j, handleConversationSwitchModel as k, deliverConversationViaControlChannel as l, dashboardCsrfToken as lt, handleConversationDeliveryMethod as m, rejectUnsafeDashboardMutationRequest as mt, _serverManagedMerges as n, evaluateSpawnGuardrails as nt, saveAgentStateAndEmitEvent as o, getWorkAgentLifecycleStateSync as ot, handleConversationControlAck as p, rejectUnauthorizedDashboardSessionMintRequest as pt, isManagedConversationAttachmentPath as q, firePostMergeLifecycle as r, invalidateAgentsCache as rt, saveAgentStateAndEmitEventProgram as s, panCliInvocation as st, specialistsRouteLayer as t, composerCommandConfirmationFromBody as tt, handleConversationAbort as u, dashboardSessionCookieHeader as ut, pickDeliverAs as v, isTrustedOriginForHost as vt, handleConversationCreate as w, jsonStringResponse as wt, conversationNeedsRunningRepair as x, httpHandler as xt, resolveConversationDeliveryMethod as y, validateOrigin as yt, waitForTmuxSession as z };
9357
8820
 
9358
- //# sourceMappingURL=specialists-DocAK-7A.js.map
8821
+ //# sourceMappingURL=specialists-b0dMMjWq.js.map