@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
@@ -1,20 +1,20 @@
1
- import { Fr as init_errors, Gn as init_projects, Mr as TmuxError, Tr as FsError, ar as resolveProjectFromIssueSync, ci as getOverdeckHome, di as packageRoot, gr as init_issue_id, hr as extractPrefixSync, li as init_paths, ti as encodeClaudeProjectDir } from "./config-yaml-CxdwhAIA.js";
2
- import { O as killSessionSync, U as sessionExistsSync, a as capturePaneSync, i as capturePane, j as listPaneValuesSync, u as detectTerminalApiErrorSync, w as init_tmux, z as sendKeys } from "./tmux-CfDHob9M.js";
3
- import { c as getRuntimeBehavior, i as CLAUDE_CODE_BEHAVIOR } from "./src-B948bGVR.js";
4
- import { d as getReviewStatusSync, p as init_review_status } from "./review-status-CGvlA4o_.js";
5
- import { r as logDeaconEventSync, t as init_persistent_logger } from "./persistent-logger-H_VjuOu7.js";
6
- import { $n as getAgentDir, Br as saveAgentRuntimeState, Cn as materializeAcpContextFile, G as resumeAgent, Ht as BRIDGE_TOKEN_HEADER, Lr as getAgentRuntimeState, On as determineModel, Rr as getAgentRuntimeStateSync, Sn as init_context, Ut as init_bridge_token, X as messageAgent, _r as saveAgentStateSync, a as listRunningAgentsSync, at as init_activity, b as init_agents, ct as init_ohmypi, dr as markAgentTroubled, n as init_queries, r as listAgentStates, rr as getAgentStateSync, rt as getLatestSessionIdSync, st as createOhmypiRuntimeSync, ut as spawnAgent, vn as init_pi_fifo } from "./queries-C-MUZaIy.js";
7
- import { t as init_behavior } from "./behavior-td6-xhQk.js";
8
- import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-BcPMElRB.js";
9
- import { m as readWorkspacePlanSync, o as init_io } from "./io-B00PBNku.js";
10
- import { C as init_launcher_generator } from "./auto-spawn-consent-CQ9Bi9q6.js";
11
- import { _ as tmuxKillSession, g as tmuxCreateSession, h as init_tmux_cli, i as createCodexRuntimeSync, l as init_codex, v as tmuxSessionExists } from "./codex-BzGDW_d3.js";
12
- import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-BSpiXaLw.js";
13
- import { c as init_control_settings, i as getFlywheelActiveRunId, p as isFlywheelGloballyPaused } from "./control-settings-CiqGxXnc.js";
14
- import { l as init_dag, o as getDispatchableItems } from "./dag-BtkgLeqY.js";
15
- import { a as loadCloisterConfigSync, r as init_config, t as DEFAULT_CLOISTER_CONFIG } from "./config-Bi3u1VK7.js";
16
- import { a as init_jsonl_parser, i as getSessionFilesSync, r as getProjectDirsSync, s as parseClaudeSessionSync } from "./jsonl-parser-BDpnGFCl.js";
17
- import { t as recordRecoveryFailure } from "./recovery-trip-DDH-02ng.js";
1
+ import { Vr as init_errors, _i as packageRoot, hi as init_paths, mi as getOverdeckHome } from "./config-yaml-BSCqwmX0.js";
2
+ import { A as listPaneValuesSync, C as init_tmux, D as killSessionSync, H as sessionExistsSync, R as sendKeys, i as capturePaneSync, l as detectTerminalApiErrorSync } from "./tmux-CImZaX4q.js";
3
+ import { c as getRuntimeBehavior, i as CLAUDE_CODE_BEHAVIOR } from "./src-BYdwL_n-.js";
4
+ import { d as getReviewStatusSync, p as init_review_status } from "./review-status-CKLk5aZ-.js";
5
+ import { r as logDeaconEventSync, t as init_persistent_logger } from "./persistent-logger-s8cbpFNV.js";
6
+ import { Bn as materializeAcpContextFile, Ct as init_ohmypi, Fn as init_pi_fifo, Gn as determineModel, K as countPendingAskUserQuestionsForAgent, Or as markAgentTroubled, Pr as saveAgentStateSync, St as createOhmypiRuntimeSync, Tt as spawnAgent, Z as init_agent_enrichment, a as listRunningAgentsSync, an as init_bridge_token, b as init_agents, br as getAgentStateSync, ft as messageAgent, gr as getAgentDir, in as BRIDGE_TOKEN_HEADER, n as init_queries, r as listAgentStates, ri as saveAgentRuntimeState, st as resumeAgent, ti as getAgentRuntimeStateSync, zn as init_context } from "./queries-DVpl1vsU.js";
7
+ import { t as init_behavior } from "./behavior-DIMQMRzs.js";
8
+ import { h as readWorkspacePlanSync, s as init_io } from "./io-mxOWMZ7I.js";
9
+ import { w as init_launcher_generator } from "./auto-spawn-consent-lXqRJ1Dr.js";
10
+ import { _ as tmuxKillSession, g as tmuxCreateSession, h as init_tmux_cli, i as createCodexRuntimeSync, l as init_codex, v as tmuxSessionExists } from "./codex-CjkD1PJu.js";
11
+ import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-BHxWf_sX.js";
12
+ import { c as init_control_settings, i as getFlywheelActiveRunId, p as isFlywheelGloballyPaused } from "./control-settings-DVf6pKyv.js";
13
+ import { l as init_dag, o as getDispatchableItems } from "./dag-BYiFMqpU.js";
14
+ import { a as loadCloisterConfigSync, r as init_config, t as DEFAULT_CLOISTER_CONFIG } from "./config-DvM8jtQK.js";
15
+ import { a as init_jsonl_parser, i as getSessionFilesSync, r as getProjectDirsSync, s as parseClaudeSessionSync } from "./jsonl-parser-CgYWQ20q.js";
16
+ import { i as createKimiCodeRuntimeSync, l as init_kimi_code } from "./kimi-code-BYbme0aV.js";
17
+ import { i as recordRecoveryFailure, r as init_recovery_trip } from "./recovery-trip-CSNWSLDn.js";
18
18
  import { join } from "node:path";
19
19
  import { Effect } from "effect";
