@overdeck/desktop 0.46.0 → 0.47.1

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 (388) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +4 -1
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-CCwFGICj.js → acceptance-criteria-Cd7ZGZCq.js} +2 -2
  4. package/server/{advancing-selfheal-De1L-Sb4.js → advancing-selfheal-DieFp3qi.js} +6 -6
  5. package/server/{agent-gc-CBULruzm.js → agent-gc-BMcgTDl7.js} +5 -5
  6. package/server/{agent-state-VQk8fY9F.js → agent-state-DyZJia9f.js} +1 -1
  7. package/server/{agent-state-service-BlnSkRFA.js → agent-state-service-BOzQhLjU.js} +15 -9
  8. package/server/agent-state-service-DFO6qvHp.js +2 -0
  9. package/server/agent-state-source-Ca_zCaII.js +21 -0
  10. package/server/{agents-C5rWYhb6.js → agents-CtACUuVG.js} +23 -16
  11. package/server/{agents-BKKkxKgK.js → agents-Dnn4XgdB.js} +1 -1
  12. package/server/archive-planning-BHCd_eL5.js +2 -0
  13. package/server/{archive-planning-C0lAbNB_.js → archive-planning-Binfb99i.js} +10 -6
  14. package/server/{artifact-index-jobs-ug6ZxIP5.js → artifact-index-jobs-Jn7BGOtV.js} +2 -2
  15. package/server/{assemble-DnffNpOo.js → assemble-DsqK9OAq.js} +2 -2
  16. package/server/{tmux-dedup-DbN6MGzM.js → auto-spawn-consent-BooqhC3L.js} +262 -13
  17. package/server/{backlog-auto-trigger-Dh-i9PQf.js → backlog-auto-trigger-BADGPxov.js} +3 -3
  18. package/server/{behavior-CfIg6pKp.js → behavior-B7biGtFT.js} +2 -2
  19. package/server/boot-reconciled-stop-events-bQUzU8ns.js +44 -0
  20. package/server/{bridge-pool-patrol-CUFmjVDN.js → bridge-pool-patrol-DsPj6F7t.js} +1 -1
  21. package/server/{briefing-freshness-DHmCSLar.js → briefing-freshness-CUerZqWd.js} +2 -2
  22. package/server/{build-info-CuFfxZxp.js → build-info-D0q_i8WM.js} +3 -3
  23. package/server/{build-info-BP160gU7.js → build-info-Du74MKiP.js} +1 -1
  24. package/server/{checkpoint-manager-Dxh0FYsv.js → checkpoint-manager-Cu-R5Uzg.js} +1 -1
  25. package/server/{checkpoint-manager-DEWD82qK.js → checkpoint-manager-R5tnaxEY.js} +2 -2
  26. package/server/checkpoint-worker.js +1 -1
  27. package/server/{checkpoints-CZvbtLnr.js → checkpoints-DYtLu-PB.js} +2 -2
  28. package/server/{checkpoints-DMTgXuLG.js → checkpoints-wF84ubZ8.js} +1 -1
  29. package/server/{claude-hooks-provision-fvy4RD2b.js → claude-hooks-provision-DXI3Wqlm.js} +2 -2
  30. package/server/{claude-hooks-provision-CN-xo-do.js → claude-hooks-provision-UKxCeOyj.js} +1 -1
  31. package/server/{claude-permissions-CN0cSCPp.js → claude-permissions-DYVLnX9t.js} +2 -2
  32. package/server/{claude-settings-overlay-CJn35FHQ.js → claude-settings-overlay-DsbpIq2d.js} +2 -2
  33. package/server/{claude-settings-overlay-Dabi9slj.js → claude-settings-overlay-DxP2F_gY.js} +1 -1
  34. package/server/cli-D6mRfUE6.js +3 -0
  35. package/server/{cli-oCWYA1pE.js → cli-DzRKxxP_.js} +9 -9
  36. package/server/{cliproxy-C8mB3KuB.js → cliproxy-CG4meRFc.js} +2 -2
  37. package/server/{cliproxy-PGwTX_o8.js → cliproxy-Cwzw39yN.js} +1 -1
  38. package/server/{close-issue-D5MF5GqF.js → close-issue-BX1bATJy.js} +5 -5
  39. package/server/{closed-issue-reaper-CJ24u0Zt.js → closed-issue-reaper-DvnTSN6a.js} +1 -1
  40. package/server/{closed-issue-reaper-Cltx86x5.js → closed-issue-reaper-hLt0W86J.js} +62 -12
  41. package/server/{codex-Drlf5Xhf.js → codex-BYwi1uyW.js} +6 -6
  42. package/server/{codex-parser-DpB89Vqa.js → codex-parser-Poyz29GE.js} +2 -2
  43. package/server/{codex-BdEsUFWh.js → codex-rnJN3v3_.js} +1 -1
  44. package/server/{compaction-continuation-K2AxQX4H.js → compaction-continuation-DtMfHN0f.js} +3 -3
  45. package/server/{config-Dr3pW6w6.js → config-CX4vk1CV.js} +2 -2
  46. package/server/{config-DV-grfQc.js → config-R793W0yA.js} +1 -1
  47. package/server/{config-B2IMcBxx.js → config-ktAVnp4s.js} +2 -2
  48. package/server/{config-yaml-CmOPzmBb.js → config-yaml-CxdwhAIA.js} +10 -2
  49. package/server/{conflict-gate-B9cN3SBi.js → conflict-gate-BNv6UolH.js} +59 -13
  50. package/server/conflict-gate-BSTlwCtF.js +3 -0
  51. package/server/{context-layers-D6LZo3l1.js → context-layers-DCdaGsRG.js} +2 -2
  52. package/server/{context-layers-dR5YxHYB.js → context-layers-DlWsDiRF.js} +3 -3
  53. package/server/{control-settings-C7DUehE1.js → control-settings-qYYHrIqy.js} +13 -6
  54. package/server/{conversation-compaction-Dj4FAKoZ.js → conversation-compaction-BxUKObHb.js} +1 -1
  55. package/server/{conversation-compaction-BoqdDXWF.js → conversation-compaction-CXQrN3I_.js} +8 -8
  56. package/server/{conversation-service-BCxl4f8Z.js → conversation-service-CDnQ3ayN.js} +1 -1
  57. package/server/{conversation-service-5aCnq1zR.js → conversation-service-CZiUE8Uw.js} +8 -7
  58. package/server/{conversations-BUpYsOZg.js → conversations-D7lR670u.js} +4 -4
  59. package/server/{conversations-C34dyIb9.js → conversations-DXl5YTf4.js} +1 -1
  60. package/server/{cost-Bgcub5kW.js → cost-Aat8HfO_.js} +2 -2
  61. package/server/{cost-CvxRrucd.js → cost-CWvN9FP2.js} +3 -3
  62. package/server/{cost-sync-Dv3LUaNW.js → cost-sync-DiUBXwl6.js} +3 -3
  63. package/server/{dag-ombYYt4s.js → dag-5QlmH0oC.js} +2 -2
  64. package/server/{dangerous-git-ops-BcJPC5Rr.js → dangerous-git-ops-DWX6Og8c.js} +1 -1
  65. package/server/dashboard-db-worker.js +7 -7
  66. package/server/{deacon-hi9KLPLT.js → deacon-B1LD5cJU.js} +741 -211
  67. package/server/{deacon-DrXqT9LQ.js → deacon-PW_bg4uL.js} +3 -3
  68. package/server/{deacon-nudge-log-BNBebzeL.js → deacon-nudge-log-DPHsO14z.js} +3 -3
  69. package/server/{deacon-pending-lifecycle-Cpk0k7Hi.js → deacon-pending-lifecycle-2ZflPxgo.js} +3 -3
  70. package/server/deacon-swarm-BkKR7SXu.js +2 -0
  71. package/server/{deacon-swarm-DBxUaO-A.js → deacon-swarm-DwGUgSVp.js} +15 -14
  72. package/server/deacon.js +8 -8
  73. package/server/{dead-end-trip-CQcP70ND.js → dead-end-trip-B06RFIr2.js} +3 -3
  74. package/server/{delivery-Da0zEMY4.js → delivery-C2M73sBg.js} +1 -1
  75. package/server/{deploy-patrol-Df-Tmaq0.js → deploy-patrol-BNjeCL8u.js} +8 -8
  76. package/server/{deploy-queue-UjKGYsDe.js → deploy-queue-CKT_Ia9p.js} +2 -2
  77. package/server/{deploy-queue-9SrhZR63.js → deploy-queue-DMMYhFC8.js} +1 -1
  78. package/server/{deploy-window-rpqpWqHA.js → deploy-window-DC8lze3d.js} +6 -6
  79. package/server/{deploy-window-jOiPRHL0.js → deploy-window-D_AimdNN.js} +1 -1
  80. package/server/{dev-supervisor-CC46Ig8q.js → dev-supervisor-C4F0vbno.js} +2 -2
  81. package/server/{devcontainer-renderer-68CSCRnu.js → devcontainer-renderer-66sqMQIi.js} +3 -3
  82. package/server/{dist-CJy72uEg.js → dist-C5FT9lTG.js} +1 -1
  83. package/server/dist-qcf9gAP0.js +3 -0
  84. package/server/{dist-src-Bik83hFi.js → dist-src-B-AlGWSl.js} +1 -1
  85. package/server/{docker-BMVTSFL5.js → docker-BxrFhTZ_.js} +1 -1
  86. package/server/{docker-Dam7mbIB.js → docker-CoAT8R0J.js} +2 -2
  87. package/server/{dod-Dar-yheg.js → dod-Bg6wsKTV.js} +26 -5
  88. package/server/durable-review-pipeline-D_DcfIGP.js +3 -0
  89. package/server/{durable-review-pipeline-CGZ5QBxh.js → durable-review-pipeline-HkAgnx0L.js} +5 -2
  90. package/server/{ensure-devcontainer-C98V8yW-.js → ensure-devcontainer-Bg5HJAcO.js} +1 -1
  91. package/server/{ensure-devcontainer-B057YA81.js → ensure-devcontainer-DTxChVuA.js} +4 -4
  92. package/server/{esm-shims-Br9BPdkR.js → esm-shims-CaBWIR7f.js} +1 -1
  93. package/server/{event-store-ELqkVOn0.js → event-store-5UKzh9Jf.js} +1 -1
  94. package/server/{event-store-zY5MJHgF.js → event-store-CrHcVC5_.js} +3 -3
  95. package/server/{events-D6pyqhzM.js → events-ChEFB7Jp.js} +1 -1
  96. package/server/{events-D9PR1IC0.js → events-DhRN-6vM.js} +3 -3
  97. package/server/{factory-CRoOpGsF.js → factory-BezSPaTd.js} +5 -5
  98. package/server/{feature-registry-population--YUXU999.js → feature-registry-population-DhswNiXx.js} +4 -4
  99. package/server/{feature-registry-storage-BORBTo0y.js → feature-registry-storage-CUVNpAso.js} +2 -2
  100. package/server/{features--nFkJY8v.js → features-B2CfNPFw.js} +2 -2
  101. package/server/{feedback-target-C0ZzyHvU.js → feedback-target-CMrEAoeA.js} +1 -1
  102. package/server/{feedback-target-Dt9BsapX.js → feedback-target-VBr9gKgX.js} +18 -7
  103. package/server/{feedback-writer-D1fm-5Z8.js → feedback-writer-CY91ckuw.js} +1 -1
  104. package/server/{feedback-writer-BG0RUZiu.js → feedback-writer-xpFgU632.js} +5 -5
  105. package/server/{flywheel-BiT3odRb.js → flywheel-CTVY3yCG.js} +38 -19
  106. package/server/{flywheel-CLVB55Be.js → flywheel-DQqsSm7P.js} +14 -14
  107. package/server/{flywheel-BekukH4i.js → flywheel-DsICCjTR.js} +1 -1
  108. package/server/{flywheel-merge-order-BKw9o6ku.js → flywheel-merge-order-C-TI4JGu.js} +1 -1
  109. package/server/{flywheel-merge-order-BJv1DZz1.js → flywheel-merge-order-CMGz-imq.js} +7 -7
  110. package/server/forge-D647IMNa.js +3 -0
  111. package/server/{forge-CZbSg6Ds.js → forge-RTNqJe6a.js} +2 -2
  112. package/server/{from-D_4_dk7i.js → from-DxGcivc9.js} +1 -1
  113. package/server/fs-lock-Bre3sGoz.js +130 -0
  114. package/server/{fts-db-BeOomFa-.js → fts-db-wROfFfje.js} +2 -2
  115. package/server/{fts-operations-BdewJ_g9.js → fts-operations-BuTdlZFA.js} +2 -2
  116. package/server/{git-utils-CI6cwyyC.js → git-utils-CedsVume.js} +1 -1
  117. package/server/{git-utils-ameCgDdy.js → git-utils-DtdoEXJk.js} +4 -4
  118. package/server/{github-app-DtAsvwzK.js → github-app-DIE8BkHI.js} +1 -1
  119. package/server/{github-app-CQ1Lo6LA.js → github-app-gVnZcP9B.js} +2 -2
  120. package/server/{github-client-BfyDxuRN.js → github-client-BrAC6ELh.js} +3 -3
  121. package/server/{github-client-Cj0yl_07.js → github-client-CBOkvBUl.js} +1 -1
  122. package/server/{github-pr-lookup-BDq6Wznz.js → github-pr-lookup-CgMULTPf.js} +2 -2
  123. package/server/{harness-binary-DqkftwTb.js → harness-binary-CnBHpd57.js} +2 -2
  124. package/server/{harness-resolve-CqMqM1Mb.js → harness-resolve-BVj6sI8m.js} +4 -4
  125. package/server/{health-events-CazRxJUS.js → health-events-BBWO_Dh9.js} +2 -2
  126. package/server/{health-events-_xfTaOUs.js → health-events-Der6bOkm.js} +1 -1
  127. package/server/{hooks-BnJsxlSq.js → hooks-BJNal-bs.js} +1 -1
  128. package/server/{hooks-BO3QT1sn.js → hooks-BOavco-e.js} +2 -2
  129. package/server/{hume-CDYJxqx-.js → hume-DBocJFkA.js} +2 -2
  130. package/server/hume-DtWN8oV5.js +3 -0
  131. package/server/{idle-stack-reaper-BYqERdkE.js → idle-stack-reaper-CyGxXOfC.js} +1 -1
  132. package/server/{idle-stack-reaper-CnGx_PO_.js → idle-stack-reaper-DQFh8rDh.js} +2 -2
  133. package/server/{in-flight-guard-Bq3epG58.js → in-flight-guard-nXEKoxI7.js} +1 -1
  134. package/server/{infra-BjuxvjdS.js → infra-BDQDRopn.js} +15 -4
  135. package/server/{injection-UCf8EsjX.js → injection-CCopdUKz.js} +7 -7
  136. package/server/{injection-DZxlV2al.js → injection-DfFFEMKL.js} +1 -1
  137. package/server/inspect-agent-CPqXI81t.js +2 -0
  138. package/server/{inspect-agent-6kylZnrm.js → inspect-agent-FCDlNT_i.js} +12 -12
  139. package/server/{internal-token-DvMTQSOS.js → internal-token-BG6yQKNL.js} +2 -2
  140. package/server/{internal-token-M9omeXM1.js → internal-token-BJZa40Ld.js} +1 -1
  141. package/server/{io-VHvc0Ssp.js → io-C0NV7y6C.js} +4 -4
  142. package/server/{issue-closed-B6KJkmHZ.js → issue-closed-CNNGbhWm.js} +8 -8
  143. package/server/{issue-lifecycle-C4Zj0WmE.js → issue-lifecycle-BXfzxFCD.js} +29 -23
  144. package/server/{issue-lifecycle-9gk3fnXN.js → issue-lifecycle-DSH0GpWC.js} +1 -1
  145. package/server/{issue-service-singleton-DmCh7EHj.js → issue-service-singleton-F3A5VP6M.js} +10 -10
  146. package/server/{issue-service-singleton-PMx8F1jr.js → issue-service-singleton-lwFJ4dHk.js} +1 -1
  147. package/server/{issues-CgnQ1OGQ.js → issues-DA-U_MpR.js} +2 -2
  148. package/server/{jsonl-parser-DJOH_O-w.js → jsonl-parser-BXiGANOh.js} +3 -3
  149. package/server/{label-cleanup-Dv7AV_R1.js → label-cleanup-BnxRk0Eo.js} +3 -3
  150. package/server/{lifecycle-CTdOWYMi.js → lifecycle-DOgGnpIv.js} +2 -2
  151. package/server/{lifecycle-DDN8ApVY.js → lifecycle-Di48-w4x.js} +6 -6
  152. package/server/{lifecycle-io-D-lGdzK3.js → lifecycle-io-1XSeczTr.js} +5 -5
  153. package/server/{lifecycle-io-D_zTLvP1.js → lifecycle-io-eVG6v_8-.js} +1 -1
  154. package/server/{linear-client-BQU36QqE.js → linear-client-CYZRrcjp.js} +3 -3
  155. package/server/{linear-client-CY4O_Tu3.js → linear-client-CvGo9n7M.js} +1 -1
  156. package/server/{linear-mcp-auth-BnU4TYfY.js → linear-mcp-auth-Cp0XaP96.js} +5 -5
  157. package/server/{linear-mcp-auth-NYBq_oHZ.js → linear-mcp-auth-DoJnjdPZ.js} +1 -1
  158. package/server/memory-fts-worker.js +1 -1
  159. package/server/{merge-Bpx4jjht.js → merge-DO14mOr3.js} +3 -3
  160. package/server/{merge-idOG--29.js → merge-ZF99ig6A.js} +1 -1
  161. package/server/{merge-agent-DrXa1CpW.js → merge-agent-C1-9zbP_.js} +1 -1
  162. package/server/{merge-agent-DdMVSV2Y.js → merge-agent-gpiRkcvj.js} +31 -31
  163. package/server/{merge-batch-C5q1c1GX.js → merge-batch-C11ocNkO.js} +1 -1
  164. package/server/{merge-completeness-BMm8tMyZ.js → merge-completeness-BUzPZy0E.js} +4 -4
  165. package/server/{merge-completeness-D0ljXbk3.js → merge-completeness-CghMbyX7.js} +1 -1
  166. package/server/merge-ops-7QqziXAh.js +2 -0
  167. package/server/merge-rebase-B4pgzvQJ.js +2 -0
  168. package/server/{merge-rebase-xLnMlw5h.js → merge-rebase-iwlUzZjr.js} +2 -2
  169. package/server/{merge-set-DzsOTBg5.js → merge-set-BymrheTj.js} +1 -1
  170. package/server/{merge-set-DH7ot3yz.js → merge-set-Dbnx4chw.js} +4 -4
  171. package/server/{merge-sync-CQ-LgZ1_.js → merge-sync-CM978zez.js} +7 -4
  172. package/server/merge-sync-CqEtqjI2.js +3 -0
  173. package/server/{merge-train-DTEMyIu4.js → merge-train-DvLcAn1G.js} +4 -4
  174. package/server/{merge-train-deps-CNPJzepw.js → merge-train-deps-Cl_kcRbO.js} +21 -15
  175. package/server/{merge-verification-x3JO8Dtz.js → merge-verification-c9Y9mllw.js} +6 -6
  176. package/server/{merged-docker-cleanup-worker-CTpC27Bs.js → merged-docker-cleanup-worker-CGiDOdv8.js} +3 -3
  177. package/server/{merged-docker-cleanup-worker-Cdi9apm-.js → merged-docker-cleanup-worker-DgsLOx3E.js} +1 -1
  178. package/server/{multipart-parser-IMSBfePV.js → multipart-parser-D0twwRjz.js} +2 -2
  179. package/server/{no-resume-mode-C5ULAXwO.js → no-resume-mode-DZvP0M_S.js} +1 -1
  180. package/server/node_modules/.package-lock.json +4 -4
  181. package/server/node_modules/@types/node/README.md +1 -1
  182. package/server/node_modules/@types/node/crypto.d.ts +1 -1
  183. package/server/node_modules/@types/node/package.json +2 -2
  184. package/server/{orphan-proposed-reconciler-CWmOdM9-.js → orphan-proposed-reconciler-6r2OEfYd.js} +1 -1
  185. package/server/{orphan-proposed-reconciler-Dg6U4ADZ.js → orphan-proposed-reconciler-DtQP6oE_.js} +230 -31
  186. package/server/package-lock.json +5 -5
  187. package/server/package.json +1 -1
  188. package/server/{pan-dir-ubraCiUg.js → pan-dir-DAOb1V2-.js} +4 -4
  189. package/server/{paths-cXmOwSbh.js → paths-DuATV5iE.js} +2 -2
  190. package/server/{pending-lifecycle-claim-DEteYdS9.js → pending-lifecycle-claim-DQUHIDfX.js} +2 -2
  191. package/server/persistent-logger-CBj016pT.js +57 -0
  192. package/server/{pickup-D8xtG1J2.js → pickup-zXZl5lQI.js} +4 -3
  193. package/server/{pipeline-membership-CrAPLYtf.js → pipeline-membership-B2yUcBz7.js} +1 -1
  194. package/server/{pipeline-membership-BGSvkT2M.js → pipeline-membership-DHOXmvba.js} +1 -1
  195. package/server/{pipeline-membership-gather-CET40frr.js → pipeline-membership-gather-BIcJ-N0W.js} +114 -9
  196. package/server/{pipeline-membership-gather-DTfcgxLl.js → pipeline-membership-gather-OkLXuvxR.js} +1 -1
  197. package/server/{pipeline-notifier-ImNXknf0.js → pipeline-notifier-BmwrVKsO.js} +1 -1
  198. package/server/{pipeline-notifier-BuQ0e4hF.js → pipeline-notifier-CxMes51i.js} +2 -2
  199. package/server/{post-merge-lifecycle-worker-DbO10pum.js → post-merge-lifecycle-worker-3u_rA4R0.js} +3 -3
  200. package/server/{project-pipelines-Bim6bThI.js → project-pipelines-C3SPFJ38.js} +2 -2
  201. package/server/{project-repos-C0nuoBGv.js → project-repos-BOpBzkO6.js} +2 -2
  202. package/server/{project-repos-CRE6Ykow.js → project-repos-BgW4lcIa.js} +1 -1
  203. package/server/{projects-B03Wr-xc.js → projects-_n3Zui6K.js} +1 -1
  204. package/server/{prompts-BEx08AIu.js → prompts-B0TtboFm.js} +2 -2
  205. package/server/{providers-D7IluJe0.js → providers-BI1mOBQ4.js} +1 -1
  206. package/server/{providers-evXhiQeg.js → providers-O2smCvSz.js} +7 -7
  207. package/server/public/assets/{chunk-BO2N2NFS-D1s4-Sqp.js → chunk-BO2N2NFS-D_pGACYN.js} +4 -4
  208. package/server/public/assets/{diagram-OG6HWLK6-1gdMoSF7.js → diagram-OG6HWLK6-BO6fe3hH.js} +1 -1
  209. package/server/public/assets/{dist-DqDRYW6P.js → dist-5zingMiA.js} +3 -3
  210. package/server/public/assets/{dist-CxAOHbil.js → dist-CVxhbI2E.js} +1 -1
  211. package/server/public/assets/{ganttDiagram-6RSMTGT7-BYex-Ec7.js → ganttDiagram-6RSMTGT7-Bgj4A7kp.js} +1 -1
  212. package/server/public/assets/{highlighted-body-OFNGDK62-DlVkiG0S.js → highlighted-body-OFNGDK62-DNPK7_cm.js} +1 -1
  213. package/server/public/assets/{index-K0hAYCgV.js → index-DEpY-D1O.js} +148 -148
  214. package/server/public/assets/index-Ddkcz3WT.css +1 -0
  215. package/server/public/assets/{linear-B4cuEFmO.js → linear-BB0jQT16.js} +1 -1
  216. package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +1 -0
  217. package/server/public/assets/{pieDiagram-4H26LBE5-CBHNBIJQ.js → pieDiagram-4H26LBE5-DeGIzzpZ.js} +1 -1
  218. package/server/public/assets/{prod-CN2nHBvX.js → prod-XBLvikex.js} +4 -4
  219. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Bom87VOQ.js → quadrantDiagram-W4KKPZXB-BV9SLeWz.js} +1 -1
  220. package/server/public/assets/{sankeyDiagram-5OEKKPKP-UrBeyLxk.js → sankeyDiagram-5OEKKPKP-Dwja0gj8.js} +1 -1
  221. package/server/public/assets/{xychartDiagram-2RQKCTM6-DhkbrIxR.js → xychartDiagram-2RQKCTM6-DCB4qvfw.js} +1 -1
  222. package/server/public/index.html +2 -2
  223. package/server/{pull-requests-DHWiKxo7.js → pull-requests-BonZ4WVG.js} +3 -3
  224. package/server/{pull-requests-Cv7LxzUN.js → pull-requests-DNcJUVWA.js} +1 -1
  225. package/server/{queries-DHJm7bTd.js → queries-DCX27GRr.js} +266 -155
  226. package/server/{rally-B71M9f4o.js → rally-Cxe7lKYX.js} +3 -3
  227. package/server/{rally-api-D5uXN08-.js → rally-api-Cp50exEi.js} +1 -1
  228. package/server/{rally-api-Dkqmok65.js → rally-api-CzkKenoi.js} +2 -2
  229. package/server/{rally-client-CxsA6ExK.js → rally-client-Bu3Cekkw.js} +1 -1
  230. package/server/{rally-client-Bfqm6XI4.js → rally-client-CyBBEDHu.js} +5 -5
  231. package/server/rally-x6ztTQo4.js +3 -0
  232. package/server/{reap-terminal-sessions-CvmwaqKv.js → reap-terminal-sessions-CtAhr6L0.js} +2 -2
  233. package/server/{reap-terminal-sessions-BQ23nriz.js → reap-terminal-sessions-DvFqQUnq.js} +2 -2
  234. package/server/{rebuild-stack-qeRqHZxH.js → rebuild-stack-BKYpIPDL.js} +2 -2
  235. package/server/{rebuild-stack-0EEYReVZ.js → rebuild-stack-hCQtprWC.js} +7 -7
  236. package/server/{reconstruct-cache-BbYFsqLa.js → reconstruct-cache-CF2avArx.js} +9 -8
  237. package/server/{record-CtroO946.js → record-BTwWhtBb.js} +1 -1
  238. package/server/{record-update-Z0QCxmMp.js → record-update-DaOKS7Wb.js} +5 -128
  239. package/server/{record-update-DH6dLJID.js → record-update-DhI7eySG.js} +1 -1
  240. package/server/{recovery-trip-eJe26h-f.js → recovery-trip-D-wM9EfB.js} +2 -2
  241. package/server/{release-engine-lPUp-MTd.js → release-engine-_eO3VFth.js} +5 -5
  242. package/server/{release-set-BwGeyZKX.js → release-set-vxgZwwZV.js} +3 -3
  243. package/server/{remote-BCd02Es1.js → remote-BienmcrZ.js} +3 -3
  244. package/server/{remote-CVGUhXMV.js → remote-CVPCc7Vy.js} +3 -3
  245. package/server/{remote-agents-C1bssi41.js → remote-agents-kwsEZvXu.js} +1 -1
  246. package/server/{remote-agents-C_VxssLU.js → remote-agents-kxraOCGT.js} +17 -8
  247. package/server/{remote-completion-DAB0P706.js → remote-completion-BtmZ42aP.js} +13 -13
  248. package/server/resume-DXIIfJNk.js +3 -0
  249. package/server/{review-agent-CHhI66UP.js → review-agent-CIRr0yYt.js} +31 -29
  250. package/server/{review-agent-CD4RCI0Y.js → review-agent-UpAM4DmT.js} +1 -1
  251. package/server/{review-artifacts-DSMRIfuJ.js → review-artifacts-BCODM9ww.js} +5 -5
  252. package/server/{review-context-oFuBbiEE.js → review-context-BBsNrDri.js} +9 -9
  253. package/server/{review-convoy-liveness-CpzrcJ5F.js → review-convoy-liveness-l06_LYCt.js} +2 -2
  254. package/server/review-status-CacDM78F.js +3 -0
  255. package/server/{review-status-yljtTd-q.js → review-status-CwhA9wmd.js} +329 -110
  256. package/server/{review-status-emit-CUExtHd5.js → review-status-emit-BPJwYcRy.js} +3 -3
  257. package/server/{review-status-enrichment-QV_hQkgS.js → review-status-enrichment-DvyZAbGR.js} +3 -3
  258. package/server/{review-status-source-ylw5QZUR.js → review-status-source-B70ekARK.js} +1 -1
  259. package/server/{review-status-source-CpvJnvnQ.js → review-status-source-DWnFE0b6.js} +1 -1
  260. package/server/{review-status-sync-NaWvI9Xf.js → review-status-sync-B0IS6Beh.js} +1 -1
  261. package/server/{review-status-sync-483sujRo.js → review-status-sync-h2CJX6ju.js} +11 -6
  262. package/server/{review-verdict-feedback-BPDn4li_.js → review-verdict-feedback-qRohbFG2.js} +1 -1
  263. package/server/{review-verdict-feedback-CELeUinh.js → review-verdict-feedback-yrrmgps_.js} +91 -15
  264. package/server/{rollup-DTNvelz9.js → rollup-CUoav0Op.js} +8 -8
  265. package/server/{rollup-DYZfq1c4.js → rollup-DxCjJaAM.js} +1 -1
  266. package/server/{scanner-CV35oSn4.js → scanner-ChURu_b-.js} +7 -7
  267. package/server/{sequence-io-DF_8iuhV.js → sequence-io-D9ITDxzq.js} +4 -4
  268. package/server/{sequencer-agent-B2WeCtGi.js → sequencer-agent-m7gmaakW.js} +7 -6
  269. package/server/server.js +435 -418
  270. package/server/{service-Br9rpBNA.js → service-BzFG0Us_.js} +88 -59
  271. package/server/{session-fork-D0LY152N.js → session-fork-KBq4HIHF.js} +2 -2
  272. package/server/{session-history-BUyK29eq.js → session-history-C_EMhIIF.js} +7 -55
  273. package/server/settings-9jSGHBPY.js +2 -0
  274. package/server/{settings-Bse1Pdcj.js → settings-BLbcDqUp.js} +3 -3
  275. package/server/{settings-CvVGqNEs.js → settings-DejgzzLs.js} +2 -2
  276. package/server/{shadow-engineering-BWLa8ODz.js → shadow-engineering-D8R9I8Yl.js} +3 -3
  277. package/server/{shadow-state-FV6PHfEW.js → shadow-state-C0Af4clN.js} +1 -1
  278. package/server/{shadow-state-B4fpKxOO.js → shadow-state-fzIqIMDD.js} +2 -2
  279. package/server/{shadow-utils-D7asqxOZ.js → shadow-utils-Ugca_9ND.js} +2 -2
  280. package/server/{ship-log-xplJ8t75.js → ship-log-VAv-lHrF.js} +1 -1
  281. package/server/{smart-compaction-D3U_79f-.js → smart-compaction-B2Xu5XEb.js} +7 -7
  282. package/server/{smart-compaction-CPp2Ykf6.js → smart-compaction-BcYY_Suf.js} +1 -1
  283. package/server/{spawn-planning-session-DGfZ5B8D.js → spawn-planning-session-DhCoBPct.js} +38 -50
  284. package/server/spawn-planning-session-Dsv-350T.js +3 -0
  285. package/server/{specialist-completion-Br48eiDP.js → specialist-completion-z6v3ZqJE.js} +1 -1
  286. package/server/{specialist-context-cVbGnTa3.js → specialist-context-CrA5azkJ.js} +5 -5
  287. package/server/{specialist-handoff-logger-DK-GTz4s.js → specialist-handoff-logger-CmpZYJMB.js} +2 -2
  288. package/server/{specialist-logs-Cl5-hqT8.js → specialist-logs-BorrIu0x.js} +3 -3
  289. package/server/{specialists-CNfYO3G2.js → specialists-2yLmqph9.js} +298 -180
  290. package/server/{specialists-Tdezg_6N.js → specialists-CH6ah6D-.js} +1 -1
  291. package/server/{specialists-Cicieuzu.js → specialists-Dfx9_Wzb.js} +18 -18
  292. package/server/{specialists-JHsdU3pA.js → specialists-ZdrifiKx.js} +1 -1
  293. package/server/specs-DKV3jIEs.js +3 -0
  294. package/server/{src-Ck028hjO.js → src-B2e5rGu2.js} +6 -6
  295. package/server/{src-CRmCHlma.js → src-B948bGVR.js} +57 -13
  296. package/server/{src-UWcGe0Ix.js → src-Dm_NV7f6.js} +3 -3
  297. package/server/{stack-health-DqSqx0zv.js → stack-health-Bf2WdG4E.js} +2 -2
  298. package/server/{stack-health-CJLMrLBl.js → stack-health-CoWAhA99.js} +1 -1
  299. package/server/{stale-task-claims-CYFOUNlT.js → stale-task-claims-D1Ll8fI5.js} +5 -4
  300. package/server/{staleness-D47CUJok.js → staleness-45qZ_a60.js} +1 -1
  301. package/server/{staleness-BQ-0gMYK.js → staleness-CuED1Psm.js} +1 -1
  302. package/server/{state-home-BYV7qZTW.js → state-home-B4EWfIxF.js} +2 -2
  303. package/server/{state-mapping-BVldLhBf.js → state-mapping-BEONzr8P.js} +1 -1
  304. package/server/{state-migrate-CvvBtS0Y.js → state-migrate-Cd8BH33U.js} +4 -4
  305. package/server/{stuck-remediation-Wt0UVvu1.js → stuck-remediation-ChcooZuk.js} +1 -1
  306. package/server/{stuck-remediation-mkLC6G_t.js → stuck-remediation-DmY5UJLg.js} +24 -23
  307. package/server/{substrate-bug-weights-service-XfLAKnmK.js → substrate-bug-weights-service-BvTWrFUz.js} +3 -3
  308. package/server/{summary-fork-CD7GOts0.js → summary-fork--Jr8duYh.js} +2 -2
  309. package/server/{summary-fork-xiXBnWG9.js → summary-fork-Ct514_Jl.js} +8 -8
  310. package/server/supervisor/{injection-budget-B5SbvDx2.js → injection-budget-B3UyEONL.js} +1 -1
  311. package/server/supervisor/{paths-K3noE4N_.js → paths-BBOnCYlO.js} +10 -2
  312. package/server/supervisor/pty-supervisor.js +4 -4
  313. package/server/supervisor/{pty-token-B7lp0ElT.js → pty-token-CWRffcCa.js} +3 -3
  314. package/server/{supervisor-DL788vos.js → supervisor-B7BHGcNA.js} +3 -3
  315. package/server/supervisor-CyR_mW5B.js +2 -0
  316. package/server/{swarm-readiness-BV14DF5N.js → swarm-readiness-MNE5O8hn.js} +3 -3
  317. package/server/{system-prerequisites-pdWG6ZQs.js → system-prerequisites-Cin9ZgDx.js} +2 -2
  318. package/server/{teardown-workspace-l2F4_zim.js → teardown-workspace-CvBpvc85.js} +15 -15
  319. package/server/{test-agent-queue-qakFIIGz.js → test-agent-queue-DmSIqays.js} +8 -7
  320. package/server/{test-verdict-Gw-btEfb.js → test-verdict-BieVDAV1.js} +1 -1
  321. package/server/{test-verdict-BJYDggMm.js → test-verdict-Cy2jJGTe.js} +1 -1
  322. package/server/{tldr-daemon-BKOYB616.js → tldr-daemon-Ca0eovh3.js} +1 -1
  323. package/server/{tldr-daemon-CBaWkV9k.js → tldr-daemon-IOssGwg7.js} +2 -2
  324. package/server/{tmux-B1Wbxz5o.js → tmux-CfDHob9M.js} +174 -4
  325. package/server/{tmux-DQ6jB76i.js → tmux-Ctk6RV5l.js} +1 -1
  326. package/server/{token-Cxbk023d.js → token-B10VFNOD.js} +2 -2
  327. package/server/{token-util-CLq2MmQt.js → token-util-CZ8WPtdk.js} +1 -1
  328. package/server/token-util-CrfQ2FKf.js +3 -0
  329. package/server/{tracker-config-DZ8Zn2nQ.js → tracker-config-CHbrjg6m.js} +2 -2
  330. package/server/{tracker-utils-L0FKtjq2.js → tracker-utils-DZZq_C0R.js} +2 -2
  331. package/server/{traefik-connect-bNX6jKkb.js → traefik-connect-GHomyBaD.js} +1 -1
  332. package/server/{tunnel-BAm1XgjG.js → tunnel-Bdyb-sNq.js} +3 -3
  333. package/server/{tunnel-CjSnHdTc.js → tunnel-Dz7y434T.js} +1 -1
  334. package/server/{typed-errors-BHhE85Ul.js → typed-errors-BR_RmPS_.js} +1 -1
  335. package/server/{typed-errors-2BTMxkZq.js → typed-errors-Bn_2WRU7.js} +1 -1
  336. package/server/{types-hraoaQIp.js → types-D2ETIB8T.js} +1 -1
  337. package/server/{types-q67TYYg5.js → types-Dh6RI5Vj.js} +1 -1
  338. package/server/{uat-promote-verification-CKB9ZrKC.js → uat-promote-verification-DyvQXvIn.js} +5 -5
  339. package/server/{uat-train-D5UjcyAa.js → uat-train-Dv0Bxer7.js} +0 -0
  340. package/server/{uat-train-Cu-4nvbf.js → uat-train-diX_7shd.js} +1 -1
  341. package/server/{validate-Cxsx5Uz1.js → validate-606KcYZC.js} +3 -3
  342. package/server/{validation-DEaTZafj.js → validation-Cf7aaV5A.js} +1 -1
  343. package/server/{validation-VZgJxmqc.js → validation-CnrDul1x.js} +4 -4
  344. package/server/{verification-artifact-g3yuxQDL.js → verification-artifact-D4b-bio9.js} +1 -1
  345. package/server/{verification-artifact-C85cRTc_.js → verification-artifact-GOaj8u2s.js} +1 -1
  346. package/server/{verification-runner-KDZIsBj4.js → verification-runner-B5MVxDvU.js} +19 -19
  347. package/server/{verification-runner-DlZI8yhw.js → verification-runner-DiPaUP-C.js} +1 -1
  348. package/server/{vtt-parser-Jr94BF3Y.js → vtt-parser-CMU5EZ5R.js} +1 -1
  349. package/server/{work-agent-prompt-C-vuP3_J.js → work-agent-prompt-Csb3fbVR.js} +9 -9
  350. package/server/{workflows-D0oip4eV.js → workflows-D87ajwV6.js} +113 -43
  351. package/server/workflows-DN6NyVGd.js +2 -0
  352. package/server/{workspace-BqFg__wH.js → workspace-AIOM7n00.js} +1 -1
  353. package/server/{workspace-anchor-drift-B4gMRHl4.js → workspace-anchor-drift-19cJ1bH5.js} +1 -1
  354. package/server/{workspace-anchor-drift-CZKofakh.js → workspace-anchor-drift-C3mK5wNI.js} +4 -4
  355. package/server/{workspace-config-B123aZl-.js → workspace-config-CJ7RqQiP.js} +1 -1
  356. package/server/{workspace-C0fH3aek.js → workspace-iD8oULqu.js} +3 -3
  357. package/server/{workspace-manager-CDTKjjdU.js → workspace-manager-B38rFWA1.js} +1 -1
  358. package/server/{workspace-manager-CwO-Hek7.js → workspace-manager-CXfrw4rR.js} +13 -13
  359. package/server/{workspace-metadata-D4M8BM4W.js → workspace-metadata-BuMRco5P.js} +1 -1
  360. package/server/{workspace-metadata-CQv00QwK.js → workspace-metadata-eHSj_NsP.js} +2 -2
  361. package/server/{workspaces-j1e_6aAT.js → workspaces-DbtMX2TM.js} +136 -113
  362. package/sync-sources/skills/pan-merge/SKILL.md +7 -5
  363. package/sync-sources/skills/pan-release/SKILL.md +57 -0
  364. package/server/agent-state-service-hZpxIw1E.js +0 -2
  365. package/server/archive-planning-0FJ6Xd3b.js +0 -2
  366. package/server/cli-DmXETsw-.js +0 -3
  367. package/server/conflict-gate-Dh754uyA.js +0 -3
  368. package/server/deacon-swarm-I2JfX5Tg.js +0 -2
  369. package/server/dist-DSlxIU1H.js +0 -3
  370. package/server/durable-review-pipeline-jpgCJZFp.js +0 -3
  371. package/server/forge-DK3blQb_.js +0 -3
  372. package/server/hume-Dq--7rOQ.js +0 -3
  373. package/server/inspect-agent-BVwDrVrz.js +0 -2
  374. package/server/label-reconciler--F85rufp.js +0 -113
  375. package/server/merge-ops-DdpTiEMt.js +0 -2
  376. package/server/merge-rebase-DGQpYJU3.js +0 -2
  377. package/server/merge-sync-Ca7F5JnQ.js +0 -3
  378. package/server/public/assets/index-Cc7cnFC4.css +0 -1
  379. package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +0 -1
  380. package/server/rally-YDjU513q.js +0 -3
  381. package/server/resume-u9byntrq.js +0 -3
  382. package/server/review-status-BZH8h-6W.js +0 -3
  383. package/server/settings-CdvIF84R.js +0 -2
  384. package/server/spawn-planning-session-1nFi3gfk.js +0 -2
  385. package/server/specs-Bt7WJDoC.js +0 -3
  386. package/server/supervisor-UWiQNK-y.js +0 -2
  387. package/server/token-util-zlz9U0ki.js +0 -3
  388. package/server/workflows-CHrx_hcW.js +0 -2
