@overdeck/desktop 0.47.0 → 0.48.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 (444) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +59 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-10Ur5Dne.js → acceptance-criteria-DmtLDbtt.js} +2 -2
  4. package/server/{activity-logger-CyteR4JO.js → activity-logger-Co5qljIj.js} +55 -4
  5. package/server/activity-logger-K7FYGF_z.js +3 -0
  6. package/server/{advancing-selfheal-BNwqxseD.js → advancing-selfheal-8AR68Asf.js} +6 -6
  7. package/server/{agent-gc-C3h9Or3a.js → agent-gc-BmYeT6eH.js} +5 -5
  8. package/server/agent-state-Dq3s84-P.js +3 -0
  9. package/server/{agent-state-service-C63p_ftq.js → agent-state-service-DK1Vay1E.js} +1 -1
  10. package/server/{agent-state-service-Ds6OeFvo.js → agent-state-service-rjnzpHDx.js} +6 -6
  11. package/server/agent-state-source-Ds968-j6.js +21 -0
  12. package/server/{agents-J5mEnekq.js → agents-Dls7tfJH.js} +5 -5
  13. package/server/agents-IPSa5kzn.js +3 -0
  14. package/server/{archive-planning-BwhxeP7C.js → archive-planning-Cq7cyinS.js} +51 -24
  15. package/server/archive-planning-MbkGCBIY.js +2 -0
  16. package/server/{artifact-index-jobs-D1q_vR3V.js → artifact-index-jobs-Dj_8kpTd.js} +3 -3
  17. package/server/{assemble-Bgwqv-Ro.js → assemble-BTCmbcfH.js} +20 -13
  18. package/server/{auto-spawn-consent-CQ9Bi9q6.js → auto-spawn-consent-lXqRJ1Dr.js} +304 -121
  19. package/server/{backlog-auto-trigger-n1lzPgN4.js → backlog-auto-trigger-Dn-amzt6.js} +3 -3
  20. package/server/{behavior-td6-xhQk.js → behavior-DIMQMRzs.js} +2 -2
  21. package/server/{boot-reconciled-stop-events-C7gGe3oB.js → boot-reconciled-stop-events-D6SeUTIr.js} +1 -1
  22. package/server/{bridge-pool-patrol-CYH2OLb5.js → bridge-pool-patrol-BEjt-xF3.js} +2 -2
  23. package/server/{briefing-freshness-DRqZ8lAz.js → briefing-freshness-3PNmL_p3.js} +2 -2
  24. package/server/{build-info-7yiEpl6u.js → build-info-CJg813Hm.js} +3 -3
  25. package/server/{build-info-CpG__c63.js → build-info-CXyeFsXu.js} +1 -1
  26. package/server/{checkpoint-manager-CkKmB0wZ.js → checkpoint-manager-9t7G5c1V.js} +1 -1
  27. package/server/{checkpoint-manager-DBcyNR8w.js → checkpoint-manager-B2G38R3p.js} +3 -3
  28. package/server/checkpoint-worker.js +1 -1
  29. package/server/{checkpoints-Wm963lm8.js → checkpoints-CuBgiXO-.js} +1 -1
  30. package/server/{checkpoints-D95apurL.js → checkpoints-VTZMd4Qm.js} +2 -2
  31. package/server/{claude-hooks-provision-Bjitl9aI.js → claude-hooks-provision-55SyQaPz.js} +2 -2
  32. package/server/{claude-hooks-provision-4RPxNkE8.js → claude-hooks-provision-CEUT-CZd.js} +1 -1
  33. package/server/{claude-permissions-CpbpvUQ2.js → claude-permissions-Cn0dIu2i.js} +2 -2
  34. package/server/{claude-settings-overlay-BzkHYDwR.js → claude-settings-overlay-B19hdzSA.js} +1 -1
  35. package/server/{claude-settings-overlay-_H9Yrzab.js → claude-settings-overlay-Yg_ANh81.js} +2 -2
  36. package/server/{cli-Cte9ZFGn.js → cli-C9S84iTy.js} +79 -22
  37. package/server/cli-M1cwZ__d.js +3 -0
  38. package/server/{cliproxy-C5fMJ7rY.js → cliproxy-CJq3KXU6.js} +2 -2
  39. package/server/{cliproxy-DaAbWMjC.js → cliproxy-DgEZlr7Y.js} +1 -1
  40. package/server/{close-issue-BPh1ARCF.js → close-issue-DPxRddGR.js} +5 -5
  41. package/server/{closed-issue-reaper-DoOZqGFK.js → closed-issue-reaper-C5Zn4GRS.js} +13 -13
  42. package/server/{closed-issue-reaper-DHRfRMrp.js → closed-issue-reaper-D-2B48Ri.js} +1 -1
  43. package/server/{codex-o8FJwzmy.js → codex-B3n_rkwn.js} +1 -1
  44. package/server/{codex-BzGDW_d3.js → codex-CjkD1PJu.js} +6 -6
  45. package/server/{codex-parser-Dt-ycU8L.js → codex-parser-DpB1Il-P.js} +2 -2
  46. package/server/{compaction-continuation-CvXpbZ4w.js → compaction-continuation-DZD9ukSE.js} +3 -3
  47. package/server/{config-CL3Gyvja.js → config-C5saf4Ja.js} +1 -1
  48. package/server/{config-BvLe652W.js → config-DnLJATZk.js} +2 -2
  49. package/server/{config-Bi3u1VK7.js → config-DvM8jtQK.js} +2 -2
  50. package/server/{config-yaml-CxdwhAIA.js → config-yaml-BSCqwmX0.js} +11299 -10972
  51. package/server/{conflict-gate-CX80JYYS.js → conflict-gate-DXa_L28t.js} +1 -1
  52. package/server/{conflict-gate-E4nt7ZeS.js → conflict-gate-WfVqgalf.js} +4 -4
  53. package/server/{context-layers-DAG83UZt.js → context-layers-D7UqH9Ab.js} +2 -2
  54. package/server/{context-layers-C_IIysnm.js → context-layers-Dpz3Vd6d.js} +3 -3
  55. package/server/{control-settings-CiqGxXnc.js → control-settings-DVf6pKyv.js} +4 -4
  56. package/server/{conversation-compaction-BE3CNtHF.js → conversation-compaction-5XuH6OBn.js} +1 -1
  57. package/server/{conversation-compaction-D6-yLtqt.js → conversation-compaction-COrbnX1J.js} +8 -8
  58. package/server/{conversation-service-DBxoYMDl.js → conversation-service-BufdtnZF.js} +169 -10
  59. package/server/{conversation-service-D_TS2b1r.js → conversation-service-DnUyIiLb.js} +1 -1
  60. package/server/{conversations-D0UEdLtk.js → conversations-B4rxz-Wl.js} +17 -10
  61. package/server/{conversations-BKDVpB-3.js → conversations-D1bwxQMy.js} +1 -1
  62. package/server/{cost-DpgYmYqR.js → cost-CpFDrJUS.js} +46 -2
  63. package/server/{cost-DS1s0DbG.js → cost-KLuwKCW9.js} +3 -3
  64. package/server/{cost-sync-tOCCGnEt.js → cost-sync-cesi9dp8.js} +3 -3
  65. package/server/{dag-BtkgLeqY.js → dag-BYiFMqpU.js} +2 -2
  66. package/server/{dangerous-git-ops-CFLykHWt.js → dangerous-git-ops-BKvd3-Hk.js} +1 -1
  67. package/server/dashboard-db-worker.js +7 -7
  68. package/server/{deacon-BIblC-WX.js → deacon-BbsWw8a6.js} +3 -3
  69. package/server/{deacon-pLRLbPvR.js → deacon-HdEh0Esp.js} +863 -214
  70. package/server/deacon-event-client-C93rvOT7.js +237 -0
  71. package/server/deacon-event-client-Ck5Ei7Mn.js +3 -0
  72. package/server/{deacon-nudge-log-B08gF0mh.js → deacon-nudge-log-BND_97Wo.js} +4 -3
  73. package/server/{deacon-pending-lifecycle-B-Io84AP.js → deacon-pending-lifecycle-CD3YsiQK.js} +3 -3
  74. package/server/deacon-swarm-DgWADWd_.js +2 -0
  75. package/server/{deacon-swarm-v5PMun-m.js → deacon-swarm-rqrl4TMs.js} +39 -18
  76. package/server/deacon.js +12 -210
  77. package/server/{dead-end-trip-D8A3msX9.js → dead-end-trip-DSF23CLX.js} +4 -3
  78. package/server/dead-end-trip-zKlS4v6f.js +2 -0
  79. package/server/delivery-CsbQdZkS.js +3 -0
  80. package/server/{deploy-patrol-sYgOxLeb.js → deploy-patrol-kARAkji4.js} +17 -21
  81. package/server/{deploy-queue-VfohaPN_.js → deploy-queue-Bj0HJT1i.js} +2 -2
  82. package/server/{deploy-queue-gHJBycaF.js → deploy-queue-rjTUy1RM.js} +1 -1
  83. package/server/{deploy-window-D4DQb8VP.js → deploy-window-B2IM-9G5.js} +10 -44
  84. package/server/{deploy-window-CFRZ0-kt.js → deploy-window-BNFWnA8D.js} +1 -1
  85. package/server/{dev-supervisor-DiOBDM1c.js → dev-supervisor-B1mZYXz4.js} +2 -2
  86. package/server/{devcontainer-renderer-BUOIlfgD.js → devcontainer-renderer-B-o68Z5B.js} +3 -3
  87. package/server/{dist-C3A8B8wM.js → dist-3W--cGMa.js} +1 -1
  88. package/server/dist-BR0QtwmS.js +3 -0
  89. package/server/{dist-src-C0adpegX.js → dist-src-C-Vk2jNk.js} +1 -1
  90. package/server/{docker-Y3PElJb0.js → docker-DH3jUYg1.js} +1 -1
  91. package/server/{docker-BJzlkqYB.js → docker-meuLKLzV.js} +27 -20
  92. package/server/{dod-DlNtcH6n.js → dod-D7-9dCOD.js} +1 -1
  93. package/server/{driver-CKVGi51s.js → driver-CmsY2RLl.js} +1 -1
  94. package/server/{durable-review-pipeline-DP6bIcOY.js → durable-review-pipeline-CStTgOAf.js} +1 -1
  95. package/server/{durable-review-pipeline-Cibps-Rg.js → durable-review-pipeline-Chq0lzjL.js} +1 -1
  96. package/server/{ensure-devcontainer-DMAbWqtQ.js → ensure-devcontainer-BE3llBWP.js} +1 -1
  97. package/server/{ensure-devcontainer-BAofzBPv.js → ensure-devcontainer-BXrY7C2Z.js} +4 -4
  98. package/server/{esm-shims-BeObUkaw.js → esm-shims-Bzy4ZzNU.js} +1 -1
  99. package/server/event-store-COd2tOx8.js +3 -0
  100. package/server/{event-store-CrHcVC5_.js → event-store-D_AR-Y78.js} +184 -11
  101. package/server/{events-CF8QDbuV.js → events-CCkFWa7X.js} +1 -1
  102. package/server/{events-BNrvchBg.js → events-zjDQozet.js} +3 -3
  103. package/server/{factory-Cmm9Hsho.js → factory-DhavwKVc.js} +5 -5
  104. package/server/{feature-registry-population-B6HpNWRy.js → feature-registry-population-DWGBKyWd.js} +4 -4
  105. package/server/{feature-registry-storage-DJEFx1Pf.js → feature-registry-storage-C5DkXmCM.js} +3 -3
  106. package/server/{features-D5km80UI.js → features-CC47YcCX.js} +2 -2
  107. package/server/{feedback-target-BJ5ZADsu.js → feedback-target-D9Tex35_.js} +1 -1
  108. package/server/{feedback-target-DSxEL6lP.js → feedback-target-DoRCR3L-.js} +18 -7
  109. package/server/{feedback-writer-CoB9Z6aU.js → feedback-writer-CTSuA6lw.js} +1 -1
  110. package/server/{feedback-writer-C27Hak8a.js → feedback-writer-DdsBdtNL.js} +5 -5
  111. package/server/{flywheel-DZZdtiOL.js → flywheel-DHWHzaYK.js} +1 -1
  112. package/server/{flywheel-f662Q-y2.js → flywheel-DJQa9az8.js} +14 -14
  113. package/server/{flywheel-BHx8XuMr.js → flywheel-TacAI9MA.js} +21 -17
  114. package/server/{flywheel-merge-order-Dil0LmdN.js → flywheel-merge-order-D2foPh88.js} +1 -1
  115. package/server/{flywheel-merge-order-D_xLMbJU.js → flywheel-merge-order-DRtex2Dt.js} +7 -7
  116. package/server/forge-CdlCG9aS.js +3 -0
  117. package/server/{forge-BaKGCya6.js → forge-c8LeC-tw.js} +2 -2
  118. package/server/{from-B3tZbB55.js → from-BogSwvr2.js} +1 -1
  119. package/server/{fs-lock-Bre3sGoz.js → fs-lock-D_GeJtXl.js} +3 -3
  120. package/server/{fts-operations-B9jG8wa3.js → fts-operations-DP9R-8Q3.js} +3 -3
  121. package/server/{git-utils-Xg4PFN45.js → git-utils-C31x1lpE.js} +1 -1
  122. package/server/{git-utils-CsvYfJU3.js → git-utils-xQ74FoSn.js} +5 -4
  123. package/server/{github-app-Bmg4R9mv.js → github-app-CpQSDlv8.js} +1 -1
  124. package/server/{github-app-CmNk0zLU.js → github-app-D2QuvZ3j.js} +3 -3
  125. package/server/{github-client-qazkPrg0.js → github-client-D9YvJX5D.js} +3 -3
  126. package/server/{github-client-B6KM9_wA.js → github-client-Tpi3PmKX.js} +1 -1
  127. package/server/{github-pr-lookup-DAcVeRLK.js → github-pr-lookup-DvBMv-IW.js} +2 -2
  128. package/server/{harness-binary-BSpiXaLw.js → harness-binary-BHxWf_sX.js} +7 -6
  129. package/server/{harness-resolve-BAJu5MX8.js → harness-resolve-bj9WMABA.js} +4 -4
  130. package/server/{health-events-BwX32k8d.js → health-events-bCDPn59Z.js} +2 -2
  131. package/server/{health-events-2Z6Wa9SM.js → health-events-qo7Ss34U.js} +1 -1
  132. package/server/{hooks-DbtbimEf.js → hooks-Dyxtg5fk.js} +2 -2
  133. package/server/{hooks-D1g1jKLI.js → hooks-X2XHBB2b.js} +1 -1
  134. package/server/{hume-DXNiu6nQ.js → hume-DrZEGpqc.js} +2 -2
  135. package/server/hume-YPsy4UA8.js +3 -0
  136. package/server/{idle-stack-reaper-Cy-dQzW4.js → idle-stack-reaper-CJ1ygW0p.js} +37 -7
  137. package/server/{idle-stack-reaper-CRA1e0jr.js → idle-stack-reaper-uJGOb-vu.js} +1 -1
  138. package/server/{in-flight-guard-D-sSkADM.js → in-flight-guard-CG2Eo-rr.js} +1 -1
  139. package/server/{infra-BDQDRopn.js → infra-CTrmVqc_.js} +111 -6
  140. package/server/{injection-Bl8d_jHZ.js → injection-BisQ0lpX.js} +1 -1
  141. package/server/{injection-6AGnXxlj.js → injection-C9sxqbc2.js} +73 -193
  142. package/server/{inspect-agent-nXdIptyh.js → inspect-agent-BoSO51YC.js} +12 -12
  143. package/server/inspect-agent-BykeOH4a.js +2 -0
  144. package/server/{internal-token-DzK385vD.js → internal-token-AvXePaQT.js} +2 -2
  145. package/server/{internal-token-Ias7N8Kg.js → internal-token-Djkj-yqK.js} +1 -1
  146. package/server/{io-B00PBNku.js → io-mxOWMZ7I.js} +6 -6
  147. package/server/{issue-closed-BehTG1be.js → issue-closed-Bj_bCv_0.js} +7 -7
  148. package/server/{issue-lifecycle-BqSuQvbn.js → issue-lifecycle-A5YIpDZE.js} +1 -1
  149. package/server/{issue-lifecycle-Birk-ifu.js → issue-lifecycle-BXUqaHzF.js} +32 -28
  150. package/server/{issue-service-singleton-C6ZduvuY.js → issue-service-singleton-BPNEXczv.js} +11 -11
  151. package/server/{issue-service-singleton-B2wXiIlw.js → issue-service-singleton-CcaHjKPR.js} +1 -1
  152. package/server/{issues-DQ5-LatB.js → issues-AX-YBeAQ.js} +2 -2
  153. package/server/{jsonl-parser-BDpnGFCl.js → jsonl-parser-CgYWQ20q.js} +7 -3
  154. package/server/kimi-code-BYbme0aV.js +579 -0
  155. package/server/kimi-code-D_Ppt82c.js +3 -0
  156. package/server/kimi-parser-B-JBg3Pv.js +147 -0
  157. package/server/{label-cleanup-Dwnky8FG.js → label-cleanup-sXUlgdM0.js} +3 -3
  158. package/server/{lifecycle-B4Xdb4cY.js → lifecycle-D2X3al0D.js} +2 -2
  159. package/server/{lifecycle-B3s4sM1G.js → lifecycle-DjlljAZ1.js} +6 -6
  160. package/server/{lifecycle-io-CzTHEooc.js → lifecycle-io-C5nVk55o.js} +1 -1
  161. package/server/{lifecycle-io-DCo6s6ks.js → lifecycle-io-NPm1YtIG.js} +5 -5
  162. package/server/{linear-client-CnbtHiic.js → linear-client--luYwCZg.js} +1 -1
  163. package/server/{linear-client-9uq7fhiV.js → linear-client-B8pLegW1.js} +3 -3
  164. package/server/{linear-mcp-auth-BxUOzswy.js → linear-mcp-auth-BQVWV0I3.js} +6 -6
  165. package/server/{linear-mcp-auth-D46fBCLf.js → linear-mcp-auth-Dx81Zl4G.js} +1 -1
  166. package/server/memory-fts-worker.js +1 -1
  167. package/server/{merge-DiW9RdSB.js → merge-Bx5Bh9pi.js} +3 -3
  168. package/server/{merge-sr8Nrnmi.js → merge-Dqmh_zja.js} +1 -1
  169. package/server/{merge-agent-BLUgRsz3.js → merge-agent-DP9AUY29.js} +33 -33
  170. package/server/{merge-agent-DQTXZk8z.js → merge-agent-DWd0KfiS.js} +1 -1
  171. package/server/{merge-batch-Cp_j9BGk.js → merge-batch-BdmvTEAC.js} +1 -1
  172. package/server/{merge-completeness-BLbB5-6n.js → merge-completeness-BfRwFjRx.js} +1 -1
  173. package/server/{merge-completeness-B46KqhtY.js → merge-completeness-C1FevcDT.js} +4 -4
  174. package/server/merge-ops-B98tKc1e.js +2 -0
  175. package/server/merge-rebase-BLykMwPO.js +2 -0
  176. package/server/{merge-rebase-DIkBjgwq.js → merge-rebase-BX1xKsrE.js} +2 -2
  177. package/server/{merge-set-CBgHfwM0.js → merge-set-DsLjjLEV.js} +4 -4
  178. package/server/{merge-set-DeUxFsC3.js → merge-set-H6epHOsw.js} +1 -1
  179. package/server/{merge-sync-kr4vqyjM.js → merge-sync-BEdfsQV4.js} +2 -2
  180. package/server/{merge-sync-CpGmk6Ch.js → merge-sync-BebcWWGA.js} +1 -1
  181. package/server/{merge-train-Dmrcus12.js → merge-train-D1I0lNOT.js} +4 -4
  182. package/server/{merge-train-deps-D_uGX91G.js → merge-train-deps-D_-C0Pk2.js} +4 -4
  183. package/server/{merge-verification-NvaAd8CZ.js → merge-verification-DN1Ov9bU.js} +6 -6
  184. package/server/{merged-docker-cleanup-worker-Y1R06TEl.js → merged-docker-cleanup-worker-CfXSr2pA.js} +4 -4
  185. package/server/{merged-docker-cleanup-worker-DH_hrGPI.js → merged-docker-cleanup-worker-ybsPyHjB.js} +1 -1
  186. package/server/{multipart-parser-R-oC8dQg.js → multipart-parser-CL5QG8iv.js} +2 -2
  187. package/server/{no-resume-mode-BgD0JUmM.js → no-resume-mode-DUR7Hi98.js} +1 -1
  188. package/server/node_modules/.package-lock.json +7 -7
  189. package/server/node_modules/brace-expansion/README.md +23 -1
  190. package/server/node_modules/brace-expansion/index.js +206 -85
  191. package/server/node_modules/brace-expansion/package.json +1 -1
  192. package/server/node_modules/msgpackr/dist/index-no-eval.cjs +34 -28
  193. package/server/node_modules/msgpackr/dist/index-no-eval.cjs.map +1 -1
  194. package/server/node_modules/msgpackr/dist/index-no-eval.min.js +1 -1
  195. package/server/node_modules/msgpackr/dist/index-no-eval.min.js.map +1 -1
  196. package/server/node_modules/msgpackr/dist/index.js +34 -28
  197. package/server/node_modules/msgpackr/dist/index.js.map +1 -1
  198. package/server/node_modules/msgpackr/dist/index.min.js +1 -1
  199. package/server/node_modules/msgpackr/dist/index.min.js.map +1 -1
  200. package/server/node_modules/msgpackr/dist/node.cjs +36 -29
  201. package/server/node_modules/msgpackr/dist/node.cjs.map +1 -1
  202. package/server/node_modules/msgpackr/dist/test.js +63 -32
  203. package/server/node_modules/msgpackr/dist/test.js.map +1 -1
  204. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs +34 -28
  205. package/server/node_modules/msgpackr/dist/unpack-no-eval.cjs.map +1 -1
  206. package/server/node_modules/msgpackr/package.json +1 -1
  207. package/server/node_modules/msgpackr/unpack.js +34 -28
  208. package/server/{orphan-proposed-reconciler-DcgTPPFY.js → orphan-proposed-reconciler-CEW1maPl.js} +1 -1
  209. package/server/{orphan-proposed-reconciler-B6vJHxtX.js → orphan-proposed-reconciler-DfqHZftT.js} +23 -22
  210. package/server/package-lock.json +8 -8
  211. package/server/package.json +1 -1
  212. package/server/{pan-dir-DMzF5wne.js → pan-dir-DhgKfO86.js} +21 -6
  213. package/server/{paths-sJBSb7Ul.js → paths-BUuhi6jM.js} +17 -17
  214. package/server/{pending-lifecycle-claim-DilzGfgk.js → pending-lifecycle-claim-DJlA1rTR.js} +2 -2
  215. package/server/{persistent-logger-H_VjuOu7.js → persistent-logger-s8cbpFNV.js} +2 -2
  216. package/server/{pickup-DWhqzliO.js → pickup-2AxtB3dW.js} +1 -1
  217. package/server/{pipeline-membership-C88VBnhJ.js → pipeline-membership-2_okL5bm.js} +1 -1
  218. package/server/{pipeline-membership-D9SBvItj.js → pipeline-membership-Dqv6_0ig.js} +1 -1
  219. package/server/{pipeline-membership-gather-4eR-7Tqy.js → pipeline-membership-gather-4F1-tXKI.js} +1 -1
  220. package/server/{pipeline-membership-gather-CeVGnNJ2.js → pipeline-membership-gather-CtJ_7aGf.js} +149 -17
  221. package/server/{pipeline-notifier-DT6xLFao.js → pipeline-notifier-CO9rxJgB.js} +1 -1
  222. package/server/{pipeline-notifier-D0ALV6Nw.js → pipeline-notifier-DDfVBJhJ.js} +2 -2
  223. package/server/{post-merge-lifecycle-worker-8HIeS_J6.js → post-merge-lifecycle-worker-DmSOkeNp.js} +3 -3
  224. package/server/{project-pipelines-9SKt2bEc.js → project-pipelines-72WE8GVK.js} +2 -2
  225. package/server/{project-repos-B5pIphKg.js → project-repos-BAqDwtvi.js} +16 -11
  226. package/server/project-repos-Df90Zw7Y.js +3 -0
  227. package/server/projects-WqMWCdpa.js +3 -0
  228. package/server/{prompts-CgzMBvQF.js → prompts-XkL10m8M.js} +2 -2
  229. package/server/{providers-BJQSnAAp.js → providers-ClGPGkQ8.js} +15 -12
  230. package/server/providers-DFUOed8u.js +3 -0
  231. package/server/public/assets/{chunk-BO2N2NFS-D_pGACYN.js → chunk-BO2N2NFS-CeQUdPxr.js} +4 -4
  232. package/server/public/assets/{diagram-OG6HWLK6-BO6fe3hH.js → diagram-OG6HWLK6-B7rgk4yT.js} +1 -1
  233. package/server/public/assets/{dist-5zingMiA.js → dist-2RPazfXY.js} +3 -3
  234. package/server/public/assets/{dist-CVxhbI2E.js → dist-B9NInrVZ.js} +1 -1
  235. package/server/public/assets/{ganttDiagram-6RSMTGT7-Bgj4A7kp.js → ganttDiagram-6RSMTGT7-Bxp0gV14.js} +1 -1
  236. package/server/public/assets/{highlighted-body-OFNGDK62-DNPK7_cm.js → highlighted-body-OFNGDK62-CzoRTVlC.js} +1 -1
  237. package/server/public/assets/index-Cml-kHo6.css +1 -0
  238. package/server/public/assets/{index-DEpY-D1O.js → index-CvN8cEgs.js} +216 -215
  239. package/server/public/assets/{linear-BB0jQT16.js → linear-CFEEl3ND.js} +1 -1
  240. package/server/public/assets/mermaid-GHXKKRXX-CpV7nCBM.js +1 -0
  241. package/server/public/assets/{pieDiagram-4H26LBE5-DeGIzzpZ.js → pieDiagram-4H26LBE5-BeR8R0cr.js} +1 -1
  242. package/server/public/assets/{prod-XBLvikex.js → prod-CYjzjCrn.js} +4 -4
  243. package/server/public/assets/{quadrantDiagram-W4KKPZXB-BV9SLeWz.js → quadrantDiagram-W4KKPZXB-BpcTkFuW.js} +1 -1
  244. package/server/public/assets/{sankeyDiagram-5OEKKPKP-Dwja0gj8.js → sankeyDiagram-5OEKKPKP-Bx2ETEV5.js} +1 -1
  245. package/server/public/assets/{xychartDiagram-2RQKCTM6-DCB4qvfw.js → xychartDiagram-2RQKCTM6-BKgEAFaj.js} +1 -1
  246. package/server/public/index.html +2 -2
  247. package/server/{pull-requests-7BgLDsIo.js → pull-requests-B-KrUph5.js} +3 -3
  248. package/server/{pull-requests-Dq0y6IxE.js → pull-requests-DK5k92B4.js} +1 -1
  249. package/server/{queries-C-MUZaIy.js → queries-DVpl1vsU.js} +1212 -193
  250. package/server/{rally-CPysR4T_.js → rally-DbE561hD.js} +3 -3
  251. package/server/rally-O_st_X7n.js +3 -0
  252. package/server/{rally-api-8Ptlp2os.js → rally-api-CZLeEd2C.js} +2 -2
  253. package/server/{rally-api-CgosKdKL.js → rally-api-DaHtn5QN.js} +1 -1
  254. package/server/{rally-client-CCX0hADj.js → rally-client-C-MAl8ur.js} +1 -1
  255. package/server/{rally-client-iYMHWQD7.js → rally-client-Ch3zRsBX.js} +5 -5
  256. package/server/{reap-terminal-sessions-Qf-9LVQc.js → reap-terminal-sessions-C1n0ALRb.js} +2 -2
  257. package/server/{reap-terminal-sessions-4Xg9NGA8.js → reap-terminal-sessions-DegFS2p1.js} +2 -2
  258. package/server/{rebuild-stack-CMdgaylx.js → rebuild-stack-C9Li44A3.js} +20 -10
  259. package/server/{rebuild-stack-DqcOVmJO.js → rebuild-stack-qC0jCNm6.js} +2 -2
  260. package/server/{reconstruct-cache-CMZJ_Vjq.js → reconstruct-cache-BHyiAg02.js} +7 -7
  261. package/server/record-aVzu-LGm.js +3 -0
  262. package/server/record-update-CZh46a2f.js +617 -0
  263. package/server/{record-update-DhI7eySG.js → record-update-DtdJK2Iw.js} +1 -1
  264. package/server/recovery-trip-CSNWSLDn.js +77 -0
  265. package/server/recovery-trip-_16hFKv4.js +3 -0
  266. package/server/{release-engine-B2X9AfFC.js → release-engine-Be5MX5GP.js} +5 -5
  267. package/server/{release-set-G4XKyQ8K.js → release-set-DJv_O6PS.js} +3 -3
  268. package/server/{remote-BXarMvqf.js → remote-BMM3uH2J.js} +3 -3
  269. package/server/{remote-CUhyqjXk.js → remote-C0xVTHA5.js} +3 -3
  270. package/server/{remote-agents-CLZB3Coc.js → remote-agents-BIIoc5pD.js} +1 -1
  271. package/server/{remote-agents-Bba-MgSA.js → remote-agents-EUiZ26bj.js} +7 -7
  272. package/server/{remote-completion-CwAp79EC.js → remote-completion-BS4tJUn8.js} +13 -13
  273. package/server/resolver-BvHd6RE4.js +163 -0
  274. package/server/resume-9thEqAQR.js +3 -0
  275. package/server/{review-agent--pOptAEV.js → review-agent-BHGaBoBu.js} +29 -29
  276. package/server/{review-agent-BTCNkq2h.js → review-agent-CD3RQ-tc.js} +1 -1
  277. package/server/{review-artifacts-BNmw8dWE.js → review-artifacts-DyhajWso.js} +6 -6
  278. package/server/{review-context-DFxYOOJW.js → review-context-B-dlsPnx.js} +9 -9
  279. package/server/{review-convoy-liveness-BgU_1jJf.js → review-convoy-liveness-D7M-s_nS.js} +2 -2
  280. package/server/{review-status-Dma9SFaN.js → review-status-B6wYcOtP.js} +1 -1
  281. package/server/{review-status-CGvlA4o_.js → review-status-CKLk5aZ-.js} +308 -58
  282. package/server/{review-status-emit-DURrmGYX.js → review-status-emit-CJ7UmEVU.js} +3 -3
  283. package/server/{review-status-enrichment-8NiNXi5W.js → review-status-enrichment-DJRgGX7-.js} +3 -3
  284. package/server/review-status-limits-4EJDCGHO.js +7 -0
  285. package/server/{review-status-source-DIk1JSow.js → review-status-source-7nU3Z2wL.js} +1 -1
  286. package/server/{review-status-source-BLx_1siH.js → review-status-source-BsDYGfyv.js} +1 -1
  287. package/server/{review-status-sync-muT-EBp2.js → review-status-sync-BLssMTEW.js} +1 -1
  288. package/server/{review-status-sync-0GxOqeqF.js → review-status-sync-BxBeHRde.js} +35 -11
  289. package/server/{review-verdict-feedback-xJNdqBnX.js → review-verdict-feedback-5jWuzgpc.js} +90 -16
  290. package/server/{review-verdict-feedback-HwF6ODFy.js → review-verdict-feedback-HRY9P4bN.js} +1 -1
  291. package/server/{rollup-BQaol5TX.js → rollup-BGIrCEkU.js} +79 -44
  292. package/server/rollup-CZB4UL9q.js +3 -0
  293. package/server/{scanner-C-D2cFdX.js → scanner-DydjXPrz.js} +16 -9
  294. package/server/search-DdtIjAiu.js +395 -0
  295. package/server/{sequence-io-Bmf1EZM5.js → sequence-io-Fw-cLyDs.js} +4 -4
  296. package/server/{sequencer-agent-CigMyKh2.js → sequencer-agent-BcpGMt5x.js} +15 -10
  297. package/server/server.js +1258 -438
  298. package/server/{service-CD0DvFvD.js → service-BFFkGsG4.js} +58 -58
  299. package/server/{session-fork-B6cQ5eya.js → session-fork-D0V-3e5P.js} +2 -2
  300. package/server/{session-history-3ON_IJjm.js → session-history-Bta5l9jY.js} +5 -5
  301. package/server/{settings-PilbFZAM.js → settings-Ce8B1daF.js} +2 -2
  302. package/server/{settings-VN0qOh4U.js → settings-E3FnEIUx.js} +3 -3
  303. package/server/settings-eOOJpxi_.js +2 -0
  304. package/server/{shadow-engineering-DXvx77oE.js → shadow-engineering-Mt9nJO4i.js} +3 -3
  305. package/server/{shadow-state-CZBp7pwq.js → shadow-state-Bzj_AZCV.js} +1 -1
  306. package/server/{shadow-state-BBk_zacw.js → shadow-state-DrkhoVSx.js} +2 -2
  307. package/server/{shadow-utils-DdZ05AJS.js → shadow-utils-H1GfqP06.js} +2 -2
  308. package/server/{ship-log-7kJfjUX2.js → ship-log-CFUIo4PR.js} +1 -1
  309. package/server/{smart-compaction-8fA5k5XN.js → smart-compaction-DSTq-Wua.js} +1 -1
  310. package/server/{smart-compaction-ByhL9cRS.js → smart-compaction-Hzp3KCJX.js} +7 -7
  311. package/server/{spawn-planning-session-vLUJoFjy.js → spawn-planning-session-C0uSA2SL.js} +2 -2
  312. package/server/{spawn-planning-session-pcF-YeFE.js → spawn-planning-session-DN4son31.js} +23 -21
  313. package/server/{specialist-completion-B07XjWD2.js → specialist-completion-Cf6tpIh1.js} +1 -1
  314. package/server/{specialist-context-DJ-zFyL3.js → specialist-context-DEUEkjIQ.js} +5 -5
  315. package/server/{specialist-handoff-logger-aKSxbIgD.js → specialist-handoff-logger-D_LmQDj3.js} +2 -2
  316. package/server/{specialist-logs-Dae-n52_.js → specialist-logs-7Ynue0R7.js} +3 -3
  317. package/server/{specialists-KR3pKulN.js → specialists-CQwBEGlD.js} +1 -1
  318. package/server/{specialists-6PWdtWcg.js → specialists-DAjPgYs_.js} +504 -238
  319. package/server/{specialists-DUiExaxb.js → specialists-Hr6iW9fU.js} +18 -18
  320. package/server/{specialists-Bz-wFT7R.js → specialists-MOoeB4A8.js} +1 -1
  321. package/server/specs-Dl88cbKY.js +3 -0
  322. package/server/{src-B948bGVR.js → src-BYdwL_n-.js} +668 -64
  323. package/server/{src-vHy2-oCv.js → src-DQnkPN2i.js} +3 -3
  324. package/server/{src-rac0Mepv.js → src-DhfDV0o4.js} +6 -6
  325. package/server/{stack-health-DqLTiEu4.js → stack-health-D_iKwNRg.js} +107 -16
  326. package/server/stack-health-deVSdDwn.js +3 -0
  327. package/server/{stale-task-claims-Cab_Fo_Z.js → stale-task-claims-BYJGqhLI.js} +5 -5
  328. package/server/{staleness-CGTZyp6V.js → staleness-CopBDKnA.js} +1 -1
  329. package/server/{staleness-C-a5rBxF.js → staleness-D8WeMUHd.js} +1 -1
  330. package/server/{state-home-722Dkx92.js → state-home-DjN8qduI.js} +24 -3
  331. package/server/{state-mapping-CybR81Uf.js → state-mapping-DlM7OYRW.js} +1 -1
  332. package/server/{state-migrate-2u8wIpoL.js → state-migrate-a2p1gtD7.js} +4 -4
  333. package/server/state-mirror-Cv_XgvT5.js +121 -0
  334. package/server/{stuck-remediation-r1TJu68G.js → stuck-remediation-CXJX_kki.js} +1 -1
  335. package/server/{stuck-remediation-CC6q3eqQ.js → stuck-remediation-CbCRSz1v.js} +31 -732
  336. package/server/{substrate-bug-weights-service-CzIyyWFT.js → substrate-bug-weights-service-DxpopNd9.js} +3 -3
  337. package/server/{summary-fork-BqgmgPDt.js → summary-fork-B61fjRJn.js} +2 -2
  338. package/server/{summary-fork-Df2WFijM.js → summary-fork-B9pszUJN.js} +91 -10
  339. package/server/supervisor/{injection-budget-Cg_KIb3o.js → injection-budget-Ar7hgyJq.js} +1 -1
  340. package/server/supervisor/pty-supervisor.js +12 -3
  341. package/server/supervisor/{pty-token-BbjwEUUM.js → pty-token-CXCFU0Z8.js} +1 -1
  342. package/server/{supervisor-BxqSpjcN.js → supervisor-BvnxbuuF.js} +6 -4
  343. package/server/supervisor-C69kpqvd.js +2 -0
  344. package/server/{swarm-readiness-DfFxa9-n.js → swarm-readiness-vTw1kqGa.js} +3 -3
  345. package/server/{system-prerequisites-ICLSkhhZ.js → system-prerequisites-LLzTEqsK.js} +3 -3
  346. package/server/{teardown-workspace-DRdi_CPa.js → teardown-workspace-CqKKVJr1.js} +15 -15
  347. package/server/{test-agent-queue-A_-p-i0I.js → test-agent-queue-CWMq7oyG.js} +8 -7
  348. package/server/{test-verdict-BHgTAwIG.js → test-verdict-NdtgRBuA.js} +1 -1
  349. package/server/{test-verdict-C4i9aqEP.js → test-verdict-diIWE6hz.js} +15 -3
  350. package/server/{tldr-daemon-CvWXBhX1.js → tldr-daemon-B1Jhrtc8.js} +1 -1
  351. package/server/{tldr-daemon-wvsU6bKv.js → tldr-daemon-Bpls1CJB.js} +2 -2
  352. package/server/{tmux-CfDHob9M.js → tmux-CImZaX4q.js} +10 -16
  353. package/server/tmux-Cjpx8L8u.js +4 -0
  354. package/server/{token-DrxwytsZ.js → token-Bgpjo3tE.js} +2 -2
  355. package/server/token-util-BsjFll-k.js +3 -0
  356. package/server/{token-util-B48BlCba.js → token-util-BymbpkJp.js} +1 -1
  357. package/server/{tracker-config-BcPMElRB.js → tracker-config-4DaKVTfc.js} +2 -2
  358. package/server/{tracker-utils-CJ6BHjcD.js → tracker-utils-BDeAXC-q.js} +2 -2
  359. package/server/{traefik-connect-DZ6nMYMj.js → traefik-connect-CC5FyxYj.js} +1 -1
  360. package/server/{tunnel-Bp-dRHZz.js → tunnel-CDWkeceJ.js} +1 -1
  361. package/server/{tunnel-DUbUPElU.js → tunnel-CPf5M-Pc.js} +3 -3
  362. package/server/{typed-errors-DyjseiB6.js → typed-errors-9K7Dq_Vn.js} +1 -1
  363. package/server/{typed-errors-CKeoDdU3.js → typed-errors-DrS5fb5z.js} +1 -1
  364. package/server/{types-Cm5ASJbq.js → types-DzlUKiuf.js} +4 -3
  365. package/server/{types-Di8wdakq.js → types-kI9ik8XO.js} +1 -1
  366. package/server/{uat-promote-verification-CoJuh7XO.js → uat-promote-verification-c_pxoxEc.js} +5 -5
  367. package/server/{uat-train-4Q0k06CQ.js → uat-train-CWGxBdJO.js} +0 -0
  368. package/server/{uat-train-Dewoatps.js → uat-train-CfCYd2ve.js} +1 -1
  369. package/server/{validate-B0C8p66t.js → validate-f3ItVCfm.js} +3 -3
  370. package/server/{validation-hVOwQk8T.js → validation-5G_wQtea.js} +1 -1
  371. package/server/{validation-B_kIRfNe.js → validation-7tSiCM82.js} +4 -4
  372. package/server/{verification-artifact-BxlxTiYK.js → verification-artifact-9h9dH8uX.js} +1 -1
  373. package/server/{verification-artifact-D70AtckY.js → verification-artifact-C_4WJnf6.js} +1 -1
  374. package/server/{verification-runner-Bc3cJvpC.js → verification-runner-BV5F6wrA.js} +1 -1
  375. package/server/{verification-runner-KZTz6u72.js → verification-runner-D58KmBhK.js} +18 -38
  376. package/server/{vtt-parser-CE_i3Bcw.js → vtt-parser-2iT9OHa9.js} +1 -1
  377. package/server/{work-agent-prompt-ByrPAzOy.js → work-agent-prompt-D03s4DD1.js} +9 -9
  378. package/server/{workflows-D0vP1WrK.js → workflows-BMBwLYPV.js} +281 -98
  379. package/server/workflows-BOmWGpIh.js +2 -0
  380. package/server/{workspace-DQkRPLlQ.js → workspace-BgflNCH0.js} +3 -3
  381. package/server/{workspace-COWvdibH.js → workspace-Cn9ywfSW.js} +1 -1
  382. package/server/{workspace-anchor-drift-pwz23TI1.js → workspace-anchor-drift-C8Fy3shi.js} +1 -1
  383. package/server/{workspace-anchor-drift-DXYIAHzr.js → workspace-anchor-drift-CMiNncwq.js} +5 -8
  384. package/server/{workspace-config-BdZM4PvZ.js → workspace-config-aUc2nIz6.js} +1 -1
  385. package/server/{workspace-manager-BPgTrG66.js → workspace-manager-Bem7ZBs9.js} +521 -292
  386. package/server/workspace-manager-C0CpNh3t.js +3 -0
  387. package/server/{workspace-metadata-CdjzAP8x.js → workspace-metadata-C5iSlPRo.js} +1 -1
  388. package/server/{workspace-metadata-DkO_iTLo.js → workspace-metadata-UKmTYmDQ.js} +2 -2
  389. package/server/{workspaces-CRBJikLp.js → workspaces-DqxgwDZ8.js} +143 -113
  390. package/sync-sources/hooks/notification-hook +12 -1
  391. package/sync-sources/hooks/pan-hook-lib.sh +226 -0
  392. package/sync-sources/hooks/session-start-hook +31 -4
  393. package/sync-sources/hooks/work-agent-stop-hook +23 -1
  394. package/sync-sources/skills/pan-memory/SKILL.md +19 -3
  395. package/sync-sources/skills/pan-projects/SKILL.md +9 -0
  396. package/sync-sources/skills/pan-restart/SKILL.md +26 -7
  397. package/sync-sources/skills/pan-workspace/SKILL.md +77 -0
  398. package/server/activity-logger-CMthG6Vd.js +0 -3
  399. package/server/agent-state-CYXJVG72.js +0 -3
  400. package/server/agents-ePFVoZbu.js +0 -3
  401. package/server/archive-planning-B2XplFzT.js +0 -2
  402. package/server/cli-CjOCSnfj.js +0 -3
  403. package/server/deacon-swarm-B1XkIvfr.js +0 -2
  404. package/server/delivery-BX9HR4wQ.js +0 -3
  405. package/server/dist-B3YPQa5A.js +0 -3
  406. package/server/event-store-5UKzh9Jf.js +0 -3
  407. package/server/forge-B5o319qI.js +0 -3
  408. package/server/fts-db-IVc4_M3f.js +0 -146
  409. package/server/hume-VUCNbTgn.js +0 -3
  410. package/server/inspect-agent-CUwVmr2h.js +0 -2
  411. package/server/merge-ops-1abz6O_P.js +0 -2
  412. package/server/merge-rebase-CJJVAJuz.js +0 -2
  413. package/server/node_modules/brace-expansion/.tap/coverage/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -757
  414. package/server/node_modules/brace-expansion/.tap/processinfo/8b906b8c-e21f-40b5-8c0d-214d8c2682c5.json +0 -719
  415. package/server/node_modules/brace-expansion/ADVISORY-CVE-2026-14257.md +0 -107
  416. package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts +0 -8
  417. package/server/node_modules/brace-expansion/dist/commonjs/index.d.ts.map +0 -1
  418. package/server/node_modules/brace-expansion/dist/commonjs/index.js +0 -263
  419. package/server/node_modules/brace-expansion/dist/commonjs/index.js.map +0 -1
  420. package/server/node_modules/brace-expansion/dist/commonjs/package.json +0 -3
  421. package/server/node_modules/brace-expansion/dist/esm/index.d.ts +0 -8
  422. package/server/node_modules/brace-expansion/dist/esm/index.d.ts.map +0 -1
  423. package/server/node_modules/brace-expansion/dist/esm/index.js +0 -259
  424. package/server/node_modules/brace-expansion/dist/esm/index.js.map +0 -1
  425. package/server/node_modules/brace-expansion/dist/esm/package.json +0 -3
  426. package/server/project-repos-DPjOdfPa.js +0 -3
  427. package/server/projects-_n3Zui6K.js +0 -3
  428. package/server/providers-BI1mOBQ4.js +0 -3
  429. package/server/public/assets/index-Ddkcz3WT.css +0 -1
  430. package/server/public/assets/mermaid-GHXKKRXX-BzPfaQJ1.js +0 -1
  431. package/server/rally-D_VW4bJv.js +0 -3
  432. package/server/record-BTwWhtBb.js +0 -3
  433. package/server/record-update-DaOKS7Wb.js +0 -277
  434. package/server/recovery-trip-DDH-02ng.js +0 -44
  435. package/server/resume-mOREjlYu.js +0 -3
  436. package/server/rollup-BR4t_wck.js +0 -3
  437. package/server/settings-CVmWiJ-r.js +0 -2
  438. package/server/specs--enInima.js +0 -3
  439. package/server/stack-health-BikqHSjn.js +0 -3
  440. package/server/supervisor-B4anCCSm.js +0 -2
  441. package/server/tmux-Ctk6RV5l.js +0 -3
  442. package/server/token-util-D411CAq9.js +0 -3
  443. package/server/workflows-DtDX08ed.js +0 -2
  444. package/server/workspace-manager-C1F3XsnS.js +0 -3
