@overdeck/desktop 0.49.2 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +1 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-CHtDkHEL.js → acceptance-criteria-B_maCGZv.js} +2 -2
  4. package/server/{active-dashboard-bundle-Byh6sP-q.js → active-dashboard-bundle-CCqpFWiz.js} +2 -2
  5. package/server/{activity-logger-Ck8qoluj.js → activity-logger-B0X2JJwM.js} +1 -1
  6. package/server/{activity-logger-BWZhVphb.js → activity-logger-SlTXYCVf.js} +3 -3
  7. package/server/{advancing-selfheal-65W4yUQi.js → advancing-selfheal-BJAfiY-C.js} +11 -6
  8. package/server/{agent-gc-BNUudFnt.js → agent-gc-bhikjoJ_.js} +11 -11
  9. package/server/{agent-idle-ONBssBN_.js → agent-idle-D-UQ7gDv.js} +11 -11
  10. package/server/{agent-state-CM8iVw5B.js → agent-state-BrUPf_7Z.js} +1 -1
  11. package/server/{agent-state-BJhGIJZe.js → agent-state-FABw8neJ.js} +344 -402
  12. package/server/{agent-state-service-CzHfoqKQ.js → agent-state-service-BAQApt97.js} +1 -1
  13. package/server/{agent-state-service-CiIuwzIs.js → agent-state-service-rDenYSlD.js} +5 -5
  14. package/server/{agents-DpCuoF65.js → agents-DixZjXWm.js} +1 -1
  15. package/server/{agents-jXgqpHca.js → agents-DzpQidT8.js} +4 -4
  16. package/server/{archive-planning-CGkU6UeL.js → archive-planning-BL1ABtW0.js} +5 -5
  17. package/server/archive-planning-D3gw32U9.js +2 -0
  18. package/server/{artifact-index-jobs-Ck4NRRkY.js → artifact-index-jobs-Cjdme0jS.js} +2 -2
  19. package/server/{assemble-CyvEBmmq.js → assemble-B_JgnCbG.js} +2 -2
  20. package/server/{auto-spawn-consent-Dc4mtM-B.js → auto-spawn-consent-BesWchEi.js} +7 -7
  21. package/server/{backlog-auto-trigger-CCEpr4YT.js → backlog-auto-trigger-COLq639j.js} +3 -3
  22. package/server/{behavior-BiCQzqyT.js → behavior-DCg8CIWC.js} +3 -3
  23. package/server/{bridge-pool-patrol-Ce8rNPym.js → bridge-pool-patrol-BDohuMRt.js} +2 -2
  24. package/server/{briefing-freshness-e_OEYZEe.js → briefing-freshness-ENa_hW_V.js} +2 -2
  25. package/server/build-info-Dx2qrVhb.js +2 -0
  26. package/server/{build-info-BRw4QlYO.js → build-info-WuZT6xyi.js} +3 -3
  27. package/server/{checkpoint-manager-DOwRGFff.js → checkpoint-manager-CSZ7aVQF.js} +2 -2
  28. package/server/{checkpoint-manager-CKr42Usw.js → checkpoint-manager-DXhGRvg4.js} +1 -1
  29. package/server/checkpoint-worker.js +1 -1
  30. package/server/{checkpoints-Cszp_0Np.js → checkpoints-DUkUsPVS.js} +2 -2
  31. package/server/{checkpoints-Cb6CWT4S.js → checkpoints-tm_w6Y4V.js} +1 -1
  32. package/server/{claude-hooks-provision-C5JHpxTS.js → claude-hooks-provision-CTh9zxEi.js} +1 -1
  33. package/server/{claude-hooks-provision-Cer2eFfj.js → claude-hooks-provision-fRofvhTN.js} +2 -2
  34. package/server/{claude-permissions-Bc5kjX1q.js → claude-permissions-DLrb9ovz.js} +18 -3
  35. package/server/{claude-settings-overlay-m-VVZej1.js → claude-settings-overlay-BYnXaTVc.js} +2 -2
  36. package/server/{claude-settings-overlay-C7rWsnya.js → claude-settings-overlay-CMS5Jab5.js} +1 -1
  37. package/server/cli-BflmtEFM.js +2 -0
  38. package/server/{cli-BmczsfD6.js → cli-CoQou1t_.js} +11 -11
  39. package/server/{cliproxy-BpYpkogS.js → cliproxy-DXDQcR3I.js} +2 -2
  40. package/server/{cliproxy-_yUU0HRY.js → cliproxy-DdhFpcXU.js} +1 -1
  41. package/server/{close-issue-CxvRD0UI.js → close-issue-CpQ0BWg-.js} +5 -5
  42. package/server/{closed-issue-reaper-nMLRi5de.js → closed-issue-reaper-CdcJRvUx.js} +13 -13
  43. package/server/{closed-issue-reaper-omOcUDBl.js → closed-issue-reaper-TymtZM37.js} +1 -1
  44. package/server/{codex-DZhFfcWu.js → codex-BValsmtK.js} +1 -1
  45. package/server/{codex-KaSKE-R3.js → codex-DYyZL8JD.js} +6 -6
  46. package/server/{compaction-continuation-Bjfi70G-.js → compaction-continuation-CVjbdGKt.js} +3 -3
  47. package/server/{config-CH1AqqIQ.js → config-CvKH7r7W.js} +1 -1
  48. package/server/{config-ZGjvuR6J.js → config-NxI9Yl2f.js} +2 -2
  49. package/server/{config-Doq_tF-f.js → config-_qaa1UXH.js} +2 -2
  50. package/server/{config-yaml-D9nfpEx1.js → config-yaml-D60AnTIu.js} +24 -9
  51. package/server/{conflict-gate-D4XCtrm2.js → conflict-gate-0dD1kxjN.js} +1 -1
  52. package/server/{conflict-gate-DcUTY4Gb.js → conflict-gate-hAUCL-un.js} +5 -5
  53. package/server/{context-layers-BBTKP-Y4.js → context-layers-CdpabJj0.js} +3 -3
  54. package/server/{context-layers-BGj2Y9l3.js → context-layers-Ds1MnEFI.js} +2 -2
  55. package/server/{continue-i7Revg8D.js → continue-CnvrUfxw.js} +2 -2
  56. package/server/{control-settings-BMoDHY1G.js → control-settings-Db0uXgVM.js} +308 -5
  57. package/server/{conversation-compaction-D4VOmF7p.js → conversation-compaction-B-1KETG9.js} +8 -8
  58. package/server/{conversation-compaction-DzIjYMfg.js → conversation-compaction-DzMXGRiJ.js} +1 -1
  59. package/server/{conversation-service-CzZUJFEx.js → conversation-service-BL-asWPX.js} +1 -1
  60. package/server/{conversation-service-tQCIbBVZ.js → conversation-service-BxIOd5ay.js} +21 -7
  61. package/server/{conversations-bFDaD5YN.js → conversations-CEMfwMt-.js} +1 -1
  62. package/server/{conversations-C75EFFjf.js → conversations-nS6QgYpD.js} +5 -5
  63. package/server/cost-3FyqKK56.js +838 -0
  64. package/server/{cost-BCWEkvro.js → cost-Cctc-Q9M.js} +3 -3
  65. package/server/{cost-CiIwxH1D.js → cost-DTuIRE4y.js} +2 -2
  66. package/server/{cost-sync-DOkdE_yB.js → cost-sync-DfmvLT9L.js} +3 -3
  67. package/server/{dag-BPc74hwj.js → dag-o-dUpw1L.js} +2 -2
  68. package/server/{dangerous-git-ops-By9iguTP.js → dangerous-git-ops-BOtXCFkT.js} +1 -1
  69. package/server/dashboard-db-worker.js +61 -11
  70. package/server/{deacon-B24dNzr8.js → deacon-CsisLmPt.js} +125 -165
  71. package/server/{deacon-canonical-state-CkvxRPck.js → deacon-canonical-state-DkdkQS5p.js} +2 -2
  72. package/server/{deacon-CzSZMtb-.js → deacon-e6py3jkM.js} +3 -3
  73. package/server/{deacon-event-client-BYIQBu0T.js → deacon-event-client-BCjHiGAY.js} +1 -1
  74. package/server/{deacon-event-client-Do6Z2gKl.js → deacon-event-client-CMQswEHX.js} +2 -2
  75. package/server/{deacon-nudge-log-CzM9JA9t.js → deacon-nudge-log-pcliw8Dr.js} +1 -1
  76. package/server/{deacon-pending-lifecycle-BObEdT-L.js → deacon-pending-lifecycle-BzaE76Xo.js} +3 -3
  77. package/server/deacon.js +11 -11
  78. package/server/{dead-end-trip-CnVmjnya.js → dead-end-trip-Bs3hxIn6.js} +3 -3
  79. package/server/dead-end-trip-DUbiRMtT.js +2 -0
  80. package/server/{delivery-gyce0vQ7.js → delivery-DhZGRShH.js} +1 -1
  81. package/server/{deploy-patrol-CEwwEYDM.js → deploy-patrol-B8sKkA8h.js} +8 -8
  82. package/server/deploy-queue--smqHLhe.js +2 -0
  83. package/server/{deploy-queue-r96ojDI3.js → deploy-queue-CCGWXFkp.js} +2 -2
  84. package/server/{deploy-window-D_3hhfxt.js → deploy-window-YuJewzmC.js} +4 -4
  85. package/server/{deploy-window-DeJK8mTK.js → deploy-window-hgsvZ3UZ.js} +1 -1
  86. package/server/{dev-supervisor-DZWwpENk.js → dev-supervisor-4SBloJHV.js} +2 -2
  87. package/server/{devcontainer-renderer-d-9dCV_2.js → devcontainer-renderer-BiJhwFNi.js} +3 -3
  88. package/server/{dist-DsLAsFSh.js → dist-CoR2sivG.js} +1 -1
  89. package/server/dist-FHv1s5ez.js +3 -0
  90. package/server/{docker-B2mUBzGk.js → docker-CWO7dcIP.js} +3 -3
  91. package/server/{docker-CRPHBylA.js → docker-DQzyMXkd.js} +1 -1
  92. package/server/{dod-DWtilRLx.js → dod-BAk5arLF.js} +1 -1
  93. package/server/{done-preflight-BDVdWed5.js → done-preflight-CGFA0M1b.js} +1 -1
  94. package/server/{done-preflight-D4ukUf-S.js → done-preflight-Cx9JGznT.js} +5 -5
  95. package/server/{durable-review-pipeline-CaCbEJSt.js → durable-review-pipeline-BOEZ0chh.js} +1 -1
  96. package/server/{durable-review-pipeline-B3OS2_He.js → durable-review-pipeline-Djx_lvFd.js} +1 -1
  97. package/server/{ensure-devcontainer-rGSh0JHK.js → ensure-devcontainer-Dk6ZMOUC.js} +1 -1
  98. package/server/{ensure-devcontainer-BUeBRjmm.js → ensure-devcontainer-DzYBBwnM.js} +4 -4
  99. package/server/{esm-shims-oAaKIa-a.js → esm-shims-deFq5Hhl.js} +1 -1
  100. package/server/{event-store-Db4w4YIY.js → event-store-C50Qt-f1.js} +1 -1
  101. package/server/{event-store-BCSgMubf.js → event-store-DTns2XZP.js} +5 -5
  102. package/server/{event-store-provider-DlSQND3V.js → event-store-provider-Bu1Qrg6v.js} +1 -1
  103. package/server/{events-B6zioJA_.js → events-B6xW8Cpm.js} +3 -3
  104. package/server/{factory-BrdqXBeK.js → factory-CWVKwKFE.js} +4 -4
  105. package/server/{feature-registry-storage-zh3ZXW6f.js → feature-registry-storage-vaxRN3WO.js} +2 -2
  106. package/server/{features-BGntOWdy.js → features-DXWwktJB.js} +2 -2
  107. package/server/{feedback-stuck-retirement-DpA5u1kt.js → feedback-stuck-retirement-CXAYe2rU.js} +2 -2
  108. package/server/{feedback-target-Ddqk93NF.js → feedback-target-DSVpi0gT.js} +1 -1
  109. package/server/{feedback-target-D7GxdUYG.js → feedback-target-yPD_wclF.js} +10 -10
  110. package/server/{feedback-writer-CH2846DP.js → feedback-writer-BzN4qvaP.js} +1 -1
  111. package/server/{feedback-writer-C1gCLFmp.js → feedback-writer-Ds1Wjsz4.js} +5 -5
  112. package/server/{flywheel-HJt7QdWP.js → flywheel-BCZS-FlW.js} +1 -1
  113. package/server/{flywheel-v1cCOBx-.js → flywheel-CC4gE_rx.js} +15 -15
  114. package/server/{flywheel-CjW2L7BS.js → flywheel-DWKd7bMc.js} +16 -16
  115. package/server/{flywheel-merge-order-4fNRN2F2.js → flywheel-merge-order-DDT3i57u.js} +1 -1
  116. package/server/{flywheel-merge-order-D_yyAlND.js → flywheel-merge-order-DJwH2KpL.js} +17 -15
  117. package/server/forge-4VVCRcF7.js +2 -0
  118. package/server/{forge-RVTCK_5X.js → forge-CHADjOFs.js} +2 -2
  119. package/server/{from-BnLgKYvw.js → from-C3dzmjSO.js} +1 -1
  120. package/server/{fs-lock-C7J-ugIf.js → fs-lock-DQ_gUxfq.js} +2 -2
  121. package/server/{fts-operations-CU0B5WUx.js → fts-operations-asZo2fh1.js} +2 -2
  122. package/server/{git-info-BSrI9owC.js → git-info-DMOSfJ9I.js} +1 -1
  123. package/server/{git-utils-CsKV0Dis.js → git-utils-BAMwn9Nf.js} +1 -1
  124. package/server/{git-utils-DW8-jIUJ.js → git-utils-BdHk8y7g.js} +4 -4
  125. package/server/{github-app-Oi5hdn1n.js → github-app-BWziYCf3.js} +1 -1
  126. package/server/{github-app-7ywLhuZO.js → github-app-BlMSzSTw.js} +2 -2
  127. package/server/{github-client-Cy0fSj1a.js → github-client-OK24qpol.js} +1 -1
  128. package/server/{github-client-DAbuXLuk.js → github-client-w6j5nVlz.js} +2 -2
  129. package/server/{github-pr-lookup-Dhh3ec1V.js → github-pr-lookup-bGcsEvLE.js} +2 -2
  130. package/server/{harness-binary-tMmgJfC1.js → harness-binary-DChiynaB.js} +2 -2
  131. package/server/{harness-resolve-DusNpVEe.js → harness-resolve-BplBEbwn.js} +4 -4
  132. package/server/{health-events-BYDZ9n2i.js → health-events-BTqsmunw.js} +1 -1
  133. package/server/{health-events-DNw9Mzw9.js → health-events-Bk3LjaJ9.js} +2 -2
  134. package/server/{hooks-BjBjxqNh.js → hooks-DJR1yR9w.js} +2 -2
  135. package/server/{hooks-B4wj32l2.js → hooks-EndRNrx9.js} +1 -1
  136. package/server/{hume-BP9YbxaE.js → hume-1FJmNDTq.js} +2 -2
  137. package/server/hume-gXLmRhmN.js +3 -0
  138. package/server/{identity-C23uY8dZ.js → identity-C3s8lyp0.js} +3 -3
  139. package/server/{idle-stack-reaper-Bw0rU9GC.js → idle-stack-reaper-CBelVOE3.js} +1 -1
  140. package/server/{idle-stack-reaper-BSxb1bln.js → idle-stack-reaper-DtoI4al6.js} +4 -4
  141. package/server/{in-flight-guard-DuxabAHT.js → in-flight-guard-B7khcBdQ.js} +1 -1
  142. package/server/{infra-CHIvOb9q.js → infra-CJRi_5Wu.js} +10 -4
  143. package/server/{injection-BYUt8ml1.js → injection-ADWQ3D0s.js} +8 -8
  144. package/server/{injection-BviePcm3.js → injection-BWsgHvrL.js} +1 -1
  145. package/server/{inspect-agent-sV_19NxZ.js → inspect-agent-CCfNJjKr.js} +12 -12
  146. package/server/inspect-agent-Dhp3hCGp.js +2 -0
  147. package/server/{internal-token-BOtIRJU7.js → internal-token-BCTEqUCX.js} +1 -1
  148. package/server/{internal-token-DoVzb4b7.js → internal-token-BeIWG_kT.js} +2 -2
  149. package/server/{io-DKrWd3gX.js → io-BCtZoXHo.js} +4 -4
  150. package/server/{issue-closed-6RQsAjDX.js → issue-closed-CiYAa6bX.js} +7 -7
  151. package/server/{issue-lifecycle-D9nLErvS.js → issue-lifecycle-BETNVVLq.js} +25 -25
  152. package/server/{issue-lifecycle-DOPVv7xz.js → issue-lifecycle-DaKN57sx.js} +1 -1
  153. package/server/{issue-service-singleton-CvgNAWqK.js → issue-service-singleton-1Q0ER8Yc.js} +1 -1
  154. package/server/{issue-service-singleton-B2xy-IS9.js → issue-service-singleton-C_sZ0HjP.js} +10 -10
  155. package/server/{issue-title-fallback-DTSCQVu0.js → issue-title-fallback-B91iD66g.js} +3 -3
  156. package/server/{issues-e_Ck1Ln2.js → issues-RGHQUKhB.js} +2 -2
  157. package/server/{jsonl-parser-DqxVCZ1k.js → jsonl-parser-Dfs1dlYE.js} +3 -3
  158. package/server/{jsonl-resolver-07OS3qOr.js → jsonl-resolver-bFtftCDd.js} +8 -8
  159. package/server/{kimi-code-vtXl2DR5.js → kimi-code-BxkDgaj4.js} +1 -1
  160. package/server/{kimi-code-BjtAHIz1.js → kimi-code-CNYRA8Dd.js} +11 -11
  161. package/server/{kimi-parser-B1lgy2Vt.js → kimi-parser-OcWwmOqF.js} +2 -2
  162. package/server/{label-cleanup-D2zUMasf.js → label-cleanup-CefxK9tL.js} +3 -3
  163. package/server/{lifecycle-DaCovZwn.js → lifecycle-DDZ7w-BY.js} +6 -6
  164. package/server/{lifecycle-0NOEzomy.js → lifecycle-DVXyUil2.js} +2 -2
  165. package/server/{lifecycle-io-BBMTaP7S.js → lifecycle-io-D1oBiMce.js} +1 -1
  166. package/server/{lifecycle-io-6WL46dsB.js → lifecycle-io-D7N0vQNj.js} +5 -5
  167. package/server/{linear-client-7fQThJTc.js → linear-client-DUN7zCeb.js} +2 -2
  168. package/server/{linear-client-BTGApNLo.js → linear-client-TL32snOy.js} +1 -1
  169. package/server/{linear-mcp-auth-B8pYRsiU.js → linear-mcp-auth-CtRKSHy5.js} +1 -1
  170. package/server/{linear-mcp-auth-Nk5s3L9M.js → linear-mcp-auth-bB0CPyjh.js} +5 -5
  171. package/server/memory-fts-worker.js +1 -1
  172. package/server/{memory-governor-Cqvbusr4.js → memory-governor-Cvv_9K0M.js} +87 -21
  173. package/server/{memory-pressure-patrol-DPb8foam.js → memory-pressure-patrol-C6DJJQRA.js} +38 -14
  174. package/server/{merge-BB_bjJ9a.js → merge-DOCR6pHi.js} +1 -1
  175. package/server/{merge-FZ78_cEz.js → merge-FTk4LsnM.js} +3 -3
  176. package/server/{merge-agent-B3jRrlS1.js → merge-agent-C-dsN9se.js} +31 -31
  177. package/server/{merge-agent-BuoC_PRZ.js → merge-agent-D-4_iQgy.js} +2 -2
  178. package/server/{merge-batch-B8bVjFWS.js → merge-batch-BJjzUUL7.js} +1 -1
  179. package/server/{merge-completeness-DQt7Qa7i.js → merge-completeness-BOtBUwTU.js} +4 -4
  180. package/server/{merge-completeness-DkdabVch.js → merge-completeness-CoLJxfUY.js} +1 -1
  181. package/server/merge-eligibility-C4rTS97F.js +3 -0
  182. package/server/merge-eligibility-D7wRnJbj.js +51 -0
  183. package/server/merge-ops-Cf02szJ5.js +2 -0
  184. package/server/merge-rebase-Bj7eJAG4.js +2 -0
  185. package/server/{merge-rebase-qq40s91P.js → merge-rebase-KBw4rdh3.js} +2 -2
  186. package/server/{merge-set-BTNYvxM3.js → merge-set-CVfEM57p.js} +1 -1
  187. package/server/{merge-set-BmRRflt0.js → merge-set-CyW-xSn4.js} +4 -4
  188. package/server/{merge-sync-0m2Q087q.js → merge-sync-CYGsJy0u.js} +1 -1
  189. package/server/{merge-sync-CJpOa0cZ.js → merge-sync-YLvOPAry.js} +2 -2
  190. package/server/{merge-train-iwKqjtCF.js → merge-train-VxLn8Ms4.js} +4 -4
  191. package/server/{merge-train-deps-CH5Mr3vN.js → merge-train-deps-D0y4hBB9.js} +4 -4
  192. package/server/{merge-verification-JJc5GC2t.js → merge-verification-BfJRNMiD.js} +6 -6
  193. package/server/{merged-docker-cleanup-worker-BOqWA373.js → merged-docker-cleanup-worker-Bh5fKG_b.js} +3 -3
  194. package/server/{merged-docker-cleanup-worker-CrhTdxZV.js → merged-docker-cleanup-worker-Ci9oeFAe.js} +1 -1
  195. package/server/{messaging-nuwStbdQ.js → messaging-Dfbhgjd6.js} +1 -1
  196. package/server/{multipart-parser-DxuW_rZV.js → multipart-parser-BYwfKOVU.js} +2 -2
  197. package/server/{no-resume-mode-xuYLFhLw.js → no-resume-mode-DjMQRkId.js} +1 -1
  198. package/server/node_modules/.package-lock.json +18 -18
  199. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/package.json +2 -2
  200. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/70_cli/10_basics.ts +4 -2
  201. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.d.ts.map +1 -1
  202. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js +12 -9
  203. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js.map +1 -1
  204. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js +1 -1
  205. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js.map +1 -1
  206. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +6 -6
  207. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeClusterSocket.ts +15 -12
  208. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocket.ts +1 -1
  209. package/server/node_modules/@types/node/README.md +1 -1
  210. package/server/node_modules/@types/node/buffer.buffer.d.ts +5 -5
  211. package/server/node_modules/@types/node/crypto.d.ts +2 -2
  212. package/server/node_modules/@types/node/http.d.ts +16 -0
  213. package/server/node_modules/@types/node/http2.d.ts +10 -2
  214. package/server/node_modules/@types/node/package.json +2 -2
  215. package/server/node_modules/@types/node/process.d.ts +52 -0
  216. package/server/node_modules/@types/node/quic.d.ts +210 -28
  217. package/server/node_modules/@types/node/sqlite.d.ts +6 -2
  218. package/server/node_modules/@types/node/test.d.ts +36 -0
  219. package/server/node_modules/effect/node_modules/uuid/README.md +19 -19
  220. package/server/node_modules/effect/node_modules/uuid/dist/v1.js +7 -3
  221. package/server/node_modules/effect/node_modules/uuid/dist/v7.js +5 -2
  222. package/server/node_modules/effect/node_modules/uuid/dist-node/v1.js +7 -3
  223. package/server/node_modules/effect/node_modules/uuid/dist-node/v7.js +5 -2
  224. package/server/node_modules/effect/node_modules/uuid/package.json +4 -3
  225. package/server/node_modules/msgpackr/dist/index-no-eval.cjs +11 -5
  226. package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
  227. package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
  228. package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
  229. package/server/node_modules/msgpackr/dist/index.js +11 -5
  230. package/server/node_modules/msgpackr/dist/index.js.map +1 -1
  231. package/server/node_modules/msgpackr/dist/index.min.js +1 -1
  232. package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
  233. package/server/node_modules/msgpackr/dist/node.cjs +11 -5
  234. package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
  235. package/server/node_modules/msgpackr/dist/test.js +11 -5
  236. package/server/node_modules/msgpackr/dist/test.js.map +1 -1
  237. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +11 -5
  238. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
  239. package/server/node_modules/msgpackr/package.json +1 -1
  240. package/server/node_modules/msgpackr/unpack.js +11 -5
  241. package/server/node_modules/picomatch/lib/parse.js +10 -1
  242. package/server/node_modules/picomatch/lib/scan.js +30 -18
  243. package/server/node_modules/picomatch/package.json +1 -1
  244. package/server/{orphan-proposed-reconciler-gf4TxfZb.js → orphan-proposed-reconciler-CnP0K2v3.js} +2 -2
  245. package/server/{orphan-proposed-reconciler-Dmk0kO_p.js → orphan-proposed-reconciler-nFUlquZt.js} +21 -21
  246. package/server/package-lock.json +19 -19
  247. package/server/package.json +1 -1
  248. package/server/{pan-dir-BMda7tQj.js → pan-dir-B4NfzOf3.js} +4 -4
  249. package/server/{parked-residue-BiHb8cD7.js → parked-residue-8WbU0y1z.js} +68 -64
  250. package/server/{paths-DEe9j-kw.js → paths-rETQhTF2.js} +2 -2
  251. package/server/{pending-lifecycle-claim-J5uIIJPu.js → pending-lifecycle-claim-yAwDuGS4.js} +1 -1
  252. package/server/{pickup-D1UbSDPd.js → pickup-Dle6k9Xt.js} +1 -1
  253. package/server/{pipeline-agent-reader-D-6okryb.js → pipeline-agent-reader-CeWhQzXC.js} +3 -3
  254. package/server/{pipeline-membership-PGX3Pe8V.js → pipeline-membership-BV4hdkHm.js} +1 -1
  255. package/server/{pipeline-membership-CCbgBzNC.js → pipeline-membership-C9ykcjsn.js} +1 -1
  256. package/server/{pipeline-membership-gather-BK4dzh0X.js → pipeline-membership-gather-Ba0wJNCR.js} +10 -10
  257. package/server/{pipeline-membership-gather-BRhU7XPx.js → pipeline-membership-gather-C9E22B2W.js} +1 -1
  258. package/server/{pipeline-notifier-DvHLaXKb.js → pipeline-notifier-B5DPXvnr.js} +1 -1
  259. package/server/{pipeline-notifier-BNAV9kpa.js → pipeline-notifier-p190L97e.js} +2 -2
  260. package/server/{post-merge-lifecycle-worker-DAWgzXQA.js → post-merge-lifecycle-worker-OQoK8Ckg.js} +2 -2
  261. package/server/{post-merge-state-DC2_0t12.js → post-merge-state-DFaf7OI1.js} +4 -4
  262. package/server/{prd-locations-BbAvqQmT.js → prd-locations-F2oLSAhy.js} +3 -3
  263. package/server/{project-pipelines-By_5WcT4.js → project-pipelines-CUsa6U59.js} +2 -2
  264. package/server/{project-repos-3bI6t4fO.js → project-repos-BVdi9-ch.js} +1 -1
  265. package/server/{project-repos--QeCg7yQ.js → project-repos-CsfvLtmr.js} +2 -2
  266. package/server/{project-resource-refresh-queue-x-K9mvpP.js → project-resource-refresh-queue-BehrH4Ai.js} +17 -17
  267. package/server/{project-resource-refresh-queue-BaZC79S3.js → project-resource-refresh-queue-D2110Guc.js} +1 -1
  268. package/server/{projects-LftaVK99.js → projects-BMuEf14J.js} +1 -1
  269. package/server/{prompts-BotGu-6W.js → prompts-CKpDt8Jn.js} +2 -2
  270. package/server/{providers-Dqgz3MY5.js → providers-Buv2wmFU.js} +1 -1
  271. package/server/{providers-BL1I66sM.js → providers-CxPKmyif.js} +7 -7
  272. package/server/public/assets/{chunk-BO2N2NFS-D5Fz5jND.js → chunk-BO2N2NFS-DZOQVqV1.js} +4 -4
  273. package/server/public/assets/{diagram-OG6HWLK6-Eux0gWFq.js → diagram-OG6HWLK6-oKeXcbO1.js} +1 -1
  274. package/server/public/assets/{dist-D-JX_u7m.js → dist-2qPmeRzT.js} +3 -3
  275. package/server/public/assets/{dist-C3zShwhA.js → dist-ClBlE-Nm.js} +1 -1
  276. package/server/public/assets/{ganttDiagram-6RSMTGT7-UH3aweia.js → ganttDiagram-6RSMTGT7-BwdG9fQv.js} +1 -1
  277. package/server/public/assets/{highlighted-body-OFNGDK62-ccIQ-WXS.js → highlighted-body-OFNGDK62-BzGNdskQ.js} +1 -1
  278. package/server/public/assets/index-CdPveU3M.css +1 -0
  279. package/server/public/assets/{index-BTVcdPve.js → index-Cg6tdZoY.js} +149 -149
  280. package/server/public/assets/{linear-Cnnu4YQy.js → linear-DpEt1TJb.js} +1 -1
  281. package/server/public/assets/mermaid-GHXKKRXX-6KBD_3T_.js +1 -0
  282. package/server/public/assets/{pieDiagram-4H26LBE5-BD8-Tye6.js → pieDiagram-4H26LBE5-9BpM4oRJ.js} +1 -1
  283. package/server/public/assets/{prod-Ca6aKMts.js → prod-CzJiNNEG.js} +4 -4
  284. package/server/public/assets/{quadrantDiagram-W4KKPZXB-BmSrVyFD.js → quadrantDiagram-W4KKPZXB-BXWVAoZx.js} +1 -1
  285. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CEGy8Das.js → sankeyDiagram-5OEKKPKP-5oxodGEw.js} +1 -1
  286. package/server/public/assets/{xychartDiagram-2RQKCTM6-VnQ8iY8s.js → xychartDiagram-2RQKCTM6-BChDrHxZ.js} +1 -1
  287. package/server/public/index.html +2 -2
  288. package/server/pull-requests-CmlandI7.js +2 -0
  289. package/server/{pull-requests-Cp_FDT8-.js → pull-requests-T0OV0Vn4.js} +3 -3
  290. package/server/{rally-bQpBzUNf.js → rally-CUqj2oIN.js} +3 -3
  291. package/server/rally-DYIn9R2U.js +3 -0
  292. package/server/{rally-api-CqAIJ8RX.js → rally-api-BFPb2oSq.js} +2 -2
  293. package/server/{rally-api-Ij1Zt0NI.js → rally-api-BoucQG1u.js} +1 -1
  294. package/server/{rally-client-qKbCNRVW.js → rally-client-16iObny7.js} +4 -4
  295. package/server/{rally-client-CN5vh4Ac.js → rally-client-CsqLjLLa.js} +1 -1
  296. package/server/{rebuild-stack-DrMyA_mA.js → rebuild-stack-BcBVFJp3.js} +2 -2
  297. package/server/{rebuild-stack-BNOMVh7C.js → rebuild-stack-CyXMrj6K.js} +6 -6
  298. package/server/reconciler-caYiRnPy.js +657 -0
  299. package/server/{reconstruct-cache-mxIYCnqs.js → reconstruct-cache-3JzPOune.js} +7 -7
  300. package/server/{record-Ug18Cp4V.js → record-DYOg97Iv.js} +1 -1
  301. package/server/{record-update-dBGxL9OC.js → record-update-BPqpBu3O.js} +5 -5
  302. package/server/{record-update-WyhsREoH.js → record-update-CDPEX7BH.js} +1 -1
  303. package/server/{recovery-trip-BKLrL6NX.js → recovery-trip-CpfW6LCJ.js} +3 -3
  304. package/server/{recovery-trip-wFAixKsg.js → recovery-trip-xqKC07Gy.js} +1 -1
  305. package/server/{release-engine-D9gaCBn9.js → release-engine-C_OOhCaK.js} +5 -5
  306. package/server/{release-set-DPHHzEGx.js → release-set-DOIDz2vw.js} +3 -3
  307. package/server/{remote-BUEeUic6.js → remote-BTh-sjpX.js} +3 -3
  308. package/server/{remote-agents-CSaTLi3u.js → remote-agents-DbbN7vSm.js} +6 -6
  309. package/server/{remote-agents-BVtASiOF.js → remote-agents-MuXx2gWm.js} +1 -1
  310. package/server/{remote-completion-CBV3b9TI.js → remote-completion-LcWCpAm2.js} +12 -12
  311. package/server/{remote-BU6ONLpv.js → remote-xY0B43Ho.js} +3 -3
  312. package/server/{resolver-gxv97jsQ.js → resolver-C2QKOf09.js} +2 -2
  313. package/server/{resolver-DvSMXty7.js → resolver-D4nsxfGo.js} +7 -7
  314. package/server/{resume-DvHuF-bm.js → resume-ByUrJUNX.js} +1 -1
  315. package/server/{review-agent-esZ0QXdY.js → review-agent-BRBTm1qE.js} +30 -30
  316. package/server/{review-agent-DgkUPRx0.js → review-agent-Caodi0PX.js} +2 -2
  317. package/server/{review-artifacts-DGGEobLp.js → review-artifacts-DgaDlbO4.js} +6 -6
  318. package/server/{review-convoy-liveness-DmO8dIBH.js → review-convoy-liveness-BBvyuRLC.js} +8 -8
  319. package/server/{review-run-recovery-DHiiw7d8.js → review-run-recovery-DCzWMMvE.js} +1 -1
  320. package/server/{review-run-recovery-Ct0q7FkE.js → review-run-recovery-THHMKlXJ.js} +2 -2
  321. package/server/{review-status-C_kQeeX0.js → review-status-Bge_3XTR.js} +1 -1
  322. package/server/{review-status-yOGD2MuK.js → review-status-DpniqzPT.js} +55 -45
  323. package/server/{review-status-emit-BZz1Y_22.js → review-status-emit-D7sM720S.js} +3 -3
  324. package/server/{review-status-enrichment-BWH0XW_m.js → review-status-enrichment-PDI4-faj.js} +3 -3
  325. package/server/{review-status-sync-2C9lk85r.js → review-status-sync-C6ZKTI8f.js} +11 -8
  326. package/server/{review-status-sync-Bq00Loey.js → review-status-sync-CvpHWyvR.js} +1 -1
  327. package/server/{review-verdict-feedback-CE_tr2iQ.js → review-verdict-feedback-B2ojHFH5.js} +7 -7
  328. package/server/{review-verdict-feedback-Brjaxoda.js → review-verdict-feedback-tyMoLT2L.js} +1 -1
  329. package/server/{review-verdict-writer-Ca2V7QSY.js → review-verdict-writer-Cy_1pnIj.js} +7 -7
  330. package/server/{review-verdict-writer-CD-4kDVx.js → review-verdict-writer-DjrJ64eS.js} +1 -1
  331. package/server/{rollup--g9ik1XQ.js → rollup-Cp0KEoOu.js} +1 -1
  332. package/server/{rollup-B6g9Nr6L.js → rollup-DU3xBQu2.js} +8 -8
  333. package/server/{scanner-YxIv-fG1.js → scanner-BFKG3Gxv.js} +7 -7
  334. package/server/{search-DqMN4__-.js → search-DhtKwbBC.js} +2 -2
  335. package/server/{sequence-io--b3_PsWq.js → sequence-io-C-Q19Jez.js} +4 -4
  336. package/server/{sequencer-agent-CqouKVZG.js → sequencer-agent-eN2P2lDz.js} +6 -6
  337. package/server/server.js +585 -282
  338. package/server/{service-CEp-3iow.js → service-CThO0Sar.js} +77 -772
  339. package/server/{session-fork-GtoeCh2H.js → session-fork-ZYTHtpBh.js} +2 -2
  340. package/server/settings-ByDRfuuE.js +2 -0
  341. package/server/{settings-CLQcdkoD.js → settings-CTywpFw5.js} +2 -2
  342. package/server/{settings-Ch2pCVtt.js → settings-nAT-eK56.js} +3 -3
  343. package/server/{shadow-engineering-BxiFrIKv.js → shadow-engineering-BHZKPJhq.js} +2 -2
  344. package/server/{shadow-state-CSA1vtxr.js → shadow-state-BTLi4Axs.js} +2 -2
  345. package/server/{shadow-state-nGhCNXT2.js → shadow-state-CZ_LnPsi.js} +1 -1
  346. package/server/{shadow-utils-7q5QDmMj.js → shadow-utils-CPLlPHdn.js} +2 -2
  347. package/server/{ship-log-ie0A_SqV.js → ship-log-D-CphNZx.js} +1 -1
  348. package/server/{ship-record-BM3oVvnL.js → ship-record-BaBla0l_.js} +5 -5
  349. package/server/{ship-record-DHWH1hLz.js → ship-record-BlvX8-xv.js} +1 -1
  350. package/server/{ship-status-BEkddXMT.js → ship-status-rQbPQBsF.js} +2 -2
  351. package/server/{smart-compaction-BkzjVpWL.js → smart-compaction-CUXn8mfX.js} +1 -1
  352. package/server/{smart-compaction-D0TE1lBD.js → smart-compaction-D1CNGdZx.js} +7 -7
  353. package/server/{spawn-planning-session-CkGweSCC.js → spawn-planning-session-DCmO6COk.js} +17 -17
  354. package/server/{spawn-planning-session-s406rw1N.js → spawn-planning-session-DfEWyrVV.js} +2 -2
  355. package/server/{specialist-completion-CTAjwH5j.js → specialist-completion-BMv3K54P.js} +1 -1
  356. package/server/{specialist-context-CKasRfYu.js → specialist-context-C1-CfYQb.js} +5 -5
  357. package/server/{specialist-handoff-logger-DrjrOmmn.js → specialist-handoff-logger-BDKoz5Z9.js} +2 -2
  358. package/server/{specialist-logs-Du6quZ0_.js → specialist-logs-BJQFkpdG.js} +3 -3
  359. package/server/{specialists-x-kPMhrL.js → specialists-CYt1U3Zm.js} +2 -2
  360. package/server/{specialists-CuDWiNdB.js → specialists-D6MUU31Q.js} +19 -19
  361. package/server/{specialists-b0dMMjWq.js → specialists-DhS79T9v.js} +333 -118
  362. package/server/{specialists-B-4zyE4Y.js → specialists-Dx0zRTxX.js} +1 -1
  363. package/server/{specialists-registry-1y6Rt_F1.js → specialists-registry-BRLCi61y.js} +1 -1
  364. package/server/{specialists-registry-BYjs04iK.js → specialists-registry-Bng0OFGH.js} +2 -2
  365. package/server/specs-oRGyfz6C.js +3 -0
  366. package/server/{src-CZsPs61V.js → src-C7gGe4KU.js} +6 -6
  367. package/server/{src-CY2Wl8IX.js → src-CdwN6WY6.js} +8 -2
  368. package/server/{src-DeQwpuh6.js → src-DMosbuSJ.js} +3 -3
  369. package/server/{stack-health-BQFSJc0l.js → stack-health-BKfNaqMm.js} +3 -3
  370. package/server/{stack-health-ypIKtkbE.js → stack-health-Bz711z1Y.js} +1 -1
  371. package/server/{stale-task-claims-C2e1zdMT.js → stale-task-claims-DMRLb5R2.js} +5 -5
  372. package/server/{staleness-Fzx_3_Hr.js → staleness-CxZaIhrn.js} +1 -1
  373. package/server/{staleness-CRDK6LFG.js → staleness-r_dkMyMG.js} +1 -1
  374. package/server/{stall-sweeper-QNk4h9m6.js → stall-sweeper-CBWqSWV2.js} +8 -8
  375. package/server/{state-home-DdG8erBI.js → state-home-DhsMqg8W.js} +2 -2
  376. package/server/{state-migrate-C6H3jfHE.js → state-migrate-C2Ouyd6e.js} +6 -6
  377. package/server/{state-mirror-DF4Lfxm0.js → state-mirror-BPXciz84.js} +3 -3
  378. package/server/{stuck-remediation-BVNd9txd.js → stuck-remediation-DALieAkx.js} +1 -1
  379. package/server/{stuck-remediation-BDa_tXgB.js → stuck-remediation-kta3KN7c.js} +13 -13
  380. package/server/{substrate-bug-weights-service-BbbCZEtJ.js → substrate-bug-weights-service-D_ICP7TI.js} +3 -3
  381. package/server/{summary-fork-DIQmtOuV.js → summary-fork-CojrFKb6.js} +2 -2
  382. package/server/{summary-fork-BvcW6bq0.js → summary-fork-DhhaFhxZ.js} +10 -10
  383. package/server/supervisor-DSSWo4M2.js +2 -0
  384. package/server/{supervisor-D3jC2c7A.js → supervisor-DqH-laVL.js} +4 -4
  385. package/server/{swarm-readiness-CMWAQuWM.js → swarm-readiness-LF8ZF_hc.js} +3 -3
  386. package/server/{synthesis-verdict-DVlrLF9A.js → synthesis-verdict-CGFF8uQI.js} +2 -2
  387. package/server/{synthesis-verdict-C-pJOPsn.js → synthesis-verdict-DSoOFUIV.js} +1 -1
  388. package/server/{system-prerequisites-QKtIYXI2.js → system-prerequisites-Lsx0jUUV.js} +2 -2
  389. package/server/{teardown-workspace-cJea1OLo.js → teardown-workspace-DMwomEG1.js} +16 -16
  390. package/server/{test-agent-queue-C5DI_gWX.js → test-agent-queue-Cu0D6BYe.js} +6 -6
  391. package/server/{test-verdict-C7kmd2_Y.js → test-verdict-9mvl7pQn.js} +1 -1
  392. package/server/{test-verdict-DUbDHqeD.js → test-verdict-oNSv1rVr.js} +2 -2
  393. package/server/{tldr-daemon-BNQHwblU.js → tldr-daemon-CRSAkhBx.js} +1 -1
  394. package/server/{tldr-daemon-CO08YlfQ.js → tldr-daemon-McqCk2X7.js} +2 -2
  395. package/server/{tmux-B8zsqD_6.js → tmux-CYucGrTl.js} +2 -2
  396. package/server/{tmux-DWEc4Ld9.js → tmux-wnT_hg-s.js} +2 -2
  397. package/server/{token-Bez-qCB2.js → token-BdfZLRg1.js} +1 -1
  398. package/server/{tracker-config-CJzPhSHv.js → tracker-config-tfAOWgng.js} +2 -2
  399. package/server/{tracker-utils-DJAOAuMN.js → tracker-utils-Dbg_pVZg.js} +2 -2
  400. package/server/{traefik-connect-D3H5I6b9.js → traefik-connect-DoQvQ6oJ.js} +1 -1
  401. package/server/{tunnel-BSdKnW0U.js → tunnel-B1MNIgkL.js} +1 -1
  402. package/server/{tunnel-Cr3ctqxp.js → tunnel-skW68j9B.js} +3 -3
  403. package/server/{types-fzBp9cYi.js → types-PW4zkxCM.js} +1 -1
  404. package/server/{uat-failure-feedback-IZQ-J8jt.js → uat-failure-feedback-ly8ZwtfC.js} +5 -5
  405. package/server/{uat-promote-verification-DXApKcc2.js → uat-promote-verification-BBaMwfdc.js} +5 -5
  406. package/server/{uat-train-IIZlz7r3.js → uat-train-BBEiYSep.js} +0 -0
  407. package/server/{uat-train-CycEzpbE.js → uat-train-D7Ran2FB.js} +1 -1
  408. package/server/{validate-Ur4xH5bN.js → validate-BYcBcBwg.js} +3 -3
  409. package/server/{validation-Dr6V4PXx.js → validation-BfG2jW5C.js} +4 -4
  410. package/server/{validation-CHovCoTT.js → validation-nSrYiYvA.js} +1 -1
  411. package/server/{verification-artifact-D3viYe_t.js → verification-artifact-Cmhgq4b_.js} +1 -1
  412. package/server/{verification-artifact-k5Ftpg0c.js → verification-artifact-DglwaHke.js} +1 -1
  413. package/server/{verification-runner-Dl13mmsI.js → verification-runner-BEq5ZF-h.js} +16 -16
  414. package/server/{verification-runner-BuqGwm2t.js → verification-runner-CFjAuv9u.js} +1 -1
  415. package/server/{vtt-parser-BSnAB-Og.js → vtt-parser-Va--tv27.js} +1 -1
  416. package/server/{work-agent-prompt-CJJ4tXci.js → work-agent-prompt-BnhKNAg7.js} +1 -1
  417. package/server/{work-agent-prompt-CioeOuM4.js → work-agent-prompt-CaD2ue8m.js} +10 -10
  418. package/server/{work-agent-start-B65Gqn9N.js → work-agent-start-0nJ-6UeA.js} +2 -2
  419. package/server/{work-agent-start-Ct1HVh6z.js → work-agent-start-D8NEN5KD.js} +1 -1
  420. package/server/workflows-BtHRlFIm.js +2 -0
  421. package/server/{workflows-AgFul1xc.js → workflows-C7mxM1qc.js} +28 -28
  422. package/server/{workspace-Cy4sDd3q.js → workspace-BAhMgMaO.js} +3 -3
  423. package/server/{workspace-Cu3XlMXt.js → workspace-Dbqv9ehn.js} +1 -1
  424. package/server/{workspace-anchor-drift-CMaqvizr.js → workspace-anchor-drift-B_3kyyxJ.js} +4 -4
  425. package/server/{workspace-anchor-drift-BI0Hz6zI.js → workspace-anchor-drift-Bpa3xoni.js} +1 -1
  426. package/server/{workspace-config-DRYDO7Zr.js → workspace-config-D-bNq2CF.js} +1 -1
  427. package/server/{workspace-manager-jfkKAEuO.js → workspace-manager-BrbX90Rm.js} +1 -1
  428. package/server/{workspace-manager-CgovxDrO.js → workspace-manager-CM8RCrSc.js} +16 -16
  429. package/server/{workspace-metadata-BDqXzGGK.js → workspace-metadata-BEOwJSdK.js} +1 -1
  430. package/server/{workspace-metadata-BNzODIv6.js → workspace-metadata-Cu6yfxBS.js} +2 -2
  431. package/server/{workspaces-BJdPqx_J.js → workspaces-C7LAuZfe.js} +123 -696
  432. package/sync-sources/rules/agent-message-delivery.md +21 -14
  433. package/sync-sources/rules/pan-handoff-focus-limit.md +3 -1
  434. package/sync-sources/skills/pan-gauntlet-loop/SKILL.md +94 -46
  435. package/sync-sources/skills/pan-handoff/SKILL.md +13 -2
  436. package/server/archive-planning-BW4MKNI7.js +0 -2
  437. package/server/build-info-Bj2vQEMh.js +0 -2
  438. package/server/cli-BRuzUT_I.js +0 -2
  439. package/server/dead-end-trip-6V_CwveT.js +0 -2
  440. package/server/deploy-queue-CjLErpgw.js +0 -2
  441. package/server/dist-fCA6y2bH.js +0 -3
  442. package/server/forge-bvak6vXJ.js +0 -2
  443. package/server/hume-TYTb6fDU.js +0 -3
  444. package/server/inspect-agent-JFEaYTRa.js +0 -2
  445. package/server/merge-ops-DabXHp2i.js +0 -2
  446. package/server/merge-rebase-CXq0qsgR.js +0 -2
  447. package/server/public/assets/index-2wV4ipy_.css +0 -1
  448. package/server/public/assets/mermaid-GHXKKRXX-Bjto8iJh.js +0 -1
  449. package/server/pull-requests-jVGcVq5G.js +0 -2
  450. package/server/rally-CxhVgIQ6.js +0 -3
  451. package/server/settings-DhtPDmmI.js +0 -2
  452. package/server/specs-IYsFlM-L.js +0 -3
  453. package/server/supervisor-v0cYN2Vp.js +0 -2
  454. package/server/workflows-CfHm8lVd.js +0 -2
  455. package/sync-sources/skills/pan-gauntlet-loop/references/lessons.md +0 -60
