@overdeck/desktop 0.49.1 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +1 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-Crw-xSJ3.js → acceptance-criteria-B_maCGZv.js} +2 -2
  4. package/server/{active-dashboard-bundle-CLwfD-Om.js → active-dashboard-bundle-CCqpFWiz.js} +2 -2
  5. package/server/activity-logger-B0X2JJwM.js +3 -0
  6. package/server/{activity-logger-BAVLrkR7.js → activity-logger-SlTXYCVf.js} +22 -4
  7. package/server/{advancing-selfheal-BQiJ7mIH.js → advancing-selfheal-BJAfiY-C.js} +12 -7
  8. package/server/{agent-gc-5E0lgxI1.js → agent-gc-bhikjoJ_.js} +11 -11
  9. package/server/agent-idle-D-UQ7gDv.js +745 -0
  10. package/server/agent-state-BrUPf_7Z.js +3 -0
  11. package/server/{agent-state-Bb3UUxQm.js → agent-state-FABw8neJ.js} +682 -454
  12. package/server/{agent-state-service-keg-x1bT.js → agent-state-service-BAQApt97.js} +1 -1
  13. package/server/{agent-state-service-BFbttwRA.js → agent-state-service-rDenYSlD.js} +5 -5
  14. package/server/agents-DixZjXWm.js +3 -0
  15. package/server/{agents-CqQJW75N.js → agents-DzpQidT8.js} +8 -8
  16. package/server/{archive-planning-BwEhu9Oq.js → archive-planning-BL1ABtW0.js} +20 -135
  17. package/server/archive-planning-D3gw32U9.js +2 -0
  18. package/server/{artifact-index-jobs-C6Lg2rKm.js → artifact-index-jobs-Cjdme0jS.js} +3 -3
  19. package/server/{assemble-DyTp2gSB.js → assemble-B_JgnCbG.js} +28 -9
  20. package/server/{auto-spawn-consent-BDfe4qz0.js → auto-spawn-consent-BesWchEi.js} +8 -7
  21. package/server/{backlog-auto-trigger-DuOGpdDW.js → backlog-auto-trigger-COLq639j.js} +3 -3
  22. package/server/{behavior-Bitko0mD.js → behavior-DCg8CIWC.js} +3 -3
  23. package/server/{bridge-pool-patrol-DiHEd13O.js → bridge-pool-patrol-BDohuMRt.js} +2 -2
  24. package/server/{briefing-freshness-CDJcmHHZ.js → briefing-freshness-ENa_hW_V.js} +2 -2
  25. package/server/build-info-Dx2qrVhb.js +2 -0
  26. package/server/{build-info-DTX8JwVP.js → build-info-WuZT6xyi.js} +3 -3
  27. package/server/{checkpoint-manager-BlOOdzLF.js → checkpoint-manager-CSZ7aVQF.js} +26 -9
  28. package/server/{checkpoint-manager-CKg1tn34.js → checkpoint-manager-DXhGRvg4.js} +1 -1
  29. package/server/checkpoint-worker.js +1 -1
  30. package/server/{checkpoints-BGfl0cHM.js → checkpoints-DUkUsPVS.js} +2 -2
  31. package/server/{checkpoints-DRALkfDS.js → checkpoints-tm_w6Y4V.js} +1 -1
  32. package/server/{claude-hooks-provision-B_tv3wzE.js → claude-hooks-provision-CTh9zxEi.js} +1 -1
  33. package/server/{claude-hooks-provision-BlGv6twJ.js → claude-hooks-provision-fRofvhTN.js} +2 -2
  34. package/server/{claude-permissions-aHgDcZi5.js → claude-permissions-DLrb9ovz.js} +18 -3
  35. package/server/{claude-settings-overlay-T2LWLteV.js → claude-settings-overlay-BYnXaTVc.js} +2 -2
  36. package/server/{claude-settings-overlay-CYOvFE3A.js → claude-settings-overlay-CMS5Jab5.js} +1 -1
  37. package/server/cli-BflmtEFM.js +2 -0
  38. package/server/{cli-Do8UpLoI.js → cli-CoQou1t_.js} +11 -11
  39. package/server/{cliproxy-CX6jHRDP.js → cliproxy-DXDQcR3I.js} +52 -17
  40. package/server/cliproxy-DdhFpcXU.js +3 -0
  41. package/server/{close-issue-J0_eWYT1.js → close-issue-CpQ0BWg-.js} +5 -5
  42. package/server/{closed-issue-reaper-bFppuk6F.js → closed-issue-reaper-CdcJRvUx.js} +13 -12
  43. package/server/{closed-issue-reaper-Cl2h9AfT.js → closed-issue-reaper-TymtZM37.js} +1 -1
  44. package/server/{codex-icapA4om.js → codex-BValsmtK.js} +1 -1
  45. package/server/{codex-OOea7lXs.js → codex-DYyZL8JD.js} +16 -10
  46. package/server/{compaction-continuation-D5voR1ME.js → compaction-continuation-CVjbdGKt.js} +3 -3
  47. package/server/{config-Cjleh3_U.js → config-CvKH7r7W.js} +1 -1
  48. package/server/{config-tucKBCCc.js → config-NxI9Yl2f.js} +2 -2
  49. package/server/{config-DC75T4Mr.js → config-_qaa1UXH.js} +2 -2
  50. package/server/{config-yaml-BwOEANMr.js → config-yaml-D60AnTIu.js} +55 -15
  51. package/server/{conflict-gate-DlpWCMd7.js → conflict-gate-0dD1kxjN.js} +1 -1
  52. package/server/{conflict-gate-D2L1kZeL.js → conflict-gate-hAUCL-un.js} +5 -5
  53. package/server/{context-layers-CSPGc2Hb.js → context-layers-CdpabJj0.js} +3 -3
  54. package/server/context-layers-Ds1MnEFI.js +4 -0
  55. package/server/{continue-U3Af0jUq.js → continue-CnvrUfxw.js} +3 -3
  56. package/server/{control-settings-5k6ixdFW.js → control-settings-Db0uXgVM.js} +310 -7
  57. package/server/{conversation-compaction-CSpVpxN6.js → conversation-compaction-B-1KETG9.js} +8 -8
  58. package/server/{conversation-compaction-Ciit9O6k.js → conversation-compaction-DzMXGRiJ.js} +1 -1
  59. package/server/{conversation-service-BxrB5lUT.js → conversation-service-BL-asWPX.js} +1 -1
  60. package/server/{conversation-service-BteE4ELK.js → conversation-service-BxIOd5ay.js} +21 -7
  61. package/server/conversations-CEMfwMt-.js +3 -0
  62. package/server/{conversations-DhwxsOru.js → conversations-nS6QgYpD.js} +12 -7
  63. package/server/cost-3FyqKK56.js +838 -0
  64. package/server/{cost-Bnf9NUC5.js → cost-Cctc-Q9M.js} +3 -3
  65. package/server/{cost-CQKI6OCu.js → cost-DTuIRE4y.js} +2 -2
  66. package/server/{cost-sync-B-ADeXKY.js → cost-sync-DfmvLT9L.js} +3 -3
  67. package/server/{dag-DI9LaK_q.js → dag-o-dUpw1L.js} +6 -19
  68. package/server/{dangerous-git-ops-akhA3iyF.js → dangerous-git-ops-BOtXCFkT.js} +1 -1
  69. package/server/dashboard-db-worker.js +61 -11
  70. package/server/{deacon-TPYssFYt.js → deacon-CsisLmPt.js} +1735 -172
  71. package/server/{deacon-canonical-state-DFYymrDw.js → deacon-canonical-state-DkdkQS5p.js} +3 -3
  72. package/server/deacon-e6py3jkM.js +4 -0
  73. package/server/{deacon-event-client-Te5v10-b.js → deacon-event-client-BCjHiGAY.js} +1 -1
  74. package/server/{deacon-event-client-BKOL4AcL.js → deacon-event-client-CMQswEHX.js} +2 -2
  75. package/server/{deacon-nudge-log-BtlTWgWu.js → deacon-nudge-log-pcliw8Dr.js} +1 -1
  76. package/server/{deacon-pending-lifecycle-DVHjOLje.js → deacon-pending-lifecycle-BzaE76Xo.js} +3 -3
  77. package/server/deacon.js +11 -11
  78. package/server/{dead-end-trip-P0IF1O0E.js → dead-end-trip-Bs3hxIn6.js} +3 -3
  79. package/server/dead-end-trip-DUbiRMtT.js +2 -0
  80. package/server/delivery-DhZGRShH.js +3 -0
  81. package/server/{deploy-patrol-BXjlvoV3.js → deploy-patrol-B8sKkA8h.js} +8 -8
  82. package/server/deploy-queue--smqHLhe.js +2 -0
  83. package/server/{deploy-queue-o7shYg1j.js → deploy-queue-CCGWXFkp.js} +2 -2
  84. package/server/{deploy-window-CNT6fOff.js → deploy-window-YuJewzmC.js} +4 -4
  85. package/server/{deploy-window-BMk5_oX6.js → deploy-window-hgsvZ3UZ.js} +1 -1
  86. package/server/{dev-supervisor-SR1CLOAK.js → dev-supervisor-4SBloJHV.js} +2 -2
  87. package/server/{devcontainer-renderer-enMmNDFa.js → devcontainer-renderer-BiJhwFNi.js} +3 -3
  88. package/server/{dist-CPTO_zMR.js → dist-CoR2sivG.js} +1 -1
  89. package/server/dist-FHv1s5ez.js +3 -0
  90. package/server/{docker-B7qUZptz.js → docker-CWO7dcIP.js} +3 -3
  91. package/server/{docker-KR3zSFKY.js → docker-DQzyMXkd.js} +1 -1
  92. package/server/{dod-gK835UMf.js → dod-BAk5arLF.js} +1 -1
  93. package/server/{done-preflight-CksRvh49.js → done-preflight-CGFA0M1b.js} +1 -1
  94. package/server/{done-preflight-Bk8aExAL.js → done-preflight-Cx9JGznT.js} +5 -5
  95. package/server/{driver-CmsY2RLl.js → driver-BtcFz-qu.js} +14 -3
  96. package/server/durable-review-pipeline-BOEZ0chh.js +3 -0
  97. package/server/{durable-review-pipeline-DgYHucN2.js → durable-review-pipeline-Djx_lvFd.js} +11 -2
  98. package/server/{ensure-devcontainer-BQ4YizSH.js → ensure-devcontainer-Dk6ZMOUC.js} +1 -1
  99. package/server/{ensure-devcontainer-ojerEqQg.js → ensure-devcontainer-DzYBBwnM.js} +4 -4
  100. package/server/{esm-shims-1htPASWs.js → esm-shims-deFq5Hhl.js} +1 -1
  101. package/server/{event-store-BgEjNsvk.js → event-store-C50Qt-f1.js} +1 -1
  102. package/server/{event-store-D7qcJXuZ.js → event-store-DTns2XZP.js} +5 -5
  103. package/server/{event-store-provider-BKvk2rDj.js → event-store-provider-Bu1Qrg6v.js} +1 -1
  104. package/server/{events-BIKGJZOT.js → events-B6xW8Cpm.js} +3 -3
  105. package/server/{dist-src-BM9eudEd.js → factory-CWVKwKFE.js} +714 -2
  106. package/server/{feature-registry-storage-ewNSIVsQ.js → feature-registry-storage-vaxRN3WO.js} +3 -3
  107. package/server/{features-CGopJXdU.js → features-DXWwktJB.js} +2 -2
  108. package/server/{feedback-stuck-retirement-B8-fX7NA.js → feedback-stuck-retirement-CXAYe2rU.js} +2 -2
  109. package/server/{feedback-target-CkyLYohm.js → feedback-target-DSVpi0gT.js} +1 -1
  110. package/server/{feedback-target-Ci6N5p4G.js → feedback-target-yPD_wclF.js} +10 -10
  111. package/server/{feedback-writer-DfuVjvH0.js → feedback-writer-BzN4qvaP.js} +1 -1
  112. package/server/{feedback-writer-D4ULO4qG.js → feedback-writer-Ds1Wjsz4.js} +5 -5
  113. package/server/{flywheel-DXI_WITn.js → flywheel-BCZS-FlW.js} +1 -1
  114. package/server/{flywheel-BwYPDlhK.js → flywheel-CC4gE_rx.js} +15 -15
  115. package/server/{flywheel-C7yek87O.js → flywheel-DWKd7bMc.js} +79 -29
  116. package/server/{flywheel-merge-order-C5m5bYBc.js → flywheel-merge-order-DDT3i57u.js} +1 -1
  117. package/server/{flywheel-merge-order-CXfU4M6l.js → flywheel-merge-order-DJwH2KpL.js} +17 -15
  118. package/server/forge-4VVCRcF7.js +2 -0
  119. package/server/{forge-DYX9sKzG.js → forge-CHADjOFs.js} +2 -2
  120. package/server/{from-DAdMxC29.js → from-C3dzmjSO.js} +1 -1
  121. package/server/{fs-lock-cw25uO_E.js → fs-lock-DQ_gUxfq.js} +2 -2
  122. package/server/{fts-operations-D_rzLxX5.js → fts-operations-asZo2fh1.js} +3 -3
  123. package/server/git-info-DMOSfJ9I.js +148 -0
  124. package/server/{git-utils-Y0zG25ez.js → git-utils-BAMwn9Nf.js} +1 -1
  125. package/server/{git-utils-DV4B9TRl.js → git-utils-BdHk8y7g.js} +4 -4
  126. package/server/{github-app-C33lDk9Z.js → github-app-BWziYCf3.js} +1 -1
  127. package/server/{github-app-4UX8VIr8.js → github-app-BlMSzSTw.js} +2 -2
  128. package/server/{github-client-nPj5ckZO.js → github-client-OK24qpol.js} +1 -1
  129. package/server/{github-client-DkJVR908.js → github-client-w6j5nVlz.js} +3 -3
  130. package/server/{github-pr-lookup-C9Vokb0W.js → github-pr-lookup-bGcsEvLE.js} +2 -2
  131. package/server/{harness-binary-BgXYDo2Z.js → harness-binary-DChiynaB.js} +2 -2
  132. package/server/{harness-resolve-1NZcVx7n.js → harness-resolve-BplBEbwn.js} +4 -4
  133. package/server/{health-events-jMfxrElt.js → health-events-BTqsmunw.js} +1 -1
  134. package/server/{health-events-DlX_FVAB.js → health-events-Bk3LjaJ9.js} +2 -2
  135. package/server/{hooks-NQ19vvlB.js → hooks-DJR1yR9w.js} +2 -2
  136. package/server/{hooks-W3REcb3h.js → hooks-EndRNrx9.js} +1 -1
  137. package/server/{hume-BFkid2PO.js → hume-1FJmNDTq.js} +2 -2
  138. package/server/hume-gXLmRhmN.js +3 -0
  139. package/server/{identity-Bwh6VGeL.js → identity-C3s8lyp0.js} +3 -3
  140. package/server/{idle-stack-reaper-CHtCNpvd.js → idle-stack-reaper-CBelVOE3.js} +1 -1
  141. package/server/{idle-stack-reaper-BeU_KxWx.js → idle-stack-reaper-DtoI4al6.js} +4 -4
  142. package/server/{in-flight-guard-pcwXKLGz.js → in-flight-guard-B7khcBdQ.js} +1 -1
  143. package/server/{infra-KTp9KV9u.js → infra-CJRi_5Wu.js} +36 -7
  144. package/server/{injection-67YyU6SC.js → injection-ADWQ3D0s.js} +8 -8
  145. package/server/{injection-BxbZKPDh.js → injection-BWsgHvrL.js} +1 -1
  146. package/server/{inspect-agent-VHSihlb7.js → inspect-agent-CCfNJjKr.js} +12 -12
  147. package/server/inspect-agent-Dhp3hCGp.js +2 -0
  148. package/server/{internal-token-B-z-sGBH.js → internal-token-BCTEqUCX.js} +1 -1
  149. package/server/{internal-token-zY75jrRJ.js → internal-token-BeIWG_kT.js} +2 -2
  150. package/server/{io-DfvO2xyh.js → io-BCtZoXHo.js} +5 -5
  151. package/server/{issue-closed-dvEWKO7Q.js → issue-closed-CiYAa6bX.js} +7 -7
  152. package/server/{issue-lifecycle-3N8XF7lP.js → issue-lifecycle-BETNVVLq.js} +206 -29
  153. package/server/{issue-lifecycle-BI6jAfp8.js → issue-lifecycle-DaKN57sx.js} +1 -1
  154. package/server/{issue-service-singleton-CL6hESX2.js → issue-service-singleton-1Q0ER8Yc.js} +1 -1
  155. package/server/{issue-service-singleton-BN_2MXp4.js → issue-service-singleton-C_sZ0HjP.js} +124 -11
  156. package/server/issue-title-fallback-B91iD66g.js +120 -0
  157. package/server/{issues-CkvUoAnq.js → issues-RGHQUKhB.js} +2 -2
  158. package/server/{jsonl-parser-CrEb2PWr.js → jsonl-parser-Dfs1dlYE.js} +3 -3
  159. package/server/jsonl-resolver-bFtftCDd.js +324 -0
  160. package/server/{kimi-code-DoMoGqIu.js → kimi-code-BxkDgaj4.js} +1 -1
  161. package/server/{kimi-code-C26gmGxM.js → kimi-code-CNYRA8Dd.js} +14 -12
  162. package/server/{kimi-parser-Dmhy3UlR.js → kimi-parser-OcWwmOqF.js} +2 -2
  163. package/server/{label-cleanup-X2lWfghH.js → label-cleanup-CefxK9tL.js} +3 -3
  164. package/server/{lifecycle-B0rL38D3.js → lifecycle-DDZ7w-BY.js} +6 -6
  165. package/server/{lifecycle-Bg44O-9x.js → lifecycle-DVXyUil2.js} +2 -2
  166. package/server/{lifecycle-io-DQDU0apV.js → lifecycle-io-D1oBiMce.js} +1 -1
  167. package/server/{lifecycle-io-CCBpRv5m.js → lifecycle-io-D7N0vQNj.js} +5 -5
  168. package/server/{linear-client-B0cIkTs4.js → linear-client-DUN7zCeb.js} +3 -3
  169. package/server/{linear-client-6V2E-DSa.js → linear-client-TL32snOy.js} +1 -1
  170. package/server/{linear-mcp-auth-LCo9AWUd.js → linear-mcp-auth-CtRKSHy5.js} +1 -1
  171. package/server/{linear-mcp-auth-Dsu9Io9r.js → linear-mcp-auth-bB0CPyjh.js} +5 -5
  172. package/server/memory-fts-worker.js +1 -1
  173. package/server/{memory-governor-A4O6vI9d.js → memory-governor-Cvv_9K0M.js} +88 -22
  174. package/server/{memory-pressure-patrol-BWlWywmA.js → memory-pressure-patrol-C6DJJQRA.js} +38 -14
  175. package/server/{merge-BGWcBxku.js → merge-DOCR6pHi.js} +1 -1
  176. package/server/{merge-vz80RvSE.js → merge-FTk4LsnM.js} +3 -3
  177. package/server/{merge-agent-GWhmnxFk.js → merge-agent-C-dsN9se.js} +37 -33
  178. package/server/{merge-agent-BRSz26Oh.js → merge-agent-D-4_iQgy.js} +2 -2
  179. package/server/{merge-batch-CFMEtTxv.js → merge-batch-BJjzUUL7.js} +1 -1
  180. package/server/{merge-completeness-CP347umA.js → merge-completeness-BOtBUwTU.js} +4 -4
  181. package/server/{merge-completeness-7ajHAIR-.js → merge-completeness-CoLJxfUY.js} +1 -1
  182. package/server/merge-eligibility-C4rTS97F.js +3 -0
  183. package/server/merge-eligibility-D7wRnJbj.js +51 -0
  184. package/server/merge-ops-Cf02szJ5.js +2 -0
  185. package/server/merge-rebase-Bj7eJAG4.js +2 -0
  186. package/server/{merge-rebase-C5htyEEH.js → merge-rebase-KBw4rdh3.js} +2 -2
  187. package/server/{merge-set-DsGW8fmc.js → merge-set-CVfEM57p.js} +1 -1
  188. package/server/{merge-set-eiE2nC6C.js → merge-set-CyW-xSn4.js} +4 -4
  189. package/server/{merge-sync-CM2-myXu.js → merge-sync-CYGsJy0u.js} +1 -1
  190. package/server/{merge-sync-Ct0-cxMX.js → merge-sync-YLvOPAry.js} +2 -2
  191. package/server/{merge-train-BOu3fN7O.js → merge-train-VxLn8Ms4.js} +4 -4
  192. package/server/{merge-train-deps-LXHGK61n.js → merge-train-deps-D0y4hBB9.js} +4 -4
  193. package/server/{merge-verification-BRp08IzI.js → merge-verification-BfJRNMiD.js} +6 -6
  194. package/server/{merged-docker-cleanup-worker-CwldDjHV.js → merged-docker-cleanup-worker-Bh5fKG_b.js} +4 -4
  195. package/server/{merged-docker-cleanup-worker-C8eGn78a.js → merged-docker-cleanup-worker-Ci9oeFAe.js} +1 -1
  196. package/server/messaging-Dfbhgjd6.js +3 -0
  197. package/server/{multipart-parser-OAuW7824.js → multipart-parser-BYwfKOVU.js} +2 -2
  198. package/server/{no-resume-mode-MWI6pnrK.js → no-resume-mode-DjMQRkId.js} +1 -1
  199. package/server/node_modules/.package-lock.json +24 -24
  200. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/AGENTS.md +14 -0
  201. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/CLAUDE.md +14 -0
  202. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +10 -3
  203. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/package.json +2 -2
  204. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/10_basics.ts +175 -0
  205. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/40_sql/index.md +6 -0
  206. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/10_basics.ts +3 -1
  207. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/20_testing.ts +100 -0
  208. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/api/Users.ts +30 -14
  209. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/domain/User.ts +15 -6
  210. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +11 -10
  211. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +41 -32
  212. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/51_http-server/fixtures/server/Users.ts +141 -20
  213. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/ai-docs/src/70_cli/10_basics.ts +31 -5
  214. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
  215. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +10 -9
  216. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
  217. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.d.ts.map +1 -1
  218. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js +12 -9
  219. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeClusterSocket.js.map +1 -1
  220. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js +1 -1
  221. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocket.js.map +1 -1
  222. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js +4 -4
  223. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeSocketServer.js.map +1 -1
  224. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.d.ts.map +1 -1
  225. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js +10 -4
  226. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeStream.js.map +1 -1
  227. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts +4 -0
  228. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.d.ts.map +1 -0
  229. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js +10 -0
  230. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/internal/nodeChildProcessSpawner.js.map +1 -0
  231. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +7 -7
  232. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +16 -11
  233. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeClusterSocket.ts +15 -12
  234. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocket.ts +1 -1
  235. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeSocketServer.ts +4 -4
  236. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeStream.ts +10 -4
  237. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/internal/nodeChildProcessSpawner.ts +16 -0
  238. package/server/node_modules/@types/node/README.md +1 -1
  239. package/server/node_modules/@types/node/buffer.buffer.d.ts +5 -5
  240. package/server/node_modules/@types/node/crypto.d.ts +2 -2
  241. package/server/node_modules/@types/node/http.d.ts +16 -0
  242. package/server/node_modules/@types/node/http2.d.ts +10 -2
  243. package/server/node_modules/@types/node/package.json +2 -2
  244. package/server/node_modules/@types/node/process.d.ts +52 -0
  245. package/server/node_modules/@types/node/quic.d.ts +210 -28
  246. package/server/node_modules/@types/node/sqlite.d.ts +6 -2
  247. package/server/node_modules/@types/node/test.d.ts +36 -0
  248. package/server/node_modules/ansi-regex/index.js +3 -2
  249. package/server/node_modules/ansi-regex/package.json +1 -1
  250. package/server/node_modules/effect/node_modules/uuid/README.md +19 -19
  251. package/server/node_modules/effect/node_modules/uuid/dist/v1.js +7 -3
  252. package/server/node_modules/effect/node_modules/uuid/dist/v7.js +5 -2
  253. package/server/node_modules/effect/node_modules/uuid/dist-node/v1.js +7 -3
  254. package/server/node_modules/effect/node_modules/uuid/dist-node/v7.js +5 -2
  255. package/server/node_modules/effect/node_modules/uuid/package.json +4 -3
  256. package/server/node_modules/gaxios/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  257. package/server/node_modules/gaxios/build/esm/tsconfig.tsbuildinfo +1 -1
  258. package/server/node_modules/gaxios/package.json +3 -3
  259. package/server/node_modules/msgpackr/dist/index-no-eval.cjs +11 -5
  260. package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
  261. package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
  262. package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
  263. package/server/node_modules/msgpackr/dist/index.js +11 -5
  264. package/server/node_modules/msgpackr/dist/index.js.map +1 -1
  265. package/server/node_modules/msgpackr/dist/index.min.js +1 -1
  266. package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
  267. package/server/node_modules/msgpackr/dist/node.cjs +11 -5
  268. package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
  269. package/server/node_modules/msgpackr/dist/test.js +11 -5
  270. package/server/node_modules/msgpackr/dist/test.js.map +1 -1
  271. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +11 -5
  272. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
  273. package/server/node_modules/msgpackr/package.json +1 -1
  274. package/server/node_modules/msgpackr/unpack.js +11 -5
  275. package/server/node_modules/picomatch/lib/parse.js +10 -1
  276. package/server/node_modules/picomatch/lib/scan.js +30 -18
  277. package/server/node_modules/picomatch/package.json +1 -1
  278. package/server/{orphan-proposed-reconciler-BAE5AZ_e.js → orphan-proposed-reconciler-CnP0K2v3.js} +2 -2
  279. package/server/{orphan-proposed-reconciler-cV3URUqk.js → orphan-proposed-reconciler-nFUlquZt.js} +24 -23
  280. package/server/package-lock.json +25 -25
  281. package/server/package.json +1 -1
  282. package/server/{pan-dir-DDd91kMb.js → pan-dir-B4NfzOf3.js} +5 -5
  283. package/server/{deacon-merge-BOGFEV8_.js → parked-residue-8WbU0y1z.js} +188 -69
  284. package/server/{paths-CRLnDgcI.js → paths-rETQhTF2.js} +2 -2
  285. package/server/{pending-lifecycle-claim-CYgMiDAP.js → pending-lifecycle-claim-yAwDuGS4.js} +2 -2
  286. package/server/{pickup-BjJsSX12.js → pickup-Dle6k9Xt.js} +1 -1
  287. package/server/{pipeline-agent-reader-BLc43dVJ.js → pipeline-agent-reader-CeWhQzXC.js} +5 -5
  288. package/server/{pipeline-membership-BHZp_ShY.js → pipeline-membership-BV4hdkHm.js} +1 -1
  289. package/server/{pipeline-membership-5qlRz5Qg.js → pipeline-membership-C9ykcjsn.js} +1 -1
  290. package/server/{pipeline-membership-gather-CGFY1v-y.js → pipeline-membership-gather-Ba0wJNCR.js} +17 -12
  291. package/server/{pipeline-membership-gather-WhRc1yke.js → pipeline-membership-gather-C9E22B2W.js} +1 -1
  292. package/server/{pipeline-notifier-C4fZ2ito.js → pipeline-notifier-B5DPXvnr.js} +1 -1
  293. package/server/{pipeline-notifier-BmsLWM_2.js → pipeline-notifier-p190L97e.js} +2 -2
  294. package/server/{post-merge-lifecycle-worker-KK1RTKRE.js → post-merge-lifecycle-worker-OQoK8Ckg.js} +3 -3
  295. package/server/{post-merge-state-_Lj3LDLh.js → post-merge-state-DFaf7OI1.js} +4 -4
  296. package/server/prd-locations-F2oLSAhy.js +124 -0
  297. package/server/{project-pipelines-CCkebHOu.js → project-pipelines-CUsa6U59.js} +2 -2
  298. package/server/project-repos-BVdi9-ch.js +3 -0
  299. package/server/{project-repos-B4MK48j4.js → project-repos-CsfvLtmr.js} +29 -3
  300. package/server/project-resource-refresh-queue-BehrH4Ai.js +865 -0
  301. package/server/project-resource-refresh-queue-D2110Guc.js +2 -0
  302. package/server/{projects-DvPEAP18.js → projects-BMuEf14J.js} +1 -1
  303. package/server/{prompts-BiS5I2tZ.js → prompts-CKpDt8Jn.js} +2 -2
  304. package/server/providers-Buv2wmFU.js +3 -0
  305. package/server/{providers-DrfK0Ip8.js → providers-CxPKmyif.js} +7 -7
  306. package/server/public/assets/{chunk-BO2N2NFS-GtVe_o56.js → chunk-BO2N2NFS-DZOQVqV1.js} +4 -4
  307. package/server/public/assets/{diagram-OG6HWLK6-BvhcYYHc.js → diagram-OG6HWLK6-oKeXcbO1.js} +1 -1
  308. package/server/public/assets/{dist-CSmUXazd.js → dist-2qPmeRzT.js} +3 -3
  309. package/server/public/assets/{dist-D0ryefak.js → dist-ClBlE-Nm.js} +1 -1
  310. package/server/public/assets/{ganttDiagram-6RSMTGT7-BXA51DzM.js → ganttDiagram-6RSMTGT7-BwdG9fQv.js} +1 -1
  311. package/server/public/assets/{highlighted-body-OFNGDK62-mlV4EpWt.js → highlighted-body-OFNGDK62-BzGNdskQ.js} +1 -1
  312. package/server/public/assets/index-CdPveU3M.css +1 -0
  313. package/server/public/assets/index-Cg6tdZoY.js +860 -0
  314. package/server/public/assets/{linear-BPE7oswm.js → linear-DpEt1TJb.js} +1 -1
  315. package/server/public/assets/mermaid-GHXKKRXX-6KBD_3T_.js +1 -0
  316. package/server/public/assets/{pieDiagram-4H26LBE5-BguGGV3S.js → pieDiagram-4H26LBE5-9BpM4oRJ.js} +1 -1
  317. package/server/public/assets/{prod-aKDYUrXQ.js → prod-CzJiNNEG.js} +4 -4
  318. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bx3i4B6H.js → quadrantDiagram-W4KKPZXB-BXWVAoZx.js} +1 -1
  319. package/server/public/assets/{sankeyDiagram-5OEKKPKP-B5vuLjA4.js → sankeyDiagram-5OEKKPKP-5oxodGEw.js} +1 -1
  320. package/server/public/assets/{xychartDiagram-2RQKCTM6-HPlpkqsN.js → xychartDiagram-2RQKCTM6-BChDrHxZ.js} +1 -1
  321. package/server/public/index.html +2 -2
  322. package/server/pull-requests-CmlandI7.js +2 -0
  323. package/server/{pull-requests-BcHIsFJv.js → pull-requests-T0OV0Vn4.js} +3 -3
  324. package/server/{rally-B1OMtzch.js → rally-CUqj2oIN.js} +3 -3
  325. package/server/rally-DYIn9R2U.js +3 -0
  326. package/server/{rally-api-ShZ4kvn0.js → rally-api-BFPb2oSq.js} +2 -2
  327. package/server/{rally-api-u_vkr5c_.js → rally-api-BoucQG1u.js} +1 -1
  328. package/server/{rally-client-D6Feq1Ka.js → rally-client-16iObny7.js} +5 -5
  329. package/server/{rally-client-DgZvUZqX.js → rally-client-CsqLjLLa.js} +1 -1
  330. package/server/{reap-terminal-sessions-CRfiXLY0.js → reap-terminal-sessions-BaDSNR-k.js} +2 -2
  331. package/server/{reap-terminal-sessions-D7f3zSE9.js → reap-terminal-sessions-DgEIKMhH.js} +2 -2
  332. package/server/{rebuild-stack-CCwKHZb6.js → rebuild-stack-BcBVFJp3.js} +2 -2
  333. package/server/{rebuild-stack-DKxOnkpE.js → rebuild-stack-CyXMrj6K.js} +7 -7
  334. package/server/reconciler-caYiRnPy.js +657 -0
  335. package/server/{reconstruct-cache-BP8UIKt7.js → reconstruct-cache-3JzPOune.js} +7 -7
  336. package/server/{record-By-wp6pg.js → record-DYOg97Iv.js} +1 -1
  337. package/server/{record-update-D23jPU6b.js → record-update-BPqpBu3O.js} +9 -7
  338. package/server/{record-update-ByGtIlUK.js → record-update-CDPEX7BH.js} +1 -1
  339. package/server/{recovery-trip-C4dTl8DO.js → recovery-trip-CpfW6LCJ.js} +43 -10
  340. package/server/{recovery-trip-qloOYOFz.js → recovery-trip-xqKC07Gy.js} +1 -1
  341. package/server/{release-engine-Crc0Tjx-.js → release-engine-C_OOhCaK.js} +5 -5
  342. package/server/{release-set-DDXwbIK7.js → release-set-DOIDz2vw.js} +3 -3
  343. package/server/{remote-oEMfXlwT.js → remote-BTh-sjpX.js} +3 -3
  344. package/server/{remote-agents-Bgtc2nOO.js → remote-agents-DbbN7vSm.js} +6 -6
  345. package/server/{remote-agents-DQVGZVQ9.js → remote-agents-MuXx2gWm.js} +1 -1
  346. package/server/{remote-completion-DxUJ5HKR.js → remote-completion-LcWCpAm2.js} +13 -13
  347. package/server/{remote-CBpLi4Yy.js → remote-xY0B43Ho.js} +3 -3
  348. package/server/{resolver-CuAULbLs.js → resolver-C2QKOf09.js} +2 -2
  349. package/server/{resolver-C8rooxoz.js → resolver-D4nsxfGo.js} +31 -8
  350. package/server/resume-ByUrJUNX.js +3 -0
  351. package/server/{review-agent-7C2w5CzU.js → review-agent-BRBTm1qE.js} +43 -55
  352. package/server/review-agent-Caodi0PX.js +3 -0
  353. package/server/{review-artifacts-BJeEfm2r.js → review-artifacts-DgaDlbO4.js} +6 -6
  354. package/server/{review-convoy-liveness-DfF9eXjI.js → review-convoy-liveness-BBvyuRLC.js} +20 -11
  355. package/server/{review-run-recovery-ZjuDTNhZ.js → review-run-recovery-DCzWMMvE.js} +1 -1
  356. package/server/{review-run-recovery-7BKt2Es0.js → review-run-recovery-THHMKlXJ.js} +3 -3
  357. package/server/{review-status-CUnjjOUu.js → review-status-Bge_3XTR.js} +1 -1
  358. package/server/{review-status-DBnR5t4z.js → review-status-DpniqzPT.js} +113 -44
  359. package/server/{review-status-emit-Cg4tOb8U.js → review-status-emit-D7sM720S.js} +3 -3
  360. package/server/{review-status-enrichment-D-rQshu6.js → review-status-enrichment-PDI4-faj.js} +3 -3
  361. package/server/{review-status-source-DSn0glLa.js → review-status-source-D2PCWS6E.js} +1 -1
  362. package/server/{review-status-source-Ct912fv_.js → review-status-source-Jq0BXmn3.js} +1 -1
  363. package/server/{review-status-sync-B7V_Gg51.js → review-status-sync-C6ZKTI8f.js} +11 -8
  364. package/server/{review-status-sync-YthpOH_q.js → review-status-sync-CvpHWyvR.js} +1 -1
  365. package/server/{review-verdict-feedback-C-dBon_-.js → review-verdict-feedback-B2ojHFH5.js} +8 -8
  366. package/server/{review-verdict-feedback-DqXTuJk8.js → review-verdict-feedback-tyMoLT2L.js} +1 -1
  367. package/server/{review-verdict-writer-CKaJWp75.js → review-verdict-writer-Cy_1pnIj.js} +7 -7
  368. package/server/{review-verdict-writer-jldSh3Bm.js → review-verdict-writer-DjrJ64eS.js} +1 -1
  369. package/server/{rollup-DZwH4CLs.js → rollup-Cp0KEoOu.js} +1 -1
  370. package/server/{rollup-QCwYcBdP.js → rollup-DU3xBQu2.js} +8 -8
  371. package/server/{scanner-2aHeLC3W.js → scanner-BFKG3Gxv.js} +8 -8
  372. package/server/{search-DwHYaj66.js → search-DhtKwbBC.js} +2 -2
  373. package/server/{secret-redaction-B5G1xZ3k.js → secret-redaction-DLZ-VqHq.js} +1 -1
  374. package/server/{sequence-io-POKWdusG.js → sequence-io-C-Q19Jez.js} +4 -4
  375. package/server/{sequencer-agent-DS00KHVm.js → sequencer-agent-eN2P2lDz.js} +6 -6
  376. package/server/server.js +1499 -1350
  377. package/server/{service-BLb_CyPL.js → service-CThO0Sar.js} +80 -774
  378. package/server/{session-fork-DcTzVwex.js → session-fork-ZYTHtpBh.js} +2 -2
  379. package/server/settings-ByDRfuuE.js +2 -0
  380. package/server/{settings-Clw8UVNs.js → settings-CTywpFw5.js} +2 -2
  381. package/server/{settings-B9-H2K_E.js → settings-nAT-eK56.js} +3 -3
  382. package/server/{shadow-engineering-C6oO_PiR.js → shadow-engineering-BHZKPJhq.js} +3 -3
  383. package/server/{shadow-state-CEGrrECe.js → shadow-state-BTLi4Axs.js} +2 -2
  384. package/server/{shadow-state-e7250VUx.js → shadow-state-CZ_LnPsi.js} +1 -1
  385. package/server/{shadow-utils-xFk2Wusb.js → shadow-utils-CPLlPHdn.js} +2 -2
  386. package/server/{ship-log-7BnQHuKU.js → ship-log-D-CphNZx.js} +1 -1
  387. package/server/{ship-record-CwUX6Afo.js → ship-record-BaBla0l_.js} +7 -7
  388. package/server/{ship-record-BgUPnpT0.js → ship-record-BlvX8-xv.js} +1 -1
  389. package/server/{ship-status-Ce3_3edi.js → ship-status-rQbPQBsF.js} +2 -2
  390. package/server/{smart-compaction-BmfIi3oL.js → smart-compaction-CUXn8mfX.js} +1 -1
  391. package/server/{smart-compaction-Dy0gw1VH.js → smart-compaction-D1CNGdZx.js} +7 -7
  392. package/server/{spawn-planning-session-nH3b4Drz.js → spawn-planning-session-DCmO6COk.js} +19 -19
  393. package/server/{spawn-planning-session-CfhxRJoY.js → spawn-planning-session-DfEWyrVV.js} +2 -2
  394. package/server/{specialist-completion-CC1XJbTx.js → specialist-completion-BMv3K54P.js} +1 -1
  395. package/server/{specialist-context-cHwpcXSh.js → specialist-context-C1-CfYQb.js} +5 -5
  396. package/server/{specialist-handoff-logger-GqnGSYoJ.js → specialist-handoff-logger-BDKoz5Z9.js} +2 -2
  397. package/server/{specialist-logs-5OTnrV91.js → specialist-logs-BJQFkpdG.js} +3 -3
  398. package/server/specialists-CYt1U3Zm.js +4 -0
  399. package/server/{specialists-8LcQi9Np.js → specialists-D6MUU31Q.js} +21 -272
  400. package/server/{specialists-DocAK-7A.js → specialists-DhS79T9v.js} +369 -691
  401. package/server/{specialists-xXcJHAyg.js → specialists-Dx0zRTxX.js} +1 -1
  402. package/server/specialists-registry-BRLCi61y.js +3 -0
  403. package/server/specialists-registry-Bng0OFGH.js +277 -0
  404. package/server/specs-oRGyfz6C.js +3 -0
  405. package/server/{src-C2TAxwki.js → src-C7gGe4KU.js} +6 -6
  406. package/server/{src-DudQNYVw.js → src-CdwN6WY6.js} +344 -7
  407. package/server/{src-DUVvEA8Q.js → src-DMosbuSJ.js} +3 -3
  408. package/server/{stack-health-DKT4ySnA.js → stack-health-BKfNaqMm.js} +3 -3
  409. package/server/{stack-health-CbyiYS9H.js → stack-health-Bz711z1Y.js} +1 -1
  410. package/server/{stale-task-claims-PzFee70R.js → stale-task-claims-DMRLb5R2.js} +5 -5
  411. package/server/{staleness-D8UTEXV5.js → staleness-CxZaIhrn.js} +1 -1
  412. package/server/{staleness-BjOAq9-d.js → staleness-r_dkMyMG.js} +1 -1
  413. package/server/{stall-sweeper-DOyIfeLR.js → stall-sweeper-CBWqSWV2.js} +8 -8
  414. package/server/{state-home-DhAZlk5k.js → state-home-DhsMqg8W.js} +2 -2
  415. package/server/{state-mapping-BVSs84bO.js → state-mapping-D2yC81Vy.js} +1 -1
  416. package/server/{state-migrate-CJKEwpB0.js → state-migrate-C2Ouyd6e.js} +6 -6
  417. package/server/{state-mirror-Do7pag7W.js → state-mirror-BPXciz84.js} +3 -3
  418. package/server/stuck-remediation-DALieAkx.js +2 -0
  419. package/server/stuck-remediation-kta3KN7c.js +774 -0
  420. package/server/{substrate-bug-weights-service-BTNjHBnl.js → substrate-bug-weights-service-D_ICP7TI.js} +3 -3
  421. package/server/{summary-fork-CvB7Oyq9.js → summary-fork-CojrFKb6.js} +2 -2
  422. package/server/{summary-fork-CZ88rhVx.js → summary-fork-DhhaFhxZ.js} +113 -30
  423. package/server/supervisor/{pane-composer-BaLLspSj.js → pane-composer-CoiVkGIt.js} +8 -1
  424. package/server/supervisor/{paths-D6XUcR_g.js → paths-DTGbtcaP.js} +8 -4
  425. package/server/supervisor/pty-supervisor.js +3 -3
  426. package/server/supervisor/{pty-token-DjjHxoCq.js → pty-token-GVqnvU3U.js} +2 -2
  427. package/server/supervisor-DSSWo4M2.js +2 -0
  428. package/server/{supervisor-D4v0WfiQ.js → supervisor-DqH-laVL.js} +4 -4
  429. package/server/{swarm-readiness-D8R-LWX5.js → swarm-readiness-LF8ZF_hc.js} +3 -3
  430. package/server/{synthesis-verdict-N5Z11pg7.js → synthesis-verdict-CGFF8uQI.js} +2 -2
  431. package/server/{synthesis-verdict-B6wvLGcA.js → synthesis-verdict-DSoOFUIV.js} +1 -1
  432. package/server/{system-prerequisites-BbGZ_WHF.js → system-prerequisites-Lsx0jUUV.js} +2 -2
  433. package/server/{teardown-workspace-CYend-KY.js → teardown-workspace-DMwomEG1.js} +16 -16
  434. package/server/{test-agent-queue-BUtWhNcc.js → test-agent-queue-Cu0D6BYe.js} +6 -6
  435. package/server/{test-verdict-BWm3hgDj.js → test-verdict-9mvl7pQn.js} +1 -1
  436. package/server/{test-verdict-BWtRmdiR.js → test-verdict-oNSv1rVr.js} +2 -2
  437. package/server/{tldr-daemon-CneJ24eL.js → tldr-daemon-CRSAkhBx.js} +1 -1
  438. package/server/{tldr-daemon-CMVBT4kT.js → tldr-daemon-McqCk2X7.js} +2 -2
  439. package/server/tmux-CYucGrTl.js +4 -0
  440. package/server/{tmux-BqXzRuaH.js → tmux-wnT_hg-s.js} +91 -19
  441. package/server/{token-CO3INKbh.js → token-BdfZLRg1.js} +2 -2
  442. package/server/{token-util-DyJJyX_B.js → token-util-Crcay9j_.js} +1 -1
  443. package/server/token-util-DfUS3Lpp.js +3 -0
  444. package/server/{tracker-config-DVzhaUxO.js → tracker-config-tfAOWgng.js} +2 -2
  445. package/server/{tracker-utils-xnVJVrrO.js → tracker-utils-Dbg_pVZg.js} +2 -2
  446. package/server/{traefik-connect-A5k54mCv.js → traefik-connect-DoQvQ6oJ.js} +1 -1
  447. package/server/{tunnel-DauSR-rs.js → tunnel-B1MNIgkL.js} +1 -1
  448. package/server/{tunnel-CwOnS-PB.js → tunnel-skW68j9B.js} +3 -3
  449. package/server/{typed-errors-B-gfU2RB.js → typed-errors-CZ3GFBvo.js} +1 -1
  450. package/server/{typed-errors-DzC4zXbI.js → typed-errors-DXqf3RnP.js} +1 -1
  451. package/server/{types-DjpLVpsj.js → types-PW4zkxCM.js} +1 -1
  452. package/server/{types-DbxY2QB6.js → types-pLpbsNto.js} +1 -1
  453. package/server/{uat-failure-feedback-BVqsWlrr.js → uat-failure-feedback-ly8ZwtfC.js} +5 -5
  454. package/server/{uat-promote-verification-DmG097QS.js → uat-promote-verification-BBaMwfdc.js} +5 -5
  455. package/server/{uat-train-DVUNW03P.js → uat-train-BBEiYSep.js} +0 -0
  456. package/server/{uat-train-COSy-vEX.js → uat-train-D7Ran2FB.js} +1 -1
  457. package/server/{validate-Dvv83iBx.js → validate-BYcBcBwg.js} +3 -3
  458. package/server/{validation-DlHafKzu.js → validation-BfG2jW5C.js} +9 -6
  459. package/server/{validation-BdCjzWLN.js → validation-nSrYiYvA.js} +1 -1
  460. package/server/{verification-artifact-CaSbxUVg.js → verification-artifact-Cmhgq4b_.js} +1 -1
  461. package/server/{verification-artifact-0Zku8N-W.js → verification-artifact-DglwaHke.js} +1 -1
  462. package/server/{verification-runner-DwP2fUEF.js → verification-runner-BEq5ZF-h.js} +53 -27
  463. package/server/{verification-runner-C6wdZda2.js → verification-runner-CFjAuv9u.js} +1 -1
  464. package/server/{vtt-parser-luerJpYT.js → vtt-parser-Va--tv27.js} +1 -1
  465. package/server/work-agent-prompt-BnhKNAg7.js +3 -0
  466. package/server/{work-agent-prompt--9AWNYwZ.js → work-agent-prompt-CaD2ue8m.js} +14 -14
  467. package/server/{work-agent-start-BNQO65W7.js → work-agent-start-0nJ-6UeA.js} +2 -2
  468. package/server/{work-agent-start-DkzseQFl.js → work-agent-start-D8NEN5KD.js} +1 -1
  469. package/server/workflows-BtHRlFIm.js +2 -0
  470. package/server/{workflows-BYwR2aIN.js → workflows-C7mxM1qc.js} +114 -41
  471. package/server/{workspace-iTnTycOB.js → workspace-BAhMgMaO.js} +3 -3
  472. package/server/{workspace-B-QJa3Ps.js → workspace-Dbqv9ehn.js} +1 -1
  473. package/server/{workspace-anchor-drift-CHiGg8iu.js → workspace-anchor-drift-B_3kyyxJ.js} +4 -4
  474. package/server/{workspace-anchor-drift-DTt6h2Em.js → workspace-anchor-drift-Bpa3xoni.js} +1 -1
  475. package/server/{workspace-config-D0CavVtz.js → workspace-config-D-bNq2CF.js} +1 -1
  476. package/server/{workspace-manager-5BKPV6SY.js → workspace-manager-BrbX90Rm.js} +1 -1
  477. package/server/{workspace-manager-W1OnbvU5.js → workspace-manager-CM8RCrSc.js} +17 -17
  478. package/server/{workspace-metadata-tbbevEmP.js → workspace-metadata-BEOwJSdK.js} +1 -1
  479. package/server/{workspace-metadata-dJhXvZGQ.js → workspace-metadata-Cu6yfxBS.js} +2 -2
  480. package/server/{workspaces-BlpbOPZ7.js → workspaces-C7LAuZfe.js} +140 -709
  481. package/sync-sources/dev-skills/pan-style-guide/SKILL.md +90 -15
  482. package/sync-sources/hooks/linear-mcp-auth-hook +6 -1
  483. package/sync-sources/rules/agent-message-delivery.md +21 -14
  484. package/sync-sources/rules/handoff-isolate-cwd.md +4 -4
  485. package/sync-sources/rules/pan-handoff-focus-limit.md +14 -5
  486. package/sync-sources/rules/ste-writing.md +17 -0
  487. package/sync-sources/rules/work-agents-via-pan.md +2 -1
  488. package/sync-sources/rules/writing-style.md +3 -2
  489. package/sync-sources/skills/{skill-creator → claude-skill-creator}/SKILL.md +1 -1
  490. package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/init_skill.py +1 -1
  491. package/sync-sources/skills/{skill-creator → claude-skill-creator}/scripts/package_skill.py +1 -1
  492. package/sync-sources/skills/pan-gauntlet-loop/SKILL.md +230 -0
  493. package/sync-sources/skills/pan-gauntlet-loop/assets/PROMPT.template.md +92 -0
  494. package/sync-sources/skills/pan-gauntlet-loop/assets/REFERENCE-BAR.template.md +53 -0
  495. package/sync-sources/skills/pan-gauntlet-loop/assets/STYLE.template.md +41 -0
  496. package/sync-sources/skills/pan-gauntlet-loop/assets/gauntlet-index.html +237 -0
  497. package/sync-sources/skills/pan-gauntlet-loop/references/domains.md +106 -0
  498. package/sync-sources/skills/pan-handoff/SKILL.md +24 -6
  499. package/sync-sources/skills/pan-help/SKILL.md +1 -1
  500. package/sync-sources/skills/pan-peer-review/SKILL.md +3 -3
  501. package/sync-sources/skills/pan-restart/SKILL.md +6 -3
  502. package/sync-sources/skills/pan-start/SKILL.md +3 -0
  503. package/sync-sources/skills/pan-swarm/SKILL.md +32 -44
  504. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  505. package/server/activity-logger-BejO16Am.js +0 -3
  506. package/server/agent-state-DH_-Jkua.js +0 -3
  507. package/server/agents-megfmQHM.js +0 -3
  508. package/server/archive-planning-C-H9cM_J.js +0 -2
  509. package/server/build-info-PQlh_Rhb.js +0 -2
  510. package/server/cli-TaZspPHS.js +0 -2
  511. package/server/cliproxy-36ncAXlu.js +0 -3
  512. package/server/context-layers-CF6zHws4.js +0 -4
  513. package/server/conversations-AnGJ5rtX.js +0 -3
  514. package/server/deacon-BEH-IY0v.js +0 -5
  515. package/server/deacon-swarm-BHX-kR1b.js +0 -2
  516. package/server/deacon-swarm-BiLfNm_v.js +0 -1522
  517. package/server/dead-end-trip-BWpDg1Qd.js +0 -2
  518. package/server/delivery-cJM6zRjJ.js +0 -3
  519. package/server/deploy-queue-CmVBZEja.js +0 -2
  520. package/server/dist-VKBfkdi7.js +0 -3
  521. package/server/durable-review-pipeline-DgcVCYDL.js +0 -3
  522. package/server/factory-D4V2wd_V.js +0 -717
  523. package/server/forge-CrP1L3i6.js +0 -2
  524. package/server/hume-1ubD_6O7.js +0 -3
  525. package/server/inspect-agent-CfxERkNt.js +0 -2
  526. package/server/merge-ops-DtHx17Vd.js +0 -2
  527. package/server/merge-rebase-BvB4UuNS.js +0 -2
  528. package/server/project-repos-BJiShUsN.js +0 -3
  529. package/server/providers-CStNGwze.js +0 -3
  530. package/server/public/assets/index-BFEwfmqX.js +0 -860
  531. package/server/public/assets/index-_USwyTAT.css +0 -1
  532. package/server/public/assets/mermaid-GHXKKRXX-Dsln95SK.js +0 -1
  533. package/server/pull-requests-C1Cqp2yo.js +0 -2
  534. package/server/rally-CjayjUIl.js +0 -3
  535. package/server/resume-D7JuMCRQ.js +0 -3
  536. package/server/review-agent-BUNTVJK2.js +0 -2
  537. package/server/settings-DBWB1gsG.js +0 -2
  538. package/server/specialists-D8gsOCwh.js +0 -3
  539. package/server/specs-BqkrRnU9.js +0 -3
  540. package/server/stuck-remediation-Di5JYkoo.js +0 -1164
  541. package/server/stuck-remediation-TNM1VhZb.js +0 -2
  542. package/server/supervisor-DX8VsPnb.js +0 -2
  543. package/server/tmux-CqNapnrr.js +0 -4
  544. package/server/token-util-Bu8bPF9f.js +0 -3
  545. package/server/workflows-Cf4LAnhg.js +0 -2
