@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,10 +1,10 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { H as init_providers, W as qualifyPiModel, ci as getOverdeckHome$1, di as packageRoot, li as init_paths } from "./config-yaml-CxdwhAIA.js";
3
- import { i as releaseRecordLock, n as init_fs_lock, t as acquireRecordLock } from "./fs-lock-Bre3sGoz.js";
4
- import { $ as colorFgBgForTheme, G as tmuxExecAsync, K as validateSessionName, et as getUiThemeSync, tt as init_ui_theme, w as init_tmux } from "./tmux-CfDHob9M.js";
5
- import { s as getHarnessBehavior } from "./src-B948bGVR.js";
6
- import { t as init_behavior } from "./behavior-B7biGtFT.js";
7
- import { f as toCodexSandboxValue, l as init_codex } from "./codex-BYwi1uyW.js";
2
+ import { $n as qualifyPiModel, Ir as MessageDeliveryFailed, Vr as init_errors, Zn as init_providers, _i as packageRoot, hi as init_paths, mi as getOverdeckHome$1 } from "./config-yaml-BSCqwmX0.js";
3
+ import { n as init_fs_lock, o as releaseRecordLock, t as acquireRecordLock } from "./fs-lock-D_GeJtXl.js";
4
+ import { $ as getUiThemeSync, C as init_tmux, G as validateSessionName, Q as colorFgBgForTheme, W as tmuxExecAsync, Y as paneHasBlockingChoiceMenu, a as capturePaneText, c as deliveryVerifyLine, et as init_ui_theme, q as init_pane_choice_menu } from "./tmux-CImZaX4q.js";
5
+ import { s as getHarnessBehavior } from "./src-BYdwL_n-.js";
6
+ import { t as init_behavior } from "./behavior-DIMQMRzs.js";
7
+ import { f as toCodexSandboxValue, l as init_codex } from "./codex-CjkD1PJu.js";
8
8
  import { dirname, join } from "node:path";
9
9
  import { Data } from "effect";
10
10
  import { join as join$1 } from "path";