@@ -0,0 +1,7 @@
1
+ import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
+ //#region ../../lib/review-status-limits.ts
3
+ var init_review_status_limits = __esmMin((() => {}));
4
+ //#endregion
5
+ export { init_review_status_limits as t };
6
+
7
+ //# sourceMappingURL=review-status-limits-4EJDCGHO.js.map
@@ -57,4 +57,4 @@ var init_review_status_source = __esmMin((() => {
57
57
  //#endregion
58
58
  export { registerCanonicalReviewStatusResolver as a, readReviewStatusMap as i, init_review_status_source as n, registerReviewStatusMapReader as o, isRoleTerminal as r, resolveCanonicalReviewStatus as s, classifyAdvancingSessionLifecycle as t };
59
59
 
60
- //# sourceMappingURL=review-status-source-DIk1JSow.js.map
60
+ //# sourceMappingURL=review-status-source-7nU3Z2wL.js.map
@@ -1,3 +1,3 @@
1
- import { n as init_review_status_source, s as resolveCanonicalReviewStatus } from "./review-status-source-DIk1JSow.js";
1
+ import { n as init_review_status_source, s as resolveCanonicalReviewStatus } from "./review-status-source-7nU3Z2wL.js";
2
2
  init_review_status_source();
3
3
  export { resolveCanonicalReviewStatus };
@@ -1,3 +1,3 @@
1
- import { c as init_review_status_sync, t as clearWorkspaceStuck } from "./review-status-sync-0GxOqeqF.js";
1
+ import { c as init_review_status_sync, t as clearWorkspaceStuck } from "./review-status-sync-BxBeHRde.js";
2
2
  init_review_status_sync();
3
3
  export { clearWorkspaceStuck };
@@ -1,5 +1,6 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-BDQDRopn.js";
2
+ import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CTrmVqc_.js";
3
+ import { t as init_review_status_limits } from "./review-status-limits-4EJDCGHO.js";
3
4
  import { Effect } from "effect";
4
5
  //#region ../../lib/review-status-normalize.ts
5
6
  function normalizeReviewStatusSync(status) {
@@ -33,6 +34,11 @@ function isoToMs(value) {
33
34
  function msToIso(value) {
34
35
  return value == null ? void 0 : new Date(value).toISOString();
35
36
  }
37
+ function truncateHistoryNote(note) {
38
+ if (!note) return void 0;
39
+ if (note.length <= 500) return note;
40
+ return note.slice(0, 499) + "…";
41
+ }
36
42
  function rowToReviewStatus(row, history) {
37
43
  return normalizeReviewStatusSync({
38
44
  issueId: row.issue_id.toUpperCase(),
@@ -90,12 +96,14 @@ function rowToReviewStatus(row, history) {
90
96
  });
91
97
  }
92
98
  function getHistorySync(issueId) {
93
- return getOverdeckDatabaseSync().prepare(`SELECT type, status, timestamp, notes FROM status_history
94
- WHERE issue_id = ? ORDER BY timestamp ASC`).all(issueId.toUpperCase()).map((r) => ({
99
+ const rows = getOverdeckDatabaseSync().prepare(`SELECT type, status, timestamp, notes FROM status_history
100
+ WHERE issue_id = ? ORDER BY timestamp DESC LIMIT ?`).all(issueId.toUpperCase(), 20);
101
+ rows.reverse();
102
+ return rows.map((r) => ({
95
103
  type: r.type,
96
104
  status: r.status,
97
105
  timestamp: new Date(r.timestamp).toISOString(),
98
- ...r.notes ? { notes: r.notes } : {}
106
+ ...r.notes ? { notes: truncateHistoryNote(r.notes) } : {}
99
107
  }));
100
108
  }
101
109
  function upsertReviewStatusSync(status) {
@@ -199,8 +207,15 @@ function getReviewStatusFromDbSync(issueId) {
199
207
  function getAllReviewStatusesFromDb() {
200
208
  const db = getOverdeckDatabaseSync();
201
209
  const rows = db.prepare("SELECT * FROM review_status ORDER BY updated_at DESC").all();
202
- const historyRows = db.prepare(`SELECT issue_id, type, status, timestamp, notes FROM status_history
203
- ORDER BY issue_id, timestamp ASC`).all();
210
+ const historyRows = db.prepare(`WITH bounded AS (
211
+ SELECT issue_id, type, status, timestamp, notes,
212
+ ROW_NUMBER() OVER (PARTITION BY issue_id ORDER BY timestamp DESC, id DESC) as rn
213
+ FROM status_history
214
+ )
215
+ SELECT issue_id, type, status, timestamp, notes
216
+ FROM bounded
217
+ WHERE rn <= ?
218
+ ORDER BY issue_id, timestamp ASC`).all(20);
204
219
  const historyByIssue = /* @__PURE__ */ new Map();
205
220
  for (const row of historyRows) {
206
221
  const bucket = historyByIssue.get(row.issue_id) ?? [];
@@ -208,7 +223,7 @@ function getAllReviewStatusesFromDb() {
208
223
  type: row.type,
209
224
  status: row.status,
210
225
  timestamp: row.timestamp,
211
- ...row.notes ? { notes: row.notes } : {}
226
+ ...row.notes ? { notes: truncateHistoryNote(row.notes) } : {}
212
227
  });
213
228
  historyByIssue.set(row.issue_id, bucket);
214
229
  }
@@ -223,8 +238,16 @@ function getReviewStatusesFromDb(issueIds) {
223
238
  const placeholders = normalizedIds.map(() => "?").join(", ");
224
239
  const rows = db.prepare(`SELECT * FROM review_status WHERE issue_id IN (${placeholders}) ORDER BY updated_at DESC`).all(...normalizedIds);
225
240
  if (rows.length === 0) return {};
226
- const historyRows = db.prepare(`SELECT issue_id, type, status, timestamp, notes FROM status_history
227
- WHERE issue_id IN (${placeholders}) ORDER BY issue_id, timestamp ASC`).all(...normalizedIds);
241
+ const historyRows = db.prepare(`WITH bounded AS (
242
+ SELECT issue_id, type, status, timestamp, notes,
243
+ ROW_NUMBER() OVER (PARTITION BY issue_id ORDER BY timestamp DESC, id DESC) as rn
244
+ FROM status_history
245
+ WHERE issue_id IN (${placeholders})
246
+ )
247
+ SELECT issue_id, type, status, timestamp, notes
248
+ FROM bounded
249
+ WHERE rn <= ?
250
+ ORDER BY issue_id, timestamp ASC`).all(...normalizedIds, 20);
228
251
  const historyByIssue = /* @__PURE__ */ new Map();
229
252
  for (const row of historyRows) {
230
253
  const bucket = historyByIssue.get(row.issue_id) ?? [];
@@ -232,7 +255,7 @@ function getReviewStatusesFromDb(issueIds) {
232
255
  type: row.type,
233
256
  status: row.status,
234
257
  timestamp: row.timestamp,
235
- ...row.notes ? { notes: row.notes } : {}
258
+ ...row.notes ? { notes: truncateHistoryNote(row.notes) } : {}
236
259
  });
237
260
  historyByIssue.set(row.issue_id, bucket);
238
261
  }
@@ -287,6 +310,7 @@ function getMergeBlockerReconcileCandidatesSync() {
287
310
  var getMergeBlockerReconcileCandidates;
288
311
  var init_review_status_sync = __esmMin((() => {
289
312
  init_review_status_normalize();
313
+ init_review_status_limits();
290
314
  init_infra();
291
315
  getMergeBlockerReconcileCandidates = () => Effect.promise(() => new Promise((resolve, reject) => {
292
316
  setImmediate(() => {
@@ -301,4 +325,4 @@ var init_review_status_sync = __esmMin((() => {
301
325
  //#endregion
302
326
  export { getMergeBlockerReconcileCandidatesSync as a, init_review_status_sync as c, init_review_status_normalize as d, normalizeReviewStatusSync as f, getMergeBlockerReconcileCandidates as i, markWorkspaceStuck as l, deleteReviewStatus as n, getReviewStatusFromDbSync as o, getAllReviewStatusesFromDb as r, getReviewStatusesFromDb as s, clearWorkspaceStuck as t, upsertReviewStatusSync as u };
303
327
 
304
- //# sourceMappingURL=review-status-sync-0GxOqeqF.js.map
328
+ //# sourceMappingURL=review-status-sync-BxBeHRde.js.map
@@ -1,17 +1,78 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Gn as init_projects, ar as resolveProjectFromIssueSync } from "./config-yaml-CxdwhAIA.js";
3
- import { d as getReviewStatusSync, p as init_review_status, r as clearFeedbackDeliveryStuck } from "./review-status-CGvlA4o_.js";
4
- import { X as messageAgent, b as init_agents } from "./queries-C-MUZaIy.js";
5
- import { a as PAN_DIRNAME, p as init_types } from "./types-Cm5ASJbq.js";
6
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-C27Hak8a.js";
7
- import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-DSxEL6lP.js";
2
+ import { Sn as resolveProjectFromIssueSync, cn as init_projects } from "./config-yaml-BSCqwmX0.js";
3
+ import { d as getReviewStatusSync, p as init_review_status, r as clearFeedbackDeliveryStuck } from "./review-status-CKLk5aZ-.js";
4
+ import { b as init_agents, ft as messageAgent } from "./queries-DVpl1vsU.js";
5
+ import { a as PAN_DIRNAME, m as init_types } from "./types-DzlUKiuf.js";
6
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-DdsBdtNL.js";
7
+ import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-DoRCR3L-.js";
8
8
  import { join } from "node:path";
9
9
  import { Effect } from "effect";
10
10
  import { existsSync } from "node:fs";
11
- import { readFile, readdir, stat as stat$1 } from "node:fs/promises";
11
+ import { access, readFile, readdir, stat as stat$1 } from "node:fs/promises";
12
12
  import { execFile } from "node:child_process";
13
13
  import { promisify } from "node:util";
14
14
  import { createHash } from "node:crypto";
15
+ //#region ../../lib/cloister/review-verdict-report.ts
16
+ function findVerdictReport(dirPath) {
17
+ for (const filename of VERDICT_REPORT_FILENAMES) {
18
+ const path = join(dirPath, filename);
19
+ if (existsSync(path)) return {
20
+ path,
21
+ filename
22
+ };
23
+ }
24
+ return null;
25
+ }
26
+ async function findVerdictReportAsync(dirPath) {
27
+ for (const filename of VERDICT_REPORT_FILENAMES) {
28
+ const path = join(dirPath, filename);
29
+ try {
30
+ await access(path);
31
+ return {
32
+ path,
33
+ filename
34
+ };
35
+ } catch {}
36
+ }
37
+ return null;
38
+ }
39
+ function parseVerdictReport(content) {
40
+ const verdictLine = content.match(/^##\s*Verdict:\s*(.+)$/im);
41
+ if (!verdictLine) return null;
42
+ const verdictText = verdictLine[1].trim();
43
+ if (/^(?:APPROVED|PASSED)\b/i.test(verdictText)) return {
44
+ verdict: "passed",
45
+ topBlocker: ""
46
+ };
47
+ if (/^FAILED\b/i.test(verdictText)) return {
48
+ verdict: "failed",
49
+ topBlocker: ""
50
+ };
51
+ const changesRequested = verdictText.match(/^CHANGES REQUESTED(?:\s*(?:—|–|:|-)\s*(.+))?$/i);
52
+ if (!changesRequested) return null;
53
+ const suffixBlocker = changesRequested[1]?.trim();
54
+ if (suffixBlocker) return {
55
+ verdict: "blocked",
56
+ topBlocker: suffixBlocker
57
+ };
58
+ const blockingHeading = content.match(/^##\s*Blocking Findings\s*$/im);
59
+ let blockingSection = "";
60
+ if (blockingHeading?.index !== void 0) {
61
+ const sectionStart = blockingHeading.index + blockingHeading[0].length;
62
+ const remainingContent = content.slice(sectionStart);
63
+ const nextSectionIndex = remainingContent.search(/^##\s/m);
64
+ blockingSection = nextSectionIndex === -1 ? remainingContent : remainingContent.slice(0, nextSectionIndex);
65
+ }
66
+ return {
67
+ verdict: "blocked",
68
+ topBlocker: blockingSection.match(/^###\s*(.+)$/m)?.[1]?.trim() ?? ""
69
+ };
70
+ }
71
+ var VERDICT_REPORT_FILENAMES;
72
+ var init_review_verdict_report = __esmMin((() => {
73
+ VERDICT_REPORT_FILENAMES = ["synthesis.md", "review.md"];
74
+ }));
75
+ //#endregion
15
76
  //#region ../../lib/cloister/review-verdict-feedback.ts
16
77
  /**
17
78
  * Delivers durable review-verdict feedback to the work agent. Agent messages
@@ -30,11 +91,11 @@ async function findLatestSynthesis(workspacePath) {
30
91
  const entries = await readdir(reviewRoot, { withFileTypes: true });
31
92
  for (const entry of entries) {
32
93
  if (!entry.isDirectory()) continue;
33
- const synthesisPath = join(reviewRoot, entry.name, "synthesis.md");
34
- if (!existsSync(synthesisPath)) continue;
35
- const fileStat = await stat$1(synthesisPath);
94
+ const report = findVerdictReport(join(reviewRoot, entry.name));
95
+ if (!report) continue;
96
+ const fileStat = await stat$1(report.path);
36
97
  if (!latest || fileStat.mtimeMs > latest.mtimeMs) latest = {
37
- path: synthesisPath,
98
+ path: report.path,
38
99
  mtimeMs: fileStat.mtimeMs
39
100
  };
40
101
  }
@@ -123,15 +184,25 @@ async function deliverReviewVerdictFeedbackPromise(opts) {
123
184
  const target = await resolveIssueFeedbackTarget(issueId, { itemId: opts.slotItemId });
124
185
  if ("agentId" in target) try {
125
186
  let deliveryOutcome;
126
- try {
187
+ let ambiguousRetries = 0;
188
+ for (;;) try {
127
189
  deliveryOutcome = await messageAgent(target.agentId, message, "internal", {
128
190
  owesRework: true,
129
191
  ...dedupKey ? { dedupKey } : {}
130
192
  });
193
+ break;
131
194
  } catch (err) {
132
- if (!(err instanceof Error ? err.message : String(err)).includes("cannot enforce a dedup key")) throw err;
195
+ const reason = err instanceof Error ? err.message : String(err);
196
+ if (err instanceof Error && err.name === "AmbiguousKeyedDeliveryError" && ambiguousRetries < AMBIGUOUS_DELIVERY_RETRIES) {
197
+ ambiguousRetries += 1;
198
+ console.warn(`[review-verdict-feedback] ambiguous keyed delivery to ${target.agentId} — retrying the same key (${ambiguousRetries}/${AMBIGUOUS_DELIVERY_RETRIES}): ${reason}`);
199
+ await new Promise((resolve) => setTimeout(resolve, AMBIGUOUS_DELIVERY_RETRY_MS));
200
+ continue;
201
+ }
202
+ if (!reason.includes("cannot enforce a dedup key")) throw err;
133
203
  console.warn(`[review-verdict-feedback] ${target.agentId} cannot enforce keyed delivery; retrying unkeyed`);
134
204
  deliveryOutcome = await messageAgent(target.agentId, message, "internal", { owesRework: true });
205
+ break;
135
206
  }
136
207
  agentMessageSent = true;
137
208
  let repeatedDeliveryLoop = false;
@@ -181,7 +252,7 @@ async function deliverReviewVerdictFeedbackPromise(opts) {
181
252
  agentMessageSent
182
253
  };
183
254
  }
184
- var execFileAsync, PR_COMMENT_TIMEOUT_MS, suppressedReviewFeedbackDeliveries, REPEATED_DELIVERY_LOOP_MESSAGE, deliverReviewVerdictFeedback;
255
+ var execFileAsync, AMBIGUOUS_DELIVERY_RETRIES, AMBIGUOUS_DELIVERY_RETRY_MS, PR_COMMENT_TIMEOUT_MS, suppressedReviewFeedbackDeliveries, REPEATED_DELIVERY_LOOP_MESSAGE, deliverReviewVerdictFeedback;
185
256
  var init_review_verdict_feedback = __esmMin((() => {
186
257
  init_agents();
187
258
  init_projects();
@@ -189,13 +260,16 @@ var init_review_verdict_feedback = __esmMin((() => {
189
260
  init_types();
190
261
  init_feedback_writer();
191
262
  init_feedback_target();
263
+ init_review_verdict_report();
192
264
  execFileAsync = promisify(execFile);
265
+ AMBIGUOUS_DELIVERY_RETRIES = 3;
266
+ AMBIGUOUS_DELIVERY_RETRY_MS = 2e3;
193
267
  PR_COMMENT_TIMEOUT_MS = 15e3;
194
268
  suppressedReviewFeedbackDeliveries = /* @__PURE__ */ new Map();
195
269
  REPEATED_DELIVERY_LOOP_MESSAGE = "Review feedback for this verdict was already delivered to the agent; the pipeline re-triggered delivery 3+ times — possible stuck loop. Investigate before the agent context burns.";
196
270
  deliverReviewVerdictFeedback = (opts) => Effect.promise(() => deliverReviewVerdictFeedbackPromise(opts));
197
271
  }));
198
272
  //#endregion
199
- export { init_review_verdict_feedback as n, postPrComment as r, deliverReviewVerdictFeedback as t };
273
+ export { findVerdictReportAsync as a, findVerdictReport as i, init_review_verdict_feedback as n, init_review_verdict_report as o, postPrComment as r, parseVerdictReport as s, deliverReviewVerdictFeedback as t };
200
274
 
201
- //# sourceMappingURL=review-verdict-feedback-xJNdqBnX.js.map
275
+ //# sourceMappingURL=review-verdict-feedback-5jWuzgpc.js.map
@@ -1,3 +1,3 @@
1
- import { n as init_review_verdict_feedback, t as deliverReviewVerdictFeedback } from "./review-verdict-feedback-xJNdqBnX.js";
1
+ import { n as init_review_verdict_feedback, t as deliverReviewVerdictFeedback } from "./review-verdict-feedback-5jWuzgpc.js";
2
2
  init_review_verdict_feedback();
3
3
  export { deliverReviewVerdictFeedback };
@@ -1,15 +1,15 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { k as MemoryStatus, t as init_src } from "./src-B948bGVR.js";
3
- import { a as resolveArchiveDir, f as resolveStatusFile, i as init_paths, l as resolveObservationsFile, n as ensureDir, r as ensureParentDir, u as resolvePendingDir } from "./paths-sJBSb7Ul.js";
4
- import { i as init_settings, n as getMemoryRollupPendingThreshold } from "./settings-VN0qOh4U.js";
5
- import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers } from "./providers-BJQSnAAp.js";
2
+ import { k as MemoryStatus, t as init_src } from "./src-BYdwL_n-.js";
3
+ import { a as resolveArchiveDir, f as resolveStatusFile, i as init_paths, l as resolveObservationsFile, n as ensureDir, r as ensureParentDir, u as resolvePendingDir } from "./paths-BUuhi6jM.js";
4
+ import { i as init_settings, n as getMemoryRollupPendingThreshold } from "./settings-E3FnEIUx.js";
5
+ import { i as updateMemoryHealth, n as extractWithProviderPolicy, r as init_health, t as init_providers } from "./providers-ClGPGkQ8.js";
6
6
  import { Result, Schema } from "effect";
7
7
  import { dirname } from "path";
8
8
  import { randomUUID } from "crypto";
9
9
  import { readFile, readdir, rename, unlink, writeFile } from "fs/promises";
10
10
  //#region ../../lib/memory/pending.ts
11
11
  async function writePendingTurn(turn, options = {}) {
12
- const dir = resolvePendingDir(turn.identity.projectId, turn.identity.issueId);
12
+ const dir = resolvePendingDir(turn.identity.projectId, turn.identity.workspaceId);
13
13
  await ensureDir(dir);
14
14
  const existing = await findExistingPendingTurn(dir, turn);
15
15
  if (existing) return existing;
@@ -26,7 +26,7 @@ async function writePendingTurn(turn, options = {}) {
26
26
  }
27
27
  async function maybeTriggerStatusRollup(identity, options = {}) {
28
28
  const threshold = await loadThreshold(options);
29
- const pendingTurns = await readPendingTurns(identity.projectId, identity.issueId);
29
+ const pendingTurns = await readPendingTurns(identity.projectId, identity.workspaceId);
30
30
  const pendingCount = pendingTurns.length;
31
31
  if (pendingCount < threshold) return {
32
32
  status: "below-threshold",
@@ -60,8 +60,8 @@ async function maybeTriggerStatusRollup(identity, options = {}) {
60
60
  inFlightRollups.delete(workspaceKey);
61
61
  }
62
62
  }
63
- async function readPendingTurns(projectId, issueId) {
64
- const dir = resolvePendingDir(projectId, issueId);
63
+ async function readPendingTurns(projectId, workspaceId) {
64
+ const dir = resolvePendingDir(projectId, workspaceId);
65
65
  const files = (await readdir(dir).catch((error) => {
66
66
  if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") return [];
67
67
  throw error;
@@ -98,15 +98,17 @@ async function enqueueStatusRollupEvent(job) {
98
98
  await configuredStatusRollupProcessor(job);
99
99
  return;
100
100
  }
101
- const { initEventStore } = await import("./event-store-5UKzh9Jf.js");
102
- const { synthesizeStatusRollup, commitStatusRollup } = await import("./rollup-BR4t_wck.js");
103
- await (await initEventStore()).appendAsync({
101
+ const { initEventStore } = await import("./event-store-COd2tOx8.js");
102
+ const { synthesizeStatusRollup, commitStatusRollup } = await import("./rollup-CZB4UL9q.js");
103
+ const store = await initEventStore();
104
+ const eventIssueId = job.identity.issueId ?? job.identity.workspaceId;
105
+ await store.appendAsync({
104
106
  type: "memory.rollup_triggered",
105
107
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
106
108
  payload: {
107
109
  projectId: job.identity.projectId,
108
110
  workspaceId: job.identity.workspaceId,
109
- issueId: job.identity.issueId,
111
+ issueId: eventIssueId,
110
112
  pendingCount: job.pendingTurns.length,
111
113
  turnIds: job.pendingTurns.map((turn) => turn.id),
112
114
  threshold: job.threshold
@@ -115,7 +117,7 @@ async function enqueueStatusRollupEvent(job) {
115
117
  const identity = job.pendingTurns[0]?.identity;
116
118
  const result = await synthesizeStatusRollup({
117
119
  projectId: job.identity.projectId,
118
- issueId: job.identity.issueId,
120
+ workspaceId: job.identity.workspaceId,
119
121
  pendingTurns: job.pendingTurns,
120
122
  identity
121
123
  });
@@ -155,8 +157,8 @@ async function synthesizeStatusRollup(input) {
155
157
  status: "dropped",
156
158
  reason: "missing-identity"
157
159
  };
158
- const observations = input.observations ?? await readRecentObservations(input.projectId, input.issueId, 20);
159
- const archivedStatuses = input.archivedStatuses ?? await readArchivedStatuses(input.projectId, input.issueId, 3);
160
+ const observations = input.observations ?? await readRecentObservations(input.projectId, input.workspaceId, 20);
161
+ const archivedStatuses = input.archivedStatuses ?? await readArchivedStatuses(input.projectId, input.workspaceId, 3);
160
162
  const prompt = buildStatusRollupPrompt({
161
163
  pendingTurns: input.pendingTurns,
162
164
  observations,
@@ -189,27 +191,28 @@ async function synthesizeStatusRollup(input) {
189
191
  };
190
192
  }
191
193
  async function commitStatusRollup(input) {
192
- const { projectId, workspaceId, issueId } = input.identity;
193
- const statusPath = resolveStatusFile(projectId, issueId);
194
- const previousStatus = await readCurrentStatus(projectId, issueId);
194
+ const { projectId, workspaceId } = input.identity;
195
+ const statusPath = resolveStatusFile(projectId, workspaceId);
196
+ const previousStatus = await readCurrentStatus(projectId, workspaceId);
195
197
  let archivedPath;
196
198
  if (previousStatus) {
197
- archivedPath = await archiveStatus(projectId, issueId, previousStatus, input.now ?? /* @__PURE__ */ new Date());
198
- await pruneArchivedStatuses(projectId, issueId, 3);
199
+ archivedPath = await archiveStatus(projectId, workspaceId, previousStatus, input.now ?? /* @__PURE__ */ new Date());
200
+ await pruneArchivedStatuses(projectId, workspaceId, 3);
199
201
  }
200
202
  if (input.failAfterArchive) throw new Error("Injected rollup archive failure");
201
203
  await writeJsonAtomically(statusPath, input.status);
202
204
  if (input.failAfterStatusWrite) throw new Error("Injected rollup status write failure");
205
+ const eventIssueId = input.identity.issueId ?? workspaceId;
203
206
  await (input.emitStatusUpdated ?? emitStatusUpdatedEvent)({
204
207
  identity: {
205
208
  projectId,
206
209
  workspaceId,
207
- issueId
210
+ issueId: eventIssueId
208
211
  },
209
212
  status: input.status,
210
213
  previousStatus
211
214
  });
212
- const clearedPending = await clearPendingTurns(projectId, issueId, input.pendingTurns);
215
+ const clearedPending = await clearPendingTurns(projectId, workspaceId, input.pendingTurns);
213
216
  return {
214
217
  previousStatus,
215
218
  archivedPath,
@@ -217,9 +220,9 @@ async function commitStatusRollup(input) {
217
220
  clearedPending
218
221
  };
219
222
  }
220
- async function readCurrentStatus(projectId, issueId) {
223
+ async function readCurrentStatus(projectId, workspaceId) {
221
224
  try {
222
- return JSON.parse(await readFile(resolveStatusFile(projectId, issueId), "utf8"));
225
+ return JSON.parse(await readFile(resolveStatusFile(projectId, workspaceId), "utf8"));
223
226
  } catch (error) {
224
227
  if (isEnoent(error)) return void 0;
225
228
  throw error;
@@ -237,51 +240,82 @@ function buildStatusRollupPrompt(input) {
237
240
  `New pending turns:\n${renderPendingTurns(input.pendingTurns)}`
238
241
  ].join("\n\n");
239
242
  }
240
- async function readRecentObservations(projectId, issueId, limit = 20) {
241
- const observationsDir = dirname(resolveObservationsFile(projectId, issueId, /* @__PURE__ */ new Date()));
243
+ async function readRecentObservations(projectId, workspaceId, limit = 20) {
244
+ return readObservationsSince(projectId, workspaceId, { limit });
245
+ }
246
+ /**
247
+ * The `limit` most recent observations within an optional day window, returned
248
+ * oldest-first — the reader behind `pan memory timeline` (PAN-3286 FR-8).
249
+ * Observation files are one JSONL per UTC day, so the window prunes whole
250
+ * files by name before any read.
251
+ */
252
+ async function readObservationsSince(projectId, workspaceId, options = {}) {
253
+ const limit = options.limit ?? 20;
254
+ const now = options.now ?? /* @__PURE__ */ new Date();
255
+ const cutoffDate = options.days === void 0 ? null : (/* @__PURE__ */ new Date(now.getTime() - (Math.max(1, Math.floor(options.days)) - 1) * 864e5)).toISOString().slice(0, 10);
256
+ const observationsDir = dirname(resolveObservationsFile(projectId, workspaceId, now));
242
257
  const files = (await readdir(observationsDir).catch((error) => {
243
258
  if (isEnoent(error)) return [];
244
259
  throw error;
245
- })).filter((file) => file.endsWith(".jsonl")).sort().reverse();
260
+ })).filter((file) => file.endsWith(".jsonl")).filter((file) => cutoffDate === null || file.slice(0, 10) >= cutoffDate).sort().reverse();
246
261
  const observations = [];
247
262
  for (const file of files) {
248
263
  const lines = (await readFile(`${observationsDir}/${file}`, "utf8")).trimEnd().split("\n");
249
264
  for (let index = lines.length - 1; index >= 0 && observations.length < limit; index -= 1) {
250
265
  const line = lines[index];
251
266
  if (!line || line.trim().length === 0) continue;
252
- observations.push(JSON.parse(line));
267
+ const observation = JSON.parse(line);
268
+ if (cutoffDate !== null && observation.timestamp.slice(0, 10) < cutoffDate) continue;
269
+ observations.push(observation);
253
270
  }
254
271
  if (observations.length >= limit) break;
255
272
  }
256
273
  return observations.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
257
274
  }
258
- async function readArchivedStatuses(projectId, issueId, limit = 3) {
259
- const archiveDir = resolveArchiveDir(projectId, issueId);
275
+ async function readArchivedStatuses(projectId, workspaceId, limit = 3) {
276
+ return (await readArchivedStatusEntries(projectId, workspaceId, limit)).map((entry) => entry.status).reverse();
277
+ }
278
+ /**
279
+ * Archived statuses newest-first, each paired with the timestamp encoded in
280
+ * its filename — the recall surface behind `pan memory status --history`
281
+ * (PAN-3286 FR-6). Note that `commitStatusRollup` prunes the archive to the
282
+ * three most recent entries, so a larger limit returns whatever is retained.
283
+ */
284
+ async function readArchivedStatusEntries(projectId, workspaceId, limit = 3) {
285
+ const archiveDir = resolveArchiveDir(projectId, workspaceId);
260
286
  const files = (await readdir(archiveDir).catch((error) => {
261
287
  if (isEnoent(error)) return [];
262
288
  throw error;
263
- })).filter((file) => file.endsWith(".json")).sort().slice(-limit);
264
- const statuses = [];
265
- for (const file of files) statuses.push(JSON.parse(await readFile(`${archiveDir}/${file}`, "utf8")));
266
- return statuses;
289
+ })).filter((file) => file.endsWith(".json")).sort().slice(-limit).reverse();
290
+ const entries = [];
291
+ for (const file of files) {
292
+ const path = `${archiveDir}/${file}`;
293
+ const match = ARCHIVE_FILENAME_TIMESTAMP.exec(file);
294
+ entries.push({
295
+ archivedAt: match ? `${match[1]}T${match[2]}:${match[3]}:${match[4]}.${match[5]}Z` : null,
296
+ path,
297
+ status: JSON.parse(await readFile(path, "utf8"))
298
+ });
299
+ }
300
+ return entries;
267
301
  }
268
- async function archiveStatus(projectId, issueId, status, now) {
269
- const archiveDir = resolveArchiveDir(projectId, issueId);
302
+ async function archiveStatus(projectId, workspaceId, status, now) {
303
+ const archiveDir = resolveArchiveDir(projectId, workspaceId);
270
304
  await ensureDir(archiveDir);
271
305
  const path = `${archiveDir}/${now.toISOString().replace(/[:.]/g, "-")}_${slugify(status.name)}_${randomUUID()}.json`;
272
306
  await writeJsonAtomically(path, status);
273
307
  return path;
274
308
  }
275
- async function pruneArchivedStatuses(projectId, issueId, keep) {
276
- const archiveDir = resolveArchiveDir(projectId, issueId);
309
+ async function pruneArchivedStatuses(projectId, workspaceId, keep) {
310
+ const archiveDir = resolveArchiveDir(projectId, workspaceId);
277
311
  const files = (await readdir(archiveDir).catch((error) => {
278
312
  if (isEnoent(error)) return [];
279
313
  throw error;
280
314
  })).filter((file) => file.endsWith(".json")).sort();
281
315
  await Promise.all(files.slice(0, Math.max(0, files.length - keep)).map((file) => unlink(`${archiveDir}/${file}`)));
282
316
  }
283
- async function clearPendingTurns(projectId, issueId, pendingTurns) {
284
- const pendingDir = resolvePendingDir(projectId, issueId);
317
+ async function clearPendingTurns(projectId, workspaceId, pendingTurns) {
318
+ const pendingDir = resolvePendingDir(projectId, workspaceId);
285
319
  const cleared = [];
286
320
  for (const turn of pendingTurns) {
287
321
  const path = `${pendingDir}/${pendingTurnFileName(turn)}`;
@@ -295,7 +329,7 @@ async function clearPendingTurns(projectId, issueId, pendingTurns) {
295
329
  return cleared;
296
330
  }
297
331
  async function emitStatusUpdatedEvent(event) {
298
- const { initEventStore } = await import("./event-store-5UKzh9Jf.js");
332
+ const { initEventStore } = await import("./event-store-COd2tOx8.js");
299
333
  await (await initEventStore()).appendAsync({
300
334
  type: "memory.status_updated",
301
335
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -374,7 +408,7 @@ function truncateText(value, maxChars) {
374
408
  function isEnoent(error) {
375
409
  return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
376
410
  }
377
- var STATUS_RESPONSE_JSON_SCHEMA, PENDING_TURN_PROMPT_BUDGET_CHARS, PENDING_TURN_TEXT_BUDGET_CHARS;
411
+ var STATUS_RESPONSE_JSON_SCHEMA, ARCHIVE_FILENAME_TIMESTAMP, PENDING_TURN_PROMPT_BUDGET_CHARS, PENDING_TURN_TEXT_BUDGET_CHARS;
378
412
  var init_rollup = __esmMin((() => {
379
413
  init_src();
380
414
  init_providers();
@@ -440,10 +474,11 @@ var init_rollup = __esmMin((() => {
440
474
  }
441
475
  }
442
476
  };
477
+ ARCHIVE_FILENAME_TIMESTAMP = /^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})-(\d{3})Z_/;
443
478
  PENDING_TURN_PROMPT_BUDGET_CHARS = 12e3;
444
479
  PENDING_TURN_TEXT_BUDGET_CHARS = 2e3;
445
480
  }));
446
481
  //#endregion
447
- export { readCurrentStatus as a, init_pending as c, readArchivedStatuses as i, maybeTriggerStatusRollup as l, commitStatusRollup as n, readRecentObservations as o, init_rollup as r, synthesizeStatusRollup as s, buildStatusRollupPrompt as t, writePendingTurn as u };
482
+ export { readArchivedStatuses as a, readRecentObservations as c, maybeTriggerStatusRollup as d, writePendingTurn as f, readArchivedStatusEntries as i, synthesizeStatusRollup as l, commitStatusRollup as n, readCurrentStatus as o, init_rollup as r, readObservationsSince as s, buildStatusRollupPrompt as t, init_pending as u };
448
483
 
449
- //# sourceMappingURL=rollup-BQaol5TX.js.map
484
+ //# sourceMappingURL=rollup-BGIrCEkU.js.map
@@ -0,0 +1,3 @@
1
+ import { l as synthesizeStatusRollup, n as commitStatusRollup, r as init_rollup } from "./rollup-BGIrCEkU.js";
2
+ init_rollup();
3
+ export { commitStatusRollup, synthesizeStatusRollup };
@@ -1,9 +1,9 @@
1
- import { B as getProviderEnvSync, Fr as init_errors, Gn as init_projects, H as init_providers, Tr as FsError, V as getProviderForModelSync, Yn as listProjectsSync, a as getConversationsConfigSync, f as loadConfigSync, it as getModelCapabilitySync, li as init_paths, lt as resolveModelIdSync, pi as sessionFilePath, st as init_model_capabilities, t as init_config_yaml, ti as encodeClaudeProjectDir, wr as ConfigError } from "./config-yaml-CxdwhAIA.js";
2
- import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-BDQDRopn.js";
3
- import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-DpgYmYqR.js";
4
- import { Ct as searchFtsSessions, Et as upsertDiscoveredSession, St as markEnrichmentFailed, Tt as updateEnrichment, bt as insertEmbedding, ct as countDiscoveredSessions, dt as findDiscoveredSessionIds, ft as findDiscoveredSessions, ht as getDiscoveredSessionByJsonlPath, lt as countFtsSessions, mt as getDiscoveredSessionById, pt as findEnrichedSessionIdsMissingEmbedding, st as buildFilterSql, ut as ensureDiscoveredSessionsSchema, vt as getEmbedding, wt as topKCosine, xt as loadEmbeddings, yt as init_discovered_sessions } from "./conversations-D0UEdLtk.js";
5
- import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-D5km80UI.js";
6
- import { n as recordBackgroundAiCost, t as init_cost$1 } from "./cost-DS1s0DbG.js";
1
+ import { Ar as FsError, Vr as init_errors, Xn as getProviderForModelSync, Yn as getProviderEnvSync, Zn as init_providers, _r as init_model_capabilities, a as getConversationsConfigSync, cn as init_projects, f as loadConfigSync, fn as listProjectsSync, hi as init_paths, kr as ConfigError, mr as getModelCapabilitySync, si as encodeClaudeProjectDir, t as init_config_yaml, yi as sessionFilePath, yr as resolveModelIdSync } from "./config-yaml-BSCqwmX0.js";
2
+ import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CTrmVqc_.js";
3
+ import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-CpFDrJUS.js";
4
+ import { Ct as searchFtsSessions, Et as upsertDiscoveredSession, St as markEnrichmentFailed, Tt as updateEnrichment, bt as insertEmbedding, ct as countDiscoveredSessions, dt as findDiscoveredSessionIds, ft as findDiscoveredSessions, ht as getDiscoveredSessionByJsonlPath, lt as countFtsSessions, mt as getDiscoveredSessionById, pt as findEnrichedSessionIdsMissingEmbedding, st as buildFilterSql, ut as ensureDiscoveredSessionsSchema, vt as getEmbedding, wt as topKCosine, xt as loadEmbeddings, yt as init_discovered_sessions } from "./conversations-B4rxz-Wl.js";
5
+ import { n as isBackgroundFeatureEnabled, t as init_features } from "./features-CC47YcCX.js";
6
+ import { n as recordBackgroundAiCost, t as init_cost$1 } from "./cost-KLuwKCW9.js";
7
7
  import { Data, Duration, Effect, FileSystem } from "effect";
8
8
  import { createReadStream, promises } from "fs";
9
9
  import { basename, join, relative, resolve } from "path";
@@ -522,7 +522,10 @@ const MODEL_PROVIDERS = {
522
522
  "qwen3-coder-plus": "dashscope",
523
523
  "qwen3-plus": "dashscope",
524
524
  "qwen3.7-max": "dashscope",
525
- "grok-build-0.1": "xai"
525
+ "grok-build-0.1": "xai",
526
+ "ql-reason-70b": "quantumllama",
527
+ "ql-swift-8b": "quantumllama",
528
+ "ql-nano-1b": "quantumllama"
526
529
  };
527
530
  /**
528
531
  * Fallback mapping: non-Anthropic model → Anthropic equivalent
@@ -579,7 +582,10 @@ const FALLBACK_MAP = {
579
582
  "qwen3-coder-plus": "claude-sonnet-5",
580
583
  "qwen3-plus": "claude-haiku-4-5",
581
584
  "qwen3.7-max": "claude-sonnet-5",
582
- "grok-build-0.1": "claude-sonnet-5"
585
+ "grok-build-0.1": "claude-sonnet-5",
586
+ "ql-reason-70b": "claude-sonnet-5",
587
+ "ql-swift-8b": "claude-haiku-4-5",
588
+ "ql-nano-1b": "claude-haiku-4-5"
583
589
  };
584
590
  /**
585
591
  * Default fallback when model not in explicit mapping
@@ -637,6 +643,7 @@ function getModelProviderSync(modelId) {
637
643
  if (modelId.toLowerCase().startsWith("minimax")) return "minimax";
638
644
  if (modelId.startsWith("mimo-")) return "mimo";
639
645
  if (modelId.startsWith("grok-")) return "xai";
646
+ if (modelId.startsWith("ql-")) return "quantumllama";
640
647
  return "anthropic";
641
648
  }
642
649
  /**
@@ -3029,4 +3036,4 @@ function normalizeDir(dir) {
3029
3036
  //#endregion
3030
3037
  export { enrichSessions as a, searchSessions as c, CostThresholdError as i, embed as l, getSessionsFeedFacets as n, embedSessions as o, listSessionsFeed as r, parseRelativeTime as s, scan as t };
3031
3038
 
3032
- //# sourceMappingURL=scanner-C-D2cFdX.js.map
3039
+ //# sourceMappingURL=scanner-DydjXPrz.js.map