zidane 9.1.1 → 9.1.3

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 (279) hide show
  1. package/dist/{acp-Di9WvMDF.js → acp-CeCavNlg.js} +7 -7
  2. package/dist/{acp-Di9WvMDF.js.map → acp-CeCavNlg.js.map} +1 -1
  3. package/dist/acp-cli.js +5 -5
  4. package/dist/acp.d.ts +2 -2
  5. package/dist/acp.js +1 -1
  6. package/dist/{agent-DJhpTS-B.js → agent-Dh_XZ7fj.js} +74 -19
  7. package/dist/agent-Dh_XZ7fj.js.map +1 -0
  8. package/dist/agent.d.ts +1 -1
  9. package/dist/agent.js +1 -1
  10. package/dist/{auth-store-port-DFgf22oo.js → auth-store-port-BKpjlJ8a.js} +2 -2
  11. package/dist/{auth-store-port-DFgf22oo.js.map → auth-store-port-BKpjlJ8a.js.map} +1 -1
  12. package/dist/{auto-update-restart-BFB7Ek87.js → auto-update-restart-CQJtndMG.js} +277 -41
  13. package/dist/auto-update-restart-CQJtndMG.js.map +1 -0
  14. package/dist/{browser-BcoCCB_n.js → browser-BkdeKnxO.js} +56 -2
  15. package/dist/browser-BkdeKnxO.js.map +1 -0
  16. package/dist/{browser-entry-ypi8CyE-.d.ts → browser-entry-BCwruqNa.d.ts} +10 -10
  17. package/dist/{browser-entry-ypi8CyE-.d.ts.map → browser-entry-BCwruqNa.d.ts.map} +1 -1
  18. package/dist/channels.d.ts +5 -5
  19. package/dist/chat/browser.d.ts +4 -4
  20. package/dist/chat/browser.js +6 -6
  21. package/dist/chat/pure.d.ts +5 -5
  22. package/dist/chat/pure.js +8 -8
  23. package/dist/chat.d.ts +5 -5
  24. package/dist/chat.js +55 -55
  25. package/dist/chat.js.map +1 -1
  26. package/dist/{cli-shared-CabruH8Z.js → cli-shared-DeRHgYvl.js} +4 -4
  27. package/dist/{cli-shared-CabruH8Z.js.map → cli-shared-DeRHgYvl.js.map} +1 -1
  28. package/dist/cli-style-DBEm6CyT.js +105 -0
  29. package/dist/cli-style-DBEm6CyT.js.map +1 -0
  30. package/dist/{client-core-CIixwznM.d.ts → client-core-C_4m_oL6.d.ts} +4 -4
  31. package/dist/{client-core-CIixwznM.d.ts.map → client-core-C_4m_oL6.d.ts.map} +1 -1
  32. package/dist/{client-CCaIXWue.d.ts → client-ygTASGis.d.ts} +2 -2
  33. package/dist/{client-CCaIXWue.d.ts.map → client-ygTASGis.d.ts.map} +1 -1
  34. package/dist/codemode-worker.js +8 -5
  35. package/dist/codemode-worker.js.map +1 -1
  36. package/dist/codemode.d.ts +16 -0
  37. package/dist/codemode.d.ts.map +1 -1
  38. package/dist/codemode.js +2 -2
  39. package/dist/{connection-loop-QmWL-fJf.d.ts → connection-loop-D_pRONCr.d.ts} +4 -4
  40. package/dist/{connection-loop-QmWL-fJf.d.ts.map → connection-loop-D_pRONCr.d.ts.map} +1 -1
  41. package/dist/contexts/daytona.d.ts +3 -3
  42. package/dist/contexts/docker.d.ts +1 -1
  43. package/dist/contexts/e2b.d.ts +2 -2
  44. package/dist/contexts/sandbox.d.ts +1 -1
  45. package/dist/{contexts-C72b0mMa.js → contexts-DLZTSRHU.js} +17 -106
  46. package/dist/contexts-DLZTSRHU.js.map +1 -0
  47. package/dist/contexts.d.ts +4 -4
  48. package/dist/contexts.js +2 -2
  49. package/dist/{credentials-wwETW8rI.js → credentials-Bqg-qNBM.js} +2 -2
  50. package/dist/{credentials-wwETW8rI.js.map → credentials-Bqg-qNBM.js.map} +1 -1
  51. package/dist/{cwd-picker-CcekODCt.js → cwd-picker-BsHA6HKv.js} +4 -4
  52. package/dist/{cwd-picker-CcekODCt.js.map → cwd-picker-BsHA6HKv.js.map} +1 -1
  53. package/dist/daemon-cli.js +4 -3
  54. package/dist/daemon-cli.js.map +1 -1
  55. package/dist/{decisions-CXmK0nz9.js → decisions-hsw5XS2g.js} +3 -1
  56. package/dist/decisions-hsw5XS2g.js.map +1 -0
  57. package/dist/{discovery-DycXFxdA.js → discovery-CX7nbMCn.js} +4 -4
  58. package/dist/{discovery-DycXFxdA.js.map → discovery-CX7nbMCn.js.map} +1 -1
  59. package/dist/durable/sqlite.d.ts +2 -2
  60. package/dist/durable.d.ts +1 -1
  61. package/dist/{engine-VQ86XGdG.js → engine-CxBGgU94.js} +6 -6
  62. package/dist/{engine-VQ86XGdG.js.map → engine-CxBGgU94.js.map} +1 -1
  63. package/dist/{eval-Bod0I1W_.js → eval-CfGUDAkN.js} +3 -3
  64. package/dist/{eval-Bod0I1W_.js.map → eval-CfGUDAkN.js.map} +1 -1
  65. package/dist/eval.d.ts +1 -1
  66. package/dist/eval.js +1 -1
  67. package/dist/{executor-C7RQrkEq.js → executor-j_LFRBwS.js} +4 -4
  68. package/dist/{executor-C7RQrkEq.js.map → executor-j_LFRBwS.js.map} +1 -1
  69. package/dist/{extension-mark-BqKdEZwF.js → extension-mark-_rhkDWL5.js} +9 -6
  70. package/dist/extension-mark-_rhkDWL5.js.map +1 -0
  71. package/dist/extensions/testing.d.ts +1 -1
  72. package/dist/extensions/testing.js +2 -2
  73. package/dist/{extensions-BCx4QuGB.js → extensions-ADlhBQ_1.js} +8 -8
  74. package/dist/{extensions-BCx4QuGB.js.map → extensions-ADlhBQ_1.js.map} +1 -1
  75. package/dist/{extensions-client-D8tEAcMw.d.ts → extensions-client-D4Q2XRKV.d.ts} +31 -5
  76. package/dist/extensions-client-D4Q2XRKV.d.ts.map +1 -0
  77. package/dist/extensions.d.ts +1 -1
  78. package/dist/extensions.js +6 -6
  79. package/dist/{fold-rules-DvLK8pbf.d.ts → fold-rules-1DpDwG9h.d.ts} +2 -2
  80. package/dist/{fold-rules-DvLK8pbf.d.ts.map → fold-rules-1DpDwG9h.d.ts.map} +1 -1
  81. package/dist/{google-Crva32sk.js → google-B-Dhmzzf.js} +2 -2
  82. package/dist/{google-Crva32sk.js.map → google-B-Dhmzzf.js.map} +1 -1
  83. package/dist/{headless-CCm-jLLT.js → headless-CQm19BL0.js} +4 -4
  84. package/dist/{headless-CCm-jLLT.js.map → headless-CQm19BL0.js.map} +1 -1
  85. package/dist/headless.d.ts +1 -1
  86. package/dist/headless.js +1 -1
  87. package/dist/history-worker.js +1 -1
  88. package/dist/{host-wO_6GW0y.js → host-C61ntFBC.js} +276 -103
  89. package/dist/host-C61ntFBC.js.map +1 -0
  90. package/dist/{host-BHMs9jsN.js → host-DEoEzQal.js} +13 -4
  91. package/dist/host-DEoEzQal.js.map +1 -0
  92. package/dist/{host-scoped-settings-CrbcqOkP.js → host-scoped-settings-WBYaCork.js} +2 -2
  93. package/dist/{host-scoped-settings-CrbcqOkP.js.map → host-scoped-settings-WBYaCork.js.map} +1 -1
  94. package/dist/{host-signals-Jsjd_-4g.js → host-signals-Cb2TlGtN.js} +5 -5
  95. package/dist/{host-signals-Jsjd_-4g.js.map → host-signals-Cb2TlGtN.js.map} +1 -1
  96. package/dist/{host-version-CNAr9pov.js → host-version-BIx4CuBM.js} +2 -2
  97. package/dist/{host-version-CNAr9pov.js.map → host-version-BIx4CuBM.js.map} +1 -1
  98. package/dist/{index-C6nnKu32.d.ts → index-B0PLo9jn.d.ts} +4 -4
  99. package/dist/{index-C6nnKu32.d.ts.map → index-B0PLo9jn.d.ts.map} +1 -1
  100. package/dist/{index-Djnc8Peh.d.ts → index-De4x-s76.d.ts} +14 -14
  101. package/dist/{index-Djnc8Peh.d.ts.map → index-De4x-s76.d.ts.map} +1 -1
  102. package/dist/{index-CGbOWa7y.d.ts → index-WlE93Q6d.d.ts} +411 -3
  103. package/dist/index-WlE93Q6d.d.ts.map +1 -0
  104. package/dist/{index-CCf_WeTQ.d.ts → index-f-XWIoYo.d.ts} +2 -2
  105. package/dist/{index-CCf_WeTQ.d.ts.map → index-f-XWIoYo.d.ts.map} +1 -1
  106. package/dist/index.d.ts +5 -5
  107. package/dist/index.js +17 -17
  108. package/dist/ipc/browser-types.d.ts +304 -7
  109. package/dist/ipc/browser-types.d.ts.map +1 -1
  110. package/dist/ipc/browser.d.ts +4 -4
  111. package/dist/ipc/browser.js +2 -2
  112. package/dist/ipc/remote.d.ts +6 -6
  113. package/dist/ipc/remote.js +3 -3
  114. package/dist/{ipc-BzWhIybr.js → ipc-DiH_P-wr.js} +4 -4
  115. package/dist/{ipc-BzWhIybr.js.map → ipc-DiH_P-wr.js.map} +1 -1
  116. package/dist/ipc.d.ts +10 -10
  117. package/dist/ipc.js +8 -8
  118. package/dist/{json-Dj-YATkZ.js → json-BjClr43H.js} +2 -20
  119. package/dist/json-BjClr43H.js.map +1 -0
  120. package/dist/{links-CJG_rFvf.js → links-BbC_lOnn.js} +9 -9
  121. package/dist/{links-CJG_rFvf.js.map → links-BbC_lOnn.js.map} +1 -1
  122. package/dist/{loaded-entry-DTURJo_R.js → loaded-entry-C0vkCVNQ.js} +2 -2
  123. package/dist/{loaded-entry-DTURJo_R.js.map → loaded-entry-C0vkCVNQ.js.map} +1 -1
  124. package/dist/mcp.d.ts +1 -1
  125. package/dist/{media-type-BtA0cbfI.d.ts → media-type-ZSmAGHvg.d.ts} +188 -7
  126. package/dist/media-type-ZSmAGHvg.d.ts.map +1 -0
  127. package/dist/{memory-DuVGrzbl.js → memory-C3w8nO8f.js} +132 -31
  128. package/dist/memory-C3w8nO8f.js.map +1 -0
  129. package/dist/model-test-CAtJ76kM.js.map +1 -1
  130. package/dist/{move-session-kylExJ5H.js → move-session-D7ILECs-.js} +4 -4
  131. package/dist/{move-session-kylExJ5H.js.map → move-session-D7ILECs-.js.map} +1 -1
  132. package/dist/{nested-call-record-DlzPeTB7.js → nested-call-record-OayszZBQ.js} +4 -3
  133. package/dist/nested-call-record-OayszZBQ.js.map +1 -0
  134. package/dist/output/stream-json.d.ts +1 -1
  135. package/dist/output/terminal.d.ts +1 -1
  136. package/dist/{path-display-COVV71Yu.js → path-display-DRAEpKOU.js} +3 -3
  137. package/dist/{path-display-COVV71Yu.js.map → path-display-DRAEpKOU.js.map} +1 -1
  138. package/dist/plugins.d.ts +1 -1
  139. package/dist/{prelude-CVKoUzV8.js → prelude-BwiSR1uA.js} +16 -5
  140. package/dist/prelude-BwiSR1uA.js.map +1 -0
  141. package/dist/{presets-CBt6rFfS.js → presets-CMY43nUP.js} +3 -3
  142. package/dist/{presets-CBt6rFfS.js.map → presets-CMY43nUP.js.map} +1 -1
  143. package/dist/presets.d.ts +1 -1
  144. package/dist/presets.js +1 -1
  145. package/dist/{protocol-CEVqBO-q.d.ts → protocol-C2lqKuMd.d.ts} +50 -7
  146. package/dist/protocol-C2lqKuMd.d.ts.map +1 -0
  147. package/dist/protocol-DOGyHgLQ.js.map +1 -1
  148. package/dist/protocol-NSllElLw.js.map +1 -1
  149. package/dist/providers/anthropic.d.ts +1 -1
  150. package/dist/providers/arcee.d.ts +1 -1
  151. package/dist/providers/baseten.d.ts +1 -1
  152. package/dist/providers/cerebras.d.ts +1 -1
  153. package/dist/providers/google.d.ts +1 -1
  154. package/dist/providers/google.js +1 -1
  155. package/dist/providers/local.d.ts +1 -1
  156. package/dist/providers/neuralwatt.d.ts +1 -1
  157. package/dist/providers/openai-compat.d.ts +1 -1
  158. package/dist/providers/openai.d.ts +1 -1
  159. package/dist/providers/openrouter.d.ts +1 -1
  160. package/dist/providers/xai.d.ts +1 -1
  161. package/dist/{providers-Z0TaBp1O.js → providers-CpXV_uLE.js} +5 -5
  162. package/dist/providers-CpXV_uLE.js.map +1 -0
  163. package/dist/providers.d.ts +1 -1
  164. package/dist/providers.js +1 -1
  165. package/dist/{readonly-db-D7Z-k0pQ.js → readonly-db-DrbT8tX6.js} +2 -2
  166. package/dist/{readonly-db-D7Z-k0pQ.js.map → readonly-db-DrbT8tX6.js.map} +1 -1
  167. package/dist/{registry-BKjeBnoy.js → registry-CJHvmvaP.js} +2 -2
  168. package/dist/{registry-BKjeBnoy.js.map → registry-CJHvmvaP.js.map} +1 -1
  169. package/dist/{registry-B6Ww76iW.js → registry-CN6JlZKj.js} +2 -2
  170. package/dist/{registry-B6Ww76iW.js.map → registry-CN6JlZKj.js.map} +1 -1
  171. package/dist/{registry-B9INJwJR.js → registry-CnnKaY9s.js} +324 -39
  172. package/dist/registry-CnnKaY9s.js.map +1 -0
  173. package/dist/{remote-hosts-BMWoHCWO.js → remote-hosts-DoO9CJUQ.js} +4 -4
  174. package/dist/{remote-hosts-BMWoHCWO.js.map → remote-hosts-DoO9CJUQ.js.map} +1 -1
  175. package/dist/{repo-url-D4Dr8NfZ.js → repo-url-DLjjuVk_.js} +169 -2
  176. package/dist/repo-url-DLjjuVk_.js.map +1 -0
  177. package/dist/restate.d.ts +2 -2
  178. package/dist/{sandbox-BwiPGKF7.d.ts → sandbox-B4OW6oNx.d.ts} +2 -2
  179. package/dist/{sandbox-BwiPGKF7.d.ts.map → sandbox-B4OW6oNx.d.ts.map} +1 -1
  180. package/dist/script-progress-CrZ507Qq.js +900 -0
  181. package/dist/script-progress-CrZ507Qq.js.map +1 -0
  182. package/dist/session/sqlite.d.ts +1 -1
  183. package/dist/session.d.ts +1 -1
  184. package/dist/{setting-BQBSyUq0.js → setting-D_FpKFMw.js} +6 -6
  185. package/dist/{setting-BQBSyUq0.js.map → setting-D_FpKFMw.js.map} +1 -1
  186. package/dist/{settings-catalog-4IU2i_jG.js → settings-catalog-DEZlXP51.js} +14 -2
  187. package/dist/settings-catalog-DEZlXP51.js.map +1 -0
  188. package/dist/{settings-keys-iI_Y-7MC.js → settings-keys-CW2UgHgb.js} +3 -3
  189. package/dist/{settings-keys-iI_Y-7MC.js.map → settings-keys-CW2UgHgb.js.map} +1 -1
  190. package/dist/{skills-CFXRItJ6.js → skills-CEbosUlM.js} +2 -2
  191. package/dist/{skills-CFXRItJ6.js.map → skills-CEbosUlM.js.map} +1 -1
  192. package/dist/skills.d.ts +1 -1
  193. package/dist/skills.js +1 -1
  194. package/dist/{source-Bl1Z501r.js → source-3ZnEPOSa.js} +3 -2
  195. package/dist/source-3ZnEPOSa.js.map +1 -0
  196. package/dist/{sqlite-runtime-BZ2L4RaG.d.ts → sqlite-runtime-CS_LBaAN.d.ts} +2 -2
  197. package/dist/sqlite-runtime-CS_LBaAN.d.ts.map +1 -0
  198. package/dist/{src-BY_ND2xn.js → src-BmTXDta8.js} +2 -2
  199. package/dist/{src-BY_ND2xn.js.map → src-BmTXDta8.js.map} +1 -1
  200. package/dist/{store-C6gI7FfZ.js → store-ByCDaKgJ.js} +14 -3
  201. package/dist/store-ByCDaKgJ.js.map +1 -0
  202. package/dist/{system-freeze-m5o1sGIM.js → system-freeze-XgDPIwQS.js} +3 -3
  203. package/dist/{system-freeze-m5o1sGIM.js.map → system-freeze-XgDPIwQS.js.map} +1 -1
  204. package/dist/{todo-edits-CbukbjyV.js → todo-edits-Dyj32ds6.js} +4 -3
  205. package/dist/todo-edits-Dyj32ds6.js.map +1 -0
  206. package/dist/tools/fetch-url.d.ts +1 -1
  207. package/dist/tools/web-search.d.ts +1 -1
  208. package/dist/{tools-CVTGhggj.js → tools-BsrGQ8K4.js} +2 -2
  209. package/dist/{tools-CVTGhggj.js.map → tools-BsrGQ8K4.js.map} +1 -1
  210. package/dist/tools.d.ts +1 -1
  211. package/dist/tools.js +3 -3
  212. package/dist/{transcript-anchors-CiSi_UBn.js → transcript-anchors-DMjvyUjk.js} +3 -3
  213. package/dist/{transcript-anchors-CiSi_UBn.js.map → transcript-anchors-DMjvyUjk.js.map} +1 -1
  214. package/dist/{transcript-reconcile-jbSBjLq2.js → transcript-reconcile-DpQO85wl.js} +3 -3
  215. package/dist/{transcript-reconcile-jbSBjLq2.js.map → transcript-reconcile-DpQO85wl.js.map} +1 -1
  216. package/dist/tui.d.ts +9 -9
  217. package/dist/tui.d.ts.map +1 -1
  218. package/dist/tui.js +289 -38
  219. package/dist/tui.js.map +1 -1
  220. package/dist/{types-bDQagoiL.d.ts → types-2HrgolQz.d.ts} +20 -8
  221. package/dist/types-2HrgolQz.d.ts.map +1 -0
  222. package/dist/types-4q1bFG53.js +122 -0
  223. package/dist/types-4q1bFG53.js.map +1 -0
  224. package/dist/{types-DnRd9_cA.d.ts → types-SXqk6hLD.d.ts} +3 -3
  225. package/dist/{types-DnRd9_cA.d.ts.map → types-SXqk6hLD.d.ts.map} +1 -1
  226. package/dist/types-myxheQkw.js.map +1 -1
  227. package/dist/types.d.ts +3 -3
  228. package/dist/{usage-summary-BfcXjiSM.js → usage-summary-BM7B3JdI.js} +2 -2
  229. package/dist/{usage-summary-BfcXjiSM.js.map → usage-summary-BM7B3JdI.js.map} +1 -1
  230. package/dist/{version-DqqqvHDP.js → version-szdW1Od9.js} +2 -2
  231. package/dist/{version-DqqqvHDP.js.map → version-szdW1Od9.js.map} +1 -1
  232. package/dist/{wait-task-BX4NcOOm.js → wait-task-BiI5UaZQ.js} +13 -3
  233. package/dist/wait-task-BiI5UaZQ.js.map +1 -0
  234. package/dist/{wire-CLm2rMK0.js → wire-C3l9jl9x.js} +2 -2
  235. package/dist/{wire-CLm2rMK0.js.map → wire-C3l9jl9x.js.map} +1 -1
  236. package/dist/{write-file-0E6TUJ9A.js → write-file-Dquu7MzB.js} +5 -3
  237. package/dist/write-file-Dquu7MzB.js.map +1 -0
  238. package/dist/{ws-DfGGYQ4W.js → ws-CEHi0CiB.js} +4 -4
  239. package/dist/{ws-DfGGYQ4W.js.map → ws-CEHi0CiB.js.map} +1 -1
  240. package/dist/{ws-client-CFMbhsNq.js → ws-client-t8XNWxcq.js} +2 -2
  241. package/dist/{ws-client-CFMbhsNq.js.map → ws-client-t8XNWxcq.js.map} +1 -1
  242. package/docs/CHAT.md +55 -0
  243. package/docs/CODEMODE.md +37 -0
  244. package/docs/EXTENSIONS.md +8 -6
  245. package/docs/RELEASE-NOTES-NEXT.md +48 -1
  246. package/docs/RELEASE.md +9 -1
  247. package/package.json +2 -3
  248. package/dist/agent-DJhpTS-B.js.map +0 -1
  249. package/dist/auto-update-restart-BFB7Ek87.js.map +0 -1
  250. package/dist/browser-BcoCCB_n.js.map +0 -1
  251. package/dist/contexts-C72b0mMa.js.map +0 -1
  252. package/dist/decisions-CXmK0nz9.js.map +0 -1
  253. package/dist/extension-mark-BqKdEZwF.js.map +0 -1
  254. package/dist/extensions-client-D8tEAcMw.d.ts.map +0 -1
  255. package/dist/host-BHMs9jsN.js.map +0 -1
  256. package/dist/host-wO_6GW0y.js.map +0 -1
  257. package/dist/index-CGbOWa7y.d.ts.map +0 -1
  258. package/dist/json-Dj-YATkZ.js.map +0 -1
  259. package/dist/media-type-BtA0cbfI.d.ts.map +0 -1
  260. package/dist/memory-DuVGrzbl.js.map +0 -1
  261. package/dist/nested-call-events-BYk8XvGX.js +0 -182
  262. package/dist/nested-call-events-BYk8XvGX.js.map +0 -1
  263. package/dist/nested-call-record-DlzPeTB7.js.map +0 -1
  264. package/dist/prelude-CVKoUzV8.js.map +0 -1
  265. package/dist/protocol-CEVqBO-q.d.ts.map +0 -1
  266. package/dist/providers-Z0TaBp1O.js.map +0 -1
  267. package/dist/registry-B9INJwJR.js.map +0 -1
  268. package/dist/repo-url-D4Dr8NfZ.js.map +0 -1
  269. package/dist/settings-catalog-4IU2i_jG.js.map +0 -1
  270. package/dist/source-Bl1Z501r.js.map +0 -1
  271. package/dist/sqlite-runtime-BZ2L4RaG.d.ts.map +0 -1
  272. package/dist/store-C6gI7FfZ.js.map +0 -1
  273. package/dist/todo-edits-CbukbjyV.js.map +0 -1
  274. package/dist/types-DTMEhKJO.js +0 -14
  275. package/dist/types-DTMEhKJO.js.map +0 -1
  276. package/dist/types-bDQagoiL.d.ts.map +0 -1
  277. package/dist/wait-task-BX4NcOOm.js.map +0 -1
  278. package/dist/write-file-0E6TUJ9A.js.map +0 -1
  279. package/scripts/eval.ts +0 -179