@@ -56,7 +56,7 @@ var init_model_validation = __esmMin((() => {
56
56
  * prepending its own, so a Flywheel-spawned agent never runs behind the
57
57
  * orchestrator's shim inherited through the environment.
58
58
  */
59
- function shellQuote$1(value) {
59
+ function shellQuote$2(value) {
60
60
  return `'${value.replace(/'/g, `'\\''`)}'`;
61
61
  }
62
62
  /**
@@ -79,10 +79,10 @@ function buildGitGuardLines(agentId, guardRoot) {
79
79
  "PATH=\"$(IFS=':'; echo \"${_overdeck_kept_path[*]}\")\"",
80
80
  "unset _overdeck_path_segments _overdeck_kept_path _overdeck_path_segment",
81
81
  "_OVERDECK_REAL_GIT=\"$(command -v git)\"",
82
- `_OVERDECK_GUARD_ROOT="$(cd ${shellQuote$1(guardRoot)} 2>/dev/null && pwd -P)"`,
83
- `[ -n "$_OVERDECK_GUARD_ROOT" ] || _OVERDECK_GUARD_ROOT=${shellQuote$1(guardRoot)}`,
84
- `mkdir -p ${shellQuote$1(guardDir)}`,
85
- `cat > ${shellQuote$1(guardPath)} <<EOF`,
82
+ `_OVERDECK_GUARD_ROOT="$(cd ${shellQuote$2(guardRoot)} 2>/dev/null && pwd -P)"`,
83
+ `[ -n "$_OVERDECK_GUARD_ROOT" ] || _OVERDECK_GUARD_ROOT=${shellQuote$2(guardRoot)}`,
84
+ `mkdir -p ${shellQuote$2(guardDir)}`,
85
+ `cat > ${shellQuote$2(guardPath)} <<EOF`,
86
86
  "#!/bin/sh",
87
87
  "_OVERDECK_REAL_GIT=\"$_OVERDECK_REAL_GIT\"",
88
88
  "_OVERDECK_GUARD_ROOT=\"$_OVERDECK_GUARD_ROOT\"",
@@ -210,7 +210,7 @@ function buildGitGuardLines(agentId, guardRoot) {
210
210
  "esac",
211
211
  "exec \"\\$_OVERDECK_REAL_GIT\" \"\\$@\"",
212
212
  "EOF",
213
- `chmod 0755 ${shellQuote$1(guardPath)}`,
213
+ `chmod 0755 ${shellQuote$2(guardPath)}`,
214
214
  `export PATH="${pathForDoubleQuotes}:$PATH"`
215
215
  ];
216
216
  }
@@ -218,14 +218,83 @@ var init_launcher_git_guard = __esmMin((() => {
218
218
  init_paths();
219
219
  }));
220
220
  //#endregion
221
- //#region ../../lib/launcher-generator.ts
221
+ //#region ../../lib/shell-quote.ts
222
222
  /**
223
223
  * Quote a string for safe use as a shell literal in single quotes.
224
224
  * e.g. shellQuote("foo'bar") → "'foo'\\''bar'"
225
+ *
226
+ * Leaf module (PAN-3300) so launcher-generator.ts and the launcher command
227
+ * builders extracted out of it share one implementation.
225
228
  */
226
- function shellQuote(value) {
229
+ function shellQuote$1(value) {
227
230
  return `'${value.replace(/'/g, `'\\''`)}'`;
228
231
  }
232
+ var init_shell_quote = __esmMin((() => {}));
233
+ //#endregion
234
+ //#region ../../lib/launcher-codex-command.ts
235
+ /**
236
+ * Codex command-line construction for the launcher generator (PAN-3300).
237
+ *
238
+ * Extracted from launcher-generator.ts (file-size ceiling): every `codex` and
239
+ * codex-app-server invocation shape lives here. The generator passes the
240
+ * LauncherConfig fields these shapes read plus its own PTY-supervisor wrapper,
241
+ * so this module stays a leaf — it never imports back into the generator.
242
+ */
243
+ function buildCodexCommand(config, useExec, wrap) {
244
+ const cmd = computeCodexCommandTokens(config, useExec, wrap);
245
+ const flat = cmd.join(" ").replace(/\s+/g, " ");
246
+ const applied = /(^|\s)resume(\s|$)/.test(flat) ? "YES" : "no";
247
+ console.log(`[codex-launcher] agent=${config.overdeckEnv?.agentId ?? "?"} mode=${config.codexMode ?? "exec"} resumeSessionId=${config.resumeSessionId ?? "(none)"} resumeApplied=${applied} cmd=${flat.slice(0, 200)}`);
248
+ return cmd;
249
+ }
250
+ function computeCodexCommandTokens(config, useExec, wrap) {
251
+ const codexMode = config.codexMode ?? "exec";
252
+ if (codexMode === "tui") {
253
+ const tokens = ["codex"];
254
+ if (config.resumeSessionId) tokens.push("resume");
255
+ tokens.push("-c", "project_doc_max_bytes=0");
256
+ if (config.resumeSessionId) tokens.push(shellQuote$1(config.resumeSessionId));
257
+ const cmd = wrap(tokens.join(" "));
258
+ return [useExec ? `exec ${cmd}` : cmd];
259
+ }
260
+ if (codexMode === "work-tui") {
261
+ const tokens = ["codex"];
262
+ if (config.resumeSessionId) tokens.push("resume");
263
+ if (config.model) tokens.push("-m", shellQuoteModelIdSync(config.model));
264
+ if (config.resumeSessionId) tokens.push(shellQuote$1(config.resumeSessionId));
265
+ const cmd = wrap(tokens.join(" "));
266
+ return [useExec ? `exec ${cmd}` : cmd];
267
+ }
268
+ if (codexMode === "app-server") {
269
+ const tokens = ["node", shellQuote$1(join(packageRoot, "dist", "codex-app-server-host.js"))];
270
+ if (config.model) tokens.push("--model", shellQuoteModelIdSync(config.model));
271
+ if (config.resumeSessionId) tokens.push("--resume", shellQuote$1(config.resumeSessionId));
272
+ const cmd = tokens.join(" ");
273
+ return [useExec ? `exec ${cmd}` : cmd];
274
+ }
275
+ const isResume = Boolean(config.resumeSessionId);
276
+ const tokens = ["codex", "exec"];
277
+ if (isResume) tokens.push("resume");
278
+ if (config.model) tokens.push("-m", shellQuoteModelIdSync(config.model));
279
+ tokens.push("-c", "approval_policy=never");
280
+ const sandbox = toCodexSandboxValue(config.codexSandboxMode);
281
+ if (isResume) tokens.push("-c", `sandbox_mode=${sandbox}`);
282
+ else tokens.push("-s", sandbox);
283
+ tokens.push("--skip-git-repo-check");
284
+ if (isResume) tokens.push(shellQuote$1(config.resumeSessionId));
285
+ if (config.promptFile) tokens.push("\"$prompt\"");
286
+ else if (config.promptInline) tokens.push(shellQuote$1(config.promptInline));
287
+ const cmd = tokens.join(" ").replace(/\s+/g, " ").trim();
288
+ return [useExec ? `exec ${cmd}` : cmd];
289
+ }
290
+ var init_launcher_codex_command = __esmMin((() => {
291
+ init_codex();
292
+ init_model_validation();
293
+ init_paths();
294
+ init_shell_quote();
295
+ }));
296
+ //#endregion
297
+ //#region ../../lib/launcher-generator.ts
229
298
  /**
230
299
  * Build the trailing `--mcp-config <path> --dangerously-load-development-channels server:<name>`
231
300
  * fragment when both channels-bridge fields are set. Returns an empty string when
@@ -237,13 +306,13 @@ function shellQuote(value) {
237
306
  function buildChannelsArgs(config) {
238
307
  if (!config.channelsBridgeMcpConfig) return "";
239
308
  const serverName = config.channelsBridgeServerName ?? "overdeck-bridge";
240
- return ` --mcp-config ${shellQuote(config.channelsBridgeMcpConfig)} --dangerously-load-development-channels server:${serverName}`;
309
+ return ` --mcp-config ${shellQuote$1(config.channelsBridgeMcpConfig)} --dangerously-load-development-channels server:${serverName}`;
241
310
  }
242
311
  function wrapWithSupervisor(config, cmd) {
243
312
  if (!config.useSupervisor) return cmd;
244
313
  if (!getHarnessBehavior(config.harness ?? "claude-code").supportsPtySupervisor || config.reviewSignal) return cmd;
245
314
  if (!config.supervisorScriptPath) throw new Error("LauncherConfig.supervisorScriptPath is required when useSupervisor=true");
246
- return `node ${shellQuote(config.supervisorScriptPath)} ${cmd}`;
315
+ return `node ${shellQuote$1(config.supervisorScriptPath)} ${cmd}`;
247
316
  }
248
317
  /**
249
318
  * Canonical launcher script generator.
@@ -256,6 +325,7 @@ function wrapWithSupervisor(config, cmd) {
256
325
  function generateLauncherScriptSync(config) {
257
326
  const lines = [];
258
327
  lines.push("#!/bin/bash");
328
+ lines.push("export OVERDECK_HOST_TMUX=\"$TMUX\" OVERDECK_HOST_TMUX_PANE=\"$TMUX_PANE\"");
259
329
  lines.push("unset TMUX TMUX_PANE STY");
260
330
  if (config.setPipefail) lines.push("set -o pipefail");
261
331
  lines.push("command -v mkcert >/dev/null 2>&1 && export NODE_EXTRA_CA_CERTS=\"$(mkcert -CAROOT)/rootCA.pem\"");
@@ -271,22 +341,22 @@ function generateLauncherScriptSync(config) {
271
341
  const explicitlySetOverdeckKeys = /* @__PURE__ */ new Set();
272
342
  if (config.overdeckEnv) {
273
343
  if (config.overdeckEnv.agentId != null) {
274
- lines.push(`export OVERDECK_AGENT_ID=${shellQuote(config.overdeckEnv.agentId)}`);
344
+ lines.push(`export OVERDECK_AGENT_ID=${shellQuote$1(config.overdeckEnv.agentId)}`);
275
345
  explicitlySetOverdeckKeys.add("OVERDECK_AGENT_ID");
276
346
  }
277
347
  if (config.overdeckEnv.issueId != null) {
278
- lines.push(`export OVERDECK_ISSUE_ID=${shellQuote(config.overdeckEnv.issueId)}`);
348
+ lines.push(`export OVERDECK_ISSUE_ID=${shellQuote$1(config.overdeckEnv.issueId)}`);
279
349
  explicitlySetOverdeckKeys.add("OVERDECK_ISSUE_ID");
280
350
  }
281
351
  if (config.overdeckEnv.sessionType != null) {
282
- lines.push(`export OVERDECK_SESSION_TYPE=${shellQuote(config.overdeckEnv.sessionType)}`);
352
+ lines.push(`export OVERDECK_SESSION_TYPE=${shellQuote$1(config.overdeckEnv.sessionType)}`);
283
353
  explicitlySetOverdeckKeys.add("OVERDECK_SESSION_TYPE");
284
354
  }
285
355
  }
286
356
  if (config.overdeckEnv?.agentId && config.spawnMode !== "conversation") lines.push(...buildGitGuardLines(config.overdeckEnv.agentId, config.workingDir));
287
357
  if (config.extraEnvExports) for (const expr of config.extraEnvExports) lines.push(expr);
288
- if (config.codexHome) lines.push(`export CODEX_HOME=${shellQuote(config.codexHome)}`);
289
- if (config.changeDir !== false) lines.push(`cd -- ${shellQuote(config.workingDir)}`);
358
+ if (config.codexHome) lines.push(`export CODEX_HOME=${shellQuote$1(config.codexHome)}`);
359
+ if (config.changeDir !== false) lines.push(`cd -- ${shellQuote$1(config.workingDir)}`);
290
360
  if (config.unsetProviderEnv) for (const key of PROVIDER_ENV_UNSETS) lines.push(`unset ${key}`);
291
361
  if (config.providerExports) {
292
362
  const trimmed = config.providerExports.trimEnd();
@@ -305,19 +375,19 @@ function generateLauncherScriptSync(config) {
305
375
  if (keysToUnset.length > 0) lines.push(`unset ${keysToUnset.join(" ")}`);
306
376
  }
307
377
  if (config.trapHup) lines.push("trap '' HUP");
308
- if (config.promptFile && config.promptFileMode !== "stdin") lines.push(`prompt=$(cat ${shellQuote(config.promptFile)})`);
309
- if (config.debugLog) lines.push(`echo "[launcher] Claude starting at $(date)" >> ${shellQuote(config.debugLog)}`);
378
+ if (config.promptFile && config.promptFileMode !== "stdin") lines.push(`prompt=$(cat ${shellQuote$1(config.promptFile)})`);
379
+ if (config.debugLog) lines.push(`echo "[launcher] Claude starting at $(date)" >> ${shellQuote$1(config.debugLog)}`);
310
380
  const commandParts = buildCommand(config);
311
381
  if (commandParts.length > 0) lines.push(...commandParts);
312
382
  if (config.debugLog) {
313
383
  lines.push("CLAUDE_EXIT=$?");
314
- lines.push(`echo "[launcher] Claude exited with code $CLAUDE_EXIT at $(date)" >> ${shellQuote(config.debugLog)}`);
384
+ lines.push(`echo "[launcher] Claude exited with code $CLAUDE_EXIT at $(date)" >> ${shellQuote$1(config.debugLog)}`);
315
385
  }
316
386
  if (config.role === "plan") {
317
387
  lines.push("echo \"\"");
318
388
  lines.push("echo \"Planning agent has exited. Session kept alive for review.\"");
319
389
  lines.push("echo \"Click 'Done' in the dashboard when ready to hand off to implementation.\"");
320
- if (config.debugLog) lines.push(`echo "[launcher] Keep-alive loop starting at $(date)" >> ${shellQuote(config.debugLog)}`);
390
+ if (config.debugLog) lines.push(`echo "[launcher] Keep-alive loop starting at $(date)" >> ${shellQuote$1(config.debugLog)}`);
321
391
  }
322
392
  if (config.spawnMode === "conversation") {
323
393
  lines.push("echo \"\"");
@@ -333,14 +403,15 @@ function buildCommand(config) {
333
403
  const behavior = getHarnessBehavior(config.harness ?? "claude-code");
334
404
  if (config.spawnMode === "conversation") {
335
405
  if (behavior.launchCommandKind === "ohmypi-rpc") return buildOhmypiCommand(config, false);
336
- if (behavior.launchCommandKind === "codex-work-tui") return buildCodexCommand(config, false);
406
+ if (behavior.launchCommandKind === "codex-work-tui") return buildCodexCommand(config, false, (cmd) => wrapWithSupervisor(config, cmd));
337
407
  if (behavior.launchCommandKind === "acp-host") return buildAcpCommand(config, false);
408
+ if (behavior.launchCommandKind === "kimi-code-tui") return buildKimiCodeCommand(config, false);
338
409
  if (config.baseCommand) {
339
410
  let cmd = config.baseCommand;
340
411
  cmd += buildChannelsArgs(config);
341
412
  const args = [];
342
- if (config.resumeSessionId) args.push(`--resume ${shellQuote(config.resumeSessionId)}`);
343
- else if (config.sessionId) args.push(`--session-id ${shellQuote(config.sessionId)}`);
413
+ if (config.resumeSessionId) args.push(`--resume ${shellQuote$1(config.resumeSessionId)}`);
414
+ else if (config.sessionId) args.push(`--session-id ${shellQuote$1(config.sessionId)}`);
344
415
  if (config.extraArgs) args.push(config.extraArgs);
345
416
  parts.push(wrapWithSupervisor(config, `${cmd} ${args.join(" ")}`.trim()));
346
417
  }
@@ -363,22 +434,22 @@ function buildReviewSubRoleCommand(config) {
363
434
  const inner = buildNonConversationCommand(config, false);
364
435
  if (inner.length === 0) return inner;
365
436
  const claudeCmd = `timeout ${sig.timeoutSeconds} ${inner[0]}`;
366
- const synth = shellQuote(sig.synthesisAgentId);
437
+ const synth = shellQuote$1(sig.synthesisAgentId);
367
438
  const out = sig.outputPath;
368
439
  const role = sig.subRole;
369
- const pidFile = shellQuote(sig.launcherPidPath);
440
+ const pidFile = shellQuote$1(sig.launcherPidPath);
370
441
  return [
371
442
  `echo $$ > ${pidFile}`,
372
443
  claudeCmd,
373
444
  "CLAUDE_EXIT=$?",
374
445
  `if [ "$CLAUDE_EXIT" = "124" ]; then`,
375
446
  ` pan tell ${synth} "REVIEWER_TIMEOUT ${role} reviewer exceeded ${sig.timeoutSeconds}s deadline" || true`,
376
- `elif [ -s ${shellQuote(out)} ]; then`,
447
+ `elif [ -s ${shellQuote$1(out)} ]; then`,
377
448
  ` pan tell ${synth} "REVIEWER_READY ${role} ${out}" || true`,
378
449
  `else`,
379
450
  ` pan tell ${synth} "REVIEWER_FAILED ${role} reviewer exited (code $CLAUDE_EXIT) without writing report" || true`,
380
451
  `fi`,
381
- `touch ${shellQuote(sig.signalMarkerPath)}`,
452
+ `touch ${shellQuote$1(sig.signalMarkerPath)}`,
382
453
  `rm -f ${pidFile}`
383
454
  ];
384
455
  }
@@ -393,8 +464,9 @@ function buildReviewSubRoleCommand(config) {
393
464
  function buildNonConversationCommand(config, useExec) {
394
465
  const behavior = getHarnessBehavior(config.harness ?? "claude-code");
395
466
  if (behavior.launchCommandKind === "ohmypi-rpc") return buildOhmypiCommand(config, useExec);
396
- if (behavior.launchCommandKind === "codex-work-tui") return buildCodexCommand(config, useExec);
467
+ if (behavior.launchCommandKind === "codex-work-tui") return buildCodexCommand(config, useExec, (cmd) => wrapWithSupervisor(config, cmd));
397
468
  if (behavior.launchCommandKind === "acp-host") return buildAcpCommand(config, useExec);
469
+ if (behavior.launchCommandKind === "kimi-code-tui") return buildKimiCodeCommand(config, useExec);
398
470
  const parts = [];
399
471
  if (!config.baseCommand) return parts;
400
472
  let cmd = config.baseCommand;
@@ -403,14 +475,14 @@ function buildNonConversationCommand(config, useExec) {
403
475
  for (const flag of config.permissionFlags) if (!cmdTokens.includes(flag)) cmd += ` ${flag}`;
404
476
  }
405
477
  cmd += buildChannelsArgs(config);
406
- if (config.resumeSessionId) cmd += ` --resume ${shellQuote(config.resumeSessionId)}`;
407
- if (config.sessionId) cmd += ` --session-id ${shellQuote(config.sessionId)}`;
478
+ if (config.resumeSessionId) cmd += ` --resume ${shellQuote$1(config.resumeSessionId)}`;
479
+ if (config.sessionId) cmd += ` --session-id ${shellQuote$1(config.sessionId)}`;
408
480
  if (config.model) cmd += ` --model ${shellQuoteModelIdSync(config.model)}`;
409
481
  if (config.extraArgs) cmd += ` ${config.extraArgs}`;
410
- for (const file of systemPromptFiles(config)) cmd += ` --append-system-prompt-file ${shellQuote(file)}`;
411
- if (config.promptFile) if (config.promptFileMode === "stdin") cmd += ` < ${shellQuote(config.promptFile)}`;
482
+ for (const file of systemPromptFiles(config)) cmd += ` --append-system-prompt-file ${shellQuote$1(file)}`;
483
+ if (config.promptFile) if (config.promptFileMode === "stdin") cmd += ` < ${shellQuote$1(config.promptFile)}`;
412
484
  else cmd += " \"$prompt\"";
413
- if (config.promptInline) cmd += ` ${shellQuote(config.promptInline)}`;
485
+ if (config.promptInline) cmd += ` ${shellQuote$1(config.promptInline)}`;
414
486
  const wrapped = wrapWithSupervisor(config, cmd.trim());
415
487
  parts.push(useExec ? `exec ${wrapped}` : wrapped);
416
488
  return parts;
@@ -449,22 +521,22 @@ function buildOhmypiCommand(config, useExec) {
449
521
  const tokens = ["omp"];
450
522
  if (piMode === "rpc") tokens.push("--mode", "rpc");
451
523
  if (config.model) tokens.push("--model", shellQuoteModelIdSync(qualifyPiModel(config.model)));
452
- tokens.push("--session-dir", shellQuote(config.piSessionDir));
453
- if (config.piExtensionPath) tokens.push("--extension", shellQuote(config.piExtensionPath));
454
- for (const file of systemPromptFiles(config)) tokens.push("--append-system-prompt", `"$(cat ${shellQuote(file)} 2>/dev/null)"`);
455
- if (config.resumeSessionId) tokens.push("--resume", shellQuote(config.resumeSessionId));
524
+ tokens.push("--session-dir", shellQuote$1(config.piSessionDir));
525
+ if (config.piExtensionPath) tokens.push("--extension", shellQuote$1(config.piExtensionPath));
526
+ for (const file of systemPromptFiles(config)) tokens.push("--append-system-prompt", `"$(cat ${shellQuote$1(file)} 2>/dev/null)"`);
527
+ if (config.resumeSessionId) tokens.push("--resume", shellQuote$1(config.resumeSessionId));
456
528
  if (config.extraArgs) tokens.push(config.extraArgs);
457
529
  if (config.promptFile) tokens.push("--append-system-prompt", "\"$prompt\"");
458
- else if (config.promptInline) tokens.push("--append-system-prompt", shellQuote(config.promptInline));
530
+ else if (config.promptInline) tokens.push("--append-system-prompt", shellQuote$1(config.promptInline));
459
531
  let cmd = tokens.join(" ").replace(/\s+/g, " ").trim();
460
532
  if (piMode === "rpc") {
461
533
  const agentDir = dirname(config.piFifoPath);
462
534
  const outputLogPath = join(agentDir, "output.log");
463
535
  const exitStatusPath = join(agentDir, "exit-status");
464
536
  return [
465
- `${cmd} <> ${shellQuote(config.piFifoPath)} >> ${shellQuote(outputLogPath)} 2>&1`,
537
+ `${cmd} <> ${shellQuote$1(config.piFifoPath)} >> ${shellQuote$1(outputLogPath)} 2>&1`,
466
538
  "__omp_exit=$?",
467
- `printf '%s %s\\n' "$__omp_exit" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > ${shellQuote(exitStatusPath)}`,
539
+ `printf '%s %s\\n' "$__omp_exit" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > ${shellQuote$1(exitStatusPath)}`,
468
540
  "exit $__omp_exit"
469
541
  ];
470
542
  }
@@ -505,78 +577,56 @@ function buildAcpCommand(config, useExec) {
505
577
  if (!config.acpBinaryPath) throw new Error("acp launcher requires acpBinaryPath");
506
578
  const tokens = [
507
579
  "node",
508
- shellQuote(join(packageRoot, "dist", "acp-host.js")),
580
+ shellQuote$1(join(packageRoot, "dist", "acp-host.js")),
509
581
  "--agent",
510
- shellQuote(config.acpAgentId),
582
+ shellQuote$1(config.acpAgentId),
511
583
  "--provider",
512
- shellQuote(config.acpProvider),
584
+ shellQuote$1(config.acpProvider),
513
585
  "--workspace",
514
- shellQuote(config.acpWorkspace),
586
+ shellQuote$1(config.acpWorkspace),
515
587
  "--binary-path",
516
- shellQuote(config.acpBinaryPath)
588
+ shellQuote$1(config.acpBinaryPath)
517
589
  ];
518
- if (config.resumeSessionId) tokens.push("--resume", shellQuote(config.resumeSessionId));
590
+ if (config.resumeSessionId) tokens.push("--resume", shellQuote$1(config.resumeSessionId));
519
591
  if (config.model) tokens.push("--model", shellQuoteModelIdSync(config.model));
520
- if (config.acpContextFile) tokens.push("--context-file", shellQuote(config.acpContextFile));
592
+ if (config.acpContextFile) tokens.push("--context-file", shellQuote$1(config.acpContextFile));
521
593
  const cmd = tokens.join(" ");
522
594
  return [useExec ? `exec ${cmd}` : cmd];
523
595
  }
524
- function buildCodexCommand(config, useExec) {
525
- const cmd = computeCodexCommandTokens(config, useExec);
526
- const flat = cmd.join(" ").replace(/\s+/g, " ");
527
- const applied = /(^|\s)resume(\s|$)/.test(flat) ? "YES" : "no";
528
- console.log(`[codex-launcher] agent=${config.overdeckEnv?.agentId ?? "?"} mode=${config.codexMode ?? "exec"} resumeSessionId=${config.resumeSessionId ?? "(none)"} resumeApplied=${applied} cmd=${flat.slice(0, 200)}`);
529
- return cmd;
530
- }
531
- function computeCodexCommandTokens(config, useExec) {
532
- const codexMode = config.codexMode ?? "exec";
533
- if (codexMode === "tui") {
534
- const tokens = ["codex"];
535
- if (config.resumeSessionId) tokens.push("resume");
536
- tokens.push("-c", "project_doc_max_bytes=0");
537
- if (config.resumeSessionId) tokens.push(shellQuote(config.resumeSessionId));
538
- const cmd = wrapWithSupervisor(config, tokens.join(" "));
539
- return [useExec ? `exec ${cmd}` : cmd];
540
- }
541
- if (codexMode === "work-tui") {
542
- const tokens = ["codex"];
543
- if (config.resumeSessionId) tokens.push("resume");
544
- if (config.model) tokens.push("-m", shellQuoteModelIdSync(config.model));
545
- if (config.resumeSessionId) tokens.push(shellQuote(config.resumeSessionId));
546
- const cmd = wrapWithSupervisor(config, tokens.join(" "));
547
- return [useExec ? `exec ${cmd}` : cmd];
548
- }
549
- if (codexMode === "app-server") {
550
- const tokens = ["node", shellQuote(join(packageRoot, "dist", "codex-app-server-host.js"))];
551
- if (config.model) tokens.push("--model", shellQuoteModelIdSync(config.model));
552
- if (config.resumeSessionId) tokens.push("--resume", shellQuote(config.resumeSessionId));
553
- const cmd = tokens.join(" ");
554
- return [useExec ? `exec ${cmd}` : cmd];
555
- }
556
- const isResume = Boolean(config.resumeSessionId);
557
- const tokens = ["codex", "exec"];
558
- if (isResume) tokens.push("resume");
559
- if (config.model) tokens.push("-m", shellQuoteModelIdSync(config.model));
560
- tokens.push("-c", "approval_policy=never");
561
- const sandbox = toCodexSandboxValue(config.codexSandboxMode);
562
- if (isResume) tokens.push("-c", `sandbox_mode=${sandbox}`);
563
- else tokens.push("-s", sandbox);
564
- tokens.push("--skip-git-repo-check");
565
- if (isResume) tokens.push(shellQuote(config.resumeSessionId));
566
- if (config.promptFile) tokens.push("\"$prompt\"");
567
- else if (config.promptInline) tokens.push(shellQuote(config.promptInline));
568
- let cmd = tokens.join(" ").replace(/\s+/g, " ").trim();
596
+ /**
597
+ * Build a native Kimi Code CLI command line (D2/erratum E1 — RESOLVED 0.29.2
598
+ * checkpoint): `kimi [-S <id>] -m <model> --yolo [--add-dir <dir>]...`,
599
+ * wrapped in the PTY supervisor like claude-code
600
+ * (KIMI_CODE_BEHAVIOR.supportsPtySupervisor is true). Deliberately NO
601
+ * --session (long form), NO --work-dir (neither flag exists on the installed
602
+ * binary), and NO -p/--print (v1 work agents run interactively). On a fresh
603
+ * launch, Kimi generates its own session id, captured post-launch as the
604
+ * newest session directory under the workspace's workDirKey bucket; on a
605
+ * true resume, that captured id is passed back via `-S` (PAN-1837).
606
+ */
607
+ function buildKimiCodeCommand(config, useExec) {
608
+ if (!config.kimiCodeModel) throw new Error("kimi-code launcher requires kimiCodeModel");
609
+ const tokens = [
610
+ "kimi",
611
+ "-m",
612
+ shellQuoteModelIdSync(config.kimiCodeModel)
613
+ ];
614
+ if (config.resumeSessionId) tokens.push("-S", shellQuote$1(config.resumeSessionId));
615
+ if (config.kimiCodeYolo) tokens.push("--yolo");
616
+ for (const dir of config.kimiCodeAddDirs ?? []) tokens.push("--add-dir", shellQuote$1(dir));
617
+ const cmd = wrapWithSupervisor(config, tokens.join(" "));
569
618
  return [useExec ? `exec ${cmd}` : cmd];
570
619
  }
571
620
  var PROVIDER_ENV_UNSETS;
572
621
  var init_launcher_generator = __esmMin((() => {
573
- init_codex();
574
622
  init_behavior();
575
623
  init_providers();
576
624
  init_model_validation();
577
625
  init_ui_theme();
578
626
  init_paths();
579
627
  init_launcher_git_guard();
628
+ init_launcher_codex_command();
629
+ init_shell_quote();
580
630
  PROVIDER_ENV_UNSETS = [
581
631
  "ANTHROPIC_API_KEY",
582
632
  "ANTHROPIC_BASE_URL",
@@ -620,11 +670,15 @@ var init_provenance = __esmMin((() => {}));
620
670
  *
621
671
  * (none) ──paste──► PENDING ──atomic claim+Enter──► TERMINAL
622
672
  *
623
- * - `sendKeysDedup` atomically pastes and sets the PENDING option only when
624
- * neither option is set. A replay that finds PENDING (a prior attempt
625
- * crashed before submitting) returns 'submit-pending' WITHOUT re-pasting.
626
- * A POISON breadcrumb (a terminal marker that proved false but could not be
627
- * rolled back) is repaired first and never honored as a dedup.
673
+ * - `sendKeysDedup` atomically pastes and sets PENDING plus payload-state
674
+ * `unverified`. Recovery proves that payload in the cursor-anchored composer
675
+ * before reusing the claim, or re-pastes after positive absence. An Enter
676
+ * attempt atomically advances the state to `enter-attempted`, so rollback
677
+ * recovery does not duplicate content that may already have landed. State
678
+ * reads are strict; unset legacy and unknown values fail closed.
679
+ * A POISON breadcrumb (a terminal marker that proved
680
+ * false but could not be rolled back) is repaired first and never honored as
681
+ * a dedup.
628
682
  * - `completeKeyedSubmit` issues ONE `if-shell`: only when PENDING is
629
683
  * present, TERMINAL absent, and the pane alive does the tmux server send
630
684
  * the Enter and then flip TERMINAL and clear PENDING — in that order, in a
@@ -636,6 +690,9 @@ var init_provenance = __esmMin((() => {}));
636
690
  * server-side condition and sends nothing, so no stray Enter can ever land
637
691
  * in a composer holding unrelated text.
638
692
  */
693
+ function shellQuote(value) {
694
+ return `'${value.replace(/'/g, `'\\''`)}'`;
695
+ }
639
696
  /** Set once the keyed message has been SUBMITTED (Enter sent). */
640
697
  function dedupTerminalOptionName(dedupKey) {
641
698
  return `@overdeck-dedup-${dedupKey}`;
@@ -663,9 +720,16 @@ function dedupPoisonOptionName(dedupKey) {
663
720
  function dedupTargetOptionName(dedupKey) {
664
721
  return `@overdeck-dedup-target-${dedupKey}`;
665
722
  }
723
+ /** Explicit payload phase for a pending claim; unset means legacy/unknown. */
724
+ function dedupPayloadStateOptionName(dedupKey) {
725
+ return `@overdeck-dedup-payload-state-${dedupKey}`;
726
+ }
666
727
  function assertValidDedupKey(dedupKey) {
667
728
  if (!DEDUP_KEY_RE.test(dedupKey)) throw new Error(`dedupKey must match [A-Za-z0-9:_-]+, got: ${dedupKey.slice(0, 40)}`);
668
729
  }
730
+ function isKeyedSubmitBlockedMenuError(error) {
731
+ return error instanceof KeyedSubmitBlockedMenuError || error instanceof Error && error.name === "KeyedSubmitBlockedMenuError";
732
+ }
669
733
  /** pane_pid + pane_dead in one read — the identity of the Enter's target. */
670
734
  async function readPaneTarget(sessionName) {
671
735
  return tmuxExecAsync([
@@ -711,6 +775,60 @@ async function readMarkerStrict(sessionName, option) {
711
775
  ], { encoding: "utf-8" });
712
776
  return String(result.stdout).trim();
713
777
  }
778
+ async function readPendingPayloadState(sessionName, dedupKey, option, readStrict, context) {
779
+ let state;
780
+ try {
781
+ state = await readStrict(sessionName, option);
782
+ } catch (error) {
783
+ throw new KeyedMarkerVerificationError(sessionName, `${context} payload-state read (key "${dedupKey}")`, { cause: error });
784
+ }
785
+ if (state === PAYLOAD_STATE_UNVERIFIED || state === PAYLOAD_STATE_ENTER_ATTEMPTED) return state;
786
+ throw new KeyedMarkerVerificationError(sessionName, `${context} payload-state is ${state === "" ? "legacy/unset" : `unknown value "${state}"`} (key "${dedupKey}")`);
787
+ }
788
+ async function captureVisiblePane(sessionName) {
789
+ const [pane, cursor] = await Promise.all([tmuxExecAsync([
790
+ "capture-pane",
791
+ "-t",
792
+ sessionName,
793
+ "-p"
794
+ ], { encoding: "utf-8" }), tmuxExecAsync([
795
+ "display-message",
796
+ "-p",
797
+ "-t",
798
+ sessionName,
799
+ "#{cursor_y}"
800
+ ], { encoding: "utf-8" })]);
801
+ const cursorY = Number.parseInt(String(cursor.stdout).trim(), 10);
802
+ if (!Number.isInteger(cursorY)) throw new Error(`Unreadable cursor row for ${sessionName}`);
803
+ return {
804
+ text: String(pane.stdout),
805
+ cursorY
806
+ };
807
+ }
808
+ function activeComposerRegion(viewport) {
809
+ const lines = viewport.text.replace(PANE_ANSI_PATTERN, "").split("\n").map((line) => line.replace(/\s+$/g, ""));
810
+ if (lines.every((line) => line.trim() === "")) return null;
811
+ if (viewport.cursorY < 0 || viewport.cursorY >= lines.length) return null;
812
+ let start = viewport.cursorY;
813
+ for (let index = viewport.cursorY; index >= 0; index -= 1) if (COMPOSER_TOP_BOUNDARY.test(lines[index])) {
814
+ start = index + 1;
815
+ break;
816
+ }
817
+ return lines.slice(start, viewport.cursorY + 1).join("\n");
818
+ }
819
+ async function pendingPayloadPresence(sessionName, keys, readViewport) {
820
+ const verifyLine = deliveryVerifyLine(keys);
821
+ if (verifyLine.length < 3) return "unproven";
822
+ let viewport;
823
+ try {
824
+ viewport = await readViewport(sessionName);
825
+ } catch {
826
+ return "unproven";
827
+ }
828
+ const composer = activeComposerRegion(viewport);
829
+ if (composer === null) return "unproven";
830
+ return composer.includes(verifyLine.slice(0, 40)) ? "present" : "absent";
831
+ }
714
832
  /**
715
833
  * Clear the poison breadcrumb and VERIFY it is gone with a strict read.
716
834
  * EVERY failure here — the clear command, the verification read, or a
@@ -755,6 +873,7 @@ async function repairPoisonedMarkers(sessionName, dedupKey, sendId, readStrict)
755
873
  const terminalOption = dedupTerminalOptionName(dedupKey);
756
874
  const pendingOption = dedupPendingOptionName(dedupKey);
757
875
  const poisonOption = dedupPoisonOptionName(dedupKey);
876
+ const payloadStateOption = dedupPayloadStateOptionName(dedupKey);
758
877
  await tmuxExecAsync([
759
878
  "set-option",
760
879
  "-u",
@@ -766,16 +885,27 @@ async function repairPoisonedMarkers(sessionName, dedupKey, sendId, readStrict)
766
885
  "-t",
767
886
  sessionName,
768
887
  pendingOption,
769
- sendId
888
+ sendId,
889
+ ";",
890
+ "set-option",
891
+ "-t",
892
+ sessionName,
893
+ payloadStateOption,
894
+ PAYLOAD_STATE_ENTER_ATTEMPTED
770
895
  ], { encoding: "utf-8" });
771
896
  let repairedTerminal;
772
897
  let repairedPending;
898
+ let repairedPayloadState;
773
899
  try {
774
- [repairedTerminal, repairedPending] = await Promise.all([readStrict(sessionName, terminalOption), readStrict(sessionName, pendingOption)]);
900
+ [repairedTerminal, repairedPending, repairedPayloadState] = await Promise.all([
901
+ readStrict(sessionName, terminalOption),
902
+ readStrict(sessionName, pendingOption),
903
+ readStrict(sessionName, payloadStateOption)
904
+ ]);
775
905
  } catch {
776
906
  throw new KeyedMarkerVerificationError(sessionName, `repair verification of key "${dedupKey}"`);
777
907
  }
778
- if (repairedTerminal !== "" || repairedPending === "") throw new Error(`Keyed tmux markers for ${sessionName} are poisoned and could not be repaired (key "${dedupKey}")`);
908
+ if (repairedTerminal !== "" || repairedPending === "" || repairedPayloadState !== PAYLOAD_STATE_ENTER_ATTEMPTED) throw new Error(`Keyed tmux markers for ${sessionName} are poisoned and could not be repaired (key "${dedupKey}")`);
779
909
  await clearPoisonVerified(sessionName, poisonOption, `repair of key "${dedupKey}"`, readStrict);
780
910
  }
781
911
  /**
@@ -798,6 +928,7 @@ async function sendKeysDedup(sessionName, keys, dedupKey, caller, deps = {}) {
798
928
  const terminalOption = dedupTerminalOptionName(dedupKey);
799
929
  const pendingOption = dedupPendingOptionName(dedupKey);
800
930
  const poisonOption = dedupPoisonOptionName(dedupKey);
931
+ const payloadStateOption = dedupPayloadStateOptionName(dedupKey);
801
932
  const sendId = randomUUID();
802
933
  let poisonMarker;
803
934
  try {
@@ -823,7 +954,7 @@ async function sendKeysDedup(sessionName, keys, dedupKey, caller, deps = {}) {
823
954
  "-t",
824
955
  sessionName,
825
956
  `test -z "$(tmux show-option -qv -t ${sessionName} ${pendingOption})" && test -z "$(tmux show-option -qv -t ${sessionName} ${terminalOption})"`,
826
- `paste-buffer -b ${bufferName} -p -t ${sessionName} \; set-option -t ${sessionName} ${pendingOption} ${sendId} \; set-option -F -t ${sessionName} ${targetOption} '#{pane_pid}'`
957
+ `paste-buffer -b ${bufferName} -p -t ${sessionName} \; set-option -t ${sessionName} ${pendingOption} ${sendId} \; set-option -F -t ${sessionName} ${targetOption} '#{pane_pid}' \; set-option -t ${sessionName} ${payloadStateOption} ${PAYLOAD_STATE_UNVERIFIED}`
827
958
  ], { encoding: "utf-8" });
828
959
  const [pendingMarker, terminalMarker] = await Promise.all([read(sessionName, pendingOption), read(sessionName, terminalOption)]);
829
960
  if (terminalMarker !== "") return "deduplicated";
@@ -831,14 +962,27 @@ async function sendKeysDedup(sessionName, keys, dedupKey, caller, deps = {}) {
831
962
  if (pendingMarker !== "") {
832
963
  const recordedTarget = await read(sessionName, targetOption);
833
964
  const currentPid = (await (deps.readPaneTarget ?? readPaneTarget)(sessionName)).pid;
834
- if (recordedTarget !== "" && currentPid !== "" && recordedTarget === currentPid) return "submit-pending";
835
- await tmuxExecAsync([
965
+ const payloadState = await readPendingPayloadState(sessionName, dedupKey, payloadStateOption, readStrict, "pending claim");
966
+ const readViewport = deps.readPaneViewport ?? captureVisiblePane;
967
+ if (recordedTarget !== "" && currentPid !== "" && recordedTarget === currentPid) {
968
+ if (payloadState === PAYLOAD_STATE_ENTER_ATTEMPTED) return "submit-pending";
969
+ const presence = await pendingPayloadPresence(sessionName, keys, readViewport);
970
+ if (presence === "present") return "submit-pending";
971
+ if (presence === "unproven") throw new KeyedMarkerVerificationError(sessionName, `pending payload visibility (key "${dedupKey}")`);
972
+ }
973
+ const repasteArgs = [
836
974
  "if-shell",
837
975
  "-t",
838
976
  sessionName,
839
- `test -n "$(tmux show-option -qv -t ${sessionName} ${pendingOption})" && test -z "$(tmux show-option -qv -t ${sessionName} ${terminalOption})" && ! test "$(tmux display-message -p -t ${sessionName} '#{pane_pid}')" = "$(tmux show-option -qv -t ${sessionName} ${targetOption})"`,
840
- `paste-buffer -b ${bufferName} -p -t ${sessionName} \; set-option -t ${sessionName} ${pendingOption} ${sendId} \; set-option -F -t ${sessionName} ${targetOption} '#{pane_pid}'`
841
- ], { encoding: "utf-8" });
977
+ `test "$(tmux show-option -qv -t ${sessionName} ${pendingOption})" = ${shellQuote(pendingMarker)} && test -z "$(tmux show-option -qv -t ${sessionName} ${terminalOption})"`,
978
+ `paste-buffer -b ${bufferName} -p -t ${sessionName} \; set-option -t ${sessionName} ${pendingOption} ${sendId} \; set-option -F -t ${sessionName} ${targetOption} '#{pane_pid}' \; set-option -t ${sessionName} ${payloadStateOption} ${PAYLOAD_STATE_UNVERIFIED}`
979
+ ];
980
+ try {
981
+ if (deps.runTmuxCommand) await deps.runTmuxCommand(repasteArgs);
982
+ else await tmuxExecAsync(repasteArgs, { encoding: "utf-8" });
983
+ } catch (error) {
984
+ throw new KeyedMarkerVerificationError(sessionName, `pending payload re-paste command (key "${dedupKey}")`, { cause: error });
985
+ }
842
986
  const [repastedPending, repastedTerminal, repastedTarget] = await Promise.all([
843
987
  read(sessionName, pendingOption),
844
988
  read(sessionName, terminalOption),
@@ -848,7 +992,12 @@ async function sendKeysDedup(sessionName, keys, dedupKey, caller, deps = {}) {
848
992
  if (repastedPending === sendId) return "pasted";
849
993
  if (repastedPending !== "") {
850
994
  const nowPid = (await (deps.readPaneTarget ?? readPaneTarget)(sessionName)).pid;
851
- if (repastedTarget !== "" && nowPid !== "" && repastedTarget === nowPid) return "submit-pending";
995
+ const repastedPayloadState = await readPendingPayloadState(sessionName, dedupKey, payloadStateOption, readStrict, "concurrent claim");
996
+ if (repastedTarget !== "" && nowPid !== "" && repastedTarget === nowPid) {
997
+ if (repastedPayloadState === PAYLOAD_STATE_ENTER_ATTEMPTED) return "submit-pending";
998
+ if (await pendingPayloadPresence(sessionName, keys, readViewport) === "present") return "submit-pending";
999
+ }
1000
+ throw new KeyedMarkerVerificationError(sessionName, `concurrent pending payload visibility (key "${dedupKey}")`);
852
1001
  }
853
1002
  }
854
1003
  throw new Error(`Keyed tmux paste for ${sessionName} did not land and no dedup marker was recorded` + (caller ? ` (caller: ${caller})` : ""));
@@ -907,15 +1056,20 @@ async function completeKeyedSubmit(sessionName, dedupKey, deps = {}) {
907
1056
  const pendingOption = dedupPendingOptionName(dedupKey);
908
1057
  const poisonOption = dedupPoisonOptionName(dedupKey);
909
1058
  const targetOption = dedupTargetOptionName(dedupKey);
1059
+ const payloadStateOption = dedupPayloadStateOptionName(dedupKey);
910
1060
  await new Promise((resolve) => setTimeout(resolve, PASTE_SETTLE_MS));
911
1061
  const preTarget = await readTarget(sessionName);
912
1062
  const pendingBefore = await read(sessionName, pendingOption);
1063
+ if (pendingBefore !== "") {
1064
+ const paneSnapshot = await (deps.readPaneText ?? capturePaneText)(sessionName, 90).catch(() => "");
1065
+ if (paneSnapshot && paneHasBlockingChoiceMenu(paneSnapshot)) throw new KeyedSubmitBlockedMenuError(sessionName, dedupKey, paneSnapshot);
1066
+ }
913
1067
  await tmuxExecAsync([
914
1068
  "if-shell",
915
1069
  "-t",
916
1070
  sessionName,
917
1071
  `test -z "$(tmux show-option -qv -t ${sessionName} ${terminalOption})" && test -n "$(tmux show-option -qv -t ${sessionName} ${pendingOption})" && test "$(tmux display-message -p -t ${sessionName} '#{pane_dead}')" = "0" && test "$(tmux display-message -p -t ${sessionName} '#{pane_pid}')" = "$(tmux show-option -qv -t ${sessionName} ${targetOption})"`,
918
- `send-keys -t ${sessionName} C-m \; set-option -t ${sessionName} ${poisonOption} 1 \; set-option -t ${sessionName} ${terminalOption} 1 \; set-option -u -t ${sessionName} ${pendingOption}`
1072
+ `send-keys -t ${sessionName} C-m \; set-option -t ${sessionName} ${poisonOption} 1 \; set-option -t ${sessionName} ${terminalOption} 1 \; set-option -u -t ${sessionName} ${pendingOption} \; set-option -t ${sessionName} ${payloadStateOption} ${PAYLOAD_STATE_ENTER_ATTEMPTED}`
919
1073
  ], { encoding: "utf-8" });
920
1074
  const [terminalAfter, pendingAfter, postTarget, recordedTarget] = await Promise.all([
921
1075
  read(sessionName, terminalOption),
@@ -940,7 +1094,13 @@ async function completeKeyedSubmit(sessionName, dedupKey, deps = {}) {
940
1094
  "-u",
941
1095
  "-t",
942
1096
  sessionName,
943
- pendingOption
1097
+ pendingOption,
1098
+ ";",
1099
+ "set-option",
1100
+ "-t",
1101
+ sessionName,
1102
+ payloadStateOption,
1103
+ PAYLOAD_STATE_ENTER_ATTEMPTED
944
1104
  ] : [
945
1105
  "set-option",
946
1106
  "-u",
@@ -952,16 +1112,27 @@ async function completeKeyedSubmit(sessionName, dedupKey, deps = {}) {
952
1112
  "-t",
953
1113
  sessionName,
954
1114
  pendingOption,
955
- pendingBefore
1115
+ pendingBefore,
1116
+ ";",
1117
+ "set-option",
1118
+ "-t",
1119
+ sessionName,
1120
+ payloadStateOption,
1121
+ PAYLOAD_STATE_ENTER_ATTEMPTED
956
1122
  ], { encoding: "utf-8" }).catch(() => {});
957
1123
  let rolledTerminal;
958
1124
  let restoredPending;
1125
+ let remainingPayloadState;
959
1126
  try {
960
- [rolledTerminal, restoredPending] = await Promise.all([readStrict(sessionName, terminalOption), readStrict(sessionName, pendingOption)]);
1127
+ [rolledTerminal, restoredPending, remainingPayloadState] = await Promise.all([
1128
+ readStrict(sessionName, terminalOption),
1129
+ readStrict(sessionName, pendingOption),
1130
+ readStrict(sessionName, payloadStateOption)
1131
+ ]);
961
1132
  } catch {
962
1133
  throw new KeyedMarkerVerificationError(sessionName, `rollback verification of key "${dedupKey}"`);
963
1134
  }
964
- if (rolledTerminal === "" && restoredPending !== "") await clearPoisonVerified(sessionName, poisonOption, `verified rollback of key "${dedupKey}"`, readStrict).catch(() => {});
1135
+ if (rolledTerminal === "" && restoredPending !== "" && remainingPayloadState === PAYLOAD_STATE_ENTER_ATTEMPTED) await clearPoisonVerified(sessionName, poisonOption, `verified rollback of key "${dedupKey}"`, readStrict).catch(() => {});
965
1136
  throw new KeyedSubmitTargetDeadError(sessionName, dedupKey);
966
1137
  }
967
1138
  if (pendingAfter !== "") {
@@ -971,10 +1142,14 @@ async function completeKeyedSubmit(sessionName, dedupKey, deps = {}) {
971
1142
  }
972
1143
  throw new Error(`Keyed tmux submit for ${sessionName} found neither a pending claim nor a terminal marker — the paste vanished without submission`);
973
1144
  }
974
- var DEDUP_KEY_RE, PASTE_SETTLE_MS, KeyedSubmitTargetDeadError, KeyedMarkerVerificationError;
1145
+ var DEDUP_KEY_RE, PAYLOAD_STATE_UNVERIFIED, PAYLOAD_STATE_ENTER_ATTEMPTED, PASTE_SETTLE_MS, KeyedSubmitTargetDeadError, KeyedSubmitBlockedMenuError, KeyedMarkerVerificationError, PANE_ANSI_PATTERN, COMPOSER_TOP_BOUNDARY;
975
1146
  var init_tmux_dedup = __esmMin((() => {
976
1147
  init_tmux();
1148
+ init_errors();
1149
+ init_pane_choice_menu();
977
1150
  DEDUP_KEY_RE = /^[A-Za-z0-9:_-]+$/;
1151
+ PAYLOAD_STATE_UNVERIFIED = "unverified";
1152
+ PAYLOAD_STATE_ENTER_ATTEMPTED = "enter-attempted";
978
1153
  PASTE_SETTLE_MS = 300;
979
1154
  KeyedSubmitTargetDeadError = class extends Error {
980
1155
  constructor(sessionName, dedupKey) {
@@ -982,6 +1157,12 @@ var init_tmux_dedup = __esmMin((() => {
982
1157
  this.name = "KeyedSubmitTargetDeadError";
983
1158
  }
984
1159
  };
1160
+ KeyedSubmitBlockedMenuError = class extends MessageDeliveryFailed {
1161
+ constructor(sessionName, dedupKey, paneSnapshot) {
1162
+ super(`Keyed submit to ${sessionName} aborted: the pane is blocked on a choice menu, so Enter would answer that menu (key "${dedupKey}")`, sessionName, paneSnapshot);
1163
+ this.name = "KeyedSubmitBlockedMenuError";
1164
+ }
1165
+ };
985
1166
  KeyedMarkerVerificationError = class extends Error {
986
1167
  constructor(sessionName, context, options) {
987
1168
  const causeText = options?.cause instanceof Error ? `: ${options.cause.message}` : "";
@@ -989,6 +1170,8 @@ var init_tmux_dedup = __esmMin((() => {
989
1170
  this.name = "KeyedMarkerVerificationError";
990
1171
  }
991
1172
  };
1173
+ PANE_ANSI_PATTERN = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
1174
+ COMPOSER_TOP_BOUNDARY = /^\s*[─━═]{6,}/;
992
1175
  }));
993
1176
  //#endregion
994
1177
  //#region ../../lib/planning/auto-spawn-consent.ts
@@ -1136,6 +1319,6 @@ var init_auto_spawn_consent = __esmMin((() => {
1136
1319
  init_fs_lock();
1137
1320
  }));
1138
1321
  //#endregion
1139
- export { init_launcher_generator as C, requireModelOverrideSync as D, normalizeModelOverrideSync as E, shellQuoteModelIdSync as O, generateLauncherScriptSync as S, init_model_validation as T, init_tmux_dedup as _, readAutoSpawnOnFinalizeFlagAsync as a, isOperatorStartedBy as b, writeAutoSpawnOnFinalizeFlag as c, assertValidDedupKey as d, completeKeyedSubmit as f, dedupTerminalOptionName as g, dedupTargetOptionName as h, init_auto_spawn_consent as i, KeyedMarkerVerificationError as l, dedupPoisonOptionName as m, claimAutoSpawnConsentForWorkStart as n, releaseAutoSpawnConsentClaim as o, dedupPendingOptionName as p, completeAutoSpawnConsentClaim as r, withAutoSpawnConsentClaim as s, autoSpawnOnFinalizeFlagPath as t, KeyedSubmitTargetDeadError as u, sendKeysDedup as v, MODEL_ID_PATTERN as w, normalizeFlywheelRunId as x, init_provenance as y };
1322
+ export { generateLauncherScriptSync as C, normalizeModelOverrideSync as D, init_model_validation as E, requireModelOverrideSync as O, normalizeFlywheelRunId as S, MODEL_ID_PATTERN as T, init_tmux_dedup as _, readAutoSpawnOnFinalizeFlagAsync as a, init_provenance as b, writeAutoSpawnOnFinalizeFlag as c, assertValidDedupKey as d, completeKeyedSubmit as f, dedupTerminalOptionName as g, dedupTargetOptionName as h, init_auto_spawn_consent as i, shellQuoteModelIdSync as k, KeyedMarkerVerificationError as l, dedupPoisonOptionName as m, claimAutoSpawnConsentForWorkStart as n, releaseAutoSpawnConsentClaim as o, dedupPendingOptionName as p, completeAutoSpawnConsentClaim as r, withAutoSpawnConsentClaim as s, autoSpawnOnFinalizeFlagPath as t, KeyedSubmitTargetDeadError as u, isKeyedSubmitBlockedMenuError as v, init_launcher_generator as w, isOperatorStartedBy as x, sendKeysDedup as y };
1140
1323
 
1141
- //# sourceMappingURL=auto-spawn-consent-BooqhC3L.js.map
1324
+ //# sourceMappingURL=auto-spawn-consent-lXqRJ1Dr.js.map