@@ -1,21 +1,24 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Cn as resolveStateReadHomeSync, Gn as init_projects, Lt as readIssueRecord, Mn as findProjectByPathSync, Mt as getIssueWorkspacePath, Pt as init_record, Sn as init_state_read_home, ar as resolveProjectFromIssueSync, ci as init_paths, f as loadConfigSync, si as getOverdeckHome, t as init_config_yaml, ui as packageRoot, zn as getProjectSync, zt as readIssueRecordSync } from "./config-yaml-CmOPzmBb.js";
2
+ import { Cn as resolveStateReadHomeSync, Gn as init_projects, Lt as readIssueRecord, Mn as findProjectByPathSync, Mt as getIssueWorkspacePath, Pt as init_record, Sn as init_state_read_home, ar as resolveProjectFromIssueSync, ci as getOverdeckHome, di as packageRoot, f as loadConfigSync, li as init_paths, t as init_config_yaml, zn as getProjectSync, zt as readIssueRecordSync } from "./config-yaml-CxdwhAIA.js";
3
3
  import { i as emitActivityTtsSync, o as init_activity_logger, r as emitActivityEntrySync } from "./activity-logger-CyteR4JO.js";
4
- import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-BjuxvjdS.js";
5
- import { i as updateIssueRecord, r as init_record_update } from "./record-update-Z0QCxmMp.js";
6
- import { d as init_cost_sync, i as getCostBreakdownByStageAndModelSync, o as getCostForIssueSync } from "./cost-sync-Dv3LUaNW.js";
7
- import { r as notifyPipelineSync, t as init_pipeline_notifier } from "./pipeline-notifier-BuQ0e4hF.js";
8
- import { c as init_review_status_sync, d as init_review_status_normalize, f as normalizeReviewStatusSync, l as markWorkspaceStuck$1, n as deleteReviewStatus, o as getReviewStatusFromDbSync, r as getAllReviewStatusesFromDb, s as getReviewStatusesFromDb, t as clearWorkspaceStuck$1, u as upsertReviewStatusSync } from "./review-status-sync-483sujRo.js";
9
- import { a as registerCanonicalReviewStatusResolver, n as init_review_status_source, o as registerReviewStatusMapReader } from "./review-status-source-CpvJnvnQ.js";
10
- import { a as PAN_DIRNAME, p as init_types$3, r as PAN_CONTINUES_DIRNAME } from "./types-hraoaQIp.js";
11
- import { i as init_merge_set, r as getMergeSetSync } from "./merge-set-DH7ot3yz.js";
12
- import { o as init_lifecycle, r as XBRIEF_FILENAME_SUFFIX, t as LEGACY_VBRIEF_FILENAME_SUFFIX } from "./lifecycle-CTdOWYMi.js";
4
+ import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-BDQDRopn.js";
5
+ import { i as updateIssueRecord, r as init_record_update } from "./record-update-DaOKS7Wb.js";
6
+ import { r as registerFeedbackAgentStateReader, t as init_agent_state_source } from "./agent-state-source-Ca_zCaII.js";
7
+ import { d as init_cost_sync, i as getCostBreakdownByStageAndModelSync, o as getCostForIssueSync } from "./cost-sync-DiUBXwl6.js";
8
+ import { r as notifyPipelineSync, t as init_pipeline_notifier } from "./pipeline-notifier-CxMes51i.js";
9
+ import { c as init_review_status_sync, d as init_review_status_normalize, f as normalizeReviewStatusSync, l as markWorkspaceStuck$1, n as deleteReviewStatus, o as getReviewStatusFromDbSync, r as getAllReviewStatusesFromDb, s as getReviewStatusesFromDb, t as clearWorkspaceStuck$1, u as upsertReviewStatusSync } from "./review-status-sync-h2CJX6ju.js";
10
+ import { a as registerCanonicalReviewStatusResolver, n as init_review_status_source, o as registerReviewStatusMapReader } from "./review-status-source-DWnFE0b6.js";
11
+ import { a as PAN_DIRNAME, d as WORKSPACE_RUNTIME_DIRNAME, p as init_types$3, r as PAN_CONTINUES_DIRNAME } from "./types-D2ETIB8T.js";
12
+ import { i as init_merge_set, r as getMergeSetSync } from "./merge-set-Dbnx4chw.js";
13
+ import { o as init_lifecycle, r as XBRIEF_FILENAME_SUFFIX, t as LEGACY_VBRIEF_FILENAME_SUFFIX } from "./lifecycle-DOgGnpIv.js";
13
14
  import { basename, dirname, join } from "node:path";
