zidane 7.2.4 → 8.0.4

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 (376) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -6
  3. package/dist/{acp-D-tVyUjw.js → acp-DQDhi2dj.js} +230 -77
  4. package/dist/acp-DQDhi2dj.js.map +1 -0
  5. package/dist/acp-cli.d.ts +1 -1
  6. package/dist/acp-cli.js +9 -66
  7. package/dist/acp-cli.js.map +1 -1
  8. package/dist/acp.d.ts +10 -590
  9. package/dist/acp.d.ts.map +1 -1
  10. package/dist/acp.js +3 -3
  11. package/dist/{agent-D0zZnGbt.js → agent-DSLNmBp0.js} +14401 -13214
  12. package/dist/agent-DSLNmBp0.js.map +1 -0
  13. package/dist/agent.d.ts +1 -1
  14. package/dist/agent.js +3 -2
  15. package/dist/aliasing-lVFbm81n.js +217 -0
  16. package/dist/aliasing-lVFbm81n.js.map +1 -0
  17. package/dist/{anthropic-C2aole0G.js → anthropic-CD00LhUP.js} +1442 -1264
  18. package/dist/anthropic-CD00LhUP.js.map +1 -0
  19. package/dist/artifacts-CV2hUKnL.js.map +1 -1
  20. package/dist/{atomic-write-B7zr1ddF.js → atomic-write-Ijgf2Mhc.js} +13 -3
  21. package/dist/atomic-write-Ijgf2Mhc.js.map +1 -0
  22. package/dist/call-tool-dHlbGOIY.js +70 -0
  23. package/dist/call-tool-dHlbGOIY.js.map +1 -0
  24. package/dist/chat/pure.d.ts +372 -6
  25. package/dist/chat/pure.d.ts.map +1 -1
  26. package/dist/chat/pure.js +35 -244
  27. package/dist/chat/pure.js.map +1 -1
  28. package/dist/{approvals-DKaJZYlm.js → chat-JPJJ8uu5.js} +15879 -14631
  29. package/dist/chat-JPJJ8uu5.js.map +1 -0
  30. package/dist/chat.d.ts +4 -6
  31. package/dist/chat.js +23 -12
  32. package/dist/cli-shared-C-YCaglL.js +159 -0
  33. package/dist/cli-shared-C-YCaglL.js.map +1 -0
  34. package/dist/client-core-BQSyDALT.d.ts +2115 -0
  35. package/dist/client-core-BQSyDALT.d.ts.map +1 -0
  36. package/dist/codemode-worker.d.ts +1 -0
  37. package/dist/codemode-worker.js +155 -0
  38. package/dist/codemode-worker.js.map +1 -0
  39. package/dist/codemode.d.ts +352 -0
  40. package/dist/codemode.d.ts.map +1 -0
  41. package/dist/codemode.js +5 -0
  42. package/dist/connection-Dr-Js4yZ.d.ts +28 -0
  43. package/dist/connection-Dr-Js4yZ.d.ts.map +1 -0
  44. package/dist/connection-loop-gdh22LTI.js +112 -0
  45. package/dist/connection-loop-gdh22LTI.js.map +1 -0
  46. package/dist/context-segments-BHKlagL6.js +1016 -0
  47. package/dist/context-segments-BHKlagL6.js.map +1 -0
  48. package/dist/{context-transport-T_6AYIvy.js → context-transport-DSMTUsK1.js} +3 -3
  49. package/dist/{context-transport-T_6AYIvy.js.map → context-transport-DSMTUsK1.js.map} +1 -1
  50. package/dist/contexts/daytona.d.ts +19 -8
  51. package/dist/contexts/daytona.d.ts.map +1 -1
  52. package/dist/contexts/daytona.js +1 -440
  53. package/dist/contexts/docker.d.ts +36 -7
  54. package/dist/contexts/docker.d.ts.map +1 -1
  55. package/dist/contexts/docker.js +1 -456
  56. package/dist/contexts/e2b.d.ts +68 -13
  57. package/dist/contexts/e2b.d.ts.map +1 -1
  58. package/dist/contexts/e2b.js +1 -382
  59. package/dist/contexts/sandbox.d.ts +1 -1
  60. package/dist/contexts/sandbox.js +5 -0
  61. package/dist/contexts/sandbox.js.map +1 -1
  62. package/dist/{contexts-CRE9pw07.js → contexts-d7UolYot.js} +1059 -524
  63. package/dist/contexts-d7UolYot.js.map +1 -0
  64. package/dist/contexts.d.ts +3 -3
  65. package/dist/contexts.js +1 -1
  66. package/dist/cred-keys-GpBg71cP.js +105 -0
  67. package/dist/cred-keys-GpBg71cP.js.map +1 -0
  68. package/dist/{auth-BG2rVKSt.js → credentials-JttEuRON.js} +55 -206
  69. package/dist/credentials-JttEuRON.js.map +1 -0
  70. package/dist/{cursor-iojRXHF9.js → cursor-CdjaQTBW.js} +3 -3
  71. package/dist/{cursor-iojRXHF9.js.map → cursor-CdjaQTBW.js.map} +1 -1
  72. package/dist/daemon-cli.d.ts +1 -1
  73. package/dist/daemon-cli.js +3 -2
  74. package/dist/daemon-cli.js.map +1 -1
  75. package/dist/daytona-DG3omipZ.js +513 -0
  76. package/dist/daytona-DG3omipZ.js.map +1 -0
  77. package/dist/defaults-Cx3zvDOV.js +23 -0
  78. package/dist/defaults-Cx3zvDOV.js.map +1 -0
  79. package/dist/dispatcher-BMlu2BmZ.js +4941 -0
  80. package/dist/dispatcher-BMlu2BmZ.js.map +1 -0
  81. package/dist/docker-BZhMMJUp.js +727 -0
  82. package/dist/docker-BZhMMJUp.js.map +1 -0
  83. package/dist/e2b-CEVOdRib.js +480 -0
  84. package/dist/e2b-CEVOdRib.js.map +1 -0
  85. package/dist/edit-utils-EGosADZq.js +234 -0
  86. package/dist/edit-utils-EGosADZq.js.map +1 -0
  87. package/dist/environment-8wsKE2Ln.js +214 -0
  88. package/dist/environment-8wsKE2Ln.js.map +1 -0
  89. package/dist/eval-BNcvle_J.js +1595 -0
  90. package/dist/eval-BNcvle_J.js.map +1 -0
  91. package/dist/eval.d.ts +2 -2
  92. package/dist/eval.js +1 -1489
  93. package/dist/executor-Cx5-8yqi.js +621 -0
  94. package/dist/executor-Cx5-8yqi.js.map +1 -0
  95. package/dist/extension-authoring-DyGGmq9V.js +385 -0
  96. package/dist/extension-authoring-DyGGmq9V.js.map +1 -0
  97. package/dist/extensions.d.ts +2 -2
  98. package/dist/extensions.js +3 -3
  99. package/dist/{fetch-url-DX75gpL0.js → fetch-url-Ct2TjDWt.js} +4 -4
  100. package/dist/{fetch-url-DX75gpL0.js.map → fetch-url-Ct2TjDWt.js.map} +1 -1
  101. package/dist/{format-BF745pLL.js → format-C2NQEVUH.js} +39 -2
  102. package/dist/format-C2NQEVUH.js.map +1 -0
  103. package/dist/format-bytes-C7tfc3Zm.js +55 -0
  104. package/dist/format-bytes-C7tfc3Zm.js.map +1 -0
  105. package/dist/headless-C_rNUuYC.js +960 -0
  106. package/dist/headless-C_rNUuYC.js.map +1 -0
  107. package/dist/headless.d.ts +1 -1
  108. package/dist/headless.js +1 -413
  109. package/dist/{history-search-C4bk1Wz_.js → history-search-CcYzF8-0.js} +7 -3
  110. package/dist/history-search-CcYzF8-0.js.map +1 -0
  111. package/dist/history-search-worker.d.ts +1 -1
  112. package/dist/history-search-worker.js +1 -1
  113. package/dist/host-D7NrI03V.js +378 -0
  114. package/dist/host-D7NrI03V.js.map +1 -0
  115. package/dist/host-signals-BcP5QKUD.js +118 -0
  116. package/dist/host-signals-BcP5QKUD.js.map +1 -0
  117. package/dist/identity-CwfO8K-t.js +26 -0
  118. package/dist/identity-CwfO8K-t.js.map +1 -0
  119. package/dist/{index-BgN1T3lk.d.ts → index-BGe1fQT7.d.ts} +10987 -9320
  120. package/dist/index-BGe1fQT7.d.ts.map +1 -0
  121. package/dist/index-BVQsIKGn.d.ts +448 -0
  122. package/dist/index-BVQsIKGn.d.ts.map +1 -0
  123. package/dist/{index-C6NEd5y_.d.ts → index-CHABJd-L.d.ts} +3386 -502
  124. package/dist/index-CHABJd-L.d.ts.map +1 -0
  125. package/dist/{index-C37_ppWv.d.ts → index-D6a7qXpg.d.ts} +2 -3
  126. package/dist/index-D6a7qXpg.d.ts.map +1 -0
  127. package/dist/index.d.ts +6 -6
  128. package/dist/index.js +27 -23
  129. package/dist/{completion-core-BRo86R_L.js → inline-ghost-BVRQeGoL.js} +50 -2
  130. package/dist/inline-ghost-BVRQeGoL.js.map +1 -0
  131. package/dist/ipc/remote.d.ts +313 -0
  132. package/dist/ipc/remote.d.ts.map +1 -0
  133. package/dist/ipc/remote.js +4 -0
  134. package/dist/ipc.d.ts +6 -964
  135. package/dist/ipc.js +403 -4
  136. package/dist/ipc.js.map +1 -0
  137. package/dist/{isolation-Kfoof0MM.d.ts → isolation-D9L650W5.d.ts} +100 -15
  138. package/dist/isolation-D9L650W5.d.ts.map +1 -0
  139. package/dist/json-rpc--HXQti1E.js +350 -0
  140. package/dist/json-rpc--HXQti1E.js.map +1 -0
  141. package/dist/links-j8rED1sR.js +603 -0
  142. package/dist/links-j8rED1sR.js.map +1 -0
  143. package/dist/local-terminal-D8QThwo_.js +252 -0
  144. package/dist/local-terminal-D8QThwo_.js.map +1 -0
  145. package/dist/{logger--C1VQjwJ.js → logger-Gtqlayx8.js} +199 -173
  146. package/dist/logger-Gtqlayx8.js.map +1 -0
  147. package/dist/logs-view-CWG8aUAG.js.map +1 -1
  148. package/dist/{mcp-CgNd-f3F.js → mcp-_wecH9Qe.js} +608 -562
  149. package/dist/mcp-_wecH9Qe.js.map +1 -0
  150. package/dist/mcp.d.ts +2 -2
  151. package/dist/mcp.js +2 -2
  152. package/dist/media-sniff-UKijEaiQ.js.map +1 -1
  153. package/dist/{messages-2jcOA_5R.js → messages-BqiwcD2Q.js} +1017 -1014
  154. package/dist/messages-BqiwcD2Q.js.map +1 -0
  155. package/dist/{oauth-DxHO17JE.js → oauth-Px_pBB9W.js} +5 -5
  156. package/dist/{oauth-DxHO17JE.js.map → oauth-Px_pBB9W.js.map} +1 -1
  157. package/dist/{openai-compat-Dy56weK8.js → openai-compat-CFrpH7uq.js} +432 -589
  158. package/dist/openai-compat-CFrpH7uq.js.map +1 -0
  159. package/dist/orchestration-BCGmB8Ps.js +511 -0
  160. package/dist/orchestration-BCGmB8Ps.js.map +1 -0
  161. package/dist/output/stream-json.d.ts +1 -2
  162. package/dist/output/stream-json.d.ts.map +1 -1
  163. package/dist/output/stream-json.js +1 -1
  164. package/dist/output/terminal.d.ts +1 -2
  165. package/dist/output/terminal.d.ts.map +1 -1
  166. package/dist/output/terminal.js +13 -7
  167. package/dist/output/terminal.js.map +1 -1
  168. package/dist/{plugins-gbI7SBA6.js → plugins-DS7mahzZ.js} +20 -101
  169. package/dist/plugins-DS7mahzZ.js.map +1 -0
  170. package/dist/plugins.d.ts +1 -1
  171. package/dist/plugins.js +1 -2
  172. package/dist/prelude-Cxo4t74B.js +517 -0
  173. package/dist/prelude-Cxo4t74B.js.map +1 -0
  174. package/dist/presets.d.ts +1 -1
  175. package/dist/presets.js +1 -2
  176. package/dist/project-root-B8zADr4o.js +167 -0
  177. package/dist/project-root-B8zADr4o.js.map +1 -0
  178. package/dist/project-user-paths-BSgtrRxl.js +58 -0
  179. package/dist/project-user-paths-BSgtrRxl.js.map +1 -0
  180. package/dist/{prompts-Pqc3JdW_.d.ts → prompts-DYcvqShf.d.ts} +14 -11
  181. package/dist/prompts-DYcvqShf.d.ts.map +1 -0
  182. package/dist/protocol-DnhqqSmE.js +13 -0
  183. package/dist/protocol-DnhqqSmE.js.map +1 -0
  184. package/dist/providers/anthropic.d.ts +2 -2
  185. package/dist/providers/anthropic.js +1 -2
  186. package/dist/providers/arcee.d.ts +1 -1
  187. package/dist/providers/arcee.js +1 -1
  188. package/dist/providers/baseten.d.ts +1 -1
  189. package/dist/providers/baseten.js +1 -1
  190. package/dist/providers/cerebras.d.ts +1 -1
  191. package/dist/providers/cerebras.js +3 -2
  192. package/dist/providers/cerebras.js.map +1 -1
  193. package/dist/providers/local.d.ts +1 -1
  194. package/dist/providers/local.js +1 -1
  195. package/dist/providers/openai-compat.d.ts +1 -1
  196. package/dist/providers/openai-compat.js +1 -2
  197. package/dist/providers/openai.d.ts +1 -1
  198. package/dist/providers/openai.js +15 -12
  199. package/dist/providers/openai.js.map +1 -1
  200. package/dist/providers/openrouter.d.ts +1 -1
  201. package/dist/providers/openrouter.js +3 -2
  202. package/dist/providers/openrouter.js.map +1 -1
  203. package/dist/providers/xai.d.ts +1 -1
  204. package/dist/providers/xai.js +3 -3
  205. package/dist/{providers-BVhnFyiY.js → providers-XUR7F4Hi.js} +4 -4
  206. package/dist/{providers-BVhnFyiY.js.map → providers-XUR7F4Hi.js.map} +1 -1
  207. package/dist/providers.d.ts +1 -1
  208. package/dist/providers.js +4 -4
  209. package/dist/registry-D6ShBWJU.js +5234 -0
  210. package/dist/registry-D6ShBWJU.js.map +1 -0
  211. package/dist/remote-hosts-BtA_9ZGp.js +97 -0
  212. package/dist/remote-hosts-BtA_9ZGp.js.map +1 -0
  213. package/dist/restate.d.ts +2 -3
  214. package/dist/restate.d.ts.map +1 -1
  215. package/dist/restate.js +631 -572
  216. package/dist/restate.js.map +1 -1
  217. package/dist/run-summary-CklLiZ4y.js +288 -0
  218. package/dist/run-summary-CklLiZ4y.js.map +1 -0
  219. package/dist/{sandbox-BH0WQkXn.d.ts → sandbox-C5dR5DwQ.d.ts} +6 -3
  220. package/dist/sandbox-C5dR5DwQ.d.ts.map +1 -0
  221. package/dist/session/sqlite.d.ts +1 -2
  222. package/dist/session/sqlite.d.ts.map +1 -1
  223. package/dist/session/sqlite.js +1 -616
  224. package/dist/session-factory-BUGY5P40.js +1576 -0
  225. package/dist/session-factory-BUGY5P40.js.map +1 -0
  226. package/dist/{session-BqRP1hS7.js → session-xh9JXu6i.js} +94 -52
  227. package/dist/session-xh9JXu6i.js.map +1 -0
  228. package/dist/session.d.ts +1 -1
  229. package/dist/session.js +2 -2
  230. package/dist/settings-keys-Ckf29NeM.js +677 -0
  231. package/dist/settings-keys-Ckf29NeM.js.map +1 -0
  232. package/dist/shell-path-Dqaoow2J.js +412 -0
  233. package/dist/shell-path-Dqaoow2J.js.map +1 -0
  234. package/dist/{skills-BC3dodWp.js → skills-DKqZJm4X.js} +430 -470
  235. package/dist/skills-DKqZJm4X.js.map +1 -0
  236. package/dist/skills.d.ts +2 -2
  237. package/dist/skills.js +1 -2
  238. package/dist/source-mPExaUm8.js +381 -0
  239. package/dist/source-mPExaUm8.js.map +1 -0
  240. package/dist/sqlite-DV1DQzN2.js +698 -0
  241. package/dist/sqlite-DV1DQzN2.js.map +1 -0
  242. package/dist/{src-CkNQKFKr.js → src-BRMYRJib.js} +903 -1121
  243. package/dist/src-BRMYRJib.js.map +1 -0
  244. package/dist/{stdio-DPpBDPx5.js → stdio-C6YyoW3I.js} +4 -4
  245. package/dist/{stdio-DPpBDPx5.js.map → stdio-C6YyoW3I.js.map} +1 -1
  246. package/dist/{stdio-loader-Bbx19dMZ.js → stdio-loader-C830Vg-Z.js} +4 -4
  247. package/dist/{stdio-loader-Bbx19dMZ.js.map → stdio-loader-C830Vg-Z.js.map} +1 -1
  248. package/dist/system-prompt-MNVHatSD.d.ts.map +1 -1
  249. package/dist/timeout-DEaqslLO.d.ts.map +1 -1
  250. package/dist/todo-edits-Dn251YUP.js +1790 -0
  251. package/dist/todo-edits-Dn251YUP.js.map +1 -0
  252. package/dist/{turn-operations-DrbJlpq9.js → tool-formatters-IQFDrdrs.js} +1456 -2120
  253. package/dist/tool-formatters-IQFDrdrs.js.map +1 -0
  254. package/dist/tool-state-Dku6YqAB.js +989 -0
  255. package/dist/tool-state-Dku6YqAB.js.map +1 -0
  256. package/dist/tools/fetch-url.d.ts +1 -2
  257. package/dist/tools/fetch-url.d.ts.map +1 -1
  258. package/dist/tools/fetch-url.js +1 -2
  259. package/dist/tools/prompts.d.ts +1 -1
  260. package/dist/tools/prompts.js +7 -7
  261. package/dist/tools/prompts.js.map +1 -1
  262. package/dist/tools/web-search.d.ts +1 -2
  263. package/dist/tools/web-search.d.ts.map +1 -1
  264. package/dist/tools/web-search.js +2 -2
  265. package/dist/tools/web-search.js.map +1 -1
  266. package/dist/tools-_DnT3AGM.js +578 -0
  267. package/dist/tools-_DnT3AGM.js.map +1 -0
  268. package/dist/tools.d.ts +3 -3
  269. package/dist/tools.js +4 -2
  270. package/dist/tui.d.ts +534 -517
  271. package/dist/tui.d.ts.map +1 -1
  272. package/dist/tui.js +34933 -27242
  273. package/dist/tui.js.map +1 -1
  274. package/dist/turn-operations-B8sokwi5.js +333 -0
  275. package/dist/turn-operations-B8sokwi5.js.map +1 -0
  276. package/dist/turn-operations-DQX5ZZni.d.ts +3089 -0
  277. package/dist/turn-operations-DQX5ZZni.d.ts.map +1 -0
  278. package/dist/types-C7ZFOztE.d.ts +132 -0
  279. package/dist/types-C7ZFOztE.d.ts.map +1 -0
  280. package/dist/types-CH5XpIHw.js +114 -0
  281. package/dist/types-CH5XpIHw.js.map +1 -0
  282. package/dist/{types-CWgENVLY.js → types-Cu0ZGDu9.js} +10 -6
  283. package/dist/types-Cu0ZGDu9.js.map +1 -0
  284. package/dist/types-IqegbJEE.d.ts +624 -0
  285. package/dist/types-IqegbJEE.d.ts.map +1 -0
  286. package/dist/types.d.ts +4 -4
  287. package/dist/types.js +1 -1
  288. package/dist/url-D8HCl65b.js +1259 -0
  289. package/dist/url-D8HCl65b.js.map +1 -0
  290. package/dist/wasm-BVT-j5cl.js +33 -0
  291. package/dist/wasm-BVT-j5cl.js.map +1 -0
  292. package/dist/workspace-exec-stream-SV2R9d5S.js +355 -0
  293. package/dist/workspace-exec-stream-SV2R9d5S.js.map +1 -0
  294. package/dist/ws-CIHMvlSh.js +952 -0
  295. package/dist/ws-CIHMvlSh.js.map +1 -0
  296. package/dist/ws-client-N7NxzvQp.js +230 -0
  297. package/dist/ws-client-N7NxzvQp.js.map +1 -0
  298. package/dist/{xai-CazjStOK.js → xai-CvJTeLrI.js} +165 -5
  299. package/dist/xai-CvJTeLrI.js.map +1 -0
  300. package/dist/xdg-zweed0-t.js +117 -0
  301. package/dist/xdg-zweed0-t.js.map +1 -0
  302. package/docs/ACP.md +52 -0
  303. package/docs/ARCHITECTURE.md +103 -6
  304. package/docs/ARTIFACTS.md +8 -4
  305. package/docs/CHAT.md +165 -14
  306. package/docs/EXECUTION_CONTEXT.md +8 -0
  307. package/docs/EXTENSIONS.md +123 -2
  308. package/docs/HEADLESS.md +2 -0
  309. package/docs/IPC.md +775 -64
  310. package/docs/MACHINES.md +456 -0
  311. package/docs/PANELS.md +3 -0
  312. package/docs/README.md +4 -0
  313. package/docs/RESTATE.md +3 -2
  314. package/docs/RUN_IN_BACKGROUND.md +10 -2
  315. package/docs/SERVER.md +1085 -0
  316. package/docs/SKILL.md +6 -1
  317. package/docs/TERMINAL.md +75 -0
  318. package/docs/TUI.md +65 -14
  319. package/package.json +58 -26
  320. package/scripts/eval.ts +4 -0
  321. package/dist/acp-D-tVyUjw.js.map +0 -1
  322. package/dist/agent-D0zZnGbt.js.map +0 -1
  323. package/dist/anthropic-C2aole0G.js.map +0 -1
  324. package/dist/approvals-DKaJZYlm.js.map +0 -1
  325. package/dist/atomic-write-B7zr1ddF.js.map +0 -1
  326. package/dist/auth-BG2rVKSt.js.map +0 -1
  327. package/dist/completion-core-BRo86R_L.js.map +0 -1
  328. package/dist/contexts/daytona.js.map +0 -1
  329. package/dist/contexts/docker.js.map +0 -1
  330. package/dist/contexts/e2b.js.map +0 -1
  331. package/dist/contexts-CRE9pw07.js.map +0 -1
  332. package/dist/eval.js.map +0 -1
  333. package/dist/format-BF745pLL.js.map +0 -1
  334. package/dist/glob-DluQFSw1.js +0 -270
  335. package/dist/glob-DluQFSw1.js.map +0 -1
  336. package/dist/headless.js.map +0 -1
  337. package/dist/history-search-C4bk1Wz_.js.map +0 -1
  338. package/dist/index-BgN1T3lk.d.ts.map +0 -1
  339. package/dist/index-C37_ppWv.d.ts.map +0 -1
  340. package/dist/index-C6NEd5y_.d.ts.map +0 -1
  341. package/dist/ipc-zVSyo6K1.js +0 -331
  342. package/dist/ipc-zVSyo6K1.js.map +0 -1
  343. package/dist/ipc.d.ts.map +0 -1
  344. package/dist/isolation-Kfoof0MM.d.ts.map +0 -1
  345. package/dist/json-rpc-rSWMUh9b.js +0 -192
  346. package/dist/json-rpc-rSWMUh9b.js.map +0 -1
  347. package/dist/logger--C1VQjwJ.js.map +0 -1
  348. package/dist/mcp-CgNd-f3F.js.map +0 -1
  349. package/dist/messages-2jcOA_5R.js.map +0 -1
  350. package/dist/openai-compat-Dy56weK8.js.map +0 -1
  351. package/dist/output-cap-C9zukcCj.js +0 -100
  352. package/dist/output-cap-C9zukcCj.js.map +0 -1
  353. package/dist/panels-B6gRk4bf.js +0 -789
  354. package/dist/panels-B6gRk4bf.js.map +0 -1
  355. package/dist/plugins-gbI7SBA6.js.map +0 -1
  356. package/dist/prompts-Pqc3JdW_.d.ts.map +0 -1
  357. package/dist/run-summary-BU_NgwUT.js +0 -269
  358. package/dist/run-summary-BU_NgwUT.js.map +0 -1
  359. package/dist/sandbox-BH0WQkXn.d.ts.map +0 -1
  360. package/dist/session/sqlite.js.map +0 -1
  361. package/dist/session-BqRP1hS7.js.map +0 -1
  362. package/dist/shell-path-h5czzllR.js +0 -1549
  363. package/dist/shell-path-h5czzllR.js.map +0 -1
  364. package/dist/skills-BC3dodWp.js.map +0 -1
  365. package/dist/src-CkNQKFKr.js.map +0 -1
  366. package/dist/todo-edits-UOwgxGKu.js +0 -528
  367. package/dist/todo-edits-UOwgxGKu.js.map +0 -1
  368. package/dist/tool-formatters-DoRLnfuD.d.ts +0 -759
  369. package/dist/tool-formatters-DoRLnfuD.d.ts.map +0 -1
  370. package/dist/transcript-anchors-BeudMbXx.d.ts +0 -1762
  371. package/dist/transcript-anchors-BeudMbXx.d.ts.map +0 -1
  372. package/dist/turn-operations-C8bMBDl_.d.ts +0 -1258
  373. package/dist/turn-operations-C8bMBDl_.d.ts.map +0 -1
  374. package/dist/turn-operations-DrbJlpq9.js.map +0 -1
  375. package/dist/types-CWgENVLY.js.map +0 -1
  376. package/dist/xai-CazjStOK.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headless-C_rNUuYC.js","names":["IGNORED_KEYS","basic"],"sources":["../src/markdown-defs/model-aliases.ts","../src/markdown-defs/tool-map.ts","../src/markdown-defs/agents.ts","../src/markdown-defs/builtin-agents.ts","../src/markdown-defs/commands.ts","../src/markdown-defs/roots.ts","../src/markdown-defs/scan.ts","../src/markdown-defs/index.ts","../src/headless.ts"],"sourcesContent":["import type { MarkdownDefDiagnostic } from './types'\n\n/**\n * Claude Code's agent `model:` aliases. Bump alongside `../anthropic-models.ts`\n * when the Anthropic lineup changes.\n */\nexport const CLAUDE_MODEL_ALIASES: Readonly<Record<'haiku' | 'sonnet' | 'opus' | 'fable', string>> = {\n haiku: 'claude-haiku-4-5-20251001',\n sonnet: 'claude-sonnet-5-5',\n opus: 'claude-opus-5-5',\n fable: 'claude-fable-5-1',\n}\n\nexport interface ModelAliasContext {\n /** Provider name of the parent session, e.g. `'anthropic'`. */\n parentProvider?: string\n /** Model ids the spawn catalog lists, when one was built. */\n catalogIds?: ReadonlySet<string>\n}\n\n/**\n * Without a catalog, spawn sends a raw id to the PARENT's provider, so a\n * Claude id under an OpenAI parent would fail mid-run. Unresolvable aliases\n * therefore inherit instead of failing the spawn.\n */\nexport function resolveModelAlias(\n value: string | undefined,\n ctx: ModelAliasContext,\n path: string,\n): { model?: string, diagnostic?: MarkdownDefDiagnostic } {\n const raw = value?.trim()\n if (!raw || raw.toLowerCase() === 'inherit')\n return {}\n const key = raw.toLowerCase() as keyof typeof CLAUDE_MODEL_ALIASES\n if (!Object.hasOwn(CLAUDE_MODEL_ALIASES, key))\n return { model: raw }\n const target = CLAUDE_MODEL_ALIASES[key]\n if (ctx.parentProvider === 'anthropic' || ctx.catalogIds?.has(target))\n return { model: target }\n return {\n diagnostic: {\n path,\n kind: 'agent',\n message: `model alias \"${raw}\" needs an Anthropic parent; inheriting the parent model`,\n },\n }\n}\n","import type { MarkdownDefDiagnostic } from './types'\n\n/** Claude Code tool names → zidane `spec.name`. */\nexport const CLAUDE_TOOL_MAP: Readonly<Record<string, string>> = {\n Read: 'read_file',\n Write: 'write_file',\n Edit: 'edit',\n MultiEdit: 'multi_edit',\n Bash: 'shell',\n Grep: 'grep',\n Glob: 'glob',\n LS: 'list_files',\n WebFetch: 'fetch_url',\n WebSearch: 'web_search',\n Task: 'spawn',\n Agent: 'spawn',\n}\n\nconst NATIVE_TOOLS = new Set(Object.values(CLAUDE_TOOL_MAP))\nconst PATTERNED = /^([A-Z]\\w*)\\(.*\\)$/\n\n/**\n * Translate an agent file's `tools:` list. Patterns (`Bash(git:*)`) are not\n * enforced by spawn's allowlist, so they collapse to the bare tool with a\n * diagnostic. Unknown names are dropped loudly instead of narrowing nothing.\n */\nexport function mapClaudeTools(names: readonly string[], path: string): { tools: string[], diagnostics: MarkdownDefDiagnostic[] } {\n const tools = new Set<string>()\n const diagnostics: MarkdownDefDiagnostic[] = []\n for (const raw of names) {\n const name = raw.trim()\n if (!name)\n continue\n if (NATIVE_TOOLS.has(name) || name.startsWith('mcp__')) {\n tools.add(name)\n continue\n }\n const patterned = PATTERNED.exec(name)\n const base = patterned ? patterned[1] : name\n const mapped = Object.hasOwn(CLAUDE_TOOL_MAP, base) ? CLAUDE_TOOL_MAP[base] : undefined\n if (!mapped) {\n diagnostics.push({ path, kind: 'agent', message: `unknown tool \"${name}\" dropped` })\n continue\n }\n if (patterned)\n diagnostics.push({ path, kind: 'agent', message: `tool pattern \"${name}\" is not enforced; granted ${mapped} unrestricted` })\n tools.add(mapped)\n }\n return { tools: [...tools], diagnostics }\n}\n","import type { SubagentDef } from '../tools/spawn'\nimport type { ModelAliasContext } from './model-aliases'\nimport type { MarkdownDefDiagnostic, MarkdownDefFile } from './types'\nimport { parseFrontmatter } from '../skills/discovery'\nimport { resolveModelAlias } from './model-aliases'\nimport { CLAUDE_TOOL_MAP, mapClaudeTools } from './tool-map'\n\nconst IGNORED_KEYS = ['color', 'isolation', 'memory', 'hooks'] as const\n/** Keys that narrow a child's tools; a duplicate of any of them drops the agent. */\nconst RESTRICTION_KEYS = ['tools', 'disallowedTools', 'readonly', 'permissionMode'] as const\n\n/**\n * `tools:` arrives as a YAML list, `[a, b]`, `a, b`, or `a b`. Comma input\n * splits on commas only; otherwise it splits on whitespace outside parens, so\n * `Bash(git log:*)` survives intact either way.\n */\nexport function toStringList(value: unknown): string[] | undefined {\n if (value === undefined || value === null)\n return undefined\n if (Array.isArray(value))\n return value.filter((v): v is string => typeof v === 'string').map(v => v.trim()).filter(Boolean)\n if (typeof value !== 'string')\n return undefined\n const inner = value.trim().replace(/^\\[(.*)\\]$/, '$1')\n const parts = inner.includes(',') ? inner.split(',') : splitOutsideParens(inner)\n return parts.map(p => p.trim()).filter(Boolean)\n}\n\nfunction splitOutsideParens(input: string): string[] {\n const parts: string[] = []\n let depth = 0\n let current = ''\n for (const ch of input) {\n if (ch === '(')\n depth++\n else if (ch === ')')\n depth = Math.max(0, depth - 1)\n if (depth === 0 && /\\s/.test(ch)) {\n parts.push(current)\n current = ''\n }\n else {\n current += ch\n }\n }\n parts.push(current)\n return parts\n}\n\n/** `true`/`false` as a boolean or the strings `'true'`/`'false'`; `undefined` for anything else. */\nfunction toBool(value: unknown): boolean | undefined {\n if (typeof value === 'boolean')\n return value\n if (typeof value === 'string') {\n const v = value.trim().toLowerCase()\n if (v === 'true')\n return true\n if (v === 'false')\n return false\n }\n return undefined\n}\n\nfunction isListShaped(value: unknown): boolean {\n return typeof value === 'string' || Array.isArray(value)\n}\n\n/**\n * `explicitReadonlyFalse` reports a file that wrote `readonly: false`, so the\n * loader can tell \"unset\" from \"opted out\" when a file overrides a builtin.\n */\nexport function parseAgentFile(\n file: MarkdownDefFile,\n content: string,\n modelContext: ModelAliasContext,\n): { entry?: [string, SubagentDef], diagnostics: MarkdownDefDiagnostic[], explicitReadonlyFalse?: boolean } {\n const diagnostics: MarkdownDefDiagnostic[] = []\n const note = (message: string) => diagnostics.push({ path: file.path, kind: 'agent', message })\n const parsed = parseFrontmatter(content)\n for (const d of parsed.diagnostics)\n note(d.message)\n const fm = parsed.frontmatter\n\n const name = typeof fm.name === 'string' && fm.name.trim() ? fm.name.trim() : file.name\n if (!parsed.body) {\n note('empty agent body; skipped')\n return { diagnostics }\n }\n\n // Claude Code requires a description; a file without frontmatter has none.\n if (typeof fm.description !== 'string' || !fm.description.trim()) {\n note('missing description; skipped')\n return { diagnostics }\n }\n const def: SubagentDef = { system: parsed.body, description: fm.description.trim() }\n\n // Last-wins on a repeated restriction key would let a later line silently\n // widen an earlier one; refuse the file instead.\n const duplicated = RESTRICTION_KEYS.filter(key =>\n parsed.diagnostics.some(d => d.code === 'duplicate-key' && d.field === key))\n if (duplicated.length > 0) {\n note(`duplicate restriction keys: ${duplicated.join(', ')}; skipped`)\n return { diagnostics }\n }\n\n // Restriction keys fail closed: an unreadable value drops the agent rather\n // than silently inheriting every parent tool.\n let explicitReadonlyFalse = false\n if (fm.readonly !== undefined && fm.readonly !== null) {\n const ro = toBool(fm.readonly)\n if (ro === undefined) {\n note('unreadable readonly value; skipped')\n return { diagnostics }\n }\n if (ro)\n def.readonly = true\n else\n explicitReadonlyFalse = true\n }\n\n const hasTools = fm.tools !== undefined && fm.tools !== null\n if (hasTools && !isListShaped(fm.tools)) {\n note('unreadable tools value; skipped')\n return { diagnostics }\n }\n const hasDisallowed = fm.disallowedTools !== undefined && fm.disallowedTools !== null\n if (hasDisallowed && !isListShaped(fm.disallowedTools)) {\n note('unreadable disallowedTools value; skipped')\n return { diagnostics }\n }\n\n const rawTools = toStringList(fm.tools)\n if (rawTools !== undefined) {\n if (rawTools.length === 0) {\n note('empty tools list; skipped (an empty list would inherit every tool)')\n return { diagnostics }\n }\n const mapped = mapClaudeTools(rawTools, file.path)\n diagnostics.push(...mapped.diagnostics)\n if (mapped.tools.length === 0) {\n note('no usable tools after mapping; skipped')\n return { diagnostics }\n }\n def.tools = mapped.tools\n }\n\n const rawDisallowed = toStringList(fm.disallowedTools)\n if (rawDisallowed !== undefined) {\n if (rawDisallowed.length === 0) {\n note('empty disallowedTools list; skipped')\n return { diagnostics }\n }\n const mapped = mapClaudeTools(rawDisallowed, file.path)\n diagnostics.push(...mapped.diagnostics)\n const blocked = new Set(mapped.tools)\n if (def.tools) {\n def.tools = def.tools.filter(t => !blocked.has(t))\n }\n else {\n note('disallowedTools without tools restricts to native tools; MCP and extension tools are excluded')\n def.tools = [...new Set(Object.values(CLAUDE_TOOL_MAP))].filter(t => !blocked.has(t))\n }\n if (def.tools.length === 0) {\n note('no tools left after disallowedTools; skipped')\n return { diagnostics }\n }\n }\n\n const model = resolveModelAlias(typeof fm.model === 'string' ? fm.model : undefined, modelContext, file.path)\n if (model.diagnostic)\n diagnostics.push(model.diagnostic)\n if (model.model)\n def.model = model.model\n\n const permissionMode = typeof fm.permissionMode === 'string' ? fm.permissionMode.trim() : undefined\n if (permissionMode === 'plan')\n def.readonly = true\n\n const ignored: string[] = IGNORED_KEYS.filter(key => fm[key] !== undefined)\n if (fm.permissionMode !== undefined && permissionMode !== 'plan')\n ignored.push('permissionMode')\n if (ignored.length > 0)\n note(`ignored frontmatter keys: ${ignored.join(', ')}`)\n\n return { entry: [name, def], diagnostics, explicitReadonlyFalse }\n}\n","import type { SubagentRegistry } from '../tools/spawn'\n\n/**\n * Claude-trained models emit `subagent_type: 'Explore'` / `'Plan'`. Shipping\n * both gives those calls a target. No `model`: the `subagentModels` setting\n * or the parent model applies. A file agent with the same name overrides.\n */\nexport const BUILTIN_SUBAGENTS: Readonly<SubagentRegistry> = {\n Explore: {\n readonly: true,\n description: 'Read-only codebase search. Use for broad fan-out searches; returns conclusions, not file dumps.',\n system: 'You are a read-only search agent. Search with the available read-only tools, read only the excerpts you need, and report findings concisely with file:line references. Do not paste whole files.',\n },\n Plan: {\n readonly: true,\n description: 'Read-only planning. Returns a step-by-step implementation plan with the critical files.',\n system: 'You are a read-only planning agent. Explore the code you need, then return a numbered implementation plan: the files to change, what changes in each, and the risks. Do not edit files.',\n },\n}\n","import type { Command } from '../chat/commands'\nimport type { MarkdownDefDiagnostic, MarkdownDefFile } from './types'\nimport { parseFrontmatter } from '../skills/discovery'\n\n// `\\$` is an escaped literal; `$1`..`$9` followed by another digit is literal text (`$10`).\nconst TOKEN = /\\\\\\$|\\$ARGUMENTS|\\$([1-9])(?!\\d)/g\nconst IGNORED_KEYS = ['model', 'allowed-tools'] as const\nconst DESCRIPTION_MAX = 120\n\n/**\n * Claude Code command templating. Replacers are functions so `$&` / `$1`\n * typed by the user land verbatim instead of being re-expanded by\n * `String.replace`'s replacement-pattern syntax.\n */\nexport function expandCommandTemplate(body: string, args: string, argv: readonly string[]): string {\n let hasPlaceholder = false\n // Single pass: sequential replaces would re-expand `$1` typed inside $ARGUMENTS.\n const out = body.replace(TOKEN, (match, n?: string) => {\n if (match === '\\\\$')\n return '$'\n hasPlaceholder = true\n return n ? (argv[Number(n) - 1] ?? '') : args\n })\n if (!hasPlaceholder)\n return args.trim() ? `${out}\\n\\n${args}` : out\n return out\n}\n\nexport function parseCommandFile(file: MarkdownDefFile, content: string): { command?: Command, diagnostics: MarkdownDefDiagnostic[] } {\n const diagnostics: MarkdownDefDiagnostic[] = []\n const note = (message: string) => diagnostics.push({ path: file.path, kind: 'command', message })\n const parsed = parseFrontmatter(content)\n for (const d of parsed.diagnostics)\n note(d.message)\n\n if (!file.name || /\\s/.test(file.name) || file.name.startsWith('/')) {\n note(`invalid command name \"${file.name}\"; skipped`)\n return { diagnostics }\n }\n const body = parsed.body\n if (!body) {\n note('empty command body; skipped')\n return { diagnostics }\n }\n for (const key of IGNORED_KEYS) {\n if (parsed.frontmatter[key] !== undefined)\n note(`frontmatter \"${key}\" is ignored for commands`)\n }\n\n const fm = parsed.frontmatter\n const firstLine = body.split('\\n').find(line => line.trim())?.trim().replace(/^#+\\s*/, '') || file.name\n let description = typeof fm.description === 'string' && fm.description.trim()\n ? fm.description.trim()\n : firstLine.slice(0, DESCRIPTION_MAX)\n if (typeof fm['argument-hint'] === 'string' && fm['argument-hint'].trim())\n description = `${description} (args: ${fm['argument-hint'].trim()})`\n\n const command: Command = {\n name: file.name,\n description,\n // No `group`: it names the contributing extension (`/<extension>` lists\n // its commands). A namespaced file name (`git:commit`) already matches `/git`.\n run: async (ctx) => {\n await ctx.runAgent(expandCommandTemplate(body, ctx.args, ctx.argv))\n },\n }\n return { command, diagnostics }\n}\n","import type { ProjectUserPath } from '../chat/project-user-paths'\nimport type { MarkdownDefKind } from './types'\nimport { homedir } from 'node:os'\nimport { resolve } from 'node:path'\nimport { findGitRoot } from '../chat/project-root'\nimport { projectUserPaths } from '../chat/project-user-paths'\n\nexport interface MarkdownDefRoot {\n path: string\n source: 'project' | 'user'\n foreign: boolean\n}\n\nexport interface MarkdownDefRootsOptions {\n kind: MarkdownDefKind\n cwd?: string\n home?: string\n /** Storage prefix, default `.zidane`. */\n prefix?: string\n /** `settings.importForeignConfigs`. Adds `.claude/<kind>`. */\n includeForeign: boolean\n /** Default true. False drops `source: 'project'` roots, native and foreign. */\n includeProject?: boolean\n}\n\n/**\n * Claude Code's markdown command / agent dirs, project first. Claude only:\n * Codex and pi have no equivalent format. Project root is the git root, as\n * for the other foreign configs.\n */\nexport function foreignMarkdownScanPaths(kind: MarkdownDefKind, opts: { cwd?: string, home?: string } = {}): ProjectUserPath[] {\n const cwd = opts.cwd ?? process.cwd()\n const projectRoot = findGitRoot(cwd) ?? cwd\n const home = opts.home ?? homedir()\n return [\n { path: resolve(projectRoot, `.claude/${kind}`), source: 'project' },\n { path: resolve(home, `.claude/${kind}`), source: 'user' },\n ]\n}\n\n/** Native project, native user, then (opt-in) foreign project, foreign user. Same order as skills. */\nexport function markdownDefRoots(opts: MarkdownDefRootsOptions): MarkdownDefRoot[] {\n const native = projectUserPaths({ subPath: opts.kind, cwd: opts.cwd, home: opts.home, prefix: opts.prefix })\n .map(p => ({ path: p.path, source: p.source, foreign: false }))\n const foreign = opts.includeForeign\n ? foreignMarkdownScanPaths(opts.kind, { cwd: opts.cwd, home: opts.home })\n .map(p => ({ path: p.path, source: p.source, foreign: true }))\n : []\n const all = [...native, ...foreign]\n return opts.includeProject === false ? all.filter(r => r.source !== 'project') : all\n}\n","import type { MarkdownDefRoot } from './roots'\nimport type { MarkdownDefFile } from './types'\nimport { readdirSync, statSync } from 'node:fs'\nimport { join } from 'node:path'\n\nconst MAX_DEPTH = 3\n/** Dot entries (dirs and dotfiles) are skipped separately. Not the skills skip set: `build/` and `dist/` are legitimate command namespaces. */\nconst SKIP_DIRS: ReadonlySet<string> = new Set(['node_modules'])\n\n/**\n * Every `*.md` under each root, in root order. No dedupe here: agent files\n * can rename themselves via frontmatter, so first-wins runs after parsing.\n */\nexport function listMarkdownDefFiles(roots: readonly MarkdownDefRoot[]): MarkdownDefFile[] {\n const files: MarkdownDefFile[] = []\n for (const root of roots)\n walk(root, root.path, [], files)\n return files\n}\n\nfunction walk(root: MarkdownDefRoot, dir: string, segments: string[], out: MarkdownDefFile[]): void {\n let entries: string[]\n try {\n entries = readdirSync(dir).sort()\n }\n catch {\n return\n }\n for (const entry of entries) {\n if (entry.startsWith('.') || SKIP_DIRS.has(entry))\n continue\n const path = join(dir, entry)\n let isDir: boolean\n try {\n isDir = statSync(path).isDirectory()\n }\n catch {\n continue\n }\n if (isDir) {\n if (segments.length < MAX_DEPTH)\n walk(root, path, [...segments, entry], out)\n continue\n }\n if (!entry.endsWith('.md'))\n continue\n const name = [...segments, entry.slice(0, -3)].join(':').toLowerCase()\n out.push({ path, name, source: root.source, foreign: root.foreign })\n }\n}\n","import type { Command } from '../chat/commands'\nimport type { Preset } from '../presets'\nimport type { SubagentDef, SubagentOverride, SubagentRegistry } from '../tools/spawn'\nimport type { ModelAliasContext } from './model-aliases'\nimport type { MarkdownDefDiagnostic, MarkdownDefFile, MarkdownDefKind } from './types'\nimport { readFileSync } from 'node:fs'\nimport { isSpawnTool } from '../tools/spawn'\nimport { parseAgentFile } from './agents'\nimport { BUILTIN_SUBAGENTS } from './builtin-agents'\nimport { parseCommandFile } from './commands'\nimport { markdownDefRoots } from './roots'\nimport { listMarkdownDefFiles } from './scan'\n\nexport { BUILTIN_SUBAGENTS } from './builtin-agents'\nexport type { ModelAliasContext } from './model-aliases'\nexport type { MarkdownDefDiagnostic } from './types'\n\nexport interface LoadMarkdownOptions {\n cwd?: string\n home?: string\n /** Storage prefix, default `.zidane`. */\n prefix?: string\n /** `settings.importForeignConfigs`. */\n includeForeign: boolean\n /**\n * Default true. False drops every `source: 'project'` root (native and\n * foreign). The seam for SDK hosts that open untrusted repos: a project file\n * writes a prompt (command body, subagent system prompt) the user did not,\n * so such hosts load user-level files only. Headless sets it false unless\n * `--project-agents` is passed.\n */\n includeProject?: boolean\n}\n\nexport interface LoadMarkdownCommandsOptions extends LoadMarkdownOptions {\n /**\n * True when an enabled skill answers `/<name>`. Skills win that name, as in\n * Claude Code, so the file command is dropped with a diagnostic instead of\n * silently hiding the skill.\n */\n isSkillName?: (name: string) => boolean\n}\n\n/** Names that would collide with `Object.prototype` keys in a plain registry. */\nconst RESERVED_NAMES: ReadonlySet<string> = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction filesFor(kind: MarkdownDefKind, opts: LoadMarkdownOptions): MarkdownDefFile[] {\n return listMarkdownDefFiles(markdownDefRoots({ kind, ...opts }))\n}\n\nfunction read(path: string): string | undefined {\n try {\n return readFileSync(path, 'utf8')\n }\n catch {\n return undefined\n }\n}\n\n/** Markdown slash commands, first-wins by name in root order. Never throws. */\nexport function loadMarkdownCommands(opts: LoadMarkdownCommandsOptions): { commands: Command[], diagnostics: MarkdownDefDiagnostic[] } {\n const commands: Command[] = []\n const diagnostics: MarkdownDefDiagnostic[] = []\n const winners = new Map<string, string>()\n for (const file of filesFor('commands', opts)) {\n const content = read(file.path)\n if (content === undefined)\n continue\n const parsed = parseCommandFile(file, content)\n diagnostics.push(...parsed.diagnostics)\n if (!parsed.command)\n continue\n const key = parsed.command.name.toLowerCase()\n if (RESERVED_NAMES.has(key)) {\n diagnostics.push({ path: file.path, kind: 'command', message: 'reserved command name' })\n continue\n }\n if (opts.isSkillName?.(key)) {\n diagnostics.push({ path: file.path, kind: 'command', message: `skill \"${key}\" has the same name and wins; rename the command or the skill` })\n continue\n }\n const winner = winners.get(key)\n if (winner) {\n diagnostics.push({ path: file.path, kind: 'command', message: `shadowed by ${winner}` })\n continue\n }\n winners.set(key, file.path)\n commands.push(parsed.command)\n }\n return { commands, diagnostics }\n}\n\n/**\n * Builtin Explore/Plan plus markdown agents. Files override builtins;\n * among files, first-wins by name in root order. Never throws.\n */\nexport function loadMarkdownAgents(\n opts: LoadMarkdownOptions & { modelContext: ModelAliasContext },\n): { subagents: SubagentRegistry, diagnostics: MarkdownDefDiagnostic[] } {\n const fromFiles: SubagentRegistry = Object.create(null)\n const winners = new Map<string, string>()\n const diagnostics: MarkdownDefDiagnostic[] = []\n for (const file of filesFor('agents', opts)) {\n const content = read(file.path)\n if (content === undefined)\n continue\n const parsed = parseAgentFile(file, content, opts.modelContext)\n diagnostics.push(...parsed.diagnostics)\n if (!parsed.entry)\n continue\n const [name, def] = parsed.entry\n if (RESERVED_NAMES.has(name)) {\n diagnostics.push({ path: file.path, kind: 'agent', message: 'reserved agent name' })\n continue\n }\n if (Object.hasOwn(BUILTIN_SUBAGENTS, name)) {\n // A cloned repo must not turn read-only Explore/Plan, which models call\n // unprompted, into writers: only user-scope files may replace them.\n if (file.source === 'project') {\n diagnostics.push({ path: file.path, kind: 'agent', message: `project files cannot replace builtin ${name}; rename the agent or move it to the user folder` })\n continue\n }\n // Without its own tool restriction the replacement would inherit every\n // parent tool, so it stays read-only unless the file wrote `readonly: false`.\n if (!def.tools && !parsed.explicitReadonlyFalse)\n def.readonly = true\n }\n const winner = winners.get(name)\n if (winner) {\n diagnostics.push({ path: file.path, kind: 'agent', message: `shadowed by ${winner}` })\n continue\n }\n winners.set(name, file.path)\n fromFiles[name] = def\n }\n const subagents: SubagentRegistry = {}\n for (const [name, def] of Object.entries(BUILTIN_SUBAGENTS))\n subagents[name] = { ...def }\n for (const [name, def] of Object.entries(fromFiles))\n subagents[name] = def\n return { subagents, diagnostics }\n}\n\n/**\n * Fold markdown/builtin agents into the preset's spawn tool, filling gaps\n * only: an agent the profile or an extension already registered keeps its\n * definition. Runs after `composeExtensionPreset`, so precedence is\n * builtin < file < extension without threading files through composition.\n */\nexport function applyMarkdownSubagents(preset: Preset, subagents: SubagentRegistry): Preset {\n const spawn = preset.tools?.spawn\n const entries = Object.entries(subagents)\n if (!spawn || !isSpawnTool(spawn) || entries.length === 0)\n return preset\n const overrides: Record<string, SubagentOverride> = Object.create(null)\n for (const [name, def] of entries)\n overrides[name] = (current: SubagentDef | undefined) => current ?? def\n return { ...preset, tools: { ...preset.tools, spawn: spawn.withSubagents({}, overrides) } }\n}\n","/**\n * Headless mode — a non-interactive, fully-structured way to drive the agent\n * for automation and RL rollouts.\n *\n * `agent.run()` already returns rich {@link AgentStats}, the session captures a\n * lossless transcript (`session.turns`), and the hook bus exposes every\n * streaming/tool/turn event. What this module adds is the *contract* an RL loop\n * needs: one call (`runHeadless`) that runs a prompt to completion in a chosen\n * workdir, bounded by turns + wall-clock, and hands back a single serializable\n * {@link HeadlessResult} — final answer, verifiable structured output, usage,\n * and the complete trajectory — plus an optional live {@link HeadlessEvent}\n * stream (the in-process equivalent of `--output-format stream-json`).\n *\n * It is provider-agnostic: the caller passes a built {@link Provider} (e.g.\n * `local()` pointed at a vLLM server, or any of the named providers). The thin\n * CLI in `src/headless-cli.ts` wraps this with arg parsing, file/stdin I/O, and\n * JSONL transcript writing.\n */\n\nimport type { Hookable } from 'hookable'\nimport type { AgentHooks, AgentOptions } from './agent'\nimport type { ExecutionContext } from './contexts'\nimport type { ExtensionRegistry } from './extensions'\nimport type { Preset } from './presets'\nimport type { Provider } from './providers'\nimport type { RunSummary } from './run-summary'\nimport type { Session, SessionStore } from './session'\nimport type { PairingRepair } from './session/messages'\nimport type { ToolDef } from './tools'\nimport type { SubagentRegistry } from './tools/spawn'\nimport type {\n AgentStats,\n McpServerConfig,\n PromptPart,\n SessionContentBlock,\n SessionTurn,\n ThinkingLevel,\n ToolResultContent,\n ToolResultDocumentContent,\n TurnFinishReason,\n} from './types'\nimport { createAgent } from './agent'\nimport { createProcessContext } from './contexts'\nimport { applyMarkdownSubagents } from './markdown-defs'\nimport { DEFAULT_MAX_IMAGE_EDGE, DEFAULT_MEDIA_BUDGET } from './media/defaults'\nimport { basic } from './presets'\nimport { createRunSummaryCollector } from './run-summary'\nimport { createMemoryStore, createSession, toAnthropic } from './session'\nimport { ensureToolResultPairing } from './session/messages'\nimport { audioFormatFromMediaType } from './tools/media-sniff'\nimport { assertResolvedMediaBlock, documentBlockMarker, isWireTurn, toolResultToText } from './types'\n\n// ---------------------------------------------------------------------------\n// Public shapes\n// ---------------------------------------------------------------------------\n\nexport type HeadlessStatus = 'completed' | 'aborted' | 'error' | 'timeout'\n\nexport interface HeadlessUsage {\n input: number\n output: number\n cacheRead: number\n cacheCreation: number\n /** Cumulative USD cost when the provider/registry could price the run. */\n cost?: number\n}\n\nexport interface HeadlessErrorInfo {\n message: string\n /** Typed-error class name (`AgentAbortedError`, `AgentContextExceededError`, …). */\n type: string\n}\n\n/**\n * Strictly JSON-serializable postmortem of one headless run. Everything an RL\n * reward function needs: the final answer (`finalText`), the verifiable\n * structured output (`output`, present iff a `schema` was set), usage/turns,\n * and the lossless `transcript` (the SFT training data).\n */\nexport interface HeadlessResult {\n status: HeadlessStatus\n /** Concatenated text of the last assistant turn that produced any text. */\n finalText: string\n /** Schema-enforced structured output (only when `opts.schema` is set). */\n output?: Record<string, unknown>\n usage: HeadlessUsage\n turns: number\n durationMs: number\n /** Total `tool_call` blocks across the whole transcript. */\n numToolCalls: number\n /** Finish reason of the final turn that reported one. */\n finishReason?: TurnFinishReason\n error?: HeadlessErrorInfo\n sessionId: string\n /** Incident postmortem (errors, gate blocks, budget events) via run-summary. */\n summary?: RunSummary\n /** Lossless transcript — raw `session.turns`. Thinking stripped when `includeThinking: false`. */\n transcript: SessionTurn[]\n}\n\nexport type HeadlessOutputFormat = 'zidane' | 'provider'\n\nexport type ProviderTranscriptFormat = 'anthropic' | 'openai'\n\nexport type FormattedHeadlessResult\n = | HeadlessResult\n | unknown[]\n\nexport type FormattedHeadlessTurnEvent\n = | Extract<HeadlessEvent, { type: 'turn' }>\n | unknown[]\n\nexport function exitCodeForHeadlessResult(result: HeadlessResult): number {\n switch (result.status) {\n case 'completed': return 0\n case 'timeout': return 124\n case 'aborted': return 130\n case 'error':\n default: return 1\n }\n}\n\n/**\n * Live event union — the in-process equivalent of a `stream-json` line. Every\n * member is JSON-serializable; render to JSONL with {@link headlessEventToJsonl}.\n */\nexport type HeadlessEvent\n = | { type: 'start', runId: string, provider?: string }\n | { type: 'text', delta: string }\n | { type: 'thinking', delta: string }\n | { type: 'tool_call', callId: string, name: string, input: Record<string, unknown> }\n | { type: 'tool_result', callId: string, name: string, output: string, isError: boolean }\n | { type: 'turn', index: number, turn: SessionTurn }\n | { type: 'spawn', event: 'before' | 'complete' | 'error', id: string, info?: Record<string, unknown> }\n | { type: 'error', message: string, errorType?: string }\n | { type: 'result', result: HeadlessResult }\n\n/** Serialize one event as a newline-terminated JSON line (stream-json). */\nexport function headlessEventToJsonl(event: HeadlessEvent): string {\n return `${JSON.stringify(event)}\\n`\n}\n\nexport function formattedHeadlessTurnEventToJsonl(event: FormattedHeadlessTurnEvent): string {\n return `${JSON.stringify(event)}\\n`\n}\n\nexport function providerTranscriptFormatForProvider(providerName: string): ProviderTranscriptFormat {\n return providerName === 'anthropic' ? 'anthropic' : 'openai'\n}\n\nexport function transcriptToProviderMessages(\n turns: SessionTurn[],\n providerName: string,\n): unknown[] {\n const format = providerTranscriptFormatForProvider(providerName)\n if (format === 'anthropic') {\n return turns\n .filter(isWireTurn)\n .map(turn => toAnthropic({ role: turn.role, content: turn.content }))\n }\n return transcriptToOpenAIMessages(turns, { strictToolPairing: false })\n}\n\nexport function formatHeadlessResult(\n result: HeadlessResult,\n options: { format: HeadlessOutputFormat, providerName: string },\n): FormattedHeadlessResult {\n if (options.format === 'zidane')\n return result\n return transcriptToProviderMessages(result.transcript, options.providerName)\n}\n\nexport function formatHeadlessTurnEvent(\n event: Extract<HeadlessEvent, { type: 'turn' }>,\n options: { format: HeadlessOutputFormat, providerName: string },\n): FormattedHeadlessTurnEvent {\n if (options.format === 'zidane')\n return event\n return transcriptToProviderMessages([event.turn], options.providerName)\n}\n\nexport interface HeadlessOptions {\n /** User prompt — plain string or multimodal `PromptPart[]`. */\n prompt: string | PromptPart[]\n /** Built provider (e.g. `local()`, `openaiCompat(...)`, `anthropic(...)`). */\n provider: Provider\n model?: string\n /** Override the preset system prompt for this run. */\n system?: string\n thinking?: ThinkingLevel\n maxTurns?: number\n maxTokens?: number\n /** Wall-clock cap; on expiry the run is aborted and `status` becomes `'timeout'`. */\n timeoutMs?: number\n /** External abort signal — chained with the internal timeout controller. */\n signal?: AbortSignal\n /** JSON Schema for structured-output enforcement → populates `result.output`. */\n schema?: Record<string, unknown>\n /** Agent behavior defaults for this headless run. Top-level shortcuts below override matching fields. */\n behavior?: AgentOptions['behavior']\n /** Tool overrides. Omit to use the basic preset's tools. */\n tools?: Record<string, ToolDef>\n mcpServers?: McpServerConfig[]\n skills?: AgentOptions['skills']\n /**\n * Base {@link Preset} for the agent — spread in place of the default `basic`\n * preset (use it to swap the system prompt / tool set wholesale). The\n * top-level shortcuts above (`system`, `behavior`, `tools`, `mcpServers`,\n * `skills`) still override matching preset fields.\n */\n preset?: Preset\n /**\n * Subagents folded into the preset's spawn tool, filling gaps only (an\n * agent the preset or an extension already defines wins). The CLI passes\n * builtin + markdown agents from `loadMarkdownAgents`.\n */\n subagents?: SubagentRegistry\n /**\n * Pre-built extension registry folded into the agent via `createAgent`\n * (build it with `buildExtensionRegistry(defs.map(inlineLoadedExtension))`).\n * Contributes the registry's tools / hooks / mcpServers / skills /\n * system-fragments / subagents, with the explicit options above winning on\n * collision. Because hooks fold through `createAgent`, a headless run with\n * `extensions` also gets extension hooks (e.g. a `tool:transform` that\n * rewrites results), not just tools.\n */\n extensions?: ExtensionRegistry\n /** Execution context. Defaults to a process context rooted at `cwd`. */\n execution?: ExecutionContext\n /** Working directory for the default process context (ignored if `execution` is set). */\n cwd?: string\n /** Reuse / resume an existing session. */\n session?: Session\n /** Session store for a fresh session (defaults to an in-memory store). */\n store?: SessionStore\n /** Keep `thinking` blocks in `result.transcript` (default true). */\n includeThinking?: boolean\n /** Live event callback — the in-process stream-json equivalent. */\n onEvent?: (event: HeadlessEvent) => void\n}\n\n// ---------------------------------------------------------------------------\n// runHeadless\n// ---------------------------------------------------------------------------\n\n/**\n * Run a prompt to completion, headless, and return a single serializable\n * {@link HeadlessResult}. Safe to call concurrently for parallel rollouts —\n * each call builds its own agent + session and tears them down in `finally`.\n */\nexport async function runHeadless(opts: HeadlessOptions): Promise<HeadlessResult> {\n const startedAt = Date.now()\n const execution = opts.execution ?? createProcessContext({ cwd: opts.cwd })\n const session = opts.session ?? await createSession({ store: opts.store ?? createMemoryStore() })\n\n // Layer behavior on top of the base preset's: the `behavior` key is spread\n // last into `createAgent`, so without seeding from `basePreset.behavior` a\n // custom `preset` carrying behavior defaults would be silently wiped (the\n // top-level shortcuts are meant to OVERRIDE preset fields, not replace them).\n const basePreset = opts.subagents\n ? applyMarkdownSubagents(opts.preset ?? basic, opts.subagents)\n : (opts.preset ?? basic)\n // Media defaults match the built-in chat profiles: keep media inline until\n // the request nears the provider's hard limits (`mediaBudget`), and shrink\n // Retina screenshots once at entry (`maxImageEdge`). Aged media stays\n // re-resolvable via `read_file path=\"attachment://…\"`. A preset or explicit\n // `behavior` still overrides: a `mediaKeepTurns` window takes precedence\n // over the budget, and `mediaBudget: undefined` disables it.\n const behavior: NonNullable<AgentOptions['behavior']> = { mediaBudget: DEFAULT_MEDIA_BUDGET, maxImageEdge: DEFAULT_MAX_IMAGE_EDGE, ...basePreset.behavior, ...(opts.behavior ?? {}) }\n if (opts.maxTurns !== undefined)\n behavior.maxTurns = opts.maxTurns\n if (opts.maxTokens !== undefined)\n behavior.maxTokens = opts.maxTokens\n if (opts.schema !== undefined)\n behavior.schema = opts.schema\n\n const agent = createAgent({\n ...basePreset,\n provider: opts.provider,\n execution,\n session,\n behavior,\n ...(opts.tools !== undefined ? { tools: opts.tools } : {}),\n ...(opts.mcpServers !== undefined ? { mcpServers: opts.mcpServers } : {}),\n ...(opts.skills !== undefined ? { skills: opts.skills } : {}),\n ...(opts.extensions !== undefined ? { extensions: opts.extensions } : {}),\n })\n\n const collector = createRunSummaryCollector()\n const uninstallSummary = collector.install(agent.hooks)\n const uninstallEvents = opts.onEvent ? installHeadlessEventAdapter(agent.hooks, opts.onEvent) : noop\n\n // Resumed sessions carry turns from prior runs — remember where this run\n // starts so transcript/finalText/numToolCalls stay per-run, matching the\n // per-run usage/turns/durationMs stats.\n const runStartIndex = session.turns.length\n\n // Internal controller drives the wall-clock timeout and chains any external\n // signal so a host cancel and a timeout both abort the same run. The\n // listener is removed in `finally` — a long-lived host signal must not\n // accumulate one listener per rollout.\n const controller = new AbortController()\n const onExternalAbort = (): void => controller.abort(opts.signal!.reason)\n if (opts.signal) {\n if (opts.signal.aborted)\n controller.abort(opts.signal.reason)\n else\n opts.signal.addEventListener('abort', onExternalAbort, { once: true })\n }\n let timedOut = false\n const timer = opts.timeoutMs && opts.timeoutMs > 0\n ? setTimeout(() => {\n timedOut = true\n controller.abort(new Error(`Headless run timed out after ${opts.timeoutMs}ms`))\n }, opts.timeoutMs)\n : undefined\n\n let stats: AgentStats | undefined\n let error: HeadlessErrorInfo | undefined\n\n try {\n stats = await agent.run({\n prompt: opts.prompt,\n signal: controller.signal,\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.system !== undefined ? { system: opts.system } : {}),\n ...(opts.thinking !== undefined ? { thinking: opts.thinking } : {}),\n })\n }\n catch (err) {\n // The agent loop throws typed errors (AgentAbortedError,\n // AgentContextExceededError, AgentProviderError, …) — their `name` already\n // classifies the failure, so surface it directly.\n const e = err instanceof Error ? err : new Error(String(err))\n error = { message: e.message, type: e.name }\n }\n finally {\n if (timer)\n clearTimeout(timer)\n opts.signal?.removeEventListener('abort', onExternalAbort)\n uninstallEvents()\n uninstallSummary()\n await agent.destroy()\n }\n\n // Status: a thrown error wins, but an abort/timeout can also surface as a\n // clean resolve (the loop returns partial stats), so check the signal too.\n let status: HeadlessStatus\n if (error)\n status = timedOut ? 'timeout' : controller.signal.aborted ? 'aborted' : 'error'\n else if (controller.signal.aborted)\n status = timedOut ? 'timeout' : 'aborted'\n else\n status = 'completed'\n\n const rawTranscript = session.turns.slice(runStartIndex)\n const transcript = opts.includeThinking === false ? stripThinking(rawTranscript) : rawTranscript\n const summary = collector.latest()\n\n const result: HeadlessResult = {\n status,\n finalText: extractFinalText(rawTranscript),\n ...(stats?.output ? { output: stats.output } : {}),\n usage: {\n input: stats?.totalIn ?? 0,\n output: stats?.totalOut ?? 0,\n cacheRead: stats?.totalCacheRead ?? 0,\n cacheCreation: stats?.totalCacheCreation ?? 0,\n ...(typeof stats?.cost === 'number' ? { cost: stats.cost } : {}),\n },\n turns: stats?.turns ?? 0,\n durationMs: stats?.elapsed ?? (Date.now() - startedAt),\n numToolCalls: countToolCalls(rawTranscript),\n // Suppress `finishReason` on abort/timeout: the last persisted turn can\n // carry `finishReason: 'stop'` (e.g. the model finished a turn, a follow-up\n // continued, then the run was cancelled), which would make a consumer\n // keyed on `finishReason === 'stop'` misread a cancel as \"model finished\".\n // `status` is authoritative for those exits; let it speak alone. The\n // `'pause'` exhaustion exit keeps `status: 'completed'` so it still\n // surfaces its `finishReason: 'pause'` here.\n ...(status !== 'aborted' && status !== 'timeout' && lastFinishReason(stats)\n ? { finishReason: lastFinishReason(stats) }\n : {}),\n ...(error ? { error } : {}),\n sessionId: session.id,\n ...(summary ? { summary } : {}),\n transcript,\n }\n\n opts.onEvent?.({ type: 'result', result })\n return result\n}\n\n// ---------------------------------------------------------------------------\n// Transcript → OpenAI chat messages (SFT-ready)\n// ---------------------------------------------------------------------------\n\nexport interface OpenAIChatMessage {\n role: 'system' | 'user' | 'assistant' | 'tool'\n content: string | null | OpenAIChatContentPart[]\n tool_calls?: Array<{ id: string, type: 'function', function: { name: string, arguments: string } }>\n tool_call_id?: string\n}\n\nexport type OpenAIChatContentPart\n = | { type: 'text', text: string }\n | { type: 'image_url', image_url: { url: string } }\n | { type: 'input_audio', input_audio: { data: string, format: string } }\n | { type: 'video_url', video_url: { url: string } }\n\n/**\n * Convert raw `session.turns` into standard OpenAI chat-completion messages:\n * assistant turns carry `tool_calls`, and each `tool_result` becomes its own\n * `role: 'tool'` message. This is the drop-in shape for an SFT renderer —\n * unlike `toOpenAI` (session/messages.ts), which emits an internal `_tag`\n * envelope meant for re-sending to a provider, not for training data.\n *\n * Fails closed on corrupt raw turns instead of fabricating tool results; silent\n * placeholders would create structurally-valid but semantically-poisoned SFT\n * examples.\n */\nexport function transcriptToOpenAIMessages(\n turns: SessionTurn[],\n options: { strictToolPairing?: boolean } = {},\n): OpenAIChatMessage[] {\n const { strictToolPairing = true } = options\n const messages: OpenAIChatMessage[] = []\n let chunk: Array<{ role: 'user' | 'assistant', content: SessionContentBlock[] }> = []\n const flushChunk = () => {\n if (chunk.length === 0)\n return\n let paired = chunk\n if (strictToolPairing) {\n const repairs: PairingRepair[] = []\n paired = ensureToolResultPairing(chunk, { onRepair: repair => repairs.push(repair) })\n if (repairs.length > 0) {\n throw new Error(\n `Cannot convert transcript to OpenAI messages: tool pairing repair required (${repairs.map(r => r.mode).join(', ')})`,\n )\n }\n }\n for (const msg of paired)\n pushOpenAIChatMessage(messages, msg)\n chunk = []\n }\n\n for (const turn of turns) {\n if (turn.role === 'system') {\n flushChunk()\n messages.push({ role: 'system', content: textOf(turn.content) })\n continue\n }\n // Non-wire turns (display-only `command`, and any future non-wire role)\n // never reach the model — shared, fail-safe guard.\n if (!isWireTurn(turn))\n continue\n chunk.push({ role: turn.role, content: turn.content })\n }\n flushChunk()\n\n return messages\n}\n\nfunction pushOpenAIChatMessage(messages: OpenAIChatMessage[], msg: { role: 'user' | 'assistant', content: SessionContentBlock[] }): void {\n const text = textOf(msg.content)\n\n if (msg.role === 'assistant') {\n const toolCalls = msg.content.filter((b): b is ToolCallBlock => b.type === 'tool_call')\n const out: OpenAIChatMessage = { role: 'assistant', content: text || null }\n if (toolCalls.length > 0) {\n out.tool_calls = toolCalls.map(b => ({\n id: b.id,\n type: 'function' as const,\n function: { name: b.name, arguments: JSON.stringify(b.input) },\n }))\n }\n messages.push(out)\n return\n }\n\n // user turn — may carry prompt text/images and/or tool_result blocks\n const userParts = contentPartsFromBlocks(msg.content)\n if (userParts.length > 0)\n messages.push({ role: 'user', content: simplifyOpenAIContent(userParts) })\n\n for (const tr of msg.content.filter((b): b is ToolResultBlock => b.type === 'tool_result')) {\n const { text, images } = summarizeToolResultForOpenAI(tr.output)\n if (images.length === 0) {\n messages.push({ role: 'tool', tool_call_id: tr.callId, content: text })\n continue\n }\n\n const noun = images.length === 1 ? 'image' : 'images'\n const marker = `[${images.length} ${noun} attached — see next user message]`\n messages.push({\n role: 'tool',\n tool_call_id: tr.callId,\n content: text.length > 0 ? `${text}\\n\\n${marker}` : marker,\n })\n messages.push({\n role: 'user',\n content: [\n ...images.map(toOpenAIImagePart),\n { type: 'text', text: `(${noun} returned by tool call ${tr.callId})` },\n ],\n })\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\ntype TextBlock = Extract<SessionContentBlock, { type: 'text' }>\ntype ToolCallBlock = Extract<SessionContentBlock, { type: 'tool_call' }>\ntype ToolResultBlock = Extract<SessionContentBlock, { type: 'tool_result' }>\n\nfunction noop(): void {}\n\nfunction textOf(content: SessionContentBlock[]): string {\n return content.filter((b): b is TextBlock => b.type === 'text').map(b => b.text).join('')\n}\n\nfunction contentPartsFromBlocks(content: SessionContentBlock[]): OpenAIChatContentPart[] {\n const parts: OpenAIChatContentPart[] = []\n for (const block of content) {\n if (block.type === 'image') {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n parts.push(toOpenAIImagePart(block))\n }\n else if (block.type === 'audio') {\n parts.push({ type: 'input_audio', input_audio: { data: block.data, format: audioFormatFromMediaType(block.mediaType) } })\n }\n else if (block.type === 'video') {\n parts.push({ type: 'video_url', video_url: { url: `data:${block.mediaType};base64,${block.data}` } })\n }\n else if (block.type === 'document') {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n parts.push({ type: 'text', text: documentMarker(block) })\n }\n else if (block.type === 'text' && block.text.length > 0) {\n parts.push({ type: 'text', text: block.text })\n }\n }\n return parts\n}\n\nfunction simplifyOpenAIContent(parts: OpenAIChatContentPart[]): string | OpenAIChatContentPart[] {\n if (parts.length === 1 && parts[0].type === 'text')\n return parts[0].text\n return parts\n}\n\nfunction toOpenAIImagePart(image: { mediaType: string, data: string }): OpenAIChatContentPart {\n return {\n type: 'image_url',\n image_url: { url: `data:${image.mediaType};base64,${image.data}` },\n }\n}\n\nfunction summarizeToolResultForOpenAI(output: string | ToolResultContent[]): {\n text: string\n images: Array<{ mediaType: string, data: string }>\n} {\n if (typeof output === 'string')\n return { text: output, images: [] }\n\n const texts: string[] = []\n const images: Array<{ mediaType: string, data: string }> = []\n for (const block of output) {\n if (block.type === 'text') {\n texts.push(block.text)\n }\n else if (block.type === 'image') {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n images.push({ mediaType: block.mediaType, data: block.data })\n }\n else if (block.type === 'audio') {\n texts.push(`[audio: ${block.mediaType}]`)\n }\n else if (block.type === 'video') {\n texts.push(`[video: ${block.mediaType}]`)\n }\n else {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n texts.push(documentMarker(block))\n }\n }\n return { text: texts.join('\\n'), images }\n}\n\nfunction documentMarker(doc: ToolResultDocumentContent): string {\n return documentBlockMarker(doc, 'document omitted')\n}\n\nfunction extractFinalText(turns: SessionTurn[]): string {\n for (let i = turns.length - 1; i >= 0; i--) {\n const turn = turns[i]\n if (turn.role !== 'assistant')\n continue\n const text = textOf(turn.content)\n if (text)\n return text\n }\n return ''\n}\n\nfunction countToolCalls(turns: SessionTurn[]): number {\n let n = 0\n for (const turn of turns) {\n for (const block of turn.content) {\n if (block.type === 'tool_call')\n n++\n }\n }\n return n\n}\n\nfunction lastFinishReason(stats?: AgentStats): TurnFinishReason | undefined {\n const usages = stats?.turnUsage\n if (!usages)\n return undefined\n for (let i = usages.length - 1; i >= 0; i--) {\n if (usages[i].finishReason)\n return usages[i].finishReason\n }\n return undefined\n}\n\nfunction stripThinking(turns: SessionTurn[]): SessionTurn[] {\n return turns.map(turn => ({\n ...turn,\n content: turn.content.filter(b => b.type !== 'thinking' && b.type !== 'redacted_thinking'),\n }))\n}\n\nexport function installHeadlessEventAdapter(\n hooks: Hookable<AgentHooks>,\n onEvent: (event: HeadlessEvent) => void,\n): () => void {\n const unregs: Array<() => void> = []\n const emittedTurnIds = new Set<string>()\n const emit = (event: HeadlessEvent): void => {\n try {\n onEvent(event)\n }\n catch {\n // A consumer's sink throwing is not the adapter's concern.\n }\n }\n\n unregs.push(hooks.hook('agent:start', ctx => emit({\n type: 'start',\n runId: ctx.runId,\n ...(ctx.providerName ? { provider: ctx.providerName } : {}),\n })))\n unregs.push(hooks.hook('stream:text', ctx => emit({ type: 'text', delta: ctx.delta })))\n unregs.push(hooks.hook('stream:thinking', ctx => emit({ type: 'thinking', delta: ctx.delta })))\n unregs.push(hooks.hook('tool:before', ctx => emit({\n type: 'tool_call',\n callId: ctx.callId,\n name: ctx.name,\n input: ctx.input,\n })))\n unregs.push(hooks.hook('tool:after', ctx => emit({\n type: 'tool_result',\n callId: ctx.callId,\n name: ctx.name,\n output: toolResultToText(ctx.result),\n isError: false,\n })))\n unregs.push(hooks.hook('tool:error', ctx => emit({\n type: 'tool_result',\n callId: ctx.callId,\n name: ctx.name,\n output: ctx.error.message,\n isError: true,\n })))\n unregs.push(hooks.hook('session:turns', (ctx) => {\n const startIndex = ctx.count - ctx.turns.length\n ctx.turns.forEach((turn, i) => {\n if (emittedTurnIds.has(turn.id))\n return\n emittedTurnIds.add(turn.id)\n emit({ type: 'turn', index: startIndex + i, turn })\n })\n }))\n unregs.push(hooks.hook('spawn:before', ctx => emit({ type: 'spawn', event: 'before', id: ctx.id })))\n unregs.push(hooks.hook('spawn:complete', ctx => emit({\n type: 'spawn',\n event: 'complete',\n id: ctx.id,\n info: { status: ctx.status ?? 'completed' },\n })))\n unregs.push(hooks.hook('spawn:error', ctx => emit({\n type: 'spawn',\n event: 'error',\n id: ctx.id,\n info: { message: ctx.error.message },\n })))\n unregs.push(hooks.hook('stream:error', ctx => emit({\n type: 'error',\n message: ctx.err instanceof Error ? ctx.err.message : String(ctx.err),\n ...(ctx.err instanceof Error ? { errorType: ctx.err.name } : {}),\n })))\n\n return () => {\n for (const un of unregs) {\n try {\n un()\n }\n catch {\n // ignore\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { $n as HeadlessResult, Jn as FormattedHeadlessTurnEvent, Qn as HeadlessOutputFormat, Xn as HeadlessEvent, Yn as HeadlessErrorInfo, Zn as HeadlessOptions, ar as exitCodeForHeadlessResult, cr as formattedHeadlessTurnEventToJsonl, dr as providerTranscriptFormatForProvider, er as HeadlessStatus, fr as runHeadless, ir as ProviderTranscriptFormat, lr as headlessEventToJsonl, mr as transcriptToProviderMessages, nr as OpenAIChatContentPart, or as formatHeadlessResult, pr as transcriptToOpenAIMessages, qn as FormattedHeadlessResult, rr as OpenAIChatMessage, sr as formatHeadlessTurnEvent, tr as HeadlessUsage, ur as installHeadlessEventAdapter } from "./index-BgN1T3lk.js";
1
+ import { $n as HeadlessOutputFormat, Jn as FormattedHeadlessResult, Qn as HeadlessOptions, Xn as HeadlessErrorInfo, Yn as FormattedHeadlessTurnEvent, Zn as HeadlessEvent, ar as ProviderTranscriptFormat, cr as formatHeadlessTurnEvent, dr as installHeadlessEventAdapter, er as HeadlessResult, fr as providerTranscriptFormatForProvider, hr as transcriptToProviderMessages, ir as OpenAIChatMessage, lr as formattedHeadlessTurnEventToJsonl, mr as transcriptToOpenAIMessages, nr as HeadlessUsage, or as exitCodeForHeadlessResult, pr as runHeadless, rr as OpenAIChatContentPart, sr as formatHeadlessResult, tr as HeadlessStatus, ur as headlessEventToJsonl } from "./index-BGe1fQT7.js";
2
2
  export { FormattedHeadlessResult, FormattedHeadlessTurnEvent, HeadlessErrorInfo, HeadlessEvent, HeadlessOptions, HeadlessOutputFormat, HeadlessResult, HeadlessStatus, HeadlessUsage, OpenAIChatContentPart, OpenAIChatMessage, ProviderTranscriptFormat, exitCodeForHeadlessResult, formatHeadlessResult, formatHeadlessTurnEvent, formattedHeadlessTurnEventToJsonl, headlessEventToJsonl, installHeadlessEventAdapter, providerTranscriptFormatForProvider, runHeadless, transcriptToOpenAIMessages, transcriptToProviderMessages };
package/dist/headless.js CHANGED
@@ -1,413 +1 @@
1
- import { a as documentBlockMarker, o as isWireTurn, r as assertResolvedMediaBlock, u as toolResultToText } from "./types-CWgENVLY.js";
2
- import { Ct as basic_default, t as createAgent } from "./agent-D0zZnGbt.js";
3
- import { r as createProcessContext } from "./contexts-CRE9pw07.js";
4
- import { t as audioFormatFromMediaType } from "./media-sniff-UKijEaiQ.js";
5
- import { c as ensureToolResultPairing, g as toAnthropic } from "./messages-2jcOA_5R.js";
6
- import { d as createMemoryStore, t as createSession } from "./session-BqRP1hS7.js";
7
- import { t as createRunSummaryCollector } from "./run-summary-BU_NgwUT.js";
8
- //#region src/headless.ts
9
- function exitCodeForHeadlessResult(result) {
10
- switch (result.status) {
11
- case "completed": return 0;
12
- case "timeout": return 124;
13
- case "aborted": return 130;
14
- default: return 1;
15
- }
16
- }
17
- /** Serialize one event as a newline-terminated JSON line (stream-json). */
18
- function headlessEventToJsonl(event) {
19
- return `${JSON.stringify(event)}\n`;
20
- }
21
- function formattedHeadlessTurnEventToJsonl(event) {
22
- return `${JSON.stringify(event)}\n`;
23
- }
24
- function providerTranscriptFormatForProvider(providerName) {
25
- return providerName === "anthropic" ? "anthropic" : "openai";
26
- }
27
- function transcriptToProviderMessages(turns, providerName) {
28
- if (providerTranscriptFormatForProvider(providerName) === "anthropic") return turns.filter(isWireTurn).map((turn) => toAnthropic({
29
- role: turn.role,
30
- content: turn.content
31
- }));
32
- return transcriptToOpenAIMessages(turns, { strictToolPairing: false });
33
- }
34
- function formatHeadlessResult(result, options) {
35
- if (options.format === "zidane") return result;
36
- return transcriptToProviderMessages(result.transcript, options.providerName);
37
- }
38
- function formatHeadlessTurnEvent(event, options) {
39
- if (options.format === "zidane") return event;
40
- return transcriptToProviderMessages([event.turn], options.providerName);
41
- }
42
- /**
43
- * Run a prompt to completion, headless, and return a single serializable
44
- * {@link HeadlessResult}. Safe to call concurrently for parallel rollouts —
45
- * each call builds its own agent + session and tears them down in `finally`.
46
- */
47
- async function runHeadless(opts) {
48
- const startedAt = Date.now();
49
- const execution = opts.execution ?? createProcessContext({ cwd: opts.cwd });
50
- const session = opts.session ?? await createSession({ store: opts.store ?? createMemoryStore() });
51
- const basePreset = opts.preset ?? basic_default;
52
- const behavior = {
53
- mediaKeepTurns: 8,
54
- ...basePreset.behavior,
55
- ...opts.behavior ?? {}
56
- };
57
- if (opts.maxTurns !== void 0) behavior.maxTurns = opts.maxTurns;
58
- if (opts.maxTokens !== void 0) behavior.maxTokens = opts.maxTokens;
59
- if (opts.schema !== void 0) behavior.schema = opts.schema;
60
- const agent = createAgent({
61
- ...basePreset,
62
- provider: opts.provider,
63
- execution,
64
- session,
65
- behavior,
66
- ...opts.tools !== void 0 ? { tools: opts.tools } : {},
67
- ...opts.mcpServers !== void 0 ? { mcpServers: opts.mcpServers } : {},
68
- ...opts.skills !== void 0 ? { skills: opts.skills } : {},
69
- ...opts.extensions !== void 0 ? { extensions: opts.extensions } : {}
70
- });
71
- const collector = createRunSummaryCollector();
72
- const uninstallSummary = collector.install(agent.hooks);
73
- const uninstallEvents = opts.onEvent ? installHeadlessEventAdapter(agent.hooks, opts.onEvent) : noop;
74
- const runStartIndex = session.turns.length;
75
- const controller = new AbortController();
76
- const onExternalAbort = () => controller.abort(opts.signal.reason);
77
- if (opts.signal) if (opts.signal.aborted) controller.abort(opts.signal.reason);
78
- else opts.signal.addEventListener("abort", onExternalAbort, { once: true });
79
- let timedOut = false;
80
- const timer = opts.timeoutMs && opts.timeoutMs > 0 ? setTimeout(() => {
81
- timedOut = true;
82
- controller.abort(/* @__PURE__ */ new Error(`Headless run timed out after ${opts.timeoutMs}ms`));
83
- }, opts.timeoutMs) : void 0;
84
- let stats;
85
- let error;
86
- try {
87
- stats = await agent.run({
88
- prompt: opts.prompt,
89
- signal: controller.signal,
90
- ...opts.model !== void 0 ? { model: opts.model } : {},
91
- ...opts.system !== void 0 ? { system: opts.system } : {},
92
- ...opts.thinking !== void 0 ? { thinking: opts.thinking } : {}
93
- });
94
- } catch (err) {
95
- const e = err instanceof Error ? err : new Error(String(err));
96
- error = {
97
- message: e.message,
98
- type: e.name
99
- };
100
- } finally {
101
- if (timer) clearTimeout(timer);
102
- opts.signal?.removeEventListener("abort", onExternalAbort);
103
- uninstallEvents();
104
- uninstallSummary();
105
- await agent.destroy();
106
- }
107
- let status;
108
- if (error) status = timedOut ? "timeout" : controller.signal.aborted ? "aborted" : "error";
109
- else if (controller.signal.aborted) status = timedOut ? "timeout" : "aborted";
110
- else status = "completed";
111
- const rawTranscript = session.turns.slice(runStartIndex);
112
- const transcript = opts.includeThinking === false ? stripThinking(rawTranscript) : rawTranscript;
113
- const summary = collector.latest();
114
- const result = {
115
- status,
116
- finalText: extractFinalText(rawTranscript),
117
- ...stats?.output ? { output: stats.output } : {},
118
- usage: {
119
- input: stats?.totalIn ?? 0,
120
- output: stats?.totalOut ?? 0,
121
- cacheRead: stats?.totalCacheRead ?? 0,
122
- cacheCreation: stats?.totalCacheCreation ?? 0,
123
- ...typeof stats?.cost === "number" ? { cost: stats.cost } : {}
124
- },
125
- turns: stats?.turns ?? 0,
126
- durationMs: stats?.elapsed ?? Date.now() - startedAt,
127
- numToolCalls: countToolCalls(rawTranscript),
128
- ...status !== "aborted" && status !== "timeout" && lastFinishReason(stats) ? { finishReason: lastFinishReason(stats) } : {},
129
- ...error ? { error } : {},
130
- sessionId: session.id,
131
- ...summary ? { summary } : {},
132
- transcript
133
- };
134
- opts.onEvent?.({
135
- type: "result",
136
- result
137
- });
138
- return result;
139
- }
140
- /**
141
- * Convert raw `session.turns` into standard OpenAI chat-completion messages:
142
- * assistant turns carry `tool_calls`, and each `tool_result` becomes its own
143
- * `role: 'tool'` message. This is the drop-in shape for an SFT renderer —
144
- * unlike `toOpenAI` (session/messages.ts), which emits an internal `_tag`
145
- * envelope meant for re-sending to a provider, not for training data.
146
- *
147
- * Fails closed on corrupt raw turns instead of fabricating tool results; silent
148
- * placeholders would create structurally-valid but semantically-poisoned SFT
149
- * examples.
150
- */
151
- function transcriptToOpenAIMessages(turns, options = {}) {
152
- const { strictToolPairing = true } = options;
153
- const messages = [];
154
- let chunk = [];
155
- const flushChunk = () => {
156
- if (chunk.length === 0) return;
157
- let paired = chunk;
158
- if (strictToolPairing) {
159
- const repairs = [];
160
- paired = ensureToolResultPairing(chunk, { onRepair: (repair) => repairs.push(repair) });
161
- if (repairs.length > 0) throw new Error(`Cannot convert transcript to OpenAI messages: tool pairing repair required (${repairs.map((r) => r.mode).join(", ")})`);
162
- }
163
- for (const msg of paired) pushOpenAIChatMessage(messages, msg);
164
- chunk = [];
165
- };
166
- for (const turn of turns) {
167
- if (turn.role === "system") {
168
- flushChunk();
169
- messages.push({
170
- role: "system",
171
- content: textOf(turn.content)
172
- });
173
- continue;
174
- }
175
- if (!isWireTurn(turn)) continue;
176
- chunk.push({
177
- role: turn.role,
178
- content: turn.content
179
- });
180
- }
181
- flushChunk();
182
- return messages;
183
- }
184
- function pushOpenAIChatMessage(messages, msg) {
185
- const text = textOf(msg.content);
186
- if (msg.role === "assistant") {
187
- const toolCalls = msg.content.filter((b) => b.type === "tool_call");
188
- const out = {
189
- role: "assistant",
190
- content: text || null
191
- };
192
- if (toolCalls.length > 0) out.tool_calls = toolCalls.map((b) => ({
193
- id: b.id,
194
- type: "function",
195
- function: {
196
- name: b.name,
197
- arguments: JSON.stringify(b.input)
198
- }
199
- }));
200
- messages.push(out);
201
- return;
202
- }
203
- const userParts = contentPartsFromBlocks(msg.content);
204
- if (userParts.length > 0) messages.push({
205
- role: "user",
206
- content: simplifyOpenAIContent(userParts)
207
- });
208
- for (const tr of msg.content.filter((b) => b.type === "tool_result")) {
209
- const { text, images } = summarizeToolResultForOpenAI(tr.output);
210
- if (images.length === 0) {
211
- messages.push({
212
- role: "tool",
213
- tool_call_id: tr.callId,
214
- content: text
215
- });
216
- continue;
217
- }
218
- const noun = images.length === 1 ? "image" : "images";
219
- const marker = `[${images.length} ${noun} attached — see next user message]`;
220
- messages.push({
221
- role: "tool",
222
- tool_call_id: tr.callId,
223
- content: text.length > 0 ? `${text}\n\n${marker}` : marker
224
- });
225
- messages.push({
226
- role: "user",
227
- content: [...images.map(toOpenAIImagePart), {
228
- type: "text",
229
- text: `(${noun} returned by tool call ${tr.callId})`
230
- }]
231
- });
232
- }
233
- }
234
- function noop() {}
235
- function textOf(content) {
236
- return content.filter((b) => b.type === "text").map((b) => b.text).join("");
237
- }
238
- function contentPartsFromBlocks(content) {
239
- const parts = [];
240
- for (const block of content) if (block.type === "image") {
241
- assertResolvedMediaBlock(block, "OpenAI transcript messages");
242
- parts.push(toOpenAIImagePart(block));
243
- } else if (block.type === "audio") parts.push({
244
- type: "input_audio",
245
- input_audio: {
246
- data: block.data,
247
- format: audioFormatFromMediaType(block.mediaType)
248
- }
249
- });
250
- else if (block.type === "video") parts.push({
251
- type: "video_url",
252
- video_url: { url: `data:${block.mediaType};base64,${block.data}` }
253
- });
254
- else if (block.type === "document") {
255
- assertResolvedMediaBlock(block, "OpenAI transcript messages");
256
- parts.push({
257
- type: "text",
258
- text: documentMarker(block)
259
- });
260
- } else if (block.type === "text" && block.text.length > 0) parts.push({
261
- type: "text",
262
- text: block.text
263
- });
264
- return parts;
265
- }
266
- function simplifyOpenAIContent(parts) {
267
- if (parts.length === 1 && parts[0].type === "text") return parts[0].text;
268
- return parts;
269
- }
270
- function toOpenAIImagePart(image) {
271
- return {
272
- type: "image_url",
273
- image_url: { url: `data:${image.mediaType};base64,${image.data}` }
274
- };
275
- }
276
- function summarizeToolResultForOpenAI(output) {
277
- if (typeof output === "string") return {
278
- text: output,
279
- images: []
280
- };
281
- const texts = [];
282
- const images = [];
283
- for (const block of output) if (block.type === "text") texts.push(block.text);
284
- else if (block.type === "image") {
285
- assertResolvedMediaBlock(block, "OpenAI transcript messages");
286
- images.push({
287
- mediaType: block.mediaType,
288
- data: block.data
289
- });
290
- } else if (block.type === "audio") texts.push(`[audio: ${block.mediaType}]`);
291
- else if (block.type === "video") texts.push(`[video: ${block.mediaType}]`);
292
- else {
293
- assertResolvedMediaBlock(block, "OpenAI transcript messages");
294
- texts.push(documentMarker(block));
295
- }
296
- return {
297
- text: texts.join("\n"),
298
- images
299
- };
300
- }
301
- function documentMarker(doc) {
302
- return documentBlockMarker(doc, "document omitted");
303
- }
304
- function extractFinalText(turns) {
305
- for (let i = turns.length - 1; i >= 0; i--) {
306
- const turn = turns[i];
307
- if (turn.role !== "assistant") continue;
308
- const text = textOf(turn.content);
309
- if (text) return text;
310
- }
311
- return "";
312
- }
313
- function countToolCalls(turns) {
314
- let n = 0;
315
- for (const turn of turns) for (const block of turn.content) if (block.type === "tool_call") n++;
316
- return n;
317
- }
318
- function lastFinishReason(stats) {
319
- const usages = stats?.turnUsage;
320
- if (!usages) return void 0;
321
- for (let i = usages.length - 1; i >= 0; i--) if (usages[i].finishReason) return usages[i].finishReason;
322
- }
323
- function stripThinking(turns) {
324
- return turns.map((turn) => ({
325
- ...turn,
326
- content: turn.content.filter((b) => b.type !== "thinking" && b.type !== "redacted_thinking")
327
- }));
328
- }
329
- function installHeadlessEventAdapter(hooks, onEvent) {
330
- const unregs = [];
331
- const emittedTurnIds = /* @__PURE__ */ new Set();
332
- const emit = (event) => {
333
- try {
334
- onEvent(event);
335
- } catch {}
336
- };
337
- unregs.push(hooks.hook("agent:start", (ctx) => emit({
338
- type: "start",
339
- runId: ctx.runId,
340
- ...ctx.providerName ? { provider: ctx.providerName } : {}
341
- })));
342
- unregs.push(hooks.hook("stream:text", (ctx) => emit({
343
- type: "text",
344
- delta: ctx.delta
345
- })));
346
- unregs.push(hooks.hook("stream:thinking", (ctx) => emit({
347
- type: "thinking",
348
- delta: ctx.delta
349
- })));
350
- unregs.push(hooks.hook("tool:before", (ctx) => emit({
351
- type: "tool_call",
352
- callId: ctx.callId,
353
- name: ctx.name,
354
- input: ctx.input
355
- })));
356
- unregs.push(hooks.hook("tool:after", (ctx) => emit({
357
- type: "tool_result",
358
- callId: ctx.callId,
359
- name: ctx.name,
360
- output: toolResultToText(ctx.result),
361
- isError: false
362
- })));
363
- unregs.push(hooks.hook("tool:error", (ctx) => emit({
364
- type: "tool_result",
365
- callId: ctx.callId,
366
- name: ctx.name,
367
- output: ctx.error.message,
368
- isError: true
369
- })));
370
- unregs.push(hooks.hook("session:turns", (ctx) => {
371
- const startIndex = ctx.count - ctx.turns.length;
372
- ctx.turns.forEach((turn, i) => {
373
- if (emittedTurnIds.has(turn.id)) return;
374
- emittedTurnIds.add(turn.id);
375
- emit({
376
- type: "turn",
377
- index: startIndex + i,
378
- turn
379
- });
380
- });
381
- }));
382
- unregs.push(hooks.hook("spawn:before", (ctx) => emit({
383
- type: "spawn",
384
- event: "before",
385
- id: ctx.id
386
- })));
387
- unregs.push(hooks.hook("spawn:complete", (ctx) => emit({
388
- type: "spawn",
389
- event: "complete",
390
- id: ctx.id,
391
- info: { status: ctx.status ?? "completed" }
392
- })));
393
- unregs.push(hooks.hook("spawn:error", (ctx) => emit({
394
- type: "spawn",
395
- event: "error",
396
- id: ctx.id,
397
- info: { message: ctx.error.message }
398
- })));
399
- unregs.push(hooks.hook("stream:error", (ctx) => emit({
400
- type: "error",
401
- message: ctx.err instanceof Error ? ctx.err.message : String(ctx.err),
402
- ...ctx.err instanceof Error ? { errorType: ctx.err.name } : {}
403
- })));
404
- return () => {
405
- for (const un of unregs) try {
406
- un();
407
- } catch {}
408
- };
409
- }
410
- //#endregion
411
- export { exitCodeForHeadlessResult, formatHeadlessResult, formatHeadlessTurnEvent, formattedHeadlessTurnEventToJsonl, headlessEventToJsonl, installHeadlessEventAdapter, providerTranscriptFormatForProvider, runHeadless, transcriptToOpenAIMessages, transcriptToProviderMessages };
412
-
413
- //# sourceMappingURL=headless.js.map
1
+ export { t as exitCodeForHeadlessResult, n as formatHeadlessResult, r as formatHeadlessTurnEvent, i as formattedHeadlessTurnEventToJsonl, a as headlessEventToJsonl, o as installHeadlessEventAdapter, s as providerTranscriptFormatForProvider, c as runHeadless, l as transcriptToOpenAIMessages, u as transcriptToProviderMessages } from "./headless-C_rNUuYC.js";
@@ -128,7 +128,11 @@ function sessionHistoryFromMatches(matches, maxExcerpts) {
128
128
  excerpts
129
129
  };
130
130
  }