@@ -1 +1 @@
1
- {"version":3,"file":"headless-CCm-jLLT.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 `../chat/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\n/** Context for resolving Claude `model:` aliases in agent files. */\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/**\n * Markdown slash commands, first-wins by name in root order. Never throws.\n * @param opts - Search roots, project and foreign-config switches, and an optional skill-name check.\n */\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. User-scope files override\n * builtins (project files are refused with a diagnostic); among files, first-wins by name in root order. Never throws.\n * @param opts - Search roots and switches, plus the model context used to resolve `model:` aliases.\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 * @param preset - Preset whose `spawn` tool receives the agents. Returned unchanged when it has no spawn tool or `subagents` is empty.\n * @param subagents - Agent registry to merge, typically from {@link loadMarkdownAgents}.\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 { AgentOptions } from './agent'\nimport type { ExecutionContext } from './contexts'\nimport type { DurableOptions, DurableRuntime } from './durable/types'\nimport type { ExtensionRegistry } from './extensions'\nimport type { HeadlessErrorInfo, HeadlessEvent, HeadlessResult, HeadlessStatus } from './headless-format'\nimport type { Preset } from './presets'\nimport type { Provider } from './providers'\nimport type { Session, SessionStore } from './session'\nimport type { ToolDef } from './tools'\nimport type { SubagentRegistry } from './tools/spawn'\nimport type {\n AgentStats,\n McpServerConfig,\n PromptPart,\n SessionTurn,\n ThinkingLevel,\n TurnFinishReason,\n} from './types'\nimport { createAgent } from './agent'\nimport { installCacheBreakLogger } from './cache-telemetry'\nimport { createProcessContext } from './contexts'\nimport { installHeadlessEventAdapter, textOf } from './headless-format'\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 } from './session'\n\n// The contract (shapes, formatting, events) lives in `headless-format.ts` so\n// serializers can import it without the runner.\nexport type { FormattedHeadlessResult, FormattedHeadlessTurnEvent, HeadlessErrorInfo, HeadlessEvent, HeadlessOutputFormat, HeadlessResult, HeadlessStatus, HeadlessUsage, OpenAIChatContentPart, OpenAIChatMessage, ProviderTranscriptFormat } from './headless-format'\nexport { exitCodeForHeadlessResult, formatHeadlessResult, formatHeadlessTurnEvent, formattedHeadlessTurnEventToJsonl, headlessEventToJsonl, installHeadlessEventAdapter, providerTranscriptFormatForProvider, transcriptToOpenAIMessages, transcriptToProviderMessages } from './headless-format'\n\n/** Options for {@link runHeadless}. */\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 id. Defaults to the provider's default model. */\n model?: string\n /** Override the preset system prompt for this run. */\n system?: string\n /** Thinking effort for the run. Defaults to `'off'`. */\n thinking?: ThinkingLevel\n /** Maximum number of loop turns. Sets `behavior.maxTurns`. */\n maxTurns?: number\n /** Maximum output tokens per turn. Sets `behavior.maxTokens`. */\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 /** MCP servers to connect and expose as tools. */\n mcpServers?: McpServerConfig[]\n /** Skills configuration. */\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 /** Durable runtime the session is stored on (`createAgent({ durable })`), or it with `onInterrupted`: runs keep checkpoints. */\n durable?: DurableRuntime | DurableOptions\n /** Continue this checkpoint run of `session` (`agent.resume`) before running `prompt`. Needs `durable`. */\n resumeRunId?: string\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 *\n * @param opts - Prompt, provider and run limits. `prompt` and `provider` are required.\n * @returns The run result. Errors from the agent loop, aborts and timeouts are reported in `status` and `error` instead of being thrown.\n *\n * @example\n * ~~~ts\n * import { exitCodeForHeadlessResult, runHeadless } from 'zidane/headless'\n * import { anthropic } from 'zidane/providers/anthropic'\n *\n * const result = await runHeadless({\n * prompt: 'List the TypeScript files in this directory.',\n * provider: anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }),\n * cwd: process.cwd(),\n * maxTurns: 10,\n * timeoutMs: 120_000,\n * })\n *\n * console.log(result.status, result.finalText)\n * process.exitCode = exitCodeForHeadlessResult(result)\n * ~~~\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.durable !== undefined ? { durable: opts.durable } : {}),\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 // Debug output goes to stderr so stdout stays the result (text, JSON or JSONL).\n const debug = process.env.ZIDANE_DEBUG\n const uninstallCacheLog = debug\n ? installCacheBreakLogger(agent.hooks, { log: line => process.stderr.write(`${line}\\n`), verbose: debug.includes('cache') })\n : 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 if (opts.resumeRunId !== undefined)\n await agent.resume({ runId: opts.resumeRunId, signal: controller.signal })\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 uninstallCacheLog()\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\nfunction noop(): void {}\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"],"mappings":"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"}
1
+ {"version":3,"file":"headless-CQm19BL0.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 `../chat/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\n/** Context for resolving Claude `model:` aliases in agent files. */\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/**\n * Markdown slash commands, first-wins by name in root order. Never throws.\n * @param opts - Search roots, project and foreign-config switches, and an optional skill-name check.\n */\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. User-scope files override\n * builtins (project files are refused with a diagnostic); among files, first-wins by name in root order. Never throws.\n * @param opts - Search roots and switches, plus the model context used to resolve `model:` aliases.\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 * @param preset - Preset whose `spawn` tool receives the agents. Returned unchanged when it has no spawn tool or `subagents` is empty.\n * @param subagents - Agent registry to merge, typically from {@link loadMarkdownAgents}.\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 { AgentOptions } from './agent'\nimport type { ExecutionContext } from './contexts'\nimport type { DurableOptions, DurableRuntime } from './durable/types'\nimport type { ExtensionRegistry } from './extensions'\nimport type { HeadlessErrorInfo, HeadlessEvent, HeadlessResult, HeadlessStatus } from './headless-format'\nimport type { Preset } from './presets'\nimport type { Provider } from './providers'\nimport type { Session, SessionStore } from './session'\nimport type { ToolDef } from './tools'\nimport type { SubagentRegistry } from './tools/spawn'\nimport type {\n AgentStats,\n McpServerConfig,\n PromptPart,\n SessionTurn,\n ThinkingLevel,\n TurnFinishReason,\n} from './types'\nimport { createAgent } from './agent'\nimport { installCacheBreakLogger } from './cache-telemetry'\nimport { createProcessContext } from './contexts'\nimport { installHeadlessEventAdapter, textOf } from './headless-format'\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 } from './session'\n\n// The contract (shapes, formatting, events) lives in `headless-format.ts` so\n// serializers can import it without the runner.\nexport type { FormattedHeadlessResult, FormattedHeadlessTurnEvent, HeadlessErrorInfo, HeadlessEvent, HeadlessOutputFormat, HeadlessResult, HeadlessStatus, HeadlessUsage, OpenAIChatContentPart, OpenAIChatMessage, ProviderTranscriptFormat } from './headless-format'\nexport { exitCodeForHeadlessResult, formatHeadlessResult, formatHeadlessTurnEvent, formattedHeadlessTurnEventToJsonl, headlessEventToJsonl, installHeadlessEventAdapter, providerTranscriptFormatForProvider, transcriptToOpenAIMessages, transcriptToProviderMessages } from './headless-format'\n\n/** Options for {@link runHeadless}. */\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 id. Defaults to the provider's default model. */\n model?: string\n /** Override the preset system prompt for this run. */\n system?: string\n /** Thinking effort for the run. Defaults to `'off'`. */\n thinking?: ThinkingLevel\n /** Maximum number of loop turns. Sets `behavior.maxTurns`. */\n maxTurns?: number\n /** Maximum output tokens per turn. Sets `behavior.maxTokens`. */\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 /** MCP servers to connect and expose as tools. */\n mcpServers?: McpServerConfig[]\n /** Skills configuration. */\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 /** Durable runtime the session is stored on (`createAgent({ durable })`), or it with `onInterrupted`: runs keep checkpoints. */\n durable?: DurableRuntime | DurableOptions\n /** Continue this checkpoint run of `session` (`agent.resume`) before running `prompt`. Needs `durable`. */\n resumeRunId?: string\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 *\n * @param opts - Prompt, provider and run limits. `prompt` and `provider` are required.\n * @returns The run result. Errors from the agent loop, aborts and timeouts are reported in `status` and `error` instead of being thrown.\n *\n * @example\n * ~~~ts\n * import { exitCodeForHeadlessResult, runHeadless } from 'zidane/headless'\n * import { anthropic } from 'zidane/providers/anthropic'\n *\n * const result = await runHeadless({\n * prompt: 'List the TypeScript files in this directory.',\n * provider: anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }),\n * cwd: process.cwd(),\n * maxTurns: 10,\n * timeoutMs: 120_000,\n * })\n *\n * console.log(result.status, result.finalText)\n * process.exitCode = exitCodeForHeadlessResult(result)\n * ~~~\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.durable !== undefined ? { durable: opts.durable } : {}),\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 // Debug output goes to stderr so stdout stays the result (text, JSON or JSONL).\n const debug = process.env.ZIDANE_DEBUG\n const uninstallCacheLog = debug\n ? installCacheBreakLogger(agent.hooks, { log: line => process.stderr.write(`${line}\\n`), verbose: debug.includes('cache') })\n : 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 if (opts.resumeRunId !== undefined)\n await agent.resume({ runId: opts.resumeRunId, signal: controller.signal })\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 uninstallCacheLog()\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\nfunction noop(): void {}\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"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { Ca as transcriptToProviderMessages, Ei as runHeadless, Sa as transcriptToOpenAIMessages, Ti as HeadlessOptions, _a as formatHeadlessTurnEvent, aa as FormattedHeadlessTurnEvent, ba as installHeadlessEventAdapter, ca as HeadlessOutputFormat, da as HeadlessUsage, fa as OpenAIChatContentPart, ga as formatHeadlessResult, ha as exitCodeForHeadlessResult, ia as FormattedHeadlessResult, la as HeadlessResult, ma as ProviderTranscriptFormat, oa as HeadlessErrorInfo, pa as OpenAIChatMessage, sa as HeadlessEvent, ua as HeadlessStatus, va as formattedHeadlessTurnEventToJsonl, xa as providerTranscriptFormatForProvider, ya as headlessEventToJsonl } from "./index-CGbOWa7y.js";
1
+ import { Ca as transcriptToProviderMessages, Ei as runHeadless, Sa as transcriptToOpenAIMessages, Ti as HeadlessOptions, _a as formatHeadlessTurnEvent, aa as FormattedHeadlessTurnEvent, ba as installHeadlessEventAdapter, ca as HeadlessOutputFormat, da as HeadlessUsage, fa as OpenAIChatContentPart, ga as formatHeadlessResult, ha as exitCodeForHeadlessResult, ia as FormattedHeadlessResult, la as HeadlessResult, ma as ProviderTranscriptFormat, oa as HeadlessErrorInfo, pa as OpenAIChatMessage, sa as HeadlessEvent, ua as HeadlessStatus, va as formattedHeadlessTurnEventToJsonl, xa as providerTranscriptFormatForProvider, ya as headlessEventToJsonl } from "./index-WlE93Q6d.js";
2
2
  export { type FormattedHeadlessResult, type FormattedHeadlessTurnEvent, type HeadlessErrorInfo, type HeadlessEvent, HeadlessOptions, type HeadlessOutputFormat, type HeadlessResult, type HeadlessStatus, type HeadlessUsage, type OpenAIChatContentPart, type OpenAIChatMessage, type ProviderTranscriptFormat, exitCodeForHeadlessResult, formatHeadlessResult, formatHeadlessTurnEvent, formattedHeadlessTurnEventToJsonl, headlessEventToJsonl, installHeadlessEventAdapter, providerTranscriptFormatForProvider, runHeadless, transcriptToOpenAIMessages, transcriptToProviderMessages };
package/dist/headless.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import { a as headlessEventToJsonl, i as formattedHeadlessTurnEventToJsonl, l as transcriptToOpenAIMessages, n as formatHeadlessResult, o as installHeadlessEventAdapter, r as formatHeadlessTurnEvent, s as providerTranscriptFormatForProvider, t as exitCodeForHeadlessResult, u as transcriptToProviderMessages } from "./headless-format-ZSD-wqQB.js";
2
- import { t as runHeadless } from "./headless-CCm-jLLT.js";
2
+ import { t as runHeadless } from "./headless-CQm19BL0.js";
3
3
  export { exitCodeForHeadlessResult, formatHeadlessResult, formatHeadlessTurnEvent, formattedHeadlessTurnEventToJsonl, headlessEventToJsonl, installHeadlessEventAdapter, providerTranscriptFormatForProvider, runHeadless, transcriptToOpenAIMessages, transcriptToProviderMessages };
@@ -1,5 +1,5 @@
1
1
  import { a as createReadonlySqliteSessionStore, t as runUsageAggregates } from "./sqlite-usage-BkM2Yp_t.js";
2
- import { r as createTranscriptReplayCache, t as openReadonlySqlite } from "./readonly-db-D7Z-k0pQ.js";
2
+ import { r as createTranscriptReplayCache, t as openReadonlySqlite } from "./readonly-db-DrbT8tX6.js";
3
3
  import { i as serveWorkerRpc, t as createTranscriptReader } from "./transcript-reader-DGrC9E6f.js";
4
4
  //#region src/ipc/history/worker.ts
5
5
  let db = null;