14
15
  import { Data, Effect } from "effect";
16
+ import { existsSync, readFileSync, readdirSync, statSync } from "fs";
15
17
  import { dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, posix, relative as relative$1, sep as sep$1 } from "path";
16
18
  import { homedir } from "os";
17
19
  import { hostname } from "node:os";
18
- import { chmodSync, createReadStream, existsSync, linkSync, mkdirSync, promises, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
20
+ import { chmodSync as chmodSync$1, createReadStream as createReadStream$1, existsSync as existsSync$1, linkSync, mkdirSync as mkdirSync$1, promises as promises$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, renameSync as renameSync$1, rmSync as rmSync$1, statSync as statSync$1, writeFileSync as writeFileSync$1 } from "node:fs";
21
+ import { readFile, readdir } from "node:fs/promises";
19
22
  import { inspect } from "node:util";
20
23
  import { randomUUID } from "node:crypto";
21
24
  import { createInterface } from "node:readline";
@@ -76,6 +79,7 @@ function overdeckRowToAgentState(row) {
76
79
  phase: row.phase == null ? void 0 : row.phase,
77
80
  roleRunHead: row.role_run_head ?? void 0,
78
81
  flywheelRunId: row.flywheel_run_id ?? void 0,
82
+ startedBy: row.started_by ?? void 0,
79
83
  costSoFar: row.cost_so_far ?? void 0,
80
84
  reviewSubRole: row.review_sub_role ?? void 0,
81
85
  reviewRunId: row.review_run_id ?? void 0,
@@ -129,6 +133,7 @@ function stateToOverdeckParamsForDb(state, updatedAt) {
129
133
  state.phase ?? null,
130
134
  state.roleRunHead ?? null,
131
135
  state.flywheelRunId ?? null,
136
+ state.startedBy ?? null,
132
137
  state.costSoFar ?? null,
133
138
  state.reviewSubRole ?? null,
134
139
  state.reviewRunId ?? null,
@@ -161,6 +166,7 @@ function saveOverdeckAgentStateSync(state) {
161
166
  }
162
167
  var AGENT_COLUMNS_FOR_DB, SELECT_AGENT_SQL;
163
168
  var init_agent_state_sync = __esmMin((() => {
169
+ init_agent_state_source();
164
170
  init_infra();
165
171
  AGENT_COLUMNS_FOR_DB = [
166
172
  "id",
@@ -196,6 +202,7 @@ var init_agent_state_sync = __esmMin((() => {
196
202
  "phase",
197
203
  "role_run_head",
198
204
  "flywheel_run_id",
205
+ "started_by",
199
206
  "cost_so_far",
200
207
  "review_sub_role",
201
208
  "review_run_id",
@@ -213,6 +220,7 @@ var init_agent_state_sync = __esmMin((() => {
213
220
  "updated_at"
214
221
  ];
215
222
  SELECT_AGENT_SQL = `SELECT ${AGENT_COLUMNS_FOR_DB.join(", ")} FROM agents`;
223
+ registerFeedbackAgentStateReader(listOverdeckAgentStatesSync);
216
224
  }));
217
225
  //#endregion
218
226
  //#region ../../lib/pan-dir/records.ts
@@ -259,6 +267,7 @@ function projectPipeline(issueId, status, existing) {
259
267
  inspectNotes: status.inspectNotes,
260
268
  mergeNotes: status.mergeNotes,
261
269
  blockerReasons: status.blockerReasons,
270
+ conflictsSince: status.conflictsSince,
262
271
  prUrl: status.prUrl,
263
272
  prNumber: status.prNumber,
264
273
  prHeadSha: status.prHeadSha,
@@ -272,6 +281,7 @@ function projectPipeline(issueId, status, existing) {
272
281
  deaconIgnoredAt: status.deaconIgnoredAt,
273
282
  deaconIgnoredReason: status.deaconIgnoredReason,
274
283
  reviewerVerdicts: status.reviewerVerdicts,
284
+ reviewCycleHistory: status.reviewCycleHistory,
275
285
  strikeReadyHead: status.strikeReadyHead,
276
286
  strikeReadyAt: status.strikeReadyAt,
277
287
  strikeLandingState: status.strikeLandingState,
@@ -305,13 +315,13 @@ function resolveContinuePath(projectRoot, issueId) {
305
315
  const basePath = join(stateHome.migrated ? join(stateHome.root, PAN_CONTINUES_DIRNAME) : join(stateHome.root, PAN_DIRNAME, PAN_CONTINUES_DIRNAME), issueId.toLowerCase());
306
316
  const canonicalPath = `${basePath}${XBRIEF_FILENAME_SUFFIX}`;
307
317
  const legacyPath = `${basePath}${LEGACY_VBRIEF_FILENAME_SUFFIX}`;
308
- if (existsSync(canonicalPath)) return canonicalPath;
309
- if (existsSync(legacyPath)) return legacyPath;
318
+ if (existsSync$1(canonicalPath)) return canonicalPath;
319
+ if (existsSync$1(legacyPath)) return legacyPath;
310
320
  return canonicalPath;
311
321
  }
312
322
  async function readLegacyContinueText(projectRoot, issueId) {
313
323
  try {
314
- return await promises.readFile(resolveContinuePath(projectRoot, issueId), "utf-8");
324
+ return await promises$1.readFile(resolveContinuePath(projectRoot, issueId), "utf-8");
315
325
  } catch {
316
326
  return null;
317
327
  }
@@ -319,10 +329,10 @@ async function readLegacyContinueText(projectRoot, issueId) {
319
329
  /** Read workspace continue.json and return its statusOverrides (if any). */
320
330
  async function readWorkspaceContinueStatusOverrides(issueId) {
321
331
  const workspacePath = getIssueWorkspacePath(issueId);
322
- if (!workspacePath || !existsSync(workspacePath)) return void 0;
332
+ if (!workspacePath || !existsSync$1(workspacePath)) return void 0;
323
333
  const continuePath = join(workspacePath, ".pan", "continue.json");
324
334
  try {
325
- const text = await promises.readFile(continuePath, "utf-8");
335
+ const text = await promises$1.readFile(continuePath, "utf-8");
326
336
  return JSON.parse(text).statusOverrides ?? void 0;
327
337
  } catch {
328
338
  return;
@@ -459,6 +469,17 @@ function readPipelineSync(issueId) {
459
469
  return null;
460
470
  }
461
471
  }
472
+ async function readPipeline(issueId) {
473
+ try {
474
+ const resolved = resolveProjectFromIssueSync(issueId);
475
+ if (!resolved) return null;
476
+ const project = getProjectSync(resolved.projectKey);
477
+ if (!project) return null;
478
+ return (await readIssueRecord(project, issueId))?.pipeline ?? null;
479
+ } catch {
480
+ return null;
481
+ }
482
+ }
462
483
  /**
463
484
  * PAN-1988: feedback TEXT (review / test / merge / inspect / verification notes) is durable
464
485
  * JOURNAL state, not DB-cache state. The SQLite row holds only the queryable status flags;
@@ -507,6 +528,7 @@ function durableSubset(p) {
507
528
  reviewRequestedAt: p.reviewRequestedAt,
508
529
  reviewSpawnedAt: p.reviewSpawnedAt,
509
530
  reviewerVerdicts: p.reviewerVerdicts,
531
+ reviewCycleHistory: p.reviewCycleHistory,
510
532
  autoMerge: p.autoMerge,
511
533
  deaconIgnored: p.deaconIgnored,
512
534
  deaconIgnoredAt: p.deaconIgnoredAt,
@@ -518,6 +540,7 @@ function durableSubset(p) {
518
540
  strikeTransportRetryCount: p.strikeTransportRetryCount,
519
541
  strikeNextAttemptAt: p.strikeNextAttemptAt,
520
542
  strikeLandingAttempts: p.strikeLandingAttempts,
543
+ conflictsSince: p.conflictsSince,
521
544
  closedOut: p.closedOut,
522
545
  closedOutAt: p.closedOutAt
523
546
  };
@@ -538,7 +561,7 @@ function writeWorkspaceVerdictFallbackSync(issueId, status) {
538
561
  console.error(`[review-status] PAN-2583: journal write failed for ${issueId} and no workspace could be resolved — the verdict is NOT durable`);
539
562
  return;
540
563
  }
541
- mkdirSync(dirname(path), { recursive: true });
564
+ mkdirSync$1(dirname(path), { recursive: true });
542
565
  const clearedFields = FALLBACK_CLEARABLE_FIELDS.filter((field) => status[field] === void 0);
543
566
  const payload = {
544
567
  issueId: issueId.toUpperCase(),
@@ -547,16 +570,16 @@ function writeWorkspaceVerdictFallbackSync(issueId, status) {
547
570
  ...clearedFields.length > 0 ? { clearedFields } : {}
548
571
  };
549
572
  const tmpPath = `${path}.tmp-${process.pid}`;
550
- writeFileSync(tmpPath, JSON.stringify(payload, null, 2));
551
- renameSync(tmpPath, path);
573
+ writeFileSync$1(tmpPath, JSON.stringify(payload, null, 2));
574
+ renameSync$1(tmpPath, path);
552
575
  console.warn(`[review-status] journal write failed for ${issueId} — durable verdict written to workspace fallback ${path}; the host sweeps it on the next status read (PAN-2583)`);
553
576
  } catch (err) {
554
577
  console.error(`[review-status] PAN-2583: could not persist verdict for ${issueId} anywhere durable: ${err.message}`);
555
578
  }
556
579
  }
557
- function parseWorkspaceVerdictFallback(path) {
580
+ function decodeWorkspaceVerdictFallback(raw) {
558
581
  try {
559
- const parsed = JSON.parse(readFileSync(path, "utf-8"));
582
+ const parsed = JSON.parse(raw);
560
583
  if (!parsed?.updatedAt || !parsed.pipeline) return null;
561
584
  const clearedFields = Array.isArray(parsed.clearedFields) ? parsed.clearedFields.filter((field) => typeof field === "string" && FALLBACK_CLEARABLE_FIELDS.includes(field)) : [];
562
585
  return {
@@ -567,6 +590,20 @@ function parseWorkspaceVerdictFallback(path) {
567
590
  return null;
568
591
  }
569
592
  }
593
+ function parseWorkspaceVerdictFallback(path) {
594
+ try {
595
+ return decodeWorkspaceVerdictFallback(readFileSync$1(path, "utf-8"));
596
+ } catch {
597
+ return null;
598
+ }
599
+ }
600
+ async function parseWorkspaceVerdictFallbackAsync(path) {
601
+ try {
602
+ return decodeWorkspaceVerdictFallback(await readFile(path, "utf-8"));
603
+ } catch {
604
+ return null;
605
+ }
606
+ }
570
607
  function isPidAlive(pid) {
571
608
  try {
572
609
  process.kill(pid, 0);
@@ -597,7 +634,7 @@ function claimWorkspaceVerdictFallbackSync(issueId) {
597
634
  const prefix = `${basename(path)}.drain-`;
598
635
  let entries;
599
636
  try {
600
- entries = readdirSync(dir);
637
+ entries = readdirSync$1(dir);
601
638
  } catch {
602
639
  return null;
603
640
  }
@@ -614,13 +651,13 @@ function claimWorkspaceVerdictFallbackSync(issueId) {
614
651
  drainClaimCounter += 1;
615
652
  const claimPath = `${path}.drain-${process.pid}-${drainClaimCounter}`;
616
653
  try {
617
- renameSync(candidate, claimPath);
654
+ renameSync$1(candidate, claimPath);
618
655
  } catch {
619
656
  continue;
620
657
  }
621
658
  const fallback = parseWorkspaceVerdictFallback(claimPath);
622
659
  if (!fallback) {
623
- rmSync(claimPath, { force: true });
660
+ rmSync$1(claimPath, { force: true });
624
661
  continue;
625
662
  }
626
663
  claims.push({
@@ -638,9 +675,9 @@ function readWorkspaceVerdictFallbackSync(issueId) {
638
675
  const consider = (candidate) => {
639
676
  if (candidate && (!newest || newest.updatedAt < candidate.updatedAt)) newest = candidate;
640
677
  };
641
- if (existsSync(path)) consider(parseWorkspaceVerdictFallback(path));
678
+ if (existsSync$1(path)) consider(parseWorkspaceVerdictFallback(path));
642
679
  const prefix = `${basename(path)}.drain-`;
643
- for (const entry of readdirSync(dirname(path))) {
680
+ for (const entry of readdirSync$1(dirname(path))) {
644
681
  if (!entry.startsWith(prefix)) continue;
645
682
  consider(parseWorkspaceVerdictFallback(join(dirname(path), entry)));
646
683
  }
@@ -649,6 +686,18 @@ function readWorkspaceVerdictFallbackSync(issueId) {
649
686
  return null;
650
687
  }
651
688
  }
689
+ async function readWorkspaceVerdictFallback(issueId) {
690
+ try {
691
+ const path = workspaceVerdictFallbackPath(issueId);
692
+ if (!path) return null;
693
+ const dir = dirname(path);
694
+ const prefix = `${basename(path)}.drain-`;
695
+ const candidates = [path, ...(await readdir(dir)).filter((entry) => entry.startsWith(prefix)).map((entry) => join(dir, entry))];
696
+ return (await Promise.all(candidates.map(parseWorkspaceVerdictFallbackAsync))).reduce((newest, candidate) => candidate && (!newest || newest.updatedAt < candidate.updatedAt) ? candidate : newest, null);
697
+ } catch {
698
+ return null;
699
+ }
700
+ }
652
701
  /**
653
702
  * Fold a pending workspace verdict fallback into the canonical record and delete
654
703
  * it, without waiting for the next status read. Newer-wins on ISO `updatedAt` —
@@ -671,7 +720,7 @@ async function drainWorkspaceVerdictFallback(issueId) {
671
720
  const { fallback } = winner;
672
721
  const journal = readPipelineSync(issueId);
673
722
  if (journal?.updatedAt && !(journal.updatedAt < fallback.updatedAt)) {
674
- for (const claim of claims) rmSync(claim.claimPath, { force: true });
723
+ for (const claim of claims) rmSync$1(claim.claimPath, { force: true });
675
724
  return true;
676
725
  }
677
726
  if (await updateIssueRecordForIssue(issueId, {
@@ -680,10 +729,10 @@ async function drainWorkspaceVerdictFallback(issueId) {
680
729
  updatedAt: fallback.updatedAt,
681
730
  readyForMerge: false
682
731
  })) {
683
- for (const claim of claims) rmSync(claim.claimPath, { force: true });
732
+ for (const claim of claims) rmSync$1(claim.claimPath, { force: true });
684
733
  return true;
685
734
  }
686
- for (const claim of losers) rmSync(claim.claimPath, { force: true });
735
+ for (const claim of losers) rmSync$1(claim.claimPath, { force: true });
687
736
  const livePath = workspaceVerdictFallbackPath(issueId);
688
737
  if (livePath) {
689
738
  let published = false;
@@ -692,18 +741,18 @@ async function drainWorkspaceVerdictFallback(issueId) {
692
741
  published = true;
693
742
  } catch {}
694
743
  if (published) {
695
- rmSync(winner.claimPath, { force: true });
744
+ rmSync$1(winner.claimPath, { force: true });
696
745
  return false;
697
746
  }
698
- const live = existsSync(livePath) ? parseWorkspaceVerdictFallback(livePath) : null;
747
+ const live = existsSync$1(livePath) ? parseWorkspaceVerdictFallback(livePath) : null;
699
748
  if (live && !(live.updatedAt < fallback.updatedAt)) {
700
- rmSync(winner.claimPath, { force: true });
749
+ rmSync$1(winner.claimPath, { force: true });
701
750
  return false;
702
751
  }
703
752
  }
704
753
  drainClaimCounter += 1;
705
754
  try {
706
- renameSync(winner.claimPath, `${winner.claimPath.split(".drain-")[0]}.drain-republish-${drainClaimCounter}`);
755
+ renameSync$1(winner.claimPath, `${winner.claimPath.split(".drain-")[0]}.drain-republish-${drainClaimCounter}`);
707
756
  } catch {}
708
757
  return false;
709
758
  }
@@ -739,28 +788,10 @@ function scheduleVerdictFallbackDrain(issueId) {
739
788
  };
740
789
  attempt(0);
741
790
  }
742
- /**
743
- * PAN-1988: read the journal record's durable verdict for an issue — the SOURCE OF TRUTH.
744
- * Returns the record `updatedAt` (used to decide whether the journal is newer than the DB
745
- * cache) plus the durable status fields (flags + feedback notes). Derived/live columns
746
- * (readyForMerge, blockerReasons) are intentionally omitted — the reader recomputes them.
747
- *
748
- * This is what makes verdict writes host-owned: a sandboxed agent can always write the journal
749
- * (workspace-local) even when it cannot write `~/.overdeck/overdeck.db`. The host reconciles
750
- * the cache from this on read, so no agent has to escalate out of its sandbox to record a verdict.
751
- *
752
- * PAN-2583: since the records migration (PAN-2541) the journal itself lives in
753
- * ${OVERDECK_HOME}/state, which a sandboxed reviewer cannot write either. When such a
754
- * writer dropped its verdict into the workspace fallback instead, overlay it here —
755
- * a strictly newer fallback wins over the record, and the host's own next journal
756
- * write folds it back into the canonical record.
757
- */
758
- function readJournalStatusSync(issueId) {
759
- const p = readPipelineSync(issueId);
760
- const fallback = readWorkspaceVerdictFallbackSync(issueId);
761
- const fallbackNewer = !!fallback && (!p || (p.updatedAt ?? "") < fallback.updatedAt);
791
+ function projectJournalStatus(pipeline, fallback) {
792
+ const fallbackNewer = !!fallback && (!pipeline || (pipeline.updatedAt ?? "") < fallback.updatedAt);
762
793
  if (fallback && fallbackNewer) {
763
- const base = p ? durableSubset(p) : {};
794
+ const base = pipeline ? durableSubset(pipeline) : {};
764
795
  const overlay = Object.fromEntries(Object.entries(fallback.pipeline).filter(([, value]) => value !== void 0));
765
796
  const durable = {
766
797
  ...base,
@@ -773,12 +804,20 @@ function readJournalStatusSync(issueId) {
773
804
  ...fallback.clearedFields?.length ? { clearedFields: fallback.clearedFields } : {}
774
805
  };
775
806
  }
776
- if (!p) return null;
807
+ if (!pipeline) return null;
777
808
  return {
778
- updatedAt: p.updatedAt,
779
- durable: durableSubset(p)
809
+ updatedAt: pipeline.updatedAt,
810
+ durable: durableSubset(pipeline)
780
811
  };
781
812
  }
813
+ function readJournalStatusSync(issueId) {
814
+ return projectJournalStatus(readPipelineSync(issueId), readWorkspaceVerdictFallbackSync(issueId));
815
+ }
816
+ /** Async journal reader for patrols that must not block the dashboard event loop. */
817
+ async function readJournalStatus(issueId) {
818
+ const [pipeline, fallback] = await Promise.all([readPipeline(issueId), readWorkspaceVerdictFallback(issueId)]);
819
+ return projectJournalStatus(pipeline, fallback);
820
+ }
782
821
  var pendingJournalWrites, FALLBACK_CLEARABLE_FIELDS, drainClaimCounter, DRAIN_RETRY_DELAYS_MS, drainTimers;
783
822
  var init_review_status_record_sync = __esmMin((() => {
784
823
  init_records();
@@ -799,6 +838,117 @@ var init_review_status_record_sync = __esmMin((() => {
799
838
  drainTimers = /* @__PURE__ */ new Map();
800
839
  }));
801
840
  //#endregion
841
+ //#region ../../lib/review-findings.ts
842
+ /**
843
+ * Extract a markdown section by heading.
844
+ * Returns the content between a heading (e.g., "## Findings") and the next heading or EOF.
845
+ */
846
+ function extractMarkdownSection(markdown, heading) {
847
+ const pattern = new RegExp(`^##\\s+${heading}\\s*\\r?\\n([\\s\\S]*?)(?=^##\\s+|(?![\\s\\S]))`, "im");
848
+ return markdown.match(pattern)?.[1]?.trim() ?? "";
849
+ }
850
+ /**
851
+ * Find blocking findings in a report markdown section.
852
+ * Returns titles of findings marked with '!' or '⊗'.
853
+ */
854
+ function findBlockingFindings(markdown) {
855
+ const findings = extractMarkdownSection(markdown, "Findings");
856
+ if (!findings || /^none\.?$/i.test(findings)) return [];
857
+ const blockers = [];
858
+ const headingPattern = /^###\s*(?:!|⊗)\s+(.+)$/gm;
859
+ let match;
860
+ while ((match = headingPattern.exec(findings)) !== null) blockers.push(match[1].trim());
861
+ return blockers;
862
+ }
863
+ /**
864
+ * Count blocking findings in a synthesis body.
865
+ * Returns the count of '## Blocking Findings' section headings (### markers),
866
+ * or 0 if the section is absent, empty, or contains only 'None'.
867
+ */
868
+ function countSynthesisBlockingFindings(body) {
869
+ const findings = extractMarkdownSection(body, "Blocking Findings");
870
+ if (!findings || /^none\.?$/i.test(findings)) return 0;
871
+ const headingPattern = /^###\s+/gm;
872
+ let count = 0;
873
+ while (headingPattern.exec(findings) !== null) count++;
874
+ return count;
875
+ }
876
+ var init_review_findings = __esmMin((() => {}));
877
+ //#endregion
878
+ //#region ../../lib/cloister/review-convergence.ts
879
+ /**
880
+ * Review convergence detection and cycle tracking.
881
+ * Detects when a review loop is not making progress and should be gated.
882
+ */
883
+ /**
884
+ * Find the latest review run directory in a workspace.
885
+ * Looks for 'agent-*-review-*' directories under .pan/review, falling back to .overdeck/review.
886
+ * Returns null if no run directory is found.
887
+ */
888
+ function findLatestReviewRunDir(workspacePath) {
889
+ const paths = [join$1(workspacePath, PAN_DIRNAME, "review"), join$1(workspacePath, WORKSPACE_RUNTIME_DIRNAME, "review")];
890
+ for (const reviewDir of paths) {
891
+ if (!existsSync(reviewDir)) continue;
892
+ try {
893
+ const reviewDirs = readdirSync(reviewDir).filter((name) => /^agent-.*-review-/.test(name));
894
+ if (reviewDirs.length === 0) continue;
895
+ return join$1(reviewDir, reviewDirs.map((name) => ({
896
+ name,
897
+ mtime: statSync(join$1(reviewDir, name)).mtime.getTime()
898
+ })).sort((a, b) => b.mtime - a.mtime)[0].name);
899
+ } catch {
900
+ continue;
901
+ }
902
+ }
903
+ return null;
904
+ }
905
+ /**
906
+ * Count blocking findings for a specific review run.
907
+ * First tries synthesis.md '## Blocking Findings' heading count,
908
+ * falls back to summing findBlockingFindings across .md report files,
909
+ * returns null if no artifacts exist.
910
+ */
911
+ function countBlockingFindingsForRun(runDir) {
912
+ const synthesisPath = join$1(runDir, "synthesis.md");
913
+ if (existsSync(synthesisPath)) try {
914
+ const synthBody = readFileSync(synthesisPath, "utf8");
915
+ const count = countSynthesisBlockingFindings(synthBody);
916
+ if (count > 0 || synthBody.includes("## Blocking Findings")) return count;
917
+ } catch {}
918
+ try {
919
+ const reportFiles = readdirSync(runDir).filter((name) => name.endsWith(".md") && name !== "synthesis.md");
920
+ if (reportFiles.length === 0) return null;
921
+ let totalCount = 0;
922
+ for (const file of reportFiles) {
923
+ const findings = findBlockingFindings(readFileSync(join$1(runDir, file), "utf8"));
924
+ totalCount += findings.length;
925
+ }
926
+ return totalCount;
927
+ } catch {
928
+ return null;
929
+ }
930
+ }
931
+ /**
932
+ * Evaluate whether a review cycle series is converging.
933
+ * Returns 'not-converging' when:
934
+ * - counts.length >= 3 AND the series shows a reversal (count[n-1] > count[n-2]), OR
935
+ * - the last two transitions are both non-decreases (going backwards)
936
+ * Otherwise returns 'converging'.
937
+ */
938
+ function evaluateReviewConvergence(counts) {
939
+ if (counts.length < 3) return "converging";
940
+ const n = counts.length;
941
+ if (counts[n - 1] > counts[n - 2]) return "not-converging";
942
+ const isFirstNonDecreasing = counts[n - 2] >= counts[n - 3];
943
+ const isSecondNonDecreasing = counts[n - 1] >= counts[n - 2];
944
+ if (isFirstNonDecreasing && isSecondNonDecreasing) return "not-converging";
945
+ return "converging";
946
+ }
947
+ var init_review_convergence = __esmMin((() => {
948
+ init_types$3();
949
+ init_review_findings();
950
+ }));
951
+ //#endregion
802
952
  //#region ../../lib/review-status-reconcile.ts
803
953
  function verificationSatisfied(status) {
804
954
  return status.verificationStatus !== "failed";
@@ -827,7 +977,59 @@ function reconcileJournalIntoCacheSync(issueId, dbStatus, journal, hooks) {
827
977
  hooks.notifyStatusChanged(issueId, reconciled);
828
978
  } catch {}
829
979
  const wasBlocked = dbStatus?.reviewStatus === "blocked" || dbStatus?.reviewStatus === "failed";
830
- if ((reconciled.reviewStatus === "blocked" || reconciled.reviewStatus === "failed") && !wasBlocked) hooks.deliverReviewVerdictFeedbackHostSide(issueId, reconciled);
980
+ if ((reconciled.reviewStatus === "blocked" || reconciled.reviewStatus === "failed") && !wasBlocked) try {
981
+ const project = resolveProjectFromIssueSync(issueId);
982
+ if (!project) {
983
+ console.warn(`[review-status] reconcile: cannot resolve project for ${issueId}, skipping cycle recording`);
984
+ hooks.deliverReviewVerdictFeedbackHostSide(issueId, reconciled);
985
+ } else {
986
+ const issueLower = issueId.toLowerCase();
987
+ const reviewRunDir = findLatestReviewRunDir(`${project.projectPath}/workspaces/feature-${issueLower}`);
988
+ if (!reviewRunDir) {
989
+ console.warn(`[review-status] reconcile: no review run dir found for ${issueId}, skipping cycle recording`);
990
+ hooks.deliverReviewVerdictFeedbackHostSide(issueId, reconciled);
991
+ } else {
992
+ const blockingCount = countBlockingFindingsForRun(reviewRunDir);
993
+ if (blockingCount === null) {
994
+ console.warn(`[review-status] reconcile: cannot count findings for ${issueId}, skipping cycle recording`);
995
+ hooks.deliverReviewVerdictFeedbackHostSide(issueId, reconciled);
996
+ } else {
997
+ const runId = reviewRunDir.split("/").pop() ?? "";
998
+ if (!reconciled.reviewCycleHistory) reconciled.reviewCycleHistory = [];
999
+ const cycleNumber = reconciled.reviewCycleHistory.length + 1;
1000
+ if (!reconciled.reviewCycleHistory.some((e) => e.runId === runId)) {
1001
+ const entry = {
1002
+ cycle: cycleNumber,
1003
+ runId,
1004
+ atCommit: reconciled.reviewedAtCommit,
1005
+ blockingCount,
1006
+ recordedAt: (/* @__PURE__ */ new Date()).toISOString()
1007
+ };
1008
+ reconciled.reviewCycleHistory.push(entry);
1009
+ try {
1010
+ upsertReviewStatusSync(reconciled);
1011
+ } catch {}
1012
+ }
1013
+ const counts = reconciled.reviewCycleHistory.map((e) => e.blockingCount);
1014
+ if (evaluateReviewConvergence(counts) === "not-converging") {
1015
+ markWorkspaceStuck$1(issueId, "review-not-converging", { counts });
1016
+ reconciled.stuck = true;
1017
+ reconciled.stuckReason = "review-not-converging";
1018
+ reconciled.stuckAt = (/* @__PURE__ */ new Date()).toISOString();
1019
+ reconciled.stuckDetails = JSON.stringify({ counts });
1020
+ try {
1021
+ upsertReviewStatusSync(reconciled);
1022
+ } catch {}
1023
+ const countSeries = counts.join(" → ");
1024
+ console.error(`[review-status] reconcile: review loop not converging for ${issueId}: ${countSeries}. Consider decomposition (split the remaining work), or unstick to continue rework.`);
1025
+ } else hooks.deliverReviewVerdictFeedbackHostSide(issueId, reconciled);
1026
+ }
1027
+ }
1028
+ }
1029
+ } catch (error) {
1030
+ console.error(`[review-status] reconcile: cycle recording error for ${issueId}:`, error);
1031
+ hooks.deliverReviewVerdictFeedbackHostSide(issueId, reconciled);
1032
+ }
831
1033
  const wasReviewPassed = dbStatus?.reviewStatus === "passed";
832
1034
  if (reconciled.reviewStatus === "passed" && !wasReviewPassed && reconciled.testStatus === "pending") {
833
1035
  console.log(`[review-status] reconcile: review.approved for ${issueId} (host-owned handoff — sandboxed agent verdict from journal)`);
@@ -845,32 +1047,24 @@ function reconcileJournalIntoCacheSync(issueId, dbStatus, journal, hooks) {
845
1047
  var init_review_status_reconcile = __esmMin((() => {
846
1048
  init_review_status_normalize();
847
1049
  init_review_status_sync();
1050
+ init_review_convergence();
1051
+ init_projects();
848
1052
  }));
849
1053
  //#endregion
850
1054
  //#region ../../lib/review-dispatch-decision.ts
851
- /**
852
- * PAN-1988 auto-heal — decide whether a review needs to be (re-)dispatched from the durable
853
- * journal intent, as a PURE function so it is locked by tests.
854
- *
855
- * The work agent's `pan done` writes a durable `reviewRequestedAt` into the journal/record (always
856
- * writable, even sandboxed) BEFORE it tries to reach the dashboard. If that reactive trigger is
857
- * dropped — the dashboard was mid-reload, the network blipped, the deacon is frozen — the intent
858
- * survives in the journal. The host reconciles on read: when a request is newer than the last
859
- * dispatch and nothing is currently reviewing, it dispatches review. This heals with NO deacon and
860
- * NO live dashboard event, on the next status read.
861
- *
862
- * Returns true when a review dispatch is owed:
863
- * - a request exists (`reviewRequestedAt` set), AND
864
- * - it is newer than the last spawn (or there was never a spawn) — i.e. a genuinely un-serviced
865
- * request, not the request that produced the current review, AND
866
- * - review is pending rather than already reviewing or terminal, AND
867
- * - the issue is not already ready to merge or merged.
868
- *
869
- * Genuine re-review paths reset `reviewStatus` to `pending` before recording a fresh request: `pan
870
- * done` does this for a new commit, and the operator force-review route does it explicitly.
871
- */
1055
+ function isReviewRequestStale(params) {
1056
+ if (!params.reviewRequestedAt) return false;
1057
+ const now = params.now ?? Date.now();
1058
+ const maxAgeMs = params.maxAgeMs ?? 6048e5;
1059
+ return now - Date.parse(params.reviewRequestedAt) > maxAgeMs;
1060
+ }
872
1061
  function needsReviewDispatch(params) {
873
1062
  if (!params.reviewRequestedAt) return false;
1063
+ if (isReviewRequestStale({
1064
+ reviewRequestedAt: params.reviewRequestedAt,
1065
+ now: params.now,
1066
+ maxAgeMs: params.maxRequestAgeMs
1067
+ })) return false;
874
1068
  if (params.reviewStatus === "reviewing") return false;
875
1069
  if (params.reviewStatus === "passed" || params.reviewStatus === "skipped") return false;
876
1070
  if (params.readyForMerge) return false;
@@ -3663,7 +3857,7 @@ async function addSourceContext(frames) {
3663
3857
  }
3664
3858
  function getContextLinesFromFile(path, ranges, output) {
3665
3859
  return new Promise((resolve) => {
3666
- const stream = createReadStream(path);
3860
+ const stream = createReadStream$1(path);
3667
3861
  const lineReaded = createInterface({ input: stream });
3668
3862
  function destroyStreamAndResolve() {
3669
3863
  stream.destroy();
@@ -6346,7 +6540,7 @@ var init_config = __esmMin((() => {
6346
6540
  //#endregion
6347
6541
  //#region ../../lib/telemetry/install-id.ts
6348
6542
  function readValidInstallId(path) {
6349
- const installId = readFileSync(path, "utf8").trim();
6543
+ const installId = readFileSync$1(path, "utf8").trim();
6350
6544
  return UUID_V4_PATTERN.test(installId) ? installId : null;
6351
6545
  }
6352
6546
  function errorCode(error) {
@@ -6354,7 +6548,7 @@ function errorCode(error) {
6354
6548
  }
6355
6549
  function repairOwnerIsAlive(lockPath) {
6356
6550
  try {
6357
- const rawOwner = readFileSync(lockPath, "utf8").trim();
6551
+ const rawOwner = readFileSync$1(lockPath, "utf8").trim();
6358
6552
  let ownerPid;
6359
6553
  let createdAt;
6360
6554
  try {
@@ -6363,7 +6557,7 @@ function repairOwnerIsAlive(lockPath) {
6363
6557
  createdAt = Number(owner.createdAt);
6364
6558
  } catch {
6365
6559
  ownerPid = Number(rawOwner);
6366
- createdAt = statSync(lockPath).mtimeMs;
6560
+ createdAt = statSync$1(lockPath).mtimeMs;
6367
6561
  }
6368
6562
  if (!Number.isInteger(ownerPid) || ownerPid <= 0 || !Number.isFinite(createdAt) || Date.now() - createdAt >= REPAIR_LOCK_LEASE_MS) return false;
6369
6563
  process.kill(ownerPid, 0);
@@ -6376,22 +6570,22 @@ function replaceInvalidInstallId(path) {
6376
6570
  const installId = randomUUID();
6377
6571
  const temporaryPath = `${path}.${process.pid}.${randomUUID()}.tmp`;
6378
6572
  try {
6379
- writeFileSync(temporaryPath, `${installId}\n`, {
6573
+ writeFileSync$1(temporaryPath, `${installId}\n`, {
6380
6574
  encoding: "utf8",
6381
6575
  mode: 384,
6382
6576
  flag: "wx"
6383
6577
  });
6384
- renameSync(temporaryPath, path);
6385
- chmodSync(path, 384);
6578
+ renameSync$1(temporaryPath, path);
6579
+ chmodSync$1(path, 384);
6386
6580
  } finally {
6387
- rmSync(temporaryPath, { force: true });
6581
+ rmSync$1(temporaryPath, { force: true });
6388
6582
  }
6389
6583
  }
6390
6584
  function repairInvalidInstallId(path, overdeckHome) {
6391
6585
  const lockPath = join(overdeckHome, INSTALL_ID_REPAIR_LOCK);
6392
6586
  for (let attempt = 0; attempt < REPAIR_MAX_ATTEMPTS; attempt += 1) {
6393
6587
  try {
6394
- writeFileSync(lockPath, `${JSON.stringify({
6588
+ writeFileSync$1(lockPath, `${JSON.stringify({
6395
6589
  pid: process.pid,
6396
6590
  createdAt: Date.now()
6397
6591
  })}\n`, {
@@ -6404,7 +6598,7 @@ function repairInvalidInstallId(path, overdeckHome) {
6404
6598
  const winner = readValidInstallId(path);
6405
6599
  if (winner) return winner;
6406
6600
  if (!repairOwnerIsAlive(lockPath)) {
6407
- rmSync(lockPath, { force: true });
6601
+ rmSync$1(lockPath, { force: true });
6408
6602
  continue;
6409
6603
  }
6410
6604
  Atomics.wait(REPAIR_WAIT_ARRAY, 0, 0, REPAIR_WAIT_MS);
@@ -6418,7 +6612,7 @@ function repairInvalidInstallId(path, overdeckHome) {
6418
6612
  if (!repaired) throw new Error(`Failed to repair ${path}`);
6419
6613
  return repaired;
6420
6614
  } finally {
6421
- rmSync(lockPath, { force: true });
6615
+ rmSync$1(lockPath, { force: true });
6422
6616
  }
6423
6617
  }
6424
6618
  throw new Error(`Timed out waiting to repair ${path}`);
@@ -6431,10 +6625,10 @@ function getOrCreateInstallId() {
6431
6625
  } catch (error) {
6432
6626
  if (!(error instanceof Error) || !("code" in error) || error.code !== "ENOENT") throw error;
6433
6627
  }
6434
- mkdirSync(overdeckHome, { recursive: true });
6628
+ mkdirSync$1(overdeckHome, { recursive: true });
6435
6629
  const installId = randomUUID();
6436
6630
  try {
6437
- writeFileSync(installIdPath, `${installId}\n`, {
6631
+ writeFileSync$1(installIdPath, `${installId}\n`, {
6438
6632
  encoding: "utf8",
6439
6633
  mode: 384,
6440
6634
  flag: "wx"
@@ -6461,7 +6655,7 @@ var init_install_id = __esmMin((() => {
6461
6655
  function getOverdeckVersion() {
6462
6656
  if (cachedOverdeckVersion) return cachedOverdeckVersion;
6463
6657
  try {
6464
- const manifest = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"));
6658
+ const manifest = JSON.parse(readFileSync$1(join(packageRoot, "package.json"), "utf8"));
6465
6659
  cachedOverdeckVersion = typeof manifest.version === "string" ? manifest.version : "unknown";
6466
6660
  } catch {
6467
6661
  cachedOverdeckVersion = "unknown";
@@ -6665,9 +6859,9 @@ var init_service = __esmMin((() => {
6665
6859
  //#region ../../lib/telemetry/pipeline.ts
6666
6860
  async function readCanonicalPipelineMembership(issueId) {
6667
6861
  const [membershipModule, gatherModule, recordModule] = await Promise.all([
6668
- import("./pipeline-membership-BGSvkT2M.js"),
6669
- import("./pipeline-membership-gather-DTfcgxLl.js"),
6670
- import("./record-CtroO946.js")
6862
+ import("./pipeline-membership-DHOXmvba.js"),
6863
+ import("./pipeline-membership-gather-OkLXuvxR.js"),
6864
+ import("./record-BTwWhtBb.js")
6671
6865
  ]);
6672
6866
  const project = recordModule.resolveProjectForIssue(issueId);
6673
6867
  if (!project) return false;
@@ -6893,7 +7087,7 @@ function setReviewStatusSync(issueId, update, existing) {
6893
7087
  });
6894
7088
  if (readyForMerge && !status.readyForMerge && updated.prUrl) (async () => {
6895
7089
  try {
6896
- const { isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-DtAsvwzK.js");
7090
+ const { isGitHubAppConfigured, reportCommitStatus } = await import("./github-app-DIE8BkHI.js");
6897
7091
  if (!isGitHubAppConfigured()) return;
6898
7092
  const prMatch = updated.prUrl.match(/github\.com\/([^/]+)\/([^/]+)\/pull/);
6899
7093
  if (!prMatch) return;
@@ -7147,8 +7341,8 @@ function emitReactiveLifecycleEvent(type, issueId) {
7147
7341
  }
7148
7342
  async function deliverReviewVerdictFeedbackHostSide(issueId, status) {
7149
7343
  try {
7150
- const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-BPDn4li_.js");
7151
- const { getAgentStateSync } = await import("./agents-BKKkxKgK.js");
7344
+ const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-qRohbFG2.js");
7345
+ const { getAgentStateSync } = await import("./agents-Dnn4XgdB.js");
7152
7346
  const runId = getAgentStateSync(`agent-${issueId.toLowerCase()}-review`)?.reviewRunId;
7153
7347
  if ((await Effect.runPromise(deliverReviewVerdictFeedback({
7154
7348
  issueId,
@@ -7168,7 +7362,22 @@ function maybeAutoDispatchReviewHostSide(issueId, status) {
7168
7362
  reviewStatus: status.reviewStatus,
7169
7363
  mergeStatus: status.mergeStatus,
7170
7364
  readyForMerge: status.readyForMerge
7171
- })) return;
7365
+ })) {
7366
+ if (!isReviewRequestStale({ reviewRequestedAt: status.reviewRequestedAt }) || staleReviewRequestClearAttemptedAt.has(issueId)) return;
7367
+ staleReviewRequestClearAttemptedAt.set(issueId, Date.now());
7368
+ try {
7369
+ setReviewStatusSync(issueId, { reviewRequestedAt: void 0 }, status);
7370
+ const message = `${issueId} — cleared stale review request older than 7 days`;
7371
+ console.warn(`[review-status] ${message}`);
7372
+ emitActivityEntrySync({
7373
+ source: "cloister",
7374
+ level: "warn",
7375
+ issueId,
7376
+ message
7377
+ });
7378
+ } catch {}
7379
+ return;
7380
+ }
7172
7381
  const last = reviewDispatchAttemptAt.get(issueId) ?? 0;
7173
7382
  if (Date.now() - last < REVIEW_AUTO_DISPATCH_THROTTLE_MS) return;
7174
7383
  reviewDispatchAttemptAt.set(issueId, Date.now());
@@ -7176,7 +7385,15 @@ function maybeAutoDispatchReviewHostSide(issueId, status) {
7176
7385
  }
7177
7386
  async function dispatchReviewHostSide(issueId, prUrl) {
7178
7387
  try {
7179
- const [{ startDurableReviewPipelineHostSide }, { spawnReviewRoleForIssue }] = await Promise.all([import("./durable-review-pipeline-jpgCJZFp.js"), import("./review-agent-CD4RCI0Y.js")]);
7388
+ const { hasDurableReviewPipelineHandler, startDurableReviewPipelineHostSide } = await import("./durable-review-pipeline-D_DcfIGP.js");
7389
+ if (!hasDurableReviewPipelineHandler()) {
7390
+ if (!loggedMissingPipelineHandler) {
7391
+ loggedMissingPipelineHandler = true;
7392
+ console.debug("[review-status] durable review pipeline handler is not registered; skipping host-side review auto-dispatch");
7393
+ }
7394
+ return;
7395
+ }
7396
+ const { spawnReviewRoleForIssue } = await import("./review-agent-UpAM4DmT.js");
7180
7397
  if (!await startDurableReviewPipelineHostSide({
7181
7398
  issueId,
7182
7399
  ...prUrl ? { prUrl } : {},
@@ -7198,13 +7415,13 @@ function maybeRecoverTestVerdictHostSide(issueId, status) {
7198
7415
  }
7199
7416
  async function recoverTestVerdictHostSide(issueId) {
7200
7417
  try {
7201
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
7418
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
7202
7419
  const resolved = resolveProjectFromIssueSync(issueId);
7203
7420
  if (!resolved) return;
7204
7421
  const { existsSync } = await import("fs");
7205
7422
  const workspace = join$1(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`);
7206
7423
  if (!existsSync(workspace)) return;
7207
- const { readTestVerdictArtifact } = await import("./test-verdict-Gw-btEfb.js");
7424
+ const { readTestVerdictArtifact } = await import("./test-verdict-BieVDAV1.js");
7208
7425
  const artifact = readTestVerdictArtifact(workspace);
7209
7426
  if (!artifact) return;
7210
7427
  setReviewStatusSync(issueId, {
@@ -7251,13 +7468,13 @@ function resetPipelineVerdictsForWorkStartSync(issueId, options = {}) {
7251
7468
  }
7252
7469
  async function deliverTestFailureToWorkAgentHostSide(issueId, status) {
7253
7470
  try {
7254
- const { resolveProjectFromIssueSync } = await import("./projects-B03Wr-xc.js");
7471
+ const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
7255
7472
  const resolved = resolveProjectFromIssueSync(issueId);
7256
7473
  const workspace = resolved ? join$1(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`) : void 0;
7257
7474
  const notes = status.testNotes;
7258
7475
  let feedbackPath;
7259
7476
  try {
7260
- const { writeFeedbackFile } = await import("./feedback-writer-D1fm-5Z8.js");
7477
+ const { writeFeedbackFile } = await import("./feedback-writer-CY91ckuw.js");
7261
7478
  const r = await Effect.runPromise(writeFeedbackFile({
7262
7479
  issueId,
7263
7480
  workspacePath: workspace,
@@ -7269,10 +7486,10 @@ async function deliverTestFailureToWorkAgentHostSide(issueId, status) {
7269
7486
  if (r.success) feedbackPath = r.filePath;
7270
7487
  } catch {}
7271
7488
  const message = `SPECIALIST FEEDBACK: test-agent reported FAILED for ${issueId}.\n\n${feedbackPath ? `MUST READ: ${feedbackPath}\n\n` : ""}${notes ? `${notes.slice(0, 400)}\n\n` : ""}Fix the failing tests, commit and push, then re-run pan done ${issueId}. Do NOT stop at the prompt.`;
7272
- const { resolveIssueFeedbackTarget, surfaceIssueFeedbackNeedsYou } = await import("./feedback-target-C0ZzyHvU.js");
7489
+ const { resolveIssueFeedbackTarget, surfaceIssueFeedbackNeedsYou } = await import("./feedback-target-CMrEAoeA.js");
7273
7490
  const target = await resolveIssueFeedbackTarget(issueId);
7274
7491
  if ("agentId" in target) {
7275
- const { messageAgent } = await import("./agents-BKKkxKgK.js");
7492
+ const { messageAgent } = await import("./agents-Dnn4XgdB.js");
7276
7493
  await messageAgent(target.agentId, message, "internal", { owesRework: true });
7277
7494
  console.log(`[review-status] delivered test failure to ${target.agentId} for ${issueId} (host-side)`);
7278
7495
  } else await surfaceIssueFeedbackNeedsYou(issueId, target.reason, {
@@ -7467,7 +7684,7 @@ function setAutoMerge(issueId, autoMerge) {
7467
7684
  console.error(`[review-status] Failed to set autoMerge for ${issueId}:`, err);
7468
7685
  }
7469
7686
  }
7470
- var DEFAULT_STATUS_FILE, reviewDispatchAttemptAt, REVIEW_AUTO_DISPATCH_THROTTLE_MS, testVerdictRecoveryAt, TEST_VERDICT_RECOVERY_THROTTLE_MS, FEEDBACK_DELIVERY_STUCK_REASON, ReviewStatusError, setReviewStatus, getReviewStatus;
7687
+ var DEFAULT_STATUS_FILE, reviewDispatchAttemptAt, staleReviewRequestClearAttemptedAt, REVIEW_AUTO_DISPATCH_THROTTLE_MS, loggedMissingPipelineHandler, testVerdictRecoveryAt, TEST_VERDICT_RECOVERY_THROTTLE_MS, FEEDBACK_DELIVERY_STUCK_REASON, ReviewStatusError, setReviewStatus, getReviewStatus;
7471
7688
  var init_review_status = __esmMin((() => {
7472
7689
  init_pipeline_notifier();
7473
7690
  init_activity_logger();
@@ -7483,7 +7700,9 @@ var init_review_status = __esmMin((() => {
7483
7700
  registerCanonicalReviewStatusResolver((issueId) => getReviewStatusSync(issueId));
7484
7701
  DEFAULT_STATUS_FILE = join$1(homedir(), ".overdeck", "review-status.json");
7485
7702
  reviewDispatchAttemptAt = /* @__PURE__ */ new Map();
7703
+ staleReviewRequestClearAttemptedAt = /* @__PURE__ */ new Map();
7486
7704
  REVIEW_AUTO_DISPATCH_THROTTLE_MS = 3e4;
7705
+ loggedMissingPipelineHandler = false;
7487
7706
  testVerdictRecoveryAt = /* @__PURE__ */ new Map();
7488
7707
  TEST_VERDICT_RECOVERY_THROTTLE_MS = 6e4;
7489
7708
  FEEDBACK_DELIVERY_STUCK_REASON = "feedback_delivery_needs_you";
@@ -7516,6 +7735,6 @@ var init_review_status = __esmMin((() => {
7516
7735
  });
7517
7736
  }));
7518
7737
  //#endregion
7519
- export { getOrCreateInstallId as A, verificationSatisfied as B, capturePipelineStage as C, getAnalyticsService as D, resolvePipelineTelemetryContext as E, init_pipeline_agent_reader as F, saveOverdeckAgentStateSync as G, getOverdeckAgentStateSync as H, registerPipelineTelemetryAgentReader as I, stateToOverdeckParamsForDb as K, init_review_dispatch_decision as L, init_config as M, resolveTelemetryEnabled as N, init_service as O, telemetryEnvironmentForcesOff as P, needsReviewDispatch as R, setReviewStatusSync as S, init_pipeline as T, init_agent_state_sync as U, AGENT_COLUMNS_FOR_DB as V, listOverdeckAgentStatesSync as W, mergeGateEligibility as _, clearStuckMergeStatuses as a, setDeaconIgnored as b, fixStuckReadyForMerge as c, getReviewStatusesSync as d, init_review_status as f, markWorkspaceStuck as g, loadReviewStatusesForIssues as h, clearReviewStatus as i, init_install_id as j, synchronizeAnalyticsServices as k, getReviewStatus as l, loadReviewStatuses as m, ReviewStatusError as n, clearWorkspaceStuck as o, loadReadyForMergeFlags as p, clearFeedbackDeliveryStuck as r, fixStuckCommentedReviews as s, FEEDBACK_DELIVERY_STUCK_REASON as t, getReviewStatusSync as u, resetPipelineVerdictsForWorkStartSync as v, capturePipelineStageForIssue as w, setReviewStatus as x, setAutoMerge as y, reviewGatesPassedSync as z };
7738
+ export { synchronizeAnalyticsServices as A, reviewGatesPassedSync as B, setReviewStatusSync as C, resolvePipelineTelemetryContext as D, init_pipeline as E, telemetryEnvironmentForcesOff as F, readJournalStatus as G, findBlockingFindings as H, init_pipeline_agent_reader as I, getOverdeckAgentStateSync as J, readJournalStatusSync as K, registerPipelineTelemetryAgentReader as L, init_install_id as M, init_config as N, getAnalyticsService as O, resolveTelemetryEnabled as P, stateToOverdeckParamsForDb as Q, init_review_dispatch_decision as R, setReviewStatus as S, capturePipelineStageForIssue as T, init_review_findings as U, verificationSatisfied as V, init_review_status_record_sync as W, listOverdeckAgentStatesSync as X, init_agent_state_sync as Y, saveOverdeckAgentStateSync as Z, markWorkspaceStuck as _, clearStuckMergeStatuses as a, setAutoMerge as b, fixStuckCommentedReviews as c, getReviewStatusSync as d, getReviewStatusesSync as f, loadReviewStatusesForIssues as g, loadReviewStatuses as h, clearReviewStatus as i, getOrCreateInstallId as j, init_service as k, fixStuckReadyForMerge as l, loadReadyForMergeFlags as m, ReviewStatusError as n, clearWorkspaceStuck as o, init_review_status as p, AGENT_COLUMNS_FOR_DB as q, clearFeedbackDeliveryStuck as r, dispatchReviewHostSide as s, FEEDBACK_DELIVERY_STUCK_REASON as t, getReviewStatus as u, mergeGateEligibility as v, capturePipelineStage as w, setDeaconIgnored as x, resetPipelineVerdictsForWorkStartSync as y, needsReviewDispatch as z };
7520
7739
 
7521
- //# sourceMappingURL=review-status-yljtTd-q.js.map
7740
+ //# sourceMappingURL=review-status-CwhA9wmd.js.map