@overdeck/desktop 0.47.1 → 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-Cd7ZGZCq.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-DieFp3qi.js → advancing-selfheal-8AR68Asf.js} +6 -6
  7. package/server/{agent-gc-BMcgTDl7.js → agent-gc-BmYeT6eH.js} +5 -5
  8. package/server/agent-state-Dq3s84-P.js +3 -0
  9. package/server/{agent-state-service-DFO6qvHp.js → agent-state-service-DK1Vay1E.js} +1 -1
  10. package/server/{agent-state-service-BOzQhLjU.js → agent-state-service-rjnzpHDx.js} +6 -6
  11. package/server/{agent-state-source-Ca_zCaII.js → agent-state-source-Ds968-j6.js} +1 -1
  12. package/server/{agents-CtACUuVG.js → agents-Dls7tfJH.js} +5 -5
  13. package/server/agents-IPSa5kzn.js +3 -0
  14. package/server/{archive-planning-Binfb99i.js → archive-planning-Cq7cyinS.js} +51 -24
  15. package/server/archive-planning-MbkGCBIY.js +2 -0
  16. package/server/{artifact-index-jobs-Jn7BGOtV.js → artifact-index-jobs-Dj_8kpTd.js} +3 -3
  17. package/server/{assemble-DsqK9OAq.js → assemble-BTCmbcfH.js} +20 -13
  18. package/server/{auto-spawn-consent-BooqhC3L.js → auto-spawn-consent-lXqRJ1Dr.js} +304 -121
  19. package/server/{backlog-auto-trigger-BADGPxov.js → backlog-auto-trigger-Dn-amzt6.js} +3 -3
  20. package/server/{behavior-B7biGtFT.js → behavior-DIMQMRzs.js} +2 -2
  21. package/server/{boot-reconciled-stop-events-bQUzU8ns.js → boot-reconciled-stop-events-D6SeUTIr.js} +1 -1
  22. package/server/{bridge-pool-patrol-DsPj6F7t.js → bridge-pool-patrol-BEjt-xF3.js} +2 -2
  23. package/server/{briefing-freshness-CUerZqWd.js → briefing-freshness-3PNmL_p3.js} +2 -2
  24. package/server/{build-info-D0q_i8WM.js → build-info-CJg813Hm.js} +3 -3
  25. package/server/{build-info-Du74MKiP.js → build-info-CXyeFsXu.js} +1 -1
  26. package/server/{checkpoint-manager-Cu-R5Uzg.js → checkpoint-manager-9t7G5c1V.js} +1 -1
  27. package/server/{checkpoint-manager-R5tnaxEY.js → checkpoint-manager-B2G38R3p.js} +3 -3
  28. package/server/checkpoint-worker.js +1 -1
  29. package/server/{checkpoints-wF84ubZ8.js → checkpoints-CuBgiXO-.js} +1 -1
  30. package/server/{checkpoints-DYtLu-PB.js → checkpoints-VTZMd4Qm.js} +2 -2
  31. package/server/{claude-hooks-provision-DXI3Wqlm.js → claude-hooks-provision-55SyQaPz.js} +2 -2
  32. package/server/{claude-hooks-provision-UKxCeOyj.js → claude-hooks-provision-CEUT-CZd.js} +1 -1
  33. package/server/{claude-permissions-DYVLnX9t.js → claude-permissions-Cn0dIu2i.js} +2 -2
  34. package/server/{claude-settings-overlay-DxP2F_gY.js → claude-settings-overlay-B19hdzSA.js} +1 -1
  35. package/server/{claude-settings-overlay-DsbpIq2d.js → claude-settings-overlay-Yg_ANh81.js} +2 -2
  36. package/server/{cli-DzRKxxP_.js → cli-C9S84iTy.js} +79 -22
  37. package/server/cli-M1cwZ__d.js +3 -0
  38. package/server/{cliproxy-CG4meRFc.js → cliproxy-CJq3KXU6.js} +2 -2
  39. package/server/{cliproxy-Cwzw39yN.js → cliproxy-DgEZlr7Y.js} +1 -1
  40. package/server/{close-issue-BX1bATJy.js → close-issue-DPxRddGR.js} +5 -5
  41. package/server/{closed-issue-reaper-hLt0W86J.js → closed-issue-reaper-C5Zn4GRS.js} +13 -13
  42. package/server/{closed-issue-reaper-DvnTSN6a.js → closed-issue-reaper-D-2B48Ri.js} +1 -1
  43. package/server/{codex-rnJN3v3_.js → codex-B3n_rkwn.js} +1 -1
  44. package/server/{codex-BYwi1uyW.js → codex-CjkD1PJu.js} +6 -6
  45. package/server/{codex-parser-Poyz29GE.js → codex-parser-DpB1Il-P.js} +2 -2
  46. package/server/{compaction-continuation-DtMfHN0f.js → compaction-continuation-DZD9ukSE.js} +3 -3
  47. package/server/{config-R793W0yA.js → config-C5saf4Ja.js} +1 -1
  48. package/server/{config-CX4vk1CV.js → config-DnLJATZk.js} +2 -2
  49. package/server/{config-ktAVnp4s.js → config-DvM8jtQK.js} +2 -2
  50. package/server/{config-yaml-CxdwhAIA.js → config-yaml-BSCqwmX0.js} +11299 -10972
  51. package/server/{conflict-gate-BSTlwCtF.js → conflict-gate-DXa_L28t.js} +1 -1
  52. package/server/{conflict-gate-BNv6UolH.js → conflict-gate-WfVqgalf.js} +4 -4
  53. package/server/{context-layers-DCdaGsRG.js → context-layers-D7UqH9Ab.js} +2 -2
  54. package/server/{context-layers-DlWsDiRF.js → context-layers-Dpz3Vd6d.js} +3 -3
  55. package/server/{control-settings-qYYHrIqy.js → control-settings-DVf6pKyv.js} +4 -4
  56. package/server/{conversation-compaction-BxUKObHb.js → conversation-compaction-5XuH6OBn.js} +1 -1
  57. package/server/{conversation-compaction-CXQrN3I_.js → conversation-compaction-COrbnX1J.js} +8 -8
  58. package/server/{conversation-service-CZiUE8Uw.js → conversation-service-BufdtnZF.js} +169 -10
  59. package/server/{conversation-service-CDnQ3ayN.js → conversation-service-DnUyIiLb.js} +1 -1
  60. package/server/{conversations-D7lR670u.js → conversations-B4rxz-Wl.js} +17 -10
  61. package/server/{conversations-DXl5YTf4.js → conversations-D1bwxQMy.js} +1 -1
  62. package/server/{cost-Aat8HfO_.js → cost-CpFDrJUS.js} +46 -2
  63. package/server/{cost-CWvN9FP2.js → cost-KLuwKCW9.js} +3 -3
  64. package/server/{cost-sync-DiUBXwl6.js → cost-sync-cesi9dp8.js} +3 -3
  65. package/server/{dag-5QlmH0oC.js → dag-BYiFMqpU.js} +2 -2
  66. package/server/{dangerous-git-ops-DWX6Og8c.js → dangerous-git-ops-BKvd3-Hk.js} +1 -1
  67. package/server/dashboard-db-worker.js +7 -7
  68. package/server/{deacon-PW_bg4uL.js → deacon-BbsWw8a6.js} +3 -3
  69. package/server/{deacon-B1LD5cJU.js → deacon-HdEh0Esp.js} +672 -181
  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-DPHsO14z.js → deacon-nudge-log-BND_97Wo.js} +4 -3
  73. package/server/{deacon-pending-lifecycle-2ZflPxgo.js → deacon-pending-lifecycle-CD3YsiQK.js} +3 -3
  74. package/server/deacon-swarm-DgWADWd_.js +2 -0
  75. package/server/{deacon-swarm-DwGUgSVp.js → deacon-swarm-rqrl4TMs.js} +39 -18
  76. package/server/deacon.js +12 -210
  77. package/server/{dead-end-trip-B06RFIr2.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-BNjeCL8u.js → deploy-patrol-kARAkji4.js} +17 -21
  81. package/server/{deploy-queue-CKT_Ia9p.js → deploy-queue-Bj0HJT1i.js} +2 -2
  82. package/server/{deploy-queue-DMMYhFC8.js → deploy-queue-rjTUy1RM.js} +1 -1
  83. package/server/{deploy-window-DC8lze3d.js → deploy-window-B2IM-9G5.js} +10 -44
  84. package/server/{deploy-window-D_AimdNN.js → deploy-window-BNFWnA8D.js} +1 -1
  85. package/server/{dev-supervisor-C4F0vbno.js → dev-supervisor-B1mZYXz4.js} +2 -2
  86. package/server/{devcontainer-renderer-66sqMQIi.js → devcontainer-renderer-B-o68Z5B.js} +3 -3
  87. package/server/{dist-C5FT9lTG.js → dist-3W--cGMa.js} +1 -1
  88. package/server/dist-BR0QtwmS.js +3 -0
  89. package/server/{dist-src-B-AlGWSl.js → dist-src-C-Vk2jNk.js} +1 -1
  90. package/server/{docker-BxrFhTZ_.js → docker-DH3jUYg1.js} +1 -1
  91. package/server/{docker-CoAT8R0J.js → docker-meuLKLzV.js} +27 -20
  92. package/server/{dod-Bg6wsKTV.js → dod-D7-9dCOD.js} +1 -1
  93. package/server/{driver-CKVGi51s.js → driver-CmsY2RLl.js} +1 -1
  94. package/server/{durable-review-pipeline-D_DcfIGP.js → durable-review-pipeline-CStTgOAf.js} +1 -1
  95. package/server/{durable-review-pipeline-HkAgnx0L.js → durable-review-pipeline-Chq0lzjL.js} +1 -1
  96. package/server/{ensure-devcontainer-Bg5HJAcO.js → ensure-devcontainer-BE3llBWP.js} +1 -1
  97. package/server/{ensure-devcontainer-DTxChVuA.js → ensure-devcontainer-BXrY7C2Z.js} +4 -4
  98. package/server/{esm-shims-CaBWIR7f.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-ChEFB7Jp.js → events-CCkFWa7X.js} +1 -1
  102. package/server/{events-DhRN-6vM.js → events-zjDQozet.js} +3 -3
  103. package/server/{factory-BezSPaTd.js → factory-DhavwKVc.js} +5 -5
  104. package/server/{feature-registry-population-DhswNiXx.js → feature-registry-population-DWGBKyWd.js} +4 -4
  105. package/server/{feature-registry-storage-CUVNpAso.js → feature-registry-storage-C5DkXmCM.js} +3 -3
  106. package/server/{features-B2CfNPFw.js → features-CC47YcCX.js} +2 -2
  107. package/server/{feedback-target-CMrEAoeA.js → feedback-target-D9Tex35_.js} +1 -1
  108. package/server/{feedback-target-VBr9gKgX.js → feedback-target-DoRCR3L-.js} +8 -8
  109. package/server/{feedback-writer-CY91ckuw.js → feedback-writer-CTSuA6lw.js} +1 -1
  110. package/server/{feedback-writer-xpFgU632.js → feedback-writer-DdsBdtNL.js} +5 -5
  111. package/server/{flywheel-DsICCjTR.js → flywheel-DHWHzaYK.js} +1 -1
  112. package/server/{flywheel-DQqsSm7P.js → flywheel-DJQa9az8.js} +14 -14
  113. package/server/{flywheel-CTVY3yCG.js → flywheel-TacAI9MA.js} +21 -17
  114. package/server/{flywheel-merge-order-C-TI4JGu.js → flywheel-merge-order-D2foPh88.js} +1 -1
  115. package/server/{flywheel-merge-order-CMGz-imq.js → flywheel-merge-order-DRtex2Dt.js} +7 -7
  116. package/server/forge-CdlCG9aS.js +3 -0
  117. package/server/{forge-RTNqJe6a.js → forge-c8LeC-tw.js} +2 -2
  118. package/server/{from-DxGcivc9.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-BuTdlZFA.js → fts-operations-DP9R-8Q3.js} +3 -3
  121. package/server/{git-utils-CedsVume.js → git-utils-C31x1lpE.js} +1 -1
  122. package/server/{git-utils-DtdoEXJk.js → git-utils-xQ74FoSn.js} +5 -4
  123. package/server/{github-app-DIE8BkHI.js → github-app-CpQSDlv8.js} +1 -1
  124. package/server/{github-app-gVnZcP9B.js → github-app-D2QuvZ3j.js} +3 -3
  125. package/server/{github-client-BrAC6ELh.js → github-client-D9YvJX5D.js} +3 -3
  126. package/server/{github-client-CBOkvBUl.js → github-client-Tpi3PmKX.js} +1 -1
  127. package/server/{github-pr-lookup-CgMULTPf.js → github-pr-lookup-DvBMv-IW.js} +2 -2
  128. package/server/{harness-binary-CnBHpd57.js → harness-binary-BHxWf_sX.js} +7 -6
  129. package/server/{harness-resolve-BVj6sI8m.js → harness-resolve-bj9WMABA.js} +4 -4
  130. package/server/{health-events-BBWO_Dh9.js → health-events-bCDPn59Z.js} +2 -2
  131. package/server/{health-events-Der6bOkm.js → health-events-qo7Ss34U.js} +1 -1
  132. package/server/{hooks-BOavco-e.js → hooks-Dyxtg5fk.js} +2 -2
  133. package/server/{hooks-BJNal-bs.js → hooks-X2XHBB2b.js} +1 -1
  134. package/server/{hume-DBocJFkA.js → hume-DrZEGpqc.js} +2 -2
  135. package/server/hume-YPsy4UA8.js +3 -0
  136. package/server/{idle-stack-reaper-DQFh8rDh.js → idle-stack-reaper-CJ1ygW0p.js} +37 -7
  137. package/server/{idle-stack-reaper-CyGxXOfC.js → idle-stack-reaper-uJGOb-vu.js} +1 -1
  138. package/server/{in-flight-guard-nXEKoxI7.js → in-flight-guard-CG2Eo-rr.js} +1 -1
  139. package/server/{infra-BDQDRopn.js → infra-CTrmVqc_.js} +111 -6
  140. package/server/{injection-DfFFEMKL.js → injection-BisQ0lpX.js} +1 -1
  141. package/server/{injection-CCopdUKz.js → injection-C9sxqbc2.js} +73 -193
  142. package/server/{inspect-agent-FCDlNT_i.js → inspect-agent-BoSO51YC.js} +12 -12
  143. package/server/inspect-agent-BykeOH4a.js +2 -0
  144. package/server/{internal-token-BG6yQKNL.js → internal-token-AvXePaQT.js} +2 -2
  145. package/server/{internal-token-BJZa40Ld.js → internal-token-Djkj-yqK.js} +1 -1
  146. package/server/{io-C0NV7y6C.js → io-mxOWMZ7I.js} +6 -6
  147. package/server/{issue-closed-CNNGbhWm.js → issue-closed-Bj_bCv_0.js} +7 -7
  148. package/server/{issue-lifecycle-DSH0GpWC.js → issue-lifecycle-A5YIpDZE.js} +1 -1
  149. package/server/{issue-lifecycle-BXfzxFCD.js → issue-lifecycle-BXUqaHzF.js} +32 -28
  150. package/server/{issue-service-singleton-F3A5VP6M.js → issue-service-singleton-BPNEXczv.js} +11 -11
  151. package/server/{issue-service-singleton-lwFJ4dHk.js → issue-service-singleton-CcaHjKPR.js} +1 -1
  152. package/server/{issues-DA-U_MpR.js → issues-AX-YBeAQ.js} +2 -2
  153. package/server/{jsonl-parser-BXiGANOh.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-BnxRk0Eo.js → label-cleanup-sXUlgdM0.js} +3 -3
  158. package/server/{lifecycle-DOgGnpIv.js → lifecycle-D2X3al0D.js} +2 -2
  159. package/server/{lifecycle-Di48-w4x.js → lifecycle-DjlljAZ1.js} +6 -6
  160. package/server/{lifecycle-io-eVG6v_8-.js → lifecycle-io-C5nVk55o.js} +1 -1
  161. package/server/{lifecycle-io-1XSeczTr.js → lifecycle-io-NPm1YtIG.js} +5 -5
  162. package/server/{linear-client-CvGo9n7M.js → linear-client--luYwCZg.js} +1 -1
  163. package/server/{linear-client-CYZRrcjp.js → linear-client-B8pLegW1.js} +3 -3
  164. package/server/{linear-mcp-auth-Cp0XaP96.js → linear-mcp-auth-BQVWV0I3.js} +6 -6
  165. package/server/{linear-mcp-auth-DoJnjdPZ.js → linear-mcp-auth-Dx81Zl4G.js} +1 -1
  166. package/server/memory-fts-worker.js +1 -1
  167. package/server/{merge-DO14mOr3.js → merge-Bx5Bh9pi.js} +3 -3
  168. package/server/{merge-ZF99ig6A.js → merge-Dqmh_zja.js} +1 -1
  169. package/server/{merge-agent-gpiRkcvj.js → merge-agent-DP9AUY29.js} +33 -33
  170. package/server/{merge-agent-C1-9zbP_.js → merge-agent-DWd0KfiS.js} +1 -1
  171. package/server/{merge-batch-C11ocNkO.js → merge-batch-BdmvTEAC.js} +1 -1
  172. package/server/{merge-completeness-CghMbyX7.js → merge-completeness-BfRwFjRx.js} +1 -1
  173. package/server/{merge-completeness-BUzPZy0E.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-iwlUzZjr.js → merge-rebase-BX1xKsrE.js} +2 -2
  177. package/server/{merge-set-Dbnx4chw.js → merge-set-DsLjjLEV.js} +4 -4
  178. package/server/{merge-set-BymrheTj.js → merge-set-H6epHOsw.js} +1 -1
  179. package/server/{merge-sync-CM978zez.js → merge-sync-BEdfsQV4.js} +2 -2
  180. package/server/{merge-sync-CqEtqjI2.js → merge-sync-BebcWWGA.js} +1 -1
  181. package/server/{merge-train-DvLcAn1G.js → merge-train-D1I0lNOT.js} +4 -4
  182. package/server/{merge-train-deps-Cl_kcRbO.js → merge-train-deps-D_-C0Pk2.js} +4 -4
  183. package/server/{merge-verification-c9Y9mllw.js → merge-verification-DN1Ov9bU.js} +6 -6
  184. package/server/{merged-docker-cleanup-worker-CGiDOdv8.js → merged-docker-cleanup-worker-CfXSr2pA.js} +4 -4
  185. package/server/{merged-docker-cleanup-worker-DgsLOx3E.js → merged-docker-cleanup-worker-ybsPyHjB.js} +1 -1
  186. package/server/{multipart-parser-D0twwRjz.js → multipart-parser-CL5QG8iv.js} +2 -2
  187. package/server/{no-resume-mode-DZvP0M_S.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-6r2OEfYd.js → orphan-proposed-reconciler-CEW1maPl.js} +1 -1
  209. package/server/{orphan-proposed-reconciler-DtQP6oE_.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-DAOb1V2-.js → pan-dir-DhgKfO86.js} +21 -6
  213. package/server/{paths-DuATV5iE.js → paths-BUuhi6jM.js} +17 -17
  214. package/server/{pending-lifecycle-claim-DQUHIDfX.js → pending-lifecycle-claim-DJlA1rTR.js} +2 -2
  215. package/server/{persistent-logger-CBj016pT.js → persistent-logger-s8cbpFNV.js} +2 -2
  216. package/server/{pickup-zXZl5lQI.js → pickup-2AxtB3dW.js} +1 -1
  217. package/server/{pipeline-membership-DHOXmvba.js → pipeline-membership-2_okL5bm.js} +1 -1
  218. package/server/{pipeline-membership-B2yUcBz7.js → pipeline-membership-Dqv6_0ig.js} +1 -1
  219. package/server/{pipeline-membership-gather-OkLXuvxR.js → pipeline-membership-gather-4F1-tXKI.js} +1 -1
  220. package/server/{pipeline-membership-gather-BIcJ-N0W.js → pipeline-membership-gather-CtJ_7aGf.js} +149 -17
  221. package/server/{pipeline-notifier-BmwrVKsO.js → pipeline-notifier-CO9rxJgB.js} +1 -1
  222. package/server/{pipeline-notifier-CxMes51i.js → pipeline-notifier-DDfVBJhJ.js} +2 -2
  223. package/server/{post-merge-lifecycle-worker-3u_rA4R0.js → post-merge-lifecycle-worker-DmSOkeNp.js} +3 -3
  224. package/server/{project-pipelines-C3SPFJ38.js → project-pipelines-72WE8GVK.js} +2 -2
  225. package/server/{project-repos-BOpBzkO6.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-B0TtboFm.js → prompts-XkL10m8M.js} +2 -2
  229. package/server/{providers-O2smCvSz.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-BonZ4WVG.js → pull-requests-B-KrUph5.js} +3 -3
  248. package/server/{pull-requests-DNcJUVWA.js → pull-requests-DK5k92B4.js} +1 -1
  249. package/server/{queries-DCX27GRr.js → queries-DVpl1vsU.js} +1212 -193
  250. package/server/{rally-Cxe7lKYX.js → rally-DbE561hD.js} +3 -3
  251. package/server/rally-O_st_X7n.js +3 -0
  252. package/server/{rally-api-CzkKenoi.js → rally-api-CZLeEd2C.js} +2 -2
  253. package/server/{rally-api-Cp50exEi.js → rally-api-DaHtn5QN.js} +1 -1
  254. package/server/{rally-client-Bu3Cekkw.js → rally-client-C-MAl8ur.js} +1 -1
  255. package/server/{rally-client-CyBBEDHu.js → rally-client-Ch3zRsBX.js} +5 -5
  256. package/server/{reap-terminal-sessions-CtAhr6L0.js → reap-terminal-sessions-C1n0ALRb.js} +2 -2
  257. package/server/{reap-terminal-sessions-DvFqQUnq.js → reap-terminal-sessions-DegFS2p1.js} +2 -2
  258. package/server/{rebuild-stack-hCQtprWC.js → rebuild-stack-C9Li44A3.js} +20 -10
  259. package/server/{rebuild-stack-BKYpIPDL.js → rebuild-stack-qC0jCNm6.js} +2 -2
  260. package/server/{reconstruct-cache-CF2avArx.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-_eO3VFth.js → release-engine-Be5MX5GP.js} +5 -5
  267. package/server/{release-set-vxgZwwZV.js → release-set-DJv_O6PS.js} +3 -3
  268. package/server/{remote-BienmcrZ.js → remote-BMM3uH2J.js} +3 -3
  269. package/server/{remote-CVPCc7Vy.js → remote-C0xVTHA5.js} +3 -3
  270. package/server/{remote-agents-kwsEZvXu.js → remote-agents-BIIoc5pD.js} +1 -1
  271. package/server/{remote-agents-kxraOCGT.js → remote-agents-EUiZ26bj.js} +7 -7
  272. package/server/{remote-completion-BtmZ42aP.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-CIRr0yYt.js → review-agent-BHGaBoBu.js} +29 -29
  276. package/server/{review-agent-UpAM4DmT.js → review-agent-CD3RQ-tc.js} +1 -1
  277. package/server/{review-artifacts-BCODM9ww.js → review-artifacts-DyhajWso.js} +6 -6
  278. package/server/{review-context-BBsNrDri.js → review-context-B-dlsPnx.js} +9 -9
  279. package/server/{review-convoy-liveness-l06_LYCt.js → review-convoy-liveness-D7M-s_nS.js} +2 -2
  280. package/server/{review-status-CacDM78F.js → review-status-B6wYcOtP.js} +1 -1
  281. package/server/{review-status-CwhA9wmd.js → review-status-CKLk5aZ-.js} +306 -59
  282. package/server/{review-status-emit-BPJwYcRy.js → review-status-emit-CJ7UmEVU.js} +3 -3
  283. package/server/{review-status-enrichment-DvyZAbGR.js → review-status-enrichment-DJRgGX7-.js} +3 -3
  284. package/server/review-status-limits-4EJDCGHO.js +7 -0
  285. package/server/{review-status-source-DWnFE0b6.js → review-status-source-7nU3Z2wL.js} +1 -1
  286. package/server/{review-status-source-B70ekARK.js → review-status-source-BsDYGfyv.js} +1 -1
  287. package/server/{review-status-sync-B0IS6Beh.js → review-status-sync-BLssMTEW.js} +1 -1
  288. package/server/{review-status-sync-h2CJX6ju.js → review-status-sync-BxBeHRde.js} +35 -11
  289. package/server/{review-verdict-feedback-yrrmgps_.js → review-verdict-feedback-5jWuzgpc.js} +22 -10
  290. package/server/{review-verdict-feedback-qRohbFG2.js → review-verdict-feedback-HRY9P4bN.js} +1 -1
  291. package/server/{rollup-CUoav0Op.js → rollup-BGIrCEkU.js} +79 -44
  292. package/server/rollup-CZB4UL9q.js +3 -0
  293. package/server/{scanner-ChURu_b-.js → scanner-DydjXPrz.js} +16 -9
  294. package/server/search-DdtIjAiu.js +395 -0
  295. package/server/{sequence-io-D9ITDxzq.js → sequence-io-Fw-cLyDs.js} +4 -4
  296. package/server/{sequencer-agent-m7gmaakW.js → sequencer-agent-BcpGMt5x.js} +15 -10
  297. package/server/server.js +1258 -438
  298. package/server/{service-BzFG0Us_.js → service-BFFkGsG4.js} +58 -58
  299. package/server/{session-fork-KBq4HIHF.js → session-fork-D0V-3e5P.js} +2 -2
  300. package/server/{session-history-C_EMhIIF.js → session-history-Bta5l9jY.js} +5 -5
  301. package/server/{settings-DejgzzLs.js → settings-Ce8B1daF.js} +2 -2
  302. package/server/{settings-BLbcDqUp.js → settings-E3FnEIUx.js} +3 -3
  303. package/server/settings-eOOJpxi_.js +2 -0
  304. package/server/{shadow-engineering-D8R9I8Yl.js → shadow-engineering-Mt9nJO4i.js} +3 -3
  305. package/server/{shadow-state-C0Af4clN.js → shadow-state-Bzj_AZCV.js} +1 -1
  306. package/server/{shadow-state-fzIqIMDD.js → shadow-state-DrkhoVSx.js} +2 -2
  307. package/server/{shadow-utils-Ugca_9ND.js → shadow-utils-H1GfqP06.js} +2 -2
  308. package/server/{ship-log-VAv-lHrF.js → ship-log-CFUIo4PR.js} +1 -1
  309. package/server/{smart-compaction-BcYY_Suf.js → smart-compaction-DSTq-Wua.js} +1 -1
  310. package/server/{smart-compaction-B2Xu5XEb.js → smart-compaction-Hzp3KCJX.js} +7 -7
  311. package/server/{spawn-planning-session-Dsv-350T.js → spawn-planning-session-C0uSA2SL.js} +2 -2
  312. package/server/{spawn-planning-session-DhCoBPct.js → spawn-planning-session-DN4son31.js} +23 -21
  313. package/server/{specialist-completion-z6v3ZqJE.js → specialist-completion-Cf6tpIh1.js} +1 -1
  314. package/server/{specialist-context-CrA5azkJ.js → specialist-context-DEUEkjIQ.js} +5 -5
  315. package/server/{specialist-handoff-logger-CmpZYJMB.js → specialist-handoff-logger-D_LmQDj3.js} +2 -2
  316. package/server/{specialist-logs-BorrIu0x.js → specialist-logs-7Ynue0R7.js} +3 -3
  317. package/server/{specialists-ZdrifiKx.js → specialists-CQwBEGlD.js} +1 -1
  318. package/server/{specialists-2yLmqph9.js → specialists-DAjPgYs_.js} +504 -238
  319. package/server/{specialists-Dfx9_Wzb.js → specialists-Hr6iW9fU.js} +18 -18
  320. package/server/{specialists-CH6ah6D-.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-Dm_NV7f6.js → src-DQnkPN2i.js} +3 -3
  324. package/server/{src-B2e5rGu2.js → src-DhfDV0o4.js} +6 -6
  325. package/server/{stack-health-Bf2WdG4E.js → stack-health-D_iKwNRg.js} +107 -16
  326. package/server/stack-health-deVSdDwn.js +3 -0
  327. package/server/{stale-task-claims-D1Ll8fI5.js → stale-task-claims-BYJGqhLI.js} +5 -5
  328. package/server/{staleness-CuED1Psm.js → staleness-CopBDKnA.js} +1 -1
  329. package/server/{staleness-45qZ_a60.js → staleness-D8WeMUHd.js} +1 -1
  330. package/server/{state-home-B4EWfIxF.js → state-home-DjN8qduI.js} +24 -3
  331. package/server/{state-mapping-BEONzr8P.js → state-mapping-DlM7OYRW.js} +1 -1
  332. package/server/{state-migrate-Cd8BH33U.js → state-migrate-a2p1gtD7.js} +4 -4
  333. package/server/state-mirror-Cv_XgvT5.js +121 -0
  334. package/server/{stuck-remediation-ChcooZuk.js → stuck-remediation-CXJX_kki.js} +1 -1
  335. package/server/{stuck-remediation-DmY5UJLg.js → stuck-remediation-CbCRSz1v.js} +31 -732
  336. package/server/{substrate-bug-weights-service-BvTWrFUz.js → substrate-bug-weights-service-DxpopNd9.js} +3 -3
  337. package/server/{summary-fork--Jr8duYh.js → summary-fork-B61fjRJn.js} +2 -2
  338. package/server/{summary-fork-Ct514_Jl.js → summary-fork-B9pszUJN.js} +91 -10
  339. package/server/supervisor/{injection-budget-B3UyEONL.js → injection-budget-Ar7hgyJq.js} +1 -1
  340. package/server/supervisor/pty-supervisor.js +12 -3
  341. package/server/supervisor/{pty-token-CWRffcCa.js → pty-token-CXCFU0Z8.js} +1 -1
  342. package/server/{supervisor-B7BHGcNA.js → supervisor-BvnxbuuF.js} +6 -4
  343. package/server/supervisor-C69kpqvd.js +2 -0
  344. package/server/{swarm-readiness-MNE5O8hn.js → swarm-readiness-vTw1kqGa.js} +3 -3
  345. package/server/{system-prerequisites-Cin9ZgDx.js → system-prerequisites-LLzTEqsK.js} +3 -3
  346. package/server/{teardown-workspace-CvBpvc85.js → teardown-workspace-CqKKVJr1.js} +15 -15
  347. package/server/{test-agent-queue-DmSIqays.js → test-agent-queue-CWMq7oyG.js} +8 -7
  348. package/server/{test-verdict-BieVDAV1.js → test-verdict-NdtgRBuA.js} +1 -1
  349. package/server/{test-verdict-Cy2jJGTe.js → test-verdict-diIWE6hz.js} +15 -3
  350. package/server/{tldr-daemon-Ca0eovh3.js → tldr-daemon-B1Jhrtc8.js} +1 -1
  351. package/server/{tldr-daemon-IOssGwg7.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-B10VFNOD.js → token-Bgpjo3tE.js} +2 -2
  355. package/server/token-util-BsjFll-k.js +3 -0
  356. package/server/{token-util-CZ8WPtdk.js → token-util-BymbpkJp.js} +1 -1
  357. package/server/{tracker-config-CHbrjg6m.js → tracker-config-4DaKVTfc.js} +2 -2
  358. package/server/{tracker-utils-DZZq_C0R.js → tracker-utils-BDeAXC-q.js} +2 -2
  359. package/server/{traefik-connect-GHomyBaD.js → traefik-connect-CC5FyxYj.js} +1 -1
  360. package/server/{tunnel-Dz7y434T.js → tunnel-CDWkeceJ.js} +1 -1
  361. package/server/{tunnel-Bdyb-sNq.js → tunnel-CPf5M-Pc.js} +3 -3
  362. package/server/{typed-errors-Bn_2WRU7.js → typed-errors-9K7Dq_Vn.js} +1 -1
  363. package/server/{typed-errors-BR_RmPS_.js → typed-errors-DrS5fb5z.js} +1 -1
  364. package/server/{types-D2ETIB8T.js → types-DzlUKiuf.js} +4 -3
  365. package/server/{types-Dh6RI5Vj.js → types-kI9ik8XO.js} +1 -1
  366. package/server/{uat-promote-verification-DyvQXvIn.js → uat-promote-verification-c_pxoxEc.js} +5 -5
  367. package/server/{uat-train-Dv0Bxer7.js → uat-train-CWGxBdJO.js} +0 -0
  368. package/server/{uat-train-diX_7shd.js → uat-train-CfCYd2ve.js} +1 -1
  369. package/server/{validate-606KcYZC.js → validate-f3ItVCfm.js} +3 -3
  370. package/server/{validation-Cf7aaV5A.js → validation-5G_wQtea.js} +1 -1
  371. package/server/{validation-CnrDul1x.js → validation-7tSiCM82.js} +4 -4
  372. package/server/{verification-artifact-GOaj8u2s.js → verification-artifact-9h9dH8uX.js} +1 -1
  373. package/server/{verification-artifact-D4b-bio9.js → verification-artifact-C_4WJnf6.js} +1 -1
  374. package/server/{verification-runner-DiPaUP-C.js → verification-runner-BV5F6wrA.js} +1 -1
  375. package/server/{verification-runner-B5MVxDvU.js → verification-runner-D58KmBhK.js} +18 -38
  376. package/server/{vtt-parser-CMU5EZ5R.js → vtt-parser-2iT9OHa9.js} +1 -1
  377. package/server/{work-agent-prompt-Csb3fbVR.js → work-agent-prompt-D03s4DD1.js} +9 -9
  378. package/server/{workflows-D87ajwV6.js → workflows-BMBwLYPV.js} +281 -98
  379. package/server/workflows-BOmWGpIh.js +2 -0
  380. package/server/{workspace-iD8oULqu.js → workspace-BgflNCH0.js} +3 -3
  381. package/server/{workspace-AIOM7n00.js → workspace-Cn9ywfSW.js} +1 -1
  382. package/server/{workspace-anchor-drift-19cJ1bH5.js → workspace-anchor-drift-C8Fy3shi.js} +1 -1
  383. package/server/{workspace-anchor-drift-C3mK5wNI.js → workspace-anchor-drift-CMiNncwq.js} +5 -8
  384. package/server/{workspace-config-CJ7RqQiP.js → workspace-config-aUc2nIz6.js} +1 -1
  385. package/server/{workspace-manager-CXfrw4rR.js → workspace-manager-Bem7ZBs9.js} +521 -292
  386. package/server/workspace-manager-C0CpNh3t.js +3 -0
  387. package/server/{workspace-metadata-BuMRco5P.js → workspace-metadata-C5iSlPRo.js} +1 -1
  388. package/server/{workspace-metadata-eHSj_NsP.js → workspace-metadata-UKmTYmDQ.js} +2 -2
  389. package/server/{workspaces-DbtMX2TM.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-DyZJia9f.js +0 -3
  400. package/server/agents-Dnn4XgdB.js +0 -3
  401. package/server/archive-planning-BHCd_eL5.js +0 -2
  402. package/server/cli-D6mRfUE6.js +0 -3
  403. package/server/deacon-swarm-BkKR7SXu.js +0 -2
  404. package/server/delivery-C2M73sBg.js +0 -3
  405. package/server/dist-qcf9gAP0.js +0 -3
  406. package/server/event-store-5UKzh9Jf.js +0 -3
  407. package/server/forge-D647IMNa.js +0 -3
  408. package/server/fts-db-wROfFfje.js +0 -146
  409. package/server/hume-DtWN8oV5.js +0 -3
  410. package/server/inspect-agent-CPqXI81t.js +0 -2
  411. package/server/merge-ops-7QqziXAh.js +0 -2
  412. package/server/merge-rebase-B4pgzvQJ.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-BgW4lcIa.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-x6ztTQo4.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-D-wM9EfB.js +0 -44
  435. package/server/resume-DXIIfJNk.js +0 -3
  436. package/server/rollup-DxCjJaAM.js +0 -3
  437. package/server/settings-9jSGHBPY.js +0 -2
  438. package/server/specs-DKV3jIEs.js +0 -3
  439. package/server/stack-health-CoWAhA99.js +0 -3
  440. package/server/supervisor-CyR_mW5B.js +0 -2
  441. package/server/tmux-Ctk6RV5l.js +0 -3
  442. package/server/token-util-CrfQ2FKf.js +0 -3
  443. package/server/workflows-DN6NyVGd.js +0 -2
  444. package/server/workspace-manager-B38rFWA1.js +0 -3
@@ -1,55 +1,54 @@
1
1
  import { a as __toCommonJS } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { A as canUseHarnessSync, Cn as resolveStateReadHomeSync, D as resolveTieredExecutionEnabled, Fr as init_errors, Gn as init_projects, H as init_providers, I as UnknownModelError, M as init_harness_policy, Mn as findProjectByPathSync, O as resolveTieredExecutionEnabledForIssue, Sn as init_state_read_home, T as init_tier_table, Tr as FsError, U as piProviderForModel, V as getProviderForModelSync, Yn as listProjectsSync, ar as resolveProjectFromIssueSync, c as isClaudeCodeChannelsEnabled, ci as getOverdeckHome, di as packageRoot, ei as claudeSessionTranscriptExists, f as loadConfigSync, fi as resolveOhmypiExtensionPath, gr as init_issue_id, h as jsYaml, hn as init_state_plane, hr as extractPrefixSync, li as init_paths, m as init_js_yaml, t as init_config_yaml, ti as encodeClaudeProjectDir, tt as resolveModel, vn as parsePorcelainStatusPaths, vr as parseIssueIdSync, wn as shouldCommitLegacyWorkspaceArtifacts, zn as getProjectSync } from "./config-yaml-CxdwhAIA.js";
3
- import { n as emitActivityEntryDurable, o as init_activity_logger, r as emitActivityEntrySync } from "./activity-logger-CyteR4JO.js";
4
- import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-BDQDRopn.js";
5
- import { B as sendKeysAsync, D as killSession, H as sessionExists, J as init_pane_choice_menu, M as listSessionNames, N as listSessions, T as isHarnessProcessAlive, U as sessionExistsSync, V as sendRawKeystroke, W as setOption, X as paneHasBlockingChoiceMenu, at as buildChildEnvWithoutTmuxSync, g as findManagedServerPidSync, i as capturePane, m as exactPaneTarget, o as capturePaneText, ot as init_child_env, rt as BLANKED_PROVIDER_ENV, s as createSession, w as init_tmux } from "./tmux-CfDHob9M.js";
6
- import { a as init_event_store, n as getEventStore } from "./event-store-CrHcVC5_.js";
7
- import { N as normalizeChannelReplyPayload, T as DomainEvent, n as COMPOSER_COMMAND_MANIFEST, s as getHarnessBehavior, t as init_src } from "./src-B948bGVR.js";
8
- import { C as setReviewStatusSync, Q as stateToOverdeckParamsForDb, Y as init_agent_state_sync, d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, q as AGENT_COLUMNS_FOR_DB } from "./review-status-CwhA9wmd.js";
9
- import { a as EventStoreService, c as ReadModelService, d as getClosedIssueIdsForReadSource, f as init_read_model, i as init_issue_lifecycle, s as init_domain_services, t as IssueLifecycle } from "./issue-lifecycle-BXfzxFCD.js";
10
- import { n as logAgentLifecycleSync, t as init_persistent_logger } from "./persistent-logger-CBj016pT.js";
11
- import { d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-CtACUuVG.js";
12
- import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-CUerZqWd.js";
13
- import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-Aat8HfO_.js";
14
- import { $ as operatorInterventionEvent, $n as getAgentDir, An as getProviderExportsForModel, Ar as resolvePtySupervisorScriptPath, Bn as dismissDevChannelsDialog, Br as saveAgentRuntimeState, Dr as init_pty_token, Er as init_resume_contract, F as init_tier_escalation, G as resumeAgent, Gr as init_codex_auth, Gt as assertWorkspaceStackHealthyForSpawn, H as restartAgent, Ht as BRIDGE_TOKEN_HEADER, Ir as waitForReadySignal, Jt as init_spawn_prep, Lr as getAgentRuntimeState, Mn as init_provider_health, Mt as deliverAgentMessage, Nn as validateProviderHealth, Nr as normalizeAgentId, Nt as deliverAgentPermissionDecision, On as determineModel, Or as writePtyToken, P as decideEscalation, Q as init_operator_interventions, Qt as init_staffing, Rr as getAgentRuntimeStateSync, Rt as setAgentDeliveryMethod, Sr as writeAgentStateJsonSync, Tr as buildResumeContract, Un as writeChannelsBridgeMcpConfig, Ut as init_bridge_token, V as recoverAgent, Wr as checkCodexAuthStatus, Wt as writeBridgeTokenSync, X as messageAgent, Xt as transitionIssueToInProgress, Yn as clearAgentTroubled, _r as saveAgentStateSync, b as init_agents$1, bn as init_ohmypi_fifo, cn as getAgentRuntimeBaseCommand, dn as getProviderAuthMode, gn as waitForAcpHostReady, gr as saveAgentState, i as listRunningAgents, it as getSessionId, jr as clearReadySignal, kr as init_pty_supervisor_locate, nn as resolveStaffing, nt as getLatestSessionId, ot as saveSessionId, pn as init_runtime_command, pt as stopAgent, qn as clearAgentPaused, r as listAgentStates, rr as getAgentStateSync, rt as getLatestSessionIdSync, sn as getAcpLauncherFields, tn as resolveIssueWorkModel, tr as getAgentState, tt as getActivity, ur as markAgentStoppedState, vn as init_pi_fifo, vr as setAgentPaused, xn as ohmypiFifoPaths, xr as wipeAgentStateDirs, yn as piFifoPaths } from "./queries-DCX27GRr.js";
15
- import { a as performHandoff, i as checkAllTriggers, s as getAgentHealth, t as getCloisterService } from "./service-BzFG0Us_.js";
16
- import { t as init_behavior } from "./behavior-B7biGtFT.js";
17
- import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-CHbrjg6m.js";
18
- import { n as init_issue_service_singleton, r as issue_service_singleton_exports } from "./issue-service-singleton-F3A5VP6M.js";
19
- import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-BG6yQKNL.js";
20
- import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, p as init_types } from "./types-D2ETIB8T.js";
21
- import { l as resolveWorkspaceRepoRootsSync, o as resolvePrimaryWorkspaceRepoDirSync, r as init_project_repos } from "./project-repos-BOpBzkO6.js";
22
- import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-DOgGnpIv.js";
23
- import { f as readTierOverrides, g as serializeXBriefDocument, h as recordTierPromotion, m as readWorkspacePlanSync, o as init_io, r as findPlan, u as readPlan } from "./io-C0NV7y6C.js";
24
- import { B as removeFavorite, E as hasOtherActiveConversationOnTmuxSession, F as markConversationEnded, G as setConversationHarness, K as setConversationModel, M as listConversations, P as markConversationActive, Q as updateConversationDeliveryMethod, S as getConversationByName, W as setConversationEffort, g as backfillConversationModel, h as archiveConversation, k as init_conversations, nt as updateLastAttached, rt as updateSpawnError, x as getConversationById, y as createConversation } from "./conversations-D7lR670u.js";
25
- import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-DhswNiXx.js";
26
- import { C as init_launcher_generator, D as requireModelOverrideSync, E as normalizeModelOverrideSync, S as generateLauncherScriptSync, T as init_model_validation, w as MODEL_ID_PATTERN, x as normalizeFlywheelRunId, y as init_provenance } from "./auto-spawn-consent-BooqhC3L.js";
27
- import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-DYVLnX9t.js";
28
- import { E as init_layers, I as workspaceContextFile, k as piGlobalContextFile } from "./assemble-DsqK9OAq.js";
29
- import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-CnBHpd57.js";
30
- import { a as getWorkspaceStackHealth, s as init_stack_health } from "./stack-health-Bf2WdG4E.js";
31
- import { l as init_dag, o as getDispatchableItems } from "./dag-5QlmH0oC.js";
32
- import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-BVj6sI8m.js";
33
- import { a as loadCloisterConfigSync, r as init_config } from "./config-ktAVnp4s.js";
34
- import { c as isStateMigrated, o as init_state_home } from "./state-home-B4EWfIxF.js";
35
- import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-1XSeczTr.js";
36
- import { _ as init_codex_conversation_parser, b as parseAcpConversationMessages, c as parseEntireConversation, d as init_pi_conversation_parser, g as parseOhmypiConversationMessages, m as init_ohmypi_conversation_parser, p as parsePiConversationMessages, t as init_conversation_service, v as parseCodexConversationMessages, y as init_acp_conversation_parser } from "./conversation-service-CZiUE8Uw.js";
37
- import { _ as normalizeAwaitingInputPrompt, d as getAgentPendingQuestions$1, f as getAgentWorkspace$1, h as detectAwaitingInputForAgent, m as scanPendingInputsPromise, o as getRuntimeForAgent, p as isBlockedOnPendingInput, s as computeAgentEnrichment, u as getAgentJsonlPath$1, v as parseCodexApprovalPrompt } from "./stuck-remediation-DmY5UJLg.js";
38
- import { B as getBook, H as liveOrderIssueLookup, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-CTVY3yCG.js";
39
- import { Bt as getSystemHealthSnapshot, Rt as getResourceConfig, jt as classifyMemoryPressure } from "./deacon-B1LD5cJU.js";
40
- import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-CXfrw4rR.js";
41
- import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-BXiGANOh.js";
42
- import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-nXEKoxI7.js";
43
- import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-eHSj_NsP.js";
44
- import { basename, delimiter, dirname, isAbsolute, join, resolve } from "node:path";
2
+ import { At as isGeneratedGitHookPath, Bt as resolveStateReadHomeSync, D as resolveTieredExecutionEnabled, Fn as parseIssueIdSync, Ft as parsePorcelainStatusPaths, Gn as UnknownModelError, Mn as extractPrefixSync, Mt as isOverdeckWorkspaceRuntimePath, Nn as init_issue_id, O as resolveTieredExecutionEnabledForIssue, Qn as piProviderForModel, Sn as resolveProjectFromIssueSync, T as init_tier_table, Vn as init_harness_policy, Vt as shouldCommitLegacyWorkspaceArtifacts, Xn as getProviderForModelSync, Yt as findProjectByPathSync, Zn as init_providers, _i as packageRoot, c as isClaudeCodeChannelsEnabled, cn as init_projects, dr as resolveModel, f as loadConfigSync, fn as listProjectsSync, h as jsYaml, hi as init_paths, kt as init_state_plane, m as init_js_yaml, mi as getOverdeckHome, nn as getProjectSync, oi as claudeSessionTranscriptExists, si as encodeClaudeProjectDir, t as init_config_yaml, vi as resolveOhmypiExtensionPath, zn as canUseHarnessSync, zt as init_state_read_home } from "./config-yaml-BSCqwmX0.js";
3
+ import { a as emitActivityEntrySync, c as init_activity_logger, n as emitActivityEntryDurable } from "./activity-logger-Co5qljIj.js";
4
+ import { d as getOverdeckDatabaseSync, f as init_infra } from "./infra-CTrmVqc_.js";
5
+ import { B as sendRawKeystroke, C as init_tmux, E as killSession, H as sessionExistsSync, J as paneChoiceMenuSignature, K as buildChoiceKeystrokes, M as listSessions, U as setOption, V as sessionExists, X as parsePaneChoiceMenu, Y as paneHasBlockingChoiceMenu, a as capturePaneText, at as init_child_env, h as findManagedServerPidSync, it as buildChildEnvWithoutTmuxSync, j as listSessionNames, nt as BLANKED_PROVIDER_ENV, o as createSession, p as exactPaneTarget, q as init_pane_choice_menu, r as capturePane, w as isHarnessProcessAlive, z as sendKeysAsync } from "./tmux-CImZaX4q.js";
6
+ import { a as getWorkspaceForIssue, o as init_resolver } from "./resolver-BvHd6RE4.js";
7
+ import { a as init_event_store, n as getEventStore } from "./event-store-D_AR-Y78.js";
8
+ import { N as normalizeChannelReplyPayload, T as DomainEvent, n as COMPOSER_COMMAND_MANIFEST, s as getHarnessBehavior, t as init_src } from "./src-BYdwL_n-.js";
9
+ import { C as setReviewStatusSync, Q as init_agent_state_sync, X as AGENT_COLUMNS_FOR_DB, d as getReviewStatusSync, h as loadReviewStatuses, o as clearWorkspaceStuck, p as init_review_status, tt as stateToOverdeckParamsForDb } from "./review-status-CKLk5aZ-.js";
10
+ import { a as EventStoreService, c as ReadModelService, d as getClosedIssueIdsForReadSource, f as init_read_model, i as init_issue_lifecycle, s as init_domain_services, t as IssueLifecycle } from "./issue-lifecycle-BXUqaHzF.js";
11
+ import { n as logAgentLifecycleSync, t as init_persistent_logger } from "./persistent-logger-s8cbpFNV.js";
12
+ import { d as isTerminalIssueStage, o as init_agents, u as getIssueStageSync } from "./agents-Dls7tfJH.js";
13
+ import { n as ensureSessionContextBriefingFile, r as init_briefing_freshness } from "./briefing-freshness-3PNmL_p3.js";
14
+ import { o as getPricingSync, s as init_cost, t as calculateCostSync } from "./cost-CpFDrJUS.js";
15
+ import { $ as scanPendingInputsPromise, $r as waitForReadySignal, An as init_runtime_command, Cn as getAcpLauncherFields, Dr as markAgentStoppedState, F as init_tier_escalation, Fn as init_pi_fifo, Fr as setAgentPaused, G as computeAgentEnrichment, Gn as determineModel, Gr as writePtyToken, H as restartAgent, Hr as buildResumeContract, In as piFifoPaths, J as getAgentJsonlPath$1, Jr as clearReadySignal, Jt as deliverAgentPermissionDecision, Kr as init_pty_supervisor_locate, Ln as init_ohmypi_fifo, Nn as waitForAcpHostReady, Nr as saveAgentState, On as getProviderAuthMode, Ot as stopAgent, P as decideEscalation, Pn as waitForPromptReady, Pr as saveAgentStateSync, Q as isBlockedOnPendingInput, Rn as ohmypiFifoPaths, Rr as wipeAgentStateDirs, U as detectPendingOperatorDecision, Ur as init_resume_contract, V as recoverAgent, W as init_pending_decision_gate, Wr as init_pty_token, X as getAgentWorkspace$1, Xn as validateProviderHealth, Xr as normalizeAgentId, Y as getAgentPendingQuestions$1, Yn as init_provider_health, Z as init_agent_enrichment, _n as resolveIssueWorkModel, _t as getActivity, an as init_bridge_token, b as init_agents$1, br as getAgentStateSync, bt as getSessionId, ci as init_codex_auth, ei as getAgentRuntimeState, en as setAgentDeliveryMethod, et as detectAwaitingInputForAgent, fn as transitionIssueToInProgress, fr as clearAgentTroubled, ft as messageAgent, gr as getAgentDir, ht as operatorInterventionEvent, i as listRunningAgents, in as BRIDGE_TOKEN_HEADER, it as parseCodexApprovalPrompt, mn as init_staffing, mt as init_operator_interventions, nt as init_agent_input_detection, on as writeBridgeTokenSync, or as writeChannelsBridgeMcpConfig, qn as getProviderExportsForModel, qr as resolvePtySupervisorScriptPath, qt as deliverAgentMessage, r as listAgentStates, ri as saveAgentRuntimeState, rr as dismissDevChannelsDialog, rt as normalizeAwaitingInputPrompt, si as checkCodexAuthStatus, sn as assertWorkspaceStackHealthyForSpawn, st as resumeAgent, ti as getAgentRuntimeStateSync, un as init_spawn_prep, ur as clearAgentPaused, vn as resolveStaffing, vr as getAgentState, vt as getLatestSessionId, wn as getAgentRuntimeBaseCommand, xt as saveSessionId, yt as getLatestSessionIdSync, zr as writeAgentStateJsonSync } from "./queries-DVpl1vsU.js";
16
+ import { a as performHandoff, i as checkAllTriggers, s as getAgentHealth, t as getCloisterService } from "./service-BFFkGsG4.js";
17
+ import { t as init_behavior } from "./behavior-DIMQMRzs.js";
18
+ import { a as init_tracker_config, t as getGitHubConfig } from "./tracker-config-4DaKVTfc.js";
19
+ import { n as init_issue_service_singleton, r as issue_service_singleton_exports } from "./issue-service-singleton-BPNEXczv.js";
20
+ import { o as getInternalTokenSync, s as init_internal_token } from "./internal-token-AvXePaQT.js";
21
+ import { a as PAN_DIRNAME, i as PAN_CONTINUE_FILENAME, m as init_types } from "./types-DzlUKiuf.js";
22
+ import { i as init_project_repos, s as resolvePrimaryWorkspaceRepoDirSync, u as resolveWorkspaceRepoRootsSync } from "./project-repos-BAqDwtvi.js";
23
+ import { a as generateXBriefFilename, o as init_lifecycle } from "./lifecycle-D2X3al0D.js";
24
+ import { C as init_specs, O as writeSpecForIssue, d as readPlan, g as recordTierPromotion, h as readWorkspacePlanSync, p as readTierOverrides, r as findPlan, s as init_io } from "./io-mxOWMZ7I.js";
25
+ import { B as removeFavorite, E as hasOtherActiveConversationOnTmuxSession, F as markConversationEnded, G as setConversationHarness, K as setConversationModel, M as listConversations, P as markConversationActive, Q as updateConversationDeliveryMethod, S as getConversationByName, W as setConversationEffort, g as backfillConversationModel, h as archiveConversation, k as init_conversations, nt as updateLastAttached, rt as updateSpawnError, x as getConversationById, y as createConversation } from "./conversations-B4rxz-Wl.js";
26
+ import { n as recordFeatureRegistryLifecycle, t as init_feature_registry_population } from "./feature-registry-population-DWGBKyWd.js";
27
+ import { C as generateLauncherScriptSync, D as normalizeModelOverrideSync, E as init_model_validation, O as requireModelOverrideSync, S as normalizeFlywheelRunId, T as MODEL_ID_PATTERN, b as init_provenance, w as init_launcher_generator } from "./auto-spawn-consent-lXqRJ1Dr.js";
28
+ import { a as init_claude_permissions, o as resolvePermissionModeSync, r as getClaudePermissionFlagsStringSync, t as BYPASS_PERMISSION_MODE } from "./claude-permissions-Cn0dIu2i.js";
29
+ import { E as init_layers, I as workspaceContextFile, k as piGlobalContextFile } from "./assemble-BTCmbcfH.js";
30
+ import { i as prepareHarnessLaunch, r as init_harness_binary } from "./harness-binary-BHxWf_sX.js";
31
+ import { c as init_stack_health, o as getWorkspaceStackHealth } from "./stack-health-D_iKwNRg.js";
32
+ import { l as init_dag, o as getDispatchableItems } from "./dag-BYiFMqpU.js";
33
+ import { n as resolveHarness, t as init_harness_resolve } from "./harness-resolve-bj9WMABA.js";
34
+ import { a as loadCloisterConfigSync, r as init_config } from "./config-DvM8jtQK.js";
35
+ import { c as isStateMigrated, o as init_state_home } from "./state-home-DjN8qduI.js";
36
+ import { a as init_lifecycle_io, c as updatePlanStatus, s as transitionXBriefOnMain } from "./lifecycle-io-NPm1YtIG.js";
37
+ import { S as parseAcpConversationMessages, b as parseCodexConversationMessages, c as parseEntireConversation, g as init_ohmypi_conversation_parser, h as parsePiConversationMessages, p as init_pi_conversation_parser, t as init_conversation_service, v as parseOhmypiConversationMessages, x as init_acp_conversation_parser, y as init_codex_conversation_parser } from "./conversation-service-BufdtnZF.js";
38
+ import { B as getBook, H as liveOrderIssueLookup, T as resolveLiveFlywheelRunId, w as readFlywheelLaunchMetadata, y as getFlywheelRunDir, z as computeBookProgress } from "./flywheel-TacAI9MA.js";
39
+ import { Bt as getSystemHealthSnapshot, Rt as getResourceConfig, jt as classifyMemoryPressure } from "./deacon-HdEh0Esp.js";
40
+ import { o as stopWorkspaceDocker, r as init_workspace_manager } from "./workspace-manager-Bem7ZBs9.js";
41
+ import { a as init_jsonl_parser, o as normalizeModelName } from "./jsonl-parser-CgYWQ20q.js";
42
+ import { o as getRuntimeForAgent } from "./stuck-remediation-CbCRSz1v.js";
43
+ import { r as init_in_flight_guard, t as createInFlightGuard } from "./in-flight-guard-CG2Eo-rr.js";
44
+ import { a as loadWorkspaceMetadataSync } from "./workspace-metadata-UKmTYmDQ.js";
45
+ import { basename, delimiter, dirname, isAbsolute, join, resolve, sep } from "node:path";
45
46
  import { Cause, Data, Effect, Layer, Option, Schema, Stream } from "effect";
46
- import { join as join$1 } from "path";
47
47
  import { homedir, networkInterfaces } from "node:os";
48
48
  import { createReadStream, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync } from "node:fs";
49
49
  import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
50
50
  import { access, appendFile, chmod, lstat, mkdir, open, readFile, readdir, realpath, rename, rm, stat as stat$1, writeFile } from "node:fs/promises";
51
51
  import { randomUUID } from "crypto";
52
- import { mkdir as mkdir$1, writeFile as writeFile$1 } from "fs/promises";
53
52
  import { exec, execFile, spawn } from "node:child_process";
54
53
  import { promisify } from "node:util";
55
54
  import { createHash as createHash$1, createHmac, randomBytes, randomUUID as randomUUID$1, timingSafeEqual } from "node:crypto";
@@ -59,7 +58,6 @@ import { request } from "node:http";
59
58
  import * as Result$1 from "effect/Result";
60
59
  //#region http-helpers.ts
61
60
  init_paths();
62
- init_errors();
63
61
  /**
64
62
  * Workaround for Effect 4.0.0-beta.45 bug where HttpServerResponse.json()
65
63
  * creates a response without a proper body._tag, causing NodeHttpServer to crash
@@ -81,18 +79,19 @@ function jsonStringResponse(json, options) {
81
79
  }
82
80
  //#endregion
83
81
  //#region ../../lib/default-cwd.ts
84
- init_activity_logger();
85
- init_issue_id();
86
- init_projects();
87
82
  init_providers();
88
83
  init_harness_policy();
84
+ init_issue_id();
85
+ init_projects();
89
86
  init_tier_table();
90
87
  init_js_yaml();
91
88
  init_config_yaml();
89
+ init_activity_logger();
92
90
  init_child_env();
93
91
  init_pane_choice_menu();
94
92
  init_tmux();
95
93
  init_infra();
94
+ init_resolver();
96
95
  init_event_store();
97
96
  init_src();
98
97
  init_agent_state_sync();
@@ -104,9 +103,11 @@ init_domain_services();
104
103
  init_cost();
105
104
  init_behavior();
106
105
  init_tracker_config();
106
+ init_types();
107
107
  init_project_repos();
108
108
  init_lifecycle();
109
109
  init_review_status();
110
+ init_specs();
110
111
  init_io();
111
112
  /**
112
113
  * Resolve the default cwd used when no project is selected — the "devroot"
@@ -217,6 +218,9 @@ init_harness_resolve();
217
218
  init_bridge_token();
218
219
  init_operator_interventions();
219
220
  init_lifecycle_io();
221
+ init_agent_input_detection();
222
+ init_agent_enrichment();
223
+ init_pending_decision_gate();
220
224
  init_agents$1();
221
225
  let cachedTrustedOrigins;
222
226
  function addTrustedOrigin(origins, raw) {
@@ -401,7 +405,6 @@ async function waitForSessionRespawn(sessionName, timeoutMs) {
401
405
  //#region routes/dashboard-auth.ts
402
406
  init_state_read_home();
403
407
  init_state_plane();
404
- init_types();
405
408
  init_issue_lifecycle();
406
409
  init_codex_auth();
407
410
  init_config();
@@ -798,11 +801,12 @@ async function readRecordedState(agentId, opts) {
798
801
  */
799
802
  async function resolveAgentHarness(agentId, opts = {}) {
800
803
  const recorded = (await readRecordedState(agentId, opts)).harness;
801
- if (recorded === "codex" || recorded === "pi" || recorded === "ohmypi" || recorded === "acp") return recorded;
804
+ if (recorded === "codex" || recorded === "pi" || recorded === "ohmypi" || recorded === "acp" || recorded === "kimi-code") return recorded;
802
805
  if (await agentHasClaudeTranscript(agentId, opts)) return recorded ?? "claude-code";
803
806
  if (await resolveAcpTranscriptPath(agentId, opts)) return "acp";
804
807
  if (await resolveCodexRolloutPath(agentId, opts)) return "codex";
805
808
  if (await resolvePiSessionPath(agentId, opts)) return "ohmypi";
809
+ if (await resolveKimiWirePath(agentId, opts)) return "kimi-code";
806
810
  return recorded;
807
811
  }
808
812
  /**
@@ -830,7 +834,7 @@ async function resolveCodexRolloutPath(agentId, opts = {}) {
830
834
  const agentDir = join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId);
831
835
  const codexHome = join(agentDir, "codex-home");
832
836
  if (!await pathExists$1(codexHome)) return null;
833
- const { findRolloutPath, findLatestRollout } = await import("./codex-rnJN3v3_.js");
837
+ const { findRolloutPath, findLatestRollout } = await import("./codex-B3n_rkwn.js");
834
838
  const threadId = (await readOptional(join(agentDir, "codex-thread-id")))?.trim();
835
839
  if (threadId) {
836
840
  const rollout = findRolloutPath(codexHome, threadId);
@@ -844,6 +848,24 @@ async function resolveAcpTranscriptPath(agentId, opts = {}) {
844
848
  return await pathExists$1(transcriptPath) ? transcriptPath : null;
845
849
  }
846
850
  /**
851
+ * Resolve the native Kimi Code CLI wire.jsonl for a kimi-code-harness agent
852
+ * (PAN-1837 wi8a). Fast path: the per-agent kimi-session-id (persisted by
853
+ * wi5's spawnAgent) maps directly to
854
+ * `<kimiHome>/sessions/<workDirKey>/<sessionId>/agents/main/wire.jsonl`.
855
+ * Fallback (no captured id): the newest session directory by wire.jsonl mtime
856
+ * under the workspace's workDirKey bucket — same shape as the codex/pi lazy
857
+ * fallbacks above, since Kimi may not have finished writing its first turn
858
+ * when the id was captured.
859
+ */
860
+ async function resolveKimiWirePath(agentId, opts = {}) {
861
+ const workspace = opts.workspaceOverride ?? (await readRecordedState(agentId, opts)).workspace;
862
+ if (!workspace) return null;
863
+ const sessionId = (await readOptional(join(opts.agentsDirOverride ?? join(getOverdeckHome(), "agents"), agentId, "kimi-session-id")))?.trim() || null;
864
+ const kimiHome = opts.kimiHomeOverride ?? join(homedir(), ".kimi-code");
865
+ const { findKimiWirePathAsync } = await import("./kimi-code-D_Ppt82c.js");
866
+ return findKimiWirePathAsync(kimiHome, workspace, sessionId);
867
+ }
868
+ /**
847
869
  * Resolve the pi/kimi session JSONL (PAN-1908). Pi writes its session transcript
848
870
  * as `<iso-ts>_<session-id>.jsonl` either in the agent dir's `sessions/` subdir
849
871
  * (conversations) OR in the agent dir root (work agents) — so check both. The dir
@@ -893,6 +915,7 @@ async function resolveJsonlPath(agentId, workspacePath, opts = {}) {
893
915
  if (behavior.transcriptKind === "codex-rollout-jsonl") return resolveCodexRolloutPath(agentId, opts);
894
916
  if (behavior.transcriptKind === "ohmypi-jsonl") return resolvePiSessionPath(agentId, opts);
895
917
  if (behavior.transcriptKind === "acp-jsonl") return resolveAcpTranscriptPath(agentId, opts);
918
+ if (behavior.transcriptKind === "kimi-wire-jsonl") return resolveKimiWirePath(agentId, opts);
896
919
  const claudeSessionId = await resolveClaudeSessionId(agentId, opts);
897
920
  if (!claudeSessionId) {
898
921
  logTranscriptResolution(agentId, `missing-session-id:${harness ?? "unknown"}`, `failed harness=${harness ?? "unknown"} reason=no-session-id checked=session.id,sessions.json,runtime-state`, opts);
@@ -1533,6 +1556,7 @@ async function runDetachedCommand(argv, dependencies = {}) {
1533
1556
  //#region routes/agents/shared.ts
1534
1557
  init_paths();
1535
1558
  init_agents$1();
1559
+ init_agent_enrichment();
1536
1560
  init_activity_logger();
1537
1561
  init_tmux();
1538
1562
  const execAsync$2 = promisify(exec);
@@ -1986,6 +2010,7 @@ const getAgentPendingQuestions = getAgentPendingQuestions$1;
1986
2010
  //#endregion
1987
2011
  //#region routes/agents/listing.ts
1988
2012
  init_agents$1();
2013
+ init_agent_enrichment();
1989
2014
  init_tmux();
1990
2015
  /**
1991
2016
  * PAN-3070 — the health status a live agent row reports.
@@ -2255,7 +2280,7 @@ const getAgentOutputRoute = HttpRouter.add("GET", "/api/agents/:id/output", http
2255
2280
  } catch {}
2256
2281
  let stdout;
2257
2282
  if (isRemote && vmName) {
2258
- const { getRemoteAgentOutput } = await import("./remote-agents-kwsEZvXu.js");
2283
+ const { getRemoteAgentOutput } = await import("./remote-agents-BIIoc5pD.js");
2259
2284
  stdout = await getRemoteAgentOutput(id, vmName, parseInt(String(lines), 10) || 100);
2260
2285
  } else stdout = await Effect.runPromise(capturePane(id, parseInt(String(lines), 10) || 100));
2261
2286
  if (!stdout || stdout.trim() === "" || stdout.trim() === "Session not found") {
@@ -3086,7 +3111,7 @@ async function cleanupConversationAttachments(name) {
3086
3111
  * sessions that the lifecycle poller missed. */
3087
3112
  async function cleanupOrphanedConversationAttachments() {
3088
3113
  try {
3089
- const { listConversations } = await import("./conversations-DXl5YTf4.js");
3114
+ const { listConversations } = await import("./conversations-D1bwxQMy.js");
3090
3115
  const convNames = new Set(listConversations().map((c) => c.name));
3091
3116
  const root = getConversationAttachmentsRoot();
3092
3117
  await runInBatches((await readdir(root, { withFileTypes: true })).filter((entry) => entry.isDirectory() && !convNames.has(entry.name)).map((entry) => join(root, entry.name)), 10, (path) => rm(path, {
@@ -3267,6 +3292,24 @@ async function removeConversationAttachment(name, attachmentPath) {
3267
3292
  return true;
3268
3293
  }
3269
3294
  //#endregion
3295
+ //#region ../../lib/overdeck/resume-contract-delivery.ts
3296
+ init_agents$1();
3297
+ init_tmux();
3298
+ async function deliverResumeContractUnlessGated(tmuxSession, contract, caller, method) {
3299
+ const resumeGatePane = await capturePaneText(tmuxSession, 90).catch(() => "");
3300
+ if (resumeGatePane && paneHasBlockingChoiceMenu(resumeGatePane)) {
3301
+ console.log(`[conversations] resume contract skipped for ${tmuxSession} — the harness is showing a blocking choice menu; the operator answers it`);
3302
+ return "skipped-gated";
3303
+ }
3304
+ try {
3305
+ await deliverAgentMessage(tmuxSession, contract, caller, method);
3306
+ return "delivered";
3307
+ } catch (err) {
3308
+ console.error(`[conversations] resume contract delivery failed for ${tmuxSession}:`, err instanceof Error ? err.message : String(err));
3309
+ return "failed";
3310
+ }
3311
+ }
3312
+ //#endregion
3270
3313
  //#region ../../lib/overdeck/conversation-runtime.ts
3271
3314
  init_projects();
3272
3315
  init_tmux();
@@ -3376,7 +3419,7 @@ async function resolveAllowedHarness(requested, model) {
3376
3419
  if (!model) return "claude-code";
3377
3420
  return resolveHarness({
3378
3421
  model,
3379
- explicit: requested === "ohmypi" || requested === "claude-code" || requested === "codex" || requested === "acp" ? requested : void 0
3422
+ explicit: requested === "ohmypi" || requested === "claude-code" || requested === "codex" || requested === "acp" || requested === "kimi-code" ? requested : void 0
3380
3423
  });
3381
3424
  }
3382
3425
  async function isInsideGitWorkTree(dir) {
@@ -3465,6 +3508,8 @@ async function waitForConversationRuntimeReady(tmuxSession, harness, mode) {
3465
3508
  const transcriptKind = getHarnessBehavior(harness).transcriptKind;
3466
3509
  if (transcriptKind === "ohmypi-jsonl") {
3467
3510
  if (!await waitForPiTuiReady(tmuxSession)) throw new Error(`Pi (ohmypi) did not become interactive in ${tmuxSession} within the startup window — MCP server connections are likely still in progress. Retry once MCP servers finish connecting, or check ~/.claude/mcp.json for a slow/hanging server.`);
3511
+ } else if (transcriptKind === "kimi-wire-jsonl") {
3512
+ if (!await waitForPromptReady(tmuxSession, "kimi-code", 30)) throw new Error(`Kimi Code did not become interactive in ${tmuxSession} within the startup window.`);
3468
3513
  } else if (transcriptKind !== "codex-rollout-jsonl" && mode === "spawn") {
3469
3514
  await waitForClaudeReady(tmuxSession);
3470
3515
  console.log(`[conversations] Claude ready in ${tmuxSession}`);
@@ -3477,7 +3522,7 @@ async function handleConversationSwitchModel(name, body) {
3477
3522
  const currentHarness = conv.harness ?? "claude-code";
3478
3523
  const requestedHarness = body["harness"];
3479
3524
  let harness = currentHarness;
3480
- if (requestedHarness === "ohmypi" || requestedHarness === "pi" || requestedHarness === "claude-code" || requestedHarness === "codex" || requestedHarness === "acp") {
3525
+ if (requestedHarness === "ohmypi" || requestedHarness === "pi" || requestedHarness === "claude-code" || requestedHarness === "codex" || requestedHarness === "acp" || requestedHarness === "kimi-code") {
3481
3526
  const requestedRuntime = requestedHarness === "pi" ? "ohmypi" : requestedHarness;
3482
3527
  if (requestedRuntime !== currentHarness) {
3483
3528
  const policyModel = model ?? conv.model ?? "";
@@ -3647,6 +3692,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3647
3692
  let piFields;
3648
3693
  let codexFields;
3649
3694
  let acpFields;
3695
+ let kimiCodeFields;
3650
3696
  let codexTransport;
3651
3697
  if (behavior.launchCommandKind === "acp-host") {
3652
3698
  if (!model) throw new Error("ACP conversation requires a model");
@@ -3664,7 +3710,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3664
3710
  runtimeCommand = await getAgentRuntimeBaseCommand(model, void 0, void 0, harness);
3665
3711
  const mode = resolvePermissionModeSync();
3666
3712
  if (!runtimeCommand.includes("--permission-mode")) runtimeCommand = `${runtimeCommand} --permission-mode ${mode === "auto" ? "auto" : BYPASS_PERMISSION_MODE}`;
3667
- providerExportsStr = (await getProviderExportsForModel(model)).trim();
3713
+ providerExportsStr = (await getProviderExportsForModel(model, harness)).trim();
3668
3714
  if (behavior.transcriptKind === "ohmypi-jsonl") {
3669
3715
  if (getProviderForModelSync(model).name === "openai") {
3670
3716
  const auth = await getOhmypiCodexAuthStatus({ refreshIfExpired: true });
@@ -3696,7 +3742,7 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3696
3742
  const codexApprovalPolicy = codexPermMode === "full-access" ? "never" : "on-request";
3697
3743
  const codexSandboxMode = codexPermMode === "full-access" ? "danger-full-access" : codexPermMode === "read-only" ? "read-only" : "workspace-write";
3698
3744
  const codexApprovalsReviewer = codexPermMode === "auto-review" ? "auto_review" : void 0;
3699
- const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-rnJN3v3_.js");
3745
+ const { initCodexHome, extractThreadIdFromRollout } = await import("./codex-B3n_rkwn.js");
3700
3746
  initCodexHome(codexHome, {
3701
3747
  trustedDir: cwd,
3702
3748
  approvalPolicy: codexApprovalPolicy,
@@ -3711,6 +3757,21 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3711
3757
  codexSessionDir: join(codexHome, "sessions"),
3712
3758
  resumeSessionId
3713
3759
  };
3760
+ } else if (behavior.launchCommandKind === "kimi-code-tui") {
3761
+ let kimiResumeSessionId;
3762
+ if (resume) {
3763
+ const pinnedId = await readFile(join(getOverdeckHome(), "agents", tmuxSession, "kimi-session-id"), "utf-8").then((value) => value.trim() || void 0).catch(() => void 0);
3764
+ if (pinnedId) {
3765
+ const { kimiSessionsRoot } = await import("./kimi-code-D_Ppt82c.js");
3766
+ if (await stat$1(join(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd), pinnedId, "agents", "main", "wire.jsonl")).then(() => true, () => false)) kimiResumeSessionId = pinnedId;
3767
+ }
3768
+ }
3769
+ kimiCodeFields = {
3770
+ harness: "kimi-code",
3771
+ kimiCodeModel: model,
3772
+ kimiCodeYolo: true,
3773
+ ...kimiResumeSessionId ? { resumeSessionId: kimiResumeSessionId } : {}
3774
+ };
3714
3775
  }
3715
3776
  }
3716
3777
  let launcherModel = model;
@@ -3726,71 +3787,90 @@ async function spawnConversationSession(tmuxSession, cwd, claudeSessionId, model
3726
3787
  await writePtyToken(tmuxSession);
3727
3788
  }
3728
3789
  let channelsBridgeMcpConfig;
3729
- if (!piFields && !codexFields && !acpFields && !plainFork && isClaudeCodeChannelsEnabled() && (!model || getProviderForModelSync(model).name === "anthropic") && process.env.CLAUDE_CODE_USE_BEDROCK !== "1" && process.env.CLAUDE_CODE_USE_VERTEX !== "1" && process.env.CLAUDE_CODE_USE_FOUNDRY !== "1" && process.env.OVERDECK_DOCKER_WORKSPACE !== "1" && process.env.PAN_DOCKER !== "1") {
3790
+ if (!piFields && !codexFields && !acpFields && !kimiCodeFields && !plainFork && isClaudeCodeChannelsEnabled() && (!model || getProviderForModelSync(model).name === "anthropic") && process.env.CLAUDE_CODE_USE_BEDROCK !== "1" && process.env.CLAUDE_CODE_USE_VERTEX !== "1" && process.env.CLAUDE_CODE_USE_FOUNDRY !== "1" && process.env.OVERDECK_DOCKER_WORKSPACE !== "1" && process.env.PAN_DOCKER !== "1") {
3730
3791
  channelsBridgeMcpConfig = join(stateDir, "agent-mcp.json");
3731
3792
  writeBridgeTokenSync(tmuxSession);
3732
3793
  await writeChannelsBridgeMcpConfig(channelsBridgeMcpConfig, tmuxSession);
3733
3794
  }
3734
- const launcherTmp = `${launcherScript}.${randomUUID$1()}.tmp`;
3735
- await writeFile(launcherTmp, generateLauncherScriptSync({
3736
- role: "work",
3737
- spawnMode: "conversation",
3738
- workingDir: cwd,
3739
- setTerminalEnv: true,
3740
- unsetProviderEnv: true,
3741
- overdeckEnv: {
3742
- ...issueId ? { issueId } : {},
3743
- ...piFields || codexFields || acpFields || useSupervisor ? { agentId: tmuxSession } : {}
3744
- },
3745
- extraEnvExports: [harnessLaunch.pathExport, `export OVERDECK_DASHBOARD_URL="http://127.0.0.1:${process.env["API_PORT"] ?? process.env["PORT"] ?? "3011"}"`],
3746
- providerExports: providerExportsStr || void 0,
3747
- trapHup: true,
3748
- baseCommand: runtimeCommand,
3749
- appendSystemPromptFiles: piFields ? await piConversationSystemPromptFiles(cwd) : codexFields || acpFields ? [] : await claudeConversationSystemPromptFiles(cwd),
3750
- model: launcherModel,
3751
- ...piFields ?? codexFields ?? acpFields ?? {
3752
- resumeSessionId: resume ? claudeSessionId : void 0,
3753
- sessionId: resume ? void 0 : claudeSessionId
3754
- },
3755
- extraArgs: !piFields && !acpFields && effort ? `--effort "${effort}"` : void 0,
3756
- keepAlive: true,
3757
- fileMode: 448,
3758
- channelsBridgeMcpConfig,
3759
- useSupervisor,
3760
- supervisorScriptPath
3761
- }), { mode: 448 });
3762
- await rename(launcherTmp, launcherScript);
3763
- try {
3764
- await Effect.runPromise(killSession(tmuxSession));
3765
- } catch {}
3766
- console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
3767
- try {
3768
- const { preTrustDirectory } = await import("./workspace-manager-B38rFWA1.js");
3769
- preTrustDirectory(cwd);
3770
- } catch {}
3771
- try {
3772
- await Effect.runPromise(createSession(tmuxSession, cwd, `bash ${shellQuote(launcherScript)}`, { env: {
3773
- ...BLANKED_PROVIDER_ENV,
3774
- TERM: "xterm-256color"
3775
- } }));
3776
- } catch (err) {
3777
- if (err?.code === "ENOENT") throw new Error("tmux is not installed. Install it with: brew install tmux (macOS) or sudo apt-get install tmux (Linux)");
3778
- throw err;
3779
- }
3780
- if (useSupervisor) await waitForPtySupervisorSocket(tmuxSession);
3781
- if (behavior.usesCodexHome && codexFields?.codexHome && codexTransport === "tui") {
3782
- const codexHomeDir = codexFields.codexHome;
3783
- (async () => {
3784
- try {
3785
- const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-rnJN3v3_.js");
3786
- const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
3787
- if (rollout) {
3788
- const threadId = extractThreadIdFromRollout(rollout);
3789
- if (threadId) writeThreadId(tmuxSession, threadId);
3790
- }
3791
- } catch {}
3792
- })();
3793
- }
3795
+ const launchTmuxAndCaptureSession = async () => {
3796
+ let kimiExistingSessionsBefore;
3797
+ if (kimiCodeFields && !kimiCodeFields.resumeSessionId) try {
3798
+ const { kimiSessionsRoot } = await import("./kimi-code-D_Ppt82c.js");
3799
+ kimiExistingSessionsBefore = new Set(await readdir(kimiSessionsRoot(join(homedir(), ".kimi-code"), cwd)));
3800
+ } catch {
3801
+ kimiExistingSessionsBefore = /* @__PURE__ */ new Set();
3802
+ }
3803
+ const launcherTmp = `${launcherScript}.${randomUUID$1()}.tmp`;
3804
+ await writeFile(launcherTmp, generateLauncherScriptSync({
3805
+ role: "work",
3806
+ spawnMode: "conversation",
3807
+ workingDir: cwd,
3808
+ setTerminalEnv: true,
3809
+ unsetProviderEnv: true,
3810
+ overdeckEnv: {
3811
+ ...issueId ? { issueId } : {},
3812
+ ...piFields || codexFields || acpFields || useSupervisor ? { agentId: tmuxSession } : {}
3813
+ },
3814
+ extraEnvExports: [harnessLaunch.pathExport, `export OVERDECK_DASHBOARD_URL="http://127.0.0.1:${process.env["API_PORT"] ?? process.env["PORT"] ?? "3011"}"`],
3815
+ providerExports: providerExportsStr || void 0,
3816
+ trapHup: true,
3817
+ baseCommand: runtimeCommand,
3818
+ appendSystemPromptFiles: piFields ? await piConversationSystemPromptFiles(cwd) : codexFields || acpFields || kimiCodeFields ? [] : await claudeConversationSystemPromptFiles(cwd),
3819
+ model: launcherModel,
3820
+ ...piFields ?? codexFields ?? acpFields ?? kimiCodeFields ?? {
3821
+ resumeSessionId: resume ? claudeSessionId : void 0,
3822
+ sessionId: resume ? void 0 : claudeSessionId
3823
+ },
3824
+ extraArgs: !piFields && !acpFields && !kimiCodeFields && effort ? `--effort "${effort}"` : void 0,
3825
+ keepAlive: true,
3826
+ fileMode: 448,
3827
+ channelsBridgeMcpConfig,
3828
+ useSupervisor,
3829
+ supervisorScriptPath
3830
+ }), { mode: 448 });
3831
+ await rename(launcherTmp, launcherScript);
3832
+ try {
3833
+ await Effect.runPromise(killSession(tmuxSession));
3834
+ } catch {}
3835
+ console.log(`[claude-invoke] purpose=conversation-session | model=${model || "default"} | source=conversations.ts:spawnConversationSession | session=${tmuxSession} | resume=${resume} | command="${runtimeCommand}"`);
3836
+ try {
3837
+ const { preTrustDirectory } = await import("./workspace-manager-C0CpNh3t.js");
3838
+ preTrustDirectory(cwd);
3839
+ } catch {}
3840
+ try {
3841
+ await Effect.runPromise(createSession(tmuxSession, cwd, `bash ${shellQuote(launcherScript)}`, { env: {
3842
+ ...BLANKED_PROVIDER_ENV,
3843
+ TERM: "xterm-256color"
3844
+ } }));
3845
+ } catch (err) {
3846
+ if (err?.code === "ENOENT") throw new Error("tmux is not installed. Install it with: brew install tmux (macOS) or sudo apt-get install tmux (Linux)");
3847
+ throw err;
3848
+ }
3849
+ if (useSupervisor) await waitForPtySupervisorSocket(tmuxSession);
3850
+ if (behavior.usesCodexHome && codexFields?.codexHome && codexTransport === "tui") {
3851
+ const codexHomeDir = codexFields.codexHome;
3852
+ (async () => {
3853
+ try {
3854
+ const { waitForCodexRollout, extractThreadIdFromRollout, writeThreadId } = await import("./codex-B3n_rkwn.js");
3855
+ const rollout = await waitForCodexRollout(codexHomeDir, 12e4);
3856
+ if (rollout) {
3857
+ const threadId = extractThreadIdFromRollout(rollout);
3858
+ if (threadId) writeThreadId(tmuxSession, threadId);
3859
+ }
3860
+ } catch {}
3861
+ })();
3862
+ }
3863
+ if (kimiCodeFields && kimiExistingSessionsBefore) {
3864
+ const { waitForNewKimiSessionAsync, writeKimiSessionId } = await import("./kimi-code-D_Ppt82c.js");
3865
+ const sessionId = await waitForNewKimiSessionAsync(join(homedir(), ".kimi-code"), cwd, kimiExistingSessionsBefore);
3866
+ if (!sessionId) throw new Error(`kimi-code session capture timed out for ${tmuxSession} — no new session directory appeared under the workspace bucket`);
3867
+ writeKimiSessionId(tmuxSession, sessionId);
3868
+ }
3869
+ };
3870
+ if (kimiCodeFields) {
3871
+ const { withKimiSessionCaptureLock } = await import("./kimi-code-D_Ppt82c.js");
3872
+ await withKimiSessionCaptureLock(join(homedir(), ".kimi-code"), cwd, launchTmuxAndCaptureSession);
3873
+ } else await launchTmuxAndCaptureSession();
3794
3874
  if (channelsBridgeMcpConfig) dismissDevChannelsDialog(tmuxSession).catch((err) => {
3795
3875
  const msg = err instanceof Error ? err.message : String(err);
3796
3876
  console.error(`[conversations] dismissDevChannelsDialog failed for ${tmuxSession}: ${msg}`);
@@ -3865,7 +3945,7 @@ async function handleConversationCreate(body, deps) {
3865
3945
  } catch (spawnErr) {
3866
3946
  const msg = spawnErr instanceof Error ? spawnErr.message : String(spawnErr);
3867
3947
  console.error(`[conversations] background spawn failed for ${tmuxSession}: ${msg}`);
3868
- if (harness === "acp") await stopConversationRuntime(conv, name);
3948
+ if (harness === "acp" || harness === "kimi-code") await stopConversationRuntime(conv, name);
3869
3949
  updateSpawnError(name, msg);
3870
3950
  getEventStore().emitOnly({
3871
3951
  type: "conversation.created",
@@ -3943,13 +4023,7 @@ async function handleConversationResume(name, body, deps) {
3943
4023
  await spawnConversationSession(conv.tmuxSession, conv.cwd, oldSessionId ?? randomUUID$1(), model, effort, conv.issueId ?? void 0, canResume, harness);
3944
4024
  await waitForTmuxSession(conv.tmuxSession);
3945
4025
  await waitForConversationRuntimeReady(conv.tmuxSession, harness, "respawn");
3946
- const resumeGatePane = await capturePaneText(conv.tmuxSession, 90).catch(() => "");
3947
- if (resumeGatePane && paneHasBlockingChoiceMenu(resumeGatePane)) console.log(`[conversations] resume contract skipped for ${name} — the harness is showing a blocking choice menu; the operator answers it`);
3948
- else try {
3949
- await deliverAgentMessage(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv));
3950
- } catch (err) {
3951
- console.error(`[conversations] resume contract delivery failed for ${name}:`, err instanceof Error ? err.message : String(err));
3952
- }
4026
+ await deliverResumeContractUnlessGated(conv.tmuxSession, `CONVERSATION RESUME: ${buildResumeContract(resumeCause)}`, "conversation-resume", resolveConversationDeliveryMethod(conv));
3953
4027
  markConversationActive(name);
3954
4028
  return jsonResponse({
3955
4029
  ...conv,
@@ -3960,7 +4034,7 @@ async function handleConversationResume(name, body, deps) {
3960
4034
  sessionAlive: true
3961
4035
  });
3962
4036
  } catch (error) {
3963
- if (harness === "acp") await stopConversationRuntime(conv, name);
4037
+ if (harness === "acp" || harness === "kimi-code") await stopConversationRuntime(conv, name);
3964
4038
  throw error;
3965
4039
  } finally {
3966
4040
  respawn.done();
@@ -4016,7 +4090,7 @@ async function handleConversationRestartAll(deps) {
4016
4090
  } catch (err) {
4017
4091
  const msg = err instanceof Error ? err.message : String(err);
4018
4092
  console.error(`[conversations] Failed to restart ${conv.name}:`, msg);
4019
- if (attemptedHarness === "acp") await stopConversationRuntime(conv, conv.name);
4093
+ if (attemptedHarness === "acp" || attemptedHarness === "kimi-code") await stopConversationRuntime(conv, conv.name);
4020
4094
  results.push({
4021
4095
  name: conv.name,
4022
4096
  model: conv.model,
@@ -4039,6 +4113,7 @@ async function handleConversationRestartAll(deps) {
4039
4113
  }
4040
4114
  //#endregion
4041
4115
  //#region ../../lib/overdeck/conversation-delivery.ts
4116
+ init_agent_input_detection();
4042
4117
  init_conversations();
4043
4118
  init_behavior();
4044
4119
  init_config_yaml();
@@ -4431,6 +4506,101 @@ function asRecord(value) {
4431
4506
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
4432
4507
  }
4433
4508
  //#endregion
4509
+ //#region ../../lib/session-pane-choice.ts
4510
+ init_pane_choice_menu();
4511
+ init_tmux();
4512
+ const PANE_CAPTURE_LINES = 90;
4513
+ const KEYSTROKE_GAP_MS = 60;
4514
+ const DELIVERY_CONFIRM_WAIT_MS = 700;
4515
+ async function captureSessionPaneChoice(sessionName, capture = capturePaneText) {
4516
+ let pane;
4517
+ try {
4518
+ pane = await capture(sessionName, PANE_CAPTURE_LINES);
4519
+ } catch {
4520
+ return null;
4521
+ }
4522
+ const menu = parsePaneChoiceMenu(pane);
4523
+ if (!menu) return null;
4524
+ return {
4525
+ signature: paneChoiceMenuSignature(menu),
4526
+ title: menu.title,
4527
+ contextLines: menu.contextLines,
4528
+ options: menu.options.map((option) => ({
4529
+ number: option.number,
4530
+ label: option.label,
4531
+ recommended: option.recommended
4532
+ })),
4533
+ selectedIndex: menu.selectedIndex,
4534
+ footerHint: menu.footerHint,
4535
+ confidence: menu.confidence
4536
+ };
4537
+ }
4538
+ async function answerSessionPaneChoice(sessionName, body, deps = {}) {
4539
+ try {
4540
+ const selectedIndex = Number(body.selectedIndex);
4541
+ const signature = typeof body.signature === "string" ? body.signature : "";
4542
+ if (!Number.isInteger(selectedIndex) || selectedIndex < 0 || selectedIndex > 8) return {
4543
+ body: { error: "selectedIndex must be an integer 0-8" },
4544
+ status: 400
4545
+ };
4546
+ if (!signature) return {
4547
+ body: { error: "signature is required" },
4548
+ status: 400
4549
+ };
4550
+ if (!await (deps.sessionExists ?? ((name) => Effect.runPromise(sessionExists(name))))(sessionName)) return {
4551
+ body: { error: "Conversation session is not running" },
4552
+ status: 409
4553
+ };
4554
+ const capture = deps.capture ?? capturePaneText;
4555
+ const sendKey = deps.sendKey ?? ((name, key) => Effect.runPromise(sendRawKeystroke(name, key, "pane-choice")));
4556
+ const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
4557
+ const menu = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
4558
+ if (!menu) return {
4559
+ body: {
4560
+ error: "The choice menu is no longer on screen",
4561
+ code: "menu-gone"
4562
+ },
4563
+ status: 409
4564
+ };
4565
+ if (paneChoiceMenuSignature(menu) !== signature) return {
4566
+ body: {
4567
+ error: "The choice menu changed since the card was rendered — refresh and re-answer",
4568
+ code: "menu-changed"
4569
+ },
4570
+ status: 409
4571
+ };
4572
+ if (selectedIndex >= menu.options.length) return {
4573
+ body: { error: `selectedIndex out of range (0-${menu.options.length - 1})` },
4574
+ status: 400
4575
+ };
4576
+ const keys = buildChoiceKeystrokes(menu, selectedIndex);
4577
+ for (const key of keys) {
4578
+ await sendKey(sessionName, key);
4579
+ await sleep(KEYSTROKE_GAP_MS);
4580
+ }
4581
+ await sleep(DELIVERY_CONFIRM_WAIT_MS);
4582
+ const after = parsePaneChoiceMenu(await capture(sessionName, PANE_CAPTURE_LINES));
4583
+ if (after && paneChoiceMenuSignature(after) === signature) return {
4584
+ body: {
4585
+ error: "Keystrokes were sent but the menu is still on screen — answer it from the terminal",
4586
+ code: "delivery-unconfirmed"
4587
+ },
4588
+ status: 409
4589
+ };
4590
+ return { body: {
4591
+ ok: true,
4592
+ answeredLabel: menu.options[selectedIndex].label
4593
+ } };
4594
+ } catch (error) {
4595
+ const message = error instanceof Error ? error.message : String(error);
4596
+ console.error("[sessions] pane-choice answer failed:", message);
4597
+ return {
4598
+ body: { error: "Internal server error" },
4599
+ status: 500
4600
+ };
4601
+ }
4602
+ }
4603
+ //#endregion
4434
4604
  //#region ../../lib/channels/permission-payload.ts
4435
4605
  const CHANNEL_PERMISSION_LIMITS = {
4436
4606
  requestIdBytes: 128,
@@ -4619,8 +4789,53 @@ async function processPermissionResponse(deps, args) {
4619
4789
  //#endregion
4620
4790
  //#region routes/agents/permissions.ts
4621
4791
  init_agents$1();
4792
+ init_agent_enrichment();
4622
4793
  init_activity_logger();
4623
4794
  init_read_model();
4795
+ async function handleGetAgentPaneChoice(agentId, deps = {}) {
4796
+ if (!agentId.trim()) return {
4797
+ body: { error: "missing agent id" },
4798
+ status: 400
4799
+ };
4800
+ const paneChoice = await (deps.captureSessionPaneChoice ?? captureSessionPaneChoice)(agentId);
4801
+ return paneChoice ? { body: {
4802
+ pending: true,
4803
+ ...paneChoice
4804
+ } } : { body: { pending: false } };
4805
+ }
4806
+ async function handlePostAgentPaneChoice(agentId, body, deps = {}) {
4807
+ if (!agentId.trim()) return {
4808
+ body: { error: "missing agent id" },
4809
+ status: 400
4810
+ };
4811
+ const agentState = await (deps.getAgentState ?? ((id) => Effect.runPromise(getAgentState(id))))(agentId);
4812
+ if (!agentState) return {
4813
+ body: { error: `Agent ${agentId} not found` },
4814
+ status: 404
4815
+ };
4816
+ const result = await (deps.answerSessionPaneChoice ?? answerSessionPaneChoice)(agentId, body);
4817
+ const answeredLabel = result.body["answeredLabel"];
4818
+ if (result.status === void 0 && result.body["ok"] === true && typeof answeredLabel === "string") (deps.emitActivityEntry ?? emitActivityEntrySync)({
4819
+ source: "dashboard",
4820
+ level: "info",
4821
+ issueId: agentState.issueId,
4822
+ message: `Operator answered ${agentId}'s pane menu: ${answeredLabel}`
4823
+ });
4824
+ return result;
4825
+ }
4826
+ const getAgentPaneChoiceRoute = HttpRouter.add("GET", "/api/agents/:id/pane-choice", httpHandler(Effect.gen(function* () {
4827
+ const params = yield* HttpRouter.params;
4828
+ const result = yield* Effect.promise(() => handleGetAgentPaneChoice(params["id"] ?? ""));
4829
+ return jsonResponse(result.body, { status: result.status });
4830
+ })));
4831
+ const postAgentPaneChoiceRoute = HttpRouter.add("POST", "/api/agents/:id/pane-choice", httpHandler(Effect.gen(function* () {
4832
+ const originCheck = validateOrigin(yield* HttpServerRequest.HttpServerRequest);
4833
+ if (!originCheck.ok) return jsonResponse({ error: originCheck.error }, { status: 403 });
4834
+ const params = yield* HttpRouter.params;
4835
+ const body = yield* readJsonBody$1;
4836
+ const result = yield* Effect.promise(() => handlePostAgentPaneChoice(params["id"] ?? "", body));
4837
+ return jsonResponse(result.body, { status: result.status });
4838
+ })));
4624
4839
  const getAgentPendingQuestionsRoute = HttpRouter.add("GET", "/api/agents/:id/pending-questions", httpHandler(Effect.gen(function* () {
4625
4840
  const questions = yield* getAgentPendingQuestions((yield* HttpRouter.params)["id"] ?? "");
4626
4841
  return jsonResponse({
@@ -4681,7 +4896,7 @@ const postInternalAgentPermissionRequestRoute = HttpRouter.add("POST", "/api/int
4681
4896
  error: "missing agent id"
4682
4897
  }, { status: 400 });
4683
4898
  const request = yield* HttpServerRequest.HttpServerRequest;
4684
- const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-BJZa40Ld.js"));
4899
+ const { INTERNAL_TOKEN_HEADER, getInternalTokenSync } = yield* Effect.promise(() => import("./internal-token-Djkj-yqK.js"));
4685
4900
  const expected = getInternalTokenSync();
4686
4901
  if (!expected) return jsonResponse({
4687
4902
  ok: false,
@@ -4968,7 +5183,7 @@ const getAgentHealthHistoryRoute = HttpRouter.add("GET", "/api/agents/:id/health
4968
5183
  const request = yield* HttpServerRequest.HttpServerRequest;
4969
5184
  const urlOpt = HttpServerRequest.toURL(request);
4970
5185
  const hours = Option.isSome(urlOpt) ? urlOpt.value.searchParams.get("hours") ?? "24" : "24";
4971
- const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-Der6bOkm.js"));
5186
+ const { getHealthHistory } = yield* Effect.promise(() => import("./health-events-qo7Ss34U.js"));
4972
5187
  const endTime = /* @__PURE__ */ new Date();
4973
5188
  const startTime = /* @__PURE__ */ new Date(endTime.getTime() - parseInt(hours) * 60 * 60 * 1e3);
4974
5189
  const events = getHealthHistory(id, startTime.toISOString(), endTime.toISOString());
@@ -4983,7 +5198,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
4983
5198
  return Effect.gen(function* () {
4984
5199
  let eventBody = body;
4985
5200
  if (body["kind"] === "linear_mcp_auth_required" || body["kind"] === "linear_mcp_auth_healthy") {
4986
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DFO6qvHp.js"));
5201
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DK1Vay1E.js"));
4987
5202
  const snapshot = yield* (yield* AgentStateService).get(id);
4988
5203
  eventBody = {
4989
5204
  ...body,
@@ -5018,7 +5233,7 @@ function emitAgentRuntimeEvent(id, body, timestamp) {
5018
5233
  detail: String(decoded.failure)
5019
5234
  }, { status: 400 })
5020
5235
  };
5021
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DFO6qvHp.js"));
5236
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DK1Vay1E.js"));
5022
5237
  yield* (yield* AgentStateService).emit(decoded.success);
5023
5238
  return {
5024
5239
  ok: true,
@@ -5100,7 +5315,7 @@ const getAgentRuntimeRoute = HttpRouter.add("GET", "/api/agents/:id/runtime", ht
5100
5315
  success: false,
5101
5316
  error: "missing agent id"
5102
5317
  }, { status: 400 });
5103
- const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DFO6qvHp.js"));
5318
+ const { AgentStateService } = yield* Effect.promise(() => import("./agent-state-service-DK1Vay1E.js"));
5104
5319
  const snapshot = yield* (yield* AgentStateService).get(id);
5105
5320
  if (!snapshot) return jsonResponse({
5106
5321
  success: false,
@@ -5168,7 +5383,12 @@ function writeProjectionRows(db, state, event) {
5168
5383
  const record = event;
5169
5384
  const timestamp = record["timestamp"] ?? (/* @__PURE__ */ new Date()).toISOString();
5170
5385
  const timestampMs = new Date(timestamp).getTime();
5171
- const payload = JSON.stringify(record["payload"] ?? {});
5386
+ const rawPayload = record["payload"] ?? {};
5387
+ const payloadRecord = rawPayload.workspaceId === void 0 ? {
5388
+ ...rawPayload,
5389
+ workspaceId: getWorkspaceForIssue(state.issueId)?.id
5390
+ } : rawPayload;
5391
+ const payload = JSON.stringify(payloadRecord);
5172
5392
  const updatedAt = Date.now();
5173
5393
  db.prepare(`INSERT OR IGNORE INTO issues (id, stage, updated_at) VALUES (?, 'working', ?)`).run(state.issueId, updatedAt);
5174
5394
  db.prepare(`INSERT OR REPLACE INTO agents (${AGENT_COLUMNS_FOR_DB.join(", ")}) VALUES (${AGENT_COLUMNS_FOR_DB.map(() => "?").join(", ")})`).run(...stateToOverdeckParamsForDb(state, updatedAt));
@@ -5176,7 +5396,10 @@ function writeProjectionRows(db, state, event) {
5176
5396
  const sequence = db.prepare(`SELECT last_insert_rowid() AS sequence`).get()?.sequence ?? 0;
5177
5397
  return {
5178
5398
  sequence,
5179
- stored: buildStoredEvent(event, sequence)
5399
+ stored: buildStoredEvent({
5400
+ ...event,
5401
+ payload: payloadRecord
5402
+ }, sequence)
5180
5403
  };
5181
5404
  }
5182
5405
  function emitCommittedProjection(eventStore, state, event, rows) {
@@ -5285,8 +5508,8 @@ function createAgentStopHandler(lifecycleEvent) {
5285
5508
  yield* stopAgent(id);
5286
5509
  if (stateBeforeStop?.issueId) yield* Effect.promise(async () => {
5287
5510
  try {
5288
- const { resolveProjectFromIssueSync } = await import("./projects-_n3Zui6K.js");
5289
- const { findWorkspacePath } = await import("./archive-planning-BHCd_eL5.js");
5511
+ const { resolveProjectFromIssueSync } = await import("./projects-WqMWCdpa.js");
5512
+ const { findWorkspacePath } = await import("./archive-planning-MbkGCBIY.js");
5290
5513
  const issueLower = stateBeforeStop.issueId.toLowerCase();
5291
5514
  const workspacePath = findWorkspacePath(resolveProjectFromIssueSync(stateBeforeStop.issueId)?.projectPath ?? process.cwd(), issueLower);
5292
5515
  if (workspacePath) {
@@ -5426,7 +5649,7 @@ const postAgentUnpauseRoute = HttpRouter.add("POST", "/api/agents/:id/unpause",
5426
5649
  if ((yield* getWorkAgentLifecycleState(id)).canResumeSession && updatedState.troubled !== true) {
5427
5650
  resumeTriggered = true;
5428
5651
  yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.unpause_immediate_resume_triggered"));
5429
- import("./resume-DXIIfJNk.js").then(({ resumeAgent }) => resumeAgent(id)).then((result) => {
5652
+ import("./resume-9thEqAQR.js").then(({ resumeAgent }) => resumeAgent(id)).then((result) => {
5430
5653
  if (!result.success) console.warn(`[agents] immediate resume after unpause failed for ${id}: ${result.error}`);
5431
5654
  }).catch((err) => console.warn(`[agents] immediate resume after unpause errored for ${id}:`, err));
5432
5655
  }
@@ -5476,6 +5699,9 @@ init_operator_interventions();
5476
5699
  init_projects();
5477
5700
  init_tmux();
5478
5701
  init_domain_services();
5702
+ function pendingDecisionError(agentId, issueId, decision) {
5703
+ return `Agent ${agentId} is waiting on an operator decision (${decision.reason.replaceAll("_", " ")}). Answer it with 'pan answer ${issueId}' or open the Decisions panel; pass {force:true} to discard it deliberately.`;
5704
+ }
5479
5705
  const postAgentResumeRoute = HttpRouter.add("POST", "/api/agents/:id/resume", httpHandler(Effect.gen(function* () {
5480
5706
  const id = (yield* HttpRouter.params)["id"] ?? "";
5481
5707
  const { message, model, harness, compact } = yield* readJsonBody$1;
@@ -5567,7 +5793,7 @@ const postAgentRecoverRoute = HttpRouter.add("POST", "/api/agents/:id/recover",
5567
5793
  const id = (yield* HttpRouter.params)["id"] ?? "";
5568
5794
  const body = yield* readJsonBody$1;
5569
5795
  yield* EventStoreService;
5570
- const { model } = body;
5796
+ const { model, force = false } = body;
5571
5797
  let recoveryModel;
5572
5798
  try {
5573
5799
  recoveryModel = normalizeModelOverrideSync(model);
@@ -5576,8 +5802,19 @@ const postAgentRecoverRoute = HttpRouter.add("POST", "/api/agents/:id/recover",
5576
5802
  }
5577
5803
  const stateBeforeRecover = yield* getAgentState(id);
5578
5804
  if (!stateBeforeRecover) return jsonResponse({ error: `Agent ${id} not found` }, { status: 404 });
5805
+ if (!force) {
5806
+ const pendingDecision = yield* Effect.promise(() => detectPendingOperatorDecision(id));
5807
+ if (pendingDecision) return jsonResponse({
5808
+ error: pendingDecisionError(id, stateBeforeRecover.issueId, pendingDecision),
5809
+ code: "pending-operator-decision",
5810
+ pendingDecision
5811
+ }, { status: 409 });
5812
+ }
5579
5813
  yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.recover_requested", { model: recoveryModel || void 0 }));
5580
- if (!(yield* Effect.promise(() => recoverAgent(id, recoveryModel ? { modelOverride: recoveryModel } : void 0)))) {
5814
+ if (!(yield* Effect.promise(() => recoverAgent(id, {
5815
+ ...recoveryModel ? { modelOverride: recoveryModel } : {},
5816
+ force
5817
+ })))) {
5581
5818
  const error = `Could not recover agent ${id}`;
5582
5819
  yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.recover_failed", { error }));
5583
5820
  return jsonResponse({
@@ -5616,7 +5853,7 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
5616
5853
  const id = (yield* HttpRouter.params)["id"] ?? "";
5617
5854
  const body = yield* readJsonBody$1;
5618
5855
  const eventStore = yield* EventStoreService;
5619
- const { model, harness, graceful = true, message } = body;
5856
+ const { model, harness, graceful = true, message, force = false } = body;
5620
5857
  let restartModel;
5621
5858
  try {
5622
5859
  restartModel = normalizeModelOverrideSync(model);
@@ -5625,6 +5862,14 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
5625
5862
  }
5626
5863
  const agentState = yield* getAgentState(id);
5627
5864
  if (!agentState) return jsonResponse({ error: `Agent ${id} not found` }, { status: 404 });
5865
+ if (!force) {
5866
+ const pendingDecision = yield* Effect.promise(() => detectPendingOperatorDecision(id));
5867
+ if (pendingDecision) return jsonResponse({
5868
+ error: pendingDecisionError(id, agentState.issueId, pendingDecision),
5869
+ code: "pending-operator-decision",
5870
+ pendingDecision
5871
+ }, { status: 409 });
5872
+ }
5628
5873
  yield* Effect.promise(() => appendAgentLifecycleLog(id, "agent.restart_requested", {
5629
5874
  model: restartModel || agentState.model,
5630
5875
  harness: harness || void 0,
@@ -5651,10 +5896,11 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
5651
5896
  model: restartModel,
5652
5897
  harness,
5653
5898
  graceful: true,
5654
- message
5899
+ message,
5900
+ force
5655
5901
  });
5656
- if (result.success) {
5657
- const updatedState = await Effect.runPromise(getAgentState(id));
5902
+ if (result.success || result.code === "pending-operator-decision") {
5903
+ const updatedState = result.success ? await Effect.runPromise(getAgentState(id)) : agentState;
5658
5904
  if (updatedState) await Effect.runPromise(saveAgentStateAndEmitEventProgram(updatedState, {
5659
5905
  type: "agent.started",
5660
5906
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -5696,7 +5942,8 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
5696
5942
  model: restartModel,
5697
5943
  harness,
5698
5944
  graceful: false,
5699
- message
5945
+ message,
5946
+ force
5700
5947
  }));
5701
5948
  if (result.success) {
5702
5949
  const updatedState = yield* getAgentState(id);
@@ -5742,11 +5989,16 @@ const postAgentRestartRoute = HttpRouter.add("POST", "/api/agents/:id/restart",
5742
5989
  model: restartModel || agentState.model
5743
5990
  });
5744
5991
  }
5992
+ if (result.code === "pending-operator-decision") return jsonResponse({
5993
+ error: result.error,
5994
+ code: result.code,
5995
+ pendingDecision: result.pendingDecision
5996
+ }, { status: 409 });
5745
5997
  return jsonResponse({ error: result.error }, { status: 500 });
5746
5998
  })));
5747
5999
  const postAgentRestartFreshRoute = HttpRouter.add("POST", "/api/agents/:id/restart-fresh", httpHandler(Effect.gen(function* () {
5748
6000
  const id = (yield* HttpRouter.params)["id"] ?? "";
5749
- const { spawn: spawnFlag, model: rawModel, harness } = yield* readJsonBody$1;
6001
+ const { spawn: spawnFlag, model: rawModel, harness, force = false } = yield* readJsonBody$1;
5750
6002
  const wantsSpawn = spawnFlag !== false;
5751
6003
  let newModel;
5752
6004
  if (wantsSpawn && rawModel) try {
@@ -5762,6 +6014,21 @@ const postAgentRestartFreshRoute = HttpRouter.add("POST", "/api/agents/:id/resta
5762
6014
  error: `${issueId} is already ${issueStage?.replaceAll("_", " ")}. Reopen the issue before starting fresh work.`,
5763
6015
  issueStage
5764
6016
  }, { status: 409 });
6017
+ const spawnModel = newModel ?? agentState.model ?? "claude-sonnet-5";
6018
+ let effectiveHarness = null;
6019
+ if (wantsSpawn && harness) {
6020
+ const harnessDecision = yield* Effect.promise(async () => canUseHarnessSync(harness, spawnModel, await getProviderAuthMode(spawnModel)));
6021
+ if (!harnessDecision.allowed) return jsonResponse({ error: harnessDecision.reason ?? `Harness "${harness}" is not allowed for model "${spawnModel}".` }, { status: 400 });
6022
+ effectiveHarness = harness;
6023
+ }
6024
+ if (!force) {
6025
+ const pendingDecision = yield* Effect.promise(() => detectPendingOperatorDecision(id));
6026
+ if (pendingDecision) return jsonResponse({
6027
+ error: pendingDecisionError(id, issueId, pendingDecision),
6028
+ code: "pending-operator-decision",
6029
+ pendingDecision
6030
+ }, { status: 409 });
6031
+ }
5765
6032
  const lifecycle = yield* getWorkAgentLifecycleState(id);
5766
6033
  if (lifecycle.hasLiveTmuxSession) return jsonResponse({
5767
6034
  error: `Agent ${id} has a live tmux session. Run 'pan kill ${id}' to stop only this work agent, then retry.`,
@@ -5790,9 +6057,6 @@ const postAgentRestartFreshRoute = HttpRouter.add("POST", "/api/agents/:id/resta
5790
6057
  hint: "Agent dir wiped. Click Start agent to respawn with a fresh session."
5791
6058
  });
5792
6059
  }
5793
- const spawnModel = newModel ?? agentState.model ?? "claude-sonnet-5";
5794
- let effectiveHarness = null;
5795
- if (harness) effectiveHarness = (yield* Effect.promise(async () => canUseHarnessSync(harness, spawnModel, await getProviderAuthMode(spawnModel)))).allowed ? harness : "claude-code";
5796
6060
  const agentSessionName = `agent-${issueId.toLowerCase()}`;
5797
6061
  const projectPath = agentState.workspace ? dirname(agentState.workspace) : void 0;
5798
6062
  const projectRoot = resolveProjectFromIssueSync(issueId)?.projectPath ?? projectPath ?? process.cwd();
@@ -5862,18 +6126,29 @@ const postAgentRestartFreshRoute = HttpRouter.add("POST", "/api/agents/:id/resta
5862
6126
  });
5863
6127
  })));
5864
6128
  const postAgentsRestartAllRoute = HttpRouter.add("POST", "/api/agents/restart-all", Effect.gen(function* () {
6129
+ const { force = false } = yield* readJsonBody$1;
5865
6130
  return yield* Effect.promise(async () => {
5866
6131
  try {
5867
6132
  const running = (await Effect.runPromise(listRunningAgents())).filter((a) => a.tmuxActive);
5868
6133
  const results = [];
5869
6134
  for (const agent of running) try {
5870
- const result = await restartAgent(agent.id, { graceful: false });
6135
+ const result = await restartAgent(agent.id, {
6136
+ graceful: false,
6137
+ force
6138
+ });
5871
6139
  if (result.success) results.push({
5872
6140
  id: agent.id,
5873
6141
  issueId: agent.issueId,
5874
6142
  model: agent.model,
5875
6143
  status: "restarted"
5876
6144
  });
6145
+ else if (result.code === "pending-operator-decision") results.push({
6146
+ id: agent.id,
6147
+ issueId: agent.issueId,
6148
+ model: agent.model,
6149
+ status: "skipped",
6150
+ pendingReason: result.pendingDecision?.reason
6151
+ });
5877
6152
  else results.push({
5878
6153
  id: agent.id,
5879
6154
  issueId: agent.issueId,
@@ -5891,10 +6166,15 @@ const postAgentsRestartAllRoute = HttpRouter.add("POST", "/api/agents/restart-al
5891
6166
  });
5892
6167
  }
5893
6168
  const succeeded = results.filter((r) => r.status === "restarted").length;
6169
+ const skipped = results.filter((r) => r.status === "skipped").map((r) => ({
6170
+ id: r.id,
6171
+ reason: r.pendingReason
6172
+ }));
5894
6173
  console.log(`[agents] Restarted ${succeeded}/${running.length} workspace agents`);
5895
6174
  return jsonResponse({
5896
6175
  restarted: succeeded,
5897
6176
  total: running.length,
6177
+ skipped,
5898
6178
  results
5899
6179
  });
5900
6180
  } catch (error) {
@@ -6050,7 +6330,7 @@ async function resolveCurrentStaffing(agentId, agentState, issueId) {
6050
6330
  }
6051
6331
  }
6052
6332
  const postAgentsRestartWithConfigRoute = HttpRouter.add("POST", "/api/agents/restart-with-current-config", httpHandler(Effect.gen(function* () {
6053
- const { agentIds } = yield* readJsonBody$1;
6333
+ const { agentIds, force = false } = yield* readJsonBody$1;
6054
6334
  if (!agentIds || !Array.isArray(agentIds) || agentIds.length === 0) return jsonResponse({ error: "agentIds array is required and must not be empty" }, { status: 400 });
6055
6335
  const eligibleAgents = yield* Effect.promise(() => buildRestartConfigChangeList());
6056
6336
  const eligibleIds = new Set(eligibleAgents.map((a) => a.agentId));
@@ -6088,7 +6368,8 @@ const postAgentsRestartWithConfigRoute = HttpRouter.add("POST", "/api/agents/res
6088
6368
  const restartResult = yield* Effect.promise(() => restartAgent(agentId, {
6089
6369
  model: newModel,
6090
6370
  harness: newHarness,
6091
- graceful: false
6371
+ graceful: false,
6372
+ force
6092
6373
  }));
6093
6374
  if (restartResult.success) results.push({
6094
6375
  id: agentId,
@@ -6098,7 +6379,7 @@ const postAgentsRestartWithConfigRoute = HttpRouter.add("POST", "/api/agents/res
6098
6379
  });
6099
6380
  else results.push({
6100
6381
  id: agentId,
6101
- status: "failed",
6382
+ status: restartResult.code === "pending-operator-decision" ? "skipped" : "failed",
6102
6383
  error: restartResult.error
6103
6384
  });
6104
6385
  } catch (err) {
@@ -6595,7 +6876,6 @@ async function withActiveOrderDispatchReservation(projectRoot, issueId, options,
6595
6876
  }
6596
6877
  //#endregion
6597
6878
  //#region ../../lib/xbrief/auto-synthesize.ts
6598
- init_io();
6599
6879
  function cleanMarkdownLine(line) {
6600
6880
  return line.replace(/^[-*+]\s+\[[ xX]\]\s+/, "").replace(/^[-*+]\s+/, "").replace(/^#+\s+/, "").replace(/`([^`]+)`/g, "$1").trim();
6601
6881
  }
@@ -6675,39 +6955,27 @@ function synthesizeMinimalXBrief(issue) {
6675
6955
  }
6676
6956
  };
6677
6957
  }
6678
- async function writeAutoStartXBriefPromise(projectRoot, workspacePath, issue) {
6958
+ /**
6959
+ * Synthesize and durably persist a proposed spec through the canonical write
6960
+ * door. The returned workspace path is the canonical spec path because
6961
+ * workspace-local spec copies are migration compatibility only.
6962
+ */
6963
+ const writeAutoStartXBrief = (projectRoot, _workspacePath, issue) => Effect.gen(function* () {
6679
6964
  const document = synthesizeMinimalXBrief(issue);
6680
6965
  const canonicalFilename = document.plan.metadata?.canonicalFilename;
6681
- const projectSpecsDir = join$1(projectRoot, ".pan", "specs");
6682
- const projectSpecPath = join$1(projectSpecsDir, canonicalFilename);
6683
- const projectDocument = {
6966
+ const written = yield* writeSpecForIssue(projectRoot, {
6684
6967
  ...document,
6685
6968
  plan: {
6686
6969
  ...document.plan,
6687
6970
  status: "proposed"
6688
6971
  }
6689
- };
6690
- await mkdir$1(projectSpecsDir, { recursive: true });
6691
- await writeFile$1(projectSpecPath, serializeXBriefDocument(projectDocument), "utf-8");
6972
+ }, "proposed", canonicalFilename);
6692
6973
  return {
6693
6974
  document,
6694
- workspaceSpecPath: projectSpecPath,
6695
- projectSpecPath,
6975
+ workspaceSpecPath: written.path,
6976
+ projectSpecPath: written.path,
6696
6977
  canonicalFilename
6697
6978
  };
6698
- }
6699
- /**
6700
- * Effect variant of writeAutoStartXBrief. Wraps mkdir + writeFile in a typed
6701
- * FsError channel so callers in Effect-native code can compose with this
6702
- * synthesis step without losing failure typing.
6703
- */
6704
- const writeAutoStartXBrief = (projectRoot, workspacePath, issue) => Effect.tryPromise({
6705
- try: () => writeAutoStartXBriefPromise(projectRoot, workspacePath, issue),
6706
- catch: (cause) => new FsError({
6707
- path: projectRoot,
6708
- operation: "writeAutoStartXBrief",
6709
- cause
6710
- })
6711
6979
  });
6712
6980
  //#endregion
6713
6981
  //#region routes/agents/spawn-helpers.ts
@@ -6770,15 +7038,15 @@ async function requestWorkStartAfterContainers(input) {
6770
7038
  function handleRemoteAgentSpawn(input) {
6771
7039
  return Effect.gen(function* () {
6772
7040
  const { issueId, workspacePath, workspaceMetadata, spawnModel, startedBy, autoSpawnConsentRequired, projectPath, spawnGuardrails, lifecycle } = input;
6773
- const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-kwsEZvXu.js"));
6774
- const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-CVPCc7Vy.js"));
6775
- const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-R793W0yA.js"));
7041
+ const { spawnRemoteAgent, checkRemoteSpendCap } = yield* Effect.promise(() => import("./remote-agents-BIIoc5pD.js"));
7042
+ const { createFlyProviderFromConfig } = yield* Effect.promise(() => import("./remote-C0xVTHA5.js"));
7043
+ const { loadConfigSync: loadPanConfig } = yield* Effect.promise(() => import("./config-C5saf4Ja.js"));
6776
7044
  const panConfig = loadPanConfig();
6777
7045
  const spendCap = checkRemoteSpendCap(panConfig);
6778
7046
  if (!spendCap.allowed) return jsonResponse({ error: spendCap.message }, { status: 429 });
6779
7047
  const fly = createFlyProviderFromConfig(panConfig.remote);
6780
7048
  yield* Effect.promise(() => fly.syncAllCredentials(workspaceMetadata.vmName));
6781
- const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-Csb3fbVR.js"));
7049
+ const { buildWorkAgentPrompt, getTrackerContext } = yield* Effect.promise(() => import("./work-agent-prompt-D03s4DD1.js"));
6782
7050
  const trackerContext = yield* Effect.promise(() => getTrackerContext(issueId, workspacePath));
6783
7051
  const agentPrompt = yield* Effect.promise(() => buildWorkAgentPrompt({
6784
7052
  issueId,
@@ -7151,20 +7419,13 @@ function emitDirtyWorkspaceRefusalActivity(issueId, porcelain) {
7151
7419
  } catch {}
7152
7420
  }
7153
7421
  /**
7154
- * Both workspace runtime directories are Overdeck-owned in full, so both get a
7155
- * blanket prefix match. The legacy `.pan/` allowlist only matched the collapsed
7156
- * `?? .pan/` porcelain form plus a closed set of files — but this gate always
7157
- * runs with `--untracked-files=all`, which expands untracked directories into
7158
- * individual paths. A pipeline-authored `.pan/drafts/<ISSUE>.md` therefore read
7159
- * as operator dirt and 409'd the planning→work auto-handoff (PAN-3042).
7422
+ * True when git porcelain contains only Overdeck-owned workspace runtime files
7423
+ * (PAN-3042; shared predicate since PAN-3245) or generated git-hook output — the
7424
+ * `.husky/_/pre-rebase` guard that worktree creation writes made every fresh
7425
+ * workspace read as dirty and 409 the planning auto-handoff (PAN-3266).
7160
7426
  */
7161
- function isOverdeckWorkspaceRuntimePath(path) {
7162
- if (path === ".overdeck" || path.startsWith(".overdeck/")) return true;
7163
- return path === ".pan" || path === ".pan/" || path.startsWith(".pan/");
7164
- }
7165
- /** True when git porcelain contains only Overdeck-owned workspace runtime files. */
7166
7427
  function isOnlyOverdeckRuntimeWorkspaceChanges(porcelain) {
7167
- return parsePorcelainStatusPaths(porcelain).every(isOverdeckWorkspaceRuntimePath);
7428
+ return parsePorcelainStatusPaths(porcelain).every((path) => isOverdeckWorkspaceRuntimePath(path) || isGeneratedGitHookPath(path));
7168
7429
  }
7169
7430
  function spawnGuardrailResourcesHint(hint) {
7170
7431
  const resourcesHint = "Open /resources to inspect Machine Room pressure before retrying.";
@@ -7504,23 +7765,24 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
7504
7765
  const markWorkStartAccepted = async () => {
7505
7766
  if (workStartAccepted) return;
7506
7767
  workStartAccepted = true;
7507
- await Effect.runPromise(transitionXBriefOnMain(projectPath, issueId, "active", "approved", `scope: approve ${issueId.toUpperCase()} xBRIEF`).pipe(Effect.match({
7768
+ await Effect.runPromise(transitionXBriefOnMain(projectPath, issueId, "active", "running", `chore(state): start ${issueId.toUpperCase()} xBRIEF (status=running)`).pipe(Effect.match({
7508
7769
  onSuccess: (result) => {
7509
7770
  if (result.moved) console.log(`[start-agent] xBRIEF moved ${result.fromDir} → active for ${issueId}`);
7510
- if (result.committed) console.log(`[start-agent] Committed approval transition for ${issueId}`);
7771
+ if (result.statusUpdated) console.log(`[start-agent] Set plan.status=running for ${issueId}`);
7772
+ if (result.committed) console.log(`[start-agent] Committed running transition for ${issueId}`);
7511
7773
  },
7512
7774
  onFailure: (err) => {
7513
- console.warn(`[start-agent] xBRIEF approval transition failed (non-fatal): ${err?.message ?? err}`);
7775
+ console.warn(`[start-agent] xBRIEF running transition failed (non-fatal): ${err?.message ?? err}`);
7514
7776
  }
7515
7777
  })));
7516
- if (existsSync(planPath)) try {
7778
+ if (planPath.startsWith(workspacePath + sep)) try {
7517
7779
  updatePlanStatus(planPath, "running");
7518
7780
  console.log(`[start-agent] Set plan.status=running for ${issueId}`);
7519
7781
  } catch (planStatusErr) {
7520
7782
  console.warn(`[start-agent] Failed to set plan.status=running (non-fatal): ${planStatusErr?.message ?? planStatusErr}`);
7521
7783
  }
7522
7784
  try {
7523
- const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-BTwWhtBb.js");
7785
+ const { appendSessionEntry, getProjectConfigFromWorkspacePath, resolveProjectForIssue } = await import("./record-aVzu-LGm.js");
7524
7786
  await appendSessionEntry(resolveProjectForIssue(issueId) ?? getProjectConfigFromWorkspacePath(workspacePath), issueId, {
7525
7787
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
7526
7788
  reason: "start",
@@ -7623,9 +7885,13 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
7623
7885
  console.warn(`[start-agent] Failed to check workspace status for ${issueId}: ${message}`);
7624
7886
  }
7625
7887
  const bodyHarness = body.harness;
7626
- const userPickedHarness = bodyHarness === "ohmypi" || bodyHarness === "claude-code" || bodyHarness === "codex" || bodyHarness === "acp" ? bodyHarness : null;
7888
+ const userPickedHarness = bodyHarness === "ohmypi" || bodyHarness === "claude-code" || bodyHarness === "codex" || bodyHarness === "acp" || bodyHarness === "kimi-code" ? bodyHarness : null;
7627
7889
  let effectiveHarness = null;
7628
- if (userPickedHarness !== null) effectiveHarness = (yield* Effect.promise(async () => canUseHarnessSync(userPickedHarness, spawnModel, await getProviderAuthMode(spawnModel)))).allowed ? userPickedHarness : "claude-code";
7890
+ if (userPickedHarness !== null) {
7891
+ const harnessDecision = yield* Effect.promise(async () => canUseHarnessSync(userPickedHarness, spawnModel, await getProviderAuthMode(spawnModel)));
7892
+ if (!harnessDecision.allowed) return jsonResponse({ error: harnessDecision.reason ?? `Harness "${userPickedHarness}" is not allowed for model "${spawnModel}".` }, { status: 400 });
7893
+ effectiveHarness = userPickedHarness;
7894
+ }
7629
7895
  const spawnPanCommand = async (args, cwd) => {
7630
7896
  const admitted = await withActiveOrderDispatchReservation(projectPath, issueId, {
7631
7897
  offBook,
@@ -7818,7 +8084,7 @@ const postAgentsRoute = HttpRouter.add("POST", "/api/agents", httpHandler(Effect
7818
8084
  * Composes all /api/agents/* route layers and preserves the public helper
7819
8085
  * exports that external callers historically imported from routes/agents.js.
7820
8086
  */
7821
- const agentsRouteLayer = Layer.mergeAll(getAgentsRoute, getAgentOutputRoute, getAgentConversationRoute, postAgentMessageRoute, postAgentTellRoute, deleteAgentRoute, postAgentStopRoute, getAgentHealthHistoryRoute, postAgentPokeRoute, getAgentPendingQuestionsRoute, postAgentAnswerQuestionRoute, postAgentPlanActionRoute, postAgentHeartbeatRoute, postAgentWorkCompleteRoute, postAgentStuckRoute, postAgentClassifyCompletionRoute, postInternalAgentPermissionRequestRoute, postAgentPermissionResponseRoute, getAgentRuntimeRoute, getAgentGitInfoRoute, getAgentActivityRoute, getAgentFilesRoute, getAgentTimelineRoute, postAgentSuspendRoute, postAgentPauseRoute, postAgentUnpauseRoute, postAgentUntroubledRoute, postAgentResumeRoute, postAgentRecoverRoute, postAgentRestartRoute, getAgentCloisterHealthRoute, getAgentHandoffSuggestionRoute, postAgentHandoffRoute, getAgentCostRoute, postAgentsRoute, postAgentsRestartAllRoute, getAgentTmuxAliveRoute, getAgentHasSessionRoute, postAgentResetSessionRoute, postAgentSwitchModelRoute, postAgentRestartFreshRoute, postAgentDeliveryMethodRoute, getAgentsRestartConfigRoute, postAgentsRestartWithConfigRoute);
8087
+ const agentsRouteLayer = Layer.mergeAll(getAgentsRoute, getAgentOutputRoute, getAgentConversationRoute, postAgentMessageRoute, postAgentTellRoute, deleteAgentRoute, postAgentStopRoute, getAgentHealthHistoryRoute, postAgentPokeRoute, getAgentPendingQuestionsRoute, getAgentPaneChoiceRoute, postAgentPaneChoiceRoute, postAgentAnswerQuestionRoute, postAgentPlanActionRoute, postAgentHeartbeatRoute, postAgentWorkCompleteRoute, postAgentStuckRoute, postAgentClassifyCompletionRoute, postInternalAgentPermissionRequestRoute, postAgentPermissionResponseRoute, getAgentRuntimeRoute, getAgentGitInfoRoute, getAgentActivityRoute, getAgentFilesRoute, getAgentTimelineRoute, postAgentSuspendRoute, postAgentPauseRoute, postAgentUnpauseRoute, postAgentUntroubledRoute, postAgentResumeRoute, postAgentRecoverRoute, postAgentRestartRoute, getAgentCloisterHealthRoute, getAgentHandoffSuggestionRoute, postAgentHandoffRoute, getAgentCostRoute, postAgentsRoute, postAgentsRestartAllRoute, getAgentTmuxAliveRoute, getAgentHasSessionRoute, postAgentResetSessionRoute, postAgentSwitchModelRoute, postAgentRestartFreshRoute, postAgentDeliveryMethodRoute, getAgentsRestartConfigRoute, postAgentsRestartWithConfigRoute);
7822
8088
  //#endregion
7823
8089
  //#region routes/tiered-inspect-escalation.ts
7824
8090
  init_tier_escalation();
@@ -7965,14 +8231,14 @@ function firePostMergeLifecycle(issueId, options) {
7965
8231
  const normalizedIssueId = parsedIssueId.normalized.toUpperCase();
7966
8232
  const started = postMergeGuard.run(normalizedIssueId, async () => {
7967
8233
  const projectPath = getProjectPathForIssue(parsedIssueId.prefix);
7968
- const { postMergeLifecycle } = await import("./merge-agent-C1-9zbP_.js");
8234
+ const { postMergeLifecycle } = await import("./merge-agent-DWd0KfiS.js");
7969
8235
  const lifecycleOptions = {
7970
8236
  ...options?.verifiedMergedRef ? { verifiedMergedRef: options.verifiedMergedRef } : {},
7971
8237
  ...options?.verifiedMergedRepos?.length ? { verifiedMergedRepos: options.verifiedMergedRepos } : {}
7972
8238
  };
7973
8239
  await postMergeLifecycle(normalizedIssueId, projectPath, options?.sourceBranch, Object.keys(lifecycleOptions).length > 0 ? lifecycleOptions : void 0);
7974
8240
  console.log(`[merge] post-merge lifecycle completed for ${normalizedIssueId}`);
7975
- const { runMergeTrainReconcile } = await import("./merge-train-DvLcAn1G.js");
8241
+ const { runMergeTrainReconcile } = await import("./merge-train-D1I0lNOT.js");
7976
8242
  const outcomes = await runMergeTrainReconcile(normalizedIssueId);
7977
8243
  if (outcomes.length > 0) console.log(`[merge-train] reconciled ${outcomes.length} sibling(s) after ${normalizedIssueId}: ` + outcomes.map((o) => `${o.issueId}=${o.result}`).join(", "));
7978
8244
  }, (err) => console.error(`[merge] post-merge lifecycle failed for ${normalizedIssueId}:`, err));
@@ -7993,15 +8259,15 @@ init_io();
7993
8259
  init_domain_services();
7994
8260
  init_tmux();
7995
8261
  const getSpecialistsRoute = HttpRouter.add("GET", "/api/specialists", httpHandler(Effect.gen(function* () {
7996
- const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8262
+ const { getAllSpecialistStatus, getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
7997
8263
  return jsonResponse({
7998
8264
  specialists: yield* Effect.promise(() => getAllSpecialistStatus()),
7999
8265
  projects: yield* Effect.promise(() => getAllProjectSpecialistStatuses())
8000
8266
  });
8001
8267
  })));
8002
8268
  const postSpecialistsResetAllRoute = HttpRouter.add("POST", "/api/specialists/reset-all", httpHandler(Effect.gen(function* () {
8003
- const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8004
- const { clearHookSync } = yield* Effect.promise(() => import("./hooks-BJNal-bs.js"));
8269
+ const { getAllSpecialists, isRunning, getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8270
+ const { clearHookSync } = yield* Effect.promise(() => import("./hooks-X2XHBB2b.js"));
8005
8271
  const specialists = getAllSpecialists();
8006
8272
  const results = [];
8007
8273
  for (const specialist of specialists) {
@@ -8057,7 +8323,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8057
8323
  }
8058
8324
  console.log(`[specialists/done] ${specialist} signaling ${status} for ${normalizedIssueId}`);
8059
8325
  if (specialist === "merge") {
8060
- const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-z6v3ZqJE.js"));
8326
+ const { reportSpecialistCompletion } = yield* Effect.promise(() => import("./specialist-completion-Cf6tpIh1.js"));
8061
8327
  if (yield* reportSpecialistCompletion(normalizedIssueId, {
8062
8328
  status,
8063
8329
  notes
@@ -8110,7 +8376,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8110
8376
  if (project && failedItemId) {
8111
8377
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8112
8378
  if (existsSync(workspacePath)) {
8113
- const { onInspectComplete } = await import("./inspect-agent-CPqXI81t.js");
8379
+ const { onInspectComplete } = await import("./inspect-agent-BykeOH4a.js");
8114
8380
  await Effect.runPromise(onInspectComplete(project.projectKey, normalizedIssueId, failedItemId, "failed", workspacePath, notes));
8115
8381
  }
8116
8382
  }
@@ -8121,7 +8387,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8121
8387
  }
8122
8388
  yield* Effect.promise(async () => {
8123
8389
  try {
8124
- const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-CH6ah6D-.js");
8390
+ const { getTmuxSessionName, updateRunMetadata, makeSpecialistRegistryKey } = await import("./specialists-MOoeB4A8.js");
8125
8391
  const projectKey = resolveProjectFromIssueSync(normalizedIssueId)?.projectKey;
8126
8392
  const tmuxSession = projectKey ? getTmuxSessionName(`${specialist}-agent`, projectKey, normalizedIssueId) : getTmuxSessionName(`${specialist}-agent`);
8127
8393
  saveAgentRuntimeState(tmuxSession, {
@@ -8140,7 +8406,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8140
8406
  });
8141
8407
  console.log(`[specialists/done] Cleared registry lock for ${registryKey} (${projectKey})`);
8142
8408
  }
8143
- const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-CmpZYJMB.js");
8409
+ const { updateSpecialistHandoffStatus } = await import("./specialist-handoff-logger-D_LmQDj3.js");
8144
8410
  if (await Effect.runPromise(updateSpecialistHandoffStatus(normalizedIssueId, `${specialist}-agent`, status === "passed" ? "completed" : "failed", status === "passed" ? "success" : "failure"))) console.log(`[specialists/done] Updated handoff log: ${specialist}-agent ${normalizedIssueId} → ${status}`);
8145
8411
  } catch (err) {
8146
8412
  console.error(`[specialists/done] Error managing specialist state:`, err);
@@ -8152,7 +8418,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8152
8418
  if (project) {
8153
8419
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8154
8420
  if (existsSync(workspacePath)) {
8155
- const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-CedsVume.js");
8421
+ const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-C31x1lpE.js");
8156
8422
  const headAnchor = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
8157
8423
  if (headAnchor) {
8158
8424
  setReviewStatusSync(normalizedIssueId, { reviewedAtCommit: headAnchor });
@@ -8166,7 +8432,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8166
8432
  });
8167
8433
  if (specialist === "inspect" && status === "passed") yield* Effect.promise(async () => {
8168
8434
  try {
8169
- const { onInspectComplete } = await import("./inspect-agent-CPqXI81t.js");
8435
+ const { onInspectComplete } = await import("./inspect-agent-BykeOH4a.js");
8170
8436
  const project = resolveProjectFromIssueSync(normalizedIssueId);
8171
8437
  if (project) {
8172
8438
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
@@ -8182,7 +8448,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8182
8448
  if (project) {
8183
8449
  if (existsSync(join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`))) {
8184
8450
  setReviewStatusSync(normalizedIssueId, { testStatus: "passed" });
8185
- const { initEventStore } = await import("./event-store-5UKzh9Jf.js");
8451
+ const { initEventStore } = await import("./event-store-COd2tOx8.js");
8186
8452
  await (await initEventStore()).appendAsync({
8187
8453
  type: "test.passed",
8188
8454
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -8235,8 +8501,8 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8235
8501
  if (notes?.toLowerCase().includes("conflict")) yield* Effect.promise(async () => {
8236
8502
  try {
8237
8503
  const workAgentId = `agent-${normalizedIssueId.toLowerCase()}`;
8238
- const { sessionExists } = await import("./tmux-Ctk6RV5l.js");
8239
- const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-Dnn4XgdB.js");
8504
+ const { sessionExists } = await import("./tmux-Cjpx8L8u.js");
8505
+ const { messageAgent, spawnAgent, getAgentStateSync } = await import("./agents-IPSa5kzn.js");
8240
8506
  if (await Effect.runPromise(sessionExists(workAgentId))) {
8241
8507
  await messageAgent(workAgentId, `MERGE CONFLICT: The merge-agent could not rebase your branch onto main due to conflicts. Please fix this now:\n\n1. git fetch origin main\n2. git rebase origin/main\n3. Resolve any conflicts (git add <file> && git rebase --continue)\n4. git push --force-with-lease\n5. Resubmit: curl -s -X POST http://localhost:3011/api/review/${normalizedIssueId}/request -H "Content-Type: application/json" -d "{}"\n\nConflict details: ${notes}`);
8242
8508
  console.log(`[specialists/done] Sent rebase instructions to ${workAgentId}`);
@@ -8250,7 +8516,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8250
8516
  try {
8251
8517
  const project = resolveProjectFromIssueSync(normalizedIssueId);
8252
8518
  const workspacePath = project ? join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`) : void 0;
8253
- const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-qRohbFG2.js");
8519
+ const { deliverReviewVerdictFeedback } = await import("./review-verdict-feedback-HRY9P4bN.js");
8254
8520
  const result = await Effect.runPromise(deliverReviewVerdictFeedback({
8255
8521
  issueId: normalizedIssueId,
8256
8522
  verdict: status === "failed" ? "failed" : "blocked",
@@ -8270,7 +8536,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8270
8536
  if (project) {
8271
8537
  const workspacePath = join(project.projectPath, "workspaces", `feature-${normalizedIssueId.toLowerCase()}`);
8272
8538
  if (existsSync(workspacePath)) {
8273
- const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-CedsVume.js");
8539
+ const { formatAnchorShort, snapshotWorkspaceHeadsPromise } = await import("./git-utils-C31x1lpE.js");
8274
8540
  const reviewedAtCommit = await snapshotWorkspaceHeadsPromise(normalizedIssueId, workspacePath);
8275
8541
  if (reviewedAtCommit) {
8276
8542
  setReviewStatusSync(normalizedIssueId, { reviewedAtCommit });
@@ -8310,7 +8576,7 @@ const postSpecialistsDoneRoute = HttpRouter.add("POST", "/api/specialists/done",
8310
8576
  });
8311
8577
  })));
8312
8578
  const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/specialists/logs/cleanup-all", httpHandler(Effect.gen(function* () {
8313
- const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-BorrIu0x.js"));
8579
+ const { cleanupAllLogsSync } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
8314
8580
  const results = cleanupAllLogsSync();
8315
8581
  return jsonResponse({
8316
8582
  success: true,
@@ -8320,7 +8586,7 @@ const postSpecialistsLogsCleanupAllRoute = HttpRouter.add("POST", "/api/speciali
8320
8586
  });
8321
8587
  })));
8322
8588
  const getSpecialistsProjectsRoute = HttpRouter.add("GET", "/api/specialists/projects", httpHandler(Effect.gen(function* () {
8323
- const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8589
+ const { getAllProjectSpecialistStatuses } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8324
8590
  return jsonResponse(yield* Effect.promise(() => getAllProjectSpecialistStatuses()));
8325
8591
  })));
8326
8592
  const postSpecialistWakeRoute = HttpRouter.add("POST", "/api/specialists/:name/wake", httpHandler(Effect.gen(function* () {
@@ -8364,7 +8630,7 @@ const postSpecialistReportStatusRoute = HttpRouter.add("POST", "/api/specialists
8364
8630
  "blocked",
8365
8631
  "failed"
8366
8632
  ].includes(status)) {
8367
- const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8633
+ const { getTmuxSessionName } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8368
8634
  saveAgentRuntimeState(getTmuxSessionName(name), {
8369
8635
  state: "idle",
8370
8636
  lastActivity: (/* @__PURE__ */ new Date()).toISOString()
@@ -8486,7 +8752,7 @@ const postProjectSpecialistKillRoute = HttpRouter.add("POST", "/api/specialists/
8486
8752
  const issueId = params["issueId"];
8487
8753
  const type = params["type"];
8488
8754
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
8489
- const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8755
+ const { getTmuxSessionName, makeSpecialistRegistryKey, getRunMetadata } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8490
8756
  const tmuxSession = getRunMetadata(project, makeSpecialistRegistryKey(type, issueId)).tmuxSession ?? getTmuxSessionName(type, project, issueId);
8491
8757
  yield* Effect.promise(() => Effect.runPromise(killSession(tmuxSession)).catch(() => {}));
8492
8758
  saveAgentRuntimeState(tmuxSession, {
@@ -8513,7 +8779,7 @@ const getProjectSpecialistRunsRoute = HttpRouter.add("GET", "/api/specialists/:p
8513
8779
  if (limitParam) limit = parseInt(limitParam, 10);
8514
8780
  if (offsetParam) offset = parseInt(offsetParam, 10);
8515
8781
  }
8516
- const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-BorrIu0x.js"));
8782
+ const { listRunLogsSync } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
8517
8783
  return jsonResponse(listRunLogsSync(project, type, {
8518
8784
  limit,
8519
8785
  offset
@@ -8524,7 +8790,7 @@ const getProjectSpecialistRunStreamRoute = HttpRouter.add("GET", "/api/specialis
8524
8790
  const project = params["project"];
8525
8791
  const type = params["type"];
8526
8792
  const runId = params["runId"];
8527
- const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-BorrIu0x.js"));
8793
+ const { getRunLogPath, isRunLogActive } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
8528
8794
  const logPath = getRunLogPath(project, type, runId);
8529
8795
  if (!existsSync(logPath)) return jsonResponse({ error: "Run log not found" }, { status: 404 });
8530
8796
  const encoder = new TextEncoder();
@@ -8583,7 +8849,7 @@ const getProjectSpecialistRunRoute = HttpRouter.add("GET", "/api/specialists/:pr
8583
8849
  const project = params["project"];
8584
8850
  const type = params["type"];
8585
8851
  const runId = params["runId"];
8586
- const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-BorrIu0x.js"));
8852
+ const { getRunLogSync, parseLogMetadata } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
8587
8853
  const content = getRunLogSync(project, type, runId);
8588
8854
  if (!content) return jsonResponse({ error: "Run log not found" }, { status: 404 });
8589
8855
  return jsonResponse({
@@ -8597,7 +8863,7 @@ const postProjectSpecialistRunTerminateRoute = HttpRouter.add("POST", "/api/spec
8597
8863
  const project = params["project"];
8598
8864
  const type = params["type"];
8599
8865
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
8600
- const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8866
+ const { terminateSpecialist } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8601
8867
  yield* Effect.promise(() => terminateSpecialist(project, type));
8602
8868
  return jsonResponse({
8603
8869
  success: true,
@@ -8609,7 +8875,7 @@ const postProjectSpecialistGracePauseRoute = HttpRouter.add("POST", "/api/specia
8609
8875
  const project = params["project"];
8610
8876
  const type = params["type"];
8611
8877
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
8612
- const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8878
+ const { pauseGracePeriod } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8613
8879
  if (pauseGracePeriod(project, type)) return jsonResponse({
8614
8880
  success: true,
8615
8881
  message: "Grace period paused"
@@ -8621,7 +8887,7 @@ const postProjectSpecialistGraceResumeRoute = HttpRouter.add("POST", "/api/speci
8621
8887
  const project = params["project"];
8622
8888
  const type = params["type"];
8623
8889
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
8624
- const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8890
+ const { resumeGracePeriod } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8625
8891
  if (resumeGracePeriod(project, type)) return jsonResponse({
8626
8892
  success: true,
8627
8893
  message: "Grace period resumed"
@@ -8633,7 +8899,7 @@ const postProjectSpecialistGraceExitRoute = HttpRouter.add("POST", "/api/special
8633
8899
  const project = params["project"];
8634
8900
  const type = params["type"];
8635
8901
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
8636
- const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8902
+ const { exitGracePeriod } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8637
8903
  exitGracePeriod(project, type);
8638
8904
  return jsonResponse({
8639
8905
  success: true,
@@ -8645,7 +8911,7 @@ const getProjectSpecialistGraceRoute = HttpRouter.add("GET", "/api/specialists/:
8645
8911
  const project = params["project"];
8646
8912
  const type = params["type"];
8647
8913
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
8648
- const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8914
+ const { getGracePeriodState } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8649
8915
  const state = getGracePeriodState(project, type);
8650
8916
  if (state) return jsonResponse(state);
8651
8917
  else return jsonResponse({ error: "No active grace period" }, { status: 404 });
@@ -8654,7 +8920,7 @@ const getProjectSpecialistContextRoute = HttpRouter.add("GET", "/api/specialists
8654
8920
  const params = yield* HttpRouter.params;
8655
8921
  const project = params["project"];
8656
8922
  const type = params["type"];
8657
- const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-CrA5azkJ.js"));
8923
+ const { loadContextDigest } = yield* Effect.promise(() => import("./specialist-context-DEUEkjIQ.js"));
8658
8924
  const digest = loadContextDigest(project, type);
8659
8925
  if (digest) return jsonResponse({ digest });
8660
8926
  else return jsonResponse({ error: "No context digest found" }, { status: 404 });
@@ -8663,7 +8929,7 @@ const postProjectSpecialistContextRegenerateRoute = HttpRouter.add("POST", "/api
8663
8929
  const params = yield* HttpRouter.params;
8664
8930
  const project = params["project"];
8665
8931
  const type = params["type"];
8666
- const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-CrA5azkJ.js"));
8932
+ const { regenerateContextDigest } = yield* Effect.promise(() => import("./specialist-context-DEUEkjIQ.js"));
8667
8933
  const digest = yield* Effect.promise(() => regenerateContextDigest(project, type));
8668
8934
  if (digest) return jsonResponse({
8669
8935
  digest,
@@ -8682,7 +8948,7 @@ const postProjectSpecialistCompleteRoute = HttpRouter.add("POST", "/api/speciali
8682
8948
  "blocked"
8683
8949
  ].includes(status)) return jsonResponse({ error: "Valid status (passed/failed/blocked) is required" }, { status: 400 });
8684
8950
  if (!validateSpecialistAgentName(type)) return jsonResponse({ error: "Invalid specialist type. Must be review-agent, test-agent, or merge-agent" }, { status: 400 });
8685
- const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-CH6ah6D-.js"));
8951
+ const { signalSpecialistCompletion } = yield* Effect.promise(() => import("./specialists-MOoeB4A8.js"));
8686
8952
  signalSpecialistCompletion(project, type, {
8687
8953
  status,
8688
8954
  notes
@@ -8716,8 +8982,8 @@ const postProjectSpecialistLogsCleanupRoute = HttpRouter.add("POST", "/api/speci
8716
8982
  const params = yield* HttpRouter.params;
8717
8983
  const project = params["project"];
8718
8984
  const type = params["type"];
8719
- const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-BorrIu0x.js"));
8720
- const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-_n3Zui6K.js"));
8985
+ const { cleanupOldLogsSync } = yield* Effect.promise(() => import("./specialist-logs-7Ynue0R7.js"));
8986
+ const { getSpecialistRetention } = yield* Effect.promise(() => import("./projects-WqMWCdpa.js"));
8721
8987
  const retention = getSpecialistRetention(project);
8722
8988
  const deleted = cleanupOldLogsSync(project, type, {
8723
8989
  maxDays: retention.max_days,
@@ -8738,7 +9004,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
8738
9004
  const project = params["project"];
8739
9005
  const issueId = params["issueId"];
8740
9006
  const { model, harness } = yield* readJsonBody;
8741
- const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-UpAM4DmT.js"));
9007
+ const { killAllReviewerSessions } = yield* Effect.promise(() => import("./review-agent-CD3RQ-tc.js"));
8742
9008
  const killResult = yield* killAllReviewerSessions(project, issueId);
8743
9009
  const projectConfig = resolveProjectFromIssueSync(issueId);
8744
9010
  if (!projectConfig) return jsonResponse({ error: `Cannot resolve project for ${issueId}` }, { status: 404 });
@@ -8754,7 +9020,7 @@ const postProjectReviewRestartRoute = HttpRouter.add("POST", "/api/specialists/:
8754
9020
  }));
8755
9021
  branch = stdout.trim() || primaryRepo.sourceBranch;
8756
9022
  } catch {}
8757
- const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-UpAM4DmT.js"));
9023
+ const { spawnReviewRoleForIssue } = yield* Effect.promise(() => import("./review-agent-CD3RQ-tc.js"));
8758
9024
  const prUrl = getReviewStatusSync(issueId)?.prUrl;
8759
9025
  const result = yield* spawnReviewRoleForIssue({
8760
9026
  issueId,
@@ -8903,6 +9169,6 @@ const specialistsProjectRouteLayer = Layer.mergeAll(getProjectSpecialistStatusRo
8903
9169
  */
8904
9170
  const specialistsRouteLayer = Layer.mergeAll(specialistsLegacyRouteLayer, specialistsProjectRouteLayer);
8905
9171
  //#endregion
8906
- export { composerCommandConfirmationFromBody as $, resolveAllowedHarness as A, jsonResponse as At, cleanupUnreferencedConversationAttachments as B, handleConversationCreate as C, waitForSessionRespawn as Ct, handleConversationStop as D, validateOriginHeaders as Dt, handleConversationResume as E, validateOrigin as Et, tmuxSessionExists as F, isManagedConversationAttachmentPath as G, extractConversationAttachmentPaths as H, waitForPiTuiReady as I, composerCommandResultHttpStatus as J, removeConversationAttachment as K, waitForTmuxSession as L, spawnConversationSession as M, startConversationModelBackfill as N, handleConversationSwitchModel as O, httpHandler as Ot, stopConversationRuntime as P, ComposerCommandConfirmationError as Q, cleanupConversationAttachments as R, conversationSessionAliveFromState as S, isRespawnPending as St, handleConversationRestartAll as T, isTrustedOriginForHost as Tt, getConversationAttachmentsRoot as U, ensureConversationAttachmentDir as V, hasConversationAttachment as W, resolvePolicy as X, handleComposerCommandMessage as Y, ComposerCommandParseError as Z, isPiControlChannelHarness as _, dashboardSessionCookieHeader as _t, agentsRouteLayer as a, resolveConversationGitInfo as at, validateConversationControlAckOrigin as b, rejectUnauthorizedDashboardSessionMintRequest as bt, codexConversationPendingInput as c, spawnPanCli as ct, handleConversationCodexApproval as d, resolveAgentHarness as dt, evaluateSpawnGuardrails as et, handleConversationCompact as f, resolveClaudeSessionId as ft, handleConversationThinkingLevel as g, dashboardCsrfToken as gt, handleConversationPlanAction as h, resolvePiSessionPath as ht, validateSpecialistAutoCompleteMetadata as i, resolveAgentGitInfo as it, shouldReportUnresolvedLiveSession as j, jsonStringResponse as jt, isInsideGitWorkTree as k, getDefaultCwd as kt, deliverConversationViaControlChannel as l, readLauncherPinnedSessionId as lt, handleConversationDeliveryMethod as m, resolveJsonlPath as mt, _serverManagedMerges as n, isInternalAgentRequest as nt, saveAgentStateAndEmitEvent as o, getWorkAgentLifecycleStateSync as ot, handleConversationControlAck as p, resolveCodexRolloutPath as pt, runInBatches as q, firePostMergeLifecycle as r, resolveRequestedStartedBy as rt, saveAgentStateAndEmitEventProgram as s, panCliInvocation as st, specialistsRouteLayer as t, invalidateAgentsCache as tt, handleConversationAbort as u, resolveAcpTranscriptPath as ut, pickDeliverAs as v, hasDashboardInternalToken as vt, handleConversationDelete as w, getHeaderFromMap as wt, conversationNeedsRunningRepair as x, rejectUnsafeDashboardMutationRequest as xt, resolveConversationDeliveryMethod as y, rejectUnauthorizedDashboardRequest as yt, cleanupOrphanedConversationAttachments as z };
9172
+ export { ComposerCommandParseError as $, handleConversationSwitchModel as A, validateOriginHeaders as At, cleanupConversationAttachments as B, conversationNeedsRunningRepair as C, rejectUnauthorizedDashboardSessionMintRequest as Ct, handleConversationRestartAll as D, getHeaderFromMap as Dt, handleConversationDelete as E, waitForSessionRespawn as Et, startConversationModelBackfill as F, getConversationAttachmentsRoot as G, cleanupUnreferencedConversationAttachments as H, stopConversationRuntime as I, removeConversationAttachment as J, hasConversationAttachment as K, tmuxSessionExists as L, resolveAllowedHarness as M, getDefaultCwd as Mt, shouldReportUnresolvedLiveSession as N, jsonResponse as Nt, handleConversationResume as O, isTrustedOriginForHost as Ot, spawnConversationSession as P, jsonStringResponse as Pt, resolvePolicy as Q, waitForPiTuiReady as R, validateConversationControlAckOrigin as S, rejectUnauthorizedDashboardRequest as St, handleConversationCreate as T, isRespawnPending as Tt, ensureConversationAttachmentDir as U, cleanupOrphanedConversationAttachments as V, extractConversationAttachmentPaths as W, composerCommandResultHttpStatus as X, runInBatches as Y, handleComposerCommandMessage as Z, handleConversationPlanAction as _, resolveKimiWirePath as _t, agentsRouteLayer as a, resolveRequestedStartedBy as at, pickDeliverAs as b, dashboardSessionCookieHeader as bt, answerSessionPaneChoice as c, getWorkAgentLifecycleStateSync as ct, deliverConversationViaControlChannel as d, readLauncherPinnedSessionId as dt, ComposerCommandConfirmationError as et, handleConversationAbort as f, resolveAcpTranscriptPath as ft, handleConversationDeliveryMethod as g, resolveJsonlPath as gt, handleConversationControlAck as h, resolveCodexRolloutPath as ht, validateSpecialistAutoCompleteMetadata as i, isInternalAgentRequest as it, isInsideGitWorkTree as j, httpHandler as jt, handleConversationStop as k, validateOrigin as kt, captureSessionPaneChoice as l, panCliInvocation as lt, handleConversationCompact as m, resolveClaudeSessionId as mt, _serverManagedMerges as n, evaluateSpawnGuardrails as nt, saveAgentStateAndEmitEvent as o, resolveAgentGitInfo as ot, handleConversationCodexApproval as p, resolveAgentHarness as pt, isManagedConversationAttachmentPath as q, firePostMergeLifecycle as r, invalidateAgentsCache as rt, saveAgentStateAndEmitEventProgram as s, resolveConversationGitInfo as st, specialistsRouteLayer as t, composerCommandConfirmationFromBody as tt, codexConversationPendingInput as u, spawnPanCli as ut, handleConversationThinkingLevel as v, resolvePiSessionPath as vt, conversationSessionAliveFromState as w, rejectUnsafeDashboardMutationRequest as wt, resolveConversationDeliveryMethod as x, hasDashboardInternalToken as xt, isPiControlChannelHarness as y, dashboardCsrfToken as yt, waitForTmuxSession as z };
8907
9173
 
8908
- //# sourceMappingURL=specialists-2yLmqph9.js.map
9174
+ //# sourceMappingURL=specialists-DAjPgYs_.js.map