@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,774 @@
1
+ import { Ri as getOverdeckHome, Wi as sessionFilePath, zi as init_paths } from "./config-yaml-D60AnTIu.js";
2
+ import { A as listPaneValuesSync, C as init_tmux, D as killSessionSync, E as killSession, W as sessionExistsSync, i as capturePaneSync, l as detectTerminalApiErrorSync, z as sendEscapeKeyAsync } from "./tmux-wnT_hg-s.js";
3
+ import { _ as logDeaconEventSync, h as init_persistent_logger } from "./agents-DzpQidT8.js";
4
+ import { c as init_control_settings, i as getFlywheelActiveRunId, p as isFlywheelGloballyPaused } from "./control-settings-Db0uXgVM.js";
5
+ import { $t as init_activity, C as markAgentTroubled, Ft as resumeAgent, Ut as messageAgent, W as getAgentRuntimeStateSync, en as resolveLatestSessionIdSync, q as init_agents, wt as init_agent_enrichment, yn as listRunningAgentsSync, yt as countPendingAskUserQuestionsForAgent } from "./agent-state-FABw8neJ.js";
6
+ import { h as readWorkspacePlanSync, s as init_io } from "./io-BCtZoXHo.js";
7
+ import { a as getDispatchableItems, c as init_dag } from "./dag-o-dUpw1L.js";
8
+ import { a as loadCloisterConfigSync, r as init_config, t as DEFAULT_CLOISTER_CONFIG } from "./config-_qaa1UXH.js";
9
+ import { d as getReviewStatusSync, p as init_review_status } from "./review-status-DpniqzPT.js";
10
+ import { n as getAgentWorkActivityMs, r as isAgentIdleForNudge, t as getAgentEffectiveLastActivityMs } from "./agent-idle-D-UQ7gDv.js";
11
+ import { i as recordRecoveryFailure, r as init_recovery_trip } from "./recovery-trip-CpfW6LCJ.js";
12
+ import { Effect } from "effect";
13
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
14
+ import { join } from "path";
15
+ //#region ../../lib/cloister/agent-death.ts
16
+ init_persistent_logger();
17
+ init_config();
18
+ init_activity();
19
+ init_agent_enrichment();
20
+ init_agents();
21
+ init_review_status();
22
+ /**
23
+ * Agent death diagnostics (PAN-2108).
24
+ *
25
+ * When an ohmypi/pi agent process dies, the launcher records its exit code +
26
+ * timestamp to `<agentDir>/exit-status` (see buildOhmypiCommand in
27
+ * launcher-generator.ts), and omp's stdout/stderr is captured to
28
+ * `<agentDir>/output.log`. This module turns those into a one-line death reason
29
+ * the deacon can log, replacing the opaque "session is dead" with an actual
30
+ * cause — the gap that made the flywheel orchestrator's silent death
31
+ * undiagnosable in RUN-30.
32
+ */
33
+ init_paths();
34
+ init_tmux();
35
+ function agentDir(agentId) {
36
+ return join(getOverdeckHome(), "agents", agentId);
37
+ }
38
+ /** Read the launcher-recorded exit code + UTC timestamp, or null if absent. */
39
+ function readAgentExitStatus(agentId) {
40
+ try {
41
+ const p = join(agentDir(agentId), "exit-status");
42
+ if (!existsSync(p)) return null;
43
+ const raw = readFileSync(p, "utf-8").trim();
44
+ if (!raw) return null;
45
+ const [code, at = ""] = raw.split(/\s+/);
46
+ return {
47
+ code: code ?? "?",
48
+ at
49
+ };
50
+ } catch {
51
+ return null;
52
+ }
53
+ }
54
+ /**
55
+ * Best-effort one-line description of why an agent process died: the
56
+ * launcher-recorded exit status (preferred), the tmux pane exit status (fallback
57
+ * when the dead pane corpse still exists), and the tail of output.log.
58
+ */
59
+ function describeAgentDeath(agentId) {
60
+ const parts = [];
61
+ const exit = readAgentExitStatus(agentId);
62
+ if (exit) parts.push(`exit=${exit.code}${exit.at ? ` at ${exit.at}` : ""}`);
63
+ else if (sessionExistsSync(agentId)) {
64
+ const paneExit = listPaneValuesSync(agentId, "#{pane_exit_status}").find((v) => v !== "");
65
+ if (paneExit) parts.push(`pane_exit=${paneExit}`);
66
+ }
67
+ try {
68
+ const logPath = join(agentDir(agentId), "output.log");
69
+ if (existsSync(logPath)) {
70
+ const tail = readFileSync(logPath, "utf-8").slice(-1500).trim().split("\n").slice(-6).join(" | ").trim();
71
+ if (tail) parts.push(`output.log tail: ${tail}`);
72
+ }
73
+ } catch {}
74
+ return parts.length ? parts.join("; ") : "no exit trace (exit-status + output.log empty)";
75
+ }
76
+ //#endregion
77
+ //#region ../../lib/cloister/stuck-remediation-state.ts
78
+ init_control_settings();
79
+ init_paths();
80
+ function agentStateDir(agentId) {
81
+ return join(getOverdeckHome(), "agents", agentId);
82
+ }
83
+ function statePath(agentId) {
84
+ return join(agentStateDir(agentId), "stuck-remediation.json");
85
+ }
86
+ function readStuckRemediationState(agentId) {
87
+ const filePath = statePath(agentId);
88
+ if (!existsSync(filePath)) return null;
89
+ try {
90
+ return JSON.parse(readFileSync(filePath, "utf-8"));
91
+ } catch (error) {
92
+ console.warn(`Failed to read stuck-remediation state for ${agentId}:`, error);
93
+ return null;
94
+ }
95
+ }
96
+ function writeStuckRemediationState(agentId, state) {
97
+ mkdirSync(agentStateDir(agentId), { recursive: true });
98
+ writeFileSync(statePath(agentId), `${JSON.stringify(state, null, 2)}\n`, "utf-8");
99
+ }
100
+ function clearStuckRemediationState(agentId) {
101
+ const filePath = statePath(agentId);
102
+ if (!existsSync(filePath)) return;
103
+ unlinkSync(filePath);
104
+ }
105
+ //#endregion
106
+ //#region ../../lib/cloister/planning-wedge.ts
107
+ init_io();
108
+ init_dag();
109
+ init_recovery_trip();
110
+ /**
111
+ * PAN-3677: positive transcript proof of the planning background-task wedge.
112
+ *
113
+ * The incident: planning sessions (planning-min-888 / planning-min-889) hung on
114
+ * the provider call that followed their background Explore children reaching a
115
+ * terminal state — one run with both children finished, one with a child dead
116
+ * from the 262,144-token model limit while its sibling finished. The mirror
117
+ * stayed 'active' (the Stop hook never fired), the pane kept repainting its
118
+ * spinner, and queued `pan tell` messages were never processed.
119
+ *
120
+ * Stuck-remediation must NEVER interrupt a turn it cannot prove is wedged: a
121
+ * healthy long reasoning turn is also mirror-'active' with no tool calls for
122
+ * a while. This module supplies the positive signature from the authoritative
123
+ * source — the session JSONL:
124
+ *
125
+ * 1. the parent launched at least one background child IN THE CURRENT TURN
126
+ * (Agent tool result: "Async agent launched successfully. … agentId: X");
127
+ * 2. EVERY child launched since that boundary is proven terminal, via either
128
+ * - a task-notification queue-operation carrying a terminal
129
+ * `<status>` (completed / failed / cancelled / killed), or
130
+ * - a TaskOutput tool result for that task id with a terminal `<status>`.
131
+ *
132
+ * TURN SCOPING: at each genuine prompt boundary — a `user` entry with
133
+ * string/text content (kickoff, recovery-resume seed) or a queue-operation
134
+ * `remove` of a non-task-notification message (a consumed `pan tell`) —
135
+ * children already proven TERMINAL are retired from the evidence; a closed
136
+ * explorer batch from earlier in the session can never keep `wedged` true
137
+ * through a later healthy turn (historical poisoning). Children NOT yet
138
+ * terminal carry across the boundary, because real background tasks outlive
139
+ * user turns: in the MIN-888 transcript the operator's `pan tell` was consumed
140
+ * while the API explorer was still running, and the wedge formed only after
141
+ * that child finished. `user` entries carrying tool_result parts are turn
142
+ * machinery, never boundaries.
143
+ *
144
+ * If proof is missing — no background children since the boundary, or any
145
+ * child without terminal proof — the answer is NOT wedged and the caller must
146
+ * not interrupt. The detector is deliberately blind to everything else
147
+ * (model, prompt, wall clock): those judgments live in the remediation
148
+ * ladder.
149
+ *
150
+ * Known limitation: a task id can notify more than once (a finished child can
151
+ * be resumed and run again within the same turn). Re-resume is rare in
152
+ * planning flows and the ladder's one-stage-per-episode guard bounds the cost
153
+ * of a stale read; if it ever false-fires, the interrupt is an Escape —
154
+ * recoverable, transcript-safe.
155
+ */
156
+ init_paths();
157
+ /** Terminal background-task statuses recognized in notifications / TaskOutput results. */
158
+ const TERMINAL_TASK_STATUSES = new Set([
159
+ "completed",
160
+ "failed",
161
+ "cancelled",
162
+ "killed",
163
+ "error"
164
+ ]);
165
+ function extractText(content) {
166
+ if (typeof content === "string") return content;
167
+ if (Array.isArray(content)) return content.map((part) => {
168
+ if (part && typeof part === "object") {
169
+ const p = part;
170
+ if (p.type === "text" && typeof p.text === "string") return p.text;
171
+ if (p.type === "tool_result") return extractText(p.content);
172
+ }
173
+ return "";
174
+ }).join("\n");
175
+ return "";
176
+ }
177
+ function parseTaskNotification(content) {
178
+ if (!content.includes("<task-notification>")) return null;
179
+ const taskId = /<task-id>\s*([a-z0-9]+)\s*<\/task-id>/.exec(content)?.[1];
180
+ if (!taskId) return null;
181
+ return {
182
+ taskId,
183
+ status: /<status>\s*([a-z_-]+)\s*<\/status>/i.exec(content)?.[1]?.toLowerCase() ?? null
184
+ };
185
+ }
186
+ /**
187
+ * True when a JSONL entry opens a new genuine user turn: a `user` entry with
188
+ * string or text-only content (the kickoff prompt, a recovery-resume seed),
189
+ * or a queue-operation `remove` of a NON-task-notification message (a
190
+ * consumed operator `pan tell` — the harness folds it into context at that
191
+ * point without writing a user entry). `user` entries made of tool_result
192
+ * parts are turn machinery and NEVER boundaries; task-notification
193
+ * queue-operations are the wedge evidence itself, also never boundaries.
194
+ */
195
+ function isPromptBoundary(e) {
196
+ if (e.type === "queue-operation") {
197
+ const content = typeof e.content === "string" ? e.content : "";
198
+ return e.operation === "remove" && !content.includes("<task-notification>");
199
+ }
200
+ if (e.type !== "user") return false;
201
+ const content = e.message?.content;
202
+ if (typeof content === "string") return content.trim().length > 0;
203
+ if (Array.isArray(content)) {
204
+ const hasToolResult = content.some((p) => p && typeof p === "object" && p.type === "tool_result");
205
+ return content.some((p) => p && typeof p === "object" && p.type === "text") && !hasToolResult;
206
+ }
207
+ return false;
208
+ }
209
+ /**
210
+ * Parse one session's JSONL entries (already-parsed JSON objects, in file
211
+ * order) into the wedge evidence. At every genuine prompt boundary (see
212
+ * isPromptBoundary), children already proven terminal are RETIRED — only
213
+ * still-running children carry into the new turn, because real background
214
+ * tasks outlive user turns. Unknown/malformed lines are ignored — a parser
215
+ * miss always degrades to "not wedged", never to a false positive.
216
+ */
217
+ function parseBackgroundTaskWedge(entries) {
218
+ let launched = [];
219
+ let terminal = /* @__PURE__ */ new Map();
220
+ let consumedNotifications = /* @__PURE__ */ new Set();
221
+ for (const entry of entries) {
222
+ if (!entry || typeof entry !== "object") continue;
223
+ const e = entry;
224
+ if (isPromptBoundary(e)) {
225
+ launched = launched.filter((id) => !terminal.has(id));
226
+ terminal = new Map([...terminal].filter(([id]) => launched.includes(id)));
227
+ consumedNotifications = new Set([...consumedNotifications].filter((id) => launched.includes(id)));
228
+ continue;
229
+ }
230
+ if (e.type === "queue-operation") {
231
+ const notification = parseTaskNotification(typeof e.content === "string" ? e.content : "");
232
+ if (!notification) continue;
233
+ if (e.operation === "remove") consumedNotifications.add(notification.taskId);
234
+ if (notification.status && TERMINAL_TASK_STATUSES.has(notification.status)) terminal.set(notification.taskId, notification.status);
235
+ continue;
236
+ }
237
+ const content = e.message?.content;
238
+ if (!Array.isArray(content)) continue;
239
+ for (const part of content) {
240
+ if (!part || typeof part !== "object") continue;
241
+ const p = part;
242
+ if (p.type !== "tool_result") continue;
243
+ const text = extractText(p.content);
244
+ if (text.includes("Async agent launched successfully")) {
245
+ const agentId = /agentId:\s*([a-z0-9]+)/.exec(text)?.[1];
246
+ if (agentId && !launched.includes(agentId)) launched.push(agentId);
247
+ continue;
248
+ }
249
+ if (text.includes("<retrieval_status>")) {
250
+ const taskId = /<task_id>\s*([a-z0-9]+)\s*<\/task_id>/.exec(text)?.[1];
251
+ const status = /<status>\s*([a-z_-]+)\s*<\/status>/i.exec(text)?.[1]?.toLowerCase();
252
+ if (taskId && status && TERMINAL_TASK_STATUSES.has(status)) {
253
+ terminal.set(taskId, status);
254
+ consumedNotifications.add(taskId);
255
+ }
256
+ }
257
+ }
258
+ }
259
+ const terminalTaskIds = launched.filter((id) => terminal.has(id));
260
+ const nonTerminalTaskIds = launched.filter((id) => !terminal.has(id));
261
+ const unconsumedTerminalTaskIds = terminalTaskIds.filter((id) => !consumedNotifications.has(id));
262
+ return {
263
+ launchedTaskIds: launched,
264
+ terminalTaskIds,
265
+ nonTerminalTaskIds,
266
+ unconsumedTerminalTaskIds,
267
+ wedged: launched.length > 0 && nonTerminalTaskIds.length === 0
268
+ };
269
+ }
270
+ /**
271
+ * Read a session JSONL and return its wedge evidence, or null when the file
272
+ * cannot be read/parsed — callers treat null as "not proven", never as wedged.
273
+ */
274
+ function readBackgroundTaskWedgeEvidence(sessionPath) {
275
+ let raw;
276
+ try {
277
+ raw = readFileSync(sessionPath, "utf-8");
278
+ } catch {
279
+ return null;
280
+ }
281
+ const entries = [];
282
+ for (const line of raw.split("\n")) {
283
+ if (!line.trim()) continue;
284
+ try {
285
+ entries.push(JSON.parse(line));
286
+ } catch {}
287
+ }
288
+ return parseBackgroundTaskWedge(entries);
289
+ }
290
+ /**
291
+ * Resolve an agent's CURRENT session through the production resolver
292
+ * (resolveLatestSessionIdSync — the same door resumeAgent uses) and parse its
293
+ * live JSONL. Returns null when there is no resumable session or no readable
294
+ * transcript — always degrading to "not proven".
295
+ */
296
+ function readAgentBackgroundTaskWedgeEvidence(agentId, workspace) {
297
+ const sessionId = resolveLatestSessionIdSync(agentId).sessionId;
298
+ if (!sessionId) return null;
299
+ return readBackgroundTaskWedgeEvidence(sessionFilePath(workspace, sessionId));
300
+ }
301
+ //#endregion
302
+ //#region ../../lib/cloister/stuck-remediation.ts
303
+ init_tmux();
304
+ function issueIdForAgent(agent) {
305
+ return agent.issueId || agent.id.replace(/^agent-/, "").toUpperCase();
306
+ }
307
+ function shouldSkipReviewStatus(status) {
308
+ if (!status) return false;
309
+ if (status.stuck || status.deaconIgnored || status.mergeStatus === "merged" || status.readyForMerge) return true;
310
+ if (status.reviewStatus === "blocked" || status.reviewStatus === "failed") return true;
311
+ if (status.verificationStatus === "failed" || status.testStatus === "failed") return true;
312
+ if (status.reviewStatus === "reviewing" || status.reviewStatus === "passed") return true;
313
+ return status.reviewStatus === "pending" && !!status.reviewRequestedAt;
314
+ }
315
+ /**
316
+ * PAN-2581 (FR-2, residual): phase gate for the health-check poke loop
317
+ * (service.ts pokeAgent → pokeAgentWithEscalation → idle-alive pause), the
318
+ * SECOND independent idleness consumer besides stuck-remediation. A warm-idle
319
+ * work agent on a pipeline-owned issue — and a warm-idle review/test agent
320
+ * after its verdict — must never be poked ("are you stuck?") or idle-alive
321
+ * paused: the poke spends tokens re-explaining the wait, and the pause
322
+ * manufactures the paused-delivery-target deadlock PAN-2461 exists to undo.
323
+ * A genuinely stalled mid-review parent is covered by the PAN-2584 liveness
324
+ * deadline, not pokes. Owed-rework agents (review blocked/failed, tests
325
+ * failed) are ALSO skipped here by design: shouldSkipReviewStatus returns
326
+ * true for those because the PAN-2519 wedged-rework path owns their
327
+ * escalation — the health-check poke loop must not double-drive them.
328
+ * Roles outside work/review/test (plan, strike, flywheel, sequencer) keep
329
+ * their existing idleness semantics.
330
+ */
331
+ function shouldSkipIdlePokeForAgent(agent, readStatus = getReviewStatusSync) {
332
+ if (!agent) return false;
333
+ if (agent.role !== "work" && agent.role !== "review" && agent.role !== "test") return false;
334
+ return shouldSkipReviewStatus(readStatus((agent.issueId || agent.id.replace(/^agent-/, "").replace(/-(review|test|ship)(-.*)?$/, "").replace(/-slot-\d+$/, "")).toUpperCase()));
335
+ }
336
+ function hasPendingRework(status) {
337
+ if (!status) return false;
338
+ if (status.stuck || status.deaconIgnored || status.mergeStatus === "merged" || status.readyForMerge) return false;
339
+ return status.reviewStatus === "blocked" || status.reviewStatus === "failed" || status.verificationStatus === "failed" || status.testStatus === "failed";
340
+ }
341
+ const STUCK_KILL_REQUEUE_CEILING = 25;
342
+ async function evaluateWedgedReworkAgent(agent, config, now, actions) {
343
+ const agentId = agent.id;
344
+ if (agent.role !== "work" || !agent.workspace) return false;
345
+ const issueId = issueIdForAgent(agent);
346
+ const status = getReviewStatusSync(issueId);
347
+ if (!hasPendingRework(status)) return false;
348
+ const lastActivityMs = getAgentEffectiveLastActivityMs(agentId);
349
+ if (lastActivityMs === null || !Number.isFinite(lastActivityMs)) return false;
350
+ const stuckState = readStuckRemediationState(agentId);
351
+ if (stuckState) {
352
+ const firstStuckMs = new Date(stuckState.firstStuckAt).getTime();
353
+ if (Number.isFinite(firstStuckMs) && lastActivityMs > firstStuckMs) {
354
+ clearStuckRemediationState(agentId);
355
+ return false;
356
+ }
357
+ }
358
+ const idleMinutes = Math.floor((now - lastActivityMs) / 6e4);
359
+ const lastStage = stuckState?.lastStage ?? 0;
360
+ if (idleMinutes < config.stage3_minutes || lastStage >= 3) return false;
361
+ const firstStuck = firstStuckAt(new Date(lastActivityMs).toISOString(), stuckState);
362
+ if ((status?.autoRequeueCount ?? 0) >= STUCK_KILL_REQUEUE_CEILING) {
363
+ markAgentTroubled(agentId);
364
+ writeStuckRemediationState(agentId, stageState(3, now, firstStuck));
365
+ logAction(actions, transitionAction(3, issueId, idleMinutes, "rework-wedge-troubled"));
366
+ await surfaceStuckNeedsYou(agent, issueId, firstStuck, actions);
367
+ return true;
368
+ }
369
+ killSessionSync(agentId);
370
+ writeStuckRemediationState(agentId, stageState(3, now, firstStuck));
371
+ logAction(actions, transitionAction(3, issueId, idleMinutes, "killed-for-respawn"));
372
+ return true;
373
+ }
374
+ function shouldCheckReadyBeadsForAgent(agent, now) {
375
+ const agentId = agent.id;
376
+ if (!agentId) return false;
377
+ if (agent.status !== "running") return false;
378
+ if (agent.role !== "work") return false;
379
+ if (!agent.workspace) return false;
380
+ const completedAt = agent.completedAt;
381
+ if (agent.paused || agent.troubled || completedAt) return false;
382
+ if (!sessionExistsSync(agentId)) return false;
383
+ if (shouldSkipReviewStatus(getReviewStatusSync(issueIdForAgent(agent)))) return false;
384
+ return isAgentIdleForNudge(agentId, 300 * 1e3, now);
385
+ }
386
+ function firstStuckAt(runtimeLastActivity, stuckState) {
387
+ return stuckState?.firstStuckAt ?? runtimeLastActivity;
388
+ }
389
+ function stageState(stage, now, firstStuck, prev) {
390
+ return {
391
+ lastStage: stage,
392
+ lastStageAt: new Date(now).toISOString(),
393
+ firstStuckAt: firstStuck,
394
+ ...prev?.respawnCount !== void 0 ? { respawnCount: prev.respawnCount } : {},
395
+ ...prev?.lastRespawnAt !== void 0 ? { lastRespawnAt: prev.lastRespawnAt } : {}
396
+ };
397
+ }
398
+ function transitionAction(stage, issueId, idleMinutes, action) {
399
+ return `[deacon] stuck-remediation stage=${stage} issue=${issueId} idleMin=${idleMinutes} action=${action}`;
400
+ }
401
+ function logAction(actions, action) {
402
+ actions.push(action);
403
+ console.log(action);
404
+ logDeaconEventSync(action);
405
+ }
406
+ async function surfaceStuckNeedsYou(agent, issueId, generation, actions) {
407
+ if (!agent.workspace) return;
408
+ if ((await recordRecoveryFailure(agent.workspace, issueId, "stuck-remediation", generation, 1)).emitNeedsYou) logAction(actions, `[deacon] needs-you ${issueId}: stuck remediation exhausted`);
409
+ }
410
+ async function evaluateAgent(agent, config, now, actions) {
411
+ const agentId = agent.id;
412
+ if (!agentId) return;
413
+ if (agent.status !== "running") return;
414
+ const completedAt = agent.completedAt;
415
+ if (agent.paused || agent.troubled || completedAt) return;
416
+ if (agent.role === "flywheel") {
417
+ await evaluateFlywheelOrchestrator(agent, config, now, actions);
418
+ return;
419
+ }
420
+ if (!sessionExistsSync(agentId)) return;
421
+ if (agent.role === "plan") {
422
+ await evaluatePlanningAgent(agent, config, now, actions);
423
+ return;
424
+ }
425
+ if (await evaluateWedgedReworkAgent(agent, config, now, actions)) return;
426
+ if (!shouldCheckReadyBeadsForAgent(agent, now)) return;
427
+ if (!agent.workspace) return;
428
+ const issueId = issueIdForAgent(agent);
429
+ const plan = readWorkspacePlanSync(agent.workspace);
430
+ if (!plan) return;
431
+ if (getDispatchableItems(plan, /* @__PURE__ */ new Set()).length > 0) return;
432
+ const lastActivityMs = getAgentEffectiveLastActivityMs(agentId);
433
+ if (lastActivityMs === null) return;
434
+ if (!Number.isFinite(lastActivityMs)) return;
435
+ const lastActivity = new Date(lastActivityMs).toISOString();
436
+ const stuckState = readStuckRemediationState(agentId);
437
+ if (stuckState) {
438
+ const firstStuckMs = new Date(stuckState.firstStuckAt).getTime();
439
+ if (Number.isFinite(firstStuckMs) && lastActivityMs > firstStuckMs) {
440
+ clearStuckRemediationState(agentId);
441
+ return;
442
+ }
443
+ }
444
+ const idleMinutes = Math.floor((now - lastActivityMs) / 6e4);
445
+ const lastStage = stuckState?.lastStage ?? 0;
446
+ const firstStuck = firstStuckAt(lastActivity, stuckState);
447
+ const terminalProviderError = detectTerminalApiErrorSync(capturePaneSync(agentId, 80));
448
+ if (terminalProviderError) {
449
+ markAgentTroubled(agentId);
450
+ writeStuckRemediationState(agentId, stageState(3, now, firstStuck));
451
+ logAction(actions, `${agentId} provider-terminal: ${terminalProviderError.summary}`);
452
+ await surfaceStuckNeedsYou(agent, issueId, firstStuck, actions);
453
+ return;
454
+ }
455
+ if (idleMinutes >= config.stage3_minutes && lastStage < 3) {
456
+ markAgentTroubled(agentId);
457
+ writeStuckRemediationState(agentId, stageState(3, now, firstStuck));
458
+ logAction(actions, transitionAction(3, issueId, idleMinutes, "marked-troubled"));
459
+ await surfaceStuckNeedsYou(agent, issueId, firstStuck, actions);
460
+ return;
461
+ }
462
+ if (idleMinutes >= config.stage2_minutes && lastStage < 2) {
463
+ if ((await resumeAgent(agentId, `Resuming after auto-detected stall (${idleMinutes} min idle). Review your last work and decide whether to continue or signal done with \`pan done ${issueId}\`.`)).success) {
464
+ writeStuckRemediationState(agentId, stageState(2, now, firstStuck));
465
+ logAction(actions, transitionAction(2, issueId, idleMinutes, "resumed"));
466
+ } else {
467
+ const action = `${transitionAction(2, issueId, idleMinutes, "resume-failed")} — death: ${describeAgentDeath(agentId)}`;
468
+ console.warn(action);
469
+ logDeaconEventSync(action);
470
+ }
471
+ return;
472
+ }
473
+ if (idleMinutes >= config.stage1_minutes && lastStage < 1) {
474
+ await messageAgent(agentId, `You appear stuck — no tool calls for ${idleMinutes} min. If your implementation is complete, run \`pan done ${issueId}\`. Otherwise reply with a one-line summary of what you're waiting on, then continue.`);
475
+ writeStuckRemediationState(agentId, stageState(1, now, firstStuck));
476
+ logAction(actions, transitionAction(1, issueId, idleMinutes, "poked"));
477
+ }
478
+ }
479
+ function decidePlanningWedgeRemediation(opts) {
480
+ const { mirrorState, pendingQuestions, wedgeProven, workActivityMs, lastStage, now, config } = opts;
481
+ if (pendingQuestions > 0) return { kind: "none" };
482
+ if (mirrorState !== "active") return { kind: "none" };
483
+ if (!wedgeProven) return { kind: "none" };
484
+ if (workActivityMs === null || !Number.isFinite(workActivityMs)) return { kind: "none" };
485
+ const idleMinutes = Math.floor((now - workActivityMs) / 6e4);
486
+ if (idleMinutes >= config.stage3_minutes) {
487
+ if (lastStage >= 3) return { kind: "none" };
488
+ return {
489
+ kind: "troubled",
490
+ idleMinutes
491
+ };
492
+ }
493
+ if (idleMinutes >= config.stage2_minutes) {
494
+ if (lastStage >= 2) return { kind: "none" };
495
+ return {
496
+ kind: "kill-resume",
497
+ idleMinutes
498
+ };
499
+ }
500
+ if (idleMinutes >= config.stage1_minutes) {
501
+ if (lastStage >= 1) return { kind: "none" };
502
+ return {
503
+ kind: "interrupt-nudge",
504
+ idleMinutes
505
+ };
506
+ }
507
+ return { kind: "none" };
508
+ }
509
+ /**
510
+ * Episode-clear rule for the planning wedge path, keyed on WORK activity only
511
+ * (never pane repaints — the spinner would "clear" a still-wedged episode and
512
+ * re-fire stage 1 every tick): work flowing after the episode opened means the
513
+ * recovery worked.
514
+ */
515
+ function shouldClearPlanningWedgeEpisode(stuckState, workActivityMs) {
516
+ if (!stuckState) return false;
517
+ const firstStuckMs = new Date(stuckState.firstStuckAt).getTime();
518
+ return Number.isFinite(firstStuckMs) && workActivityMs > firstStuckMs;
519
+ }
520
+ /**
521
+ * Execute one wedge-ladder decision. Ordering is the contract: stage 1 sends
522
+ * Escape BEFORE queueing its single nudge (the interrupt returns the prompt;
523
+ * the nudge — and any queued operator messages — are processed after). Stage 2
524
+ * kills the session and plain-resumes the SAME saved session id, so the
525
+ * transcript (and every explorer's findings) survives — unlike the
526
+ * compact-respawn path that lost conversation-only survey notes in the manual
527
+ * MIN-889 recovery.
528
+ */
529
+ async function executePlanningWedgeDecision(agentId, issueId, decision, firstStuck, now, deps) {
530
+ if (decision.kind === "interrupt-nudge") {
531
+ try {
532
+ await deps.sendEscape(agentId);
533
+ } catch (err) {
534
+ console.error(`[deacon] Failed to interrupt wedged planning session ${agentId}:`, err);
535
+ return;
536
+ }
537
+ const message = `Your previous turn stalled for ${decision.idleMinutes} min with no progress and was interrupted (a hung provider call). Process any queued operator messages first. Then collect background-task results NON-blocking (TaskOutput with block:false) — every child that reached a terminal state already has its result or error available; do NOT re-enter a blocking wait. Continue planning now: write the PRD/xBRIEF artifacts and proceed to your instructed stopping point.`;
538
+ let deliveryError = null;
539
+ try {
540
+ await deps.message(agentId, message);
541
+ } catch (err) {
542
+ deliveryError = err instanceof Error ? err.message : String(err);
543
+ }
544
+ deps.writeState(agentId, stageState(1, now, firstStuck));
545
+ deps.log(deliveryError ? `${transitionAction(1, issueId, decision.idleMinutes, "interrupted-wedged-turn")} — nudge delivery failed: ${deliveryError}` : transitionAction(1, issueId, decision.idleMinutes, "interrupted-wedged-turn"));
546
+ return;
547
+ }
548
+ if (decision.kind === "kill-resume") {
549
+ try {
550
+ await deps.killSession(agentId);
551
+ } catch {}
552
+ const message = `Resuming after an automated stall recovery (${decision.idleMinutes} min with no progress). Your transcript is intact — continue planning from where you left off. Collect background-task results NON-blocking (TaskOutput with block:false) and proceed.`;
553
+ const result = await deps.resume(agentId, message);
554
+ if (result.success) {
555
+ deps.writeState(agentId, stageState(2, now, firstStuck));
556
+ deps.log(transitionAction(2, issueId, decision.idleMinutes, "kill-resumed-wedged-planning"));
557
+ } else {
558
+ deps.markTroubled(agentId);
559
+ deps.writeState(agentId, stageState(3, now, firstStuck));
560
+ deps.log(`${transitionAction(3, issueId, decision.idleMinutes, "kill-resume-failed-troubled")} — ${result.error ?? "unknown"}`);
561
+ await deps.surfaceNeedsYou();
562
+ }
563
+ return;
564
+ }
565
+ deps.markTroubled(agentId);
566
+ deps.writeState(agentId, stageState(3, now, firstStuck));
567
+ deps.log(transitionAction(3, issueId, decision.idleMinutes, "wedged-planning-troubled"));
568
+ await deps.surfaceNeedsYou();
569
+ }
570
+ async function evaluatePlanningAgent(agent, config, now, actions) {
571
+ const agentId = agent.id;
572
+ const issueId = issueIdForAgent(agent);
573
+ const pendingQuestions = await Effect.runPromise(countPendingAskUserQuestionsForAgent(agentId));
574
+ if (pendingQuestions > 0) {
575
+ if (!isAgentIdleForNudge(agentId, 300 * 1e3, now)) return;
576
+ if (agent.auto !== true) return;
577
+ const lastActivityMs = getAgentEffectiveLastActivityMs(agentId);
578
+ if (lastActivityMs === null || !Number.isFinite(lastActivityMs)) return;
579
+ const lastActivity = new Date(lastActivityMs).toISOString();
580
+ const stuckState = readStuckRemediationState(agentId);
581
+ if (stuckState) {
582
+ const firstStuckMs = new Date(stuckState.firstStuckAt).getTime();
583
+ if (Number.isFinite(firstStuckMs) && lastActivityMs > firstStuckMs) {
584
+ clearStuckRemediationState(agentId);
585
+ return;
586
+ }
587
+ }
588
+ const idleMinutes = Math.floor((now - lastActivityMs) / 6e4);
589
+ const lastStage = stuckState?.lastStage ?? 0;
590
+ if (idleMinutes < config.stage1_minutes || lastStage >= 1) return;
591
+ await messageAgent(agentId, `This planning session was launched with \`pan plan ${issueId} --auto\`, so do not wait for operator input. Proceed with the most defensible default from the issue/PRD/comments, record the choice in \`plan.autoDecisions[]\` with rationale, and continue to \`pan plan finalize\`. Only halt for a genuine contradiction between authoritative inputs.`);
592
+ writeStuckRemediationState(agentId, stageState(1, now, firstStuckAt(lastActivity, stuckState)));
593
+ logAction(actions, transitionAction(1, issueId, idleMinutes, "auto-planning-default"));
594
+ return;
595
+ }
596
+ const workActivityMs = getAgentWorkActivityMs(agentId);
597
+ if (workActivityMs === null || !Number.isFinite(workActivityMs)) return;
598
+ const stuckState = readStuckRemediationState(agentId);
599
+ if (shouldClearPlanningWedgeEpisode(stuckState, workActivityMs)) {
600
+ clearStuckRemediationState(agentId);
601
+ return;
602
+ }
603
+ const mirrorState = getAgentRuntimeStateSync(agentId)?.state ?? null;
604
+ if (mirrorState !== "active") return;
605
+ if (Math.floor((now - workActivityMs) / 6e4) < config.stage1_minutes) return;
606
+ const decision = decidePlanningWedgeRemediation({
607
+ mirrorState,
608
+ pendingQuestions,
609
+ wedgeProven: agent.workspace ? readAgentBackgroundTaskWedgeEvidence(agentId, agent.workspace)?.wedged === true : false,
610
+ workActivityMs,
611
+ lastStage: stuckState?.lastStage ?? 0,
612
+ now,
613
+ config
614
+ });
615
+ if (decision.kind === "none") return;
616
+ await executePlanningWedgeDecision(agentId, issueId, decision, firstStuckAt(new Date(workActivityMs).toISOString(), stuckState), now, {
617
+ sendEscape: (id) => sendEscapeKeyAsync(id),
618
+ message: (id, msg) => messageAgent(id, msg),
619
+ killSession: (id) => Effect.runPromise(killSession(id)),
620
+ resume: (id, msg) => resumeAgent(id, msg),
621
+ markTroubled: (id) => markAgentTroubled(id),
622
+ writeState: (id, state) => writeStuckRemediationState(id, state),
623
+ surfaceNeedsYou: () => surfaceStuckNeedsYou(agent, issueId, firstStuckAt(new Date(workActivityMs).toISOString(), stuckState), actions),
624
+ log: (msg) => logAction(actions, msg)
625
+ });
626
+ }
627
+ const FLYWHEEL_RESPAWN_WINDOW_MS = 1800 * 1e3;
628
+ const FLYWHEEL_MAX_RESPAWNS = 3;
629
+ const FLYWHEEL_ORCHESTRATOR_AGENT_ID = "flywheel-orchestrator";
630
+ /**
631
+ * Pure decision for recovering a dead or wedged flywheel orchestrator (no I/O —
632
+ * side effects live in remediateFlywheelOrchestrator). The respawn cap
633
+ * (FLYWHEEL_MAX_RESPAWNS within FLYWHEEL_RESPAWN_WINDOW_MS) stops an infinite
634
+ * relaunch loop: past the cap, escalate to paused+troubled. `hasActiveRun` false
635
+ * ⇒ the operator stopped the flywheel deliberately ⇒ do not resurrect.
636
+ */
637
+ function decideFlywheelRemediation(opts) {
638
+ if (!opts.hasActiveRun) return { kind: "noop" };
639
+ const lastRespawnMs = opts.prev?.lastRespawnAt ? new Date(opts.prev.lastRespawnAt).getTime() : 0;
640
+ const respawnCount = Number.isFinite(lastRespawnMs) && opts.now - lastRespawnMs < FLYWHEEL_RESPAWN_WINDOW_MS ? opts.prev?.respawnCount ?? 0 : 0;
641
+ if (respawnCount >= FLYWHEEL_MAX_RESPAWNS) return {
642
+ kind: "escalate",
643
+ respawnCount
644
+ };
645
+ return {
646
+ kind: "relaunch",
647
+ respawnCount: respawnCount + 1
648
+ };
649
+ }
650
+ /** True when the orchestrator's process is actually gone (session missing or dead pane). */
651
+ function isFlywheelOrchestratorDead(agentId) {
652
+ if (!sessionExistsSync(agentId)) return true;
653
+ return listPaneValuesSync(agentId, "#{pane_dead}").some((v) => v === "1");
654
+ }
655
+ /**
656
+ * Recover a dead or wedged flywheel orchestrator: relaunch (capped) or, past the
657
+ * cap, pause+trouble. `reason` describes why recovery fired (death vs wedge) for
658
+ * the deacon log. NO_RESUME is intentionally NOT consulted (see header comment) —
659
+ * the operator gate is the active run (`pan flywheel stop`) / patrol freeze.
660
+ */
661
+ async function remediateFlywheelOrchestrator(agentId, now, actions, reason) {
662
+ const decision = decideFlywheelRemediation({
663
+ hasActiveRun: Boolean(getFlywheelActiveRunId()),
664
+ prev: readStuckRemediationState(agentId),
665
+ now
666
+ });
667
+ if (decision.kind === "noop") return;
668
+ const { resumeFlywheel, pauseFlywheel } = await import("./flywheel-BCZS-FlW.js");
669
+ const prev = readStuckRemediationState(agentId);
670
+ const nowIso = new Date(now).toISOString();
671
+ if (decision.kind === "escalate") {
672
+ await pauseFlywheel();
673
+ markAgentTroubled(agentId);
674
+ writeStuckRemediationState(agentId, {
675
+ lastStage: 3,
676
+ lastStageAt: nowIso,
677
+ firstStuckAt: prev?.firstStuckAt ?? nowIso,
678
+ respawnCount: decision.respawnCount,
679
+ lastRespawnAt: prev?.lastRespawnAt
680
+ });
681
+ logAction(actions, `[deacon] FLYWHEEL orchestrator ${reason} and exceeded ${FLYWHEEL_MAX_RESPAWNS} relaunches in ${FLYWHEEL_RESPAWN_WINDOW_MS / 6e4}min — paused + troubled; operator needed`);
682
+ return;
683
+ }
684
+ try {
685
+ killSessionSync(agentId);
686
+ } catch {}
687
+ try {
688
+ await resumeFlywheel({ resumeCause: "system" });
689
+ writeStuckRemediationState(agentId, {
690
+ lastStage: 0,
691
+ lastStageAt: nowIso,
692
+ firstStuckAt: nowIso,
693
+ respawnCount: decision.respawnCount,
694
+ lastRespawnAt: nowIso
695
+ });
696
+ logAction(actions, `[deacon] FLYWHEEL orchestrator ${reason} — fresh-launched (relaunch ${decision.respawnCount}/${FLYWHEEL_MAX_RESPAWNS})`);
697
+ } catch (error) {
698
+ logAction(actions, `[deacon] FLYWHEEL orchestrator ${reason} — relaunch FAILED: ${error instanceof Error ? error.message : String(error)}`);
699
+ }
700
+ }
701
+ async function evaluateFlywheelOrchestrator(agent, config, now, actions) {
702
+ const agentId = agent.id;
703
+ if (isFlywheelOrchestratorDead(agentId)) {
704
+ await remediateFlywheelOrchestrator(agentId, now, actions, `DIED (${describeAgentDeath(agentId)})`);
705
+ return;
706
+ }
707
+ if (!isAgentIdleForNudge(agentId, 300 * 1e3, now)) return;
708
+ const runtime = getAgentRuntimeStateSync(agentId);
709
+ if (!runtime?.lastActivity) return;
710
+ const lastActivityMs = new Date(runtime.lastActivity).getTime();
711
+ if (!Number.isFinite(lastActivityMs)) return;
712
+ const stuckState = readStuckRemediationState(agentId);
713
+ if (stuckState) {
714
+ const firstStuckMs = new Date(stuckState.firstStuckAt).getTime();
715
+ if (Number.isFinite(firstStuckMs) && lastActivityMs > firstStuckMs) {
716
+ clearStuckRemediationState(agentId);
717
+ return;
718
+ }
719
+ }
720
+ const idleMinutes = Math.floor((now - lastActivityMs) / 6e4);
721
+ const lastStage = stuckState?.lastStage ?? 0;
722
+ const firstStuck = firstStuckAt(runtime.lastActivity, stuckState);
723
+ if (idleMinutes >= config.flywheel_stage3_minutes && lastStage < 3) {
724
+ await remediateFlywheelOrchestrator(agentId, now, actions, `wedged (idle ${idleMinutes}min)`);
725
+ return;
726
+ }
727
+ if (idleMinutes >= config.flywheel_stage2_minutes && lastStage < 2) {
728
+ await messageAgent(agentId, `Stage 2: idle ${idleMinutes} min — run a FULL flywheel tick NOW: inventory -> diagnose -> suggest -> launch ready work -> \`pan flywheel emit-status\`. Then call ScheduleWakeup(delaySeconds:1000) to arm the next tick. Do NOT ask the operator a question, do NOT wait, and do NOT just emit a stale status or pause.`);
729
+ writeStuckRemediationState(agentId, stageState(2, now, firstStuck, stuckState));
730
+ logAction(actions, transitionAction(2, "FLYWHEEL", idleMinutes, "escalated-nudge"));
731
+ return;
732
+ }
733
+ if (idleMinutes >= config.flywheel_stage1_minutes && lastStage < 1) {
734
+ await messageAgent(agentId, `You appear stuck — ${idleMinutes} min since your last tick. Run a FULL flywheel tick NOW: inventory -> diagnose -> suggest -> launch ready work -> \`pan flywheel emit-status\`. Then call ScheduleWakeup(delaySeconds:1000) to arm the next tick. Do NOT ask the operator a question, do NOT wait, and do NOT just emit a stale status or pause.`);
735
+ writeStuckRemediationState(agentId, stageState(1, now, firstStuck, stuckState));
736
+ logAction(actions, transitionAction(1, "FLYWHEEL", idleMinutes, "poked"));
737
+ }
738
+ }
739
+ async function reconcileActiveFlywheelWithoutRunningAgent(now, actions) {
740
+ if (!getFlywheelActiveRunId()) return;
741
+ if (isFlywheelGloballyPaused()) return;
742
+ if (sessionExistsSync(FLYWHEEL_ORCHESTRATOR_AGENT_ID)) return;
743
+ await remediateFlywheelOrchestrator(FLYWHEEL_ORCHESTRATOR_AGENT_ID, now, actions, `DIED (${describeAgentDeath(FLYWHEEL_ORCHESTRATOR_AGENT_ID)})`);
744
+ }
745
+ async function checkStuckAgentRemediation(opts = {}) {
746
+ const config = loadCloisterConfigSync().stuck_remediation ?? DEFAULT_CLOISTER_CONFIG.stuck_remediation;
747
+ if (!config.enabled) return [];
748
+ const actions = [];
749
+ const now = opts.now ?? Date.now();
750
+ const runningAgents = listRunningAgentsSync();
751
+ let sawFlywheelOrchestrator = false;
752
+ for (const agent of runningAgents) {
753
+ if (agent.id === FLYWHEEL_ORCHESTRATOR_AGENT_ID || agent.role === "flywheel") sawFlywheelOrchestrator = true;
754
+ try {
755
+ await evaluateAgent(agent, config, now, actions);
756
+ } catch (error) {
757
+ const message = `[deacon] stuck-remediation agent=${agent.id || "(unknown)"} error=${error instanceof Error ? error.message : String(error)}`;
758
+ console.error(message, error);
759
+ logDeaconEventSync(message);
760
+ }
761
+ }
762
+ if (!sawFlywheelOrchestrator) try {
763
+ await reconcileActiveFlywheelWithoutRunningAgent(now, actions);
764
+ } catch (error) {
765
+ const message = `[deacon] stuck-remediation agent=${FLYWHEEL_ORCHESTRATOR_AGENT_ID} error=${error instanceof Error ? error.message : String(error)}`;
766
+ console.error(message, error);
767
+ logDeaconEventSync(message);
768
+ }
769
+ return actions;
770
+ }
771
+ //#endregion
772
+ export { shouldClearPlanningWedgeEpisode as a, executePlanningWedgeDecision as i, decideFlywheelRemediation as n, shouldSkipIdlePokeForAgent as o, decidePlanningWedgeRemediation as r, shouldSkipReviewStatus as s, checkStuckAgentRemediation as t };
773
+
774
+ //# sourceMappingURL=stuck-remediation-kta3KN7c.js.map