@@ -0,0 +1,865 @@
1
+ import { On as resolveProjectFromIssueSync, fn as init_projects, vn as listProjectsSync } from "./config-yaml-D60AnTIu.js";
2
+ import { o as init_resolver, u as listWorkspaces } from "./resolver-C2QKOf09.js";
3
+ import { r as compareIssueIds, t as init_src } from "./src-CdwN6WY6.js";
4
+ import { An as init_runtime_census, On as getRuntimeCensus, U as getAgentRuntimeState, q as init_agents } from "./agent-state-FABw8neJ.js";
5
+ import { A as init_conversations, P as listConversations } from "./conversations-nS6QgYpD.js";
6
+ import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME } from "./types-pLpbsNto.js";
7
+ import { C as init_specs, S as findSpecByIssue } from "./io-BCtZoXHo.js";
8
+ import { t as init_pan_dir } from "./pan-dir-B4NfzOf3.js";
9
+ import { r as resolveMissingIssueTitles, t as init_issue_title_fallback } from "./issue-title-fallback-B91iD66g.js";
10
+ import { m as loadReadyForMergeFlags, p as init_review_status } from "./review-status-DpniqzPT.js";
11
+ import { A as createSettledTtlPromiseCache, j as init_concurrency, k as createPromiseConcurrencyLimiter } from "./github-app-BlMSzSTw.js";
12
+ import { t as resolveAgentGitInfo } from "./git-info-DMOSfJ9I.js";
13
+ import { n as findDraftPrd } from "./prd-locations-F2oLSAhy.js";
14
+ import { a as gatherProjectLensSignals, g as parseIssueIdFromTextSync, h as init_resource_utils, n as PipelineMembershipUnavailableError, s as init_pipeline_membership_gather, u as listOpenPullRequestsSnapshot } from "./pipeline-membership-gather-Ba0wJNCR.js";
15
+ import { n as init_pipeline_membership, r as resolvePipelineMembership } from "./pipeline-membership-BV4hdkHm.js";
16
+ import { basename, join } from "node:path";
17
+ import { Effect } from "effect";
18
+ import { readdir, stat } from "node:fs/promises";
19
+ import { execFile } from "node:child_process";
20
+ import { promisify } from "node:util";
21
+ //#region services/resource-discovery-shared.ts
22
+ init_projects();
23
+ init_src();
24
+ init_conversations();
25
+ init_runtime_census();
26
+ const execFileAsync$1 = promisify(execFile);
27
+ async function loadTrackerIssues() {
28
+ const map = /* @__PURE__ */ new Map();
29
+ try {
30
+ const { getSharedIssueService } = await import("./issue-service-singleton-1Q0ER8Yc.js");
31
+ const issues = (await getSharedIssueService()).getIssues();
32
+ for (const issue of issues) if (issue.identifier) map.set(issue.identifier.toUpperCase(), issue);
33
+ } catch {}
34
+ return map;
35
+ }
36
+ async function loadDockerContainers() {
37
+ try {
38
+ const { stdout } = await execFileAsync$1("docker", [
39
+ "ps",
40
+ "--format",
41
+ "{{.Names}}"
42
+ ], {
43
+ encoding: "utf-8",
44
+ timeout: 5e3
45
+ });
46
+ return stdout.split("\n").map((line) => line.trim()).filter(Boolean);
47
+ } catch {
48
+ return [];
49
+ }
50
+ }
51
+ async function loadActiveRemoteAgentStates() {
52
+ try {
53
+ const { listActiveRemoteAgentStates } = await import("./remote-agents-MuXx2gWm.js");
54
+ return listActiveRemoteAgentStates();
55
+ } catch {
56
+ return [];
57
+ }
58
+ }
59
+ async function captureSharedResourceSignals() {
60
+ const [trackerIssues, runtimeCensus, dockerContainers, remoteAgentStates] = await Promise.all([
61
+ loadTrackerIssues(),
62
+ getRuntimeCensus(),
63
+ loadDockerContainers(),
64
+ loadActiveRemoteAgentStates()
65
+ ]);
66
+ const tmuxSessions = [...runtimeCensus.sessionNames];
67
+ let conversations = [];
68
+ try {
69
+ conversations = listConversations();
70
+ } catch {}
71
+ return {
72
+ trackerIssues,
73
+ tmuxSessions,
74
+ dockerContainers,
75
+ conversations,
76
+ remoteAgentStates
77
+ };
78
+ }
79
+ //#endregion
80
+ //#region review-status.ts
81
+ init_resolver();
82
+ init_specs();
83
+ init_pan_dir();
84
+ init_agents();
85
+ init_concurrency();
86
+ init_resource_utils();
87
+ init_pipeline_membership_gather();
88
+ init_pipeline_membership();
89
+ init_review_status();
90
+ //#endregion
91
+ //#region services/pipeline-membership.ts
92
+ init_issue_title_fallback();
93
+ const PIPELINE_MEMBERSHIP_TTL_MS = 3e4;
94
+ function createPipelineMembershipService(deps = {
95
+ gather: gatherProjectLensSignals,
96
+ now: () => Date.now()
97
+ }) {
98
+ const cachedGather = createSettledTtlPromiseCache(PIPELINE_MEMBERSHIP_TTL_MS, deps.now);
99
+ const service = async (project) => cachedGather(project.path, () => deps.gather(project).then((signals) => signals.map(resolvePipelineMembership)));
100
+ service.invalidate = (projectPath) => cachedGather.invalidate(projectPath);
101
+ return service;
102
+ }
103
+ const getProjectPipelineMembership = createPipelineMembershipService();
104
+ const membershipSnapshots = /* @__PURE__ */ new Map();
105
+ const scheduleMembershipRefresh = createPromiseConcurrencyLimiter(3);
106
+ function refreshMembershipSnapshot(project, snapshot, getMembership, now) {
107
+ if (snapshot.refresh) return snapshot.refresh;
108
+ snapshot.refresh = scheduleMembershipRefresh(() => getMembership(project)).then((value) => {
109
+ snapshot.value = value;
110
+ snapshot.refreshedAt = now();
111
+ snapshot.lastError = void 0;
112
+ snapshot.lastErrorReason = void 0;
113
+ snapshot.lastErrorAt = void 0;
114
+ }).catch((error) => {
115
+ snapshot.lastError = error instanceof Error ? error.message : String(error);
116
+ snapshot.lastErrorReason = error instanceof PipelineMembershipUnavailableError ? error.reason : "gather_failed";
117
+ snapshot.lastErrorAt = now();
118
+ console.warn(`[pipeline-membership] refresh failed for ${project.name ?? project.path}; keeping last-good snapshot:`, snapshot.lastError);
119
+ }).finally(() => {
120
+ snapshot.refresh = void 0;
121
+ });
122
+ return snapshot.refresh;
123
+ }
124
+ /** Read the latest successful snapshots without scheduling tracker or git work. */
125
+ function readPipelineMembershipSnapshotsForProjects(projects) {
126
+ return projects.map((project) => {
127
+ const snapshot = membershipSnapshots.get(project.path);
128
+ if (snapshot?.refreshedAt) return {
129
+ project,
130
+ memberships: snapshot.value
131
+ };
132
+ return {
133
+ project,
134
+ error: /* @__PURE__ */ new Error(snapshot?.lastError ? `Pipeline membership refresh failed: ${snapshot.lastError}` : "Pipeline membership snapshot is loading"),
135
+ unavailableReason: snapshot?.lastErrorReason
136
+ };
137
+ });
138
+ }
139
+ /**
140
+ * PAN-2893 — event-driven refresh. Invalidate the per-project TTL cache and
141
+ * force a snapshot re-gather NOW for the given projects, so agent lifecycle
142
+ * changes reach membership consumers without waiting out the 5-minute TTL.
143
+ * Refresh failures keep the last good snapshot (same policy as TTL refreshes).
144
+ */
145
+ async function refreshMembershipSnapshotsForProjects(projects, getMembership = getProjectPipelineMembership, now = () => Date.now()) {
146
+ await Promise.all(projects.map(async (project) => {
147
+ getMembership.invalidate(project.path);
148
+ const snapshot = membershipSnapshots.get(project.path) ?? {
149
+ value: [],
150
+ refreshedAt: 0
151
+ };
152
+ membershipSnapshots.set(project.path, snapshot);
153
+ const inFlight = snapshot.refresh;
154
+ if (inFlight) {
155
+ await inFlight;
156
+ getMembership.invalidate(project.path);
157
+ }
158
+ await refreshMembershipSnapshot(project, snapshot, getMembership, now);
159
+ }));
160
+ }
161
+ function summarizePipelineMembership(membership) {
162
+ return {
163
+ available: true,
164
+ inPipeline: membership.inPipeline,
165
+ bucket: membership.bucket,
166
+ labelDrift: membership.labelDrift
167
+ };
168
+ }
169
+ function unavailablePipelineMembership() {
170
+ return {
171
+ available: false,
172
+ inPipeline: false,
173
+ bucket: "clean_terminal",
174
+ labelDrift: null
175
+ };
176
+ }
177
+ //#endregion
178
+ //#region services/resource-discovery.ts
179
+ init_pipeline_membership();
180
+ init_pipeline_membership_gather();
181
+ const execFileAsync = promisify(execFile);
182
+ const RECENT_ACTIVITY_WINDOW_MS = 5e3;
183
+ const projectResourceSnapshots = /* @__PURE__ */ new Map();
184
+ let cachedResourceIssues = null;
185
+ let cachedDetailedResourceIssues = null;
186
+ function projectPrefixes(project) {
187
+ const prefixes = /* @__PURE__ */ new Set();
188
+ if (project.config.issue_prefix) prefixes.add(project.config.issue_prefix.toUpperCase());
189
+ for (const prefix of project.config.issue_prefixes ?? []) prefixes.add(prefix.toUpperCase());
190
+ if (prefixes.size === 0) prefixes.add(project.key.toUpperCase().replace(/-/g, ""));
191
+ return [...prefixes];
192
+ }
193
+ function deriveStateLabel(issue, hasTmux, hasFreshHeartbeat, membership) {
194
+ const trackerState = issue.trackerState ?? "";
195
+ if (membership?.bucket === "post_merge_limbo") return "Merged — Needs Close-Out";
196
+ if (membership?.lenses.L3_issueOpen === false) return hasTmux ? "Closed" : "Done";
197
+ if (issue.readyForMerge) return "In Review";
198
+ if (trackerState === "done" || trackerState === "closed" || trackerState === "canceled") return hasTmux ? "Closed" : "Done";
199
+ if (trackerState === "in_review") return "In Review";
200
+ if (trackerState === "in_progress") return "In Progress";
201
+ if (hasTmux && (issue.agentStatus === "active" || hasFreshHeartbeat)) return "In Progress";
202
+ if (issue.agentStatus === "suspended") return "Suspended";
203
+ if (issue.hasPrd && !issue.hasState) return "Planning";
204
+ if (issue.hasState) return "Has Context";
205
+ if (issue.resourceSources.has("workspace") || issue.resourceSources.has("branch")) return "Allocated";
206
+ return "Idle";
207
+ }
208
+ function sortPullRequests(prs) {
209
+ return [...prs].sort((a, b) => {
210
+ if (a.isDraft !== b.isDraft) return a.isDraft ? 1 : -1;
211
+ return a.number - b.number;
212
+ });
213
+ }
214
+ function summarizeResourceDetails(details) {
215
+ return {
216
+ hasWorkspace: details.workspacePath !== null,
217
+ localBranchCount: details.localBranches.length,
218
+ remoteBranchCount: details.remoteBranches.length,
219
+ tmuxSessionCount: details.tmuxSessions.length,
220
+ prs: sortPullRequests(details.prs).map((pr) => ({
221
+ number: pr.number,
222
+ title: pr.title,
223
+ url: pr.url,
224
+ state: pr.state,
225
+ isDraft: pr.isDraft
226
+ })),
227
+ hasXbrief: details.xbriefPath !== null,
228
+ hasTasks: details.tasksPath !== null,
229
+ hasPrd: details.prdPath !== null,
230
+ dockerContainerCount: details.dockerContainers.length,
231
+ actualBranch: details.actualBranch,
232
+ branchDrifted: details.branchDrifted,
233
+ branchAheadOfMain: details.branchAheadOfMain,
234
+ workspaceMissing: details.workspaceMissing,
235
+ remoteAgent: details.remoteAgent,
236
+ conversations: details.conversations.map((conv) => ({
237
+ id: conv.id,
238
+ name: conv.name,
239
+ title: conv.title,
240
+ status: conv.status
241
+ }))
242
+ };
243
+ }
244
+ function summarizeResourceDetailIdentifiers(details) {
245
+ return {
246
+ workspacePaths: details.workspacePath ? [details.workspacePath] : [],
247
+ localBranchNames: [...details.localBranches].sort(),
248
+ remoteBranchNames: [...details.remoteBranches].sort(),
249
+ tmuxSessionNames: [...details.tmuxSessions].sort(),
250
+ prs: sortPullRequests(details.prs).map((pr) => ({
251
+ number: pr.number,
252
+ title: pr.title,
253
+ state: pr.state,
254
+ isDraft: pr.isDraft
255
+ })),
256
+ dockerContainerNames: [...details.dockerContainers].sort()
257
+ };
258
+ }
259
+ function hasRecentActivity(lastActivity) {
260
+ return lastActivity !== null && Number.isFinite(lastActivity) && Date.now() - lastActivity < RECENT_ACTIVITY_WINDOW_MS;
261
+ }
262
+ function isLiveResource(issue) {
263
+ return issue.resourceDetails.remoteAgent !== null || issue.resourceDetails.tmuxSessions.length > 0 || issue.resourceDetails.dockerContainers.length > 0 || hasOpenPr(issue);
264
+ }
265
+ function isActiveTrackerState(state) {
266
+ return state === "in_progress" || state === "in_review" || state === "started";
267
+ }
268
+ function isTerminalTrackerState(state) {
269
+ return state === "closed" || state === "done" || state === "canceled" || state === "completed";
270
+ }
271
+ function hasOpenPr(issue) {
272
+ return issue.resourceDetails.prs.some((pr) => pr.state === "OPEN" || pr.state === "open");
273
+ }
274
+ function shouldLoadReviewStatus(issue) {
275
+ return issue.resourceSources.size > 0 && (!isTerminalTrackerState(issue.trackerState) || hasOpenPr(issue)) && (isLiveResource(issue) || isActiveTrackerState(issue.trackerState) && issue.branch != null);
276
+ }
277
+ /**
278
+ * tmux session-name prefixes that map a session to its issue in the Command Deck
279
+ * tree. `strike-` MUST be included (PAN-1682): strike sessions are named
280
+ * `strike-<issue>` and a strike issue is typically `todo` (not an active tracker
281
+ * state), so without registering the tmux resource the issue is filtered out of
282
+ * the tree entirely. Keep this list in sync with the agent-session prefixes the
283
+ * dashboard recognizes elsewhere (e.g. routes/agents.ts).
284
+ */
285
+ const DISCOVERABLE_SESSION_PREFIXES = [
286
+ "agent-",
287
+ "planning-",
288
+ "specialist-",
289
+ "review-",
290
+ "strike-"
291
+ ];
292
+ function isDiscoverableAgentSession(sessionName) {
293
+ return DISCOVERABLE_SESSION_PREFIXES.some((prefix) => sessionName.startsWith(prefix));
294
+ }
295
+ async function loadOpenPullRequests(projects) {
296
+ const pullRequests = /* @__PURE__ */ new Map();
297
+ await Promise.all(projects.map(async (project) => {
298
+ if (!project.config.github_repo) return;
299
+ const [owner, repo] = project.config.github_repo.split("/");
300
+ if (!owner || !repo) return;
301
+ try {
302
+ const prs = await listOpenPullRequestsSnapshot(owner, repo);
303
+ for (const row of prs) {
304
+ if (row.number === void 0 || row.title === void 0 || row.url === void 0 || row.state === void 0 || row.isDraft === void 0 || row.baseRefName === void 0) continue;
305
+ const pr = {
306
+ number: row.number,
307
+ title: row.title,
308
+ url: row.url,
309
+ state: row.state,
310
+ isDraft: row.isDraft,
311
+ headRefName: row.headRefName,
312
+ baseRefName: row.baseRefName
313
+ };
314
+ const issueId = parseIssueIdFromTextSync(pr.headRefName);
315
+ if (!issueId) continue;
316
+ const existing = pullRequests.get(issueId) ?? [];
317
+ existing.push(pr);
318
+ pullRequests.set(issueId, existing);
319
+ }
320
+ } catch {}
321
+ }));
322
+ for (const [issueId, prs] of pullRequests) pullRequests.set(issueId, sortPullRequests(prs));
323
+ return pullRequests;
324
+ }
325
+ const PROJECT_BRANCH_PATTERNS = [
326
+ "refs/heads/feature/*",
327
+ "refs/remotes/origin/feature/*",
328
+ "refs/heads/bypass/*",
329
+ "refs/remotes/origin/bypass/*"
330
+ ];
331
+ async function loadProjectBranchSnapshot(projectPath) {
332
+ const run = (extraArgs = []) => execFileAsync("git", [
333
+ "for-each-ref",
334
+ "--format=%(refname:short)",
335
+ ...extraArgs,
336
+ ...PROJECT_BRANCH_PATTERNS
337
+ ], {
338
+ cwd: projectPath,
339
+ encoding: "utf-8",
340
+ timeout: 1e4
341
+ }).catch(() => ({ stdout: "" }));
342
+ const [allRefs, unmergedRefs] = await Promise.all([run(), run(["--no-merged=main"])]);
343
+ const branches = allRefs.stdout.split("\n").map((line) => line.trim()).filter(Boolean);
344
+ const ahead = new Set(unmergedRefs.stdout.split("\n").map((line) => line.trim()).filter(Boolean));
345
+ return {
346
+ local: branches.filter((branch) => !branch.startsWith("origin/")),
347
+ remote: branches.filter((branch) => branch.startsWith("origin/")),
348
+ ahead
349
+ };
350
+ }
351
+ async function scanWorkspace(workspacesDir, workspaceName) {
352
+ const workspacePath = join(workspacesDir, workspaceName);
353
+ const projectRoot = join(workspacesDir, "..");
354
+ const workspaceEntries = new Set(await readdir(workspacePath).catch(() => []));
355
+ const panEntries = workspaceEntries.has(".pan") ? new Set(await readdir(join(workspacePath, PAN_DIRNAME)).catch(() => [])) : /* @__PURE__ */ new Set();
356
+ const issueMatch = workspaceName.match(/^feature-([a-z]+-\d+)$/i);
357
+ const issueId = issueMatch ? issueMatch[1].toUpperCase() : null;
358
+ const specEntry = issueId ? await Effect.runPromise(findSpecByIssue(projectRoot, issueId)).catch(() => null) : null;
359
+ const xbriefPath = specEntry ? specEntry.path : null;
360
+ let xbriefMtime = null;
361
+ if (xbriefPath) try {
362
+ xbriefMtime = (await stat(xbriefPath)).mtimeMs;
363
+ } catch {
364
+ xbriefMtime = null;
365
+ }
366
+ return {
367
+ workspacePath,
368
+ hasPlanning: workspaceEntries.has(PAN_DIRNAME),
369
+ hasPrd: panEntries.has("prd.md"),
370
+ hasState: panEntries.has(PAN_CONTINUE_FILENAME),
371
+ hasXbrief: xbriefPath !== null,
372
+ xbriefPath,
373
+ xbriefMtime,
374
+ hasTasks: xbriefPath !== null
375
+ };
376
+ }
377
+ async function computeResourceAllocatedIssues(projectConfigs, sharedSignals) {
378
+ const registeredProjects = listProjectsSync();
379
+ const projects = projectConfigs.map((config) => registeredProjects.find((entry) => entry.config.path === config.path) ?? {
380
+ key: config.name ?? config.path,
381
+ config
382
+ });
383
+ const { trackerIssues, tmuxSessions, dockerContainers, conversations, remoteAgentStates } = sharedSignals ?? await captureSharedResourceSignals();
384
+ const pullRequests = await loadOpenPullRequests(projects);
385
+ const issueMap = /* @__PURE__ */ new Map();
386
+ const projectByPrefix = /* @__PURE__ */ new Map();
387
+ for (const project of projects) for (const prefix of projectPrefixes(project)) projectByPrefix.set(prefix, project);
388
+ const projectRefFromResolved = (resolvedProject) => projects.find((project) => project.key === resolvedProject.projectKey || project.config.path === resolvedProject.projectPath) ?? null;
389
+ const resolveProjectRef = (issueId, preferredProject) => {
390
+ if (preferredProject) return preferredProject;
391
+ const resolvedProject = resolveProjectFromIssueSync(issueId);
392
+ if (resolvedProject) {
393
+ const project = projectRefFromResolved(resolvedProject);
394
+ if (project) return project;
395
+ }
396
+ const prefix = issueId.toUpperCase().match(/^([A-Z]+)-\d+$/)?.[1] ?? "";
397
+ return projectByPrefix.get(prefix) ?? null;
398
+ };
399
+ const ensureIssue = (issueId, preferredProject) => {
400
+ const upper = issueId.toUpperCase();
401
+ const existing = issueMap.get(upper);
402
+ if (existing) return existing;
403
+ const resolved = resolveProjectRef(upper, preferredProject);
404
+ if (!resolved) return null;
405
+ const tracker = trackerIssues.get(upper);
406
+ const created = {
407
+ issueId: upper,
408
+ title: tracker?.title?.trim() || upper,
409
+ projectName: resolved.config.name ?? resolved.key,
410
+ branch: `feature/${upper.toLowerCase()}`,
411
+ trackerState: typeof tracker?.state === "string" ? tracker.state : null,
412
+ rawTrackerState: tracker?.rawTrackerState,
413
+ isRally: tracker?.source === "rally",
414
+ hasPlanning: false,
415
+ hasPrd: false,
416
+ hasState: false,
417
+ isShadow: false,
418
+ agentStatus: null,
419
+ readyForMerge: false,
420
+ lastActivity: null,
421
+ resourceSources: /* @__PURE__ */ new Set(),
422
+ resourceDetails: {
423
+ tmuxSessions: [],
424
+ workspacePath: null,
425
+ localBranches: [],
426
+ remoteBranches: [],
427
+ prs: [],
428
+ xbriefPath: null,
429
+ xbriefMtime: null,
430
+ tasksPath: null,
431
+ prdPath: null,
432
+ dockerContainers: [],
433
+ actualBranch: null,
434
+ branchDrifted: false,
435
+ branchAheadOfMain: false,
436
+ workspaceMissing: false,
437
+ remoteAgent: null,
438
+ conversations: []
439
+ },
440
+ taskTotals: null
441
+ };
442
+ issueMap.set(upper, created);
443
+ return created;
444
+ };
445
+ for (const [issueId, tracker] of trackerIssues) {
446
+ const issue = ensureIssue(issueId);
447
+ if (!issue) continue;
448
+ issue.title = tracker.title?.trim() || issue.title;
449
+ issue.trackerState = typeof tracker.state === "string" ? tracker.state : issue.trackerState;
450
+ issue.rawTrackerState = tracker.rawTrackerState ?? issue.rawTrackerState;
451
+ issue.isRally = tracker.source === "rally";
452
+ issue.resourceSources.add("tracker");
453
+ }
454
+ for (const sessionName of tmuxSessions) {
455
+ if (!isDiscoverableAgentSession(sessionName)) continue;
456
+ const issueId = parseIssueIdFromTextSync(sessionName);
457
+ if (!issueId) continue;
458
+ const issue = ensureIssue(issueId);
459
+ if (!issue) continue;
460
+ issue.resourceSources.add("tmux");
461
+ if (!issue.resourceDetails.tmuxSessions.includes(sessionName)) issue.resourceDetails.tmuxSessions.push(sessionName);
462
+ }
463
+ for (const conv of conversations) {
464
+ if (!conv.issueId || conv.archivedAt) continue;
465
+ const issue = ensureIssue(conv.issueId);
466
+ if (!issue) continue;
467
+ issue.resourceSources.add("conversation");
468
+ issue.resourceDetails.conversations.push({
469
+ id: conv.id,
470
+ name: conv.name,
471
+ title: conv.title,
472
+ status: conv.status,
473
+ tmuxSession: conv.tmuxSession
474
+ });
475
+ }
476
+ for (const remoteState of remoteAgentStates) {
477
+ const issue = ensureIssue(remoteState.issueId);
478
+ if (!issue) continue;
479
+ issue.resourceSources.add("remote-agent");
480
+ issue.resourceDetails.remoteAgent = {
481
+ vmName: remoteState.vmName,
482
+ status: remoteState.status,
483
+ model: remoteState.model,
484
+ startedAt: remoteState.startedAt
485
+ };
486
+ if (!issue.agentStatus) issue.agentStatus = "active";
487
+ }
488
+ for (const containerName of dockerContainers) {
489
+ const issueId = parseIssueIdFromTextSync(containerName.replace(/feature\//g, "feature-"));
490
+ if (!issueId) continue;
491
+ const issue = ensureIssue(issueId);
492
+ if (!issue) continue;
493
+ issue.resourceSources.add("docker");
494
+ issue.resourceDetails.dockerContainers.push(containerName);
495
+ }
496
+ await Promise.all(projects.map(async (project) => {
497
+ const projectPath = project.config.path;
498
+ const workspacesDir = join(projectPath, "workspaces");
499
+ const resolverRows = listWorkspaces({
500
+ projectId: project.key,
501
+ kind: "issue"
502
+ });
503
+ const [workspaceCandidates, branches] = await Promise.all([resolverRows.length > 0 ? Promise.resolve(resolverRows.map((row) => ({
504
+ name: basename(row.path),
505
+ issueId: (row.issueId ?? basename(row.path).replace(/^feature-/, "")).toUpperCase()
506
+ }))) : readdir(workspacesDir, { withFileTypes: true }).then((entries) => entries.filter((entry) => entry.isDirectory() && entry.name.startsWith("feature-")).map((entry) => ({
507
+ name: entry.name,
508
+ issueId: entry.name.replace(/^feature-/, "").toUpperCase()
509
+ }))).catch(() => []), loadProjectBranchSnapshot(projectPath)]);
510
+ await Promise.all(workspaceCandidates.map(async ({ name, issueId }) => {
511
+ const issue = ensureIssue(issueId, project);
512
+ if (!issue) return;
513
+ const workspace = await scanWorkspace(workspacesDir, name);
514
+ issue.resourceSources.add("workspace");
515
+ issue.resourceDetails.workspacePath = workspace.workspacePath;
516
+ issue.hasPlanning = workspace.hasPlanning;
517
+ issue.hasPrd = workspace.hasPrd;
518
+ issue.hasState = workspace.hasState;
519
+ if (workspace.xbriefPath) {
520
+ issue.resourceSources.add("vbrief");
521
+ issue.resourceDetails.xbriefPath = workspace.xbriefPath;
522
+ issue.resourceDetails.xbriefMtime = workspace.xbriefMtime;
523
+ }
524
+ if (workspace.hasTasks) {
525
+ issue.resourceSources.add("tasks");
526
+ issue.resourceDetails.tasksPath = join(workspace.workspacePath, ".tasks");
527
+ }
528
+ const gitInfo = await resolveAgentGitInfo(workspace.workspacePath, issue.branch);
529
+ issue.resourceDetails.actualBranch = gitInfo.actualBranch;
530
+ issue.resourceDetails.branchDrifted = gitInfo.branchDrifted;
531
+ issue.resourceDetails.workspaceMissing = gitInfo.workspaceMissing;
532
+ }));
533
+ for (const [branch, key] of [...branches.local.map((b) => [b, "localBranches"]), ...branches.remote.map((b) => [b, "remoteBranches"])]) {
534
+ const issueId = parseIssueIdFromTextSync(branch);
535
+ if (!issueId) continue;
536
+ const issue = ensureIssue(issueId, project);
537
+ if (!issue) continue;
538
+ issue.resourceSources.add("branch");
539
+ if (!issue.resourceDetails[key].includes(branch)) issue.resourceDetails[key].push(branch);
540
+ if (branches.ahead.has(branch)) issue.resourceDetails.branchAheadOfMain = true;
541
+ }
542
+ }));
543
+ for (const [issueId, prs] of pullRequests) {
544
+ const issue = ensureIssue(issueId);
545
+ if (!issue) continue;
546
+ issue.resourceSources.add("pr");
547
+ issue.resourceDetails.prs = prs;
548
+ const bestTitle = prs.find((pr) => !pr.isDraft)?.title ?? prs[0]?.title;
549
+ issue.title = issue.title === issue.issueId && bestTitle ? bestTitle : issue.title;
550
+ }
551
+ await Promise.all([...issueMap.values()].map(async (issue) => {
552
+ if (issue.resourceDetails.tmuxSessions.length === 0) return;
553
+ const states = (await Promise.all(issue.resourceDetails.tmuxSessions.map((sessionName) => Effect.runPromise(getAgentRuntimeState(sessionName)).catch(() => null)))).filter((state) => state !== null);
554
+ if (states.length === 0) return;
555
+ issue.agentStatus = (states.find((state) => state.state === "active") ?? states.reduce((a, b) => Date.parse(a.lastActivity) >= Date.parse(b.lastActivity) ? a : b)).state;
556
+ const lastActivity = Math.max(...states.map((state) => Date.parse(state.lastActivity)).filter(Number.isFinite));
557
+ issue.lastActivity = Number.isFinite(lastActivity) ? lastActivity : null;
558
+ }));
559
+ const reviewStatusIssueIds = [...issueMap.values()].filter(shouldLoadReviewStatus).map((issue) => issue.issueId);
560
+ if (reviewStatusIssueIds.length > 0) {
561
+ const readyForMergeFlags = loadReadyForMergeFlags(reviewStatusIssueIds);
562
+ for (const issue of issueMap.values()) issue.readyForMerge = readyForMergeFlags.get(issue.issueId) ?? false;
563
+ }
564
+ const memberships = /* @__PURE__ */ new Map();
565
+ const unavailableProjects = /* @__PURE__ */ new Set();
566
+ const projectMemberships = readPipelineMembershipSnapshotsForProjects(projects.map((project) => project.config));
567
+ for (const result of projectMemberships) {
568
+ if (result.error) unavailableProjects.add(result.project.name);
569
+ for (const membership of result.memberships ?? []) {
570
+ ensureIssue(membership.issueId);
571
+ memberships.set(membership.issueId, membership);
572
+ }
573
+ }
574
+ await Promise.all([...issueMap.values()].map(async (issue) => {
575
+ const project = resolveProjectRef(issue.issueId);
576
+ if (!project) return;
577
+ const draft = await Effect.runPromise(findDraftPrd(project.config.path, issue.issueId)).catch(() => null);
578
+ if (!draft) return;
579
+ issue.resourceSources.add("prd");
580
+ issue.resourceDetails.prdPath = draft.path;
581
+ issue.hasPrd = true;
582
+ }));
583
+ const untitledIssueIds = [...issueMap.values()].filter((issue) => issue.resourceSources.size > 0 && issue.title === issue.issueId).map((issue) => issue.issueId);
584
+ if (untitledIssueIds.length > 0) {
585
+ const fallbackTitles = await resolveMissingIssueTitles(untitledIssueIds).catch(() => /* @__PURE__ */ new Map());
586
+ for (const issue of issueMap.values()) {
587
+ const title = fallbackTitles.get(issue.issueId);
588
+ if (title && issue.title === issue.issueId) issue.title = title;
589
+ }
590
+ }
591
+ return [...issueMap.values()].filter((issue) => issue.resourceSources.size > 0).filter((issue) => {
592
+ const membership = memberships.get(issue.issueId);
593
+ return membership?.inPipeline === true || membership?.bucket === "clean_terminal" && isLiveResource(issue) || !membership && unavailableProjects.has(issue.projectName) && isLiveResource(issue);
594
+ }).map((issue) => {
595
+ const membership = memberships.get(issue.issueId);
596
+ const hasTmux = issue.resourceDetails.tmuxSessions.length > 0;
597
+ const hasRecentHeartbeat = hasRecentActivity(issue.lastActivity);
598
+ const stateLabel = deriveStateLabel(issue, hasTmux, hasRecentHeartbeat, membership);
599
+ const isRemoteRunning = issue.resourceDetails.remoteAgent?.status === "running" || issue.resourceDetails.remoteAgent?.status === "starting";
600
+ const status = hasTmux && (issue.agentStatus === "active" || hasRecentHeartbeat) || isRemoteRunning ? "running" : issue.hasState ? "has_state" : "idle";
601
+ return {
602
+ issueId: issue.issueId,
603
+ title: issue.title,
604
+ projectName: issue.projectName,
605
+ branch: issue.branch,
606
+ status,
607
+ stateLabel,
608
+ agentStatus: issue.agentStatus,
609
+ hasPlanning: issue.hasPlanning,
610
+ hasPrd: issue.hasPrd,
611
+ hasState: issue.hasState,
612
+ isShadow: issue.isShadow,
613
+ isRally: issue.isRally,
614
+ childCount: trackerIssues.get(issue.issueId)?.totalChildCount,
615
+ completedCount: trackerIssues.get(issue.issueId)?.completedChildCount,
616
+ inProgressCount: trackerIssues.get(issue.issueId)?.inProgressChildCount,
617
+ readyForMerge: issue.readyForMerge,
618
+ rawTrackerState: issue.rawTrackerState,
619
+ resourceSources: new Set([...issue.resourceSources].sort()),
620
+ resourceDetails: issue.resourceDetails,
621
+ taskTotals: issue.taskTotals,
622
+ pipelineBucket: membership?.bucket,
623
+ specOnlyPlanned: membership ? membership.bucket === "planned_backlog" && membership.reasons.includes("open issue with an xBRIEF spec but no branch/PR — planned work whose plan encodes code paths that age; needs starting or re-planning") : void 0,
624
+ resourceDrift: membership ? !membership.inPipeline : void 0
625
+ };
626
+ }).sort((a, b) => compareIssueIds(a.issueId, b.issueId));
627
+ }
628
+ function toPublicResourceIssue(issue) {
629
+ return {
630
+ ...issue,
631
+ resourceSources: [...issue.resourceSources],
632
+ resourceDetails: summarizeResourceDetails(issue.resourceDetails)
633
+ };
634
+ }
635
+ function rebuildCombinedResourceSnapshot() {
636
+ const detailed = [...projectResourceSnapshots.values()].flatMap((snapshot) => snapshot.detailed).sort((a, b) => compareIssueIds(a.issueId, b.issueId));
637
+ const publicIssues = detailed.map(toPublicResourceIssue);
638
+ cachedDetailedResourceIssues = detailed;
639
+ cachedResourceIssues = {
640
+ value: publicIssues,
641
+ computedAt: Math.max(0, ...[...projectResourceSnapshots.values()].map((snapshot) => snapshot.computedAt))
642
+ };
643
+ return publicIssues;
644
+ }
645
+ function publishProjectResourceSnapshot(project, issues) {
646
+ projectResourceSnapshots.set(project.path, {
647
+ detailed: issues,
648
+ public: issues.map(toPublicResourceIssue),
649
+ computedAt: Date.now()
650
+ });
651
+ rebuildCombinedResourceSnapshot();
652
+ }
653
+ /** Refresh only the requested projects, capturing fleet-wide signals once for the batch. */
654
+ async function refreshResourceAllocatedProjects(projects, options = {}) {
655
+ if (projects.length === 0) return cachedResourceIssues?.value ?? [];
656
+ const sharedSignals = await captureSharedResourceSignals();
657
+ const failures = [];
658
+ for (const project of projects) try {
659
+ if (options.refreshMembership !== false) await refreshMembershipSnapshotsForProjects([project]);
660
+ publishProjectResourceSnapshot(project, await computeResourceAllocatedIssues([project], sharedSignals));
661
+ } catch (error) {
662
+ const failure = error instanceof Error ? error : new Error(String(error));
663
+ failures.push(failure);
664
+ console.warn(`[resource-discovery] refresh failed for ${project.name ?? project.path}; keeping last-good snapshot:`, failure.message);
665
+ }
666
+ if (failures.length > 0) throw new AggregateError(failures, `${failures.length} project resource refresh(es) failed`);
667
+ return cachedResourceIssues?.value ?? [];
668
+ }
669
+ async function getCachedResourceAllocatedIssues() {
670
+ return cachedResourceIssues?.value ?? [];
671
+ }
672
+ function sanitizeResourceAllocatedIssues(issues) {
673
+ return issues.map((issue) => ({
674
+ ...issue,
675
+ resourceDetails: {
676
+ hasWorkspace: issue.resourceDetails.hasWorkspace,
677
+ localBranchCount: issue.resourceDetails.localBranchCount,
678
+ remoteBranchCount: issue.resourceDetails.remoteBranchCount,
679
+ tmuxSessionCount: issue.resourceDetails.tmuxSessionCount,
680
+ prs: issue.resourceDetails.prs.map((pr) => ({
681
+ number: pr.number,
682
+ title: pr.title,
683
+ state: pr.state,
684
+ isDraft: pr.isDraft
685
+ })),
686
+ hasXbrief: issue.resourceDetails.hasXbrief,
687
+ hasTasks: issue.resourceDetails.hasTasks,
688
+ hasPrd: issue.resourceDetails.hasPrd,
689
+ dockerContainerCount: issue.resourceDetails.dockerContainerCount,
690
+ actualBranch: issue.resourceDetails.actualBranch,
691
+ branchDrifted: issue.resourceDetails.branchDrifted,
692
+ branchAheadOfMain: issue.resourceDetails.branchAheadOfMain,
693
+ workspaceMissing: issue.resourceDetails.workspaceMissing,
694
+ remoteAgent: issue.resourceDetails.remoteAgent ?? null,
695
+ conversations: issue.resourceDetails.conversations.map((conv) => ({
696
+ id: conv.id,
697
+ name: conv.name,
698
+ title: conv.title,
699
+ status: conv.status
700
+ }))
701
+ }
702
+ }));
703
+ }
704
+ function toPublicResourceDetailIdentifiers(details) {
705
+ return summarizeResourceDetailIdentifiers(details);
706
+ }
707
+ async function getResourceDetailIdentifiers(issueId) {
708
+ const normalizedIssueId = issueId.toUpperCase();
709
+ const cachedMatch = cachedDetailedResourceIssues?.find((entry) => entry.issueId === normalizedIssueId);
710
+ return cachedMatch ? toPublicResourceDetailIdentifiers(cachedMatch.resourceDetails) : null;
711
+ }
712
+ function groupResourceAllocatedIssuesByProject(issues) {
713
+ const projectTree = /* @__PURE__ */ new Map();
714
+ for (const issue of issues) {
715
+ const existing = projectTree.get(issue.projectName);
716
+ if (existing) {
717
+ existing.features.push(issue);
718
+ continue;
719
+ }
720
+ projectTree.set(issue.projectName, {
721
+ name: issue.projectName,
722
+ path: issue.projectName,
723
+ features: [issue]
724
+ });
725
+ }
726
+ return [...projectTree.values()].map((project) => ({
727
+ ...project,
728
+ features: project.features.sort((a, b) => compareIssueIds(a.issueId, b.issueId))
729
+ })).sort((a, b) => a.name.localeCompare(b.name));
730
+ }
731
+ //#endregion
732
+ //#region services/project-resource-refresh-queue.ts
733
+ init_projects();
734
+ const PROJECT_RESOURCE_REFRESH_DEBOUNCE_MS = 1e3;
735
+ const PROJECT_RESOURCE_CONVERGENCE_INTERVAL_MS = 5 * 6e4;
736
+ function createProjectResourceRefreshQueue(deps) {
737
+ const debounceMs = deps.debounceMs ?? 1e3;
738
+ const now = deps.now ?? Date.now;
739
+ const pending = /* @__PURE__ */ new Map();
740
+ const reasons = /* @__PURE__ */ new Map();
741
+ const idleWaiters = /* @__PURE__ */ new Set();
742
+ let activeProjectPaths = [];
743
+ let timer = null;
744
+ let running = false;
745
+ let stopped = false;
746
+ let lastStartedAt = null;
747
+ let lastCompletedAt = null;
748
+ let lastError = null;
749
+ const isIdle = () => !running && timer === null && pending.size === 0;
750
+ const resolveIdleWaiters = () => {
751
+ if (!isIdle()) return;
752
+ for (const resolve of idleWaiters) resolve();
753
+ idleWaiters.clear();
754
+ };
755
+ const drain = async () => {
756
+ timer = null;
757
+ if (running || stopped) return;
758
+ running = true;
759
+ try {
760
+ while (!stopped && pending.size > 0) {
761
+ const projects = [...pending.values()];
762
+ const reasonsByProjectPath = /* @__PURE__ */ new Map();
763
+ for (const project of projects) {
764
+ reasonsByProjectPath.set(project.path, new Set(reasons.get(project.path) ?? []));
765
+ reasons.delete(project.path);
766
+ }
767
+ pending.clear();
768
+ activeProjectPaths = projects.map((project) => project.path);
769
+ lastStartedAt = now();
770
+ try {
771
+ await deps.refreshProjects(projects, { reasonsByProjectPath });
772
+ lastError = null;
773
+ } catch (error) {
774
+ lastError = error instanceof Error ? error.message : String(error);
775
+ console.warn("[project-resource-refresh] batch failed:", lastError);
776
+ } finally {
777
+ activeProjectPaths = [];
778
+ lastCompletedAt = now();
779
+ }
780
+ }
781
+ } finally {
782
+ running = false;
783
+ resolveIdleWaiters();
784
+ }
785
+ };
786
+ const schedule = () => {
787
+ if (stopped || running || timer) return;
788
+ timer = setTimeout(() => void drain(), debounceMs);
789
+ timer.unref?.();
790
+ };
791
+ const enqueueProject = (project, reason) => {
792
+ if (stopped) return;
793
+ pending.set(project.path, project);
794
+ const projectReasons = reasons.get(project.path) ?? /* @__PURE__ */ new Set();
795
+ projectReasons.add(reason);
796
+ reasons.set(project.path, projectReasons);
797
+ schedule();
798
+ };
799
+ return {
800
+ enqueueProject,
801
+ enqueueProjects(projects, reason) {
802
+ for (const project of projects) enqueueProject(project, reason);
803
+ },
804
+ whenIdle() {
805
+ if (isIdle()) return Promise.resolve();
806
+ return new Promise((resolve) => idleWaiters.add(resolve));
807
+ },
808
+ getState() {
809
+ return {
810
+ running,
811
+ activeProjectPaths: [...activeProjectPaths],
812
+ pendingProjectPaths: [...pending.keys()],
813
+ lastStartedAt,
814
+ lastCompletedAt,
815
+ lastError
816
+ };
817
+ },
818
+ stop() {
819
+ stopped = true;
820
+ if (timer) clearTimeout(timer);
821
+ timer = null;
822
+ pending.clear();
823
+ reasons.clear();
824
+ resolveIdleWaiters();
825
+ }
826
+ };
827
+ }
828
+ const MEMBERSHIP_REFRESH_REASONS = new Set([
829
+ "boot-warm",
830
+ "periodic-convergence",
831
+ "issue.statusChanged:closed-out",
832
+ "pull_request:opened",
833
+ "pull_request:closed",
834
+ "pull_request:reopened"
835
+ ]);
836
+ function shouldRefreshMembershipForResourceRefresh(context) {
837
+ return [...context.reasonsByProjectPath.values()].some((projectReasons) => [...projectReasons].some((reason) => MEMBERSHIP_REFRESH_REASONS.has(reason)));
838
+ }
839
+ const projectResourceRefreshQueue = createProjectResourceRefreshQueue({ refreshProjects: (projects, context) => refreshResourceAllocatedProjects(projects, { refreshMembership: shouldRefreshMembershipForResourceRefresh(context) }) });
840
+ function enqueueProjectResourceRefresh(project, reason) {
841
+ projectResourceRefreshQueue.enqueueProject(project, reason);
842
+ }
843
+ function enqueueProjectsResourceRefresh(projects, reason) {
844
+ projectResourceRefreshQueue.enqueueProjects(projects, reason);
845
+ }
846
+ function whenProjectResourceRefreshIdle() {
847
+ return projectResourceRefreshQueue.whenIdle();
848
+ }
849
+ function getProjectResourceRefreshQueueState() {
850
+ return projectResourceRefreshQueue.getState();
851
+ }
852
+ function stopProjectResourceRefreshQueue() {
853
+ projectResourceRefreshQueue.stop();
854
+ }
855
+ function startProjectResourceConvergence() {
856
+ const timer = setInterval(() => {
857
+ enqueueProjectsResourceRefresh(listProjectsSync().map((entry) => entry.config), "periodic-convergence");
858
+ }, PROJECT_RESOURCE_CONVERGENCE_INTERVAL_MS);
859
+ timer.unref?.();
860
+ return () => clearInterval(timer);
861
+ }
862
+ //#endregion
863
+ export { refreshMembershipSnapshotsForProjects as _, enqueueProjectsResourceRefresh as a, startProjectResourceConvergence as c, getCachedResourceAllocatedIssues as d, getResourceDetailIdentifiers as f, readPipelineMembershipSnapshotsForProjects as g, sanitizeResourceAllocatedIssues as h, enqueueProjectResourceRefresh as i, stopProjectResourceRefreshQueue as l, isDiscoverableAgentSession as m, PROJECT_RESOURCE_REFRESH_DEBOUNCE_MS as n, getProjectResourceRefreshQueueState as o, groupResourceAllocatedIssuesByProject as p, createProjectResourceRefreshQueue as r, shouldRefreshMembershipForResourceRefresh as s, PROJECT_RESOURCE_CONVERGENCE_INTERVAL_MS as t, whenProjectResourceRefreshIdle as u, summarizePipelineMembership as v, unavailablePipelineMembership as y };
864
+
865
+ //# sourceMappingURL=project-resource-refresh-queue-BehrH4Ai.js.map