@@ -1,55 +1,54 @@
1
- import { Gn as extractNumberSync, Kn as extractPrefixSync, Li as getOverdeckHome, Mt as init_state_plane, On as resolveProjectFromIssueSync, Or as resolveModel, Pt as isOverdeckOwnedOnlyStatus, Qr as GitError, Ri as init_paths, Yn as parseIssueIdSync, Zn as resolveIssueIdSync, Zr as FsError, Zt as extractTeamPrefix, ci as init_errors, fn as init_projects, ki as encodeClaudeProjectDir, on as getProjectSync, qn as init_issue_id, t as init_config_yaml, tn as findProjectByTeamSync, vn as listProjectsSync } from "./config-yaml-D9nfpEx1.js";
2
- import { Ct as jsonResponse, _t as getHeaderFromMap, at as resolveRequestedStartedBy, ct as spawnPanCli, ft as rejectUnauthorizedDashboardRequest, it as isInternalAgentRequest, mt as rejectUnsafeDashboardMutationRequest, n as _serverManagedMerges, ot as getWorkAgentLifecycleStateSync, xt as httpHandler } from "./specialists-b0dMMjWq.js";
3
- import { h as loadConfigSync$1, p as init_config } from "./config-ZGjvuR6J.js";
4
- import { l as init_activity_logger, o as emitActivityEntrySync } from "./activity-logger-BWZhVphb.js";
5
- import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CHIvOb9q.js";
6
- import { C as init_tmux, U as sessionExists, dt as init_child_env, j as listSessionNames, r as capturePane, ut as buildChildEnvWithoutTmuxSync } from "./tmux-DWEc4Ld9.js";
7
- import { d as resolveIssueWorkspaceSyncTarget, 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 { g as findPositionInQueueSync, h as computeQueuePositionFromStatusSync, i as EventStoreService } from "./issue-lifecycle-D9nLErvS.js";
10
- import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-CiIwxH1D.js";
11
- import { A as saveAgentStateSync, Ar as transitionIssueToInReview, K as saveAgentRuntimeState, Ut as messageAgent, W as getAgentRuntimeStateSync, _ as init_agent_state, d as decideResumeGate, g as getAgentStateSync, m as getAgentState, on as spawnAgent, p as getAgentResumeGateBlockReason, q as init_agents, u as clearYieldForResumeSync, vn as listRunningAgents } from "./agent-state-BJhGIJZe.js";
12
- import { c as CostDoorLive, d as CostWriter } from "./service-CEp-3iow.js";
13
- import { o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-DoVzb4b7.js";
14
- import { A as init_conversations, st as findConversationForCostSessionSync } from "./conversations-C75EFFjf.js";
15
- import { D as normalizeModelOverrideSync, E as init_model_validation } from "./auto-spawn-consent-Dc4mtM-B.js";
16
- import { c as init_stack_health, n as collectDockerContainerLifecycleSnapshot, o as getWorkspaceStackHealth, r as composeProjectNameForWorkspace } from "./stack-health-BQFSJc0l.js";
1
+ import { $r as GitError, Ai as encodeClaudeProjectDir, Gn as extractNumberSync, Kn as extractPrefixSync, Mt as init_state_plane, On as resolveProjectFromIssueSync, Or as resolveModel, Pt as isOverdeckOwnedOnlyStatus, Qr as FsError, Ri as getOverdeckHome, Yn as parseIssueIdSync, Zn as resolveIssueIdSync, Zt as extractTeamPrefix, fn as init_projects, li as init_errors, on as getProjectSync, qn as init_issue_id, t as init_config_yaml, tn as findProjectByTeamSync, vn as listProjectsSync, zi as init_paths } from "./config-yaml-D60AnTIu.js";
2
+ import { St as httpHandler, at as isInternalAgentRequest, ht as rejectUnsafeDashboardMutationRequest, lt as spawnPanCli, n as _serverManagedMerges, ot as resolveRequestedStartedBy, pt as rejectUnauthorizedDashboardRequest, st as getWorkAgentLifecycleStateSync, vt as getHeaderFromMap, wt as jsonResponse } from "./specialists-DhS79T9v.js";
3
+ import { h as loadConfigSync$1, p as init_config } from "./config-NxI9Yl2f.js";
4
+ import { l as init_activity_logger, o as emitActivityEntrySync } from "./activity-logger-SlTXYCVf.js";
5
+ import { C as init_tmux, U as sessionExists, dt as init_child_env, j as listSessionNames, r as capturePane, ut as buildChildEnvWithoutTmuxSync } from "./tmux-wnT_hg-s.js";
6
+ import { d as resolveIssueWorkspaceSyncTarget, o as init_resolver } from "./resolver-C2QKOf09.js";
7
+ import { a as init_event_store, n as getEventStore } from "./event-store-DTns2XZP.js";
8
+ import { g as findPositionInQueueSync, h as computeQueuePositionFromStatusSync, i as EventStoreService } from "./issue-lifecycle-BETNVVLq.js";
9
+ import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-DTuIRE4y.js";
10
+ import { i as CostWriter, t as CostDoorLive } from "./cost-3FyqKK56.js";
11
+ import { A as saveAgentStateSync, Ar as transitionIssueToInReview, K as saveAgentRuntimeState, Ut as messageAgent, W as getAgentRuntimeStateSync, _ as init_agent_state, d as decideResumeGate, g as getAgentStateSync, m as getAgentState, on as spawnAgent, p as getAgentResumeGateBlockReason, q as init_agents, u as clearYieldForResumeSync, vn as listRunningAgents } from "./agent-state-FABw8neJ.js";
12
+ import { o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-BeIWG_kT.js";
13
+ import { D as normalizeModelOverrideSync, E as init_model_validation } from "./auto-spawn-consent-BesWchEi.js";
14
+ import { c as init_stack_health, n as collectDockerContainerLifecycleSnapshot, o as getWorkspaceStackHealth, r as composeProjectNameForWorkspace } from "./stack-health-BKfNaqMm.js";
17
15
  import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-pLpbsNto.js";
18
- import { A as init_xbrief_index, M as readXBriefDocument, _ as serializeXBriefDocument, c as isPlanningComplete, d as readPlan, k as findXBriefByIssue, l as mergeRecordStatusOverrides, r as findPlan, s as init_io, v as XBRIEF_INSPECTION_POLICIES, y as init_types$1 } from "./io-DKrWd3gX.js";
19
- import { c as init_dag, i as criticalPath, t as actionableDoc } from "./dag-BPc74hwj.js";
20
- import { d as resolveWorkspaceRepoRootsSync, i as init_project_repos } from "./project-repos--QeCg7yQ.js";
21
- import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-CJzPhSHv.js";
22
- import { n as resolveGitHubIssueSync, t as init_tracker_utils } from "./tracker-utils-DJAOAuMN.js";
23
- import { r as notifyPipelineSync, t as init_pipeline_notifier } from "./pipeline-notifier-BNAV9kpa.js";
24
- import { a as getAllActiveQueues, c as init_merge_sync } from "./merge-sync-CJpOa0cZ.js";
25
- import { S as setDeaconIgnored, _ as markWorkspaceStuck, d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, r as clearFeedbackDeliveryStuck, w as setReviewStatusSync, x as setAutoMerge, y as registerReviewVerdictFeedbackDelivery } from "./review-status-yOGD2MuK.js";
26
- import { E as verifyAppCanMerge, M as withConcurrencyLimit, f as init_github_app, j as init_concurrency, m as isIntegrationPermissionError } from "./github-app-7ywLhuZO.js";
27
- import { a as init_events, i as getEventsFileSizeSync, l as init_wal, o as readEventsFromByteOffsetSync, r as forEachCostEventSync, t as appendCostEventSync } from "./events-B6zioJA_.js";
28
- import { n as getContainersReferencingWorkspacePath, r as init_workspace_manager } from "./workspace-manager-CgovxDrO.js";
29
- import { r as init_devcontainer_renderer, t as DEVCONTAINER_DIRNAME } from "./devcontainer-renderer-d-9dCV_2.js";
30
- import { a as init_jsonl_parser, t as getActiveSessionModelSync } from "./jsonl-parser-DqxVCZ1k.js";
31
- import { i as findWorkspacePath } from "./archive-planning-CGkU6UeL.js";
32
- import { t as handlePostRebaseVerificationDeferral } from "./merge-verification-JJc5GC2t.js";
33
- import { n as deliverReviewVerdictFeedbackFromStatus } from "./review-verdict-feedback-CE_tr2iQ.js";
34
- import { t as createInFlightGuard } from "./in-flight-guard-DuxabAHT.js";
35
- import { a as loadWorkspaceMetadataSync, i as listWorkspaceMetadataSync } from "./workspace-metadata-BNzODIv6.js";
36
- import { n as enrichReviewStatusFromSessions } from "./review-status-enrichment-BWH0XW_m.js";
37
- import { n as generateDailySummary } from "./cli-BmczsfD6.js";
38
- import { g as getDiffStat, h as getDiffBase, l as spawnReviewRoleForIssue, m as getChangedFiles } from "./review-agent-esZ0QXdY.js";
39
- import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-CO08YlfQ.js";
40
- import { _ as syncMainIntoWorkspace, b as gitPush, x as listGitOperationsSync, y as MainDivergedError } from "./merge-agent-B3jRrlS1.js";
41
- import { F as enqueueMerge, I as getAllActiveQueues$1, L as getCurrentMerge, P as dequeueMerge, z as markMergeProcessing } from "./merge-FZ78_cEz.js";
42
- import { t as rebaseFeatureBranch } from "./merge-rebase-qq40s91P.js";
43
- import { t as getReleaseSetSync } from "./release-set-DPHHzEGx.js";
44
- import { r as getCachedConflictGateMergeability } from "./conflict-gate-DcUTY4Gb.js";
45
- import { r as runVerificationForIssue } from "./verification-runner-Dl13mmsI.js";
46
- import { a as registerDurableReviewPipelineHandler, i as registerDurableReviewDispatcher, r as init_durable_review_pipeline } from "./durable-review-pipeline-B3OS2_He.js";
47
- import { t as teardownWorkspace } from "./teardown-workspace-cJea1OLo.js";
48
- import { t as init_rebuild_stack } from "./rebuild-stack-BNOMVh7C.js";
16
+ import { A as init_xbrief_index, M as readXBriefDocument, _ as serializeXBriefDocument, c as isPlanningComplete, d as readPlan, k as findXBriefByIssue, l as mergeRecordStatusOverrides, r as findPlan, s as init_io, v as XBRIEF_INSPECTION_POLICIES, y as init_types$1 } from "./io-BCtZoXHo.js";
17
+ import { c as init_dag, i as criticalPath, t as actionableDoc } from "./dag-o-dUpw1L.js";
18
+ import { d as resolveWorkspaceRepoRootsSync, i as init_project_repos } from "./project-repos-CsfvLtmr.js";
19
+ import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-tfAOWgng.js";
20
+ import { n as resolveGitHubIssueSync, t as init_tracker_utils } from "./tracker-utils-Dbg_pVZg.js";
21
+ import { r as notifyPipelineSync, t as init_pipeline_notifier } from "./pipeline-notifier-p190L97e.js";
22
+ import { a as getAllActiveQueues, c as init_merge_sync } from "./merge-sync-YLvOPAry.js";
23
+ import { S as setDeaconIgnored, _ as markWorkspaceStuck, d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, r as clearFeedbackDeliveryStuck, w as setReviewStatusSync, x as setAutoMerge, y as registerReviewVerdictFeedbackDelivery } from "./review-status-DpniqzPT.js";
24
+ import { E as verifyAppCanMerge, M as withConcurrencyLimit, f as init_github_app, j as init_concurrency, m as isIntegrationPermissionError } from "./github-app-BlMSzSTw.js";
25
+ import { a as init_events, i as getEventsFileSizeSync, l as init_wal, o as readEventsFromByteOffsetSync, r as forEachCostEventSync, t as appendCostEventSync } from "./events-B6xW8Cpm.js";
26
+ import "./reconciler-caYiRnPy.js";
27
+ import { n as getContainersReferencingWorkspacePath, r as init_workspace_manager } from "./workspace-manager-CM8RCrSc.js";
28
+ import { r as init_devcontainer_renderer, t as DEVCONTAINER_DIRNAME } from "./devcontainer-renderer-BiJhwFNi.js";
29
+ import { a as init_jsonl_parser, t as getActiveSessionModelSync } from "./jsonl-parser-Dfs1dlYE.js";
30
+ import { i as findWorkspacePath } from "./archive-planning-BL1ABtW0.js";
31
+ import { t as handlePostRebaseVerificationDeferral } from "./merge-verification-BfJRNMiD.js";
32
+ import { n as deliverReviewVerdictFeedbackFromStatus } from "./review-verdict-feedback-B2ojHFH5.js";
33
+ import { t as createInFlightGuard } from "./in-flight-guard-B7khcBdQ.js";
34
+ import { a as loadWorkspaceMetadataSync, i as listWorkspaceMetadataSync } from "./workspace-metadata-Cu6yfxBS.js";
35
+ import { n as enrichReviewStatusFromSessions } from "./review-status-enrichment-PDI4-faj.js";
36
+ import { n as generateDailySummary } from "./cli-CoQou1t_.js";
37
+ import { g as getDiffStat, h as getDiffBase, l as spawnReviewRoleForIssue, m as getChangedFiles } from "./review-agent-BRBTm1qE.js";
38
+ import { n as getTldrDaemonServiceSync, r as init_tldr_daemon } from "./tldr-daemon-McqCk2X7.js";
39
+ import { _ as syncMainIntoWorkspace, b as gitPush, x as listGitOperationsSync, y as MainDivergedError } from "./merge-agent-C-dsN9se.js";
40
+ import { F as enqueueMerge, I as getAllActiveQueues$1, L as getCurrentMerge, P as dequeueMerge, z as markMergeProcessing } from "./merge-FTk4LsnM.js";
41
+ import { t as rebaseFeatureBranch } from "./merge-rebase-KBw4rdh3.js";
42
+ import { t as getReleaseSetSync } from "./release-set-DOIDz2vw.js";
43
+ import { r as getCachedConflictGateMergeability } from "./conflict-gate-hAUCL-un.js";
44
+ import { r as runVerificationForIssue } from "./verification-runner-BEq5ZF-h.js";
45
+ import { a as registerDurableReviewPipelineHandler, i as registerDurableReviewDispatcher, r as init_durable_review_pipeline } from "./durable-review-pipeline-Djx_lvFd.js";
46
+ import { t as teardownWorkspace } from "./teardown-workspace-DMwomEG1.js";
47
+ import { t as init_rebuild_stack } from "./rebuild-stack-CyXMrj6K.js";
49
48
  import { basename, dirname, join, resolve, sep } from "node:path";
50
49
  import { Cause, Effect, Layer, Option, Stream } from "effect";
51
- import { closeSync, existsSync, fstatSync, mkdirSync, openSync, readFileSync, readSync, readdirSync, renameSync, writeFileSync } from "fs";
52
- import { basename as basename$1, join as join$1 } from "path";
50
+ import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync } from "fs";
51
+ import { join as join$1 } from "path";
53
52
  import { homedir } from "os";
54
53
  import { homedir as homedir$1 } from "node:os";
55
54
  import { existsSync as existsSync$1, mkdirSync as mkdirSync$1, readFileSync as readFileSync$1, statSync as statSync$1, writeFileSync as writeFileSync$1 } from "node:fs";
@@ -104,7 +103,7 @@ async function captureInterestedAgent(state, agentId) {
104
103
  try {
105
104
  const remoteState = await readFile(join(homedir$1(), ".overdeck", "agents", agentId, "remote-state.json"), "utf-8").then((text) => JSON.parse(text)).catch(() => null);
106
105
  if (remoteState?.location === "remote" && remoteState?.vmName) {
107
- const { getRemoteAgentOutput } = await import("./remote-agents-BVtASiOF.js");
106
+ const { getRemoteAgentOutput } = await import("./remote-agents-MuXx2gWm.js");
108
107
  stdout = await getRemoteAgentOutput(agentId, remoteState.vmName, 50);
109
108
  } else stdout = await Effect.runPromise(capturePane(agentId, 50));
110
109
  } catch {
@@ -937,7 +936,7 @@ const postWorkspaceContainerActionRoute = HttpRouter.add("POST", "/api/workspace
937
936
  }
938
937
  if (!workspacePath) return jsonResponse({ error: `Workspace not found for ${issueId}` }, { status: 404 });
939
938
  if (!composeFile && ["start", "restart"].includes(action)) {
940
- const { ensureDevcontainerSync } = yield* Effect.promise(() => import("./ensure-devcontainer-rGSh0JHK.js"));
939
+ const { ensureDevcontainerSync } = yield* Effect.promise(() => import("./ensure-devcontainer-Dk6ZMOUC.js"));
941
940
  if (ensureDevcontainerSync({
942
941
  workspacePath,
943
942
  issueId
@@ -1427,10 +1426,10 @@ init_paths();
1427
1426
  init_events();
1428
1427
  init_cost();
1429
1428
  init_errors();
1430
- function getAgentsDir$1() {
1429
+ function getAgentsDir() {
1431
1430
  return join$1(process.env.HOME || homedir(), ".overdeck", "agents");
1432
1431
  }
1433
- function getClaudeProjectsDir$1() {
1432
+ function getClaudeProjectsDir() {
1434
1433
  return join$1(process.env.HOME || homedir(), ".claude", "projects");
1435
1434
  }
1436
1435
  function getProjectsYamlPath() {
@@ -1440,7 +1439,7 @@ function getProjectsYamlPath() {
1440
1439
  * Infer issueId from agent directory name
1441
1440
  * e.g., 'agent-pan-105' -> 'PAN-105', 'agent-min-663' -> 'MIN-663'
1442
1441
  */
1443
- function inferIssueId$1(agentDir) {
1442
+ function inferIssueId(agentDir) {
1444
1443
  const match = agentDir.replace(/^(agent|planning)-/, "").match(/^([a-z]+)-(\d+)$/i);
1445
1444
  if (match) return `${match[1].toUpperCase()}-${match[2]}`;
1446
1445
  return null;
@@ -1482,7 +1481,7 @@ function resolveWorkspace(issueId) {
1482
1481
  function findSessionDirsByIssue(issueId) {
1483
1482
  const dirs = [];
1484
1483
  const issueLower = issueId.toLowerCase();
1485
- const claudeDir = getClaudeProjectsDir$1();
1484
+ const claudeDir = getClaudeProjectsDir();
1486
1485
  try {
1487
1486
  const entries = readdirSync(claudeDir);
1488
1487
  for (const entry of entries) if (entry.includes(`feature-${issueLower}`)) {
@@ -1559,7 +1558,7 @@ function usageToCostEvents(usages, context) {
1559
1558
  */
1560
1559
  function getSessionDir(workspacePath) {
1561
1560
  const sessionDirName = encodeClaudeProjectDir(workspacePath);
1562
- const sessionDir = join$1(getClaudeProjectsDir$1(), sessionDirName);
1561
+ const sessionDir = join$1(getClaudeProjectsDir(), sessionDirName);
1563
1562
  if (existsSync(sessionDir)) return sessionDir;
1564
1563
  return null;
1565
1564
  }
@@ -1567,7 +1566,7 @@ function getSessionDir(workspacePath) {
1567
1566
  * Migrate a single agent's session data
1568
1567
  */
1569
1568
  function migrateAgent(agentDir, stats) {
1570
- const stateFile = join$1(getAgentsDir$1(), agentDir, "state.json");
1569
+ const stateFile = join$1(getAgentsDir(), agentDir, "state.json");
1571
1570
  if (!existsSync(stateFile)) {
1572
1571
  stats.warnings.push({
1573
1572
  file: stateFile,
@@ -1585,7 +1584,7 @@ function migrateAgent(agentDir, stats) {
1585
1584
  });
1586
1585
  return;
1587
1586
  }
1588
- const inferredIssueId = inferIssueId$1(agentDir);
1587
+ const inferredIssueId = inferIssueId(agentDir);
1589
1588
  const context = {
1590
1589
  agentId: agentDir,
1591
1590
  issueId: state.issueId || inferredIssueId || "UNKNOWN",
@@ -1683,7 +1682,7 @@ function migrateAllSessionsSync() {
1683
1682
  totalTokens: 0
1684
1683
  };
1685
1684
  console.log("Starting migration of historical session data...");
1686
- const agentsDir = getAgentsDir$1();
1685
+ const agentsDir = getAgentsDir();
1687
1686
  if (!existsSync(agentsDir)) {
1688
1687
  console.log("No agents directory found - nothing to migrate");
1689
1688
  return stats;
@@ -1710,578 +1709,6 @@ function migrateAllSessionsSync() {
1710
1709
  return stats;
1711
1710
  }
1712
1711
  //#endregion
1713
- //#region ../../lib/costs/attribution.ts
1714
- init_conversations();
1715
- init_infra();
1716
- const NO_ISSUE_BUCKETS = {
1717
- conversations: "CONVERSATIONS",
1718
- flywheel: "FLYWHEEL",
1719
- unattributed: "UNATTRIBUTED"
1720
- };
1721
- function classifySessionBucket(input, lookup) {
1722
- const conversation = lookup(input);
1723
- if (!conversation) return NO_ISSUE_BUCKETS.unattributed;
1724
- if (conversation.name === "flywheel-orchestrator") return NO_ISSUE_BUCKETS.flywheel;
1725
- return NO_ISSUE_BUCKETS.conversations;
1726
- }
1727
- function reclassifyUnknownCostEventsSync() {
1728
- const db = getOverdeckDatabaseSync();
1729
- const rows = db.prepare(`SELECT DISTINCT session_id AS sessionId, agent_id AS agentId
1730
- FROM cost_events
1731
- WHERE issue_id = 'UNKNOWN'`).all();
1732
- let updated = 0;
1733
- const update = db.prepare(`UPDATE cost_events
1734
- SET issue_id = ?
1735
- WHERE issue_id = 'UNKNOWN'
1736
- AND session_id IS ?
1737
- AND agent_id IS ?`);
1738
- for (const row of rows) {
1739
- const bucket = classifySessionBucket(row, findConversationForCostSessionSync);
1740
- const result = update.run(bucket, row.sessionId, row.agentId);
1741
- updated += result.changes;
1742
- }
1743
- return { updated };
1744
- }
1745
- //#endregion
1746
- //#region ../../lib/costs/reconciler.ts
1747
- /**
1748
- * Cost Reconciler — Periodic catch-up sweep for cost tracking
1749
- *
1750
- * The live recording hook (heartbeat-hook → record-cost-event.js) captures costs
1751
- * in real time, but can miss events due to hook failures, process crashes, or
1752
- * system reboots. The reconciler ensures completeness by periodically sweeping
1753
- * ALL Claude transcript files and importing any events not yet in SQLite.
1754
- *
1755
- * v2 Architecture: Scans ~/.claude/projects/ directly instead of going through
1756
- * agent state.json files. This catches everything:
1757
- * - Work agent sessions (from worktree workspaces)
1758
- * - Planning agent sessions (from main project dirs)
1759
- * - Specialist sessions (review, test, merge)
1760
- * - Interactive/manual Claude sessions
1761
- *
1762
- * Key properties:
1763
- * - Idempotent: dedup on request_id — safe to run any number of times
1764
- * - Incremental: tracks byte offset per session — only reads new bytes
1765
- * - Non-destructive: never deletes from SQLite, append-only
1766
- * - Catches everything: scans all transcript files regardless of source
1767
- */
1768
- init_cost();
1769
- init_errors();
1770
- init_conversations();
1771
- /**
1772
- * Map a pi-reported provider string to the AIProvider union used by the pricing
1773
- * layer. zai/kimi/minimax/mimo and anything unknown collapse to 'custom' (which
1774
- * is how these providers are keyed in DEFAULT_PRICING).
1775
- */
1776
- function piProviderToAiProvider(provider) {
1777
- if (provider === "anthropic") return "anthropic";
1778
- if (provider === "openai") return "openai";
1779
- if (provider === "google") return "google";
1780
- return "custom";
1781
- }
1782
- function getAgentsDir() {
1783
- return join$1(process.env.HOME || homedir(), ".overdeck", "agents");
1784
- }
1785
- function getClaudeProjectsDir() {
1786
- return join$1(process.env.HOME || homedir(), ".claude", "projects");
1787
- }
1788
- /**
1789
- * Extract session UUID from a transcript filename.
1790
- * e.g., "678c8d8d-cefe-45ca-bebc-bafe602aff93.jsonl" → "678c8d8d-cefe-45ca-bebc-bafe602aff93"
1791
- */
1792
- function extractSessionId(filename) {
1793
- return basename$1(filename, ".jsonl");
1794
- }
1795
- function resolveUnmappedSessionIssueId(input, lookup = findConversationForCostSessionSync) {
1796
- return classifySessionBucket(input, lookup);
1797
- }
1798
- /**
1799
- * Decode a Claude projects directory name back to the original cwd path.
1800
- * e.g., "-home-eltmon-Projects-krux-workspaces-feature-krux-4" → "/home/eltmon/Projects/krux/workspaces/feature-krux-4"
1801
- */
1802
- function decodeClaudeDirName(dirName) {
1803
- return "/" + dirName.replace(/^-/, "").replace(/-/g, "/");
1804
- }
1805
- /**
1806
- * Build a reverse index: session UUID → agent context.
1807
- * Sources:
1808
- * 1. sessions.json files in agent directories (authoritative — written by heartbeat hook)
1809
- * 2. Agent state.json for issue/workspace context
1810
- */
1811
- function buildSessionIndex() {
1812
- const index = /* @__PURE__ */ new Map();
1813
- const agentsDir = getAgentsDir();
1814
- if (!existsSync(agentsDir)) return index;
1815
- let entries;
1816
- try {
1817
- entries = readdirSync(agentsDir);
1818
- } catch {
1819
- return index;
1820
- }
1821
- for (const agentDir of entries) {
1822
- const agentPath = join$1(agentsDir, agentDir);
1823
- const sessionsFile = join$1(agentPath, "sessions.json");
1824
- let sessionIds = [];
1825
- if (existsSync(sessionsFile)) try {
1826
- sessionIds = JSON.parse(readFileSync(sessionsFile, "utf-8"));
1827
- } catch {}
1828
- const stateFile = join$1(agentPath, "state.json");
1829
- let issueId = inferIssueId(agentDir);
1830
- let stateRole;
1831
- if (existsSync(stateFile)) try {
1832
- const state = JSON.parse(readFileSync(stateFile, "utf-8"));
1833
- if (state.issueId) issueId = state.issueId;
1834
- if (state.role) stateRole = state.role;
1835
- } catch {}
1836
- let sessionType = stateRole || "work";
1837
- const reviewSubRole = agentDir.match(/-review-(security|correctness|performance|requirements)$/i)?.[1]?.toLowerCase();
1838
- if (reviewSubRole) sessionType = `review.${reviewSubRole}`;
1839
- else if (agentDir.startsWith("planning-")) sessionType = "planning";
1840
- else if (agentDir.includes("review")) sessionType = "review";
1841
- else if (agentDir.includes("test")) sessionType = "test";
1842
- else if (agentDir.includes("merge")) sessionType = "merge";
1843
- for (const sid of sessionIds) index.set(sid, {
1844
- agentId: agentDir,
1845
- issueId: issueId ?? resolveUnmappedSessionIssueId({
1846
- sessionId: sid,
1847
- agentId: agentDir
1848
- }),
1849
- sessionType
1850
- });
1851
- }
1852
- return index;
1853
- }
1854
- /**
1855
- * Infer issue ID from a decoded path.
1856
- * Looks for patterns like "feature-min-787", "feature/pan-208", etc.
1857
- */
1858
- function inferIssueFromPath(decodedPath) {
1859
- const match = decodedPath.match(/(?:feature[-/])?(pan|min|aud|krux|cli)[-/](\d+)/i);
1860
- if (match) return `${match[1].toUpperCase()}-${match[2]}`;
1861
- return null;
1862
- }
1863
- /**
1864
- * Infer issue ID from agent directory name.
1865
- * e.g., 'agent-pan-105' → 'PAN-105', 'planning-min-663' → 'MIN-663'
1866
- */
1867
- function inferIssueId(agentDir) {
1868
- const match = agentDir.replace(/^(agent|planning|specialist)-/, "").match(/^(?:.*-)?(pan|min|aud|krux|cli)-(\d+)$/i);
1869
- if (match) return `${match[1].toUpperCase()}-${match[2]}`;
1870
- return null;
1871
- }
1872
- function getSessionOffset(_sessionId) {
1873
- return 0;
1874
- }
1875
- function saveSessionOffset(sessionId, byteOffset, newEvents, agentId, issueId, transcriptPath) {}
1876
- /**
1877
- * Read new bytes from a transcript file starting at the given offset.
1878
- */
1879
- function readNewBytes(filePath, fromOffset) {
1880
- let fd;
1881
- try {
1882
- fd = openSync(filePath, "r");
1883
- } catch {
1884
- return null;
1885
- }
1886
- try {
1887
- const stat = fstatSync(fd);
1888
- if (stat.size <= fromOffset) return {
1889
- content: "",
1890
- newSize: stat.size
1891
- };
1892
- const bytesToRead = stat.size - fromOffset;
1893
- const buffer = Buffer.alloc(bytesToRead);
1894
- readSync(fd, buffer, 0, bytesToRead, fromOffset);
1895
- return {
1896
- content: buffer.toString("utf-8"),
1897
- newSize: stat.size
1898
- };
1899
- } finally {
1900
- closeSync(fd);
1901
- }
1902
- }
1903
- /**
1904
- * Parse transcript content and extract cost events.
1905
- * Only processes assistant messages with usage data and a requestId.
1906
- */
1907
- function extractCostEvents(content, agentId, issueId, sessionType, sessionId) {
1908
- const events = [];
1909
- const lines = content.split("\n");
1910
- for (const line of lines) {
1911
- if (!line.trim()) continue;
1912
- try {
1913
- const entry = JSON.parse(line);
1914
- if (entry.type !== "assistant" || !entry.message?.usage) continue;
1915
- const requestId = entry.requestId ?? void 0;
1916
- const usage = entry.message.usage;
1917
- const model = entry.message.model || "claude-sonnet-4";
1918
- const inputTokens = usage.input_tokens || 0;
1919
- const outputTokens = usage.output_tokens || 0;
1920
- const cacheReadTokens = usage.cache_read_input_tokens || 0;
1921
- const cacheWriteTokens = usage.cache_creation_input_tokens || 0;
1922
- if (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheWriteTokens === 0) continue;
1923
- let provider = "anthropic";
1924
- if (model.includes("gpt")) provider = "openai";
1925
- else if (model.includes("gemini")) provider = "google";
1926
- else if (model.includes("kimi")) provider = "custom";
1927
- else if (model.toLowerCase().startsWith("minimax")) provider = "custom";
1928
- const pricingModel = model.replace(/^(?:oai|cx|go)@/, "");
1929
- const pricing = getPricingSync(provider, pricingModel);
1930
- if (!pricing) continue;
1931
- const cost = calculateCostSync({
1932
- inputTokens,
1933
- outputTokens,
1934
- cacheReadTokens,
1935
- cacheWriteTokens,
1936
- cacheTTL: "5m"
1937
- }, pricing);
1938
- const timestamp = entry.timestamp || entry.ts || entry.created_at || (/* @__PURE__ */ new Date()).toISOString();
1939
- events.push({
1940
- ts: timestamp,
1941
- type: "cost",
1942
- agentId,
1943
- issueId,
1944
- sessionType,
1945
- provider,
1946
- model,
1947
- input: inputTokens,
1948
- output: outputTokens,
1949
- cacheRead: cacheReadTokens,
1950
- cacheWrite: cacheWriteTokens,
1951
- cost,
1952
- requestId,
1953
- sessionId
1954
- });
1955
- } catch {}
1956
- }
1957
- return events;
1958
- }
1959
- /**
1960
- * Parse Pi/oh-my-pi transcript content and extract cost events (PAN-1935).
1961
- *
1962
- * Pi's `message.usage` uses short camelCase keys (`input`, `output`,
1963
- * `cacheRead`, `cacheWrite`) and the real model/provider live on `message`
1964
- * (not inferred from a Claude-style `model` field). Cost is always computed
1965
- * from tokens × pricing because pi reports `cost.total = 0` for non-Anthropic
1966
- * providers. Exported for unit testing.
1967
- */
1968
- function extractPiCostEvents(content, agentId, issueId, sessionType, sessionId) {
1969
- const events = [];
1970
- for (const line of content.split("\n")) {
1971
- if (!line.trim()) continue;
1972
- let entry;
1973
- try {
1974
- entry = JSON.parse(line);
1975
- } catch {
1976
- continue;
1977
- }
1978
- if (entry.type !== "message") continue;
1979
- const usage = entry.message?.usage;
1980
- if (!usage) continue;
1981
- const inputTokens = usage.input ?? 0;
1982
- const outputTokens = usage.output ?? 0;
1983
- const cacheReadTokens = usage.cacheRead ?? 0;
1984
- const cacheWriteTokens = usage.cacheWrite ?? 0;
1985
- if (inputTokens === 0 && outputTokens === 0 && cacheReadTokens === 0 && cacheWriteTokens === 0) continue;
1986
- const model = entry.message?.model || "unknown";
1987
- const provider = piProviderToAiProvider(entry.message?.provider);
1988
- const pricing = getPricingSync(provider, model.replace(/^(?:oai|cx|go)@/, ""));
1989
- if (!pricing) continue;
1990
- const cost = calculateCostSync({
1991
- inputTokens,
1992
- outputTokens,
1993
- cacheReadTokens,
1994
- cacheWriteTokens,
1995
- cacheTTL: "5m"
1996
- }, pricing);
1997
- const requestId = entry.message?.responseId ?? (entry.id ? `${sessionId}#${entry.id}` : void 0);
1998
- const timestamp = entry.timestamp || (/* @__PURE__ */ new Date()).toISOString();
1999
- events.push({
2000
- ts: timestamp,
2001
- type: "cost",
2002
- agentId,
2003
- issueId,
2004
- sessionType,
2005
- provider,
2006
- model,
2007
- input: inputTokens,
2008
- output: outputTokens,
2009
- cacheRead: cacheReadTokens,
2010
- cacheWrite: cacheWriteTokens,
2011
- cost,
2012
- requestId,
2013
- sessionId
2014
- });
2015
- }
2016
- return events;
2017
- }
2018
- /**
2019
- * Pi session transcripts in an agent dir. Pi transcripts begin with a
2020
- * `{"type":"session","version":3,...}` header; we detect that and skip the
2021
- * sibling non-transcripts (activity.jsonl, cost-events.jsonl, pending-events).
2022
- */
2023
- function findPiTranscriptFiles(agentDir) {
2024
- let files;
2025
- try {
2026
- files = readdirSync(agentDir).filter((f) => f.endsWith(".jsonl"));
2027
- } catch {
2028
- return [];
2029
- }
2030
- const transcripts = [];
2031
- for (const f of files) {
2032
- if (f === "activity.jsonl" || f === "cost-events.jsonl" || f === "pending-events.jsonl") continue;
2033
- const full = join$1(agentDir, f);
2034
- try {
2035
- const fd = openSync(full, "r");
2036
- const buf = Buffer.alloc(128);
2037
- const bytesRead = readSync(fd, buf, 0, 128, 0);
2038
- closeSync(fd);
2039
- const head = buf.toString("utf-8", 0, bytesRead);
2040
- if (/"type"\s*:\s*"session"/.test(head)) transcripts.push(full);
2041
- } catch {}
2042
- }
2043
- return transcripts;
2044
- }
2045
- /**
2046
- * Sweep pi session transcripts under the per-agent dirs (~/.overdeck/agents)
2047
- * and import their cost events through the same Overdeck cost writer the Claude
2048
- * path uses (PAN-1935).
2049
- * Independent of the pi extension hook, so it captures cost even when the
2050
- * extension emits null usage or the wrong model label.
2051
- */
2052
- async function reconcilePiTranscripts() {
2053
- const result = {
2054
- sessionsScanned: 0,
2055
- sessionsWithNewData: 0,
2056
- eventsImported: 0,
2057
- duplicatesSkipped: 0,
2058
- errors: [],
2059
- earliestEventTs: null,
2060
- latestEventTs: null
2061
- };
2062
- const agentsDir = getAgentsDir();
2063
- if (!existsSync(agentsDir)) return result;
2064
- let agentDirs;
2065
- try {
2066
- agentDirs = readdirSync(agentsDir);
2067
- } catch {
2068
- return result;
2069
- }
2070
- for (const agentDirName of agentDirs) {
2071
- const agentPath = join$1(agentsDir, agentDirName);
2072
- let issueId = inferIssueId(agentDirName);
2073
- let sessionType = "work";
2074
- const stateFile = join$1(agentPath, "state.json");
2075
- if (existsSync(stateFile)) try {
2076
- const st = JSON.parse(readFileSync(stateFile, "utf-8"));
2077
- if (st.issueId) issueId = st.issueId;
2078
- if (st.role) sessionType = st.role;
2079
- } catch {}
2080
- if (agentDirName.startsWith("planning-")) sessionType = "planning";
2081
- const transcripts = findPiTranscriptFiles(agentPath);
2082
- for (const transcriptPath of transcripts) {
2083
- const sessionId = basename$1(transcriptPath, ".jsonl");
2084
- const resolvedIssueId = issueId ?? resolveUnmappedSessionIssueId({
2085
- sessionId,
2086
- agentId: agentDirName
2087
- });
2088
- result.sessionsScanned++;
2089
- try {
2090
- const events = extractPiCostEvents(readFileSync(transcriptPath, "utf-8"), agentDirName, resolvedIssueId, sessionType, sessionId);
2091
- if (events.length === 0) continue;
2092
- result.sessionsWithNewData++;
2093
- const { inserted, duplicates, earliestEventTs, latestEventTs } = await recordCostEventsThroughOverdeck$1(events, `reconciler:${transcriptPath}`);
2094
- result.eventsImported += inserted;
2095
- result.duplicatesSkipped += duplicates;
2096
- mergeCoverage(result, {
2097
- earliestEventTs,
2098
- latestEventTs
2099
- });
2100
- } catch (err) {
2101
- result.errors.push({
2102
- path: transcriptPath,
2103
- error: err instanceof Error ? err.message : String(err)
2104
- });
2105
- }
2106
- }
2107
- }
2108
- return result;
2109
- }
2110
- function toOverdeckCostEvent$1(event, sourceFile) {
2111
- return {
2112
- ts: new Date(event.ts),
2113
- issueId: event.issueId ? event.issueId : null,
2114
- agentId: event.agentId ?? null,
2115
- sessionId: event.sessionId ?? null,
2116
- sessionType: event.sessionType ?? null,
2117
- provider: event.provider ?? null,
2118
- model: event.model ?? null,
2119
- input: event.input ?? 0,
2120
- output: event.output ?? 0,
2121
- cacheRead: event.cacheRead ?? 0,
2122
- cacheWrite: event.cacheWrite ?? 0,
2123
- cost: event.cost ?? 0,
2124
- requestId: event.requestId ?? null,
2125
- sourceFile
2126
- };
2127
- }
2128
- async function recordCostEventsThroughOverdeck$1(events, sourceFile, opts = {}) {
2129
- let inserted = 0;
2130
- let duplicates = 0;
2131
- let earliestEventTs = null;
2132
- let latestEventTs = null;
2133
- for (const event of events) if (await Effect.runPromise(CostWriter.use((writer) => writer.record(toOverdeckCostEvent$1(event, sourceFile), { dryRun: opts.dryRun })).pipe(Effect.provide(CostDoorLive)))) {
2134
- inserted++;
2135
- const iso = new Date(event.ts).toISOString();
2136
- if (earliestEventTs == null || iso < earliestEventTs) earliestEventTs = iso;
2137
- if (latestEventTs == null || iso > latestEventTs) latestEventTs = iso;
2138
- } else duplicates++;
2139
- return {
2140
- inserted,
2141
- duplicates,
2142
- earliestEventTs,
2143
- latestEventTs
2144
- };
2145
- }
2146
- function mergeCoverage(result, coverage) {
2147
- if (coverage.earliestEventTs != null && (result.earliestEventTs == null || coverage.earliestEventTs < result.earliestEventTs)) result.earliestEventTs = coverage.earliestEventTs;
2148
- if (coverage.latestEventTs != null && (result.latestEventTs == null || coverage.latestEventTs > result.latestEventTs)) result.latestEventTs = coverage.latestEventTs;
2149
- }
2150
- async function reconcilePromise(opts = {}) {
2151
- const result = {
2152
- sessionsScanned: 0,
2153
- sessionsWithNewData: 0,
2154
- eventsImported: 0,
2155
- duplicatesSkipped: 0,
2156
- errors: [],
2157
- earliestEventTs: null,
2158
- latestEventTs: null
2159
- };
2160
- const claudeProjectsDir = getClaudeProjectsDir();
2161
- if (!existsSync(claudeProjectsDir)) return result;
2162
- const sessionIndex = buildSessionIndex();
2163
- let projectDirs;
2164
- try {
2165
- projectDirs = readdirSync(claudeProjectsDir);
2166
- } catch {
2167
- return result;
2168
- }
2169
- for (const dirName of projectDirs) {
2170
- const projectDir = join$1(claudeProjectsDir, dirName);
2171
- try {
2172
- fstatSync(openSync(projectDir, "r"));
2173
- } catch {}
2174
- const pathIssueId = inferIssueFromPath(decodeClaudeDirName(dirName));
2175
- let files;
2176
- try {
2177
- files = readdirSync(projectDir).filter((f) => f.endsWith(".jsonl"));
2178
- } catch {
2179
- continue;
2180
- }
2181
- for (const file of files) {
2182
- const sessionId = extractSessionId(file);
2183
- const transcriptPath = join$1(projectDir, file);
2184
- result.sessionsScanned++;
2185
- try {
2186
- const mapping = sessionIndex.get(sessionId);
2187
- const agentId = mapping?.agentId || "unattributed";
2188
- const issueId = mapping?.issueId || pathIssueId || resolveUnmappedSessionIssueId({
2189
- sessionId,
2190
- agentId
2191
- });
2192
- const sessionType = mapping?.sessionType || "implementation";
2193
- const lastOffset = getSessionOffset(sessionId);
2194
- const readResult = readNewBytes(transcriptPath, lastOffset);
2195
- if (!readResult || !readResult.content) {
2196
- if (!opts.dryRun && readResult && readResult.newSize > lastOffset) saveSessionOffset(sessionId, readResult.newSize, 0, agentId, issueId, transcriptPath);
2197
- continue;
2198
- }
2199
- const events = extractCostEvents(readResult.content, agentId, issueId, sessionType, sessionId);
2200
- if (events.length === 0) {
2201
- if (!opts.dryRun) saveSessionOffset(sessionId, readResult.newSize, 0, agentId, issueId, transcriptPath);
2202
- continue;
2203
- }
2204
- result.sessionsWithNewData++;
2205
- const { inserted, duplicates, earliestEventTs, latestEventTs } = await recordCostEventsThroughOverdeck$1(events, `reconciler:${transcriptPath}`, { dryRun: opts.dryRun });
2206
- result.eventsImported += inserted;
2207
- result.duplicatesSkipped += duplicates;
2208
- mergeCoverage(result, {
2209
- earliestEventTs,
2210
- latestEventTs
2211
- });
2212
- if (!opts.dryRun) saveSessionOffset(sessionId, readResult.newSize, inserted, agentId, issueId, transcriptPath);
2213
- } catch (err) {
2214
- result.errors.push({
2215
- path: transcriptPath,
2216
- error: err instanceof Error ? err.message : String(err)
2217
- });
2218
- }
2219
- }
2220
- const subagentsDir = join$1(projectDir, "subagents");
2221
- if (existsSync(subagentsDir)) try {
2222
- const subFiles = readdirSync(subagentsDir).filter((f) => f.endsWith(".jsonl"));
2223
- for (const file of subFiles) {
2224
- const sessionId = `sub-${extractSessionId(file)}`;
2225
- const transcriptPath = join$1(subagentsDir, file);
2226
- result.sessionsScanned++;
2227
- try {
2228
- const mapping = sessionIndex.get(sessionId);
2229
- const agentId = mapping?.agentId || "unattributed-subagent";
2230
- const issueId = mapping?.issueId || pathIssueId || resolveUnmappedSessionIssueId({
2231
- sessionId,
2232
- agentId
2233
- });
2234
- const sessionType = mapping?.sessionType || "implementation";
2235
- const readResult = readNewBytes(transcriptPath, getSessionOffset(sessionId));
2236
- if (!readResult || !readResult.content) continue;
2237
- const events = extractCostEvents(readResult.content, agentId, issueId, sessionType, sessionId);
2238
- if (events.length === 0) {
2239
- if (!opts.dryRun) saveSessionOffset(sessionId, readResult.newSize, 0, agentId, issueId, transcriptPath);
2240
- continue;
2241
- }
2242
- result.sessionsWithNewData++;
2243
- const { inserted, duplicates, earliestEventTs, latestEventTs } = await recordCostEventsThroughOverdeck$1(events, `reconciler:${transcriptPath}`, { dryRun: opts.dryRun });
2244
- result.eventsImported += inserted;
2245
- result.duplicatesSkipped += duplicates;
2246
- mergeCoverage(result, {
2247
- earliestEventTs,
2248
- latestEventTs
2249
- });
2250
- if (!opts.dryRun) saveSessionOffset(sessionId, readResult.newSize, inserted, agentId, issueId, transcriptPath);
2251
- } catch (err) {
2252
- result.errors.push({
2253
- path: transcriptPath,
2254
- error: err instanceof Error ? err.message : String(err)
2255
- });
2256
- }
2257
- }
2258
- } catch {}
2259
- }
2260
- if (opts.includePi ?? true) {
2261
- const piResult = await reconcilePiTranscripts();
2262
- result.sessionsScanned += piResult.sessionsScanned;
2263
- result.sessionsWithNewData += piResult.sessionsWithNewData;
2264
- result.eventsImported += piResult.eventsImported;
2265
- result.duplicatesSkipped += piResult.duplicatesSkipped;
2266
- result.errors.push(...piResult.errors);
2267
- mergeCoverage(result, piResult);
2268
- }
2269
- return result;
2270
- }
2271
- /**
2272
- * Effect variant of reconcile. Per-file errors are still surfaced via
2273
- * `result.errors`; only catastrophic failures (e.g. SQLite open failure)
2274
- * surface on the Effect error channel.
2275
- */
2276
- const reconcile = (opts = {}) => Effect.tryPromise({
2277
- try: () => reconcilePromise(opts),
2278
- catch: (cause) => new FsError({
2279
- path: "<reconciler>",
2280
- operation: "reconcile",
2281
- cause
2282
- })
2283
- });
2284
- //#endregion
2285
1712
  //#region ../../lib/costs/retention.ts
2286
1713
  init_events();
2287
1714
  init_errors();
@@ -2821,9 +2248,9 @@ function mergeVerificationOptions(request) {
2821
2248
  */
2822
2249
  async function recordCiGreenVerificationVerdict(issueId, workspacePath) {
2823
2250
  try {
2824
- const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-CsKV0Dis.js");
2251
+ const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-BAMwn9Nf.js");
2825
2252
  const verifiedAnchor = await snapshotWorkspaceHeadsPromise(issueId, workspacePath).catch(() => void 0);
2826
- const { setReviewStatusSync } = await import("./review-status-C_kQeeX0.js");
2253
+ const { setReviewStatusSync } = await import("./review-status-Bge_3XTR.js");
2827
2254
  setReviewStatusSync(issueId, {
2828
2255
  verificationStatus: "passed",
2829
2256
  verificationNotes: "merge-verify: CI green on the merged tip (PAN-2487 local-gate skip)",
@@ -2842,7 +2269,7 @@ async function recordCiGreenVerificationVerdict(issueId, workspacePath) {
2842
2269
  * the workspaces-route import cycle.
2843
2270
  */
2844
2271
  async function prepareWorkAgentForRebase(opts) {
2845
- const { appendShipLog } = await import("./ship-log-ie0A_SqV.js");
2272
+ const { appendShipLog } = await import("./ship-log-D-CphNZx.js");
2846
2273
  opts.setStatus({
2847
2274
  mergeStep: "preparing-work-agent",
2848
2275
  mergeNotes: `Preparing work agent ${opts.agentId} to rebase ${opts.scopeNote}…`
@@ -3267,7 +2694,7 @@ async function reconcileGitHubMergeStatus(issueId, status) {
3267
2694
  const prRef = parseGitHubPullRequestUrl(status.prUrl);
3268
2695
  if (!prRef) return false;
3269
2696
  try {
3270
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-Oi5hdn1n.js");
2697
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-BWziYCf3.js");
3271
2698
  if (!isGitHubAppConfigured()) return false;
3272
2699
  const prState = await Effect.runPromise(getPullRequestState(prRef.owner, prRef.repo, prRef.number));
3273
2700
  console.log(`[merge] reconcileGitHubMergeStatus: ${issueId} PR #${prRef.number} merged=${prState.merged} state=${prState.state}`);
@@ -3538,8 +2965,8 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
3538
2965
  try {
3539
2966
  if (request.kind === "normal" && workspaceInfo.isRemote && workspaceInfo.vmName) {
3540
2967
  console.log(`[merge] Remote workspace detected for ${issueId}, using review artifact merge...`);
3541
- const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-BTNYvxM3.js");
3542
- const { getForgeAdapter } = await import("./forge-bvak6vXJ.js");
2968
+ const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-CVfEM57p.js");
2969
+ const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
3543
2970
  const remotePrimaryRepo = (getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId))?.repos[0];
3544
2971
  const remoteTargetBranch = remotePrimaryRepo?.targetBranch || "main";
3545
2972
  const remoteForge = remotePrimaryRepo?.forge || "github";
@@ -3575,7 +3002,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
3575
3002
  ...mergeCompletionStatus(request)
3576
3003
  });
3577
3004
  completePendingOperation(issueId, null);
3578
- const { postMergeLifecycle } = await import("./merge-agent-BuoC_PRZ.js");
3005
+ const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
3579
3006
  await postMergeLifecycle(issueId, projectPath);
3580
3007
  return {
3581
3008
  success: true,
@@ -3620,11 +3047,11 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
3620
3047
  }
3621
3048
  if (isPolyrepo && projectConfig?.workspace?.repos) {
3622
3049
  console.log(`[merge] Polyrepo detected for ${issueId}, coordinating merge set...`);
3623
- const { getMergeSetSync, ensureMergeSetForIssueSync, upsertMergeSetSync, withRepoStateSync } = await import("./merge-set-BTNYvxM3.js");
3624
- const { runQualityGates } = await import("./validation-CHovCoTT.js");
3625
- const { reconcileStrandedRepos } = await import("./merge-completeness-DkdabVch.js");
3626
- const { getForgeAdapter } = await import("./forge-bvak6vXJ.js");
3627
- const { messageAgent } = await import("./agents-DpCuoF65.js");
3050
+ const { getMergeSetSync, ensureMergeSetForIssueSync, upsertMergeSetSync, withRepoStateSync } = await import("./merge-set-CVfEM57p.js");
3051
+ const { runQualityGates } = await import("./validation-nSrYiYvA.js");
3052
+ const { reconcileStrandedRepos } = await import("./merge-completeness-CoLJxfUY.js");
3053
+ const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
3054
+ const { messageAgent } = await import("./agents-DixZjXWm.js");
3628
3055
  let mergeSet = getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId);
3629
3056
  if (!mergeSet) {
3630
3057
  const error = `No merge set found for ${issueId}`;
@@ -3682,7 +3109,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
3682
3109
  ...mergeCompletionStatus(request)
3683
3110
  });
3684
3111
  completePendingOperation(issueId, null);
3685
- const { postMergeLifecycle } = await import("./merge-agent-BuoC_PRZ.js");
3112
+ const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
3686
3113
  advanceQueue();
3687
3114
  await postMergeLifecycle(issueId, projectPath);
3688
3115
  return {
@@ -3936,7 +3363,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
3936
3363
  ...mergeCompletionStatus(request)
3937
3364
  });
3938
3365
  completePendingOperation(issueId, null);
3939
- const { postMergeLifecycle } = await import("./merge-agent-BuoC_PRZ.js");
3366
+ const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
3940
3367
  advanceQueue();
3941
3368
  await postMergeLifecycle(issueId, projectPath);
3942
3369
  return {
@@ -3947,8 +3374,8 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
3947
3374
  repos: mergeResults
3948
3375
  };
3949
3376
  }
3950
- const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-BTNYvxM3.js");
3951
- const { getForgeAdapter } = await import("./forge-bvak6vXJ.js");
3377
+ const { getMergeSetSync, ensureMergeSetForIssueSync } = await import("./merge-set-CVfEM57p.js");
3378
+ const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
3952
3379
  const primaryRepo = (getMergeSetSync(issueId) || ensureMergeSetForIssueSync(issueId))?.repos[0];
3953
3380
  const targetBranch = primaryRepo?.targetBranch || "main";
3954
3381
  const primaryForge = primaryRepo?.forge || "github";
@@ -3991,7 +3418,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
3991
3418
  }
3992
3419
  let preMergePrState;
3993
3420
  if (githubPrRef) try {
3994
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-Oi5hdn1n.js");
3421
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-BWziYCf3.js");
3995
3422
  if (isGitHubAppConfigured()) {
3996
3423
  const prState = await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number));
3997
3424
  preMergePrState = prState;
@@ -4054,7 +3481,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
4054
3481
  ...mergeCompletionStatus(request)
4055
3482
  });
4056
3483
  completePendingOperation(issueId, null);
4057
- const { postMergeLifecycle } = await import("./merge-agent-BuoC_PRZ.js");
3484
+ const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
4058
3485
  await postMergeLifecycle(issueId, projectPath, branchName);
4059
3486
  return {
4060
3487
  success: true,
@@ -4068,8 +3495,8 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
4068
3495
  } catch (prStateErr) {
4069
3496
  console.warn(`[merge] Pre-merge PR state check failed for ${issueId}: ${prStateErr.message} — proceeding (check is best-effort)`);
4070
3497
  }
4071
- const { postMergeLifecycle } = await import("./merge-agent-BuoC_PRZ.js");
4072
- const { beginShipLog, appendShipLog } = await import("./ship-log-ie0A_SqV.js");
3498
+ const { postMergeLifecycle } = await import("./merge-agent-D-4_iQgy.js");
3499
+ const { beginShipLog, appendShipLog } = await import("./ship-log-D-CphNZx.js");
4073
3500
  let rebaseResult;
4074
3501
  if (preMergePrState?.mergeable === true && preMergePrState.mergeableState === "clean" && !preMergePrState.checksFailed && !preMergePrState.checksPending && !preMergePrState.draft && !preMergePrState.merged) {
4075
3502
  console.log(`[merge] PR is CLEAN — merging directly without rebase for ${issueId}`);
@@ -4178,7 +3605,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
4178
3605
  });
4179
3606
  let skipLocalVerification = false;
4180
3607
  if (primaryForge === "github" && artifactUrl) try {
4181
- const { parsePullRequestRef, getCiCheckRunsStatePromise, isGitHubAppConfigured } = await import("./github-app-Oi5hdn1n.js");
3608
+ const { parsePullRequestRef, getCiCheckRunsStatePromise, isGitHubAppConfigured } = await import("./github-app-BWziYCf3.js");
4182
3609
  if (isGitHubAppConfigured()) {
4183
3610
  const ref = parsePullRequestRef({ url: artifactUrl });
4184
3611
  if (ref) {
@@ -4203,7 +3630,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
4203
3630
  const verifyResult = skipLocalVerification ? { outcome: "passed" } : await (async () => {
4204
3631
  console.log(`[merge] Running post-rebase verification for ${issueId}...`);
4205
3632
  appendShipLog(issueId, "Running post-rebase verification (full quality-gate suite)…", "verifying");
4206
- const { runVerificationForIssue } = await import("./verification-runner-BuqGwm2t.js");
3633
+ const { runVerificationForIssue } = await import("./verification-runner-CFjAuv9u.js");
4207
3634
  return Effect.runPromise(runVerificationForIssue(issueId, workspacePath, { isRemote: false }, "merge-verify", {
4208
3635
  ...mergeVerificationOptions(request),
4209
3636
  onGateLog: (line) => appendShipLog(issueId, line, "verifying")
@@ -4248,7 +3675,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
4248
3675
  if (skipLocalVerification) await recordCiGreenVerificationVerdict(issueId, workspacePath);
4249
3676
  setReviewStatus(issueId, { mergeStep: "reporting-statuses" });
4250
3677
  try {
4251
- const { getPullRequestState, isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-Oi5hdn1n.js");
3678
+ const { getPullRequestState, isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-BWziYCf3.js");
4252
3679
  if (githubPrRef && isGitHubAppConfigured()) {
4253
3680
  const sha = (await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number))).headSha.trim();
4254
3681
  if (sha) {
@@ -4276,7 +3703,7 @@ async function triggerMerge(issueId, request = { kind: "normal" }) {
4276
3703
  } catch (prMergeErr) {
4277
3704
  console.error(`[merge] Review artifact merge threw for ${issueId}:`, prMergeErr);
4278
3705
  try {
4279
- const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-Oi5hdn1n.js");
3706
+ const { getPullRequestState, isGitHubAppConfigured } = await import("./github-app-BWziYCf3.js");
4280
3707
  if (githubPrRef && isGitHubAppConfigured()) {
4281
3708
  artifactMerged = (await Effect.runPromise(getPullRequestState(githubPrRef.owner, githubPrRef.repo, githubPrRef.number))).merged;
4282
3709
  if (artifactMerged) console.log(`[merge] Race-detected: PR #${githubPrRef.number} for ${issueId} was already merged despite thrown error; proceeding`);
@@ -4395,8 +3822,8 @@ const postForgeApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge
4395
3822
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
4396
3823
  if (!/^[A-Z]+-\d+$/i.test(issueId)) return jsonResponse({ error: "Invalid issue ID format" }, { status: 400 });
4397
3824
  return yield* Effect.promise(async () => {
4398
- const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-BTNYvxM3.js");
4399
- const { getForgeAdapter } = await import("./forge-bvak6vXJ.js");
3825
+ const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-CVfEM57p.js");
3826
+ const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
4400
3827
  let mergeSet = getMergeSetSync(issueId);
4401
3828
  if (!mergeSet) return jsonResponse({ error: `No merge set found for ${issueId}` }, { status: 404 });
4402
3829
  const results = [];
@@ -4457,7 +3884,7 @@ const postForgeApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge
4457
3884
  }
4458
3885
  }
4459
3886
  if (results.filter((r) => r.approved).length > 0) {
4460
- const { emitActivityEntrySync, emitActivityTtsSync } = await import("./activity-logger-Ck8qoluj.js");
3887
+ const { emitActivityEntrySync, emitActivityTtsSync } = await import("./activity-logger-B0X2JJwM.js");
4461
3888
  emitActivityEntrySync({
4462
3889
  source: "dashboard",
4463
3890
  level: "success",
@@ -4484,9 +3911,9 @@ const postForgeMergeRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge-m
4484
3911
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
4485
3912
  if (!/^[A-Z]+-\d+$/i.test(issueId)) return jsonResponse({ error: "Invalid issue ID format" }, { status: 400 });
4486
3913
  return yield* Effect.promise(async () => {
4487
- const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-BTNYvxM3.js");
4488
- const { getForgeAdapter } = await import("./forge-bvak6vXJ.js");
4489
- const { assessRepoMergeCompleteness } = await import("./merge-completeness-DkdabVch.js");
3914
+ const { getMergeSetSync, upsertMergeSetSync, withRepoArtifactUrlSync, withRepoStateSync } = await import("./merge-set-CVfEM57p.js");
3915
+ const { getForgeAdapter } = await import("./forge-4VVCRcF7.js");
3916
+ const { assessRepoMergeCompleteness } = await import("./merge-completeness-CoLJxfUY.js");
4490
3917
  let mergeSet = getMergeSetSync(issueId);
4491
3918
  if (!mergeSet) return jsonResponse({ error: `No merge set found for ${issueId}` }, { status: 404 });
4492
3919
  const results = [];
@@ -4564,7 +3991,7 @@ const postForgeMergeRoute = HttpRouter.add("POST", "/api/issues/:issueId/forge-m
4564
3991
  }
4565
3992
  }
4566
3993
  if (results.filter((r) => r.merged).length > 0) {
4567
- const { emitActivityEntrySync, emitActivityTtsSync } = await import("./activity-logger-Ck8qoluj.js");
3994
+ const { emitActivityEntrySync, emitActivityTtsSync } = await import("./activity-logger-B0X2JJwM.js");
4568
3995
  emitActivityEntrySync({
4569
3996
  source: "dashboard",
4570
3997
  level: "success",
@@ -4689,7 +4116,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
4689
4116
  console.log(`[approve] Starting role pipeline for ${issueId}...`);
4690
4117
  let reviewResult;
4691
4118
  try {
4692
- const { spawnReviewRoleForIssue } = await import("./review-agent-DgkUPRx0.js");
4119
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
4693
4120
  reviewResult = await Effect.runPromise(spawnReviewRoleForIssue({
4694
4121
  issueId,
4695
4122
  workspace: workspacePath,
@@ -4736,7 +4163,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
4736
4163
  }
4737
4164
  console.log(`[approve] Step 3/3: Running server-side rebase for ${issueId}...`);
4738
4165
  try {
4739
- const { rebaseFeatureBranch } = await import("./merge-rebase-CXq0qsgR.js");
4166
+ const { rebaseFeatureBranch } = await import("./merge-rebase-Bj7eJAG4.js");
4740
4167
  const workspacePathForRebase = join(projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
4741
4168
  const rebaseResult = await Effect.runPromise(rebaseFeatureBranch(workspacePathForRebase, branchName, "main", issueId));
4742
4169
  if (!rebaseResult.success) {
@@ -4756,7 +4183,7 @@ const postWorkspaceApproveRoute = HttpRouter.add("POST", "/api/issues/:issueId/a
4756
4183
  completePendingOperation(issueId, pushResult.error);
4757
4184
  return jsonResponse({ error: pushResult.error }, { status: pushResult.httpStatus });
4758
4185
  }
4759
- const { approve: lifecycleApprove } = await import("./lifecycle-DaCovZwn.js");
4186
+ const { approve: lifecycleApprove } = await import("./lifecycle-DDZ7w-BY.js");
4760
4187
  const ghResolved = resolveGitHubIssueSync(issueId);
4761
4188
  const isGitHubIssueFlag = ghResolved.isGitHub;
4762
4189
  const lifecycleCtx = {
@@ -4790,7 +4217,7 @@ const getMergeQueueRoute = HttpRouter.add("GET", "/api/merge-queue", httpHandler
4790
4217
  })));
4791
4218
  const postInternalPipelineNotifyRoute = HttpRouter.add("POST", "/api/internal/pipeline/notify", httpHandler(Effect.gen(function* () {
4792
4219
  const request = yield* HttpServerRequest.HttpServerRequest;
4793
- const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-BOtIRJU7.js"));
4220
+ const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-BCTEqUCX.js"));
4794
4221
  const expected = getInternalTokenSync();
4795
4222
  if (!expected) return jsonResponse({
4796
4223
  ok: false,
@@ -4804,7 +4231,7 @@ const postInternalPipelineNotifyRoute = HttpRouter.add("POST", "/api/internal/pi
4804
4231
  }, 403);
4805
4232
  const event = yield* readJsonBody;
4806
4233
  const type = event.type;
4807
- const { notifyPipelineSync } = yield* Effect.promise(() => import("./pipeline-notifier-DvHLaXKb.js"));
4234
+ const { notifyPipelineSync } = yield* Effect.promise(() => import("./pipeline-notifier-B5DPXvnr.js"));
4808
4235
  switch (type) {
4809
4236
  case "status_changed": {
4810
4237
  const issueId = event.issueId;
@@ -5611,7 +5038,7 @@ const patchWorkspaceTieredExecutionRoute = HttpRouter.add("PATCH", "/api/workspa
5611
5038
  if (override !== "on" && override !== "off" && override !== null && override !== void 0) return jsonResponse({ error: "Invalid tiered-execution override" }, { status: 400 });
5612
5039
  const project = getProjectSync(extractPrefixSync(issueId) ?? issueId.split("-")[0]);
5613
5040
  if (!project) return jsonResponse({ error: "Project not found" }, { status: 404 });
5614
- yield* Effect.promise(() => import("./record-Ug18Cp4V.js").then((m) => m.writeRecordTieredExecutionOverride(project, issueId, override)));
5041
+ yield* Effect.promise(() => import("./record-DYOg97Iv.js").then((m) => m.writeRecordTieredExecutionOverride(project, issueId, override)));
5615
5042
  const projectPath = project.path;
5616
5043
  const location = yield* resolvePlanLocation(projectPath, issueId);
5617
5044
  if (!location) return jsonResponse({ error: "No xBRIEF plan found for this workspace" }, { status: 404 });
@@ -6213,7 +5640,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
6213
5640
  }
6214
5641
  if (!workspaceInfo.exists) return jsonResponse({ error: "Workspace does not exist" }, { status: 400 });
6215
5642
  const reviewModeProject = requestedReviewMode.mode === void 0 ? null : yield* Effect.promise(async () => {
6216
- const { resolveProjectForIssue } = await import("./record-Ug18Cp4V.js");
5643
+ const { resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
6217
5644
  return resolveProjectForIssue(issueId);
6218
5645
  });
6219
5646
  if (requestedReviewMode.mode !== void 0 && !reviewModeProject) return jsonResponse({ error: `No project configured for ${issueId}` }, { status: 500 });
@@ -6250,7 +5677,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
6250
5677
  }
6251
5678
  if (requestedReviewMode.mode !== void 0 && reviewModeProject) {
6252
5679
  const persistenceError = yield* Effect.promise(async () => {
6253
- const { updateIssueRecord } = await import("./record-update-WyhsREoH.js");
5680
+ const { updateIssueRecord } = await import("./record-update-CDPEX7BH.js");
6254
5681
  await updateIssueRecord(reviewModeProject, issueId, (record) => {
6255
5682
  record.reviewMode = requestedReviewMode.mode;
6256
5683
  });
@@ -6279,7 +5706,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
6279
5706
  console.log(`Feature branch push note: ${errorMessage(pushErr)}`);
6280
5707
  }
6281
5708
  try {
6282
- const { createReviewArtifactsForIssue } = await import("./review-artifacts-DGGEobLp.js");
5709
+ const { createReviewArtifactsForIssue } = await import("./review-artifacts-DgaDlbO4.js");
6283
5710
  const artifactResult = await Effect.runPromise(createReviewArtifactsForIssue(issueId, workspacePath));
6284
5711
  const primaryArtifact = artifactResult.mergeSet?.repos.find((repo) => !!repo.artifactUrl);
6285
5712
  artifactResult.mergeSet?.repos.find((repo) => repo.mergeStatus !== "skipped")?.targetBranch;
@@ -6339,7 +5766,7 @@ const postWorkspaceReviewRoute = HttpRouter.add("POST", "/api/review/:issueId/tr
6339
5766
  completePendingOperation(issueId, verifyOutcome.reason);
6340
5767
  return;
6341
5768
  }
6342
- const { spawnReviewRoleForIssue } = await import("./review-agent-DgkUPRx0.js");
5769
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
6343
5770
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
6344
5771
  const reviewResult = await Effect.runPromise(spawnReviewRoleForIssue({
6345
5772
  issueId,
@@ -6475,7 +5902,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
6475
5902
  console.log(`[request-review] Feature branch push note: ${errorMessage(pushErr)}`);
6476
5903
  }
6477
5904
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
6478
- const { spawnReviewRoleForIssue } = await import("./review-agent-DgkUPRx0.js");
5905
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
6479
5906
  const result = await Effect.runPromise(spawnReviewRoleForIssue({
6480
5907
  issueId,
6481
5908
  workspace: workspacePathRerun,
@@ -6525,7 +5952,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
6525
5952
  });
6526
5953
  } else {
6527
5954
  const workspacePath = join(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
6528
- const { spawnRun } = yield* Effect.promise(() => import("./agents-DpCuoF65.js"));
5955
+ const { spawnRun } = yield* Effect.promise(() => import("./agents-DixZjXWm.js"));
6529
5956
  try {
6530
5957
  const testRun = yield* Effect.promise(() => spawnRun(issueId, "test", { workspace: workspacePath }));
6531
5958
  setReviewStatus(issueId, { testStatus: "testing" });
@@ -6640,7 +6067,7 @@ const postWorkspaceRequestReviewRoute = HttpRouter.add("POST", "/api/review/:iss
6640
6067
  testStatus: "pending",
6641
6068
  reviewNotes
6642
6069
  });
6643
- const { spawnReviewRoleForIssue } = await import("./review-agent-DgkUPRx0.js");
6070
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
6644
6071
  const result = await Effect.runPromise(spawnReviewRoleForIssue({
6645
6072
  issueId,
6646
6073
  workspace: workspacePath,
@@ -6990,7 +6417,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
6990
6417
  const result = processResetReviewPipeline(issueId, resetWorkspace.exists);
6991
6418
  if (result.httpStatus !== 200) return jsonResponse(result.body, { status: result.httpStatus });
6992
6419
  try {
6993
- const { resetPostMergeState } = yield* Effect.promise(() => import("./merge-agent-BuoC_PRZ.js"));
6420
+ const { resetPostMergeState } = yield* Effect.promise(() => import("./merge-agent-D-4_iQgy.js"));
6994
6421
  resetPostMergeState(issueId);
6995
6422
  } catch (err) {
6996
6423
  console.warn(`[reset-review] resetPostMergeState best-effort failed for ${issueId}:`, err);
@@ -6999,7 +6426,7 @@ const postWorkspaceResetReviewRoute = HttpRouter.add("POST", "/api/review/:issue
6999
6426
  const rerun = body?.rerun === true;
7000
6427
  if (rerun) try {
7001
6428
  yield* Effect.promise(async () => {
7002
- const { spawnReviewRoleForIssue } = await import("./review-agent-DgkUPRx0.js");
6429
+ const { spawnReviewRoleForIssue } = await import("./review-agent-Caodi0PX.js");
7003
6430
  const dispatchArgs = buildReviewRedispatchArgs(issueId, resetWorkspace, workspaceInfo, resolved);
7004
6431
  if (dispatchArgs) {
7005
6432
  const result = await Effect.runPromise(spawnReviewRoleForIssue({
@@ -7034,7 +6461,7 @@ const postReviewResyncRoute = HttpRouter.add("POST", "/api/review/:issueId/resyn
7034
6461
  const postWorkspaceReviewPurgeRoute = HttpRouter.add("POST", "/api/review/:issueId/purge", httpHandler(Effect.gen(function* () {
7035
6462
  const issueId = (yield* HttpRouter.params)["issueId"] ?? "";
7036
6463
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
7037
- const { purgeReviewAgentsForIssue } = yield* Effect.promise(() => import("./review-agent-DgkUPRx0.js"));
6464
+ const { purgeReviewAgentsForIssue } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
7038
6465
  const projectKey = resolveProjectFromIssueSync(issueId)?.projectKey;
7039
6466
  const purge = yield* Effect.promise(() => purgeReviewAgentsForIssue(projectKey, issueId));
7040
6467
  const workspaceInfo = getWorkspaceInfoForIssue(issueId);
@@ -7064,8 +6491,8 @@ const postWorkspaceAbortReviewRoute = HttpRouter.add("POST", "/api/review/:issue
7064
6491
  success: false,
7065
6492
  error: "Workspace does not exist"
7066
6493
  }, { status: 400 });
7067
- const { resolveProjectFromIssueSync } = yield* Effect.promise(() => import("./projects-LftaVK99.js"));
7068
- const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-DgkUPRx0.js"));
6494
+ const { resolveProjectFromIssueSync } = yield* Effect.promise(() => import("./projects-BMuEf14J.js"));
6495
+ const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-Caodi0PX.js"));
7069
6496
  const { killed, failed } = yield* killAllReviewerSessions(resolveProjectFromIssueSync(issueId)?.projectKey, issueId);
7070
6497
  setReviewStatus(issueId, {
7071
6498
  reviewStatus: "pending",
@@ -7138,8 +6565,8 @@ const getReviewConfigRoute = HttpRouter.add("GET", "/api/review/:issueId/config"
7138
6565
  const issueId = ((yield* HttpRouter.params)["issueId"] ?? "").toUpperCase();
7139
6566
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
7140
6567
  return jsonResponse(yield* Effect.promise(async () => {
7141
- const { readIssueRecordSync, resolveProjectForIssue } = await import("./record-Ug18Cp4V.js");
7142
- const { resolveReviewMode } = await import("./review-agent-DgkUPRx0.js");
6568
+ const { readIssueRecordSync, resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
6569
+ const { resolveReviewMode } = await import("./review-agent-Caodi0PX.js");
7143
6570
  const project = resolveProjectForIssue(issueId);
7144
6571
  const record = project ? readIssueRecordSync(project, issueId) : null;
7145
6572
  return {
@@ -7170,9 +6597,9 @@ const postReviewConfigRoute = HttpRouter.add("POST", "/api/review/:issueId/confi
7170
6597
  return jsonResponse({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
7171
6598
  }
7172
6599
  return jsonResponse(yield* Effect.promise(async () => {
7173
- const { resolveProjectForIssue } = await import("./record-Ug18Cp4V.js");
7174
- const { updateIssueRecord } = await import("./record-update-WyhsREoH.js");
7175
- const { resolveReviewMode } = await import("./review-agent-DgkUPRx0.js");
6600
+ const { resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
6601
+ const { updateIssueRecord } = await import("./record-update-CDPEX7BH.js");
6602
+ const { resolveReviewMode } = await import("./review-agent-Caodi0PX.js");
7176
6603
  const record = await updateIssueRecord(resolveProjectForIssue(issueId), issueId, (current) => {
7177
6604
  if (hasMode) if (body.reviewMode === null) delete current.reviewMode;
7178
6605
  else current.reviewMode = body.reviewMode;
@@ -7599,7 +7026,7 @@ async function readWorkspacePlanningMarkdown(issueId, fileName) {
7599
7026
  */
7600
7027
  async function readWorkspaceContinueFile(_projectPath, workspacePath, issueId) {
7601
7028
  try {
7602
- const { readRecordContinueViewSync, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-Ug18Cp4V.js");
7029
+ const { readRecordContinueViewSync, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-DYOg97Iv.js");
7603
7030
  const recordView = readRecordContinueViewSync(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId);
7604
7031
  return recordView ? JSON.stringify(recordView, null, 2) : null;
7605
7032
  } catch {
@@ -8379,7 +7806,7 @@ const getWorkspaceReviewStatusRoute = HttpRouter.add("GET", "/api/review/:issueI
8379
7806
  if (queuePosition === null) try {
8380
7807
  const resolved = resolveProjectFromIssueSync(issueId);
8381
7808
  if (resolved) {
8382
- const { getQueueForProject } = yield* Effect.promise(() => import("./merge-BB_bjJ9a.js"));
7809
+ const { getQueueForProject } = yield* Effect.promise(() => import("./merge-DOCR6pHi.js"));
8383
7810
  const mergePos = findPositionInQueueSync(issueId, getQueueForProject(resolved.projectKey).map((e) => ({
8384
7811
  id: String(e.id),
8385
7812
  type: "task",
@@ -8419,7 +7846,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
8419
7846
  const workspaceInfo = getWorkspaceInfoForIssue(issueId);
8420
7847
  if (workspaceInfo.exists && workspaceInfo.localPath) {
8421
7848
  const localPath = workspaceInfo.localPath;
8422
- const { snapshotWorkspaceHeadsPromise } = yield* Effect.promise(() => import("./git-utils-CsKV0Dis.js"));
7849
+ const { snapshotWorkspaceHeadsPromise } = yield* Effect.promise(() => import("./git-utils-BAMwn9Nf.js"));
8423
7850
  try {
8424
7851
  const headAnchor = yield* Effect.promise(() => snapshotWorkspaceHeadsPromise(issueId, localPath));
8425
7852
  if (headAnchor) update.reviewedAtCommit = headAnchor;
@@ -8436,7 +7863,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
8436
7863
  if (verificationStatus) update.verificationStatus = verificationStatus;
8437
7864
  if (readyForMerge !== void 0) update.readyForMerge = readyForMerge;
8438
7865
  const status = setReviewStatus(issueId, update);
8439
- const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-x-kPMhrL.js"));
7866
+ const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-CYt1U3Zm.js"));
8440
7867
  const projectKey = resolveProjectFromIssueSync(issueId)?.projectKey;
8441
7868
  if (reviewStatus && [
8442
7869
  "passed",
@@ -8454,7 +7881,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
8454
7881
  const agentId = `agent-${issueId.toLowerCase()}`;
8455
7882
  const feedbackBody = `CODE REVIEW ${reviewStatus.toUpperCase()} for ${issueId}:\n\n${reviewNotes}\n\n## REQUIRED: Fix ALL issues above, then invoke the /rebase-and-submit skill\n\n1. Read each blocking issue carefully\n2. Fix the code for EVERY issue listed\n3. Run tests locally to verify your fixes\n4. Commit every change\n5. Invoke the /rebase-and-submit skill for ${issueId} — this is an atomic task that runs pan done (which handles rebase + push + re-submit internally)\n\nDo NOT stop between steps. Do NOT run git push manually — the skill handles it. Do NOT stop until pan done has completed successfully.`;
8456
7883
  yield* Effect.gen(function* () {
8457
- const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-CH2846DP.js"));
7884
+ const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-BzN4qvaP.js"));
8458
7885
  const fileResult = yield* writeFeedbackFile({
8459
7886
  issueId,
8460
7887
  workspacePath: getWorkspaceInfoForIssue(issueId).localPath,
@@ -8517,7 +7944,7 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
8517
7944
  const agentId = `agent-${issueId.toLowerCase()}`;
8518
7945
  const feedbackBody = `TESTS FAILED for ${issueId}:\n\n${testNotes}\n\n## REQUIRED: Fix ALL test failures, then invoke the /rebase-and-submit skill\n\n1. Read each test failure carefully\n2. Fix the code causing EVERY failure\n3. Run the test suite locally to verify your fixes pass\n4. Commit every change\n5. Invoke the /rebase-and-submit skill for ${issueId} — this is an atomic task that runs pan done (which handles rebase + push + re-submit internally)\n\nDo NOT stop between steps. Do NOT run git push manually — the skill handles it. Do NOT stop until pan done has completed successfully.`;
8519
7946
  yield* Effect.gen(function* () {
8520
- const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-CH2846DP.js"));
7947
+ const { writeFeedbackFile } = yield* Effect.promise(() => import("./feedback-writer-BzN4qvaP.js"));
8521
7948
  const fileResult = yield* writeFeedbackFile({
8522
7949
  issueId,
8523
7950
  workspacePath: getWorkspaceInfoForIssue(issueId).localPath,
@@ -8550,14 +7977,14 @@ const postWorkspaceReviewStatusRoute = HttpRouter.add("POST", "/api/review/:issu
8550
7977
  } else console.log(`[review-status] ${issueId} automated tests passed, but another gate remains unresolved (uat=${status.uatStatus ?? "not-required"})`);
8551
7978
  yield* Effect.promise(async () => {
8552
7979
  try {
8553
- const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-LftaVK99.js");
7980
+ const { resolveProjectFromIssueSync, getProjectSync } = await import("./projects-BMuEf14J.js");
8554
7981
  const project = resolveProjectFromIssueSync(issueId);
8555
7982
  const repo = (project ? getProjectSync(project.projectKey) : null)?.github_repo;
8556
7983
  if (!repo || !repo.includes("/")) return;
8557
7984
  const [owner, name] = repo.split("/");
8558
7985
  const wsInfo = getWorkspaceInfoForIssue(issueId);
8559
7986
  if (!wsInfo?.localPath) return;
8560
- const { postOverdeckTestsStatus } = await import("./github-app-Oi5hdn1n.js");
7987
+ const { postOverdeckTestsStatus } = await import("./github-app-BWziYCf3.js");
8561
7988
  await postOverdeckTestsStatus(wsInfo.localPath, owner, name, "success", "Test specialist passed");
8562
7989
  } catch (err) {
8563
7990
  console.warn(`[review-status] Failed to post overdeck/tests for ${issueId}: ${err.message}`);
@@ -8601,7 +8028,7 @@ const postWorkspaceRefreshTokenRoute = HttpRouter.add("POST", "/api/workspaces/:
8601
8028
  if (!parseIssueIdSync(issueId)) return jsonResponse({ error: "Invalid issue ID" }, { status: 400 });
8602
8029
  const issueLower = issueId.toLowerCase();
8603
8030
  const workspacePath = join(getProjectPath(void 0, extractPrefixSync(issueId) ?? issueId.split("-")[0]), "workspaces", `feature-${issueLower}`);
8604
- const { refreshWorkspaceToken, isGitHubAppConfigured } = yield* Effect.promise(() => import("./github-app-Oi5hdn1n.js"));
8031
+ const { refreshWorkspaceToken, isGitHubAppConfigured } = yield* Effect.promise(() => import("./github-app-BWziYCf3.js"));
8605
8032
  if (!isGitHubAppConfigured()) return jsonResponse({
8606
8033
  success: false,
8607
8034
  error: "GitHub App not configured"
@@ -8621,6 +8048,6 @@ const postWorkspaceRefreshTokenRoute = HttpRouter.add("POST", "/api/workspaces/:
8621
8048
  })));
8622
8049
  const workspacesRouteLayer = Layer.mergeAll(workspaceDataRouteLayer, postWorkspaceRebuildRoute, postWorkspaceRebuildAndStartRoute, uatStackActionRouteLayer, getWorkspaceStateMdRoute, getWorkspaceInferenceMdRoute, stashCleanRouteLayer, containerOpsRouteLayer, postWorkspaceStartRoute, getWorkspaceReviewStatusRoute, postWorkspaceReviewStatusRoute, reviewPipelineRouteLayer, reviewControlRouteLayer, mergeOpsRouteLayer, postWorkspaceRefreshTokenRoute);
8623
8050
  //#endregion
8624
- export { resolveIssueHeadlineCost as C, stopAgentOutputService as D, startAgentOutputService as E, getCachedRunningAgents as S, retainAgentOutputInterest as T, migrateAllSessionsSync as _, mergeOpsRouteLayer as a, syncCacheSync as b, shouldBlockApproveForDirtyStatus as c, eventsRouteLayer as d, resumeQueuedMerges as f, reclassifyUnknownCostEventsSync as g, reconcilePiTranscripts as h, isBranchAlreadyRebased as i, triggerMerge as l, reconcile as m, buildRichPRBody as n, pushApproveMain as o, syncWalFromAllProjects as p, ensurePRExists as r, reconcileGitHubMergeStatus as s, workspacesRouteLayer as t, internalEventsRouteLayer as u, getCostsForIssueSync as v, getWorkspacePathForIssue as w, processPendingFeedbackDeliveries as x, rebuildCacheSync as y };
8051
+ export { startAgentOutputService as C, retainAgentOutputInterest as S, syncCacheSync as _, mergeOpsRouteLayer as a, resolveIssueHeadlineCost as b, shouldBlockApproveForDirtyStatus as c, eventsRouteLayer as d, resumeQueuedMerges as f, rebuildCacheSync as g, getCostsForIssueSync as h, isBranchAlreadyRebased as i, triggerMerge as l, migrateAllSessionsSync as m, buildRichPRBody as n, pushApproveMain as o, syncWalFromAllProjects as p, ensurePRExists as r, reconcileGitHubMergeStatus as s, workspacesRouteLayer as t, internalEventsRouteLayer as u, processPendingFeedbackDeliveries as v, stopAgentOutputService as w, getWorkspacePathForIssue as x, getCachedRunningAgents as y };
8625
8052
 
8626
- //# sourceMappingURL=workspaces-BJdPqx_J.js.map
8053
+ //# sourceMappingURL=workspaces-C7LAuZfe.js.map