zidane 9.1.1 → 9.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dist/{acp-Di9WvMDF.js → acp-Cl4gCZN6.js} +7 -7
  2. package/dist/{acp-Di9WvMDF.js.map → acp-Cl4gCZN6.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-DBl2JUC6.js} +2 -2
  11. package/dist/{auth-store-port-DFgf22oo.js.map → auth-store-port-DBl2JUC6.js.map} +1 -1
  12. package/dist/{auto-update-restart-BFB7Ek87.js → auto-update-restart-CF_kjcJd.js} +277 -41
  13. package/dist/auto-update-restart-CF_kjcJd.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-DIV9c5Nr.js} +4 -4
  27. package/dist/{cli-shared-CabruH8Z.js.map → cli-shared-DIV9c5Nr.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-D71duF64.js} +2 -2
  50. package/dist/{credentials-wwETW8rI.js.map → credentials-D71duF64.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-DD4wPWKS.js} +4 -4
  58. package/dist/{discovery-DycXFxdA.js.map → discovery-DD4wPWKS.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-BDmtgr2O.js} +6 -6
  62. package/dist/{engine-VQ86XGdG.js.map → engine-BDmtgr2O.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-EWOhLyd9.js} +4 -4
  68. package/dist/{executor-C7RQrkEq.js.map → executor-EWOhLyd9.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-DklXPjiq.js} +8 -8
  74. package/dist/{extensions-BCx4QuGB.js.map → extensions-DklXPjiq.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-BtMW9KzL.js} +2 -2
  82. package/dist/{google-Crva32sk.js.map → google-BtMW9KzL.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-BHMs9jsN.js → host-DEoEzQal.js} +13 -4
  89. package/dist/host-DEoEzQal.js.map +1 -0
  90. package/dist/{host-scoped-settings-CrbcqOkP.js → host-scoped-settings-WBYaCork.js} +2 -2
  91. package/dist/{host-scoped-settings-CrbcqOkP.js.map → host-scoped-settings-WBYaCork.js.map} +1 -1
  92. package/dist/{host-signals-Jsjd_-4g.js → host-signals-91zyko_i.js} +5 -5
  93. package/dist/{host-signals-Jsjd_-4g.js.map → host-signals-91zyko_i.js.map} +1 -1
  94. package/dist/{host-wO_6GW0y.js → host-uP3t08w8.js} +276 -103
  95. package/dist/host-uP3t08w8.js.map +1 -0
  96. package/dist/{host-version-CNAr9pov.js → host-version-_RHlAB29.js} +2 -2
  97. package/dist/{host-version-CNAr9pov.js.map → host-version-_RHlAB29.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-CatnsVEd.js} +4 -4
  115. package/dist/{ipc-BzWhIybr.js.map → ipc-CatnsVEd.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-a8C9eby4.js} +9 -9
  121. package/dist/{links-CJG_rFvf.js.map → links-a8C9eby4.js.map} +1 -1
  122. package/dist/{loaded-entry-DTURJo_R.js → loaded-entry-D6jzt5HQ.js} +2 -2
  123. package/dist/{loaded-entry-DTURJo_R.js.map → loaded-entry-D6jzt5HQ.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-CJy52DNi.js} +132 -31
  128. package/dist/memory-CJy52DNi.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-CAWz-sMq.js} +3 -3
  137. package/dist/{path-display-COVV71Yu.js.map → path-display-CAWz-sMq.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-zVRxiJDv.js} +5 -5
  162. package/dist/providers-zVRxiJDv.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-CBoYDIND.js} +2 -2
  168. package/dist/{registry-BKjeBnoy.js.map → registry-CBoYDIND.js.map} +1 -1
  169. package/dist/{registry-B6Ww76iW.js → registry-CQOU5jvF.js} +2 -2
  170. package/dist/{registry-B6Ww76iW.js.map → registry-CQOU5jvF.js.map} +1 -1
  171. package/dist/{registry-B9INJwJR.js → registry-YUUqbYGr.js} +324 -39
  172. package/dist/registry-YUUqbYGr.js.map +1 -0
  173. package/dist/{remote-hosts-BMWoHCWO.js → remote-hosts-CT8Q95dR.js} +4 -4
  174. package/dist/{remote-hosts-BMWoHCWO.js.map → remote-hosts-CT8Q95dR.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-_jh2OtiL.js} +6 -6
  185. package/dist/{setting-BQBSyUq0.js.map → setting-_jh2OtiL.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-BT0_oKjO.js} +3 -3
  189. package/dist/{settings-keys-iI_Y-7MC.js.map → settings-keys-BT0_oKjO.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-DxJ-lRhu.js} +3 -3
  203. package/dist/{system-freeze-m5o1sGIM.js.map → system-freeze-DxJ-lRhu.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-DwQI12WA.js} +2 -2
  231. package/dist/{version-DqqqvHDP.js.map → version-DwQI12WA.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-Dxwxb7QQ.js} +2 -2
  235. package/dist/{wire-CLm2rMK0.js.map → wire-Dxwxb7QQ.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-CA3o2nie.js} +4 -4
  239. package/dist/{ws-DfGGYQ4W.js.map → ws-CA3o2nie.js.map} +1 -1
  240. package/dist/{ws-client-CFMbhsNq.js → ws-client-C0iPAAzc.js} +2 -2
  241. package/dist/{ws-client-CFMbhsNq.js.map → ws-client-C0iPAAzc.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;
@@ -115,6 +115,7 @@ var Execution = class {
115
115
  calls = [];
116
116
  pending = /* @__PURE__ */ new Map();
117
117
  code;
118
+ onOutput;
118
119
  finished = false;
119
120
  constructor(options) {
120
121
  this.promise = new Promise((resolve) => {
@@ -124,6 +125,7 @@ var Execution = class {
124
125
  this.globals = options.globals;
125
126
  this.signal = options.signal;
126
127
  this.code = options.code;
128
+ this.onOutput = options.onOutput;
127
129
  if (Number.isFinite(options.timeoutMs)) this.timer = setTimeout(() => {
128
130
  this.finish({
129
131
  kind: "timeout",
@@ -171,7 +173,8 @@ var Execution = class {
171
173
  interrupt: this.interrupt,
172
174
  determinism: options.determinism,
173
175
  ...options.toolHints ? { toolHints: options.toolHints } : {},
174
- ...options.shortcuts ? { shortcuts: options.shortcuts } : {}
176
+ ...options.shortcuts ? { shortcuts: options.shortcuts } : {},
177
+ ...options.trackLines ? { trackLines: true } : {}
175
178
  };
176
179
  let worker;
177
180
  try {
@@ -224,6 +227,9 @@ var Execution = class {
224
227
  switch (message.type) {
225
228
  case "output":
226
229
  this.output.push(message.item);
230
+ try {
231
+ this.onOutput?.(message.item);
232
+ } catch {}
227
233
  break;
228
234
  case "calls":
229
235
  if (!Array.isArray(message.calls)) throw new BridgeError("calls is not an array");
@@ -278,7 +284,8 @@ var Execution = class {
278
284
  const args = message.args === void 0 ? void 0 : JSON.parse(message.args);
279
285
  const value = await tool.execute(args, {
280
286
  signal: pending.controller.signal,
281
- seq: id
287
+ seq: id,
288
+ ...message.line !== void 0 ? { line: message.line } : {}
282
289
  });
283
290
  reply = CodemodeValue.is(value) ? {
284
291
  type: "result",
@@ -445,7 +452,9 @@ var CodemodeSandbox = class {
445
452
  workerUrl: this.workerUrl,
446
453
  determinism: options.determinism,
447
454
  toolHints: this.toolHints,
448
- shortcuts: this.shortcuts
455
+ shortcuts: this.shortcuts,
456
+ trackLines: options.trackLines === true,
457
+ onOutput: options.onOutput
449
458
  });
450
459
  this.running.add(execution);
451
460
  return execution.promise.finally(() => this.running.delete(execution));
@@ -459,4 +468,4 @@ var CodemodeSandbox = class {
459
468
  //#endregion
460
469
  export { host_exports as n, CodemodeSandbox as t };
461
470
 
462
- //# sourceMappingURL=host-BHMs9jsN.js.map
471
+ //# sourceMappingURL=host-DEoEzQal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-DEoEzQal.js","names":[],"sources":["../src/codemode/runtime/host.ts"],"sourcesContent":["import type {\n CodemodeCall,\n CodemodeCallStatus,\n CodemodeDeterminism,\n CodemodeError,\n CodemodeExecuteOptions,\n CodemodeOutputItem,\n CodemodeResult,\n CodemodeSandboxOptions,\n CodemodeStoreWrites,\n CodemodeTool,\n} from '../types'\nimport type { CodemodeWasmModule } from '../wasm'\nimport type { CallMessage, HostToWorkerMessage, WorkerData, WorkerToHostMessage } from './protocol'\nimport { Worker } from 'node:worker_threads'\nimport { stringArgumentOf } from '../declarations'\nimport { toCodemodeIdentifier } from '../identifier'\nimport { codemodeSandboxPaths } from '../sandbox-paths'\nimport { CodemodeValue } from '../value'\nimport { loadQuickJSWasm } from '../wasm'\nimport { isWorkerToHostMessage } from './protocol'\n\nconst DEFAULT_TIMEOUT_MS = 300_000\nconst IDENTIFIER = /^[A-Z_$][\\w$]*$/i\nconst RESERVED_GLOBALS: ReadonlySet<string> = new Set([\n 'tools',\n 'ALL_TOOLS',\n 'console',\n 'text',\n 'image',\n 'exit',\n 'globalThis',\n 'store',\n 'load',\n])\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction serializeStore(store: Readonly<Record<string, unknown>> | undefined): Record<string, string> {\n const serialized: Record<string, string> = {}\n for (const [key, value] of Object.entries(store ?? {})) {\n const json = JSON.stringify(value)\n if (json !== undefined)\n serialized[key] = json\n }\n return serialized\n}\n\n/**\n * The prelude that serializes values for the host runs in the same VM as the script, so a script\n * that patches built-ins (for example `Array.prototype.toJSON`) can make it send malformed data.\n * Payloads that do not decode throw this error, and the execution fails as a sandbox error.\n */\nclass BridgeError extends Error {}\n\nfunction parseBridgeJson(json: string, what: string): unknown {\n try {\n return JSON.parse(json)\n }\n catch {\n throw new BridgeError(`${what} is not valid JSON`)\n }\n}\n\nfunction parseStoreWrites(json: string): CodemodeStoreWrites {\n const entries = parseBridgeJson(json, 'store writes')\n if (!Array.isArray(entries))\n throw new BridgeError('store writes are not an array')\n const writes: CodemodeStoreWrites = { set: {}, delete: [] }\n for (const entry of entries) {\n if (\n !Array.isArray(entry)\n || typeof entry[0] !== 'string'\n || (entry.length === 2 ? typeof entry[1] !== 'string' : entry.length !== 1)\n ) {\n throw new BridgeError('store writes contain a malformed entry')\n }\n const [key, value] = entry as [string, string?]\n if (value === undefined)\n writes.delete.push(key)\n else\n writes.set[key] = parseBridgeJson(value, `store value for ${JSON.stringify(key)}`)\n }\n return writes\n}\n\nfunction parseScriptError(json: string): CodemodeError {\n const parsed = parseBridgeJson(json, 'script error')\n if (typeof parsed !== 'object' || parsed === null)\n throw new BridgeError('script error is not an object')\n const { name, message, stack } = parsed as Record<string, unknown>\n if (\n typeof message !== 'string'\n || (name !== undefined && typeof name !== 'string')\n || (stack !== undefined && typeof stack !== 'string')\n ) {\n throw new BridgeError('script error is malformed')\n }\n return { kind: 'script', name, message, stack }\n}\n\n/** Characters the worker's wrapper puts before the script on its first line: `(async () => {`. */\nconst WRAPPER_PREFIX_LENGTH = '(async () => {'.length\n\n/**\n * The script line a `codemode.js:<line>:<col>` frame points at, with a caret\n * under the column. The wrapper shares line 1 with the script, so line\n * numbers are exact and line 1's column is shifted by the prefix.\n */\nexport function scriptErrorExcerpt(code: string, stack: string | undefined): string | undefined {\n const match = stack?.match(/codemode\\.js:(\\d+):(\\d+)/)\n if (!match)\n return undefined\n const line = Number(match[1])\n const column = Math.max(1, Number(match[2]) - (line === 1 ? WRAPPER_PREFIX_LENGTH : 0))\n const source = code.split('\\n')[line - 1]\n if (source === undefined)\n return undefined\n const gutter = `${line} | `\n // Long lines: a window around the column, so the caret stays on screen.\n const start = source.length > 160 ? Math.max(0, column - 80) : 0\n const shown = start > 0 ? `…${source.slice(start, start + 160)}` : source.slice(0, 160)\n const caretAt = column - 1 - start + (start > 0 ? 1 : 0)\n return `${gutter}${shown}\\n${' '.repeat(gutter.length + Math.max(0, caretAt))}^`\n}\n\nfunction defaultWorkerUrl(): URL {\n // A compiled executable embeds the worker elsewhere (`sandbox-paths.ts`). Source (tests,\n // `bun run`) sits next to `worker.ts`; the published dist ships it as the sibling entry\n // `codemode-worker.js`.\n const configured = codemodeSandboxPaths().workerUrl\n if (configured)\n return configured\n return new URL(import.meta.url.endsWith('.ts') ? './worker.ts' : './codemode-worker.js', import.meta.url)\n}\n\ninterface PendingCall {\n record: CodemodeCall | undefined\n startedAt: number\n controller: AbortController\n}\n\ninterface ExecutionOptions {\n code: string\n tools: ReadonlyMap<string, CodemodeTool>\n globals: ReadonlyMap<string, CodemodeTool>\n timeoutMs: number\n signal: AbortSignal | undefined\n memoryLimitBytes: number | undefined\n store: Record<string, string>\n wasm: Promise<CodemodeWasmModule>\n workerUrl: string | URL\n determinism: CodemodeDeterminism | undefined\n toolHints: Record<string, string> | undefined\n shortcuts: Record<string, string> | undefined\n trackLines: boolean\n onOutput: ((item: CodemodeOutputItem) => void) | undefined\n}\n\n/**\n * One script run in its own worker and QuickJS VM. A fresh worker per run keeps\n * termination simple: a runaway script, including one that only spins the\n * microtask queue, is killed with `terminate()` and cannot poison a later run.\n */\nclass Execution {\n readonly promise: Promise<CodemodeResult>\n private resolveResult!: (result: CodemodeResult) => void\n private worker: Worker | undefined\n private readonly interrupt = new SharedArrayBuffer(4)\n private readonly tools: ReadonlyMap<string, CodemodeTool>\n private readonly globals: ReadonlyMap<string, CodemodeTool>\n private readonly signal: AbortSignal | undefined\n private readonly timer: ReturnType<typeof setTimeout> | undefined\n private readonly output: CodemodeOutputItem[] = []\n private readonly calls: CodemodeCall[] = []\n private readonly pending = new Map<number, PendingCall>()\n private readonly code: string\n private readonly onOutput: ((item: CodemodeOutputItem) => void) | undefined\n private finished = false\n\n constructor(options: ExecutionOptions) {\n this.promise = new Promise<CodemodeResult>((resolve) => {\n this.resolveResult = resolve\n })\n this.tools = options.tools\n this.globals = options.globals\n this.signal = options.signal\n this.code = options.code\n this.onOutput = options.onOutput\n\n if (Number.isFinite(options.timeoutMs)) {\n this.timer = setTimeout(() => {\n this.finish({ kind: 'timeout', message: `Execution timed out after ${options.timeoutMs} ms` })\n }, options.timeoutMs)\n }\n\n if (options.signal) {\n if (options.signal.aborted)\n this.onAbort()\n else\n options.signal.addEventListener('abort', this.onAbort, { once: true })\n }\n\n options.wasm.then(\n wasm => this.start(options, wasm),\n (error: unknown) => {\n this.finish({ kind: 'sandbox', message: `Failed to load QuickJS: ${errorMessage(error)}` })\n },\n )\n }\n\n abort(message: string): Promise<CodemodeResult> {\n this.finish({ kind: 'aborted', message })\n return this.promise\n }\n\n private start(options: ExecutionOptions, wasm: CodemodeWasmModule): void {\n if (this.finished)\n return\n const workerData: WorkerData = {\n code: options.code,\n tools: [...options.tools.values()].map((tool) => {\n const stringArg = stringArgumentOf(tool.inputSchema)\n return {\n name: tool.name,\n jsName: toCodemodeIdentifier(tool.name),\n description: tool.description ?? '',\n ...(stringArg !== undefined ? { stringArg } : {}),\n }\n }),\n globals: [...options.globals.values()].map(global => ({\n name: global.name,\n spread: global.spread === true,\n })),\n wasm,\n memoryLimitBytes: options.memoryLimitBytes,\n store: options.store,\n interrupt: this.interrupt,\n determinism: options.determinism,\n ...(options.toolHints ? { toolHints: options.toolHints } : {}),\n ...(options.shortcuts ? { shortcuts: options.shortcuts } : {}),\n ...(options.trackLines ? { trackLines: true } : {}),\n }\n let worker: Worker\n try {\n worker = new Worker(options.workerUrl, { workerData })\n }\n catch (error) {\n this.finish({ kind: 'sandbox', message: `Failed to start worker: ${errorMessage(error)}` })\n return\n }\n this.worker = worker\n worker.on('message', (message: unknown) => {\n // An exception here would be uncaught in the host process and leave the execution unsettled.\n try {\n this.handleMessage(message)\n }\n catch (error) {\n this.finish({\n kind: 'sandbox',\n message:\n error instanceof BridgeError\n ? `Sandbox bridge broken: ${error.message}. The script may have modified built-ins such as a prototype's toJSON.`\n : `Sandbox host failed: ${errorMessage(error)}`,\n })\n }\n })\n worker.on('error', (error: unknown) => {\n this.finish({\n kind: 'sandbox',\n name: error instanceof Error ? error.name : undefined,\n message: errorMessage(error),\n })\n })\n worker.on('exit', (code) => {\n this.finish({ kind: 'sandbox', message: `Worker exited with code ${code} before the script settled` })\n })\n }\n\n private readonly onAbort = (): void => {\n const reason: unknown = this.signal?.reason\n this.finish({ kind: 'aborted', message: reason instanceof Error ? reason.message : 'Execution aborted' })\n }\n\n private post(message: HostToWorkerMessage): void {\n this.worker?.postMessage(message)\n }\n\n private handleMessage(message: unknown): void {\n if (this.finished)\n return\n if (!isWorkerToHostMessage(message))\n throw new BridgeError('unknown message from the worker')\n switch (message.type) {\n case 'output':\n this.output.push(message.item)\n try {\n this.onOutput?.(message.item)\n }\n catch {\n // A listener's failure is not the script's.\n }\n break\n case 'calls':\n if (!Array.isArray(message.calls))\n throw new BridgeError('calls is not an array')\n // Started synchronously, in issue order: a tool that groups the calls\n // of one turn (a durable host batching them) sees the whole group.\n for (const call of message.calls) {\n if (this.pending.has(call.id))\n throw new BridgeError(`duplicate call id ${call.id}`)\n void this.handleCall(call)\n }\n break\n case 'done':\n this.handleDone(message)\n break\n case 'crash':\n this.finish({ kind: 'sandbox', message: message.message })\n break\n }\n }\n\n private handleDone(message: Extract<WorkerToHostMessage, { type: 'done' }>): void {\n // Decode everything before finish(), which must not throw once it starts.\n if (!message.ok) {\n const error = parseScriptError(message.error)\n const excerpt = scriptErrorExcerpt(this.code, error.stack)\n this.finish(excerpt ? { ...error, excerpt } : error)\n return\n }\n const value = message.value === undefined ? undefined : parseBridgeJson(message.value, 'return value')\n this.finish(undefined, value, parseStoreWrites(message.writes))\n }\n\n private async handleCall(message: CallMessage): Promise<void> {\n const { id, name } = message\n const isTool = message.target === 'tool'\n const record: CodemodeCall | undefined = isTool ? { name, seq: id, status: 'cancelled', durationMs: 0 } : undefined\n if (record)\n this.calls.push(record)\n const pending: PendingCall = { record, startedAt: performance.now(), controller: new AbortController() }\n this.pending.set(id, pending)\n\n let status: CodemodeCallStatus\n let reply: HostToWorkerMessage\n try {\n const tool = (isTool ? this.tools : this.globals).get(name)\n if (!tool)\n throw new Error(`Unknown ${isTool ? 'tool' : 'global'} \"${name}\"`)\n const args: unknown = message.args === undefined ? undefined : JSON.parse(message.args)\n const value = await tool.execute(args, { signal: pending.controller.signal, seq: id, ...(message.line !== undefined ? { line: message.line } : {}) })\n reply = CodemodeValue.is(value)\n ? { type: 'result', id, ok: true, payload: value.value === undefined ? undefined : JSON.stringify(value.value), text: value.text }\n : { type: 'result', id, ok: true, payload: value === undefined ? undefined : JSON.stringify(value) }\n status = 'ok'\n }\n catch (error) {\n reply = { type: 'result', id, ok: false, payload: errorMessage(error) }\n status = 'error'\n }\n\n // Already cancelled by finish(): the record keeps \"cancelled\" and the\n // worker is gone or going.\n if (!this.pending.delete(id))\n return\n if (record) {\n record.status = status\n record.durationMs = performance.now() - pending.startedAt\n }\n this.post(reply)\n }\n\n private finish(error: CodemodeError | undefined, value?: unknown, writes?: CodemodeStoreWrites): void {\n if (this.finished)\n return\n this.finished = true\n clearTimeout(this.timer)\n this.signal?.removeEventListener('abort', this.onAbort)\n\n const now = performance.now()\n for (const pending of this.pending.values()) {\n if (pending.record)\n pending.record.durationMs = now - pending.startedAt\n pending.controller.abort()\n }\n this.pending.clear()\n\n const result: CodemodeResult = error\n ? { ok: false, error, output: this.output, calls: this.calls }\n : {\n ok: true,\n value,\n output: this.output,\n calls: this.calls,\n storeWrites: writes ?? { set: {}, delete: [] },\n }\n if (!this.worker) {\n this.resolveResult(result)\n return\n }\n Atomics.store(new Int32Array(this.interrupt), 0, 1)\n this.worker\n .terminate()\n .catch(() => undefined)\n .then(() => this.resolveResult(result))\n }\n}\n\n/**\n * Runs JavaScript in a QuickJS VM (a separate wasm instance) inside a worker\n * thread. The script sees `tools.<name>(args)` for every registered tool, `ALL_TOOLS`,\n * the output helpers `text`, `image`, `exit`, and `console.*`, `store`/`load`, and the\n * configured globals; nothing else (no timers, `fetch`, `process`, `require`, modules).\n *\n * Each `execute()` gets its own worker and VM; the sandbox only holds the tool\n * table and defaults. `close()` aborts in-flight executions.\n *\n * @example\n * ```ts\n * import { CodemodeSandbox } from 'zidane/codemode'\n *\n * const sandbox = new CodemodeSandbox({\n * tools: [{ name: 'add', execute: args => (args as { a: number, b: number }).a + (args as { a: number, b: number }).b }],\n * })\n * const result = await sandbox.execute('return await tools.add({ a: 1, b: 2 })')\n * if (result.ok)\n * console.log(result.value)\n * ```\n */\nexport class CodemodeSandbox {\n private readonly toolsByName = new Map<string, CodemodeTool>()\n private readonly globalsByName = new Map<string, CodemodeTool>()\n private readonly timeoutMs: number\n private readonly memoryLimitBytes: number | undefined\n private readonly wasm: CodemodeWasmModule | Promise<CodemodeWasmModule> | undefined\n private readonly workerUrl: string | URL\n private readonly toolHints: Record<string, string> | undefined\n private readonly shortcuts: Record<string, string> | undefined\n private readonly running = new Set<Execution>()\n private closed = false\n\n /**\n * Creates a sandbox with its tools, globals and defaults. Throws when a global or shortcut name is invalid, reserved or duplicated.\n *\n * @param options - Tools, globals, timeout, memory limit and worker settings.\n */\n constructor(options: CodemodeSandboxOptions = {}) {\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS\n this.memoryLimitBytes = options.memoryLimitBytes\n this.wasm = options.wasm\n this.workerUrl = options.workerUrl ?? defaultWorkerUrl()\n this.toolHints = options.toolHints\n for (const tool of options.tools ?? [])\n this.registerTool(tool)\n const namespaces = new Set<string>()\n for (const global of options.globals ?? []) {\n const parts = global.name.split('.')\n if (parts.length > 2 || !parts.every(part => IDENTIFIER.test(part)) || RESERVED_GLOBALS.has(parts[0]!))\n throw new Error(`Invalid global name \"${global.name}\"`)\n if (this.globalsByName.has(global.name))\n throw new Error(`Global \"${global.name}\" is already registered`)\n if (parts.length === 2)\n namespaces.add(parts[0]!)\n this.globalsByName.set(global.name, global)\n }\n for (const name of namespaces) {\n if (this.globalsByName.has(name))\n throw new Error(`Global \"${name}\" conflicts with the namespace \"${name}\"`)\n }\n for (const name of Object.keys(options.shortcuts ?? {})) {\n if (!IDENTIFIER.test(name) || RESERVED_GLOBALS.has(name) || this.globalsByName.has(name) || namespaces.has(name))\n throw new Error(`Invalid shortcut name \"${name}\"`)\n }\n this.shortcuts = options.shortcuts\n }\n\n /**\n * Throws if a tool with the same name is already registered.\n * @param tool - Tool to add to the `tools` table.\n */\n registerTool(tool: CodemodeTool): void {\n if (this.toolsByName.has(tool.name))\n throw new Error(`Tool \"${tool.name}\" is already registered`)\n this.toolsByName.set(tool.name, tool)\n }\n\n /**\n * Removes a tool by name. Returns `true` when it was registered.\n *\n * @param name - Name of the tool to remove.\n */\n unregisterTool(name: string): boolean {\n return this.toolsByName.delete(name)\n }\n\n /** Tools currently registered. */\n get tools(): CodemodeTool[] {\n return [...this.toolsByName.values()]\n }\n\n /** Globals the script can call as top-level functions. */\n get globals(): CodemodeTool[] {\n return [...this.globalsByName.values()]\n }\n\n /**\n * `code` is an async function body: `return` and top-level `await` work.\n * Script failures come back as `{ ok: false }`. The promise rejects only when the sandbox is closed.\n * The script can use `store(key, value)` and `load(key)` on `options.store`.\n *\n * @param code - Script source, run as an async function body.\n * @param options - Per-execution signal, timeout, `store` values and determinism settings.\n */\n execute(code: string, options: CodemodeExecuteOptions = {}): Promise<CodemodeResult> {\n if (this.closed)\n return Promise.reject(new Error('Sandbox is closed'))\n const execution = new Execution({\n code,\n tools: new Map(this.toolsByName),\n globals: this.globalsByName,\n timeoutMs: options.timeoutMs ?? this.timeoutMs,\n signal: options.signal,\n memoryLimitBytes: this.memoryLimitBytes,\n store: serializeStore(options.store),\n wasm: this.wasm === undefined ? loadQuickJSWasm() : Promise.resolve(this.wasm),\n workerUrl: this.workerUrl,\n determinism: options.determinism,\n toolHints: this.toolHints,\n shortcuts: this.shortcuts,\n trackLines: options.trackLines === true,\n onOutput: options.onOutput,\n })\n this.running.add(execution)\n return execution.promise.finally(() => this.running.delete(execution))\n }\n\n /** Aborts in-flight executions (they resolve with `kind: \"aborted\"`) and rejects new ones. */\n async close(): Promise<void> {\n this.closed = true\n await Promise.all([...this.running].map(execution => execution.abort('Sandbox closed')))\n }\n}\n"],"mappings":";;;;;;;;;;AAsBA,MAAM,qBAAqB;AAC3B,MAAM,aAAa;AACnB,MAAM,mCAAwC,IAAI,IAAI;CACpD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,aAAa,OAAwB;CAC5C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAEA,SAAS,eAAe,OAA8E;CACpG,MAAM,aAAqC,CAAC;CAC5C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,CAAC,CAAC,GAAG;EACtD,MAAM,OAAO,KAAK,UAAU,KAAK;EACjC,IAAI,SAAS,KAAA,GACX,WAAW,OAAO;CACtB;CACA,OAAO;AACT;;;;;;AAOA,IAAM,cAAN,cAA0B,MAAM,CAAC;AAEjC,SAAS,gBAAgB,MAAc,MAAuB;CAC5D,IAAI;EACF,OAAO,KAAK,MAAM,IAAI;CACxB,QACM;EACJ,MAAM,IAAI,YAAY,GAAG,KAAK,mBAAmB;CACnD;AACF;AAEA,SAAS,iBAAiB,MAAmC;CAC3D,MAAM,UAAU,gBAAgB,MAAM,cAAc;CACpD,IAAI,CAAC,MAAM,QAAQ,OAAO,GACxB,MAAM,IAAI,YAAY,+BAA+B;CACvD,MAAM,SAA8B;EAAE,KAAK,CAAC;EAAG,QAAQ,CAAC;CAAE;CAC1D,KAAK,MAAM,SAAS,SAAS;EAC3B,IACE,CAAC,MAAM,QAAQ,KAAK,KACjB,OAAO,MAAM,OAAO,aACnB,MAAM,WAAW,IAAI,OAAO,MAAM,OAAO,WAAW,MAAM,WAAW,IAEzE,MAAM,IAAI,YAAY,wCAAwC;EAEhE,MAAM,CAAC,KAAK,SAAS;EACrB,IAAI,UAAU,KAAA,GACZ,OAAO,OAAO,KAAK,GAAG;OAEtB,OAAO,IAAI,OAAO,gBAAgB,OAAO,mBAAmB,KAAK,UAAU,GAAG,GAAG;CACrF;CACA,OAAO;AACT;AAEA,SAAS,iBAAiB,MAA6B;CACrD,MAAM,SAAS,gBAAgB,MAAM,cAAc;CACnD,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,MAAM,IAAI,YAAY,+BAA+B;CACvD,MAAM,EAAE,MAAM,SAAS,UAAU;CACjC,IACE,OAAO,YAAY,YACf,SAAS,KAAA,KAAa,OAAO,SAAS,YACtC,UAAU,KAAA,KAAa,OAAO,UAAU,UAE5C,MAAM,IAAI,YAAY,2BAA2B;CAEnD,OAAO;EAAE,MAAM;EAAU;EAAM;EAAS;CAAM;AAChD;;AAGA,MAAM,wBAAwB;;;;;;AAO9B,SAAgB,mBAAmB,MAAc,OAA+C;CAC9F,MAAM,QAAQ,OAAO,MAAM,0BAA0B;CACrD,IAAI,CAAC,OACH,OAAO,KAAA;CACT,MAAM,OAAO,OAAO,MAAM,EAAE;CAC5B,MAAM,SAAS,KAAK,IAAI,GAAG,OAAO,MAAM,EAAE,KAAK,SAAS,IAAI,wBAAwB,EAAE;CACtF,MAAM,SAAS,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO;CACvC,IAAI,WAAW,KAAA,GACb,OAAO,KAAA;CACT,MAAM,SAAS,GAAG,KAAK;CAEvB,MAAM,QAAQ,OAAO,SAAS,MAAM,KAAK,IAAI,GAAG,SAAS,EAAE,IAAI;CAC/D,MAAM,QAAQ,QAAQ,IAAI,IAAI,OAAO,MAAM,OAAO,QAAQ,GAAG,MAAM,OAAO,MAAM,GAAG,GAAG;CACtF,MAAM,UAAU,SAAS,IAAI,SAAS,QAAQ,IAAI,IAAI;CACtD,OAAO,GAAG,SAAS,MAAM,IAAI,IAAI,OAAO,OAAO,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,EAAE;AAChF;AAEA,SAAS,mBAAwB;CAI/B,MAAM,aAAa,qBAAqB,CAAC,CAAC;CAC1C,IAAI,YACF,OAAO;CACT,OAAO,IAAI,IAAI,YAAY,IAAI,SAAS,KAAK,IAAI,gBAAgB,wBAAwB,YAAY,GAAG;AAC1G;;;;;;AA8BA,IAAM,YAAN,MAAgB;CACd;CACA;CACA;CACA,YAA6B,IAAI,kBAAkB,CAAC;CACpD;CACA;CACA;CACA;CACA,SAAgD,CAAC;CACjD,QAAyC,CAAC;CAC1C,0BAA2B,IAAI,IAAyB;CACxD;CACA;CACA,WAAmB;CAEnB,YAAY,SAA2B;EACrC,KAAK,UAAU,IAAI,SAAyB,YAAY;GACtD,KAAK,gBAAgB;EACvB,CAAC;EACD,KAAK,QAAQ,QAAQ;EACrB,KAAK,UAAU,QAAQ;EACvB,KAAK,SAAS,QAAQ;EACtB,KAAK,OAAO,QAAQ;EACpB,KAAK,WAAW,QAAQ;EAExB,IAAI,OAAO,SAAS,QAAQ,SAAS,GACnC,KAAK,QAAQ,iBAAiB;GAC5B,KAAK,OAAO;IAAE,MAAM;IAAW,SAAS,6BAA6B,QAAQ,UAAU;GAAK,CAAC;EAC/F,GAAG,QAAQ,SAAS;EAGtB,IAAI,QAAQ,QAAQ;GAClB,IAAI,QAAQ,OAAO,SACjB,KAAK,QAAQ;QAEb,QAAQ,OAAO,iBAAiB,SAAS,KAAK,SAAS,EAAE,MAAM,KAAK,CAAC;EACzE;EAEA,QAAQ,KAAK,MACX,SAAQ,KAAK,MAAM,SAAS,IAAI,IAC/B,UAAmB;GAClB,KAAK,OAAO;IAAE,MAAM;IAAW,SAAS,2BAA2B,aAAa,KAAK;GAAI,CAAC;EAC5F,CACF;CACF;CAEA,MAAM,SAA0C;EAC9C,KAAK,OAAO;GAAE,MAAM;GAAW;EAAQ,CAAC;EACxC,OAAO,KAAK;CACd;CAEA,MAAc,SAA2B,MAAgC;EACvE,IAAI,KAAK,UACP;EACF,MAAM,aAAyB;GAC7B,MAAM,QAAQ;GACd,OAAO,CAAC,GAAG,QAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS;IAC/C,MAAM,YAAY,iBAAiB,KAAK,WAAW;IACnD,OAAO;KACL,MAAM,KAAK;KACX,QAAQ,qBAAqB,KAAK,IAAI;KACtC,aAAa,KAAK,eAAe;KACjC,GAAI,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;IACjD;GACF,CAAC;GACD,SAAS,CAAC,GAAG,QAAQ,QAAQ,OAAO,CAAC,CAAC,CAAC,KAAI,YAAW;IACpD,MAAM,OAAO;IACb,QAAQ,OAAO,WAAW;GAC5B,EAAE;GACF;GACA,kBAAkB,QAAQ;GAC1B,OAAO,QAAQ;GACf,WAAW,KAAK;GAChB,aAAa,QAAQ;GACrB,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;GAC5D,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;GAC5D,GAAI,QAAQ,aAAa,EAAE,YAAY,KAAK,IAAI,CAAC;EACnD;EACA,IAAI;EACJ,IAAI;GACF,SAAS,IAAI,OAAO,QAAQ,WAAW,EAAE,WAAW,CAAC;EACvD,SACO,OAAO;GACZ,KAAK,OAAO;IAAE,MAAM;IAAW,SAAS,2BAA2B,aAAa,KAAK;GAAI,CAAC;GAC1F;EACF;EACA,KAAK,SAAS;EACd,OAAO,GAAG,YAAY,YAAqB;GAEzC,IAAI;IACF,KAAK,cAAc,OAAO;GAC5B,SACO,OAAO;IACZ,KAAK,OAAO;KACV,MAAM;KACN,SACE,iBAAiB,cACb,0BAA0B,MAAM,QAAQ,0EACxC,wBAAwB,aAAa,KAAK;IAClD,CAAC;GACH;EACF,CAAC;EACD,OAAO,GAAG,UAAU,UAAmB;GACrC,KAAK,OAAO;IACV,MAAM;IACN,MAAM,iBAAiB,QAAQ,MAAM,OAAO,KAAA;IAC5C,SAAS,aAAa,KAAK;GAC7B,CAAC;EACH,CAAC;EACD,OAAO,GAAG,SAAS,SAAS;GAC1B,KAAK,OAAO;IAAE,MAAM;IAAW,SAAS,2BAA2B,KAAK;GAA4B,CAAC;EACvG,CAAC;CACH;CAEA,gBAAuC;EACrC,MAAM,SAAkB,KAAK,QAAQ;EACrC,KAAK,OAAO;GAAE,MAAM;GAAW,SAAS,kBAAkB,QAAQ,OAAO,UAAU;EAAoB,CAAC;CAC1G;CAEA,KAAa,SAAoC;EAC/C,KAAK,QAAQ,YAAY,OAAO;CAClC;CAEA,cAAsB,SAAwB;EAC5C,IAAI,KAAK,UACP;EACF,IAAI,CAAC,sBAAsB,OAAO,GAChC,MAAM,IAAI,YAAY,iCAAiC;EACzD,QAAQ,QAAQ,MAAhB;GACE,KAAK;IACH,KAAK,OAAO,KAAK,QAAQ,IAAI;IAC7B,IAAI;KACF,KAAK,WAAW,QAAQ,IAAI;IAC9B,QACM,CAEN;IACA;GACF,KAAK;IACH,IAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,GAC9B,MAAM,IAAI,YAAY,uBAAuB;IAG/C,KAAK,MAAM,QAAQ,QAAQ,OAAO;KAChC,IAAI,KAAK,QAAQ,IAAI,KAAK,EAAE,GAC1B,MAAM,IAAI,YAAY,qBAAqB,KAAK,IAAI;KACtD,KAAU,WAAW,IAAI;IAC3B;IACA;GACF,KAAK;IACH,KAAK,WAAW,OAAO;IACvB;GACF,KAAK,SACH,KAAK,OAAO;IAAE,MAAM;IAAW,SAAS,QAAQ;GAAQ,CAAC;EAE7D;CACF;CAEA,WAAmB,SAA+D;EAEhF,IAAI,CAAC,QAAQ,IAAI;GACf,MAAM,QAAQ,iBAAiB,QAAQ,KAAK;GAC5C,MAAM,UAAU,mBAAmB,KAAK,MAAM,MAAM,KAAK;GACzD,KAAK,OAAO,UAAU;IAAE,GAAG;IAAO;GAAQ,IAAI,KAAK;GACnD;EACF;EACA,MAAM,QAAQ,QAAQ,UAAU,KAAA,IAAY,KAAA,IAAY,gBAAgB,QAAQ,OAAO,cAAc;EACrG,KAAK,OAAO,KAAA,GAAW,OAAO,iBAAiB,QAAQ,MAAM,CAAC;CAChE;CAEA,MAAc,WAAW,SAAqC;EAC5D,MAAM,EAAE,IAAI,SAAS;EACrB,MAAM,SAAS,QAAQ,WAAW;EAClC,MAAM,SAAmC,SAAS;GAAE;GAAM,KAAK;GAAI,QAAQ;GAAa,YAAY;EAAE,IAAI,KAAA;EAC1G,IAAI,QACF,KAAK,MAAM,KAAK,MAAM;EACxB,MAAM,UAAuB;GAAE;GAAQ,WAAW,YAAY,IAAI;GAAG,YAAY,IAAI,gBAAgB;EAAE;EACvG,KAAK,QAAQ,IAAI,IAAI,OAAO;EAE5B,IAAI;EACJ,IAAI;EACJ,IAAI;GACF,MAAM,QAAQ,SAAS,KAAK,QAAQ,KAAK,QAAA,CAAS,IAAI,IAAI;GAC1D,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,WAAW,SAAS,SAAS,SAAS,IAAI,KAAK,EAAE;GACnE,MAAM,OAAgB,QAAQ,SAAS,KAAA,IAAY,KAAA,IAAY,KAAK,MAAM,QAAQ,IAAI;GACtF,MAAM,QAAQ,MAAM,KAAK,QAAQ,MAAM;IAAE,QAAQ,QAAQ,WAAW;IAAQ,KAAK;IAAI,GAAI,QAAQ,SAAS,KAAA,IAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;GAAG,CAAC;GACpJ,QAAQ,cAAc,GAAG,KAAK,IAC1B;IAAE,MAAM;IAAU;IAAI,IAAI;IAAM,SAAS,MAAM,UAAU,KAAA,IAAY,KAAA,IAAY,KAAK,UAAU,MAAM,KAAK;IAAG,MAAM,MAAM;GAAK,IAC/H;IAAE,MAAM;IAAU;IAAI,IAAI;IAAM,SAAS,UAAU,KAAA,IAAY,KAAA,IAAY,KAAK,UAAU,KAAK;GAAE;GACrG,SAAS;EACX,SACO,OAAO;GACZ,QAAQ;IAAE,MAAM;IAAU;IAAI,IAAI;IAAO,SAAS,aAAa,KAAK;GAAE;GACtE,SAAS;EACX;EAIA,IAAI,CAAC,KAAK,QAAQ,OAAO,EAAE,GACzB;EACF,IAAI,QAAQ;GACV,OAAO,SAAS;GAChB,OAAO,aAAa,YAAY,IAAI,IAAI,QAAQ;EAClD;EACA,KAAK,KAAK,KAAK;CACjB;CAEA,OAAe,OAAkC,OAAiB,QAAoC;EACpG,IAAI,KAAK,UACP;EACF,KAAK,WAAW;EAChB,aAAa,KAAK,KAAK;EACvB,KAAK,QAAQ,oBAAoB,SAAS,KAAK,OAAO;EAEtD,MAAM,MAAM,YAAY,IAAI;EAC5B,KAAK,MAAM,WAAW,KAAK,QAAQ,OAAO,GAAG;GAC3C,IAAI,QAAQ,QACV,QAAQ,OAAO,aAAa,MAAM,QAAQ;GAC5C,QAAQ,WAAW,MAAM;EAC3B;EACA,KAAK,QAAQ,MAAM;EAEnB,MAAM,SAAyB,QAC3B;GAAE,IAAI;GAAO;GAAO,QAAQ,KAAK;GAAQ,OAAO,KAAK;EAAM,IAC3D;GACE,IAAI;GACJ;GACA,QAAQ,KAAK;GACb,OAAO,KAAK;GACZ,aAAa,UAAU;IAAE,KAAK,CAAC;IAAG,QAAQ,CAAC;GAAE;EAC/C;EACJ,IAAI,CAAC,KAAK,QAAQ;GAChB,KAAK,cAAc,MAAM;GACzB;EACF;EACA,QAAQ,MAAM,IAAI,WAAW,KAAK,SAAS,GAAG,GAAG,CAAC;EAClD,KAAK,OACF,UAAU,CAAC,CACX,YAAY,KAAA,CAAS,CAAC,CACtB,WAAW,KAAK,cAAc,MAAM,CAAC;CAC1C;AACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,IAAa,kBAAb,MAA6B;CAC3B,8BAA+B,IAAI,IAA0B;CAC7D,gCAAiC,IAAI,IAA0B;CAC/D;CACA;CACA;CACA;CACA;CACA;CACA,0BAA2B,IAAI,IAAe;CAC9C,SAAiB;;;;;;CAOjB,YAAY,UAAkC,CAAC,GAAG;EAChD,KAAK,YAAY,QAAQ,aAAa;EACtC,KAAK,mBAAmB,QAAQ;EAChC,KAAK,OAAO,QAAQ;EACpB,KAAK,YAAY,QAAQ,aAAa,iBAAiB;EACvD,KAAK,YAAY,QAAQ;EACzB,KAAK,MAAM,QAAQ,QAAQ,SAAS,CAAC,GACnC,KAAK,aAAa,IAAI;EACxB,MAAM,6BAAa,IAAI,IAAY;EACnC,KAAK,MAAM,UAAU,QAAQ,WAAW,CAAC,GAAG;GAC1C,MAAM,QAAQ,OAAO,KAAK,MAAM,GAAG;GACnC,IAAI,MAAM,SAAS,KAAK,CAAC,MAAM,OAAM,SAAQ,WAAW,KAAK,IAAI,CAAC,KAAK,iBAAiB,IAAI,MAAM,EAAG,GACnG,MAAM,IAAI,MAAM,wBAAwB,OAAO,KAAK,EAAE;GACxD,IAAI,KAAK,cAAc,IAAI,OAAO,IAAI,GACpC,MAAM,IAAI,MAAM,WAAW,OAAO,KAAK,wBAAwB;GACjE,IAAI,MAAM,WAAW,GACnB,WAAW,IAAI,MAAM,EAAG;GAC1B,KAAK,cAAc,IAAI,OAAO,MAAM,MAAM;EAC5C;EACA,KAAK,MAAM,QAAQ,YACjB,IAAI,KAAK,cAAc,IAAI,IAAI,GAC7B,MAAM,IAAI,MAAM,WAAW,KAAK,kCAAkC,KAAK,EAAE;EAE7E,KAAK,MAAM,QAAQ,OAAO,KAAK,QAAQ,aAAa,CAAC,CAAC,GACpD,IAAI,CAAC,WAAW,KAAK,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,KAAK,cAAc,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,GAC7G,MAAM,IAAI,MAAM,0BAA0B,KAAK,EAAE;EAErD,KAAK,YAAY,QAAQ;CAC3B;;;;;CAMA,aAAa,MAA0B;EACrC,IAAI,KAAK,YAAY,IAAI,KAAK,IAAI,GAChC,MAAM,IAAI,MAAM,SAAS,KAAK,KAAK,wBAAwB;EAC7D,KAAK,YAAY,IAAI,KAAK,MAAM,IAAI;CACtC;;;;;;CAOA,eAAe,MAAuB;EACpC,OAAO,KAAK,YAAY,OAAO,IAAI;CACrC;;CAGA,IAAI,QAAwB;EAC1B,OAAO,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC;CACtC;;CAGA,IAAI,UAA0B;EAC5B,OAAO,CAAC,GAAG,KAAK,cAAc,OAAO,CAAC;CACxC;;;;;;;;;CAUA,QAAQ,MAAc,UAAkC,CAAC,GAA4B;EACnF,IAAI,KAAK,QACP,OAAO,QAAQ,uBAAO,IAAI,MAAM,mBAAmB,CAAC;EACtD,MAAM,YAAY,IAAI,UAAU;GAC9B;GACA,OAAO,IAAI,IAAI,KAAK,WAAW;GAC/B,SAAS,KAAK;GACd,WAAW,QAAQ,aAAa,KAAK;GACrC,QAAQ,QAAQ;GAChB,kBAAkB,KAAK;GACvB,OAAO,eAAe,QAAQ,KAAK;GACnC,MAAM,KAAK,SAAS,KAAA,IAAY,gBAAgB,IAAI,QAAQ,QAAQ,KAAK,IAAI;GAC7E,WAAW,KAAK;GAChB,aAAa,QAAQ;GACrB,WAAW,KAAK;GAChB,WAAW,KAAK;GAChB,YAAY,QAAQ,eAAe;GACnC,UAAU,QAAQ;EACpB,CAAC;EACD,KAAK,QAAQ,IAAI,SAAS;EAC1B,OAAO,UAAU,QAAQ,cAAc,KAAK,QAAQ,OAAO,SAAS,CAAC;CACvE;;CAGA,MAAM,QAAuB;EAC3B,KAAK,SAAS;EACd,MAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,KAAI,cAAa,UAAU,MAAM,gBAAgB,CAAC,CAAC;CACzF;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { s as withTimeout } from "./timeout-BLGxs-F_.js";
2
2
  import { d as probeEnvironment, l as environmentTakesBranch, r as LOCAL_ENVIRONMENT } from "./environment-DWlIhAKo.js";
3
- import { a as SETTINGS_INPUTS, i as SETTINGS_CHOICES, k as approvalModeFromSafeMode, s as SETTINGS_TOGGLES } from "./settings-catalog-4IU2i_jG.js";
3
+ import { a as SETTINGS_INPUTS, i as SETTINGS_CHOICES, k as approvalModeFromSafeMode, s as SETTINGS_TOGGLES } from "./settings-catalog-DEZlXP51.js";
4
4
  //#region src/chat/environment-settings.ts
5
5
  function boundSetting(settings, key) {
6
6
  return settings?.[key];
@@ -346,4 +346,4 @@ function splitHostSettingsPatch(patch) {
346
346
  //#endregion
347
347
  export { settingsFromWire as a, applyEnvironmentSettingsChange as c, isEnvironmentEnabled as d, readEnvironmentSettings as f, overlayHostSettings as i, defaultEnvironmentKind as l, WINDOW_LOCAL_SETTINGS as n, settingsToWire as o, resolveProviderConfig as p, isWindowOnlySetting as r, splitHostSettingsPatch as s, HOST_ENABLED_LISTS as t, describeEnvironments as u };
348
348
 
349
- //# sourceMappingURL=host-scoped-settings-CrbcqOkP.js.map
349
+ //# sourceMappingURL=host-scoped-settings-WBYaCork.js.map