20
20
  import { existsSync, mkdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from "fs";
@@ -22,729 +22,21 @@ import { join as join$1 } from "path";
22
22
  import { homedir } from "os";
23
23
  import "node:os";
24
24
  import { existsSync as existsSync$1, readFileSync as readFileSync$1, rmSync as rmSync$1, statSync as statSync$1 } from "node:fs";
25
- import { readFile, readdir, stat as stat$1 } from "fs/promises";
26
25
  import { exec } from "node:child_process";
27
26
  import { promisify } from "node:util";
28
- import { exec as exec$1 } from "child_process";
29
- import { promisify as promisify$1 } from "util";
30
27
  import "node:crypto";
31
28
  import { request } from "node:http";
32
- //#region ../../lib/agent-input-detection.ts
29
+ //#region ../../lib/runtimes/claude-code.ts
33
30
  init_paths();
34
- init_issue_id();
35
- init_projects();
36
31
  init_persistent_logger();
37
- init_behavior();
38
32
  init_review_status();
39
33
  init_io();
40
- init_tmux_cli();
41
34
  init_harness_binary();
42
- init_codex();
43
35
  init_launcher_generator();
44
36
  init_bridge_token();
45
- init_ohmypi();
46
- init_activity();
47
- init_agents();
48
- init_queries();
49
- init_tmux();
50
- init_errors();
51
- const ANSI_PATTERN = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
52
- const MAX_PROMPT_CHARS = 2e3;
53
- const PANE_DETECTION_CACHE_TTL_MS = 1e4;
54
- const MAX_PANE_DETECTION_CACHE_ENTRIES = 256;
55
- const MAX_CONCURRENT_PANE_DETECTIONS = 4;
56
- const MAX_MENU_FOOTER_LINES = 4;
57
- const paneDetectionCache = /* @__PURE__ */ new Map();
58
- const paneDetectionInFlight = /* @__PURE__ */ new Map();
59
- const paneDetectionWaiters = [];
60
- let activePaneDetections = 0;
61
- function getPaneDetectionCacheKey(agentId, options) {
62
- return `${agentId}:${options.isPlanning === true ? "planning" : "agent"}:${options.lines ?? 90}`;
63
- }
64
- function sweepPaneDetectionCache(now = Date.now()) {
65
- for (const [key, entry] of paneDetectionCache) if (entry.expiresAt <= now) paneDetectionCache.delete(key);
66
- while (paneDetectionCache.size > MAX_PANE_DETECTION_CACHE_ENTRIES) {
67
- const oldestKey = paneDetectionCache.keys().next().value;
68
- if (!oldestKey) break;
69
- paneDetectionCache.delete(oldestKey);
70
- }
71
- }
72
- async function withPaneDetectionSlot(fn) {
73
- if (activePaneDetections >= MAX_CONCURRENT_PANE_DETECTIONS) await new Promise((resolve) => paneDetectionWaiters.push(resolve));
74
- activePaneDetections += 1;
75
- try {
76
- return await fn();
77
- } finally {
78
- activePaneDetections = Math.max(0, activePaneDetections - 1);
79
- paneDetectionWaiters.shift()?.();
80
- }
81
- }
82
- function cleanPaneLine(line) {
83
- return line.replace(ANSI_PATTERN, "").replace(/[\x00-\x1f\x7f]/g, "").replace(/\s+$/g, "");
84
- }
85
- function compactPrompt(prompt) {
86
- const compact = prompt.split("\n").map((line) => line.trim()).filter(Boolean).join("\n").trim();
87
- if (compact.length <= MAX_PROMPT_CHARS) return compact;
88
- return `${compact.slice(0, MAX_PROMPT_CHARS - 1)}…`;
89
- }
90
- function normalizeAwaitingInputPrompt(prompt) {
91
- return compactPrompt(prompt);
92
- }
93
- function snippetAround(lines, index, before = 8, after = 4) {
94
- const start = Math.max(0, index - before);
95
- const end = Math.min(lines.length, index + after + 1);
96
- return compactPrompt(lines.slice(start, end).join("\n"));
97
- }
98
- function lastIndexMatching(lines, predicate) {
99
- for (let i = lines.length - 1; i >= 0; i -= 1) if (predicate(lines[i], i)) return i;
100
- return -1;
101
- }
102
- function isRecentPromptIndex(lines, index) {
103
- if (index < 0) return false;
104
- return lines.length - index <= 25;
105
- }
106
- function isCurrentPromptIndex(lines, index, maxTrailingLines = 0) {
107
- if (index < 0) return false;
108
- return lines.length - index <= maxTrailingLines + 1;
109
- }
110
- /**
111
- * PAN-3068 — a harness footer hint line: key/action pairs separated by "·",
112
- * e.g. "Esc to cancel · Tab to amend · ctrl+e to explain". Every segment must
113
- * open with a key name, so real post-answer output ("● Bash(git status)") never
114
- * qualifies.
115
- */
116
- function looksLikeHarnessFooterHint(line) {
117
- const segments = line.split("·").map((segment) => segment.trim()).filter(Boolean);
118
- if (segments.length === 0) return false;
119
- return segments.every((segment) => /^(?:esc(?:ape)?|tab|enter|return|space|backspace|shift\+\S+|ctrl\+\S+|alt\+\S+|\?)\b/i.test(segment) || /^press\s+\S+/i.test(segment));
120
- }
121
- /**
122
- * PAN-3068 — the permission menu is still on screen when nothing but harness
123
- * footer chrome follows its final option. Claude Code renders "Esc to cancel ·
124
- * Tab to amend · ctrl+e to explain" below "3. No", so the old rule (the option
125
- * must be the literal last pane line) meant Claude permission prompts were
126
- * *never* detected — agents froze on a permission gate while the dashboard
127
- * reported them healthy and working. Real output below the menu means the
128
- * prompt was answered and scrolled, so it still clears.
129
- */
130
- function isPermissionMenuStillOnScreen(lines, menuEndIndex) {
131
- if (menuEndIndex < 0) return false;
132
- const trailing = lines.slice(menuEndIndex + 1);
133
- if (trailing.length > MAX_MENU_FOOTER_LINES) return false;
134
- return trailing.every(looksLikeHarnessFooterHint);
135
- }
136
- function findPermissionMenuEndIndex(lines, menuStartIndex) {
137
- if (menuStartIndex < 0) return -1;
138
- const end = Math.min(lines.length, menuStartIndex + 8);
139
- for (let i = menuStartIndex; i < end; i += 1) if (/\s*3\.\s*No\b/i.test(lines[i])) return i;
140
- return menuStartIndex;
141
- }
142
- function looksLikeClaudePermissionMenu(text) {
143
- return /(?:^|\n)\s*❯?\s*1\.\s*Yes\b/i.test(text) && /(?:^|\n)\s*2\.\s*Yes,?\s*(?:and\s*)?(?:allow|don't ask|always)/i.test(text) && /(?:^|\n)\s*3\.\s*No\b/i.test(text);
144
- }
145
- function looksLikePermissionText(text) {
146
- return /permission|allow(?:\s+this)?|tool use|bash command|mcp tool|do you want to proceed|do you want to continue/i.test(text);
147
- }
148
- function looksLikeGenericConfirmation(line) {
149
- return /(?:\?|:)\s*(?:\[[Yy]\/[Nn]\]|\[[Nn]\/[Yy]\]|\([Yy]\/[Nn]\)|\([Nn]\/[Yy]\)|\[y\/N\]|\[Y\/n\])\s*$/i.test(line) || /\b(?:continue|proceed|confirm|approve|allow|run|execute|overwrite|delete|remove)\b.*(?:\[[Yy]\/[Nn]\]|\([Yy]\/[Nn]\)|\[y\/N\]|\[Y\/n\])/i.test(line);
150
- }
151
- function looksLikePiPermission(text) {
152
- return /(?:permission|approval|approve|allow).{0,80}(?:required|request|prompt|action|command)/i.test(text) || /(?:allow|approve|run|execute)\s+(?:this\s+)?(?:command|tool|action)/i.test(text);
153
- }
154
- function looksLikePlanningDone(text) {
155
- return /planning finalized\s*[—-]\s*click done/i.test(text) || /click Done in the dashboard/i.test(text) || /planning (?:is )?complete.{0,120}(?:click|press|select) Done/i.test(text);
156
- }
157
- /**
158
- * PAN-1520 (covers #1197) — Claude Code session-resume dialog. Fires when an
159
- * agent is resumed via `claude --resume <session>` and a prior session is
160
- * still considered active or interrupted. The dialog blocks tool execution
161
- * until acknowledged. Conservative patterns — we want false-negatives over
162
- * false-positives, so we only match strings that clearly indicate a resume
163
- * choice point.
164
- */
165
- function looksLikeSessionResumeDialog(text) {
166
- return /this session (?:is|was)\s+(?:still\s+)?(?:active|interrupted|running)/i.test(text) || /resume (?:the\s+)?previous session/i.test(text) || /(?:continue|resume) (?:this\s+)?session\??.{0,40}(?:\[[Yy]\/[Nn]\]|\([Yy]\/[Nn]\)|press\s+enter)/i.test(text) || /press enter to (?:continue|resume)/i.test(text);
167
- }
168
- /**
169
- * PAN-1834 — Codex/gpt-5.5 rate-limit / model-switch modal. The harness shows a
170
- * choice between keeping the current model and switching to an alternative.
171
- * To avoid matching prose that merely mentions rate limits, require BOTH option
172
- * lines to be present near the bottom of the pane.
173
- */
174
- function looksLikeRateLimitModelSwitchModal(text) {
175
- return /keep current model/i.test(text) && /switch to\s+\S+/i.test(text);
176
- }
177
- /**
178
- * PAN-1690 — Codex TUI approval prompt header. Codex asks for approval with a
179
- * distinctive "Would you like to …?" prompt box (command run, edits, network/
180
- * host grants) followed by a numbered Yes/…/No menu. Unlike Claude's menu,
181
- * Codex renders option descriptions and a footer hint *below* "3. No", so the
182
- * trailing-line heuristics the Claude path relies on never fire — we key on the
183
- * header instead. Verb list pulled from the codex binary; see PAN-1690.
184
- */
185
- function looksLikeCodexApprovalHeader(line) {
186
- return /Would you like to (?:run the following command|grant these permissions?|make the following edits|allow|apply)\b/i.test(line);
187
- }
188
- function detectAwaitingInputFromPaneSync(pane, options = {}) {
189
- const lines = pane.split("\n").map(cleanPaneLine).filter((line) => line.trim().length > 0);
190
- if (lines.length === 0) return null;
191
- const recentText = lines.slice(-45).join("\n");
192
- if (looksLikeClaudePermissionMenu(recentText) && looksLikePermissionText(recentText)) {
193
- const menuIndex = lastIndexMatching(lines, (line) => /❯?\s*1\.\s*Yes\b/i.test(line));
194
- const menuEndIndex = findPermissionMenuEndIndex(lines, menuIndex);
195
- if (isRecentPromptIndex(lines, menuIndex) && isPermissionMenuStillOnScreen(lines, menuEndIndex)) return {
196
- reason: "tool_permission",
197
- prompt: snippetAround(lines, menuIndex, 10, 3)
198
- };
199
- }
200
- const codexHeaderIndex = lastIndexMatching(lines, looksLikeCodexApprovalHeader);
201
- if (codexHeaderIndex >= 0 && isRecentPromptIndex(lines, codexHeaderIndex)) {
202
- const optionIndex = lastIndexMatching(lines, (line) => /^[^\w]*1\.\s*Yes\b/i.test(line));
203
- if (optionIndex > codexHeaderIndex && lines.length - optionIndex <= 12) return {
204
- reason: "tool_permission",
205
- prompt: snippetAround(lines, codexHeaderIndex, 1, 14)
206
- };
207
- }
208
- const piIndex = lastIndexMatching(lines, (line) => looksLikePiPermission(line) || looksLikeGenericConfirmation(line));
209
- if (isRecentPromptIndex(lines, piIndex) && isCurrentPromptIndex(lines, piIndex)) {
210
- const snippet = snippetAround(lines, piIndex, 6, 2);
211
- return {
212
- reason: looksLikeGenericConfirmation(lines[piIndex]) ? "confirmation" : "tool_permission",
213
- prompt: snippet
214
- };
215
- }
216
- if (options.isPlanning && looksLikePlanningDone(recentText)) {
217
- const doneIndex = lastIndexMatching(lines, (line) => /done|planning/i.test(line));
218
- return {
219
- reason: "planning_done",
220
- prompt: snippetAround(lines, doneIndex >= 0 ? doneIndex : lines.length - 1, 8, 2)
221
- };
222
- }
223
- if (looksLikeSessionResumeDialog(recentText)) {
224
- const resumeIndex = lastIndexMatching(lines, (line) => looksLikeSessionResumeDialog(line));
225
- return {
226
- reason: "session_resume",
227
- prompt: snippetAround(lines, resumeIndex >= 0 ? resumeIndex : lines.length - 1, 8, 2)
228
- };
229
- }
230
- if (looksLikeRateLimitModelSwitchModal(recentText)) {
231
- const rateLimitIndex = lastIndexMatching(lines, (line) => /keep current model|switch to\s+\S+/i.test(line));
232
- if (isRecentPromptIndex(lines, rateLimitIndex)) return {
233
- reason: "rate_limit",
234
- prompt: snippetAround(lines, rateLimitIndex >= 0 ? rateLimitIndex : lines.length - 1, 8, 2)
235
- };
236
- }
237
- return null;
238
- }
239
- async function detectAwaitingInputForAgentPromise(agentId, options = {}) {
240
- const cacheEnabled = options.cache !== false;
241
- const cacheKey = getPaneDetectionCacheKey(agentId, options);
242
- const now = Date.now();
243
- if (cacheEnabled) {
244
- sweepPaneDetectionCache(now);
245
- const cached = paneDetectionCache.get(cacheKey);
246
- if (cached && cached.expiresAt > now) {
247
- paneDetectionCache.delete(cacheKey);
248
- paneDetectionCache.set(cacheKey, cached);
249
- return cached.detection;
250
- }
251
- const inFlight = paneDetectionInFlight.get(cacheKey);
252
- if (inFlight) return inFlight;
253
- }
254
- const detectionPromise = withPaneDetectionSlot(async () => {
255
- const detection = detectAwaitingInputFromPaneSync(await Effect.runPromise(capturePane(agentId, options.lines ?? 90)), options);
256
- if (cacheEnabled) {
257
- paneDetectionCache.set(cacheKey, {
258
- expiresAt: Date.now() + PANE_DETECTION_CACHE_TTL_MS,
259
- detection
260
- });
261
- sweepPaneDetectionCache();
262
- }
263
- return detection;
264
- });
265
- if (!cacheEnabled) return detectionPromise;
266
- paneDetectionInFlight.set(cacheKey, detectionPromise);
267
- try {
268
- return await detectionPromise;
269
- } finally {
270
- paneDetectionInFlight.delete(cacheKey);
271
- }
272
- }
273
- /**
274
- * Effect-native variant of detectAwaitingInputForAgent. Fails with TmuxError if
275
- * the pane capture fails outside the in-cache fast path.
276
- */
277
- const detectAwaitingInputForAgent = (agentId, options = {}) => Effect.tryPromise({
278
- try: () => detectAwaitingInputForAgentPromise(agentId, options),
279
- catch: (cause) => new TmuxError({
280
- command: "capture-pane",
281
- message: `failed to detect awaiting input for ${agentId}`,
282
- cause
283
- })
284
- });
285
- /**
286
- * PAN-1690 — parse a Codex approval prompt (as captured by the codex-aware
287
- * branch of detectAwaitingInputFromPaneSync) into its header, detail, and
288
- * numbered options, so the dashboard can render the menu and answer it without
289
- * the terminal. Returns null when the text doesn't contain a usable menu
290
- * (fewer than two numbered options). Option lines tolerate a leading selection
291
- * cursor (❯ › > etc.); the footer hint and other non-numbered lines are
292
- * naturally excluded.
293
- */
294
- function parseCodexApprovalPrompt(text) {
295
- const lines = text.split("\n").map((l) => l.trim()).filter((l) => l.length > 0);
296
- if (lines.length === 0) return null;
297
- const headerIndex = lines.findIndex((l) => looksLikeCodexApprovalHeader(l));
298
- if (headerIndex < 0) return null;
299
- const optionRe = /^[^\w]*(\d+)\.\s*(.+?)\s*$/;
300
- const options = [];
301
- const detailLines = [];
302
- let firstOptionSeen = false;
303
- for (let i = headerIndex + 1; i < lines.length; i += 1) {
304
- const m = optionRe.exec(lines[i]);
305
- if (m) {
306
- firstOptionSeen = true;
307
- options.push({
308
- number: Number(m[1]),
309
- label: m[2].trim()
310
- });
311
- } else if (!firstOptionSeen) detailLines.push(lines[i]);
312
- }
313
- if (options.length < 2) return null;
314
- return {
315
- header: lines[headerIndex],
316
- detail: detailLines.join("\n"),
317
- options
318
- };
319
- }
320
- //#endregion
321
- //#region ../../lib/agent-enrichment.ts
322
- /**
323
- * Agent enrichment utilities (PAN-440 / PAN-1048)
324
- *
325
- * Shared functions for computing enrichment fields:
326
- * role, hasPendingQuestion, pendingQuestionCount, resolution, resolutionCount
327
- *
328
- * Used by both the legacy REST /api/agents endpoint and the new
329
- * AgentEnrichmentService background poller.
330
- *
331
- * PAN-1048: replaced the legacy `agentPhase` string with the role primitive —
332
- * the dashboard derives label/status from `role` + lifecycle state.
333
- */
334
- init_errors();
335
- init_tracker_config();
336
- const execAsync$2 = promisify$1(exec$1);
337
- function appendPaneDetectionKind(detection, kinds) {
338
- if (detection?.reason === "session_resume" && !kinds.includes("sessionResume")) kinds.push("sessionResume");
339
- if (detection?.reason === "rate_limit" && !kinds.includes("rateLimit")) kinds.push("rateLimit");
340
- if (detection?.reason === "tool_permission" && !kinds.includes("permissionRequest")) kinds.push("permissionRequest");
341
- }
342
- /**
343
- * PAN-3070 — the reasons that mean the agent is parked and cannot advance a
344
- * single tool call until a human answers. An agent in this state must never be
345
- * reported as `resolution: working` / `status: healthy`.
346
- *
347
- * `other` is deliberately excluded. PAN-1591 showed it is set by the generic
348
- * pane/runtime/fallback detections that carry no answerable prompt — trusting it
349
- * here would report agents as blocked while they are working normally.
350
- */
351
- const BLOCKING_AWAITING_INPUT_REASONS = new Set([
352
- "tool_permission",
353
- "user_question",
354
- "disambiguation",
355
- "confirmation",
356
- "planning_done",
357
- "session_resume",
358
- "rate_limit"
359
- ]);
360
- /**
361
- * PAN-3070 — the single predicate every "is this agent stuck?" surface consults.
362
- * Takes the detection fields rather than a whole enrichment so the REST listing,
363
- * the enrichment itself, and tests all judge from the same two values.
364
- */
365
- function isBlockedOnPendingInput(agent) {
366
- return agent.hasPendingQuestion === true && BLOCKING_AWAITING_INPUT_REASONS.has(agent.pendingQuestionReason ?? "");
367
- }
368
- function isOwnActiveSpecialist(role) {
369
- return role === "review" || role === "test" || role === "ship";
370
- }
371
- function getClaudeProjectDir(workspacePath) {
372
- return join$1(homedir(), ".claude", "projects", encodeClaudeProjectDir(workspacePath));
373
- }
374
- async function getActiveSessionPath(projectDir) {
375
- if (!existsSync(projectDir)) return null;
376
- try {
377
- const jsonlFiles = (await readdir(projectDir)).filter((f) => f.endsWith(".jsonl"));
378
- if (jsonlFiles.length === 0) return null;
379
- const withMtime = (await Promise.all(jsonlFiles.map(async (f) => {
380
- try {
381
- return {
382
- name: f,
383
- path: join$1(projectDir, f),
384
- mtime: (await stat$1(join$1(projectDir, f))).mtime.getTime()
385
- };
386
- } catch {
387
- return null;
388
- }
389
- }))).filter((x) => x !== null);
390
- if (withMtime.length === 0) return null;
391
- withMtime.sort((a, b) => b.mtime - a.mtime);
392
- return withMtime[0].path;
393
- } catch {
394
- return null;
395
- }
396
- }
397
- function getProjectPathByPrefix(issuePrefix) {
398
- const resolved = resolveProjectFromIssueSync(`${issuePrefix}-1`);
399
- if (resolved) return resolved.projectPath;
400
- const config = getGitHubConfig();
401
- if (config) {
402
- for (const { owner, repo, prefix } of config.repos) if ((prefix || repo.toUpperCase().replace(/-CLI$/, "").replace(/-/g, "")).toUpperCase() === issuePrefix.toUpperCase()) {
403
- const possiblePaths = [
404
- join$1(homedir(), "Projects", repo),
405
- join$1(homedir(), "Projects", repo.replace(/-cli$/, "")),
406
- join$1(homedir(), "Projects", owner, repo)
407
- ];
408
- for (const path of possiblePaths) if (existsSync(path)) return path;
409
- }
410
- }
411
- return join$1(homedir(), "Projects");
412
- }
413
- async function getAgentWorkspacePromise(agentId) {
414
- const workspace = getAgentStateSync(agentId)?.workspace;
415
- if (workspace) return workspace;
416
- try {
417
- const { stdout: paneCwd } = await execAsync$2(`tmux display-message -t ${agentId} -p '#{pane_current_path}' 2>/dev/null`, { encoding: "utf-8" });
418
- const trimmed = paneCwd.trim();
419
- if (trimmed && existsSync(trimmed)) return trimmed;
420
- } catch {}
421
- const isStrikeAgent = agentId.startsWith("strike-");
422
- const issueId = agentId.replace(/^(agent-|planning-|strike-)/, "").toUpperCase();
423
- const prefix = extractPrefixSync(issueId);
424
- if (!prefix) return null;
425
- try {
426
- const projectPath = getProjectPathByPrefix(prefix);
427
- const workspaceNames = isStrikeAgent ? [`feature-${issueId.toLowerCase()}-strike`, `feature-${issueId.toLowerCase()}`] : [`feature-${issueId.toLowerCase()}`];
428
- for (const workspaceName of workspaceNames) {
429
- const workspacePath = join$1(projectPath, "workspaces", workspaceName);
430
- if (existsSync(workspacePath)) return workspacePath;
431
- }
432
- return projectPath;
433
- } catch {
434
- return null;
435
- }
436
- }
437
- async function getAgentJsonlPathPromise(agentId) {
438
- const workspace = await Effect.runPromise(getAgentWorkspace(agentId));
439
- if (!workspace) return null;
440
- const projectDir = getClaudeProjectDir(workspace);
441
- const sessionId = getLatestSessionIdSync(agentId);
442
- if (sessionId) {
443
- const ownPath = join$1(projectDir, `${sessionId}.jsonl`);
444
- if (existsSync(ownPath)) return ownPath;
445
- }
446
- return await getActiveSessionPath(projectDir);
447
- }
448
- /**
449
- * Count outstanding AskUserQuestions across ALL of an agent's workspace JSONL
450
- * session files — not just the newest one. Claude Code rotates session files,
451
- * so an open AskUserQuestion can sit in a file that is not the most-recently-
452
- * modified. The complete-planning guard MUST be robust to that: scanning only
453
- * the active file let TIN-1 complete planning while the operator's question was
454
- * still open. Returns 0 only when no file has an unanswered AUQ.
455
- */
456
- async function countPendingAskUserQuestionsForAgentPromise(agentId) {
457
- const workspace = await Effect.runPromise(getAgentWorkspace(agentId));
458
- if (!workspace) return 0;
459
- const projectDir = getClaudeProjectDir(workspace);
460
- if (!existsSync(projectDir)) return 0;
461
- let files;
462
- try {
463
- files = (await readdir(projectDir)).filter((f) => f.endsWith(".jsonl"));
464
- } catch {
465
- return 0;
466
- }
467
- let total = 0;
468
- for (const f of files) try {
469
- const scan = await scanPendingInputsPromise(join$1(projectDir, f));
470
- total += scan.askUserQuestions.length;
471
- } catch {}
472
- return total;
473
- }
474
- /** Effect-native: count pending AskUserQuestions across all of an agent's JSONL files. */
475
- const countPendingAskUserQuestionsForAgent = (agentId) => Effect.promise(() => countPendingAskUserQuestionsForAgentPromise(agentId));
476
- /**
477
- * Read the last `maxBytes` from a file. Efficient for large JSONL files where
478
- * only recent entries (at the end) are relevant.
479
- */
480
- async function readFileTail(filePath, maxBytes) {
481
- try {
482
- const fileStat = await stat$1(filePath);
483
- const start = Math.max(0, fileStat.size - maxBytes);
484
- if (start === 0) return readFile(filePath, "utf-8");
485
- const { createReadStream } = await import("node:fs");
486
- return new Promise((resolve, reject) => {
487
- const stream = createReadStream(filePath, {
488
- start,
489
- encoding: "utf-8"
490
- });
491
- let data = "";
492
- stream.on("data", (chunk) => {
493
- data += chunk;
494
- });
495
- stream.on("end", () => resolve(data));
496
- stream.on("error", reject);
497
- });
498
- } catch {
499
- return "";
500
- }
501
- }
502
- const ASK_USER_QUESTION_HOOK_DENY_MARKER = "PAN-1520";
503
- const ASK_USER_QUESTION_HOOK_DENY_PHRASE = "surfaced to the operator";
504
- function askUserQuestionDenySignalPresent(content) {
505
- const checkString = (text) => text.includes(ASK_USER_QUESTION_HOOK_DENY_MARKER) || text.includes(ASK_USER_QUESTION_HOOK_DENY_PHRASE);
506
- if (typeof content === "string") return checkString(content);
507
- if (Array.isArray(content)) return content.some((part) => {
508
- if (typeof part === "string") return checkString(part);
509
- if (part && typeof part === "object" && "text" in part) {
510
- const text = part.text;
511
- return typeof text === "string" && checkString(text);
512
- }
513
- return false;
514
- });
515
- return false;
516
- }
517
- function isAskUserQuestionHookDenyToolResult(item) {
518
- if (item.is_error !== true) return false;
519
- return askUserQuestionDenySignalPresent(item.content);
520
- }
521
- async function getPendingQuestionsPromise(jsonlPath) {
522
- return (await scanPendingInputsPromise(jsonlPath)).askUserQuestions;
523
- }
524
- const EMPTY_PENDING_INPUTS_SCAN = Object.freeze({
525
- askUserQuestions: [],
526
- enterPlanModeOpen: false,
527
- exitPlanModePending: false
528
- });
529
- /**
530
- * PAN-1520 — does this user-message entry carry operator text (i.e. an answer)
531
- * rather than just being a wrapper for a tool_result? When the hook denies an
532
- * AskUserQuestion the agent restates the question as plain text; the operator's
533
- * next user message — whether typed in the terminal, sent from the conversation
534
- * composer, or delivered by the answer-question route — is the actual answer.
535
- * The presence of that user-text turn after the deny is what resolves the AUQ.
536
- */
537
- function isUserTextEntry(entry) {
538
- if (!entry || typeof entry !== "object") return false;
539
- const e = entry;
540
- if (e.type !== "user") return false;
541
- const content = e.message?.content;
542
- if (typeof content === "string") return content.trim().length > 0;
543
- if (Array.isArray(content)) return content.some((item) => {
544
- if (!item || typeof item !== "object") return false;
545
- return item.type !== "tool_result";
546
- });
547
- return false;
548
- }
549
- async function scanPendingInputsPromise(jsonlPath) {
550
- if (!existsSync(jsonlPath)) return {
551
- askUserQuestions: [],
552
- enterPlanModeOpen: false,
553
- exitPlanModePending: false
554
- };
555
- try {
556
- const lines = (await readFileTail(jsonlPath, 512e3)).split("\n").filter((line) => line.trim());
557
- const askToolCalls = /* @__PURE__ */ new Map();
558
- const askAnswered = /* @__PURE__ */ new Set();
559
- const askDeniedAwaitingUser = /* @__PURE__ */ new Set();
560
- const exitPlanModeIds = /* @__PURE__ */ new Set();
561
- const exitPlanModeAnswered = /* @__PURE__ */ new Set();
562
- const exitPlanModeCalls = /* @__PURE__ */ new Map();
563
- let pendingExitPlanId;
564
- const enterPlanModeIds = /* @__PURE__ */ new Set();
565
- const exitPlanModeFiredAfterEnter = /* @__PURE__ */ new Set();
566
- for (const line of lines) try {
567
- const entry = JSON.parse(line);
568
- if (isUserTextEntry(entry)) {
569
- for (const id of askDeniedAwaitingUser) askAnswered.add(id);
570
- askDeniedAwaitingUser.clear();
571
- }
572
- const messageContent = entry.message?.content;
573
- if (!Array.isArray(messageContent)) continue;
574
- for (const item of messageContent) {
575
- if (item.type === "tool_use") {
576
- if (item.name === "AskUserQuestion" && typeof item.id === "string") askToolCalls.set(item.id, {
577
- toolId: item.id,
578
- timestamp: entry.timestamp || (/* @__PURE__ */ new Date()).toISOString(),
579
- questions: item.input?.questions || []
580
- });
581
- else if (item.name === "ExitPlanMode" && typeof item.id === "string") {
582
- exitPlanModeIds.add(item.id);
583
- exitPlanModeFiredAfterEnter.add(item.id);
584
- const planText = typeof item.input?.plan === "string" ? item.input.plan : "";
585
- exitPlanModeCalls.set(item.id, {
586
- timestamp: entry.timestamp || (/* @__PURE__ */ new Date()).toISOString(),
587
- plan: planText
588
- });
589
- pendingExitPlanId = item.id;
590
- } else if (item.name === "EnterPlanMode" && typeof item.id === "string") enterPlanModeIds.add(item.id);
591
- }
592
- if (item.type === "tool_result" && typeof item.tool_use_id === "string") {
593
- if (askToolCalls.has(item.tool_use_id)) if (isAskUserQuestionHookDenyToolResult(item)) askDeniedAwaitingUser.add(item.tool_use_id);
594
- else {
595
- askAnswered.add(item.tool_use_id);
596
- askDeniedAwaitingUser.delete(item.tool_use_id);
597
- }
598
- if (exitPlanModeIds.has(item.tool_use_id)) exitPlanModeAnswered.add(item.tool_use_id);
599
- }
600
- }
601
- } catch {}
602
- const askUserQuestions = Array.from(askToolCalls.entries()).filter(([id]) => !askAnswered.has(id)).map(([, question]) => question);
603
- const exitPlanModePending = Array.from(exitPlanModeIds).some((id) => !exitPlanModeAnswered.has(id));
604
- const pendingCall = pendingExitPlanId && !exitPlanModeAnswered.has(pendingExitPlanId) ? exitPlanModeCalls.get(pendingExitPlanId) : void 0;
605
- const pendingProposedPlan = pendingCall ? {
606
- toolUseId: pendingExitPlanId,
607
- askedAt: pendingCall.timestamp,
608
- plan: pendingCall.plan
609
- } : void 0;
610
- return {
611
- askUserQuestions,
612
- enterPlanModeOpen: enterPlanModeIds.size > 0 && exitPlanModeFiredAfterEnter.size === 0,
613
- exitPlanModePending,
614
- ...pendingProposedPlan ? { pendingProposedPlan } : {}
615
- };
616
- } catch {
617
- return {
618
- askUserQuestions: [],
619
- enterPlanModeOpen: false,
620
- exitPlanModePending: false
621
- };
622
- }
623
- }
624
- async function getAgentPendingQuestionsPromise(agentId) {
625
- const jsonlPath = await Effect.runPromise(getAgentJsonlPath(agentId));
626
- if (!jsonlPath) return [];
627
- return [...await Effect.runPromise(getPendingQuestions(jsonlPath))];
628
- }
629
- async function getAgentJsonlMtimePromise(agentId) {
630
- const jsonlPath = await Effect.runPromise(getAgentJsonlPath(agentId));
631
- if (!jsonlPath || !existsSync(jsonlPath)) return null;
632
- try {
633
- return (await stat$1(jsonlPath)).mtime.getTime();
634
- } catch {
635
- return null;
636
- }
637
- }
638
- async function computeAgentEnrichmentPromise(agentId, startedAt, hasActiveSpecialist, cachedScan) {
639
- const isPlanning = agentId.startsWith("planning-");
640
- const stateRole = getAgentStateSync(agentId)?.role;
641
- const role = stateRole === "plan" || stateRole === "work" || stateRole === "review" || stateRole === "test" || stateRole === "ship" || stateRole === "flywheel" ? stateRole : isPlanning ? "plan" : void 0;
642
- const runtimeState = await Effect.runPromise(getAgentRuntimeState(agentId));
643
- let scan = EMPTY_PENDING_INPUTS_SCAN;
644
- if (cachedScan) scan = cachedScan;
645
- else {
646
- const jsonlPath = await Effect.runPromise(getAgentJsonlPath(agentId));
647
- if (jsonlPath) scan = await scanPendingInputsPromise(jsonlPath);
648
- }
649
- let pendingQuestions = [...scan.askUserQuestions];
650
- const enterPlanModeOpen = scan.enterPlanModeOpen;
651
- const exitPlanModePending = scan.exitPlanModePending;
652
- if (pendingQuestions.length > 0 && startedAt) {
653
- const agentStartTime = new Date(startedAt).getTime();
654
- pendingQuestions = pendingQuestions.filter((q) => {
655
- const qTime = new Date(q.timestamp).getTime();
656
- return !isNaN(qTime) && qTime >= agentStartTime;
657
- });
658
- }
659
- const questionDetection = pendingQuestions.length > 0 ? {
660
- reason: "user_question",
661
- prompt: normalizeAwaitingInputPrompt(pendingQuestions[0]?.questions.map((q) => q.question).filter(Boolean).join("\n") || "Agent is waiting for a user answer")
662
- } : null;
663
- const runtimeDetection = runtimeState?.state === "waiting-on-human" ? {
664
- reason: runtimeState.waitingReason || "other",
665
- prompt: normalizeAwaitingInputPrompt(runtimeState.waitingNotification || "Agent is waiting for human input")
666
- } : null;
667
- const paneDetection = !questionDetection && !runtimeDetection ? await Effect.runPromise(detectAwaitingInputForAgent(agentId, { isPlanning })) : null;
668
- const fallbackDetection = runtimeState?.resolution === "needs_input" ? {
669
- reason: "other",
670
- prompt: normalizeAwaitingInputPrompt("Agent stopped because it needs human input or hit a blocker")
671
- } : null;
672
- const turnEndedWaiting = (role === "plan" || agentId.startsWith("conv-")) && runtimeState?.state === "idle";
673
- const turnEndedDetection = turnEndedWaiting ? {
674
- reason: "other",
675
- prompt: normalizeAwaitingInputPrompt("Agent finished its turn and is waiting for your reply")
676
- } : null;
677
- const detection = questionDetection ?? runtimeDetection ?? paneDetection ?? fallbackDetection ?? turnEndedDetection;
678
- const shouldSuppressPendingInput = hasActiveSpecialist === true && !isOwnActiveSpecialist(role);
679
- const hasPendingQuestion = !shouldSuppressPendingInput && detection !== null;
680
- const pendingInputKinds = [];
681
- let pendingAskUserQuestion;
682
- if (!shouldSuppressPendingInput) {
683
- if (pendingQuestions.length > 0) {
684
- pendingInputKinds.push("askUserQuestion");
685
- const first = pendingQuestions[0];
686
- pendingAskUserQuestion = {
687
- toolUseId: first.toolId,
688
- askedAt: first.timestamp,
689
- questions: first.questions.map((q) => ({
690
- question: q.question,
691
- header: q.header,
692
- multiSelect: q.multiSelect,
693
- options: q.options.map((o) => ({
694
- label: o.label,
695
- description: o.description
696
- }))
697
- }))
698
- };
699
- }
700
- if (exitPlanModePending) pendingInputKinds.push("exitPlanMode");
701
- if (enterPlanModeOpen && !exitPlanModePending) pendingInputKinds.push("enterPlanMode");
702
- if (turnEndedWaiting && pendingInputKinds.length === 0) pendingInputKinds.push("agentTurnEnded");
703
- appendPaneDetectionKind(detection, pendingInputKinds);
704
- }
705
- return {
706
- role,
707
- hasPendingQuestion,
708
- pendingQuestionCount: pendingQuestions.length,
709
- pendingQuestionPrompt: detection?.prompt,
710
- pendingQuestionReason: detection?.reason,
711
- pendingInputCount: pendingInputKinds.length,
712
- pendingInputKinds,
713
- pendingAskUserQuestion,
714
- pendingProposedPlan: shouldSuppressPendingInput ? void 0 : scan.pendingProposedPlan,
715
- resolution: isBlockedOnPendingInput({
716
- hasPendingQuestion,
717
- pendingQuestionReason: detection?.reason
718
- }) ? "needs_input" : runtimeState?.resolution || "working",
719
- resolutionCount: runtimeState?.resolutionCount || 0,
720
- jsonlScan: scan
721
- };
722
- }
723
- /**
724
- * Effect-native variant of computeAgentEnrichment. Fails with FsError if any
725
- * underlying filesystem read fails outside the swallowed branches.
726
- */
727
- const computeAgentEnrichment = (agentId, startedAt, hasActiveSpecialist, cachedScan) => Effect.tryPromise({
728
- try: () => computeAgentEnrichmentPromise(agentId, startedAt, hasActiveSpecialist, cachedScan),
729
- catch: (cause) => new FsError({
730
- path: getAgentDir(agentId),
731
- operation: "computeAgentEnrichment",
732
- cause
733
- })
734
- });
735
- /** Effect-native: resolve the workspace path for an agent (null on failure). */
736
- const getAgentWorkspace = (agentId) => Effect.promise(() => getAgentWorkspacePromise(agentId));
737
- /** Effect-native: resolve the active JSONL session path for an agent (null on failure). */
738
- const getAgentJsonlPath = (agentId) => Effect.promise(() => getAgentJsonlPathPromise(agentId));
739
- /** Effect-native: get the mtime of the agent's active JSONL session file. */
740
- const getAgentJsonlMtime = (agentId) => Effect.promise(() => getAgentJsonlMtimePromise(agentId));
741
- /** Effect-native: parse pending questions from a JSONL file. */
742
- const getPendingQuestions = (jsonlPath) => Effect.promise(() => getPendingQuestionsPromise(jsonlPath));
743
- /** Effect-native: get pending questions for an agent by id. */
744
- const getAgentPendingQuestions = (agentId) => Effect.promise(() => getAgentPendingQuestionsPromise(agentId));
745
- //#endregion
746
- //#region ../../lib/runtimes/claude-code.ts
747
37
  init_config();
38
+ init_agent_enrichment();
39
+ init_queries();
748
40
  /**
749
41
  * Claude Code Runtime Implementation
750
42
  *
@@ -753,6 +45,7 @@ init_config();
753
45
  * Session storage: ~/.claude/projects/<workspace-hash>/<session-id>.jsonl
754
46
  * Session index: ~/.claude/projects/<workspace-hash>/sessions-index.json
755
47
  */
48
+ init_behavior();
756
49
  init_agents();
757
50
  init_tmux();
758
51
  init_jsonl_parser();
@@ -1044,14 +337,16 @@ init_behavior();
1044
337
  init_tmux();
1045
338
  init_pi_fifo();
1046
339
  init_errors();
1047
- init_paths();
1048
340
  promisify(exec);
1049
341
  //#endregion
1050
342
  //#region ../../lib/runtimes/acp.ts
343
+ init_codex();
344
+ init_ohmypi();
1051
345
  init_context();
1052
346
  init_harness_binary();
1053
347
  init_paths();
1054
348
  init_behavior();
349
+ init_tmux_cli();
1055
350
  const execAsync = promisify(exec);
1056
351
  const HOST_REQUEST_TIMEOUT_MS = 5e3;
1057
352
  const SPAWN_READY_TIMEOUT_MS = 3e4;
@@ -1320,6 +615,7 @@ function createAcpRuntimeSync(options = {}) {
1320
615
  //#endregion
1321
616
  //#region ../../lib/runtimes/index.ts
1322
617
  init_behavior();
618
+ init_kimi_code();
1323
619
  init_agents();
1324
620
  /**
1325
621
  * Runtime registry implementation
@@ -1361,6 +657,7 @@ var RuntimeRegistry = class {
1361
657
  if (harness === "ohmypi" || harness === "pi") return this.get("ohmypi") ?? null;
1362
658
  if (harness === "codex") return this.get("codex") ?? null;
1363
659
  if (harness === "acp") return this.get("acp") ?? null;
660
+ if (harness === "kimi-code") return this.get("kimi-code") ?? null;
1364
661
  return this.get("claude-code") ?? null;
1365
662
  }
1366
663
  };
@@ -1381,6 +678,7 @@ function getGlobalRegistry() {
1381
678
  globalRegistry.register(createOhmypiRuntimeSync());
1382
679
  globalRegistry.register(createCodexRuntimeSync());
1383
680
  globalRegistry.register(createAcpRuntimeSync());
681
+ globalRegistry.register(createKimiCodeRuntimeSync());
1384
682
  }
1385
683
  return globalRegistry;
1386
684
  }
@@ -1517,6 +815,7 @@ function clearStuckRemediationState(agentId) {
1517
815
  init_agents();
1518
816
  init_tmux();
1519
817
  init_dag();
818
+ init_recovery_trip();
1520
819
  function issueIdForAgent(agent) {
1521
820
  return agent.issueId || agent.id.replace(/^agent-/, "").toUpperCase();
1522
821
  }
@@ -1756,7 +1055,7 @@ async function remediateFlywheelOrchestrator(agentId, now, actions, reason) {
1756
1055
  now
1757
1056
  });
1758
1057
  if (decision.kind === "noop") return;
1759
- const { resumeFlywheel, pauseFlywheel } = await import("./flywheel-DZZdtiOL.js");
1058
+ const { resumeFlywheel, pauseFlywheel } = await import("./flywheel-DHWHzaYK.js");
1760
1059
  const prev = readStuckRemediationState(agentId);
1761
1060
  const nowIso = new Date(now).toISOString();
1762
1061
  if (decision.kind === "escalate") {
@@ -1860,6 +1159,6 @@ async function checkStuckAgentRemediation(opts = {}) {
1860
1159
  return actions;
1861
1160
  }
1862
1161
  //#endregion
1863
- export { normalizeAwaitingInputPrompt as _, isAgentIdleForNudge as a, countPendingAskUserQuestionsForAgent as c, getAgentPendingQuestions as d, getAgentWorkspace as f, detectAwaitingInputFromPaneSync as g, detectAwaitingInputForAgent as h, shouldSkipReviewStatus as i, getAgentJsonlMtime as l, scanPendingInputsPromise as m, decideFlywheelRemediation as n, getRuntimeForAgent as o, isBlockedOnPendingInput as p, shouldSkipIdlePokeForAgent as r, computeAgentEnrichment as s, checkStuckAgentRemediation as t, getAgentJsonlPath as u, parseCodexApprovalPrompt as v };
1162
+ export { isAgentIdleForNudge as a, shouldSkipReviewStatus as i, decideFlywheelRemediation as n, getRuntimeForAgent as o, shouldSkipIdlePokeForAgent as r, checkStuckAgentRemediation as t };
1864
1163
 
1865
- //# sourceMappingURL=stuck-remediation-CC6q3eqQ.js.map
1164
+ //# sourceMappingURL=stuck-remediation-CbCRSz1v.js.map