131
- function filterSessionSearchCatalog(sessions, query, contentMatches) {
131
+ /**
132
+ * `contentMatches` are keyed by `keyOf(meta)`: the bare id by default, a
133
+ * (host, id) session key for a list across hosts (twins are two rows).
134
+ */
135
+ function filterSessionSearchCatalog(sessions, query, contentMatches, keyOf = (meta) => meta.id) {
132
136
  const terms = query.trim().toLocaleLowerCase().split(/\s+/u).filter(Boolean);
133
137
  if (terms.length === 0) return [...sessions];
134
138
  return sessions.flatMap((meta) => {
@@ -137,7 +141,7 @@ function filterSessionSearchCatalog(sessions, query, contentMatches) {
137
141
  const direct = terms.every((term) => corpus.includes(term));
138
142
  const fuzzy = !direct && terms.every((term) => findFuzzyWordRange(corpus, term) !== null);
139
143
  const metadataRank = direct ? 2 : fuzzy ? 1 : 0;
140
- const contentMatch = contentMatches.get(meta.id);
144
+ const contentMatch = contentMatches.get(keyOf(meta));
141
145
  return metadataRank > 0 || contentMatch ? [{
142
146
  meta,
143
147
  metadataRank,
@@ -483,4 +487,4 @@ function lower(value) {
483
487
  //#endregion
484
488
  export { searchHighlightRanges as a, searchSessionHistoryIndexAsync as c, searchSessionTurns as d, searchTurns as f, highlightSegments as i, searchSessionIndex as l, buildSessionSearchIndexAsync as n, searchSessionHistory as o, searchableTurnText as p, filterSessionSearchCatalog as r, searchSessionHistoryIndex as s, buildSessionSearchIndex as t, searchSessionIndexAsync as u };
485
489
 
486
- //# sourceMappingURL=history-search-C4bk1Wz_.js.map
490
+ //# sourceMappingURL=history-search-CcYzF8-0.js.map