@shareai-lab/kode 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +649 -25
  3. package/README.zh-CN.md +579 -0
  4. package/cli-acp.js +3 -17
  5. package/cli.js +5 -7
  6. package/dist/chunks/Doctor-M3J7GRTJ.js +12 -0
  7. package/dist/chunks/LogList-ISWZ6DDD.js +121 -0
  8. package/dist/chunks/LogList-ISWZ6DDD.js.map +7 -0
  9. package/dist/chunks/REPL-RQ6LO6S7.js +56 -0
  10. package/dist/chunks/ResumeConversation-6DMVBEGH.js +56 -0
  11. package/dist/chunks/agentLoader-FCRG3TFJ.js +31 -0
  12. package/dist/{agentsValidate-7LH4HTNR.js → chunks/agentsValidate-PEWMYN4Q.js} +97 -69
  13. package/dist/chunks/agentsValidate-PEWMYN4Q.js.map +7 -0
  14. package/dist/{ask-3NHFFUQG.js → chunks/ask-D7SOHJ6Z.js} +36 -44
  15. package/dist/chunks/ask-D7SOHJ6Z.js.map +7 -0
  16. package/dist/chunks/autoUpdater-CNESBOKO.js +19 -0
  17. package/dist/{chunk-AFFSCMYS.js → chunks/chunk-2JN5MY67.js} +12 -14
  18. package/dist/chunks/chunk-2JN5MY67.js.map +7 -0
  19. package/dist/chunks/chunk-2QONJ5MG.js +14 -0
  20. package/dist/chunks/chunk-2QONJ5MG.js.map +7 -0
  21. package/dist/chunks/chunk-2WEXPKHH.js +903 -0
  22. package/dist/chunks/chunk-2WEXPKHH.js.map +7 -0
  23. package/dist/{chunk-ARZSBOAO.js → chunks/chunk-3BYE3ME6.js} +717 -792
  24. package/dist/chunks/chunk-3BYE3ME6.js.map +7 -0
  25. package/dist/chunks/chunk-3JDNWX7W.js +1264 -0
  26. package/dist/chunks/chunk-3JDNWX7W.js.map +7 -0
  27. package/dist/chunks/chunk-3OEJVB5A.js +906 -0
  28. package/dist/chunks/chunk-3OEJVB5A.js.map +7 -0
  29. package/dist/chunks/chunk-3TNIOEBO.js +369 -0
  30. package/dist/chunks/chunk-3TNIOEBO.js.map +7 -0
  31. package/dist/chunks/chunk-4A46ZXMJ.js +67 -0
  32. package/dist/chunks/chunk-4A46ZXMJ.js.map +7 -0
  33. package/dist/{chunk-UHYRLID6.js → chunks/chunk-4ATBQOFO.js} +107 -55
  34. package/dist/chunks/chunk-4ATBQOFO.js.map +7 -0
  35. package/dist/chunks/chunk-4CRUCZR4.js +0 -0
  36. package/dist/{chunk-YC6LJCDE.js → chunks/chunk-4EO6SIQY.js} +32 -75
  37. package/dist/chunks/chunk-4EO6SIQY.js.map +7 -0
  38. package/dist/chunks/chunk-53M46S5I.js +64 -0
  39. package/dist/chunks/chunk-53M46S5I.js.map +7 -0
  40. package/dist/{chunk-JC6NCUG5.js → chunks/chunk-54KOYG5C.js} +0 -2
  41. package/dist/{chunk-EZXMVTDU.js → chunks/chunk-6BAS4WY6.js} +29 -45
  42. package/dist/chunks/chunk-6BAS4WY6.js.map +7 -0
  43. package/dist/{chunk-3IN27HA5.js → chunks/chunk-6KRRFSDN.js} +4 -6
  44. package/dist/chunks/chunk-6KRRFSDN.js.map +7 -0
  45. package/dist/chunks/chunk-6LJNZK4K.js +39 -0
  46. package/dist/chunks/chunk-6LJNZK4K.js.map +7 -0
  47. package/dist/chunks/chunk-6ZWEOSEI.js +666 -0
  48. package/dist/chunks/chunk-6ZWEOSEI.js.map +7 -0
  49. package/dist/chunks/chunk-77XDJMBP.js +3326 -0
  50. package/dist/chunks/chunk-77XDJMBP.js.map +7 -0
  51. package/dist/chunks/chunk-7RRW4NTB.js +6454 -0
  52. package/dist/chunks/chunk-7RRW4NTB.js.map +7 -0
  53. package/dist/chunks/chunk-7X3TW4JB.js +4520 -0
  54. package/dist/chunks/chunk-7X3TW4JB.js.map +7 -0
  55. package/dist/chunks/chunk-B3MW3YGY.js +1409 -0
  56. package/dist/chunks/chunk-B3MW3YGY.js.map +7 -0
  57. package/dist/chunks/chunk-BBJFHTBC.js +28 -0
  58. package/dist/chunks/chunk-BBJFHTBC.js.map +7 -0
  59. package/dist/chunks/chunk-BHDHXOXB.js +24 -0
  60. package/dist/chunks/chunk-BHDHXOXB.js.map +7 -0
  61. package/dist/{chunk-73WGVYLQ.js → chunks/chunk-BTA7SZ26.js} +152 -223
  62. package/dist/chunks/chunk-BTA7SZ26.js.map +7 -0
  63. package/dist/chunks/chunk-CDGRYGPZ.js +103 -0
  64. package/dist/chunks/chunk-CDGRYGPZ.js.map +7 -0
  65. package/dist/{chunk-S6HRABTA.js → chunks/chunk-CP6E5UG6.js} +1 -4
  66. package/dist/chunks/chunk-CP6E5UG6.js.map +7 -0
  67. package/dist/{chunk-QVLYOPO5.js → chunks/chunk-DQ4JHXMT.js} +462 -424
  68. package/dist/chunks/chunk-DQ4JHXMT.js.map +7 -0
  69. package/dist/chunks/chunk-DXD76CMV.js +208 -0
  70. package/dist/chunks/chunk-DXD76CMV.js.map +7 -0
  71. package/dist/chunks/chunk-GCQCAXJZ.js +0 -0
  72. package/dist/chunks/chunk-GELCZWMB.js +42 -0
  73. package/dist/chunks/chunk-GELCZWMB.js.map +7 -0
  74. package/dist/{chunk-K2CWOTI2.js → chunks/chunk-HJYOH4HC.js} +23 -18
  75. package/dist/chunks/chunk-HJYOH4HC.js.map +7 -0
  76. package/dist/chunks/chunk-HPYNW6TT.js +744 -0
  77. package/dist/chunks/chunk-HPYNW6TT.js.map +7 -0
  78. package/dist/{chunk-RZWOUA25.js → chunks/chunk-HRJ3ICQK.js} +59 -55
  79. package/dist/chunks/chunk-HRJ3ICQK.js.map +7 -0
  80. package/dist/{chunk-DZE5YA7L.js → chunks/chunk-IFCIADS3.js} +571 -573
  81. package/dist/chunks/chunk-IFCIADS3.js.map +7 -0
  82. package/dist/chunks/chunk-IN7XZ7BC.js +27 -0
  83. package/dist/chunks/chunk-IN7XZ7BC.js.map +7 -0
  84. package/dist/chunks/chunk-L7P4M4KW.js +193 -0
  85. package/dist/chunks/chunk-L7P4M4KW.js.map +7 -0
  86. package/dist/chunks/chunk-LB6TCPDI.js +0 -0
  87. package/dist/{chunk-3RUXVV4S.js → chunks/chunk-LOCXPQNJ.js} +1 -4
  88. package/dist/{chunk-3RUXVV4S.js.map → chunks/chunk-LOCXPQNJ.js.map} +2 -2
  89. package/dist/{chunk-7M2YN6TU.js → chunks/chunk-LOD5ZHCI.js} +213 -208
  90. package/dist/chunks/chunk-LOD5ZHCI.js.map +7 -0
  91. package/dist/{chunk-S3J2TLV6.js → chunks/chunk-M7P3QNRU.js} +1 -4
  92. package/dist/{chunk-S3J2TLV6.js.map → chunks/chunk-M7P3QNRU.js.map} +2 -2
  93. package/dist/chunks/chunk-PPHLQVL7.js +4234 -0
  94. package/dist/chunks/chunk-PPHLQVL7.js.map +7 -0
  95. package/dist/{chunk-ABLVTESJ.js → chunks/chunk-QAXE37B5.js} +1 -4
  96. package/dist/chunks/chunk-QAXE37B5.js.map +7 -0
  97. package/dist/chunks/chunk-QHQOBUF6.js +60 -0
  98. package/dist/chunks/chunk-QHQOBUF6.js.map +7 -0
  99. package/dist/{chunk-W7GRKO7Q.js → chunks/chunk-RPJXO7GG.js} +241 -214
  100. package/dist/chunks/chunk-RPJXO7GG.js.map +7 -0
  101. package/dist/{chunk-NPFOMITO.js → chunks/chunk-SWQV4KSY.js} +1 -4
  102. package/dist/{chunk-NPFOMITO.js.map → chunks/chunk-SWQV4KSY.js.map} +2 -2
  103. package/dist/chunks/chunk-SZLAPULP.js +28 -0
  104. package/dist/chunks/chunk-SZLAPULP.js.map +7 -0
  105. package/dist/{chunk-7U7L4NMD.js → chunks/chunk-T7RB5V5J.js} +23 -25
  106. package/dist/chunks/chunk-T7RB5V5J.js.map +7 -0
  107. package/dist/{chunk-HN4E4UUQ.js → chunks/chunk-TI2CTTMA.js} +25 -17
  108. package/dist/chunks/chunk-TI2CTTMA.js.map +7 -0
  109. package/dist/{chunk-ZVDRDPII.js → chunks/chunk-TNGVRTO5.js} +45 -20
  110. package/dist/chunks/chunk-TNGVRTO5.js.map +7 -0
  111. package/dist/chunks/chunk-TNWB3U5Y.js +2077 -0
  112. package/dist/chunks/chunk-TNWB3U5Y.js.map +7 -0
  113. package/dist/chunks/chunk-U2IHWPCU.js +12 -0
  114. package/dist/chunks/chunk-U2IHWPCU.js.map +7 -0
  115. package/dist/{chunk-KAA5BGMQ.js → chunks/chunk-UNOY3VJ2.js} +1 -4
  116. package/dist/{chunk-KAA5BGMQ.js.map → chunks/chunk-UNOY3VJ2.js.map} +2 -2
  117. package/dist/{chunk-MWRSY4X6.js → chunks/chunk-UVDJL6ZZ.js} +97 -58
  118. package/dist/chunks/chunk-UVDJL6ZZ.js.map +7 -0
  119. package/dist/chunks/chunk-VNCW4C2Z.js +13452 -0
  120. package/dist/chunks/chunk-VNCW4C2Z.js.map +7 -0
  121. package/dist/chunks/chunk-W5EGGA44.js +15 -0
  122. package/dist/chunks/chunk-W5EGGA44.js.map +7 -0
  123. package/dist/chunks/chunk-XR2W3MAM.js +1533 -0
  124. package/dist/chunks/chunk-XR2W3MAM.js.map +7 -0
  125. package/dist/{chunk-STSX7GIX.js → chunks/chunk-YIO5EBMQ.js} +423 -377
  126. package/dist/chunks/chunk-YIO5EBMQ.js.map +7 -0
  127. package/dist/chunks/chunk-ZBVLKZ5V.js +1062 -0
  128. package/dist/chunks/chunk-ZBVLKZ5V.js.map +7 -0
  129. package/dist/{chunk-E6YNABER.js → chunks/chunk-ZCLTZIVP.js} +1 -4
  130. package/dist/chunks/chunk-ZCLTZIVP.js.map +7 -0
  131. package/dist/chunks/client-SILZNM5N.js +42 -0
  132. package/dist/{config-RUSD6G5Y.js → chunks/config-25HRTPSP.js} +48 -10
  133. package/dist/chunks/cost-tracker-Z2UZT2J5.js +28 -0
  134. package/dist/{customCommands-TOIJFZAL.js → chunks/customCommands-TYMYZRG5.js} +11 -8
  135. package/dist/chunks/engine-MRVF6FK6.js +39 -0
  136. package/dist/{env-XGKBLU3D.js → chunks/env-TJ5NOBEB.js} +7 -5
  137. package/dist/{kodeAgentSessionId-X6XWQW7B.js → chunks/kodeAgentSessionId-VTNISJ2L.js} +2 -4
  138. package/dist/chunks/kodeAgentSessionLoad-YB2RKBGJ.js +15 -0
  139. package/dist/chunks/kodeAgentSessionResume-DZSIVKVA.js +13 -0
  140. package/dist/chunks/kodeAgentStreamJson-X5PLS2S6.js +11 -0
  141. package/dist/{kodeAgentStreamJsonSession-UGEZJJEB.js → chunks/kodeAgentStreamJsonSession-RDXM4XYF.js} +38 -24
  142. package/dist/chunks/kodeAgentStreamJsonSession-RDXM4XYF.js.map +7 -0
  143. package/dist/{chunk-4RTX4AG4.js → chunks/kodeAgentStructuredStdio-SVGDSB4P.js} +14 -9
  144. package/dist/chunks/kodeAgentStructuredStdio-SVGDSB4P.js.map +7 -0
  145. package/dist/{kodeHooks-QWM36A3D.js → chunks/kodeHooks-RVKYRJHG.js} +11 -9
  146. package/dist/{llm-ZUQC4WYM.js → chunks/llm-62N6T5ZT.js} +1734 -1526
  147. package/dist/chunks/llm-62N6T5ZT.js.map +7 -0
  148. package/dist/chunks/llmLazy-ZUSSE3ZA.js +13 -0
  149. package/dist/{mentionProcessor-EE3XFHCJ.js → chunks/mentionProcessor-RJW5UPJD.js} +46 -16
  150. package/dist/chunks/mentionProcessor-RJW5UPJD.js.map +7 -0
  151. package/dist/{messages-EOYQKPGM.js → chunks/messages-EEWWLPHN.js} +2 -6
  152. package/dist/chunks/model-5TIEKQPD.js +37 -0
  153. package/dist/{openai-RRCWW33N.js → chunks/openai-XXK3YZG4.js} +13 -10
  154. package/dist/{outputStyles-62Q3VH2J.js → chunks/outputStyles-FAJTXN2A.js} +6 -9
  155. package/dist/chunks/permissions-HO7INPWM.js +27 -0
  156. package/dist/{pluginRuntime-6ETCZ2LL.js → chunks/pluginRuntime-C7K5ULK2.js} +31 -48
  157. package/dist/chunks/pluginRuntime-C7K5ULK2.js.map +7 -0
  158. package/dist/chunks/pluginValidation-DAM7WRTC.js +20 -0
  159. package/dist/chunks/registry-XYJXMOA5.js +60 -0
  160. package/dist/chunks/responsesStreaming-JNGE2P3D.js +8 -0
  161. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js +577 -0
  162. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js.map +7 -0
  163. package/dist/chunks/server-REXXF5IK.js +46 -0
  164. package/dist/{skillMarketplace-3RXQBVOL.js → chunks/skillMarketplace-N4HVHNST.js} +8 -6
  165. package/dist/chunks/src-OROQIWP3.js +44 -0
  166. package/dist/chunks/src-QXLGGMUW.js +1647 -0
  167. package/dist/chunks/src-QXLGGMUW.js.map +7 -0
  168. package/dist/{cli-DOPVY2CW.js → chunks/src-SSDT6MVP.js} +2659 -3384
  169. package/dist/chunks/src-SSDT6MVP.js.map +7 -0
  170. package/dist/chunks/theme-YBJUIMWK.js +10 -0
  171. package/dist/{toolPermissionContext-65L65VEZ.js → chunks/toolPermissionContext-MOCTRR7N.js} +2 -4
  172. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js +18 -0
  173. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js.map +7 -0
  174. package/dist/chunks/uuid-6577SO6X.js +7 -0
  175. package/dist/chunks/uuid-6577SO6X.js.map +7 -0
  176. package/dist/chunks/webOnlyMode-ALXX7UQY.js +66 -0
  177. package/dist/chunks/webOnlyMode-ALXX7UQY.js.map +7 -0
  178. package/dist/entrypoints/cli.js +10 -0
  179. package/dist/entrypoints/cli.js.map +7 -0
  180. package/dist/entrypoints/daemon.js +10 -0
  181. package/dist/entrypoints/daemon.js.map +7 -0
  182. package/dist/entrypoints/mcp.js +71 -0
  183. package/dist/entrypoints/mcp.js.map +7 -0
  184. package/dist/index.js +6 -7
  185. package/dist/index.js.map +3 -3
  186. package/dist/sdk/client.cjs +391 -0
  187. package/dist/sdk/client.cjs.map +7 -0
  188. package/dist/sdk/client.js +364 -0
  189. package/dist/sdk/client.js.map +7 -0
  190. package/dist/sdk/core.cjs +19932 -0
  191. package/dist/sdk/core.cjs.map +7 -0
  192. package/dist/sdk/core.js +19893 -0
  193. package/dist/sdk/core.js.map +7 -0
  194. package/dist/sdk/daemon-client.cjs +257 -0
  195. package/dist/sdk/daemon-client.cjs.map +7 -0
  196. package/dist/sdk/daemon-client.js +221 -0
  197. package/dist/sdk/daemon-client.js.map +7 -0
  198. package/dist/sdk/protocol.cjs +170 -0
  199. package/dist/sdk/protocol.cjs.map +7 -0
  200. package/dist/sdk/protocol.js +140 -0
  201. package/dist/sdk/protocol.js.map +7 -0
  202. package/dist/sdk/runtime-node.cjs +236 -0
  203. package/dist/sdk/runtime-node.cjs.map +7 -0
  204. package/dist/sdk/runtime-node.js +222 -0
  205. package/dist/sdk/runtime-node.js.map +7 -0
  206. package/dist/sdk/runtime.cjs +17 -0
  207. package/dist/sdk/runtime.cjs.map +7 -0
  208. package/dist/sdk/runtime.js +0 -0
  209. package/dist/sdk/runtime.js.map +7 -0
  210. package/dist/sdk/tools.cjs +30300 -0
  211. package/dist/sdk/tools.cjs.map +7 -0
  212. package/dist/sdk/tools.js +30282 -0
  213. package/dist/sdk/tools.js.map +7 -0
  214. package/dist/webui/assets/index-5hlfByVS.css +1 -0
  215. package/dist/webui/assets/index-BR9lm1lA.js +82 -0
  216. package/dist/webui/index.html +28 -0
  217. package/package.json +93 -22
  218. package/scripts/binary-utils.cjs +12 -4
  219. package/scripts/cli-acp-wrapper.cjs +3 -17
  220. package/scripts/cli-wrapper.cjs +5 -7
  221. package/scripts/postinstall.js +8 -4
  222. package/dist/REPL-CW7AYLVL.js +0 -42
  223. package/dist/acp-VEPJ74LT.js +0 -1357
  224. package/dist/acp-VEPJ74LT.js.map +0 -7
  225. package/dist/agentsValidate-7LH4HTNR.js.map +0 -7
  226. package/dist/ask-3NHFFUQG.js.map +0 -7
  227. package/dist/autoUpdater-ITPIHCOI.js +0 -17
  228. package/dist/chunk-3IN27HA5.js.map +0 -7
  229. package/dist/chunk-4FX3IVPT.js +0 -164
  230. package/dist/chunk-4FX3IVPT.js.map +0 -7
  231. package/dist/chunk-4RTX4AG4.js.map +0 -7
  232. package/dist/chunk-5PDP7R6N.js +0 -515
  233. package/dist/chunk-5PDP7R6N.js.map +0 -7
  234. package/dist/chunk-73WGVYLQ.js.map +0 -7
  235. package/dist/chunk-7M2YN6TU.js.map +0 -7
  236. package/dist/chunk-7U7L4NMD.js.map +0 -7
  237. package/dist/chunk-ABLVTESJ.js.map +0 -7
  238. package/dist/chunk-AFFSCMYS.js.map +0 -7
  239. package/dist/chunk-ARZSBOAO.js.map +0 -7
  240. package/dist/chunk-CIG63V4E.js +0 -72
  241. package/dist/chunk-CIG63V4E.js.map +0 -7
  242. package/dist/chunk-CM3EGTG6.js +0 -1609
  243. package/dist/chunk-CM3EGTG6.js.map +0 -7
  244. package/dist/chunk-DZE5YA7L.js.map +0 -7
  245. package/dist/chunk-E6YNABER.js.map +0 -7
  246. package/dist/chunk-EZXMVTDU.js.map +0 -7
  247. package/dist/chunk-F2SJXUDI.js +0 -148
  248. package/dist/chunk-F2SJXUDI.js.map +0 -7
  249. package/dist/chunk-FC5ZCKBI.js +0 -30167
  250. package/dist/chunk-FC5ZCKBI.js.map +0 -7
  251. package/dist/chunk-HCBELH4J.js +0 -145
  252. package/dist/chunk-HCBELH4J.js.map +0 -7
  253. package/dist/chunk-HN4E4UUQ.js.map +0 -7
  254. package/dist/chunk-IZVMU4S2.js +0 -654
  255. package/dist/chunk-IZVMU4S2.js.map +0 -7
  256. package/dist/chunk-K2CWOTI2.js.map +0 -7
  257. package/dist/chunk-LC4TVOCZ.js +0 -835
  258. package/dist/chunk-LC4TVOCZ.js.map +0 -7
  259. package/dist/chunk-MIW7N2MY.js +0 -2613
  260. package/dist/chunk-MIW7N2MY.js.map +0 -7
  261. package/dist/chunk-MWRSY4X6.js.map +0 -7
  262. package/dist/chunk-ND3XWFO6.js +0 -34
  263. package/dist/chunk-ND3XWFO6.js.map +0 -7
  264. package/dist/chunk-QVLYOPO5.js.map +0 -7
  265. package/dist/chunk-RZWOUA25.js.map +0 -7
  266. package/dist/chunk-S6HRABTA.js.map +0 -7
  267. package/dist/chunk-STSX7GIX.js.map +0 -7
  268. package/dist/chunk-UHYRLID6.js.map +0 -7
  269. package/dist/chunk-UKHTVRJM.js +0 -47
  270. package/dist/chunk-UKHTVRJM.js.map +0 -7
  271. package/dist/chunk-UYXEDKOZ.js +0 -24
  272. package/dist/chunk-UYXEDKOZ.js.map +0 -7
  273. package/dist/chunk-W7GRKO7Q.js.map +0 -7
  274. package/dist/chunk-WVHORZQ5.js +0 -17
  275. package/dist/chunk-WVHORZQ5.js.map +0 -7
  276. package/dist/chunk-WWUWDNWW.js +0 -49
  277. package/dist/chunk-WWUWDNWW.js.map +0 -7
  278. package/dist/chunk-YC6LJCDE.js.map +0 -7
  279. package/dist/chunk-YXYYDIMI.js +0 -2931
  280. package/dist/chunk-YXYYDIMI.js.map +0 -7
  281. package/dist/chunk-ZVDRDPII.js.map +0 -7
  282. package/dist/cli-DOPVY2CW.js.map +0 -7
  283. package/dist/commands-2BF2CJ3A.js +0 -46
  284. package/dist/context-6FXPETYH.js +0 -30
  285. package/dist/costTracker-6SL26FDB.js +0 -19
  286. package/dist/kodeAgentSessionLoad-MITZADPB.js +0 -18
  287. package/dist/kodeAgentSessionResume-GVRWB4WO.js +0 -16
  288. package/dist/kodeAgentStreamJson-NXFN7TXH.js +0 -13
  289. package/dist/kodeAgentStreamJsonSession-UGEZJJEB.js.map +0 -7
  290. package/dist/kodeAgentStructuredStdio-HGWJT7CU.js +0 -10
  291. package/dist/llm-ZUQC4WYM.js.map +0 -7
  292. package/dist/llmLazy-54QQHA54.js +0 -15
  293. package/dist/loader-FYHJQES5.js +0 -28
  294. package/dist/mcp-J332IKT3.js +0 -49
  295. package/dist/mentionProcessor-EE3XFHCJ.js.map +0 -7
  296. package/dist/model-FV3JDJKH.js +0 -30
  297. package/dist/pluginRuntime-6ETCZ2LL.js.map +0 -7
  298. package/dist/pluginValidation-I4YKUWGS.js +0 -17
  299. package/dist/prompts-ZLEKDD77.js +0 -48
  300. package/dist/query-VFRJPBGD.js +0 -50
  301. package/dist/responsesStreaming-AW344PQO.js +0 -10
  302. package/dist/ripgrep-3NTIKQYW.js +0 -17
  303. package/dist/state-P5G6CO5V.js +0 -16
  304. package/dist/theme-3LWP3BG7.js +0 -14
  305. package/dist/toolPermissionSettings-3ROBVTUK.js +0 -18
  306. package/dist/tools-RO7HSSE5.js +0 -47
  307. package/dist/userInput-JSBJRFSK.js +0 -311
  308. package/dist/userInput-JSBJRFSK.js.map +0 -7
  309. package/dist/uuid-QN2CNKKN.js +0 -9
  310. /package/dist/{REPL-CW7AYLVL.js.map → chunks/Doctor-M3J7GRTJ.js.map} +0 -0
  311. /package/dist/{autoUpdater-ITPIHCOI.js.map → chunks/REPL-RQ6LO6S7.js.map} +0 -0
  312. /package/dist/{chunk-JC6NCUG5.js.map → chunks/ResumeConversation-6DMVBEGH.js.map} +0 -0
  313. /package/dist/{commands-2BF2CJ3A.js.map → chunks/agentLoader-FCRG3TFJ.js.map} +0 -0
  314. /package/dist/{config-RUSD6G5Y.js.map → chunks/autoUpdater-CNESBOKO.js.map} +0 -0
  315. /package/dist/{context-6FXPETYH.js.map → chunks/chunk-4CRUCZR4.js.map} +0 -0
  316. /package/dist/{costTracker-6SL26FDB.js.map → chunks/chunk-54KOYG5C.js.map} +0 -0
  317. /package/dist/{customCommands-TOIJFZAL.js.map → chunks/chunk-GCQCAXJZ.js.map} +0 -0
  318. /package/dist/{env-XGKBLU3D.js.map → chunks/chunk-LB6TCPDI.js.map} +0 -0
  319. /package/dist/{kodeAgentSessionId-X6XWQW7B.js.map → chunks/client-SILZNM5N.js.map} +0 -0
  320. /package/dist/{kodeAgentSessionLoad-MITZADPB.js.map → chunks/config-25HRTPSP.js.map} +0 -0
  321. /package/dist/{kodeAgentSessionResume-GVRWB4WO.js.map → chunks/cost-tracker-Z2UZT2J5.js.map} +0 -0
  322. /package/dist/{kodeAgentStreamJson-NXFN7TXH.js.map → chunks/customCommands-TYMYZRG5.js.map} +0 -0
  323. /package/dist/{kodeAgentStructuredStdio-HGWJT7CU.js.map → chunks/engine-MRVF6FK6.js.map} +0 -0
  324. /package/dist/{kodeHooks-QWM36A3D.js.map → chunks/env-TJ5NOBEB.js.map} +0 -0
  325. /package/dist/{llmLazy-54QQHA54.js.map → chunks/kodeAgentSessionId-VTNISJ2L.js.map} +0 -0
  326. /package/dist/{loader-FYHJQES5.js.map → chunks/kodeAgentSessionLoad-YB2RKBGJ.js.map} +0 -0
  327. /package/dist/{mcp-J332IKT3.js.map → chunks/kodeAgentSessionResume-DZSIVKVA.js.map} +0 -0
  328. /package/dist/{messages-EOYQKPGM.js.map → chunks/kodeAgentStreamJson-X5PLS2S6.js.map} +0 -0
  329. /package/dist/{model-FV3JDJKH.js.map → chunks/kodeHooks-RVKYRJHG.js.map} +0 -0
  330. /package/dist/{openai-RRCWW33N.js.map → chunks/llmLazy-ZUSSE3ZA.js.map} +0 -0
  331. /package/dist/{outputStyles-62Q3VH2J.js.map → chunks/messages-EEWWLPHN.js.map} +0 -0
  332. /package/dist/{pluginValidation-I4YKUWGS.js.map → chunks/model-5TIEKQPD.js.map} +0 -0
  333. /package/dist/{prompts-ZLEKDD77.js.map → chunks/openai-XXK3YZG4.js.map} +0 -0
  334. /package/dist/{query-VFRJPBGD.js.map → chunks/outputStyles-FAJTXN2A.js.map} +0 -0
  335. /package/dist/{responsesStreaming-AW344PQO.js.map → chunks/permissions-HO7INPWM.js.map} +0 -0
  336. /package/dist/{ripgrep-3NTIKQYW.js.map → chunks/pluginValidation-DAM7WRTC.js.map} +0 -0
  337. /package/dist/{skillMarketplace-3RXQBVOL.js.map → chunks/registry-XYJXMOA5.js.map} +0 -0
  338. /package/dist/{state-P5G6CO5V.js.map → chunks/responsesStreaming-JNGE2P3D.js.map} +0 -0
  339. /package/dist/{theme-3LWP3BG7.js.map → chunks/server-REXXF5IK.js.map} +0 -0
  340. /package/dist/{toolPermissionContext-65L65VEZ.js.map → chunks/skillMarketplace-N4HVHNST.js.map} +0 -0
  341. /package/dist/{toolPermissionSettings-3ROBVTUK.js.map → chunks/src-OROQIWP3.js.map} +0 -0
  342. /package/dist/{tools-RO7HSSE5.js.map → chunks/theme-YBJUIMWK.js.map} +0 -0
  343. /package/dist/{uuid-QN2CNKKN.js.map → chunks/toolPermissionContext-MOCTRR7N.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../packages/tools/src/tools/interaction/AskUserQuestionTool/AskUserQuestionTool.tsx", "../../packages/core/src/constants/figures.ts", "../../packages/tools/src/tools/interaction/AskUserQuestionTool/prompt.ts", "../../packages/tools/src/tools/network/WebFetchTool/WebFetchTool.tsx", "../../packages/tools/src/tools/network/WebFetchTool/prompt.ts", "../../packages/tools/src/tools/network/WebFetchTool/htmlToMarkdown.ts", "../../packages/tools/src/tools/network/WebFetchTool/cache.ts", "../../packages/tools/src/tools/network/WebFetchTool/utils.ts", "../../packages/tools/src/tools/system/BashTool/BashTool.tsx", "../../packages/core/src/permissions/bashReadOnly.ts", "../../packages/tools/src/tools/system/BashTool/BashToolResultMessage.tsx", "../../packages/tools/src/tools/system/BashTool/OutputLine.tsx", "../../packages/tools/src/tools/system/BashTool/prompt.ts", "../../packages/tools/src/tools/system/BashTool/text.ts", "../../packages/core/src/sandbox/systemSandbox.ts", "../../packages/core/src/sandbox/destructiveCommandGuard.ts", "../../packages/tools/src/tools/system/BashTool/bashGateSimpleRules.ts", "../../packages/tools/src/tools/system/BashTool/bashGateRules.ts", "../../packages/tools/src/tools/system/BashTool/llmSafetyGateDump.ts", "../../packages/tools/src/tools/system/BashTool/llmSafetyGatePrompt.ts", "../../packages/tools/src/tools/system/BashTool/llmSafetyGateVerdict.ts", "../../packages/tools/src/tools/system/BashTool/llmSafetyGate.ts", "../../packages/protocol/src/commandSource.ts", "../../packages/tools/src/tools/system/BashTool/executeForeground.tsx", "../../packages/tools/src/tools/system/BashTool/BashToolRunInBackgroundOverlay.tsx", "../../packages/tools/src/tools/system/BashTool/utils.ts", "../../packages/core/src/sandbox/sandboxNetworkInfrastructure/httpProxy.ts", "../../packages/core/src/sandbox/sandboxNetworkInfrastructure/socks5Proxy.ts", "../../packages/core/src/sandbox/sandboxNetworkInfrastructure.ts", "../../packages/tools/src/tools/system/BashTool/sandboxNetwork.ts", "../../packages/tools/src/tools/system/BashTool/call.ts", "../../packages/tools/src/tools/interaction/PlanModeTool/EnterPlanModeTool.tsx", "../../packages/tools/src/tools/interaction/PlanModeTool/prompt.ts", "../../packages/tools/src/tools/interaction/PlanModeTool/ExitPlanModeTool.tsx", "../../packages/tools/src/tools/filesystem/NotebookEditTool/NotebookEditTool.tsx", "../../packages/runtime/src/file.ts", "../../packages/tools/src/tools/filesystem/NotebookEditTool/prompt.ts", "../../packages/tools/src/tools/filesystem/NotebookEditTool/cells.ts", "../../packages/tools/src/tools/filesystem/NotebookEditTool/editor.ts", "../../packages/tools/src/tools/filesystem/FileEditTool/FileEditTool.tsx", "../../packages/tools/src/tools/filesystem/FileEditTool/prompt.ts", "../../packages/tools/src/tools/filesystem/FileEditTool/utils.ts", "../../packages/core/src/utils/diff.ts", "../../packages/core/src/utils/paste.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/FileReadTool.tsx", "../../packages/tools/src/tools/filesystem/FileReadTool/prompt.ts", "../../packages/core/src/security/secureFile/service.ts", "../../packages/core/src/security/secureFile/operations.ts", "../../packages/core/src/security/secureFile/validators.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/highlight.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/constants.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/renderResultForAssistant.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/call.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/image.ts", "../../packages/tools/src/tools/filesystem/FileWriteTool/FileWriteTool.tsx", "../../packages/tools/src/tools/filesystem/FileWriteTool/prompt.ts", "../../packages/tools/src/tools/filesystem/GlobTool/GlobTool.tsx", "../../packages/tools/src/tools/filesystem/GlobTool/prompt.ts", "../../packages/tools/src/tools/search/GrepTool/GrepTool.tsx", "../../packages/tools/src/tools/search/GrepTool/prompt.ts", "../../packages/tools/src/tools/search/GrepTool/helpers.ts", "../../packages/tools/src/tools/search/GrepTool/execute.ts", "../../packages/tools/src/tools/interaction/SlashCommandTool/SlashCommandTool.tsx", "../../packages/tools/src/tools/interaction/SlashCommandTool/prompt.ts", "../../packages/tools/src/tools/interaction/SlashCommandTool/utils.ts", "../../packages/tools/src/tools/interaction/SkillTool/SkillTool.tsx", "../../packages/tools/src/tools/interaction/SkillTool/prompt.ts", "../../packages/core/src/utils/todoRenderModel.ts", "../../packages/core/src/utils/markdown.ts", "../../packages/core/src/utils/toolOutputDisplay.ts"],
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { BLACK_CIRCLE } from '#core/constants/figures'\nimport { Tool } from '#core/tooling/Tool'\nimport { getTheme } from '#core/utils/theme'\nimport { DESCRIPTION, PROMPT, TOOL_NAME_FOR_PROMPT } from './prompt'\n\nconst optionSchema = z.object({\n label: z.string(),\n description: z.string(),\n})\n\nconst questionSchema = z.object({\n question: z.string(),\n header: z.string(),\n options: z.array(optionSchema).min(2).max(4),\n multiSelect: z.boolean(),\n})\n\nconst inputSchema = z\n .strictObject({\n questions: z.array(questionSchema).min(1).max(4),\n // Compatibility: permission UI may populate this field.\n answers: z.record(z.string(), z.string()).optional(),\n })\n .refine(\n input => {\n const questionTexts = input.questions.map(q => q.question)\n if (questionTexts.length !== new Set(questionTexts).size) return false\n\n for (const question of input.questions) {\n const optionLabels = question.options.map(option => option.label)\n if (optionLabels.length !== new Set(optionLabels).size) return false\n }\n\n return true\n },\n {\n message:\n 'Question texts must be unique, option labels must be unique within each question',\n },\n )\n\ntype Input = z.infer<typeof inputSchema>\ntype Output = {\n questions: Input['questions']\n answers: Record<string, string>\n}\n\nexport const AskUserQuestionTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n userFacingName() {\n return ''\n },\n inputSchema,\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return true\n },\n requiresUserInteraction() {\n return true\n },\n async prompt() {\n return PROMPT\n },\n renderToolUseMessage() {\n return null\n },\n renderToolUseRejectedMessage() {\n const theme = getTheme()\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n <Text color={theme.text}>{BLACK_CIRCLE}&nbsp;</Text>\n <Text>User declined to answer questions</Text>\n </Box>\n )\n },\n renderToolResultMessage(output: Output, _options: { verbose: boolean }) {\n const theme = getTheme()\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\">\n <Text color={theme.text}>{BLACK_CIRCLE}&nbsp;</Text>\n <Text>User answered Kode Agent&apos;s questions:</Text>\n </Box>\n <Box flexDirection=\"column\" paddingLeft={2}>\n {Object.entries(output.answers).map(([question, answer]) => (\n <Box key={question}>\n <Text dimColor>\n \u00B7 {question} \u2192 {answer}\n </Text>\n </Box>\n ))}\n </Box>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n const formatted = Object.entries(output.answers)\n .map(([question, answer]) => `\"${question}\"=\"${answer}\"`)\n .join(', ')\n return `User has answered your questions: ${formatted}. You can now continue with the user's answers in mind.`\n },\n async *call({ questions, answers: prefilled }: Input) {\n const output: Output = { questions, answers: prefilled ?? {} }\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "import { env } from '#core/utils/env'\n\n// The former is better vertically aligned, but isn't usually supported on Windows/Linux\nexport const BLACK_CIRCLE = env.platform === 'macos' ? '\u23FA' : '\u25CF'\n", "export const TOOL_NAME_FOR_PROMPT = 'AskUserQuestion'\nexport const DESCRIPTION =\n 'Asks the user multiple choice questions to gather information, clarify ambiguity, understand preferences, make decisions or offer them choices.'\n\nexport const PROMPT = `Use this tool when you need to ask the user questions during execution. This allows you to:\n1. Gather user preferences or requirements\n2. Clarify ambiguous instructions\n3. Get decisions on implementation choices as you work\n4. Offer choices to the user about what direction to take.\n\nUsage notes:\n- Users will always be able to select \"Other\" to provide custom text input\n- Use multiSelect: true to allow multiple answers to be selected for a question\n- If you recommend a specific option, make that the first option in the list and add \"(Recommended)\" at the end of the label`\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { Tool, ToolUseContext } from '#core/tooling/Tool'\nimport { queryQuick } from '#core/ai/llmLazy'\nimport { PROMPT, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { convertHtmlToMarkdown } from './htmlToMarkdown'\nimport { urlCache } from './cache'\nimport {\n buildWebFetchApplyPrompt,\n createTimeoutSignal,\n extractTextFromMessageContent,\n fetchWithRedirectDetection,\n formatBytes,\n isMarkdownHost,\n normalizeUrl,\n readResponseTextLimited,\n truncateFetchedContent,\n} from './utils'\n\nconst inputSchema = z.strictObject({\n url: z.string().url().describe('The URL to fetch content from'),\n prompt: z.string().describe('The prompt to run on the fetched content'),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype Output = {\n bytes: number\n code: number\n codeText: string\n result: string\n durationMs: number\n url: string\n}\n\nconst FETCH_TIMEOUT_MS = 30_000\nconst MAX_URL_LENGTH = 2000\nconst MAX_RESPONSE_BYTES = 10 * 1024 * 1024 // 10485760\n\nexport const WebFetchTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description(input?: Input) {\n const url = input?.url\n try {\n return `Kode Agent wants to fetch content from ${new URL(url || '').hostname}`\n } catch {\n return 'Kode Agent wants to fetch content from this URL'\n }\n },\n userFacingName: () => 'Fetch',\n inputSchema,\n isReadOnly: () => true,\n isConcurrencySafe: () => true,\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return true\n },\n async prompt() {\n return PROMPT\n },\n async validateInput({ url }: Input) {\n if (url.length > MAX_URL_LENGTH) {\n return { result: false, message: 'Invalid URL', errorCode: 1 }\n }\n try {\n const parsed = new URL(url)\n if (parsed.username || parsed.password) {\n return { result: false, message: 'Invalid URL', errorCode: 1 }\n }\n if (parsed.hostname.split('.').length < 2) {\n return { result: false, message: 'Invalid URL', errorCode: 1 }\n }\n } catch {\n return {\n result: false,\n message: `Error: Invalid URL \"${url}\". The URL provided could not be parsed.`,\n errorCode: 1,\n }\n }\n return { result: true }\n },\n renderToolUseMessage(\n { url, prompt }: Input,\n { verbose }: { verbose: boolean },\n ) {\n if (verbose) {\n return `url: \"${url}\"${prompt ? `, prompt: \"${prompt}\"` : ''}`\n }\n return url\n },\n renderToolResultMessage(output: Output) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;Received </Text>\n <Text bold>{formatBytes(output.bytes)} </Text>\n <Text>\n ({output.code} {output.codeText})\n </Text>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return output.result\n },\n async *call({ url, prompt }: Input, context: ToolUseContext) {\n const normalizedUrl = normalizeUrl(url)\n const start = Date.now()\n\n const timeoutSignal = createTimeoutSignal(\n context.abortController.signal,\n FETCH_TIMEOUT_MS,\n )\n\n try {\n const cached = urlCache.get(normalizedUrl)\n\n const fetched = cached\n ? null\n : await fetchWithRedirectDetection(normalizedUrl, timeoutSignal.signal)\n\n if (fetched && fetched.type === 'redirect') {\n const codeText =\n fetched.statusCode === 301\n ? 'Moved Permanently'\n : fetched.statusCode === 308\n ? 'Permanent Redirect'\n : fetched.statusCode === 307\n ? 'Temporary Redirect'\n : 'Found'\n\n const result = `REDIRECT DETECTED: The URL redirects to a different host.\n\nOriginal URL: ${fetched.originalUrl}\nRedirect URL: ${fetched.redirectUrl}\nStatus: ${fetched.statusCode} ${codeText}\n\nTo complete your request, I need to fetch content from the redirected URL. Please use WebFetch again with these parameters:\n- url: \"${fetched.redirectUrl}\"\n- prompt: \"${prompt}\"`\n\n const output: Output = {\n bytes: Buffer.byteLength(result, 'utf8'),\n code: fetched.statusCode,\n codeText,\n result,\n durationMs: Date.now() - start,\n url: normalizedUrl,\n }\n yield {\n type: 'result' as const,\n resultForAssistant: this.renderResultForAssistant(output),\n data: output,\n }\n return\n }\n\n let bytes = cached ? cached.bytes : 0\n let code = cached ? cached.code : 200\n let codeText = cached ? cached.codeText : 'OK'\n let markdown = cached ? cached.content : ''\n let contentType = cached ? cached.contentType : ''\n\n if (fetched && fetched.type === 'response') {\n const response = fetched.response\n\n code = response.status\n codeText = response.statusText || 'OK'\n\n contentType = response.headers.get('content-type') || ''\n\n const { text: raw, bytes: responseBytes } =\n await readResponseTextLimited(response, MAX_RESPONSE_BYTES)\n bytes = responseBytes\n\n const converted = contentType.toLowerCase().includes('text/html')\n ? convertHtmlToMarkdown(raw)\n : raw\n markdown = truncateFetchedContent(converted)\n urlCache.set(normalizedUrl, {\n bytes,\n code,\n codeText,\n content: markdown,\n contentType,\n })\n }\n\n const allowBroaderQuoting = isMarkdownHost(normalizedUrl, contentType)\n const userPrompt = buildWebFetchApplyPrompt(\n markdown,\n prompt,\n allowBroaderQuoting,\n )\n const aiResponse = await queryQuick({\n systemPrompt: [],\n userPrompt,\n enablePromptCaching: false,\n signal: timeoutSignal.signal,\n })\n\n const extracted = extractTextFromMessageContent(\n aiResponse.message.content as unknown,\n )\n const result = extracted ?? 'No response from model'\n\n const output: Output = {\n bytes,\n code,\n codeText,\n result,\n durationMs: Date.now() - start,\n url: normalizedUrl,\n }\n\n yield {\n type: 'result' as const,\n resultForAssistant: this.renderResultForAssistant(output),\n data: output,\n }\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error)\n const output: Output = {\n bytes: 0,\n code: 0,\n codeText: '',\n result: `Error processing URL ${normalizedUrl}: ${message}`,\n durationMs: Date.now() - start,\n url: normalizedUrl,\n }\n yield {\n type: 'result' as const,\n resultForAssistant: this.renderResultForAssistant(output),\n data: output,\n }\n } finally {\n timeoutSignal.cleanup()\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME_FOR_PROMPT = 'WebFetch'\nexport const PROMPT = `\n- Fetches content from a specified URL and processes it using an AI model\n- Takes a URL and a prompt as input\n- Fetches the URL content, converts HTML to markdown\n- Processes the content with the prompt using a small, fast model\n- Returns the model's response about the content\n- Use this tool when you need to retrieve and analyze web content\n\nUsage notes:\n - IMPORTANT: If an MCP-provided web fetch tool is available, prefer using that tool instead of this one, as it may have fewer restrictions.\n - The URL must be a fully-formed valid URL\n - HTTP URLs will be automatically upgraded to HTTPS\n - The prompt should describe what information you want to extract from the page\n - This tool is read-only and does not modify any files\n - Results may be summarized if the content is very large\n - Includes a self-cleaning 15-minute cache for faster responses when repeatedly accessing the same URL\n - When a URL redirects to a different host, the tool will inform you and provide the redirect URL in a special format. You should then make a new WebFetch request with the redirect URL to fetch the content.\n`.trim()\n", "import TurndownService from 'turndown'\n\nconst turndownService = new TurndownService({\n headingStyle: 'atx',\n hr: '---',\n bulletListMarker: '-',\n codeBlockStyle: 'fenced',\n fence: '```',\n emDelimiter: '_',\n strongDelimiter: '**',\n})\n\n// Configure rules to handle common HTML elements\nturndownService.addRule('removeScripts', {\n filter: ['script', 'style', 'noscript'],\n replacement: () => '',\n})\n\nturndownService.addRule('removeComments', {\n filter: node => node.nodeType === 8, // Comment nodes\n replacement: () => '',\n})\n\nturndownService.addRule('cleanLinks', {\n filter: 'a',\n replacement: (content, node) => {\n const href = node.getAttribute('href')\n if (!href || href.startsWith('javascript:') || href.startsWith('#')) {\n return content\n }\n return `[${content}](${href})`\n },\n})\n\nexport function convertHtmlToMarkdown(html: string): string {\n try {\n // Clean up the HTML before conversion\n const cleanHtml = html\n .replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '') // Remove script tags\n .replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '') // Remove style tags\n .replace(/<!--[\\s\\S]*?-->/g, '') // Remove HTML comments\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n\n const markdown = turndownService.turndown(cleanHtml)\n\n // Clean up the resulting markdown\n return markdown\n .replace(/\\n{3,}/g, '\\n\\n') // Remove excessive line breaks\n .replace(/^\\s+|\\s+$/gm, '') // Remove leading/trailing spaces on each line\n .trim()\n } catch (error) {\n throw new Error(\n `Failed to convert HTML to markdown: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n}\n", "interface CacheEntry {\n bytes: number\n code: number\n codeText: string\n content: string\n contentType: string\n timestamp: number\n}\n\nclass URLCache {\n private cache = new Map<string, CacheEntry>()\n private readonly CACHE_DURATION = 15 * 60 * 1000 // 15 minutes in milliseconds\n\n set(url: string, entry: Omit<CacheEntry, 'timestamp'>): void {\n this.cache.set(url, {\n ...entry,\n timestamp: Date.now(),\n })\n }\n\n get(url: string): CacheEntry | null {\n const entry = this.cache.get(url)\n if (!entry) {\n return null\n }\n\n // Check if entry has expired\n if (Date.now() - entry.timestamp > this.CACHE_DURATION) {\n this.cache.delete(url)\n return null\n }\n\n return entry\n }\n\n clear(): void {\n this.cache.clear()\n }\n\n // Clean expired entries\n private cleanExpired(): void {\n const now = Date.now()\n for (const [url, entry] of this.cache.entries()) {\n if (now - entry.timestamp > this.CACHE_DURATION) {\n this.cache.delete(url)\n }\n }\n }\n\n // Auto-clean expired entries every 5 minutes\n constructor() {\n setInterval(\n () => {\n this.cleanExpired()\n },\n 5 * 60 * 1000,\n ) // 5 minutes\n }\n}\n\n// Export singleton instance\nexport const urlCache = new URLCache()\n", "const MAX_CONTENT_CHARS = 100_000\n\ntype TextContentBlock = { type: 'text'; text: string }\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\n\nfunction isTextContentBlock(block: unknown): block is TextContentBlock {\n const record = asRecord(block)\n if (!record) return false\n return record.type === 'text' && typeof record.text === 'string'\n}\n\nexport function extractTextFromMessageContent(content: unknown): string | null {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return null\n const textBlock = content.find(isTextContentBlock)\n return textBlock ? textBlock.text : null\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes)) return `${bytes}B`\n if (bytes < 1024) return `${Math.max(0, Math.round(bytes))}B`\n const units = ['KB', 'MB', 'GB', 'TB'] as const\n let value = bytes / 1024\n let unitIndex = 0\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024\n unitIndex++\n }\n const rounded = Math.round(value * 10) / 10\n return `${rounded}${units[unitIndex]}`\n}\n\nexport function normalizeUrl(url: string): string {\n if (url.startsWith('http://')) {\n return url.replace('http://', 'https://')\n }\n return url\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.replace(/^www\\./i, '').toLowerCase()\n}\n\nfunction isSameHost(originalUrl: string, redirectUrl: string): boolean {\n try {\n const original = new URL(originalUrl)\n const redirect = new URL(redirectUrl)\n if (redirect.protocol !== original.protocol) return false\n if (redirect.port !== original.port) return false\n if (redirect.username || redirect.password) return false\n return (\n normalizeHostname(original.hostname) ===\n normalizeHostname(redirect.hostname)\n )\n } catch {\n return false\n }\n}\n\nexport function createTimeoutSignal(\n parent: AbortSignal,\n timeoutMs: number,\n): {\n signal: AbortSignal\n cleanup: () => void\n} {\n const controller = new AbortController()\n const onAbort = () => controller.abort()\n if (parent.aborted) {\n controller.abort()\n } else {\n parent.addEventListener('abort', onAbort, { once: true })\n }\n const timeout = setTimeout(() => controller.abort(), timeoutMs)\n return {\n signal: controller.signal,\n cleanup: () => {\n clearTimeout(timeout)\n parent.removeEventListener('abort', onAbort)\n },\n }\n}\n\nexport async function readResponseTextLimited(\n response: Response,\n maxBytes: number,\n): Promise<{ text: string; bytes: number }> {\n if (!response.body) return { text: '', bytes: 0 }\n const reader = response.body.getReader()\n const chunks: Uint8Array[] = []\n let bytes = 0\n try {\n while (true) {\n const { value, done } = await reader.read()\n if (done) break\n if (!value) continue\n bytes += value.byteLength\n if (bytes > maxBytes) {\n try {\n await reader.cancel()\n } catch {\n // ignore\n }\n throw new Error(\n `Response exceeded maximum allowed size (${maxBytes} bytes)`,\n )\n }\n chunks.push(value)\n }\n } finally {\n try {\n reader.releaseLock()\n } catch {\n // ignore\n }\n }\n\n const buffer = Buffer.concat(chunks.map(chunk => Buffer.from(chunk)))\n return { text: buffer.toString('utf-8'), bytes }\n}\n\nexport function truncateFetchedContent(content: string): string {\n if (content.length <= MAX_CONTENT_CHARS) return content\n return `${content.substring(0, MAX_CONTENT_CHARS)}...[content truncated]`\n}\n\nexport function isMarkdownHost(url: string, contentType: string): boolean {\n const lowerContentType = contentType.toLowerCase()\n if (lowerContentType.includes('text/markdown')) return true\n try {\n const parsed = new URL(url)\n const host = parsed.hostname.toLowerCase()\n if (\n host === 'raw.githubusercontent.com' ||\n host === 'gist.githubusercontent.com' ||\n host === 'modelcontextprotocol.io' ||\n host === 'github.com'\n ) {\n return true\n }\n const pathname = parsed.pathname.toLowerCase()\n return pathname.endsWith('.md') || pathname.endsWith('.markdown')\n } catch {\n return false\n }\n}\n\nexport function buildWebFetchApplyPrompt(\n content: string,\n prompt: string,\n allowBroaderQuoting: boolean,\n): string {\n return `\nWeb page content:\n---\n${content}\n---\n\n${prompt}\n\n${\n allowBroaderQuoting\n ? 'Provide a concise response based on the content above. Include relevant details, code examples, and documentation excerpts as needed.'\n : `Provide a concise response based only on the content above. In your response:\n - Enforce a strict 125-character maximum for quotes from any source document. Open Source Software is ok as long as we respect the license.\n - Use quotation marks for exact language from articles; any language outside of the quotation should never be word-for-word the same.\n - You are not a lawyer and never comment on the legality of your own prompts and responses.\n - Never produce or reproduce exact song lyrics.`\n}\n`\n}\n\nexport async function fetchWithRedirectDetection(\n url: string,\n signal: AbortSignal,\n): Promise<\n | {\n type: 'redirect'\n originalUrl: string\n redirectUrl: string\n statusCode: number\n }\n | { type: 'response'; response: Response; finalUrl: string }\n> {\n let current = url\n for (let i = 0; i < 10; i++) {\n const response = await fetch(current, {\n method: 'GET',\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; WebFetch/1.0)',\n Accept: 'text/markdown, text/html, */*',\n 'Accept-Language': 'en-US,en;q=0.5',\n },\n signal,\n redirect: 'manual',\n })\n\n if ([301, 302, 307, 308].includes(response.status)) {\n const location = response.headers.get('location')\n if (!location) {\n return { type: 'response', response, finalUrl: current }\n }\n const redirectUrl = new URL(location, current).toString()\n if (isSameHost(current, redirectUrl)) {\n current = redirectUrl\n continue\n }\n return {\n type: 'redirect',\n originalUrl: url,\n redirectUrl,\n statusCode: response.status,\n }\n }\n\n return { type: 'response', response, finalUrl: current }\n }\n\n const response = await fetch(current, { signal })\n return { type: 'response', response, finalUrl: current }\n}\n", "import { EOL } from 'os'\nimport { isAbsolute, relative, resolve } from 'path'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { PRODUCT_NAME } from '#core/constants/product'\nimport { Tool, ValidationResult, ToolUseContext } from '#core/tooling/Tool'\nimport { splitCommand } from '#core/utils/commands'\nimport { isInDirectory } from '#core/utils/file'\nimport { getBunShellSandboxPlan } from '#core/utils/sandbox/bunShellSandboxPlan'\nimport { getCwd, getOriginalCwd } from '#core/utils/state'\nimport { isBashCommandReadOnly } from '#core/utils/permissions/bashReadOnly'\nimport { getTaskOutputFilePath } from '#runtime/taskOutputStore'\nimport BashToolResultMessage from './BashToolResultMessage'\nimport { DEFAULT_TIMEOUT_MS, getBashToolPrompt } from './prompt'\nimport { formatDuration } from './text'\nimport { callBashTool } from './call'\n\nexport const inputSchema = z.strictObject({\n command: z.string().describe('The command to execute'),\n timeout: z\n .number()\n .optional()\n .describe('Optional timeout in milliseconds (max 600000)'),\n description: z\n .string()\n .optional()\n .describe(\n `Clear, concise description of what this command does in 5-10 words, in active voice. Examples:\nInput: ls\nOutput: List files in current directory\n\nInput: git status\nOutput: Show working tree status\n\nInput: npm install\nOutput: Install package dependencies\n\nInput: mkdir foo\nOutput: Create directory 'foo'`,\n ),\n run_in_background: z\n .boolean()\n .optional()\n .describe(\n 'Set to true to run this command in the background. Use TaskOutput to read the output later.',\n ),\n dangerouslyDisableSandbox: z\n .boolean()\n .optional()\n .describe(\n 'Set this to true to dangerously override sandbox mode and run commands without sandboxing.',\n ),\n})\n\ntype In = typeof inputSchema\nexport type Out = {\n stdout: string\n stdoutLines: number // Total number of lines in original stdout, even if `stdout` is now truncated\n stderr: string\n stderrLines: number // Total number of lines in original stderr, even if `stderr` is now truncated\n interrupted: boolean\n bashId?: string\n backgroundTaskId?: string\n}\n\nexport const BashTool = {\n name: 'Bash',\n cachedDescription: 'Run shell command',\n async description(input?: z.infer<typeof inputSchema>) {\n return input?.description || 'Run shell command'\n },\n async prompt() {\n return getBashToolPrompt()\n },\n isReadOnly(input?: z.infer<typeof inputSchema>) {\n if (!input || typeof input.command !== 'string') return false\n return isBashCommandReadOnly(input.command)\n },\n isConcurrencySafe(input?: z.infer<typeof inputSchema>) {\n // Reference CLI parity: isConcurrencySafe(input) === isReadOnly(input)\n return this.isReadOnly(input)\n },\n inputSchema,\n userFacingName(input?: z.infer<typeof inputSchema>) {\n if (!input) return 'Bash'\n\n const raw =\n process.env.KODE_BASH_SANDBOX_SHOW_INDICATOR ??\n process.env.CLAUDE_CODE_BASH_SANDBOX_SHOW_INDICATOR\n // Reference CLI parity: only explicit truthy values enable the indicator (F0 in cli.js).\n const showIndicator = raw\n ? ['1', 'true', 'yes', 'on'].includes(raw.trim().toLowerCase())\n : false\n if (!showIndicator) return 'Bash'\n\n const plan = getBunShellSandboxPlan({\n command: input.command,\n dangerouslyDisableSandbox: input.dangerouslyDisableSandbox === true,\n })\n return plan.willSandbox ? 'SandboxedBash' : 'Bash'\n },\n async isEnabled() {\n return true\n },\n needsPermissions(): boolean {\n // Always check per-project permissions for BashTool\n return true\n },\n async validateInput(\n { command, timeout, dangerouslyDisableSandbox },\n context?: ToolUseContext,\n ): Promise<ValidationResult> {\n if (timeout !== undefined) {\n if (!Number.isFinite(timeout) || timeout < 0) {\n return {\n result: false,\n message: `Invalid timeout: ${timeout}. Timeout must be a non-negative number of milliseconds.`,\n }\n }\n if (timeout > 600_000) {\n return {\n result: false,\n message: `Invalid timeout: ${timeout}. Maximum allowed timeout is 600000ms.`,\n }\n }\n }\n\n const source = context?.commandSource ?? 'agent_call'\n const isUserMode = source === 'user_bash_mode'\n const safeMode = Boolean(context?.safeMode ?? context?.options?.safeMode)\n\n if (\n dangerouslyDisableSandbox === true &&\n safeMode &&\n source === 'agent_call'\n ) {\n return {\n result: false,\n message: 'Sandbox cannot be disabled while safe mode is enabled.',\n }\n }\n const commands = splitCommand(command)\n\n for (const cmd of commands) {\n const parts = cmd.split(' ')\n const baseCmd = parts[0]\n\n // Special handling for cd command\n if (baseCmd === 'cd' && parts[1]) {\n // In user bash mode, allow cd to any directory\n if (isUserMode) {\n continue\n }\n\n // In agent mode, restrict cd to child directories of original working directory\n const targetDir = parts[1]!.replace(/^['\"]|['\"]$/g, '') // Remove quotes if present\n const fullTargetDir = isAbsolute(targetDir)\n ? targetDir\n : resolve(getCwd(), targetDir)\n if (\n !isInDirectory(\n relative(getOriginalCwd(), fullTargetDir),\n relative(getCwd(), getOriginalCwd()),\n )\n ) {\n return {\n result: false,\n message: `ERROR: cd to '${fullTargetDir}' was blocked. For security, ${PRODUCT_NAME} may only change directories to child directories of the original working directory (${getOriginalCwd()}) for this session.`,\n }\n }\n }\n }\n\n return { result: true }\n },\n renderToolUseMessage(\n { command, run_in_background, description, timeout },\n options?: { verbose: boolean },\n ) {\n // Optional: show the command description in verbose mode.\n const verbose = Boolean(options?.verbose)\n const trimmedDescription = (description?.trim() || '').trim()\n const effectiveTimeout = timeout ?? DEFAULT_TIMEOUT_MS\n const timeoutSuffix = ` (timeout=${formatDuration(effectiveTimeout)})`\n const bgSuffix = run_in_background ? ' [background]' : ''\n const withDescription = (base: string): string => {\n if (!verbose || !trimmedDescription) return base\n const maxLen = 160\n const shown =\n trimmedDescription.length > maxLen\n ? `${trimmedDescription.slice(0, maxLen - 1)}\u2026`\n : trimmedDescription\n return `${base} \u2014 ${shown}`\n }\n\n // Clean up any command that uses the quoted HEREDOC pattern\n if (command.includes(\"\\\"$(cat <<'EOF'\")) {\n const match = command.match(\n /^(.*?)\"?\\$\\(cat <<'EOF'\\n([\\s\\S]*?)\\n\\s*EOF\\n\\s*\\)\"(.*)$/,\n )\n if (match && match[1] && match[2]) {\n const prefix = match[1]\n const content = match[2]\n const suffix = match[3] || ''\n const cleaned = `${prefix.trim()} \"${content.trim()}\"${suffix.trim()}`\n const base = `${cleaned}${bgSuffix}${timeoutSuffix}`\n return withDescription(base.trim())\n }\n }\n\n const base = `${command}${bgSuffix}${timeoutSuffix}`\n return withDescription(base.trim())\n },\n renderToolUseRejectedMessage() {\n return null\n },\n\n renderToolResultMessage(content) {\n return <BashToolResultMessage content={content} verbose={false} />\n },\n renderResultForAssistant({\n interrupted,\n stdout,\n stderr,\n bashId,\n backgroundTaskId,\n }) {\n let trimmedStdout = stdout\n if (trimmedStdout) {\n trimmedStdout = trimmedStdout.replace(/^(\\s*\\n)+/, '')\n trimmedStdout = trimmedStdout.trimEnd()\n }\n\n let trimmedStderr = stderr.trim()\n if (interrupted) {\n if (trimmedStderr) trimmedStderr += EOL\n trimmedStderr += '<error>Command was aborted before completion</error>'\n }\n\n const id = backgroundTaskId ?? bashId\n const backgroundLine = id\n ? `Command running in background with ID: ${id}. Output is being written to: ${getTaskOutputFilePath(id)}`\n : ''\n\n return [trimmedStdout, trimmedStderr, backgroundLine]\n .filter(Boolean)\n .join('\\n')\n },\n async *call(\n {\n command,\n timeout,\n run_in_background,\n dangerouslyDisableSandbox,\n description,\n },\n context: ToolUseContext,\n ) {\n const effectiveTimeout =\n typeof timeout === 'number' ? timeout : DEFAULT_TIMEOUT_MS\n yield* callBashTool(\n {\n command,\n timeout: effectiveTimeout,\n run_in_background,\n dangerouslyDisableSandbox,\n description,\n },\n context,\n output => this.renderResultForAssistant(output),\n )\n },\n} satisfies Tool<In, Out>\n", "import { splitBashCommandIntoSubcommands, xi } from './bashToolPermissionEngine'\n\n// Reference CLI parity: l02/A25/tB5 read-only allowlist (reduced, conservative subset).\n// Goal: classify truly read-only commands as concurrency-safe and plan-mode-safe.\nconst READ_ONLY_PATTERNS: RegExp[] = [\n /^pwd$/,\n /^whoami$/,\n /^ls(?:\\s|$)[^<>()$`|{}&;>\\n\\r]*$/,\n /^cat(?:\\s|$)[^<>()$`|{}&;>\\n\\r]*$/,\n /^git status(?:\\s|$)[^<>()$`|{}&;>\\n\\r]*$/,\n /^git diff(?:\\s|$)[^<>()$`|{}&;>\\n\\r]*$/,\n /^git log(?:\\s|$)[^<>()$`|{}&;>\\n\\r]*$/,\n /^git show(?:\\s|$)[^<>()$`|{}&;>\\n\\r]*$/,\n]\n\nfunction isReadOnlySubcommand(command: string): boolean {\n const trimmed = command.trim()\n if (!trimmed) return false\n\n // Reference CLI parity: l02 requires xi(...) === passthrough (security checks).\n if (xi(trimmed).behavior !== 'passthrough') return false\n\n // Reference CLI parity: A25 blocks certain git flags even if command matches allowlist.\n if (trimmed.includes('git')) {\n if (/\\\\s-c[\\\\s=]/.test(trimmed)) return false\n if (/\\\\s--exec-path[\\\\s=]/.test(trimmed)) return false\n if (/\\\\s--config-env[\\\\s=]/.test(trimmed)) return false\n }\n\n return READ_ONLY_PATTERNS.some(re => re.test(trimmed))\n}\n\nexport function isBashCommandReadOnly(command: string): boolean {\n const trimmed = command.trim()\n if (!trimmed) return false\n\n let subcommands: string[] = []\n try {\n // Conservative: pipes/&&/||/;/newlines create multiple subcommands => not read-only.\n subcommands = splitBashCommandIntoSubcommands(trimmed)\n } catch {\n return false\n }\n\n if (subcommands.length !== 1) return false\n return isReadOnlySubcommand(subcommands[0] ?? '')\n}\n", "import { Box, Text } from 'ink'\nimport { OutputLine } from './OutputLine'\nimport React from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { Out as BashOut } from './BashTool'\n\ntype Props = {\n content: Omit<BashOut, 'interrupted'>\n verbose: boolean\n}\n\nfunction BashToolResultMessage({ content, verbose }: Props): React.JSX.Element {\n const { stdout, stdoutLines, stderr, stderrLines, bashId } = content\n\n return (\n <Box flexDirection=\"column\">\n {bashId ? (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={getTheme().secondaryText}>\n Background bash_id: {bashId}\n </Text>\n </Box>\n ) : null}\n {stdout !== '' ? (\n <OutputLine content={stdout} lines={stdoutLines} verbose={verbose} />\n ) : null}\n {stderr !== '' ? (\n <OutputLine\n content={stderr}\n lines={stderrLines}\n verbose={verbose}\n isError\n />\n ) : null}\n {stdout === '' && stderr === '' ? (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={getTheme().secondaryText}>(No content)</Text>\n </Box>\n ) : null}\n </Box>\n )\n}\n\nexport default BashToolResultMessage\n", "import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport { MAX_RENDERED_LINES } from './prompt'\nimport chalk from 'chalk'\n\nfunction renderTruncatedContent(content: string, totalLines: number): string {\n const allLines = content.split('\\n')\n if (allLines.length <= MAX_RENDERED_LINES) {\n return allLines.join('\\n')\n }\n\n // Show last N lines of output by default\n const lastLines = allLines.slice(-MAX_RENDERED_LINES)\n return [\n chalk.grey(\n `Showing last ${MAX_RENDERED_LINES} lines of ${totalLines} total lines`,\n ),\n ...lastLines,\n ].join('\\n')\n}\n\nexport function OutputLine({\n content,\n lines,\n verbose,\n isError,\n}: {\n content: string\n lines: number\n verbose: boolean\n isError?: boolean\n key?: React.Key\n}) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Box flexDirection=\"column\">\n <Text color={isError ? getTheme().error : undefined}>\n {verbose\n ? content.trim()\n : renderTruncatedContent(content.trim(), lines)}\n </Text>\n </Box>\n </Box>\n </Box>\n )\n}\n", "import {\n loadMergedSettings,\n normalizeSandboxRuntimeConfigFromSettings,\n} from '#core/utils/sandbox/sandboxConfig'\n\nexport const DEFAULT_TIMEOUT_MS = 120000\nexport const MAX_TIMEOUT_MS = 600000\nexport const MAX_OUTPUT_LENGTH = 30000\nexport const MAX_RENDERED_LINES = 5\n\nconst PROJECT_URL = 'https://github.com/shareAI-lab/kode'\nconst DEFAULT_CO_AUTHOR = 'ShareAI Lab'\n\nconst TOOL_NAME_BASH = 'Bash'\nconst TOOL_NAME_GLOB = 'Glob'\nconst TOOL_NAME_GREP = 'Grep'\nconst TOOL_NAME_READ = 'Read'\nconst TOOL_NAME_EDIT = 'Edit'\nconst TOOL_NAME_WRITE = 'Write'\nconst TOOL_NAME_TASK = 'Task'\n\nfunction isExperimentalMcpCliEnabled(): boolean {\n const value = process.env.ENABLE_EXPERIMENTAL_MCP_CLI\n if (!value) return false\n return ['1', 'true', 'yes', 'on'].includes(String(value).trim().toLowerCase())\n}\n\nfunction indentJsonForPrompt(value: unknown): string {\n return JSON.stringify(value, null, 2).split('\\n').join('\\n ')\n}\n\nfunction getAttribution(): { commit: string; pr: string } {\n const pr = `\uD83E\uDD16 Generated with [Kode Agent](${PROJECT_URL})`\n const commit = `${pr}\\n\\n Co-Authored-By: ${DEFAULT_CO_AUTHOR} <ai-lab@foxmail.com>`\n return { commit, pr }\n}\n\nfunction getBashSandboxPrompt(): string {\n const settings = loadMergedSettings()\n if (settings.sandbox?.enabled !== true) return ''\n\n const runtimeConfig = normalizeSandboxRuntimeConfigFromSettings(settings)\n\n const fsReadConfig = { denyOnly: runtimeConfig.filesystem.denyRead }\n const fsWriteConfig = {\n allowOnly: runtimeConfig.filesystem.allowWrite,\n denyWithinAllow: runtimeConfig.filesystem.denyWrite,\n }\n\n const filesystem = { read: fsReadConfig, write: fsWriteConfig }\n\n const allowUnixSockets =\n runtimeConfig.network.allowAllUnixSockets === true\n ? true\n : runtimeConfig.network.allowUnixSockets.length > 0\n ? runtimeConfig.network.allowUnixSockets\n : undefined\n\n const network = {\n ...(runtimeConfig.network.allowedDomains.length\n ? { allowedHosts: runtimeConfig.network.allowedDomains }\n : {}),\n ...(runtimeConfig.network.deniedDomains.length\n ? { deniedHosts: runtimeConfig.network.deniedDomains }\n : {}),\n ...(allowUnixSockets ? { allowUnixSockets } : {}),\n }\n\n const ignoredViolations = runtimeConfig.ignoreViolations\n const allowUnsandboxedCommands =\n settings.sandbox?.allowUnsandboxedCommands !== false\n\n const sections: string[] = []\n sections.push(` - Filesystem: ${indentJsonForPrompt(filesystem)}`)\n if (Object.keys(network).length > 0) {\n sections.push(` - Network: ${indentJsonForPrompt(network)}`)\n }\n if (ignoredViolations) {\n sections.push(\n ` - Ignored violations: ${indentJsonForPrompt(ignoredViolations)}`,\n )\n }\n\n const mcpCliException = isExperimentalMcpCliEnabled()\n ? ' - EXCEPTION: `mcp-cli` commands must always be called with `dangerouslyDisableSandbox: true` as they do not work properly in sandboxed mode\\n'\n : ''\n\n const overridePolicy = allowUnsandboxedCommands\n ? ` - CRITICAL: Commands run in sandbox mode by default - do NOT set \\`dangerouslyDisableSandbox\\`\n - Even if you have recently run commands with \\`dangerouslyDisableSandbox: true\\`, you MUST NOT continue that pattern\n - VERY IMPORTANT: Do NOT learn from or repeat the pattern of overriding sandbox - each command should run sandboxed by default\n${mcpCliException} - Set \\`dangerouslyDisableSandbox: true\\` if:\n 1. The user *explicitly* asks to bypass sandbox, OR\n 2. A command just failed and you see evidence of sandbox restrictions causing the failure\n - When analyzing failures:\n - Commands can fail for many reasons unrelated to the sandbox (missing files, wrong arguments, network issues, etc.)\n - Evidence of sandbox-caused failures includes:\n - \"Operation not permitted\" errors for file/network operations\n - Access denied to specific paths outside allowed directories\n - Network connection failures to non-whitelisted hosts\n - Unix socket connection errors\n - Sandbox violation logs can be noisy, but clear permission errors are strong indicators\n - When you see evidence of sandbox-caused failure:\n - IMMEDIATELY retry with \\`dangerouslyDisableSandbox: true\\` (don't ask, just do it)\n - Briefly explain what sandbox restriction likely caused the failure\n - Mention: \"Use \\`/sandbox\\` to manage restrictions\"\n - This will prompt the user for permission\n - Example of normal usage: { \"command\": \"ls\", \"description\": \"List files\" }\n - Example of override: { \"command\": \"my-tool\", \"description\": \"Run my-tool\", \"dangerouslyDisableSandbox\": true }\n - DO NOT suggest adding sensitive paths like ~/.bashrc, ~/.zshrc, ~/.ssh/*, or credential files to the allowlist`\n : ` - CRITICAL: All commands MUST run in sandbox mode - the \\`dangerouslyDisableSandbox\\` parameter is disabled by policy\n - Commands cannot run outside the sandbox under any circumstances\n - If a command fails due to sandbox restrictions, work with the user to adjust sandbox settings instead`\n\n return `- Commands run in a sandbox by default with the following restrictions:\n${sections.join('\\n')}\n${overridePolicy}\n - IMPORTANT: For temporary files, rely on the sandbox temp directory via \\`TMPDIR\\`\n - In sandbox mode, \\`TMPDIR\\` is set to a dedicated temp directory\n - Prefer using \\`TMPDIR\\` over writing directly to \\`/tmp\\`\n - Most programs that respect \\`TMPDIR\\` will automatically use it`\n}\n\nfunction getBashGitPrompt(): string {\n const { commit, pr } = getAttribution()\n return `# Committing changes with git\n\nOnly create commits when requested by the user. If unclear, ask first. When the user asks you to create a new git commit, follow these steps carefully:\n\nGit Safety Protocol:\n- NEVER update the git config\n- NEVER run destructive/irreversible git commands (like push --force, hard reset, etc) unless the user explicitly requests them \n- NEVER skip hooks (--no-verify, --no-gpg-sign, etc) unless the user explicitly requests it\n- NEVER run force push to main/master, warn the user if they request it\n- Avoid git commit --amend. ONLY use --amend when either (1) user explicitly requested amend OR (2) adding edits from pre-commit hook (additional instructions below) \n- Before amending: ALWAYS check authorship (git log -1 --format='%an %ae')\n- NEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked, otherwise the user will feel that you are being too proactive.\n\n1. You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run multiple tool calls in parallel for optimal performance. run the following bash commands in parallel, each using the ${TOOL_NAME_BASH} tool:\n - Run a git status command to see all untracked files.\n - Run a git diff command to see both staged and unstaged changes that will be committed.\n - Run a git log command to see recent commit messages, so that you can follow this repository's commit message style.\n2. Analyze all staged changes (both previously staged and newly added) and draft a commit message:\n - Summarize the nature of the changes (eg. new feature, enhancement to an existing feature, bug fix, refactoring, test, docs, etc.). Ensure the message accurately reflects the changes and their purpose (i.e. \"add\" means a wholly new feature, \"update\" means an enhancement to an existing feature, \"fix\" means a bug fix, etc.).\n - Do not commit files that likely contain secrets (.env, credentials.json, etc). Warn the user if they specifically request to commit those files\n - Draft a concise (1-2 sentences) commit message that focuses on the \"why\" rather than the \"what\"\n - Ensure it accurately reflects the changes and their purpose\n3. You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run multiple tool calls in parallel for optimal performance. run the following commands:\n - Add relevant untracked files to the staging area.\n - Create the commit with a message${commit ? ` ending with:\\n ${commit}` : '.'}\n - Run git status after the commit completes to verify success.\n Note: git status depends on the commit completing, so run it sequentially after the commit.\n4. If the commit fails due to pre-commit hook changes, retry ONCE. If it succeeds but files were modified by the hook, verify it's safe to amend:\n - Check HEAD commit: git log -1 --format='[%h] (%an <%ae>) %s'. VERIFY it matches your commit\n - Check not pushed: git status shows \"Your branch is ahead\"\n - If both true: amend your commit. Otherwise: create NEW commit (never amend other developers' commits)\n\nImportant notes:\n- NEVER run additional commands to read or explore code, besides git bash commands\n- NEVER use the ${TOOL_NAME_WRITE} or ${TOOL_NAME_TASK} tools\n- DO NOT push to the remote repository unless the user explicitly asks you to do so\n- IMPORTANT: Never use git commands with the -i flag (like git rebase -i or git add -i) since they require interactive input which is not supported.\n- If there are no changes to commit (i.e., no untracked files and no modifications), do not create an empty commit\n- In order to ensure good formatting, ALWAYS pass the commit message via a HEREDOC, a la this example:\n<example>\ngit commit -m \"$(cat <<'EOF'\n Commit message here.${commit ? `\\n\\n ${commit}` : ''}\n EOF\n )\"\n</example>\n\n# Creating pull requests\nUse the gh command via the Bash tool for ALL GitHub-related tasks including working with issues, pull requests, checks, and releases. If given a Github URL use the gh command to get the information needed.\n\nIMPORTANT: When the user asks you to create a pull request, follow these steps carefully:\n\n1. You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run multiple tool calls in parallel for optimal performance. run the following bash commands in parallel using the ${TOOL_NAME_BASH} tool, in order to understand the current state of the branch since it diverged from the main branch:\n - Run a git status command to see all untracked files\n - Run a git diff command to see both staged and unstaged changes that will be committed\n - Check if the current branch tracks a remote branch and is up to date with the remote, so you know if you need to push to the remote\n - Run a git log command and \\`git diff [base-branch]...HEAD\\` to understand the full commit history for the current branch (from the time it diverged from the base branch)\n2. Analyze all changes that will be included in the pull request, making sure to look at all relevant commits (NOT just the latest commit, but ALL commits that will be included in the pull request!!!), and draft a pull request summary\n3. You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run multiple tool calls in parallel for optimal performance. run the following commands in parallel:\n - Create new branch if needed\n - Push to remote with -u flag if needed\n - Create PR using gh pr create with the format below. Use a HEREDOC to pass the body to ensure correct formatting.\n<example>\ngh pr create --title \"the pr title\" --body \"$(cat <<'EOF'\n## Summary\n<1-3 bullet points>\n\n## Test plan\n[Bulleted markdown checklist of TODOs for testing the pull request...]${pr ? `\\n\\n${pr}` : ''}\nEOF\n)\"\n</example>\n\nImportant:\n- DO NOT use the ${TOOL_NAME_WRITE} or ${TOOL_NAME_TASK} tools\n- Return the PR URL when you're done, so the user can see it\n\n# Other common operations\n- View comments on a Github PR: gh api repos/foo/bar/pulls/123/comments`\n}\n\nexport function getBashToolPrompt(): string {\n const sandboxPrompt = getBashSandboxPrompt()\n return `Executes a given bash command in a persistent shell session with optional timeout, ensuring proper handling and security measures.\n\nIMPORTANT: This tool is for terminal operations like git, npm, docker, etc. DO NOT use it for file operations (reading, writing, editing, searching, finding files) - use the specialized tools for this instead.\n\nBefore executing the command, please follow these steps:\n\n1. Directory Verification:\n - If the command will create new directories or files, first use \\`ls\\` to verify the parent directory exists and is the correct location\n - For example, before running \"mkdir foo/bar\", first use \\`ls foo\\` to check that \"foo\" exists and is the intended parent directory\n\n2. Command Execution:\n - Always quote file paths that contain spaces with double quotes (e.g., cd \"path with spaces/file.txt\")\n - Examples of proper quoting:\n - cd \"/Users/name/My Documents\" (correct)\n - cd /Users/name/My Documents (incorrect - will fail)\n - python \"/path/with spaces/script.py\" (correct)\n - python /path/with spaces/script.py (incorrect - will fail)\n - After ensuring proper quoting, execute the command.\n - Capture the output of the command.\n\nUsage notes:\n - The command argument is required.\n - You can specify an optional timeout in milliseconds (up to ${MAX_TIMEOUT_MS}ms / ${MAX_TIMEOUT_MS / 60000} minutes). If not specified, commands will timeout after ${DEFAULT_TIMEOUT_MS}ms (${DEFAULT_TIMEOUT_MS / 60000} minutes).\n - It is very helpful if you write a clear, concise description of what this command does in 5-10 words.\n - If the output exceeds ${MAX_OUTPUT_LENGTH} characters, output will be truncated before being returned to you.\n - You can use the \\`run_in_background\\` parameter to run the command in the background, which allows you to continue working while the command runs. You can monitor the output using the ${TOOL_NAME_BASH} tool as it becomes available. You do not need to use '&' at the end of the command when using this parameter.\n ${sandboxPrompt}\n - Avoid using Bash with the \\`find\\`, \\`grep\\`, \\`cat\\`, \\`head\\`, \\`tail\\`, \\`sed\\`, \\`awk\\`, or \\`echo\\` commands, unless explicitly instructed or when these commands are truly necessary for the task. Instead, always prefer using the dedicated tools for these commands:\n - File search: Use ${TOOL_NAME_GLOB} (NOT find or ls)\n - Content search: Use ${TOOL_NAME_GREP} (NOT grep or rg)\n - Read files: Use ${TOOL_NAME_READ} (NOT cat/head/tail)\n - Edit files: Use ${TOOL_NAME_EDIT} (NOT sed/awk)\n - Write files: Use ${TOOL_NAME_WRITE} (NOT echo >/cat <<EOF)\n - Communication: Output text directly (NOT echo/printf)\n - When issuing multiple commands:\n - If the commands are independent and can run in parallel, make multiple ${TOOL_NAME_BASH} tool calls in a single message. For example, if you need to run \"git status\" and \"git diff\", send a single message with two ${TOOL_NAME_BASH} tool calls in parallel.\n - If the commands depend on each other and must run sequentially, use a single ${TOOL_NAME_BASH} call with '&&' to chain them together (e.g., \\`git add . && git commit -m \"message\" && git push\\`). For instance, if one operation must complete before another starts (like mkdir before cp, Write before Bash for git operations, or git add before git commit), run these operations sequentially instead.\n - Use ';' only when you need to run commands sequentially but don't care if earlier commands fail\n - DO NOT use newlines to separate commands (newlines are ok in quoted strings)\n - Try to maintain your current working directory throughout the session by using absolute paths and avoiding usage of \\`cd\\`. You may use \\`cd\\` if the User explicitly requests it.\n <good-example>\n pytest /foo/bar/tests\n </good-example>\n <bad-example>\n cd /foo/bar && pytest tests\n </bad-example>\n\n${getBashGitPrompt()}`\n}\n", "export function formatDuration(ms: number): string {\n if (ms < 60_000) {\n if (ms === 0) return '0s'\n if (ms < 1) return `${(ms / 1000).toFixed(1)}s`\n return `${Math.round(ms / 1000).toString()}s`\n }\n\n let hours = Math.floor(ms / 3_600_000)\n let minutes = Math.floor((ms % 3_600_000) / 60_000)\n let seconds = Math.round((ms % 60_000) / 1000)\n\n if (seconds === 60) {\n seconds = 0\n minutes++\n }\n if (minutes === 60) {\n minutes = 0\n hours++\n }\n\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`\n if (minutes > 0) return `${minutes}m ${seconds}s`\n return `${seconds}s`\n}\n\nexport function normalizeLineEndings(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n}\n\nexport function countNewlines(text: string): number {\n let count = 0\n for (let i = 0; i < text.length; i++) {\n if (text[i] === '\\n') count++\n }\n return count\n}\n", "import type { CommandSource } from '#protocol/commandSource'\n\nexport type SystemSandboxMode = 'disabled' | 'auto' | 'required'\nexport type SystemSandboxNetworkMode = 'none' | 'inherit'\n\nfunction parseBoolLike(value: string): boolean | null {\n const v = value.trim().toLowerCase()\n if (['1', 'true', 'yes', 'y', 'on', 'enable', 'enabled'].includes(v))\n return true\n if (['0', 'false', 'no', 'n', 'off', 'disable', 'disabled'].includes(v))\n return false\n return null\n}\n\nexport function getSystemSandboxModeFromEnv(): SystemSandboxMode | null {\n const raw = process.env.KODE_SYSTEM_SANDBOX\n if (!raw) return null\n const bool = parseBoolLike(raw)\n if (bool === true) return 'auto'\n if (bool === false) return 'disabled'\n\n const v = raw.trim().toLowerCase()\n if (['required', 'strict', 'enforce', 'must'].includes(v)) return 'required'\n if (['auto'].includes(v)) return 'auto'\n if (['disabled', 'off', 'none'].includes(v)) return 'disabled'\n return null\n}\n\nexport function getSystemSandboxNetworkModeFromEnv(): SystemSandboxNetworkMode | null {\n const raw = process.env.KODE_SYSTEM_SANDBOX_NETWORK\n if (!raw) return null\n const v = raw.trim().toLowerCase()\n if (['inherit', 'allow', 'enabled', 'true', '1'].includes(v)) return 'inherit'\n if (['none', 'deny', 'disabled', 'false', '0'].includes(v)) return 'none'\n return null\n}\n\nexport type SystemSandboxDecision = {\n enabled: boolean\n required: boolean\n allowNetwork: boolean\n}\n\nexport function decideSystemSandboxForBashTool(params: {\n safeMode: boolean\n commandSource: CommandSource\n dangerouslyDisableSandbox: boolean\n}): SystemSandboxDecision {\n const modeFromEnv = getSystemSandboxModeFromEnv()\n const networkFromEnv = getSystemSandboxNetworkModeFromEnv()\n\n const enabledByDefault =\n params.safeMode && params.commandSource === 'agent_call'\n const mode: SystemSandboxMode =\n modeFromEnv ?? (enabledByDefault ? 'auto' : 'disabled')\n\n const enabled =\n mode !== 'disabled' &&\n params.commandSource === 'agent_call' &&\n !params.dangerouslyDisableSandbox\n const required = mode === 'required'\n\n const allowNetwork = (networkFromEnv ?? 'none') === 'inherit'\n\n return {\n enabled,\n required,\n allowNetwork,\n }\n}\n", "import path from 'path'\nimport { homedir } from 'os'\nimport { parse, type ParseEntry } from 'shell-quote'\nimport { splitCommand } from '#core/utils/commands'\nimport type { CommandSource } from '#protocol/commandSource'\n\nfunction parseBoolLike(value: string | undefined): boolean {\n if (!value) return false\n const v = value.trim().toLowerCase()\n return ['1', 'true', 'yes', 'y', 'on', 'enable', 'enabled'].includes(v)\n}\n\nfunction tokensToWords(tokens: ParseEntry[]): string[] {\n const out: string[] = []\n for (const token of tokens) {\n if (typeof token === 'string') {\n const trimmed = token.trim()\n if (trimmed) out.push(trimmed)\n continue\n }\n if (token && typeof token === 'object') {\n const record = token as Record<string, unknown>\n const op = typeof record.op === 'string' ? record.op : String(record.op)\n if (op !== 'glob') continue\n const pattern =\n typeof record.pattern === 'string' ? record.pattern.trim() : ''\n if (pattern) out.push(pattern)\n }\n }\n return out\n}\n\nfunction isEnvAssignment(word: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_]*=/.test(word)\n}\n\nfunction stripWrappers(words: string[]): string[] {\n let i = 0\n\n while (i < words.length && isEnvAssignment(words[i]!)) i++\n\n // Handle common wrappers that might precede the real command.\n // This is intentionally conservative; if parsing fails, we avoid blocking.\n while (i < words.length) {\n const w = words[i]\n if (w === 'command') {\n i++\n continue\n }\n if (w === 'sudo') {\n i++\n while (i < words.length) {\n const next = words[i]!\n if (next === '--') {\n i++\n break\n }\n if (next.startsWith('-')) {\n i++\n continue\n }\n break\n }\n continue\n }\n if (w === 'env') {\n i++\n while (i < words.length) {\n const next = words[i]!\n if (next === '--') {\n i++\n break\n }\n if (next.startsWith('-') || isEnvAssignment(next)) {\n i++\n continue\n }\n break\n }\n continue\n }\n break\n }\n\n return words.slice(i)\n}\n\ntype RmInvocation = { cmd: 'rm' | 'rmdir'; args: string[] }\n\nfunction findRmInvocation(words: string[]): RmInvocation | null {\n const stripped = stripWrappers(words)\n const cmd = stripped[0]\n if (cmd !== 'rm' && cmd !== 'rmdir') return null\n return { cmd, args: stripped.slice(1) }\n}\n\nfunction extractRmTargets(args: string[]): string[] {\n const targets: string[] = []\n let endOfOptions = false\n for (const arg of args) {\n if (!arg) continue\n if (!endOfOptions && arg === '--') {\n endOfOptions = true\n continue\n }\n if (!endOfOptions && arg.startsWith('-')) continue\n targets.push(arg)\n }\n return targets\n}\n\nfunction resolveTilde(value: string, homeDir: string): string {\n if (value === '~') return homeDir\n if (value.startsWith('~/') || value.startsWith('~\\\\'))\n return homeDir + value.slice(1)\n return value\n}\n\nfunction resolvePathForSafety(\n raw: string,\n cwd: string,\n homeDir: string,\n): string {\n const expanded = resolveTilde(raw.trim(), homeDir)\n return path.isAbsolute(expanded)\n ? path.resolve(expanded)\n : path.resolve(cwd, expanded)\n}\n\nfunction isCriticalRemovalTarget(\n resolvedPath: string,\n options: { homeDir: string; originalCwd: string },\n): boolean {\n const home = path.resolve(options.homeDir)\n const original = path.resolve(options.originalCwd)\n const target = path.resolve(resolvedPath)\n\n const root = path.parse(target).root\n if (target === root) return true\n if (target === home) return true\n if (target === original) return true\n\n const parent = path.dirname(target)\n if (parent === root) return true\n\n return false\n}\n\nexport type DestructiveCommandBlock = {\n message: string\n command: string\n subcommand: string\n target: string\n resolvedTarget: string\n}\n\nconst ENV_ALLOW = 'KODE_ALLOW_DESTRUCTIVE_RM'\n\nexport function getBashDestructiveCommandBlock(args: {\n command: string\n cwd: string\n originalCwd: string\n commandSource: CommandSource\n homeDir?: string\n platform?: NodeJS.Platform\n allowOverride?: boolean\n}): DestructiveCommandBlock | null {\n if (args.commandSource !== 'agent_call') return null\n\n const allowOverride =\n args.allowOverride === true || parseBoolLike(process.env[ENV_ALLOW])\n if (allowOverride) return null\n\n const homeDir = args.homeDir ?? homedir()\n const cwd = args.cwd\n\n // Cheap prefilter to avoid parsing for most commands.\n const maybeDestructive = /\\brm\\b|\\brmdir\\b/.test(args.command)\n if (!maybeDestructive) return null\n\n const subcommands = splitCommand(args.command)\n for (const subcommand of subcommands) {\n let parsed: ParseEntry[]\n try {\n parsed = parse(subcommand, varName => `$${varName}`)\n } catch {\n continue\n }\n\n const words = tokensToWords(parsed)\n const invocation = findRmInvocation(words)\n if (!invocation) continue\n\n const targets = extractRmTargets(invocation.args)\n for (const target of targets) {\n // Shell expansion in rm targets is risky and ambiguous.\n if (/[`$%]/.test(target)) {\n return {\n command: args.command,\n subcommand,\n target,\n resolvedTarget: target,\n message:\n `Blocked destructive command: ${invocation.cmd} target contains shell expansion (${JSON.stringify(target)}).\\n\\n` +\n `Specify an explicit path (avoid $VARS, backticks, or %VAR%), or run this command manually.\\n` +\n `To override (not recommended), set ${ENV_ALLOW}=1 in the ${args.platform ?? process.platform} environment and rerun.`,\n }\n }\n\n const resolvedTarget = resolvePathForSafety(target, cwd, homeDir)\n if (\n isCriticalRemovalTarget(resolvedTarget, {\n homeDir,\n originalCwd: args.originalCwd,\n })\n ) {\n return {\n command: args.command,\n subcommand,\n target,\n resolvedTarget,\n message:\n `Blocked destructive command: ${invocation.cmd} target resolves to a critical directory (${JSON.stringify(resolvedTarget)}).\\n\\n` +\n `This guard prevents accidental deletion of system/home/project roots in non-interactive agent runs.\\n` +\n `To override (not recommended), set ${ENV_ALLOW}=1 in the ${args.platform ?? process.platform} environment and rerun.`,\n }\n }\n }\n }\n\n return null\n}\n", "import type { SimpleRule } from './bashGateRules'\n\nexport const SIMPLE_RULES: SimpleRule[] = [\n // Privilege escalation / identity\n {\n code: 'PRIV_SUDO',\n severity: 'high',\n category: 'privilege',\n title: 'sudo escalates privileges',\n patterns: [/\\bsudo\\b/i],\n },\n {\n code: 'PRIV_SU',\n severity: 'high',\n category: 'privilege',\n title: 'su changes user identity',\n patterns: [/\\bsu\\b(\\s|$)/i],\n },\n {\n code: 'PRIV_SUDOERS',\n severity: 'high',\n category: 'privilege',\n title: 'modifies sudoers policy',\n patterns: [/\\/etc\\/sudoers(\\.d\\/[^\\s]+)?/i],\n },\n\n // System power / service management\n {\n code: 'SYS_SHUTDOWN',\n severity: 'high',\n category: 'system',\n title: 'shutdown/reboot/poweroff',\n patterns: [/\\b(shutdown|reboot|poweroff|halt|init\\s+0)\\b/i],\n },\n {\n code: 'SYS_SYSTEMCTL_STOP',\n severity: 'high',\n category: 'system',\n title: 'systemctl stop/disable/mask can break services',\n patterns: [/\\bsystemctl\\b[^\\n]*\\b(stop|disable|mask)\\b/i],\n },\n\n // Filesystem / disk destructive operations\n {\n code: 'FS_MKFS',\n severity: 'high',\n category: 'fs_delete',\n title: 'mkfs formats filesystems',\n patterns: [/\\bmkfs(\\.[a-z0-9]+)?\\b/i],\n },\n {\n code: 'FS_PARTITION',\n severity: 'high',\n category: 'fs_delete',\n title: 'disk partitioning tools',\n patterns: [/\\b(fdisk|parted|sfdisk|gdisk)\\b/i],\n },\n {\n code: 'FS_WIPE',\n severity: 'high',\n category: 'fs_delete',\n title: 'secure wipe/destructive disk ops',\n patterns: [/\\b(shred|wipefs|blkdiscard)\\b/i],\n },\n {\n code: 'FS_DD_OF',\n severity: 'high',\n category: 'fs_delete',\n title: 'dd writes to output target (of=...)',\n patterns: [/\\bdd\\b[^\\n]*\\bof=\\S+/i],\n },\n\n // Remote fetch + exec / code execution\n {\n code: 'RCE_PIPE_TO_SHELL',\n severity: 'high',\n category: 'remote_exec',\n title: 'pipe remote content into shell',\n patterns: [/\\b(curl|wget)\\b[^\\n]*\\|\\s*(bash|sh)\\b/i],\n },\n {\n code: 'RCE_EVAL',\n severity: 'high',\n category: 'remote_exec',\n title: 'eval/source execution',\n patterns: [/\\beval\\b/i, /\\bsource\\b\\s+\\S+/i, /\\b\\.\\s+\\S+/i],\n },\n {\n code: 'RCE_BASE64',\n severity: 'high',\n category: 'remote_exec',\n title: 'decode then execute',\n patterns: [/\\bbase64\\b[^\\n]*\\s+-d\\b[^\\n]*\\|\\s*(bash|sh)\\b/i],\n },\n {\n code: 'RCE_ONE_LINER',\n severity: 'high',\n category: 'remote_exec',\n title: 'interpreter one-liner execution',\n patterns: [\n /\\bpython3?\\b\\s+-c\\b/i,\n /\\bperl\\b\\s+-e\\b/i,\n /\\bruby\\b\\s+-e\\b/i,\n /\\bnode\\b\\s+-e\\b/i,\n ],\n },\n\n // Persistence / startup modification\n {\n code: 'PERSIST_RC',\n severity: 'high',\n category: 'persistence',\n title: 'modifies shell startup files',\n patterns: [/~\\/\\.(bashrc|zshrc|profile|bash_profile)\\b/i],\n },\n {\n code: 'PERSIST_CRON',\n severity: 'high',\n category: 'persistence',\n title: 'modifies cron jobs',\n patterns: [/\\bcrontab\\b/i, /\\/etc\\/cron\\./i, /cron\\.d/i],\n },\n {\n code: 'PERSIST_SYSTEMD',\n severity: 'high',\n category: 'persistence',\n title: 'modifies systemd units',\n patterns: [/\\/etc\\/systemd\\/system\\//i, /\\bsystemctl\\b[^\\n]*\\benable\\b/i],\n },\n\n // Credentials / secrets access\n {\n code: 'CRED_SSH',\n severity: 'high',\n category: 'credentials',\n title: 'SSH key material access',\n patterns: [/~\\/\\.ssh\\//i, /\\/etc\\/ssh\\//i],\n },\n {\n code: 'CRED_SHADOW',\n severity: 'high',\n category: 'credentials',\n title: 'reads /etc/shadow',\n patterns: [/\\/etc\\/shadow\\b/i],\n },\n {\n code: 'CRED_ENV_FILE',\n severity: 'high',\n category: 'credentials',\n title: 'reads .env secrets file',\n patterns: [\n /(\\s|^)(cat|sed|awk|perl|python3?)\\b[^\\n]*\\s+(\\.\\/)?\\.env(\\s|$)/i,\n /(^|\\/)\\.env(\\.|$)/i,\n ],\n },\n\n // Infra destroy\n {\n code: 'INFRA_KUBECTL_DELETE',\n severity: 'high',\n category: 'infra_destroy',\n title: 'kubectl delete can destroy cluster resources',\n patterns: [/\\bkubectl\\b[^\\n]*\\bdelete\\b/i],\n },\n {\n code: 'INFRA_TERRAFORM_DESTROY',\n severity: 'high',\n category: 'infra_destroy',\n title: 'terraform destroy destroys infrastructure',\n patterns: [/\\bterraform\\b[^\\n]*\\bdestroy\\b/i],\n },\n {\n code: 'INFRA_PULUMI_DESTROY',\n severity: 'high',\n category: 'infra_destroy',\n title: 'pulumi destroy destroys infrastructure',\n patterns: [/\\bpulumi\\b[^\\n]*\\bdestroy\\b/i],\n },\n\n // Containers / data loss\n {\n code: 'DOCKER_PRUNE',\n severity: 'high',\n category: 'container',\n title: 'docker prune can delete data',\n patterns: [/\\bdocker\\b[^\\n]*\\b(system\\s+prune|volume\\s+rm)\\b/i],\n },\n\n // Package removal\n {\n code: 'PKG_REMOVE',\n severity: 'high',\n category: 'pkg',\n title: 'package removal/purge can break environment',\n patterns: [\n /\\bapt(-get)?\\b[^\\n]*\\b(remove|purge)\\b/i,\n /\\byum\\b[^\\n]*\\bremove\\b/i,\n /\\bdnf\\b[^\\n]*\\bremove\\b/i,\n /\\bpacman\\b[^\\n]*\\b-R(ns)?\\b/i,\n /\\bnpm\\b[^\\n]*\\buninstall\\b/i,\n /\\bpnpm\\b[^\\n]*\\bremove\\b/i,\n /\\byarn\\b[^\\n]*\\bremove\\b/i,\n ],\n },\n\n // Obfuscation / shell bomb\n {\n code: 'OBF_FORK_BOMB',\n severity: 'high',\n category: 'obfuscation',\n title: 'fork bomb pattern',\n patterns: [/:\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;:/],\n },\n]\n", "export type BashGateFindingSeverity = 'high' | 'medium'\n\nexport type BashGateFindingCategory =\n | 'fs_delete'\n | 'fs_write'\n | 'privilege'\n | 'remote_exec'\n | 'persistence'\n | 'credentials'\n | 'git_data_loss'\n | 'infra_destroy'\n | 'container'\n | 'system'\n | 'process'\n | 'network'\n | 'pkg'\n | 'obfuscation'\n\nexport type BashGateFinding = {\n code: string\n severity: BashGateFindingSeverity\n category: BashGateFindingCategory\n title: string\n evidence?: string\n}\n\nexport type SimpleRule = {\n code: string\n severity: BashGateFindingSeverity\n category: BashGateFindingCategory\n title: string\n patterns: RegExp[]\n evidence?: (m: RegExpMatchArray) => string\n}\n\nfunction addUnique(\n findings: BashGateFinding[],\n finding: BashGateFinding,\n): void {\n if (findings.some(f => f.code === finding.code)) return\n findings.push(finding)\n}\n\nfunction applySimpleRules(\n command: string,\n rules: SimpleRule[],\n): BashGateFinding[] {\n const findings: BashGateFinding[] = []\n for (const rule of rules) {\n for (const re of rule.patterns) {\n const m = command.match(re)\n if (!m) continue\n addUnique(findings, {\n code: rule.code,\n severity: rule.severity,\n category: rule.category,\n title: rule.title,\n ...(rule.evidence ? { evidence: rule.evidence(m).slice(0, 200) } : {}),\n })\n break\n }\n }\n return findings\n}\n\nfunction analyzeRm(command: string): BashGateFinding[] {\n const findings: BashGateFinding[] = []\n if (!/(^|[;&|()\\s])rm(\\s|$)/.test(command)) return findings\n\n addUnique(findings, {\n code: 'FS_RM_ANY',\n severity: 'high',\n category: 'fs_delete',\n title: 'rm deletes files/directories (always review)',\n })\n\n if (/\\s-rf(\\s|$)/i.test(command) || /\\s-fR(\\s|$)/i.test(command)) {\n addUnique(findings, {\n code: 'FS_RM_FORCE_RECURSIVE',\n severity: 'high',\n category: 'fs_delete',\n title: 'rm uses force+recursive flags (high data-loss risk)',\n })\n }\n\n const criticalTargets = [\n { re: /(^|\\s)\\/(\\s|$)/, label: '/' },\n { re: /(^|\\s)~(\\/|\\s|$)/, label: '~' },\n { re: /(^|\\s)\\.(\\s|$)/, label: '.' },\n { re: /(^|\\s)\\.\\.(\\s|$)/, label: '..' },\n {\n re: /(^|\\s)\\/(etc|bin|sbin|usr|var|lib|proc|sys)(\\/|\\s|$)/,\n label: '/(etc|bin|sbin|usr|var|lib|proc|sys)',\n },\n ]\n for (const t of criticalTargets) {\n if (t.re.test(command)) {\n addUnique(findings, {\n code: 'FS_RM_CRITICAL_TARGET',\n severity: 'high',\n category: 'fs_delete',\n title: 'rm targets a critical path',\n evidence: t.label,\n })\n break\n }\n }\n\n if (\n /[^\\n]*\\*/.test(command) ||\n /[^\\n]*\\?/.test(command) ||\n /[^\\n]*\\{/.test(command)\n ) {\n addUnique(findings, {\n code: 'FS_RM_GLOB',\n severity: 'high',\n category: 'fs_delete',\n title: 'rm uses glob/expansion patterns (wider blast radius)',\n })\n }\n\n return findings\n}\n\nfunction analyzeGit(command: string): BashGateFinding[] {\n const findings: BashGateFinding[] = []\n if (!/(^|[;&|()\\s])git(\\s|$)/.test(command)) return findings\n\n const dataLossOps: Array<{ code: string; title: string; re: RegExp }> = [\n {\n code: 'GIT_CHECKOUT',\n title: 'git checkout can discard working changes',\n re: /\\bgit\\b[^\\n]*\\bcheckout\\b/i,\n },\n {\n code: 'GIT_RESTORE',\n title: 'git restore can discard working changes',\n re: /\\bgit\\b[^\\n]*\\brestore\\b/i,\n },\n {\n code: 'GIT_RESET',\n title: 'git reset can discard commits/changes',\n re: /\\bgit\\b[^\\n]*\\breset\\b/i,\n },\n {\n code: 'GIT_RESET_HARD',\n title: 'git reset --hard discards local changes',\n re: /\\bgit\\b[^\\n]*\\breset\\b[^\\n]*--hard\\b/i,\n },\n {\n code: 'GIT_CLEAN',\n title: 'git clean deletes untracked files',\n re: /\\bgit\\b[^\\n]*\\bclean\\b/i,\n },\n {\n code: 'GIT_CLEAN_FDX',\n title: 'git clean -fdx deletes untracked + ignored files',\n re: /\\bgit\\b[^\\n]*\\bclean\\b[^\\n]*-(?:[^\\n]*f[^\\n]*d|[^\\n]*d[^\\n]*f)[^\\n]*x/i,\n },\n {\n code: 'GIT_PUSH_FORCE',\n title: 'git push --force rewrites remote history',\n re: /\\bgit\\b[^\\n]*\\bpush\\b[^\\n]*(--force|--force-with-lease|\\s-f(\\s|$))/i,\n },\n {\n code: 'GIT_PUSH_DELETE',\n title: 'git push --delete deletes remote refs',\n re: /\\bgit\\b[^\\n]*\\bpush\\b[^\\n]*(--delete|:\\S+)/i,\n },\n {\n code: 'GIT_FILTER_REWRITE',\n title: 'history rewrite (filter-branch/filter-repo/rebase/amend)',\n re: /\\bgit\\b[^\\n]*\\b(filter-branch|filter-repo|rebase|commit\\b[^\\n]*--amend)\\b/i,\n },\n {\n code: 'GIT_RECOVERY_REDUCE',\n title: 'reduces recoverability (reflog expire / gc --prune=now)',\n re: /\\bgit\\b[^\\n]*\\b(reflog\\b[^\\n]*expire|gc\\b[^\\n]*--prune=now)\\b/i,\n },\n {\n code: 'GIT_STASH_DROP',\n title: 'stash drop/clear removes saved work',\n re: /\\bgit\\b[^\\n]*\\bstash\\b[^\\n]*\\b(drop|clear)\\b/i,\n },\n ]\n\n for (const op of dataLossOps) {\n if (!op.re.test(command)) continue\n addUnique(findings, {\n code: op.code,\n severity: 'high',\n category: 'git_data_loss',\n title: op.title,\n })\n }\n\n return findings\n}\n\nimport { SIMPLE_RULES } from './bashGateSimpleRules'\n\nexport function getBashGateFindings(command: string): BashGateFinding[] {\n const c = command.trim()\n if (!c) return []\n const findings = [\n ...analyzeRm(c),\n ...analyzeGit(c),\n ...applySimpleRules(c, SIMPLE_RULES),\n ]\n\n // Deterministic ordering (stable prompts/dumps).\n findings.sort((a, b) => a.code.localeCompare(b.code))\n return findings\n}\n\nexport function shouldReviewBashCommand(findings: BashGateFinding[]): boolean {\n // Unified policy: any high-severity signal requires LLM review.\n return findings.some(f => f.severity === 'high')\n}\n", "import { randomUUID } from 'crypto'\nimport { mkdirSync, writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { CACHE_PATHS, dateToFilename } from '#core/utils/log'\nimport type { BashGateFinding } from './bashGateRules'\n\nexport function writeGateFailureDump(args: {\n command: string\n userPrompt: string\n description: string\n findings: BashGateFinding[]\n input: string\n output?: string\n error: string\n}): void {\n try {\n const dir = join(CACHE_PATHS.errors(), 'bash-llm-gate')\n mkdirSync(dir, { recursive: true })\n const filename = `${dateToFilename(new Date())}-${randomUUID()}.txt`\n const path = join(dir, filename)\n const body = [\n '=== Bash LLM gate failure ===',\n '',\n `error: ${args.error}`,\n '',\n '--- command ---',\n args.command,\n '',\n '--- description ---',\n args.description,\n '',\n '--- userPrompt ---',\n args.userPrompt,\n '',\n '--- findings ---',\n args.findings.length\n ? args.findings\n .map(\n f =>\n `[${f.code}] (${f.severity}/${f.category}) ${f.title}${f.evidence ? ` \u2014 ${f.evidence}` : ''}`,\n )\n .join('\\n')\n : '(none)',\n '',\n '--- gate input ---',\n args.input,\n '',\n args.output !== undefined ? '--- gate output ---' : '',\n args.output ?? '',\n '',\n ]\n .filter(Boolean)\n .join('\\n')\n writeFileSync(path, body, 'utf8')\n } catch {\n // Best-effort diagnostics only.\n }\n}\n", "import type { CommandSource } from './commandSource'\nimport type { BashGateFinding } from './bashGateRules'\n\nexport function buildGateSystemPrompt(): string[] {\n return [\n [\n 'You are a safety + intent-alignment reviewer for a coding agent about to run a shell command on the user machine.',\n 'A local rule pool produced one or more risk findings. Your job is to decide whether to ALLOW or BLOCK executing the command now.',\n '',\n 'You must evaluate BOTH:',\n '1) Safety of the behavior (risk of data loss, irreversible changes, privilege escalation, remote code execution, infra destruction).',\n '2) Alignment: does the command match the user request (USER_PROMPT) and the initiator description (DESCRIPTION)?',\n '',\n 'Output (required): EXACTLY ONE LINE of XML and nothing else:',\n '<final><decision>allow|block</decision><reason>...</reason></final>',\n '- If allow: <reason> may be empty.',\n '- If block: <reason> is required (<=140 chars).',\n '',\n 'No analysis. No markdown. No numbered lists.',\n '',\n 'Few-shot examples (follow the output format strictly):',\n '',\n 'Example A (rm, user asked to delete a temp file):',\n 'USER_PROMPT: Remove the generated temp file',\n 'DESCRIPTION: Delete temp output',\n 'COMMAND: rm -f ./tmp/output.log',\n '<final><decision>allow</decision><reason></reason></final>',\n '',\n 'Example B (rm -rf ., mismatch):',\n 'USER_PROMPT: Check git status',\n 'DESCRIPTION: Check repo state',\n 'COMMAND: rm -rf .',\n '<final><decision>block</decision><reason>Destructive delete does not match the request</reason></final>',\n '',\n 'Example C (git reset --hard, explicitly requested):',\n 'USER_PROMPT: Discard my local changes and go back to HEAD',\n 'DESCRIPTION: Reset working tree to HEAD',\n 'COMMAND: git reset --hard',\n '<final><decision>allow</decision><reason></reason></final>',\n '',\n 'Example D (git clean -fdx, unclear intent):',\n 'USER_PROMPT: Run tests',\n 'DESCRIPTION: Clean repository',\n 'COMMAND: git clean -fdx',\n '<final><decision>block</decision><reason>Deletes untracked/ignored files; user did not request cleanup</reason></final>',\n ].join('\\n'),\n ]\n}\n\nexport function buildGateUserInput(params: {\n command: string\n userPrompt: string\n description: string\n findings: BashGateFinding[]\n platform: NodeJS.Platform\n commandSource: CommandSource\n safeMode: boolean\n runInBackground: boolean\n willSandbox: boolean\n sandboxRequired: boolean\n cwd: string\n originalCwd: string\n}): string {\n // Keep this plain text (no JSON) for maximum model compatibility.\n const lines: string[] = []\n lines.push(\n 'OUTPUT_FORMAT: <final><decision>allow|block</decision><reason>...</reason></final>',\n )\n lines.push('')\n lines.push('FINDINGS:')\n if (params.findings.length === 0) {\n lines.push('- (none)')\n } else {\n for (const f of params.findings.slice(0, 20)) {\n lines.push(\n `- [${f.code}] (${f.severity}/${f.category}) ${f.title}${f.evidence ? ` \u2014 ${f.evidence}` : ''}`,\n )\n }\n if (params.findings.length > 20) {\n lines.push(`- ... (${params.findings.length - 20} more)`)\n }\n }\n lines.push('')\n lines.push('USER_PROMPT:')\n lines.push(params.userPrompt.trim() ? params.userPrompt.trim() : '(none)')\n lines.push('')\n lines.push('DESCRIPTION:')\n lines.push(params.description.trim() ? params.description.trim() : '(none)')\n lines.push('')\n lines.push('COMMAND:')\n lines.push(params.command)\n lines.push('')\n lines.push('CONTEXT:')\n lines.push(`- commandSource: ${params.commandSource}`)\n lines.push(`- platform: ${params.platform}`)\n lines.push(`- safeMode: ${params.safeMode ? 'true' : 'false'}`)\n lines.push(`- runInBackground: ${params.runInBackground ? 'true' : 'false'}`)\n lines.push(`- sandbox.willSandbox: ${params.willSandbox ? 'true' : 'false'}`)\n lines.push(`- sandbox.required: ${params.sandboxRequired ? 'true' : 'false'}`)\n lines.push(`- cwd: ${params.cwd}`)\n lines.push(`- originalCwd: ${params.originalCwd}`)\n return lines.join('\\n')\n}\n", "export type BashLlmGateVerdict = {\n action: 'allow' | 'block'\n summary: string\n}\n\nexport function parseVerdictFromText(text: string): BashLlmGateVerdict {\n const trimmed = text.trim()\n if (!trimmed) throw new Error('LLM gate produced empty output')\n\n if (/^allow$/i.test(trimmed)) return { action: 'allow', summary: '' }\n if (/^block$/i.test(trimmed)) return { action: 'block', summary: '' }\n\n const finals = Array.from(\n trimmed.matchAll(/<final\\b[^>]*>[\\s\\S]*?<\\/final>/gi),\n )\n const xml = finals.length > 0 ? finals[finals.length - 1]![0]! : trimmed\n const decisionTag = xml.match(/<decision>\\s*(allow|block)\\s*<\\/decision>/i)\n if (decisionTag) {\n const action = decisionTag[1]!.trim().toLowerCase() as 'allow' | 'block'\n const reasonTag = xml.match(/<reason>\\s*([^<]{0,180})\\s*<\\/reason>/i)\n return { action, summary: (reasonTag?.[1] ?? '').trim() }\n }\n\n const nonEmptyLines = trimmed\n .split(/\\r?\\n/)\n .map(l => l.trim())\n .filter(Boolean)\n for (let i = nonEmptyLines.length - 1; i >= 0; i--) {\n const line = nonEmptyLines[i]!\n const m = line.match(\n /^(?:[-*\u2022]|\\d+\\.)?\\s*(allow|block)\\s*(?:(?:[:-]\\s*)(.{0,200}))?\\s*$/i,\n )\n if (!m) continue\n const action = m[1]!.toLowerCase() as 'allow' | 'block'\n const summary = (m[2] ?? '').trim().slice(0, 140)\n return { action, summary }\n }\n\n const bareDecisionTag = trimmed.match(\n /<decision>\\s*(allow|block)\\s*<\\/decision>/i,\n )\n if (bareDecisionTag) {\n const action = bareDecisionTag[1]!.trim().toLowerCase() as 'allow' | 'block'\n const reasonTag = trimmed.match(/<reason>\\s*([^<]{0,180})\\s*<\\/reason>/i)\n const summary = (reasonTag?.[1] ?? '').trim()\n return { action, summary }\n }\n\n const preview = trimmed.length > 240 ? `${trimmed.slice(0, 240)}\u2026` : trimmed\n throw new Error(\n `Unable to parse LLM gate verdict. Output preview: ${preview}`,\n )\n}\n\nexport function formatBashLlmGateBlockMessage(\n verdict: BashLlmGateVerdict,\n): string {\n const summary = verdict.summary?.trim()\n return `Blocked by LLM intent gate: ${summary ? summary : 'No reason provided by gate model'}`\n}\n", "import { logError } from '#core/utils/log'\nimport { createUserMessage } from '#core/utils/messages'\nimport type { CommandSource } from './commandSource'\nimport {\n getBashGateFindings,\n shouldReviewBashCommand,\n type BashGateFinding,\n} from './bashGateRules'\nimport { writeGateFailureDump } from './llmSafetyGateDump'\nimport {\n buildGateSystemPrompt,\n buildGateUserInput,\n} from './llmSafetyGatePrompt'\nimport {\n parseVerdictFromText,\n type BashLlmGateVerdict,\n} from './llmSafetyGateVerdict'\nexport {\n formatBashLlmGateBlockMessage,\n type BashLlmGateVerdict,\n} from './llmSafetyGateVerdict'\n\n// Gate calls must be fast in the common case, but some reasoning models can be slow.\n// Keep this generous enough to avoid spurious timeouts, while still bounded.\nconst DEFAULT_GATE_TIMEOUT_MS = 300_000\nconst DEFAULT_GATE_STOP_SEQUENCES = ['</final>']\n\nexport type BashLlmGateErrorType =\n | 'api'\n | 'timeout'\n | 'invalid_output'\n | 'unknown'\n\ntype GateQueryFn = (args: {\n systemPrompt: string[]\n userInput: string\n signal: AbortSignal\n model?: 'quick' | 'main'\n}) => Promise<string>\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\n\nfunction collectTextBlocks(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n return content\n .flatMap(block => {\n const record = asRecord(block)\n if (!record) return []\n if (record.type === 'text' && typeof record.text === 'string')\n return [record.text]\n if (record.type === 'thinking' && typeof record.thinking === 'string')\n return [record.thinking]\n // Some providers return plain objects without `type`; tolerate those.\n if (\n (record.type === undefined || record.type === null) &&\n typeof record.text === 'string'\n )\n return [record.text]\n if (\n (record.type === undefined || record.type === null) &&\n typeof record.thinking === 'string'\n )\n return [record.thinking]\n return []\n })\n .join('\\n')\n}\n\nfunction formatParseError(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nasync function defaultGateQuery(args: {\n systemPrompt: string[]\n userInput: string\n signal: AbortSignal\n model?: 'quick' | 'main'\n}): Promise<string> {\n const { API_ERROR_MESSAGE_PREFIX, queryLLM } = await import('#core/ai/llm')\n const messages = [createUserMessage(args.userInput)]\n\n // Use the normal model-pointer config but *without* the CLI sysprompt.\n // The gate needs a single, purpose-built system prompt to stay deterministic.\n const assistant = await queryLLM(\n messages,\n args.systemPrompt,\n 0,\n [],\n args.signal,\n {\n safeMode: false,\n model: args.model ?? 'quick',\n prependCLISysprompt: false,\n stopSequences: DEFAULT_GATE_STOP_SEQUENCES,\n },\n )\n\n const text = collectTextBlocks(assistant.message.content as unknown)\n const trimmed = text.trim()\n if (assistant.isApiErrorMessage) {\n const preview = trimmed.length > 240 ? `${trimmed.slice(0, 240)}\u2026` : trimmed\n throw new Error(`LLM gate model error: ${preview}`)\n }\n if (trimmed.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n const preview = trimmed.length > 240 ? `${trimmed.slice(0, 240)}\u2026` : trimmed\n throw new Error(`LLM gate model error: ${preview}`)\n }\n return text\n}\n\ntype GateAttemptOutput = {\n model: 'quick' | 'main'\n output: string\n error?: string\n}\n\nexport async function runBashLlmSafetyGate(params: {\n command: string\n userPrompt: string\n description: string\n platform: NodeJS.Platform\n commandSource: CommandSource\n safeMode: boolean\n runInBackground: boolean\n willSandbox: boolean\n sandboxRequired: boolean\n cwd: string\n originalCwd: string\n parentAbortSignal?: AbortSignal\n query?: GateQueryFn\n}): Promise<\n | { decision: 'allow'; verdict: BashLlmGateVerdict; fromCache: boolean }\n | { decision: 'block'; verdict: BashLlmGateVerdict; fromCache: boolean }\n | {\n decision: 'error'\n error: string\n errorType: BashLlmGateErrorType\n willSandbox: boolean\n canFailOpen: boolean\n }\n | { decision: 'disabled' }\n> {\n const trimmedUserPrompt = params.userPrompt.trim()\n const trimmedDescription = params.description.trim()\n const findings = getBashGateFindings(params.command)\n const attemptOutputs: GateAttemptOutput[] = []\n\n // Only run the LLM gate when unified policy says review is needed.\n if (!shouldReviewBashCommand(findings)) {\n return {\n decision: 'allow',\n verdict: { action: 'allow', summary: '' },\n fromCache: false,\n }\n }\n\n const abortController = new AbortController()\n const timeout = setTimeout(\n () => abortController.abort(),\n DEFAULT_GATE_TIMEOUT_MS,\n )\n const onAbort = () => abortController.abort()\n params.parentAbortSignal?.addEventListener('abort', onAbort, { once: true })\n\n try {\n const baseInput = buildGateUserInput({\n command: params.command,\n userPrompt: trimmedUserPrompt,\n description: trimmedDescription,\n findings,\n platform: params.platform,\n commandSource: params.commandSource,\n safeMode: params.safeMode,\n runInBackground: params.runInBackground,\n willSandbox: params.willSandbox,\n sandboxRequired: params.sandboxRequired,\n cwd: params.cwd,\n originalCwd: params.originalCwd,\n })\n const query = params.query ?? defaultGateQuery\n const attempts: Array<{ model: 'quick' | 'main' }> = [\n { model: 'quick' },\n { model: 'main' },\n { model: 'main' },\n ]\n\n let lastError: unknown = null\n for (const attempt of attempts) {\n try {\n const output = await query({\n systemPrompt: buildGateSystemPrompt(),\n userInput: baseInput,\n signal: abortController.signal,\n model: attempt.model,\n })\n attemptOutputs.push({ model: attempt.model, output })\n const verdict = parseVerdictFromText(output)\n return {\n decision: verdict.action === 'allow' ? 'allow' : 'block',\n verdict,\n fromCache: false,\n }\n } catch (e) {\n lastError = e\n attemptOutputs.push({\n model: attempt.model,\n output: '',\n error: formatParseError(e),\n })\n }\n }\n throw lastError ?? new Error('LLM gate produced no verdict')\n } catch (error) {\n const errorStr = formatParseError(error)\n const errorType: BashLlmGateErrorType = abortController.signal.aborted\n ? 'timeout'\n : errorStr.startsWith('LLM gate model error:')\n ? 'api'\n : errorStr.startsWith('LLM gate produced empty output') ||\n errorStr.startsWith('Unable to parse LLM gate verdict')\n ? 'invalid_output'\n : 'unknown'\n logError(`Bash LLM gate error: ${errorStr}`)\n const input = buildGateUserInput({\n command: params.command,\n userPrompt: trimmedUserPrompt,\n description: trimmedDescription,\n findings,\n platform: params.platform,\n commandSource: params.commandSource,\n safeMode: params.safeMode,\n runInBackground: params.runInBackground,\n willSandbox: params.willSandbox,\n sandboxRequired: params.sandboxRequired,\n cwd: params.cwd,\n originalCwd: params.originalCwd,\n })\n const output =\n attemptOutputs.length > 0\n ? attemptOutputs\n .map(o => {\n const header = `--- model: ${o.model} ---`\n const body = o.error ? `error: ${o.error}` : o.output\n return `${header}\\n${body}`\n })\n .join('\\n\\n')\n : undefined\n writeGateFailureDump({\n command: params.command,\n userPrompt: trimmedUserPrompt,\n description: trimmedDescription,\n findings,\n input,\n ...(output ? { output } : {}),\n error: errorStr,\n })\n return {\n decision: 'error',\n error: errorStr,\n errorType,\n willSandbox: params.willSandbox,\n canFailOpen: false,\n }\n } finally {\n clearTimeout(timeout)\n params.parentAbortSignal?.removeEventListener('abort', onAbort)\n }\n}\n", "/**\n * Command source tracking for dual-mode security.\n *\n * - user_bash_mode: User-initiated `!` commands (relaxed)\n * - agent_call: Tool use via the LLM (strict)\n */\nexport type CommandSource = 'user_bash_mode' | 'agent_call'\n\n/**\n * Context for bash command validation.\n */\nexport interface BashValidationContext {\n source: CommandSource\n}\n\n/**\n * Get validation context from a tool context object.\n */\nexport function getCommandSource(context: any): CommandSource {\n if (context?.commandSource === 'user_bash_mode') {\n return 'user_bash_mode'\n }\n return 'agent_call'\n}\n", "import { statSync } from 'fs'\nimport { EOL } from 'os'\nimport { isAbsolute, resolve } from 'path'\nimport * as React from 'react'\nimport { createAssistantMessage } from '#core/utils/messages'\nimport { isInDirectory } from '#core/utils/file'\nimport { logError } from '#core/utils/log'\nimport { getCwd, getOriginalCwd } from '#core/utils/state'\nimport { BunShell } from '#runtime/shell'\nimport type { BunShellSandboxOptions } from '#runtime/shell'\nimport { BashToolRunInBackgroundOverlay } from './BashToolRunInBackgroundOverlay'\nimport { formatOutput, getCommandFilePaths } from './utils'\nimport { countNewlines, formatDuration, normalizeLineEndings } from './text'\nimport type { Out } from './BashTool'\n\ntype SetToolJSX = (\n value: {\n jsx: React.ReactNode | null\n shouldHidePromptInput: boolean\n } | null,\n) => void\n\nexport async function* executeForegroundBash(options: {\n command: string\n timeout: number\n abortController: AbortController\n readFileTimestamps: Record<string, number>\n sandboxOptions: BunShellSandboxOptions | undefined\n setToolJSX?: SetToolJSX\n renderResultForAssistant: (output: Out) => string\n}): AsyncGenerator<\n | { type: 'progress'; content: unknown }\n | { type: 'result'; resultForAssistant: string; data: Out }\n> {\n const { command, timeout, abortController, readFileTimestamps } = options\n const setToolJSX = options.setToolJSX\n let stdout = ''\n let stderr = ''\n\n try {\n const startedAt = Date.now()\n const PROGRESS_INITIAL_DELAY_MS = 2000 // Reference CLI: XJ2=2000\n const PROGRESS_INTERVAL_MS = 1000 // Reference CLI: SH5=1000\n const PROGRESS_MAX_LINES = 5\n const PROGRESS_TAIL_MAX_CHARS = 100_000\n\n let combinedTail = ''\n let totalNewlines = 0\n let sawAnyOutput = false\n\n const onChunk = (chunk: string) => {\n if (!chunk) return\n sawAnyOutput = true\n totalNewlines += countNewlines(chunk)\n combinedTail += chunk\n if (combinedTail.length > PROGRESS_TAIL_MAX_CHARS) {\n combinedTail = combinedTail.slice(-PROGRESS_TAIL_MAX_CHARS)\n }\n }\n\n const exec = BunShell.getInstance().execPromotable(\n command,\n abortController.signal,\n timeout,\n {\n sandbox: options.sandboxOptions,\n onStdoutChunk: onChunk,\n onStderrChunk: onChunk,\n },\n )\n\n let backgroundRequested = false\n let resolveBackground: ((bashId: string) => void) | null = null\n const backgroundPromise = new Promise<string>(resolve => {\n resolveBackground = resolve\n })\n\n const requestBackground = () => {\n if (backgroundRequested) return\n backgroundRequested = true\n const promoted = exec.background()\n if (!promoted) return\n resolveBackground?.(promoted.bashId)\n }\n\n const resultPromise = exec.result\n\n const buildProgressText = (): string => {\n const elapsedMs = Date.now() - startedAt\n const time = `(${formatDuration(elapsedMs)})`\n\n const normalized = normalizeLineEndings(combinedTail).trim()\n const lines = normalized.length\n ? normalized.split('\\n').filter(line => line.length > 0)\n : []\n\n if (lines.length === 0) {\n return `Running\u2026 ${time}`\n }\n\n const shownLines = lines.slice(-PROGRESS_MAX_LINES)\n const totalLines = sawAnyOutput ? totalNewlines + 1 : 0\n const extraLines = Math.max(0, totalLines - PROGRESS_MAX_LINES)\n\n const footerParts: string[] = []\n if (extraLines > 0) {\n footerParts.push(\n `+${extraLines} more line${extraLines === 1 ? '' : 's'}`,\n )\n }\n footerParts.push(time)\n\n return `${shownLines.join('\\n')}\\n${footerParts.join(' ')}`\n }\n\n // Reference CLI parity: delay first progress paint to avoid flicker.\n let nextTickAt = startedAt + PROGRESS_INITIAL_DELAY_MS\n let overlayShown = false\n while (true) {\n const now = Date.now()\n const waitMs = Math.max(0, nextTickAt - now)\n const race = await Promise.race([\n resultPromise.then(r => ({ kind: 'done' as const, r })),\n backgroundPromise.then(bashId => ({\n kind: 'background' as const,\n bashId,\n })),\n new Promise<{ kind: 'tick' }>(resolve =>\n setTimeout(() => resolve({ kind: 'tick' }), waitMs),\n ),\n ])\n\n if (race.kind === 'background') {\n const data: Out = {\n stdout: '',\n stdoutLines: 0,\n stderr: '',\n stderrLines: 0,\n interrupted: false,\n bashId: race.bashId,\n backgroundTaskId: race.bashId,\n }\n\n yield {\n type: 'result',\n resultForAssistant: options.renderResultForAssistant(data),\n data,\n }\n return\n }\n\n if (race.kind === 'done') {\n const result = race.r\n\n stdout += (result.stdout || '').trim() + EOL\n stderr += (result.stderr || '').trim() + EOL\n if (result.code !== 0) {\n stderr += `Exit code ${result.code}`\n }\n\n if (!isInDirectory(getCwd(), getOriginalCwd())) {\n // Shell directory is outside original working directory, reset it\n await BunShell.getInstance().setCwd(getOriginalCwd())\n stderr = `${stderr.trim()}${EOL}Shell cwd was reset to ${getOriginalCwd()}`\n }\n\n // Update read timestamps for any files referenced by the command\n // Don't block the main thread!\n // Skip this in tests because it makes fixtures non-deterministic (they might not always get written),\n // so will be missing in CI.\n if (process.env.NODE_ENV !== 'test') {\n getCommandFilePaths(command, stdout).then(filePaths => {\n for (const filePath of filePaths) {\n const fullFilePath = isAbsolute(filePath)\n ? filePath\n : resolve(getCwd(), filePath)\n\n // Try/catch in case the file doesn't exist (because Haiku didn't properly extract it)\n try {\n readFileTimestamps[fullFilePath] =\n statSync(fullFilePath).mtimeMs\n } catch (e) {\n logError(e)\n }\n }\n })\n }\n\n const { totalLines: stdoutLines, truncatedContent: stdoutContent } =\n formatOutput(stdout.trim())\n const { totalLines: stderrLines, truncatedContent: stderrContent } =\n formatOutput(stderr.trim())\n\n const data: Out = {\n stdout: stdoutContent,\n stdoutLines,\n stderr: stderrContent,\n stderrLines,\n interrupted: result.interrupted,\n }\n\n yield {\n type: 'result',\n resultForAssistant: options.renderResultForAssistant(data),\n data,\n }\n return\n }\n\n if (\n !overlayShown &&\n setToolJSX &&\n Date.now() - startedAt >= PROGRESS_INITIAL_DELAY_MS\n ) {\n overlayShown = true\n setToolJSX({\n jsx: (\n <BashToolRunInBackgroundOverlay onBackground={requestBackground} />\n ),\n shouldHidePromptInput: false,\n })\n }\n\n const text = buildProgressText()\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `<tool-progress>${text}</tool-progress>`,\n ),\n }\n\n nextTickAt = Date.now() + PROGRESS_INTERVAL_MS\n }\n } catch (error) {\n // \uD83D\uDD27 Handle cancellation or other errors properly\n const isAborted = abortController.signal.aborted\n const errorMessage = isAborted\n ? 'Command was cancelled by user'\n : `Command failed: ${error instanceof Error ? error.message : String(error)}`\n\n const data: Out = {\n stdout: stdout.trim(),\n stdoutLines: stdout.split('\\n').length,\n stderr: errorMessage,\n stderrLines: 1,\n interrupted: isAborted,\n }\n\n yield {\n type: 'result',\n resultForAssistant: options.renderResultForAssistant(data),\n data,\n }\n } finally {\n setToolJSX?.(null)\n }\n}\n", "import { Box, Text, useInput } from 'ink'\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\nimport { getTheme } from '#core/utils/theme'\nimport {\n getRequestStatus,\n subscribeRequestStatus,\n type RequestStatus,\n} from '#core/utils/requestStatus'\n\nconst CHARACTERS =\n process.platform === 'darwin'\n ? ['\u00B7', '\u2722', '\u2733', '\u2217', '\u273B', '\u273D']\n : ['\u00B7', '\u2722', '*', '\u2217', '\u273B', '\u273D']\n\nfunction getLabel(status: RequestStatus): string {\n switch (status.kind) {\n case 'thinking':\n return 'Thinking'\n case 'streaming':\n return 'Streaming'\n case 'tool':\n return status.detail ? `Running tool: ${status.detail}` : 'Running tool'\n case 'idle':\n return 'Working'\n }\n}\n\nfunction RequestStatusIndicator(): React.ReactNode {\n const frames = useMemo(\n () => [...CHARACTERS, ...[...CHARACTERS].reverse()],\n [],\n )\n const theme = getTheme()\n\n const [frame, setFrame] = useState(0)\n const [elapsedTime, setElapsedTime] = useState(0)\n const [status, setStatus] = useState<RequestStatus>(() => getRequestStatus())\n\n const requestStartTime = useRef<number | null>(null)\n\n useEffect(() => {\n return subscribeRequestStatus(next => {\n setStatus(next)\n if (next.kind !== 'idle' && requestStartTime.current === null) {\n requestStartTime.current = Date.now()\n }\n if (next.kind === 'idle') {\n requestStartTime.current = null\n setElapsedTime(0)\n }\n })\n }, [])\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame(f => (f + 1) % frames.length)\n }, 120)\n return () => clearInterval(timer)\n }, [frames.length])\n\n useEffect(() => {\n const timer = setInterval(() => {\n if (requestStartTime.current === null) {\n setElapsedTime(0)\n return\n }\n setElapsedTime(Math.floor((Date.now() - requestStartTime.current) / 1000))\n }, 250)\n return () => clearInterval(timer)\n }, [])\n\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n <Box flexWrap=\"nowrap\" height={1} width={2}>\n <Text color={theme.kode}>{frames[frame]}</Text>\n </Box>\n <Text color={theme.kode}>{getLabel(status)}\u2026 </Text>\n <Text color={theme.secondaryText}>\n ({elapsedTime}s \u00B7 <Text bold>esc</Text> to interrupt)\n </Text>\n </Box>\n )\n}\n\nexport function BashToolRunInBackgroundOverlay({\n onBackground,\n}: {\n onBackground: () => void\n}): React.ReactNode {\n useInput((input, key) => {\n if (input === 'b' && key.ctrl) {\n onBackground()\n return true\n }\n return false\n })\n\n const shortcut = process.env.TMUX ? 'ctrl+b ctrl+b' : 'ctrl+b'\n\n return (\n <Box flexDirection=\"column\">\n <RequestStatusIndicator />\n <Box paddingLeft={5}>\n <Text dimColor>{`${shortcut} run in background`}</Text>\n </Box>\n </Box>\n )\n}\n", "import { queryQuick } from '#core/ai/llmLazy'\nimport { extractTag } from '#core/utils/messages'\nimport { MAX_OUTPUT_LENGTH } from './prompt'\n\nexport function formatOutput(content: string): {\n totalLines: number\n truncatedContent: string\n} {\n if (content.length <= MAX_OUTPUT_LENGTH) {\n return {\n totalLines: content.split('\\n').length,\n truncatedContent: content,\n }\n }\n const halfLength = MAX_OUTPUT_LENGTH / 2\n const start = content.slice(0, halfLength)\n const end = content.slice(-halfLength)\n const truncated = `${start}\\n\\n... [${content.slice(halfLength, -halfLength).split('\\n').length} lines truncated] ...\\n\\n${end}`\n\n return {\n totalLines: content.split('\\n').length,\n truncatedContent: truncated,\n }\n}\n\nexport async function getCommandFilePaths(\n command: string,\n output: string,\n): Promise<string[]> {\n const response = await queryQuick({\n systemPrompt: [\n `Extract any file paths that this command reads or modifies. For commands like \"git diff\" and \"cat\", include the paths of files being shown. Use paths verbatim -- don't add any slashes or try to resolve them. Do not try to infer paths that were not explicitly listed in the command output.\nFormat your response as:\n<filepaths>\npath/to/file1\npath/to/file2\n</filepaths>\n\nIf no files are read or modified, return empty filepaths tags:\n<filepaths>\n</filepaths>\n\nDo not include any other text in your response.`,\n ],\n userPrompt: `Command: ${command}\\nOutput: ${output}`,\n enablePromptCaching: true,\n })\n const content = response.message.content\n .filter(_ => _.type === 'text')\n .map(_ => _.text)\n .join('')\n\n return (\n extractTag(content, 'filepaths')?.trim().split('\\n').filter(Boolean) || []\n )\n}\n", "import net from 'node:net'\nimport type { AddressInfo } from 'node:net'\nimport { URL } from 'node:url'\n\ntype NetworkQuery = { host: string; port: number }\n\nfunction parseConnectTarget(value: string): NetworkQuery | null {\n const trimmed = value.trim()\n const firstToken = trimmed.split(/\\s+/)[0]\n const withoutLeadingSlash = firstToken.startsWith('/')\n ? firstToken.slice(1)\n : firstToken\n const authority = withoutLeadingSlash.startsWith('//')\n ? withoutLeadingSlash.slice(2)\n : withoutLeadingSlash\n\n try {\n const url = new URL(`http://${authority}`)\n if (!url.hostname) return null\n const port = Number(url.port) || 443\n return { host: url.hostname, port }\n } catch {\n return null\n }\n}\n\nfunction writeHttpErrorResponse(socket: net.Socket, statusLine: string): void {\n try {\n socket.write(\n `HTTP/1.1 ${statusLine}\\r\\nConnection: close\\r\\nContent-Length: 0\\r\\n\\r\\n`,\n )\n } catch {}\n try {\n socket.destroy()\n } catch {}\n}\n\nexport async function startHttpProxy(args: {\n shouldAllowNetworkRequest: (query: NetworkQuery) => Promise<boolean>\n onServer: (server: net.Server) => void\n}): Promise<number> {\n const server = net.createServer(clientSocket => {\n let buffered: Buffer<ArrayBufferLike> = Buffer.alloc(0)\n\n const onData = (chunk: Buffer<ArrayBufferLike>) => {\n buffered = buffered.length ? Buffer.concat([buffered, chunk]) : chunk\n\n const headerEnd = buffered.indexOf('\\r\\n\\r\\n')\n if (headerEnd === -1) return\n\n const headerText = buffered.slice(0, headerEnd).toString('latin1')\n const remainder = buffered.slice(headerEnd + 4)\n buffered = Buffer.alloc(0)\n clientSocket.off('data', onData)\n\n const lines = headerText.split('\\r\\n')\n const requestLine = lines.shift() ?? ''\n const [methodRaw, targetRaw, versionRaw] = requestLine.split(' ')\n const method = (methodRaw ?? '').trim().toUpperCase()\n const target = (targetRaw ?? '').trim()\n const version = (versionRaw ?? 'HTTP/1.1').trim() || 'HTTP/1.1'\n\n if (!method || !target) {\n writeHttpErrorResponse(clientSocket, '400 Bad Request')\n return\n }\n\n const headers: Record<string, string> = {}\n for (const line of lines) {\n const idx = line.indexOf(':')\n if (idx === -1) continue\n const key = line.slice(0, idx).trim().toLowerCase()\n const value = line.slice(idx + 1).trim()\n if (!key) continue\n headers[key] = value\n }\n\n if (method === 'CONNECT') {\n void (async () => {\n const targetValue = target || headers['host'] || ''\n const parsed = targetValue ? parseConnectTarget(targetValue) : null\n if (!parsed) {\n writeHttpErrorResponse(clientSocket, '400 Bad Request')\n return\n }\n\n const allowed = await args.shouldAllowNetworkRequest({\n host: parsed.host,\n port: parsed.port,\n })\n if (!allowed) {\n writeHttpErrorResponse(clientSocket, '403 Forbidden')\n return\n }\n\n const upstream = net.connect(parsed.port, parsed.host)\n upstream.once('error', () => {\n writeHttpErrorResponse(clientSocket, '502 Bad Gateway')\n })\n\n upstream.once('connect', () => {\n try {\n clientSocket.write('HTTP/1.1 200 Connection Established\\r\\n\\r\\n')\n } catch {\n try {\n upstream.destroy()\n } catch {}\n return\n }\n\n if (remainder.length > 0) {\n try {\n upstream.write(remainder)\n } catch {}\n }\n\n clientSocket.pipe(upstream)\n upstream.pipe(clientSocket)\n })\n })()\n return\n }\n\n void (async () => {\n const hostHeader = headers['host'] ?? ''\n let targetUrl: URL | null = null\n if (target.startsWith('http://') || target.startsWith('https://')) {\n try {\n targetUrl = new URL(target)\n } catch {\n targetUrl = null\n }\n } else if (hostHeader) {\n try {\n targetUrl = new URL(\n `http://${hostHeader}${target.startsWith('/') ? target : '/' + target}`,\n )\n } catch {\n targetUrl = null\n }\n }\n\n if (!targetUrl) {\n writeHttpErrorResponse(clientSocket, '400 Bad Request')\n return\n }\n\n const port =\n targetUrl.port !== ''\n ? Number(targetUrl.port)\n : targetUrl.protocol === 'https:'\n ? 443\n : 80\n\n const allowed = await args.shouldAllowNetworkRequest({\n host: targetUrl.hostname,\n port,\n })\n if (!allowed) {\n writeHttpErrorResponse(clientSocket, '403 Forbidden')\n return\n }\n\n if (targetUrl.protocol === 'https:') {\n // Non-CONNECT HTTPS proxy requests are not supported; clients should use CONNECT.\n writeHttpErrorResponse(clientSocket, '400 Bad Request')\n return\n }\n\n delete headers['proxy-connection']\n delete headers['proxy-authorization']\n headers['connection'] = 'close'\n headers['host'] = targetUrl.host\n\n const upstream = net.connect(port, targetUrl.hostname)\n upstream.once('error', () => {\n writeHttpErrorResponse(clientSocket, '502 Bad Gateway')\n })\n\n upstream.once('connect', () => {\n const path = `${targetUrl.pathname}${targetUrl.search}`\n try {\n upstream.write(`${method} ${path} ${version}\\r\\n`)\n for (const [k, v] of Object.entries(headers)) {\n upstream.write(`${k}: ${v}\\r\\n`)\n }\n upstream.write('\\r\\n')\n } catch {\n writeHttpErrorResponse(clientSocket, '502 Bad Gateway')\n try {\n upstream.destroy()\n } catch {}\n return\n }\n\n if (remainder.length > 0) {\n try {\n upstream.write(remainder)\n } catch {}\n }\n\n clientSocket.pipe(upstream)\n upstream.pipe(clientSocket)\n upstream.once('end', () => {\n try {\n clientSocket.end()\n } catch {}\n })\n })\n })()\n }\n\n clientSocket.on('data', onData)\n })\n\n args.onServer(server)\n\n return new Promise<number>((resolve, reject) => {\n server.once('error', reject)\n server.once('listening', () => {\n const addr = server.address()\n if (!addr || typeof addr === 'string') {\n reject(new Error('Failed to get HTTP proxy address'))\n return\n }\n server.unref()\n resolve((addr as AddressInfo).port)\n })\n server.listen(0, '127.0.0.1')\n })\n}\n", "import net from 'node:net'\nimport type { AddressInfo } from 'node:net'\n\ntype NetworkQuery = { host: string; port: number }\n\nfunction buildSocks5Reply(rep: number): Buffer {\n // VER, REP, RSV, ATYP, BND.ADDR, BND.PORT (0.0.0.0:0)\n return Buffer.from([0x05, rep, 0x00, 0x01, 0, 0, 0, 0, 0, 0])\n}\n\nfunction parseSocks5Request(\n buffer: Buffer,\n): { host: string; port: number; remaining: Buffer } | null {\n if (buffer.length < 4) return null\n if (buffer[0] !== 0x05) return null\n const cmd = buffer[1]\n const atyp = buffer[3]\n if (cmd !== 0x01) return null\n\n let offset = 4\n let host = ''\n\n if (atyp === 0x01) {\n if (buffer.length < offset + 4 + 2) return null\n host = `${buffer[offset]}.${buffer[offset + 1]}.${buffer[offset + 2]}.${buffer[offset + 3]}`\n offset += 4\n } else if (atyp === 0x03) {\n if (buffer.length < offset + 1) return null\n const len = buffer[offset]\n offset += 1\n if (buffer.length < offset + len + 2) return null\n host = buffer.slice(offset, offset + len).toString('utf8')\n offset += len\n } else if (atyp === 0x04) {\n if (buffer.length < offset + 16 + 2) return null\n const parts: string[] = []\n for (let i = 0; i < 16; i += 2) {\n parts.push(buffer.readUInt16BE(offset + i).toString(16))\n }\n host = parts.join(':')\n offset += 16\n } else {\n return null\n }\n\n const port = buffer.readUInt16BE(offset)\n offset += 2\n return { host, port, remaining: buffer.slice(offset) }\n}\n\nexport async function startSocks5Proxy(args: {\n shouldAllowNetworkRequest: (query: NetworkQuery) => Promise<boolean>\n onServer: (server: net.Server) => void\n}): Promise<number> {\n const server = net.createServer(socket => {\n let buffered: Buffer<ArrayBufferLike> = Buffer.alloc(0)\n let stage: 'greeting' | 'request' = 'greeting'\n\n const onData = (chunk: Buffer<ArrayBufferLike>) => {\n buffered = buffered.length ? Buffer.concat([buffered, chunk]) : chunk\n\n if (stage === 'greeting') {\n if (buffered.length < 2) return\n if (buffered[0] !== 0x05) {\n socket.end()\n return\n }\n\n const nMethods = buffered[1]\n if (buffered.length < 2 + nMethods) return\n const methods = buffered.slice(2, 2 + nMethods)\n const supportsNoAuth = methods.includes(0x00)\n socket.write(Buffer.from([0x05, supportsNoAuth ? 0x00 : 0xff]))\n buffered = buffered.slice(2 + nMethods)\n if (!supportsNoAuth) {\n socket.end()\n return\n }\n stage = 'request'\n }\n\n if (stage === 'request') {\n const parsed = parseSocks5Request(buffered)\n if (!parsed) return\n buffered = parsed.remaining\n\n void (async () => {\n const allowed = await args.shouldAllowNetworkRequest({\n host: parsed.host,\n port: parsed.port,\n })\n if (!allowed) {\n socket.write(buildSocks5Reply(0x02))\n socket.end()\n return\n }\n\n const upstream = net.connect(parsed.port, parsed.host)\n upstream.once('error', () => {\n try {\n socket.write(buildSocks5Reply(0x05))\n } catch {}\n socket.end()\n })\n upstream.once('connect', () => {\n try {\n socket.write(buildSocks5Reply(0x00))\n } catch {\n try {\n upstream.destroy()\n } catch {}\n socket.end()\n return\n }\n socket.pipe(upstream)\n upstream.pipe(socket)\n })\n })()\n }\n }\n\n socket.on('data', onData)\n })\n\n args.onServer(server)\n\n return new Promise<number>((resolve, reject) => {\n server.once('error', reject)\n server.once('listening', () => {\n const addr = server.address()\n if (!addr || typeof addr === 'string') {\n reject(new Error('Failed to get SOCKS proxy address'))\n return\n }\n server.unref()\n resolve((addr as AddressInfo).port)\n })\n server.listen(0, '127.0.0.1')\n })\n}\n", "import net from 'node:net'\nimport { logError } from '#core/utils/log'\nimport type { SandboxRuntimeConfig } from './sandboxConfig'\nimport { startHttpProxy } from './sandboxNetworkInfrastructure/httpProxy'\nimport { startSocks5Proxy } from './sandboxNetworkInfrastructure/socks5Proxy'\n\nexport type SandboxNetworkPermissionQuery = { host: string; port: number }\nexport type SandboxNetworkPermissionCallback = (\n query: SandboxNetworkPermissionQuery,\n) => Promise<boolean>\n\nexport type SandboxNetworkInfrastructurePorts = {\n httpProxyPort: number\n socksProxyPort: number\n}\n\ntype ActiveState = {\n config: SandboxRuntimeConfig | null\n permissionCallback: SandboxNetworkPermissionCallback | null\n httpProxyServer: net.Server | null\n socksProxyServer: net.Server | null\n httpProxyPort: number | null\n socksProxyPort: number | null\n initializationPromise: Promise<SandboxNetworkInfrastructurePorts> | null\n cleanupRegistered: boolean\n sessionAllowedHosts: Set<string>\n sessionDeniedHosts: Set<string>\n inflightPermissionRequests: Map<string, Promise<boolean>>\n permissionPromptChain: Promise<void>\n}\n\nconst active: ActiveState = {\n config: null,\n permissionCallback: null,\n httpProxyServer: null,\n socksProxyServer: null,\n httpProxyPort: null,\n socksProxyPort: null,\n initializationPromise: null,\n cleanupRegistered: false,\n sessionAllowedHosts: new Set(),\n sessionDeniedHosts: new Set(),\n inflightPermissionRequests: new Map(),\n permissionPromptChain: Promise.resolve(),\n}\n\n// Reference CLI parity: yc0(host, pattern) supports \"*.domain\" and exact matches (case-insensitive).\nexport function matchesSandboxDomainPattern(\n host: string,\n pattern: string,\n): boolean {\n if (pattern.startsWith('*.')) {\n const suffix = pattern.substring(2)\n return host.toLowerCase().endsWith('.' + suffix.toLowerCase())\n }\n return host.toLowerCase() === pattern.toLowerCase()\n}\n\nasync function shouldAllowNetworkRequest(\n query: SandboxNetworkPermissionQuery,\n): Promise<boolean> {\n const config = active.config\n if (!config) return false\n\n const hostKey = query.host.toLowerCase()\n if (active.sessionAllowedHosts.has(hostKey)) return true\n if (active.sessionDeniedHosts.has(hostKey)) return false\n\n for (const denied of config.network.deniedDomains) {\n if (matchesSandboxDomainPattern(query.host, denied)) return false\n }\n for (const allowed of config.network.allowedDomains) {\n if (matchesSandboxDomainPattern(query.host, allowed)) return true\n }\n\n const permissionCallback = active.permissionCallback\n if (!permissionCallback) return false\n\n const existing = active.inflightPermissionRequests.get(hostKey)\n if (existing) return existing\n\n const requestPromise = (async () => {\n const decision = await serializePermissionPrompt(async () => {\n try {\n return await permissionCallback(query)\n } catch (error) {\n logError(error)\n return false\n }\n })\n\n if (decision) active.sessionAllowedHosts.add(hostKey)\n else active.sessionDeniedHosts.add(hostKey)\n\n return decision\n })().finally(() => {\n active.inflightPermissionRequests.delete(hostKey)\n })\n\n active.inflightPermissionRequests.set(hostKey, requestPromise)\n return requestPromise\n}\n\nasync function serializePermissionPrompt<T>(\n task: () => Promise<T>,\n): Promise<T> {\n let release: (() => void) | null = null\n const next = new Promise<void>(resolve => {\n release = resolve\n })\n const prev = active.permissionPromptChain\n active.permissionPromptChain = prev.then(() => next)\n\n try {\n await prev\n return await task()\n } finally {\n release?.()\n }\n}\n\nfunction registerCleanupOnce(): void {\n if (active.cleanupRegistered) return\n active.cleanupRegistered = true\n\n const cleanup = () => {\n void cleanupSandboxNetworkInfrastructure()\n }\n\n process.once('exit', cleanup)\n process.once('SIGINT', cleanup)\n process.once('SIGTERM', cleanup)\n}\n\nasync function cleanupSandboxNetworkInfrastructure(): Promise<void> {\n const httpServer = active.httpProxyServer\n const socksServer = active.socksProxyServer\n active.httpProxyServer = null\n active.socksProxyServer = null\n active.httpProxyPort = null\n active.socksProxyPort = null\n active.initializationPromise = null\n\n active.sessionAllowedHosts.clear()\n active.sessionDeniedHosts.clear()\n active.inflightPermissionRequests.clear()\n\n await Promise.allSettled([\n httpServer\n ? new Promise<void>(resolve => {\n try {\n httpServer.close(() => resolve())\n } catch {\n resolve()\n }\n })\n : Promise.resolve(),\n socksServer\n ? new Promise<void>(resolve => {\n try {\n socksServer.close(() => resolve())\n } catch {\n resolve()\n }\n })\n : Promise.resolve(),\n ])\n}\n\nexport async function ensureSandboxNetworkInfrastructure(options: {\n runtimeConfig: SandboxRuntimeConfig\n permissionCallback?: SandboxNetworkPermissionCallback | null\n}): Promise<SandboxNetworkInfrastructurePorts> {\n active.config = options.runtimeConfig\n active.permissionCallback = options.permissionCallback ?? null\n\n if (active.initializationPromise) return active.initializationPromise\n\n registerCleanupOnce()\n\n active.initializationPromise = (async () => {\n const httpProxyPort =\n options.runtimeConfig.network.httpProxyPort !== undefined\n ? options.runtimeConfig.network.httpProxyPort\n : await startHttpProxy({\n shouldAllowNetworkRequest,\n onServer: server => {\n active.httpProxyServer = server\n },\n })\n\n const socksProxyPort =\n options.runtimeConfig.network.socksProxyPort !== undefined\n ? options.runtimeConfig.network.socksProxyPort\n : await startSocks5Proxy({\n shouldAllowNetworkRequest,\n onServer: server => {\n active.socksProxyServer = server\n },\n })\n\n active.httpProxyPort = httpProxyPort\n active.socksProxyPort = socksProxyPort\n\n return { httpProxyPort, socksProxyPort }\n })().catch(async error => {\n active.initializationPromise = null\n await cleanupSandboxNetworkInfrastructure()\n throw error\n })\n\n return active.initializationPromise\n}\n\nexport function getSandboxNetworkInfrastructurePorts(): SandboxNetworkInfrastructurePorts | null {\n if (active.httpProxyPort === null || active.socksProxyPort === null)\n return null\n return {\n httpProxyPort: active.httpProxyPort,\n socksProxyPort: active.socksProxyPort,\n }\n}\n\nexport async function __resetSandboxNetworkInfrastructureForTests(): Promise<void> {\n await cleanupSandboxNetworkInfrastructure()\n active.permissionCallback = null\n active.config = null\n active.permissionPromptChain = Promise.resolve()\n}\n", "import type { ToolUseContext } from '#core/tooling/Tool'\nimport type { BunShellSandboxPlan } from '#core/utils/sandbox/bunShellSandboxPlan'\nimport { ensureSandboxNetworkInfrastructure } from '#core/utils/sandbox/sandboxNetworkInfrastructure'\nimport type { BunShellSandboxOptions } from '#runtime/shell'\nimport { WebFetchTool } from '#tools/tools/network/WebFetchTool/WebFetchTool'\n\nexport async function maybeAttachSandboxNetworkPorts(args: {\n sandboxPlan: BunShellSandboxPlan\n sandboxOptions: BunShellSandboxOptions | undefined\n context: ToolUseContext\n}): Promise<BunShellSandboxOptions | undefined> {\n const { sandboxPlan, sandboxOptions, context } = args\n if (!sandboxPlan.willSandbox) return sandboxOptions\n if (!sandboxOptions || sandboxOptions.enabled !== true) return sandboxOptions\n\n const platform = sandboxOptions.__platformOverride ?? process.platform\n if (platform !== 'darwin') return sandboxOptions\n\n const needsRestriction =\n 'needsNetworkRestriction' in sandboxOptions\n ? sandboxOptions.needsNetworkRestriction === true\n : false\n if (!needsRestriction) return sandboxOptions\n\n const { abortController } = context\n const mode = context?.options?.toolPermissionContext?.mode ?? 'default'\n const shouldAvoidPermissionPrompts = Boolean(\n context?.options?.shouldAvoidPermissionPrompts,\n )\n const requestToolUsePermission =\n typeof context?.options?.requestToolUsePermission === 'function'\n ? context.options.requestToolUsePermission\n : undefined\n\n const ports = await ensureSandboxNetworkInfrastructure({\n runtimeConfig: sandboxPlan.runtimeConfig,\n permissionCallback: async ({ host, port }) => {\n if (mode === 'acceptEdits' || mode === 'bypassPermissions') return true\n if (mode === 'dontAsk' || shouldAvoidPermissionPrompts) return false\n if (!requestToolUsePermission) return false\n if (abortController.signal.aborted) return false\n\n const hostForUrl =\n host.includes(':') && !host.startsWith('[') ? `[${host}]` : host\n const url = `http://${hostForUrl}:${port}/`\n\n const result = await requestToolUsePermission(\n {\n tool: WebFetchTool,\n description: 'Network request outside of sandbox',\n input: { url },\n commandPrefix: null,\n suggestions: undefined,\n riskScore: null,\n },\n context,\n )\n\n return result.result === true\n },\n })\n\n return {\n ...sandboxOptions,\n httpProxyPort: ports.httpProxyPort,\n socksProxyPort: ports.socksProxyPort,\n }\n}\n", "import type { ToolUseContext } from '#core/tooling/Tool'\nimport { createAssistantMessage } from '#core/utils/messages'\nimport { BunShell } from '#runtime/shell'\nimport { getBunShellSandboxPlan } from '#core/utils/sandbox/bunShellSandboxPlan'\nimport { getCwd, getOriginalCwd } from '#core/utils/state'\nimport { decideSystemSandboxForBashTool } from '#core/utils/sandbox/systemSandbox'\nimport { getBashDestructiveCommandBlock } from '#core/utils/sandbox/destructiveCommandGuard'\nimport {\n formatBashLlmGateBlockMessage,\n runBashLlmSafetyGate,\n} from './llmSafetyGate'\nimport { getCommandSource } from './commandSource'\nimport type { Out } from './BashTool'\nimport { executeForegroundBash } from './executeForeground'\nimport { maybeAttachSandboxNetworkPorts } from './sandboxNetwork'\n\ntype SetToolJSX = (\n value: {\n jsx: unknown\n shouldHidePromptInput: boolean\n } | null,\n) => void\n\ntype Input = {\n command: string\n timeout: number\n run_in_background?: boolean\n dangerouslyDisableSandbox?: boolean\n description?: string\n}\n\nexport async function* callBashTool(\n input: Input,\n context: ToolUseContext,\n renderResultForAssistant: (output: Out) => string,\n): AsyncGenerator<\n | { type: 'progress'; content: unknown }\n | { type: 'result'; resultForAssistant: string; data: Out }\n> {\n const { abortController, readFileTimestamps } = context\n const hasSetToolJSX = (\n value: ToolUseContext,\n ): value is ToolUseContext & { setToolJSX: SetToolJSX } => {\n return typeof (value as { setToolJSX?: unknown }).setToolJSX === 'function'\n }\n const setToolJSX = hasSetToolJSX(context) ? context.setToolJSX : undefined\n\n const commandSource = getCommandSource(context)\n const safeMode = Boolean(context?.safeMode ?? context?.options?.safeMode)\n const userPrompt =\n typeof context?.options?.lastUserPrompt === 'string'\n ? context.options.lastUserPrompt.trim()\n : ''\n const commandDescription =\n typeof input.description === 'string' ? input.description.trim() : ''\n\n const destructiveBlock = getBashDestructiveCommandBlock({\n command: input.command,\n cwd: getCwd(),\n originalCwd: getOriginalCwd(),\n commandSource,\n platform: process.platform,\n })\n if (destructiveBlock) {\n const data: Out = {\n stdout: '',\n stdoutLines: 0,\n stderr: destructiveBlock.message,\n stderrLines: destructiveBlock.message.split(/\\r?\\n/).length,\n interrupted: false,\n }\n yield {\n type: 'result',\n resultForAssistant: renderResultForAssistant(data),\n data,\n }\n return\n }\n\n const systemSandboxDecision = decideSystemSandboxForBashTool({\n safeMode,\n commandSource,\n dangerouslyDisableSandbox: input.dangerouslyDisableSandbox === true,\n })\n\n const systemSandboxOptions = systemSandboxDecision.enabled\n ? {\n enabled: true,\n require: systemSandboxDecision.required,\n allowNetwork: systemSandboxDecision.allowNetwork,\n writableRoots: [getOriginalCwd()],\n chdir: getCwd(),\n }\n : undefined\n\n const sandboxPlan = getBunShellSandboxPlan({\n command: input.command,\n dangerouslyDisableSandbox: input.dangerouslyDisableSandbox === true,\n toolUseContext: context,\n })\n\n if (sandboxPlan.shouldBlockUnsandboxedCommand) {\n const data: Out = {\n stdout: '',\n stdoutLines: 0,\n stderr:\n 'This command must run in the sandbox, but sandboxed execution is not available.',\n stderrLines: 1,\n interrupted: false,\n }\n yield {\n type: 'result',\n resultForAssistant: renderResultForAssistant(data),\n data,\n }\n return\n }\n\n let sandboxOptions =\n sandboxPlan.settings.enabled === true\n ? sandboxPlan.bunShellSandboxOptions\n : systemSandboxOptions\n\n const bashLlmGateQuery = context.options?.bashLlmGateQuery\n\n const llmGateResult = await runBashLlmSafetyGate({\n command: input.command,\n userPrompt,\n description: commandDescription,\n platform: process.platform,\n commandSource,\n safeMode,\n runInBackground: input.run_in_background === true,\n willSandbox: Boolean(sandboxOptions?.enabled),\n sandboxRequired: Boolean(sandboxOptions?.enabled && sandboxOptions.require),\n cwd: getCwd(),\n originalCwd: getOriginalCwd(),\n parentAbortSignal: abortController.signal,\n query: bashLlmGateQuery,\n })\n\n if (llmGateResult.decision === 'block') {\n const message = formatBashLlmGateBlockMessage(llmGateResult.verdict)\n const data: Out = {\n stdout: '',\n stdoutLines: 0,\n stderr: message,\n stderrLines: message.split(/\\r?\\n/).length,\n interrupted: false,\n }\n yield {\n type: 'result',\n resultForAssistant: renderResultForAssistant(data),\n data,\n }\n return\n }\n\n if (llmGateResult.decision === 'error' && !llmGateResult.canFailOpen) {\n const userHint =\n llmGateResult.errorType === 'api'\n ? 'Fix your model connection (API key / network) and retry.'\n : llmGateResult.errorType === 'timeout'\n ? 'LLM intent gate timed out. Retry.'\n : 'LLM intent gate returned invalid output. Retry.'\n const userMessage = [\n llmGateResult.willSandbox\n ? 'Blocked: LLM intent gate failed (cannot verify command intent).'\n : 'Blocked: LLM intent gate failed and command would run unsandboxed.',\n `Error: ${llmGateResult.error}`,\n '',\n userHint,\n ]\n .filter(Boolean)\n .join('\\n')\n\n // Keep user-only bypass instructions out of the model-facing tool result to avoid\n // encouraging the assistant to \"solve\" the problem by bypassing safety.\n const assistantMessage = [\n llmGateResult.willSandbox\n ? 'Blocked: LLM intent gate unavailable.'\n : 'Blocked: LLM intent gate unavailable (command would run unsandboxed).',\n `Error: ${llmGateResult.error}`,\n llmGateResult.errorType === 'invalid_output'\n ? 'Hint: Retry and include a short `description` for the Bash command.'\n : llmGateResult.errorType === 'timeout'\n ? 'Hint: Retry (or switch to a faster main model).'\n : '',\n ]\n .filter(Boolean)\n .join('\\n')\n const data: Out = {\n stdout: '',\n stdoutLines: 0,\n stderr: userMessage,\n stderrLines: userMessage.split(/\\r?\\n/).length,\n interrupted: false,\n }\n yield {\n type: 'result',\n resultForAssistant: assistantMessage,\n data,\n }\n return\n }\n\n sandboxOptions = await maybeAttachSandboxNetworkPorts({\n sandboxPlan,\n sandboxOptions,\n context,\n })\n\n // \uD83D\uDD27 Check if already cancelled before starting execution\n if (abortController.signal.aborted) {\n const data: Out = {\n stdout: '',\n stdoutLines: 0,\n stderr: 'Command cancelled before execution',\n stderrLines: 1,\n interrupted: true,\n }\n\n yield {\n type: 'result',\n resultForAssistant: renderResultForAssistant(data),\n data,\n }\n return\n }\n\n try {\n if (input.run_in_background) {\n const { bashId } = BunShell.getInstance().execInBackground(\n input.command,\n input.timeout,\n {\n sandbox: sandboxOptions,\n },\n )\n const data: Out = {\n stdout: '',\n stdoutLines: 0,\n stderr: '',\n stderrLines: 0,\n interrupted: false,\n bashId,\n backgroundTaskId: bashId,\n }\n yield {\n type: 'result',\n resultForAssistant: renderResultForAssistant(data),\n data,\n }\n return\n }\n\n yield* executeForegroundBash({\n command: input.command,\n timeout: input.timeout,\n abortController,\n readFileTimestamps,\n sandboxOptions,\n setToolJSX,\n renderResultForAssistant,\n })\n } catch (error) {\n const isAborted = abortController.signal.aborted\n const errorMessage = isAborted\n ? 'Command was cancelled by user'\n : `Command failed: ${error instanceof Error ? error.message : String(error)}`\n\n const data: Out = {\n stdout: '',\n stdoutLines: 0,\n stderr: errorMessage,\n stderrLines: 1,\n interrupted: isAborted,\n }\n\n yield {\n type: 'result',\n resultForAssistant: renderResultForAssistant(data),\n data,\n }\n } finally {\n setToolJSX?.(null)\n }\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { Tool } from '#core/tooling/Tool'\nimport { enterPlanMode } from '#core/utils/planMode'\nimport { ENTER_DESCRIPTION, ENTER_PROMPT, ENTER_TOOL_NAME } from './prompt'\nimport { getTheme } from '#core/utils/theme'\nimport { BLACK_CIRCLE } from '#core/constants/figures'\nimport { setPermissionMode } from '#core/utils/permissionModeState'\n\nconst inputSchema = z.strictObject({})\n\ntype Output = {\n message: string\n}\n\nexport const EnterPlanModeTool = {\n name: ENTER_TOOL_NAME,\n async description() {\n return ENTER_DESCRIPTION\n },\n userFacingName() {\n return ''\n },\n inputSchema,\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return true\n },\n requiresUserInteraction() {\n return true\n },\n async prompt() {\n return ENTER_PROMPT\n },\n renderToolUseMessage() {\n return ''\n },\n renderToolUseRejectedMessage() {\n const theme = getTheme()\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n <Text color={theme.text}>{BLACK_CIRCLE}</Text>\n <Text> User declined to enter plan mode</Text>\n </Box>\n )\n },\n renderToolResultMessage(_output: Output) {\n const theme = getTheme()\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\">\n <Text color={theme.planMode}>{BLACK_CIRCLE}</Text>\n <Text> Entered plan mode</Text>\n </Box>\n <Box paddingLeft={2}>\n <Text dimColor>\n Kode Agent is now exploring and designing an implementation\n approach.\n </Text>\n </Box>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return `${output.message}\n\nIn plan mode, you should:\n1. Thoroughly explore the codebase to understand existing patterns\n2. Identify similar features and architectural approaches\n3. Consider multiple approaches and their trade-offs\n4. Use AskUserQuestion if you need to clarify the approach\n5. Design a concrete implementation strategy\n6. When ready, use ExitPlanMode to present your plan for approval\n\nRemember: DO NOT write or edit any files yet. This is a read-only exploration and planning phase.`\n },\n async *call(_input: z.infer<typeof inputSchema>, context: any) {\n if (context?.agentId) {\n throw new Error('EnterPlanMode tool cannot be used in agent contexts')\n }\n\n setPermissionMode(context, 'plan')\n enterPlanMode(context)\n\n const output: Output = {\n message:\n 'Entered plan mode. You should now focus on exploring the codebase and designing an implementation approach.',\n }\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const ENTER_TOOL_NAME = 'EnterPlanMode'\nexport const EXIT_TOOL_NAME = 'ExitPlanMode'\n\nexport const ENTER_DESCRIPTION =\n 'Requests permission to enter plan mode for complex tasks requiring exploration and design'\n\nexport const ENTER_PROMPT = `Use this tool proactively when you're about to start a non-trivial implementation task. Getting user sign-off on your approach before writing code prevents wasted effort and ensures alignment. This tool transitions you into plan mode where you can explore the codebase and design an implementation approach for user approval.\n\n## When to Use This Tool\n\n**Prefer using EnterPlanMode** for implementation tasks unless they're simple. Use it when ANY of these conditions apply:\n\n1. **New Feature Implementation**: Adding meaningful new functionality\n - Example: \"Add a logout button\" - where should it go? What should happen on click?\n - Example: \"Add form validation\" - what rules? What error messages?\n\n2. **Multiple Valid Approaches**: The task can be solved in several different ways\n - Example: \"Add caching to the API\" - could use Redis, in-memory, file-based, etc.\n - Example: \"Improve performance\" - many optimization strategies possible\n\n3. **Code Modifications**: Changes that affect existing behavior or structure\n - Example: \"Update the login flow\" - what exactly should change?\n - Example: \"Refactor this component\" - what's the target architecture?\n\n4. **Architectural Decisions**: The task requires choosing between patterns or technologies\n - Example: \"Add real-time updates\" - WebSockets vs SSE vs polling\n - Example: \"Implement state management\" - Redux vs Context vs custom solution\n\n5. **Multi-File Changes**: The task will likely touch more than 2-3 files\n - Example: \"Refactor the authentication system\"\n - Example: \"Add a new API endpoint with tests\"\n\n6. **Unclear Requirements**: You need to explore before understanding the full scope\n - Example: \"Make the app faster\" - need to profile and identify bottlenecks\n - Example: \"Fix the bug in checkout\" - need to investigate root cause\n\n7. **User Preferences Matter**: The implementation could reasonably go multiple ways\n - If you would use AskUserQuestion to clarify the approach, use EnterPlanMode instead\n - Plan mode lets you explore first, then present options with context\n\n## When NOT to Use This Tool\n\nOnly skip EnterPlanMode for simple tasks:\n- Single-line or few-line fixes (typos, obvious bugs, small tweaks)\n- Adding a single function with clear requirements\n- Tasks where the user has given very specific, detailed instructions\n- Pure research/exploration tasks (use the Task tool with explore agent instead)\n\n## What Happens in Plan Mode\n\nIn plan mode, you'll:\n1. Thoroughly explore the codebase using Glob, Grep, and Read tools\n2. Understand existing patterns and architecture\n3. Design an implementation approach\n4. Present your plan to the user for approval\n5. Use AskUserQuestion if you need to clarify approaches\n6. Exit plan mode with ExitPlanMode when ready to implement\n\n## Examples\n\n### GOOD - Use EnterPlanMode:\nUser: \"Add user authentication to the app\"\n- Requires architectural decisions (session vs JWT, where to store tokens, middleware structure)\n\nUser: \"Optimize the database queries\"\n- Multiple approaches possible, need to profile first, significant impact\n\nUser: \"Implement dark mode\"\n- Architectural decision on theme system, affects many components\n\nUser: \"Add a delete button to the user profile\"\n- Seems simple but involves: where to place it, confirmation dialog, API call, error handling, state updates\n\nUser: \"Update the error handling in the API\"\n- Affects multiple files, user should approve the approach\n\n### BAD - Don't use EnterPlanMode:\nUser: \"Fix the typo in the README\"\n- Straightforward, no planning needed\n\nUser: \"Add a console.log to debug this function\"\n- Simple, obvious implementation\n\nUser: \"What files handle routing?\"\n- Research task, not implementation planning\n\n## Important Notes\n\n- This tool REQUIRES user approval - they must consent to entering plan mode\n- If unsure whether to use it, err on the side of planning - it's better to get alignment upfront than to redo work\n- Users appreciate being consulted before significant changes are made to their codebase`\n\nexport const EXIT_DESCRIPTION =\n 'Prompts the user to exit plan mode and start coding'\n\nexport const EXIT_PROMPT = `Use this tool when you are in plan mode and have finished writing your plan to the plan file and are ready for user approval.\n\n## How This Tool Works\n- You should have already written your plan to the plan file specified in the plan mode system message\n- This tool does NOT take the plan content as a parameter - it will read the plan from the file you wrote\n- This tool simply signals that you're done planning and ready for the user to review and approve\n- The user will see the contents of your plan file when they review it\n\n## When to Use This Tool\nIMPORTANT: Only use this tool when the task requires planning the implementation steps of a task that requires writing code. For research tasks where you're gathering information, searching files, reading files or in general trying to understand the codebase - do NOT use this tool.\n\n## Handling Ambiguity in Plans\nBefore using this tool, ensure your plan is clear and unambiguous. If there are multiple valid approaches or unclear requirements:\n1. Use the AskUserQuestion tool to clarify with the user\n2. Ask about specific implementation choices (e.g., architectural patterns, which library to use)\n3. Clarify any assumptions that could affect the implementation\n4. Edit your plan file to incorporate user feedback\n5. Only proceed with ExitPlanMode after resolving ambiguities and updating the plan file\n\n## Examples\n\n1. Initial task: \"Search for and understand the implementation of vim mode in the codebase\" - Do not use the exit plan mode tool because you are not planning the implementation steps of the task.\n2. Initial task: \"Help me implement yank mode for vim\" - Use the exit plan mode tool after you have finished planning the implementation steps of the task.\n3. Initial task: \"Add a new feature to handle user authentication\" - If unsure about auth method (OAuth, JWT, etc.), use AskUserQuestion first, then use exit plan mode tool after clarifying the approach.`\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { Tool } from '#core/tooling/Tool'\nimport {\n getPlanConversationKey,\n getPlanFilePath,\n readPlanFile,\n} from '#core/utils/planMode'\nimport { EXIT_DESCRIPTION, EXIT_PROMPT, EXIT_TOOL_NAME } from './prompt'\nimport { getTheme } from '#core/utils/theme'\nimport { BLACK_CIRCLE } from '#core/constants/figures'\n\nfunction getExitPlanModePlanText(conversationKey?: string): string {\n const { content } = readPlanFile(undefined, conversationKey)\n return (\n content || 'No plan found. Please write your plan to the plan file first.'\n )\n}\n\nexport function __getExitPlanModePlanTextForTests(\n conversationKey?: string,\n): string {\n return getExitPlanModePlanText(conversationKey)\n}\n\nconst inputSchema = z\n .strictObject({\n launchSwarm: z\n .boolean()\n .optional()\n .describe('Whether to launch a swarm to implement the plan'),\n teammateCount: z\n .number()\n .optional()\n .describe('Number of teammates to spawn in the swarm'),\n })\n .passthrough()\n\ntype Output = {\n plan: string\n isAgent: boolean\n filePath?: string\n launchSwarm?: boolean\n teammateCount?: number\n}\n\nexport const ExitPlanModeTool = {\n name: EXIT_TOOL_NAME,\n async description() {\n return EXIT_DESCRIPTION\n },\n userFacingName() {\n return ''\n },\n inputSchema,\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return true\n },\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return true\n },\n requiresUserInteraction() {\n return true\n },\n async prompt() {\n return EXIT_PROMPT\n },\n renderToolUseMessage() {\n return ''\n },\n renderToolUseRejectedMessage(\n _input: z.infer<typeof inputSchema>,\n options: { conversationKey?: string } = {},\n ) {\n const theme = getTheme()\n const conversationKey =\n typeof options.conversationKey === 'string' &&\n options.conversationKey.trim()\n ? options.conversationKey.trim()\n : undefined\n\n const { content } = readPlanFile(undefined, conversationKey)\n const plan = getExitPlanModePlanText(conversationKey)\n\n return (\n <Box flexDirection=\"column\" marginTop={1} width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Box flexDirection=\"column\" width=\"100%\">\n <Text color={theme.error}>\n User rejected Kode Agent&apos;s plan:\n </Text>\n <Box\n borderStyle=\"round\"\n borderColor={theme.planMode}\n borderDimColor\n paddingX={1}\n overflow=\"hidden\"\n >\n <Text dimColor>{plan}</Text>\n </Box>\n </Box>\n </Box>\n </Box>\n )\n },\n renderToolResultMessage(output: Output) {\n const theme = getTheme()\n const planPath =\n typeof output.filePath === 'string' ? output.filePath : null\n const plan = output.plan || 'No plan found'\n\n return (\n <Box flexDirection=\"column\" marginTop={1} width=\"100%\">\n <Box flexDirection=\"row\">\n <Text color={theme.planMode}>{BLACK_CIRCLE}</Text>\n <Text> User approved Kode Agent&apos;s plan</Text>\n </Box>\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Box flexDirection=\"column\">\n {planPath ? (\n <Text dimColor>Plan saved to: {planPath} \u00B7 /plan to edit</Text>\n ) : null}\n <Text dimColor>{plan}</Text>\n </Box>\n </Box>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n if (output.isAgent) {\n return 'User has approved the plan. There is nothing else needed from you now. Please respond with \"ok\"'\n }\n\n if (output.launchSwarm && output.teammateCount) {\n return `User has approved your plan AND requested a swarm of ${output.teammateCount} teammates to implement it.\n\nPlease follow these steps to launch the swarm:\n\n1. **Create tasks from your plan** - Parse your plan and create tasks using TaskCreateTool for each actionable item. Each task should have a clear subject and description.\n\n2. **Create a team** - Use TeammateTool with operation: \"spawnTeam\" to create a new team:\n \\`\\`\\`json\n {\n \"operation\": \"spawnTeam\",\n \"team_name\": \"plan-implementation\",\n \"description\": \"Team implementing the approved plan\"\n }\n \\`\\`\\`\n\n3. **Spawn ${output.teammateCount} teammates** - Use TeammateTool with operation: \"spawn\" for each teammate:\n \\`\\`\\`json\n {\n \"operation\": \"spawn\",\n \"name\": \"worker-1\",\n \"prompt\": \"You are part of a team implementing a plan. Check your mailbox for task assignments.\",\n \"team_name\": \"plan-implementation\",\n \"agent_type\": \"worker\"\n }\n \\`\\`\\`\n\n4. **Assign tasks to teammates** - Use TeammateTool with operation: \"assignTask\" to distribute work:\n \\`\\`\\`json\n {\n \"operation\": \"assignTask\",\n \"taskId\": \"1\",\n \"assignee\": \"<agent_id from spawn>\",\n \"team_name\": \"plan-implementation\"\n }\n \\`\\`\\`\n\n5. **Gather findings and post summary** - As the leader/coordinator, monitor your teammates' progress. When they complete their tasks and report back, gather their findings and synthesize a final summary for the user explaining what was accomplished, any issues encountered, and next steps if applicable.\n\nYour plan has been saved to: ${output.filePath}\n\n## Approved Plan:\n${output.plan}`\n }\n\n return `User has approved your plan. You can now start coding. Start with updating your todo list if applicable\n\nYour plan has been saved to: ${output.filePath}\nYou can refer back to it if needed during implementation.\n\n## Approved Plan:\n${output.plan}`\n },\n async *call(input: z.infer<typeof inputSchema>, context: any) {\n const conversationKey = getPlanConversationKey(context)\n const planFilePath = getPlanFilePath(context?.agentId, conversationKey)\n const { content, exists } = readPlanFile(context?.agentId, conversationKey)\n if (!exists) {\n throw new Error(\n `No plan file found at ${planFilePath}. Please write your plan to this file before calling ExitPlanMode.`,\n )\n }\n\n const isAgent = !!context?.agentId\n const output: Output = {\n plan: content,\n isAgent,\n filePath: planFilePath,\n launchSwarm: input.launchSwarm,\n teammateCount: input.teammateCount,\n }\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "import { Box, Text } from 'ink'\nimport { extname, relative } from 'path'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { highlight, supportsLanguage } from 'cli-highlight'\nimport type { Tool } from '#core/tooling/Tool'\nimport { NotebookCellType, NotebookContent } from '#core/types/notebook'\nimport { readFileBun, fileExistsBun } from '#runtime/file'\nimport { safeParseJSON } from '#core/utils/json'\nimport { getCwd } from '#core/utils/state'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { hasWritePermission } from '#core/utils/permissions/filesystem'\nimport { findCellIndex } from './cells'\nimport { editNotebookFile, resolveNotebookPath } from './editor'\n\nfunction highlightCode(code: string, language: string): string {\n try {\n if (supportsLanguage(language)) {\n return highlight(code, { language })\n }\n return highlight(code, { language: 'markdown' })\n } catch {\n return highlight(code, { language: 'markdown' })\n }\n}\n\nconst inputSchema = z.strictObject({\n notebook_path: z\n .string()\n .describe(\n 'The absolute path to the Jupyter notebook file to edit (must be absolute, not relative)',\n ),\n cell_id: z\n .string()\n .optional()\n .describe(\n 'The ID of the cell to edit. When inserting a new cell, the new cell will be inserted after the cell with this ID, or at the beginning if not specified.',\n ),\n new_source: z.string().describe('The new source for the cell'),\n cell_type: z\n .enum(['code', 'markdown'])\n .optional()\n .describe(\n 'The type of the cell (code or markdown). If not specified, it defaults to the current cell type. If using edit_mode=insert, this is required.',\n ),\n edit_mode: z\n .enum(['replace', 'insert', 'delete'])\n .optional()\n .describe(\n 'The type of edit to make (replace, insert, delete). Defaults to replace.',\n ),\n})\n\nexport const NotebookEditTool = {\n name: 'NotebookEdit',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Edit Notebook'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false // NotebookEditTool modifies state/files, not safe for concurrent execution\n },\n needsPermissions({ notebook_path }) {\n return !hasWritePermission(notebook_path)\n },\n renderResultForAssistant({ cell_id, edit_mode, new_source, error }) {\n if (error) {\n return error\n }\n switch (edit_mode) {\n case 'replace':\n return `Updated cell ${cell_id} with ${new_source}`\n case 'insert':\n return `Inserted cell after ${cell_id ?? 'beginning'} with ${new_source}`\n case 'delete':\n return `Deleted cell ${cell_id}`\n }\n },\n renderToolUseMessage(input, { verbose }) {\n const cellRef = input.cell_id ?? '(none)'\n return `notebook_path: ${verbose ? input.notebook_path : relative(getCwd(), input.notebook_path)}, cell_id: ${cellRef}, content: ${input.new_source.slice(0, 30)}\u2026, cell_type: ${input.cell_type}, edit_mode: ${input.edit_mode ?? 'replace'}`\n },\n renderToolResultMessage({ cell_id, new_source, language, error }) {\n if (error) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">{error}</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text>Updated cell {cell_id}:</Text>\n <Box marginLeft={2}>\n <Text>{highlightCode(new_source, language)}</Text>\n </Box>\n </Box>\n )\n },\n async validateInput({\n notebook_path,\n cell_id,\n cell_type,\n edit_mode = 'replace',\n }) {\n const fullPath = resolveNotebookPath(notebook_path)\n\n if (!fileExistsBun(fullPath)) {\n return {\n result: false,\n message: 'Notebook file does not exist.',\n }\n }\n\n if (extname(fullPath) !== '.ipynb') {\n return {\n result: false,\n message:\n 'File must be a Jupyter notebook (.ipynb file). For editing other file types, use the FileEdit tool.',\n }\n }\n\n if (edit_mode === 'insert' && !cell_type) {\n return {\n result: false,\n message: 'Cell type is required when using edit_mode=insert.',\n }\n }\n\n const content = await readFileBun(fullPath)\n if (!content) {\n return {\n result: false,\n message: 'Could not read notebook file.',\n }\n }\n const notebook = safeParseJSON(content) as NotebookContent | null\n if (!notebook) {\n return {\n result: false,\n message: 'Notebook is not valid JSON.',\n }\n }\n\n if ((edit_mode === 'replace' || edit_mode === 'delete') && !cell_id) {\n return {\n result: false,\n message: 'cell_id is required for replace/delete edits.',\n }\n }\n\n if (cell_id) {\n const index = findCellIndex(notebook, cell_id)\n if (index === null || index < 0 || index >= notebook.cells.length) {\n return {\n result: false,\n message: `Cell ID is out of bounds or not found. Notebook has ${notebook.cells.length} cells.`,\n }\n }\n }\n\n return { result: true }\n },\n async *call({ notebook_path, cell_id, new_source, cell_type, edit_mode }) {\n const data = await editNotebookFile({\n notebook_path,\n cell_id,\n new_source,\n cell_type,\n edit_mode,\n })\n yield {\n type: 'result',\n data,\n resultForAssistant: this.renderResultForAssistant(data),\n }\n },\n} satisfies Tool<\n typeof inputSchema,\n {\n cell_id?: string\n new_source: string\n cell_type: NotebookCellType\n language: string\n edit_mode: string\n error?: string\n }\n>\n", "/**\n * BunFile - File operations using Node.js fs APIs.\n *\n * Note: The function names remain for compatibility, even though the\n * implementation is now Node-compatible (no Bun runtime required).\n */\n\nimport { existsSync } from 'node:fs'\nimport { appendFile, open, readFile, stat, writeFile } from 'node:fs/promises'\n\nfunction logError(message: string): void {\n if (process.env.NODE_ENV === 'test') {\n console.error(message)\n }\n}\n\n/**\n * Read file. Returns null if the file doesn't exist or can't be read.\n */\nexport async function readFileBun(filepath: string): Promise<string | null> {\n try {\n if (!existsSync(filepath)) {\n return null\n }\n return await readFile(filepath, 'utf8')\n } catch (error) {\n logError(`readFileBun error for ${filepath}: ${error}`)\n return null\n }\n}\n\n/**\n * Write file. Returns whether the write succeeded.\n */\nexport async function writeFileBun(\n filepath: string,\n content: string | Buffer,\n): Promise<boolean> {\n try {\n await writeFile(filepath, content)\n return true\n } catch (error) {\n logError(`writeFileBun error for ${filepath}: ${error}`)\n return false\n }\n}\n\n/**\n * Check if file exists.\n */\nexport function fileExistsBun(filepath: string): boolean {\n return existsSync(filepath)\n}\n\n/**\n * Get file size. Returns 0 if file doesn't exist.\n */\nexport async function getFileSizeBun(filepath: string): Promise<number> {\n try {\n if (!existsSync(filepath)) {\n return 0\n }\n const s = await stat(filepath)\n return s.size\n } catch (error) {\n logError(`getFileSizeBun error for ${filepath}: ${error}`)\n return 0\n }\n}\n\n/**\n * Read file asynchronously with optional limit\n * Useful for large files where we only need partial content\n */\nexport async function readPartialFileBun(\n filepath: string,\n maxBytes?: number,\n): Promise<string | null> {\n try {\n if (!existsSync(filepath)) {\n return null\n }\n if (!maxBytes) {\n return await readFile(filepath, 'utf8')\n }\n\n const handle = await open(filepath, 'r')\n try {\n const buffer = Buffer.alloc(maxBytes)\n const { bytesRead } = await handle.read(buffer, 0, maxBytes, 0)\n return buffer.subarray(0, bytesRead).toString('utf8')\n } finally {\n await handle.close()\n }\n } catch (error) {\n logError(`readPartialFileBun error for ${filepath}: ${error}`)\n return null\n }\n}\n\n/**\n * Append to a file.\n */\nexport async function appendFileBun(\n filepath: string,\n content: string,\n): Promise<boolean> {\n try {\n await appendFile(filepath, content, 'utf8')\n return true\n } catch (error) {\n logError(`appendFileBun error for ${filepath}: ${error}`)\n return false\n }\n}\n", "export const DESCRIPTION =\n 'Replace the contents of a specific cell in a Jupyter notebook.'\nexport const PROMPT = `Completely replaces the contents of a specific cell in a Jupyter notebook (.ipynb file) with new source. Jupyter notebooks are interactive documents that combine code, text, and visualizations, commonly used for data analysis and scientific computing. The notebook_path parameter must be an absolute path, not a relative path. The cell_number is 0-indexed. Use edit_mode=insert to add a new cell at the index specified by cell_number. Use edit_mode=delete to delete the cell at the index specified by cell_number.`\n", "import type { NotebookContent } from '#core/types/notebook'\n\nexport function getDerivedCellId(index: number): string {\n return `cell-${index}`\n}\n\nexport function getCellId(\n cell: NotebookContent['cells'][number],\n index: number,\n): string {\n return cell.id ?? getDerivedCellId(index)\n}\n\nfunction parseCellIdAsIndex(cellId: string): number | undefined {\n const trimmed = cellId.trim()\n if (/^\\d+$/.test(trimmed)) return Number(trimmed)\n const match = trimmed.match(/^cell-(\\d+)$/)\n if (match) return Number(match[1])\n return undefined\n}\n\nexport function findCellIndex(\n notebook: NotebookContent,\n cellId: string,\n): number | null {\n const numericIndex = parseCellIdAsIndex(cellId)\n if (numericIndex !== undefined) return numericIndex\n\n const index = notebook.cells.findIndex(\n (cell, idx) => getCellId(cell, idx) === cellId,\n )\n return index >= 0 ? index : null\n}\n", "import { randomUUID } from 'crypto'\nimport { isAbsolute, resolve } from 'path'\n\nimport type { NotebookCellType } from '#core/types/notebook'\nimport { NotebookContent } from '#core/types/notebook'\nimport {\n detectFileEncoding,\n detectLineEndings,\n writeTextContent,\n} from '#core/utils/file'\nimport { readFileBun } from '#runtime/file'\nimport { getCwd } from '#core/utils/state'\nimport { emitReminderEvent } from '#core/services/systemReminder'\nimport { recordFileEdit } from '#core/services/fileFreshness'\n\nimport { findCellIndex, getCellId, getDerivedCellId } from './cells'\n\nexport type NotebookEditResult = {\n cell_id?: string\n new_source: string\n cell_type: NotebookCellType\n language: string\n edit_mode: string\n error?: string\n}\n\nexport function resolveNotebookPath(input: string): string {\n return isAbsolute(input) ? input : resolve(getCwd(), input)\n}\n\nexport async function editNotebookFile(args: {\n notebook_path: string\n cell_id?: string\n new_source: string\n cell_type?: NotebookCellType\n edit_mode?: 'replace' | 'insert' | 'delete'\n}): Promise<NotebookEditResult> {\n const fullPath = resolveNotebookPath(args.notebook_path)\n const mode = args.edit_mode ?? 'replace'\n let editedCellId: string | undefined = args.cell_id\n\n try {\n const enc = detectFileEncoding(fullPath)\n const content = await readFileBun(fullPath)\n if (!content) {\n throw new Error('Could not read notebook file')\n }\n\n const notebook = JSON.parse(content) as NotebookContent\n const language = notebook.metadata.language_info?.name ?? 'python'\n\n const resolveIndexOrThrow = (): number => {\n if (!args.cell_id) {\n throw new Error('cell_id is required for this edit')\n }\n const idx = findCellIndex(notebook, args.cell_id)\n if (idx === null || idx < 0 || idx >= notebook.cells.length) {\n throw new Error(`Cell not found: ${args.cell_id}`)\n }\n return idx\n }\n\n if (mode === 'delete') {\n const idx = resolveIndexOrThrow()\n editedCellId = getCellId(notebook.cells[idx]!, idx)\n notebook.cells.splice(idx, 1)\n } else if (mode === 'insert') {\n if (!args.cell_type) {\n throw new Error('cell_type is required for insert edits')\n }\n\n const afterIndex =\n args.cell_id === undefined ? -1 : findCellIndex(notebook, args.cell_id)\n if (afterIndex === null) {\n throw new Error(`Cell not found: ${args.cell_id}`)\n }\n\n const insertIndex = afterIndex === -1 ? 0 : afterIndex + 1\n\n const newCell: NotebookContent['cells'][number] = {\n cell_type: args.cell_type,\n source: args.new_source,\n metadata: {},\n ...(args.cell_type === 'code' ? { outputs: [] } : {}),\n }\n\n if (notebook.nbformat === 4 && notebook.nbformat_minor >= 5) {\n newCell.id = randomUUID()\n }\n\n notebook.cells.splice(insertIndex, 0, newCell)\n editedCellId = newCell.id ?? getDerivedCellId(insertIndex)\n } else {\n const idx = resolveIndexOrThrow()\n const targetCell = notebook.cells[idx]!\n targetCell.source = args.new_source\n targetCell.execution_count = undefined\n targetCell.outputs = []\n if (args.cell_type && args.cell_type !== targetCell.cell_type) {\n targetCell.cell_type = args.cell_type\n }\n editedCellId = getCellId(targetCell, idx)\n }\n\n const endings = detectLineEndings(fullPath)\n const updatedNotebook = JSON.stringify(notebook, null, 1)\n writeTextContent(fullPath, updatedNotebook, enc, endings!)\n\n recordFileEdit(fullPath, updatedNotebook)\n emitReminderEvent('file:edited', {\n filePath: fullPath,\n cellId: editedCellId,\n newSource: args.new_source,\n cellType: args.cell_type,\n editMode: mode,\n timestamp: Date.now(),\n operation: 'notebook_edit',\n })\n\n return {\n cell_id: editedCellId,\n new_source: args.new_source,\n cell_type: args.cell_type ?? 'code',\n language,\n edit_mode: mode,\n error: '',\n }\n } catch (error) {\n return {\n cell_id: args.cell_id,\n new_source: args.new_source,\n cell_type: args.cell_type ?? 'code',\n language: 'python',\n edit_mode: mode,\n error:\n error instanceof Error\n ? error.message\n : 'Unknown error occurred while editing notebook',\n }\n }\n}\n", "import { Hunk } from 'diff'\nimport { mkdirSync, readFileSync, statSync } from 'fs'\nimport { dirname, isAbsolute, relative, resolve, sep } from 'path'\nimport { z } from 'zod'\nimport { Tool, ValidationResult } from '#core/tooling/Tool'\nimport {\n addLineNumbers,\n detectFileEncoding,\n detectLineEndings,\n findSimilarFile,\n writeTextContent,\n} from '#core/utils/file'\nimport { readFileBun, fileExistsBun } from '#runtime/file'\nimport { getCwd } from '#core/utils/state'\nimport { emitReminderEvent } from '#core/services/systemReminder'\nimport { recordFileEdit } from '#core/services/fileFreshness'\nimport { NotebookEditTool } from '#tools/tools/filesystem/NotebookEditTool/NotebookEditTool'\nimport { DESCRIPTION } from './prompt'\nimport { applyEdit } from './utils'\nimport { hasWritePermission } from '#core/utils/permissions/filesystem'\nimport { PROJECT_FILE } from '#core/constants/product'\nimport { normalizeLineEndings } from '#core/utils/paste'\n\nconst inputSchema = z.strictObject({\n file_path: z.string().describe('The absolute path to the file to modify'),\n old_string: z.string().describe('The text to replace'),\n new_string: z.string().describe('The text to replace it with'),\n replace_all: z\n .boolean()\n .optional()\n .describe('Replace all occurences of old_string (default false)'),\n})\n\nexport type In = typeof inputSchema\n\n// Number of lines of context to include before/after the change in our result message\nconst N_LINES_SNIPPET = 4\n\nexport const FileEditTool = {\n name: 'Edit',\n async description() {\n return 'A tool for editing files'\n },\n async prompt() {\n return DESCRIPTION\n },\n inputSchema,\n userFacingName() {\n return 'Edit'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false // FileEdit modifies files, not safe for concurrent execution\n },\n needsPermissions({ file_path }) {\n return !hasWritePermission(file_path)\n },\n renderToolUseMessage(input, { verbose }) {\n return `file_path: ${verbose ? input.file_path : relative(getCwd(), input.file_path)}`\n },\n async validateInput(\n { file_path, old_string, new_string, replace_all },\n { readFileTimestamps },\n ) {\n if (old_string === new_string) {\n return {\n result: false,\n message:\n 'No changes to make: old_string and new_string are exactly the same.',\n meta: {\n old_string,\n },\n } as ValidationResult\n }\n\n const fullFilePath = isAbsolute(file_path)\n ? file_path\n : resolve(getCwd(), file_path)\n\n if (old_string === '') {\n if (!fileExistsBun(fullFilePath)) return { result: true }\n const existingContent = await readFileBun(fullFilePath)\n if (normalizeLineEndings(existingContent ?? '').trim() !== '') {\n return {\n result: false,\n message: 'Cannot create new file - file already exists.',\n }\n }\n return { result: true }\n }\n\n if (!fileExistsBun(fullFilePath)) {\n // Try to find a similar file with a different extension\n const similarFilename = findSimilarFile(fullFilePath)\n let message = 'File does not exist.'\n\n // If we found a similar file, suggest it to the assistant\n if (similarFilename) {\n message += ` Did you mean ${similarFilename}?`\n }\n\n return {\n result: false,\n message,\n }\n }\n\n if (fullFilePath.endsWith('.ipynb')) {\n return {\n result: false,\n message: `File is a Jupyter Notebook. Use the ${NotebookEditTool.name} to edit this file.`,\n }\n }\n\n const readTimestamp = readFileTimestamps[fullFilePath]\n if (!readTimestamp) {\n return {\n result: false,\n message:\n 'File has not been read yet. Read it first before writing to it.',\n meta: {\n isFilePathAbsolute: String(isAbsolute(file_path)),\n },\n }\n }\n\n // Check if file exists and get its last modified time\n const stats = statSync(fullFilePath)\n const lastWriteTime = stats.mtimeMs\n if (lastWriteTime > readTimestamp) {\n return {\n result: false,\n message:\n 'File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.',\n }\n }\n\n const file = await readFileBun(fullFilePath)\n const normalizedFile = normalizeLineEndings(file ?? '')\n const normalizedOldString = normalizeLineEndings(old_string)\n if (!file) {\n return {\n result: false,\n message: 'Could not read file.',\n meta: {\n isFilePathAbsolute: String(isAbsolute(file_path)),\n },\n }\n }\n if (!normalizedFile.includes(normalizedOldString)) {\n return {\n result: false,\n message: `String to replace not found in file.\\nString: ${old_string}`,\n meta: {\n isFilePathAbsolute: String(isAbsolute(file_path)),\n },\n }\n }\n\n const matches = normalizedFile.split(normalizedOldString).length - 1\n if (matches > 1 && !replace_all) {\n return {\n result: false,\n message: `Found ${matches} matches of the string to replace, but replace_all is false. To replace all occurrences, set replace_all to true. To replace only one occurrence, please provide more context to uniquely identify the instance.\\nString: ${old_string}`,\n meta: {\n isFilePathAbsolute: String(isAbsolute(file_path)),\n },\n }\n }\n\n return { result: true }\n },\n async *call(\n { file_path, old_string, new_string, replace_all },\n { readFileTimestamps },\n ) {\n const fullFilePath = isAbsolute(file_path)\n ? file_path\n : resolve(getCwd(), file_path)\n\n if (fileExistsBun(fullFilePath)) {\n const readTimestamp = readFileTimestamps[fullFilePath]\n const lastWriteTime = statSync(fullFilePath).mtimeMs\n if (!readTimestamp || lastWriteTime > readTimestamp) {\n throw new Error(\n 'File has been unexpectedly modified. Read it again before attempting to write it.',\n )\n }\n }\n\n const { patch, updatedFile } = await applyEdit(\n file_path,\n old_string,\n new_string,\n replace_all ?? false,\n )\n\n const dir = dirname(fullFilePath)\n mkdirSync(dir, { recursive: true })\n const enc = fileExistsBun(fullFilePath)\n ? detectFileEncoding(fullFilePath)\n : 'utf8'\n const endings = fileExistsBun(fullFilePath)\n ? detectLineEndings(fullFilePath)\n : 'LF'\n const originalFile = fileExistsBun(fullFilePath)\n ? normalizeLineEndings((await readFileBun(fullFilePath)) ?? '')\n : ''\n writeTextContent(fullFilePath, updatedFile, enc, endings)\n\n // Record Agent edit operation for file freshness tracking\n recordFileEdit(fullFilePath, updatedFile)\n\n // Update read timestamp, to invalidate stale writes\n readFileTimestamps[fullFilePath] = statSync(fullFilePath).mtimeMs\n\n // Emit file edited event for system reminders\n emitReminderEvent('file:edited', {\n filePath: fullFilePath,\n oldString: old_string,\n newString: new_string,\n timestamp: Date.now(),\n operation:\n old_string === '' ? 'create' : new_string === '' ? 'delete' : 'update',\n })\n\n const data = {\n filePath: file_path,\n oldString: old_string,\n newString: new_string,\n originalFile,\n structuredPatch: patch,\n }\n yield {\n type: 'result',\n data,\n resultForAssistant: this.renderResultForAssistant(data),\n }\n },\n renderResultForAssistant({ filePath, originalFile, oldString, newString }) {\n const { snippet, startLine } = getSnippet(\n normalizeLineEndings(originalFile || ''),\n normalizeLineEndings(oldString),\n normalizeLineEndings(newString),\n )\n return `The file ${filePath} has been updated. Here's the result of running \\`cat -n\\` on a snippet of the edited file:\n${addLineNumbers({\n content: snippet,\n startLine,\n})}`\n },\n} satisfies Tool<\n typeof inputSchema,\n {\n filePath: string\n oldString: string\n newString: string\n originalFile: string\n structuredPatch: Hunk[]\n }\n>\n\nexport function getSnippet(\n initialText: string,\n oldStr: string,\n newStr: string,\n): { snippet: string; startLine: number } {\n const before = initialText.split(oldStr)[0] ?? ''\n const replacementLine = before.split(/\\r?\\n/).length - 1\n const newFileLines = initialText.replace(oldStr, newStr).split(/\\r?\\n/)\n // Calculate the start and end line numbers for the snippet\n const startLine = Math.max(0, replacementLine - N_LINES_SNIPPET)\n const endLine =\n replacementLine + N_LINES_SNIPPET + newStr.split(/\\r?\\n/).length\n // Get snippet\n const snippetLines = newFileLines.slice(startLine, endLine + 1)\n const snippet = snippetLines.join('\\n')\n return { snippet, startLine: startLine + 1 }\n}\n", "export const DESCRIPTION = `Performs exact string replacements in files. \n\nUsage:\n- You must use your \\`Read\\` tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file. \n- When editing text from Read tool output, ensure you preserve the exact indentation (tabs/spaces) as it appears AFTER the line number prefix. The line number prefix format is: spaces + line number + tab. Everything after that tab is the actual file content to match. Never include any part of the line number prefix in the old_string or new_string.\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.\n- Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked.\n- The edit will FAIL if \\`old_string\\` is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use \\`replace_all\\` to change every instance of \\`old_string\\`. \n- Use \\`replace_all\\` for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.`.trim()\n", "import { isAbsolute, resolve } from 'path'\nimport { getCwd } from '#core/utils/state'\nimport { readFileBun } from '#runtime/file'\nimport { type Hunk } from 'diff'\nimport { getPatch } from '#core/utils/diff'\nimport { normalizeLineEndings } from '#core/utils/paste'\n\n/**\n * Applies an edit to a file and returns the patch and updated file.\n * Does not write the file to disk.\n */\nexport async function applyEdit(\n file_path: string,\n old_string: string,\n new_string: string,\n replace_all = false,\n): Promise<{ patch: Hunk[]; updatedFile: string }> {\n const fullFilePath = isAbsolute(file_path)\n ? file_path\n : resolve(getCwd(), file_path)\n\n let originalFile\n let updatedFile\n if (old_string === '') {\n // Create new file\n originalFile = ''\n updatedFile = normalizeLineEndings(new_string)\n } else {\n // Edit existing file\n const fileContent = await readFileBun(fullFilePath)\n if (!fileContent) {\n throw new Error('Could not read file')\n }\n originalFile = normalizeLineEndings(fileContent)\n const normalizedOldString = normalizeLineEndings(old_string)\n const normalizedNewString = normalizeLineEndings(new_string)\n const oldStringForReplace =\n normalizedNewString === '' &&\n !normalizedOldString.endsWith('\\n') &&\n originalFile.includes(normalizedOldString + '\\n')\n ? normalizedOldString + '\\n'\n : normalizedOldString\n updatedFile = replace_all\n ? originalFile.split(oldStringForReplace).join(normalizedNewString)\n : originalFile.replace(oldStringForReplace, () => normalizedNewString)\n if (updatedFile === originalFile) {\n throw new Error(\n 'Original and edited file match exactly. Failed to apply edit.',\n )\n }\n }\n\n const patch = getPatch({\n filePath: file_path,\n fileContents: originalFile,\n oldStr: originalFile,\n newStr: updatedFile,\n })\n\n return { patch, updatedFile }\n}\n", "import { type Hunk, structuredPatch } from 'diff'\n\nconst CONTEXT_LINES = 3\n\n// For some reason, & confuses the diff library, so we replace it with a token,\n// then substitute it back in after the diff is computed.\nconst AMPERSAND_TOKEN = '<<:AMPERSAND_TOKEN:>>'\n\nconst DOLLAR_TOKEN = '<<:DOLLAR_TOKEN:>>'\n\nexport function getPatch({\n filePath,\n fileContents,\n oldStr,\n newStr,\n}: {\n filePath: string\n fileContents: string\n oldStr: string\n newStr: string\n}): Hunk[] {\n return structuredPatch(\n filePath,\n filePath,\n fileContents.replaceAll('&', AMPERSAND_TOKEN).replaceAll('$', DOLLAR_TOKEN),\n fileContents\n .replaceAll('&', AMPERSAND_TOKEN)\n .replaceAll('$', DOLLAR_TOKEN)\n .replace(\n oldStr.replaceAll('&', AMPERSAND_TOKEN).replaceAll('$', DOLLAR_TOKEN),\n newStr.replaceAll('&', AMPERSAND_TOKEN).replaceAll('$', DOLLAR_TOKEN),\n ),\n undefined,\n undefined,\n { context: CONTEXT_LINES },\n ).hunks.map(_ => ({\n ..._,\n lines: _.lines.map(_ =>\n _.replaceAll(AMPERSAND_TOKEN, '&').replaceAll(DOLLAR_TOKEN, '$'),\n ),\n }))\n}\n", "export function normalizeLineEndings(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n}\n\nexport function countLineBreaks(text: string): number {\n return (text.match(/\\r\\n|\\r|\\n/g) || []).length\n}\n\nexport const SPECIAL_PASTE_CHAR_THRESHOLD = 800\n\nexport function getSpecialPasteNewlineThreshold(terminalRows: number): number {\n return Math.min(terminalRows - 10, 2)\n}\n\nexport type SpecialPasteOptions = {\n terminalRows?: number\n charThreshold?: number\n}\n\nexport function shouldTreatAsSpecialPaste(\n text: string,\n options: SpecialPasteOptions = {},\n): boolean {\n const normalized = normalizeLineEndings(text)\n\n const terminalRows = options.terminalRows ?? process.stdout?.rows ?? 24\n const charThreshold = options.charThreshold ?? SPECIAL_PASTE_CHAR_THRESHOLD\n const newlineThreshold = getSpecialPasteNewlineThreshold(terminalRows)\n\n const newlineCount = countLineBreaks(normalized)\n return normalized.length > charThreshold || newlineCount > newlineThreshold\n}\n\nexport function shouldAggregatePasteChunk(\n input: string,\n hasPendingTimeout: boolean,\n): boolean {\n if (hasPendingTimeout) return true\n if (input.length > SPECIAL_PASTE_CHAR_THRESHOLD) return true\n\n // Avoid misclassifying escape-prefixed newline insert sequences from terminal keybindings (e.g. Option+Enter).\n if (input === '\\x1b\\r' || input === '\\x1b\\n') return false\n\n // Multi-line chunks (or CRLF bursts) are usually paste, but may be delivered in smaller batches.\n if (input.length > 1 && (input.includes('\\n') || input.includes('\\r')))\n return true\n\n return false\n}\n", "import { Box, Text } from 'ink'\nimport * as path from 'node:path'\nimport { extname, relative } from 'node:path'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport type { Tool } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\nimport { findSimilarFile, normalizeFilePath } from '#core/utils/file'\nimport { getTheme } from '#core/utils/theme'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { hasReadPermission } from '#core/utils/permissions/filesystem'\nimport { secureFileService } from '#core/utils/secureFile'\nimport type { FileReadToolData } from './types'\nimport { highlightCode } from './highlight'\nimport {\n BINARY_EXTENSIONS,\n IMAGE_EXTENSIONS,\n MAX_LINES_TO_RENDER,\n MAX_OUTPUT_SIZE,\n formatFileSizeError,\n} from './constants'\nimport { renderResultForAssistant } from './renderResultForAssistant'\nimport { callFileReadTool } from './call'\n\nconst inputSchema = z.strictObject({\n file_path: z.string().describe('The absolute path to the file to read'),\n offset: z\n .number()\n .optional()\n .describe(\n 'The line number to start reading from. Only provide if the file is too large to read at once',\n ),\n limit: z\n .number()\n .optional()\n .describe(\n 'The number of lines to read. Only provide if the file is too large to read at once.',\n ),\n})\n\nexport const FileReadTool = {\n name: 'Read',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // FileRead is read-only, safe for concurrent execution\n },\n userFacingName() {\n return 'Read'\n },\n async isEnabled() {\n return true\n },\n needsPermissions({ file_path }) {\n return !hasReadPermission(file_path || getCwd())\n },\n renderToolUseMessage(input, { verbose }) {\n const { file_path, ...rest } = input\n const entries = [\n ['file_path', verbose ? file_path : relative(getCwd(), file_path)],\n ...Object.entries(rest),\n ]\n return entries\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n renderToolResultMessage(output) {\n const verbose = false // Set default value for verbose\n // NOTE: Directory trees are rendered non-recursively by default.\n switch (output.type) {\n case 'image':\n return (\n <Box justifyContent=\"space-between\" overflowX=\"hidden\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>Read image</Text>\n </Box>\n </Box>\n )\n case 'text': {\n const { filePath, content, numLines } = output.file\n const contentWithFallback = content || '(No content)'\n return (\n <Box justifyContent=\"space-between\" overflowX=\"hidden\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Box flexDirection=\"column\">\n <Text>\n {highlightCode(\n verbose\n ? contentWithFallback\n : contentWithFallback\n .split('\\n')\n .slice(0, MAX_LINES_TO_RENDER)\n .filter(_ => _.trim() !== '')\n .join('\\n'),\n extname(filePath).slice(1),\n )}\n </Text>\n {!verbose && numLines > MAX_LINES_TO_RENDER && (\n <Text color={getTheme().secondaryText}>\n ... (+{numLines - MAX_LINES_TO_RENDER} lines)\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n )\n }\n }\n },\n async validateInput({ file_path, offset, limit }) {\n const fullFilePath = normalizeFilePath(file_path)\n\n // Use secure file service to check if file exists and get file info\n const fileCheck = secureFileService.safeGetFileInfo(fullFilePath)\n if (!fileCheck.success) {\n // Try to find a similar file with a different extension\n const similarFilename = findSimilarFile(fullFilePath)\n let message = 'File does not exist.'\n\n // If we found a similar file, suggest it to the assistant\n if (similarFilename) {\n message += ` Did you mean ${similarFilename}?`\n }\n\n return {\n result: false,\n message,\n }\n }\n\n const ext = path.extname(fullFilePath).toLowerCase()\n const fileSize = fileCheck.stats?.size ?? 0\n\n if (BINARY_EXTENSIONS.has(ext)) {\n return {\n result: false,\n message: `This tool cannot read binary files. The file appears to be a binary ${ext} file. Please use appropriate tools for binary file analysis.`,\n }\n }\n\n if (fileSize === 0 && IMAGE_EXTENSIONS.has(ext)) {\n return {\n result: false,\n message: 'Empty image files cannot be processed.',\n }\n }\n\n const isNotebook = ext === '.ipynb'\n const isPdf = ext === '.pdf'\n const isImage = IMAGE_EXTENSIONS.has(ext)\n if (!isImage && !isNotebook && !isPdf) {\n if (fileSize > MAX_OUTPUT_SIZE && !offset && !limit) {\n return {\n result: false,\n message: formatFileSizeError(fileSize),\n }\n }\n }\n\n return { result: true }\n },\n async *call(\n { file_path, offset = 1, limit = undefined },\n { readFileTimestamps },\n ) {\n yield* callFileReadTool(\n { file_path, offset, limit },\n { readFileTimestamps },\n )\n },\n renderResultForAssistant,\n} satisfies Tool<typeof inputSchema, FileReadToolData>\n", "const MAX_LINES_TO_READ = 2000\nconst MAX_LINE_LENGTH = 2000\n\nexport const DESCRIPTION = 'Read a file from the local filesystem.'\n\nexport const PROMPT = `Reads a file from the local filesystem. You can access any file directly by using this tool.\nAssume this tool is able to read all files on the machine. If the User provides a path to a file assume that path is valid. It is okay to read a file that does not exist; an error will be returned.\n\nUsage:\n- The file_path parameter must be an absolute path, not a relative path\n- By default, it reads up to ${MAX_LINES_TO_READ} lines starting from the beginning of the file\n- You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters\n- Any lines longer than ${MAX_LINE_LENGTH} characters will be truncated\n- Results are returned using cat -n format, with line numbers starting at 1\n- This tool allows reading images (eg PNG, JPG, etc). When reading an image file the contents are presented visually.\n- This tool can read Jupyter notebooks (.ipynb files) and returns all cells with their outputs, combining code, text, and visualizations.\n- This tool can only read files, not directories. To read a directory, use an ls command via the Bash tool.\n- You can call multiple tools in a single response. It is always better to speculatively read multiple potentially useful files in parallel.\n- You will regularly be asked to read screenshots. If the user provides a path to a screenshot, ALWAYS use this tool to view the file at the path. This tool will work with all temporary file paths.\n- If you read a file that exists but has empty contents you will receive a system reminder warning in place of file contents.`\n", "import { existsSync } from 'node:fs'\nimport { homedir } from 'node:os'\n\nimport {\n normalizePathInput,\n safeCreateDirectory,\n safeDeleteFile,\n safeExists,\n safeGetFileInfo,\n safeReadFile,\n safeWriteFile,\n} from './operations'\nimport type {\n SafeCreateDirectoryResult,\n SafeDeleteFileResult,\n SafeFileInfoResult,\n SafeReadFileOptions,\n SafeReadFileResult,\n SafeWriteFileOptions,\n SafeWriteFileResult,\n SecureFileConfig,\n ValidateFileNameResult,\n ValidateFilePathResult,\n} from './types'\nimport { validateFileName, validateFilePath } from './validators'\n\n/**\n * \u5B89\u5168\u6587\u4EF6\u7CFB\u7EDF\u64CD\u4F5C\u670D\u52A1\n * \u89E3\u51B3\u6587\u4EF6\u7CFB\u7EDF\u64CD\u4F5C\u4E2D\u7F3A\u5C11\u9002\u5F53\u9A8C\u8BC1\u548C\u9519\u8BEF\u5904\u7406\u7684\u95EE\u9898\n */\nexport class SecureFileService {\n private static instance: SecureFileService\n private allowedBasePaths: Set<string>\n private maxFileSize: number\n private allowedExtensions: Set<string>\n\n private constructor() {\n // \u5141\u8BB8\u7684\u57FA\u7840\u8DEF\u5F84\n this.allowedBasePaths = new Set([\n process.cwd(),\n homedir(),\n '/tmp',\n '/var/tmp',\n ])\n\n // \u9ED8\u8BA4\u6700\u5927\u6587\u4EF6\u5927\u5C0F (10MB)\n this.maxFileSize = 10 * 1024 * 1024\n\n // \u5141\u8BB8\u7684\u6587\u4EF6\u6269\u5C55\u540D\uFF08\u7A7A\u96C6\u5408\u8868\u793A\u4E0D\u9650\u5236\u6269\u5C55\u540D\uFF09\n this.allowedExtensions = new Set()\n }\n\n public static getInstance(): SecureFileService {\n if (!SecureFileService.instance) {\n SecureFileService.instance = new SecureFileService()\n }\n return SecureFileService.instance\n }\n\n private getConfig(): SecureFileConfig {\n return {\n allowedBasePaths: this.allowedBasePaths,\n maxFileSize: this.maxFileSize,\n allowedExtensions: this.allowedExtensions,\n }\n }\n\n /**\n * \u9A8C\u8BC1\u6587\u4EF6\u8DEF\u5F84\u662F\u5426\u5B89\u5168\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u9A8C\u8BC1\u7ED3\u679C\n */\n public validateFilePath(filePath: string): ValidateFilePathResult {\n return validateFilePath({\n allowedBasePaths: this.allowedBasePaths,\n filePath,\n })\n }\n\n /**\n * \u5B89\u5168\u5730\u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u6587\u4EF6\u662F\u5426\u5B58\u5728\n */\n public safeExists(filePath: string): boolean {\n return safeExists(this.getConfig(), filePath)\n }\n\n /**\n * \u5B89\u5168\u5730\u8BFB\u53D6\u6587\u4EF6\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @param options \u8BFB\u53D6\u9009\u9879\n * @returns \u8BFB\u53D6\u7ED3\u679C\n */\n public safeReadFile(\n filePath: string,\n options: SafeReadFileOptions = {},\n ): SafeReadFileResult {\n return safeReadFile(this.getConfig(), filePath, options)\n }\n\n /**\n * \u5B89\u5168\u5730\u5199\u5165\u6587\u4EF6\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @param content \u6587\u4EF6\u5185\u5BB9\n * @param options \u5199\u5165\u9009\u9879\n * @returns \u5199\u5165\u7ED3\u679C\n */\n public safeWriteFile(\n filePath: string,\n content: string | Buffer,\n options: SafeWriteFileOptions = {},\n ): SafeWriteFileResult {\n return safeWriteFile(this.getConfig(), filePath, content, options)\n }\n\n /**\n * \u5B89\u5168\u5730\u5220\u9664\u6587\u4EF6\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u5220\u9664\u7ED3\u679C\n */\n public safeDeleteFile(filePath: string): SafeDeleteFileResult {\n return safeDeleteFile(this.getConfig(), filePath)\n }\n\n /**\n * \u5B89\u5168\u5730\u521B\u5EFA\u76EE\u5F55\n * @param dirPath \u76EE\u5F55\u8DEF\u5F84\n * @param mode \u76EE\u5F55\u6743\u9650\n * @returns \u521B\u5EFA\u7ED3\u679C\n */\n public safeCreateDirectory(\n dirPath: string,\n mode: number = 0o755,\n ): SafeCreateDirectoryResult {\n return safeCreateDirectory(this.getConfig(), dirPath, mode)\n }\n\n /**\n * \u5B89\u5168\u5730\u83B7\u53D6\u6587\u4EF6\u4FE1\u606F\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u6587\u4EF6\u4FE1\u606F\n */\n public safeGetFileInfo(filePath: string): SafeFileInfoResult {\n return safeGetFileInfo(this.getConfig(), filePath)\n }\n\n /**\n * \u6DFB\u52A0\u5141\u8BB8\u7684\u57FA\u7840\u8DEF\u5F84\n * @param basePath \u57FA\u7840\u8DEF\u5F84\n */\n public addAllowedBasePath(basePath: string): {\n success: boolean\n error?: string\n } {\n try {\n const normalized = normalizePathInput(basePath)\n\n // \u9A8C\u8BC1\u8DEF\u5F84\u662F\u5426\u5B58\u5728\n if (!existsSync(normalized)) {\n return { success: false, error: 'Base path does not exist' }\n }\n\n this.allowedBasePaths.add(normalized)\n return { success: true }\n } catch (error) {\n return {\n success: false,\n error: `Failed to add base path: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n }\n\n /**\n * \u8BBE\u7F6E\u6700\u5927\u6587\u4EF6\u5927\u5C0F\n * @param maxSize \u6700\u5927\u6587\u4EF6\u5927\u5C0F\uFF08\u5B57\u8282\uFF09\n */\n public setMaxFileSize(maxSize: number): void {\n this.maxFileSize = maxSize\n }\n\n /**\n * \u6DFB\u52A0\u5141\u8BB8\u7684\u6587\u4EF6\u6269\u5C55\u540D\n * @param extensions \u6587\u4EF6\u6269\u5C55\u540D\u6570\u7EC4\n */\n public addAllowedExtensions(extensions: string[]): void {\n extensions.forEach(ext => {\n if (!ext.startsWith('.')) {\n ext = '.' + ext\n }\n this.allowedExtensions.add(ext.toLowerCase())\n })\n }\n\n /**\n * \u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5728\u5141\u8BB8\u7684\u57FA\u7840\u8DEF\u5F84\u4E2D\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u662F\u5426\u5141\u8BB8\n */\n public isPathAllowed(filePath: string): boolean {\n const validation = this.validateFilePath(filePath)\n return validation.isValid\n }\n\n /**\n * \u9A8C\u8BC1\u6587\u4EF6\u540D\u5B89\u5168\u6027\n * @param filename \u6587\u4EF6\u540D\n * @returns \u9A8C\u8BC1\u7ED3\u679C\n */\n public validateFileName(filename: string): ValidateFileNameResult {\n return validateFileName(filename)\n }\n}\n\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\nexport const secureFileService = SecureFileService.getInstance()\n", "import {\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n statSync,\n unlinkSync,\n renameSync,\n} from 'node:fs'\nimport { dirname, extname, normalize, resolve } from 'node:path'\n\nimport type {\n SafeCreateDirectoryResult,\n SafeDeleteFileResult,\n SafeFileInfoResult,\n SafeReadFileOptions,\n SafeReadFileResult,\n SafeWriteFileOptions,\n SafeWriteFileResult,\n SecureFileConfig,\n} from './types'\nimport { validateFilePath } from './validators'\n\nexport function safeExists(\n config: SecureFileConfig,\n filePath: string,\n): boolean {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return false\n }\n\n try {\n return existsSync(validation.normalizedPath)\n } catch {\n return false\n }\n}\n\nexport function safeReadFile(\n config: SecureFileConfig,\n filePath: string,\n options: SafeReadFileOptions = {},\n): SafeReadFileResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n // \u68C0\u67E5\u6587\u4EF6\u6269\u5C55\u540D\uFF08\u5982\u679C\u542F\u7528\uFF09\n if (options.checkFileExtension !== false) {\n const ext = extname(normalizedPath).toLowerCase()\n const allowedExts =\n options.allowedExtensions ?? Array.from(config.allowedExtensions)\n\n if (allowedExts.length > 0 && !allowedExts.includes(ext)) {\n return {\n success: false,\n error: `File extension '${ext}' is not allowed`,\n }\n }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\n if (!existsSync(normalizedPath)) {\n return { success: false, error: 'File does not exist' }\n }\n\n // \u83B7\u53D6\u6587\u4EF6\u4FE1\u606F\n const stats = statSync(normalizedPath)\n const maxSize = options.maxFileSize ?? config.maxFileSize\n\n // \u68C0\u67E5\u6587\u4EF6\u5927\u5C0F\n if (stats.size > maxSize) {\n return {\n success: false,\n error: `File too large (${stats.size} bytes, max ${maxSize} bytes)`,\n }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u7C7B\u578B\n if (!stats.isFile()) {\n return { success: false, error: 'Path is not a file' }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u6743\u9650\n if ((stats.mode & parseInt('400', 8)) === 0) {\n // \u68C0\u67E5\u8BFB\u6743\u9650\n return { success: false, error: 'No read permission' }\n }\n\n // \u8BFB\u53D6\u6587\u4EF6\u5185\u5BB9\n const content = readFileSync(normalizedPath, {\n encoding: options.encoding ?? 'utf8',\n })\n\n return {\n success: true,\n content,\n stats: {\n size: stats.size,\n mtime: stats.mtime,\n atime: stats.atime,\n mode: stats.mode,\n },\n }\n } catch (error) {\n return {\n success: false,\n error: `Failed to read file: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function safeWriteFile(\n config: SecureFileConfig,\n filePath: string,\n content: string | Buffer,\n options: SafeWriteFileOptions = {},\n): SafeWriteFileResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n // \u68C0\u67E5\u6587\u4EF6\u6269\u5C55\u540D\uFF08\u5982\u679C\u542F\u7528\uFF09\n if (options.checkFileExtension !== false) {\n const ext = extname(normalizedPath).toLowerCase()\n const allowedExts =\n options.allowedExtensions ?? Array.from(config.allowedExtensions)\n\n if (allowedExts.length > 0 && !allowedExts.includes(ext)) {\n return {\n success: false,\n error: `File extension '${ext}' is not allowed`,\n }\n }\n }\n\n // \u68C0\u67E5\u5185\u5BB9\u5927\u5C0F\n const encoding = options.encoding ?? 'utf8'\n const contentSize =\n typeof content === 'string'\n ? Buffer.byteLength(content, encoding)\n : content.length\n\n const maxSize = options.maxSize ?? config.maxFileSize\n if (contentSize > maxSize) {\n return {\n success: false,\n error: `Content too large (${contentSize} bytes, max ${maxSize} bytes)`,\n }\n }\n\n // \u521B\u5EFA\u76EE\u5F55\uFF08\u5982\u679C\u9700\u8981\uFF09\n if (options.createDirectory) {\n const dir = dirname(normalizedPath)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o755 })\n }\n }\n\n // \u539F\u5B50\u5199\u5165\uFF08\u5982\u679C\u542F\u7528\uFF09\n if (options.atomic) {\n const tempPath = `${normalizedPath}.tmp.${Date.now()}`\n\n try {\n // \u5199\u5165\u4E34\u65F6\u6587\u4EF6\n writeFileSync(tempPath, content, {\n encoding,\n mode: options.mode ?? 0o644,\n })\n\n // \u91CD\u547D\u540D\u4E3A\u76EE\u6807\u6587\u4EF6\n renameSync(tempPath, normalizedPath)\n } catch (renameError) {\n // \u6E05\u7406\u4E34\u65F6\u6587\u4EF6\n try {\n if (existsSync(tempPath)) {\n unlinkSync(tempPath)\n }\n } catch {\n // \u5FFD\u7565\u6E05\u7406\u9519\u8BEF\n }\n throw renameError\n }\n } else {\n // \u76F4\u63A5\u5199\u5165\n writeFileSync(normalizedPath, content, {\n encoding,\n mode: options.mode ?? 0o644,\n })\n }\n\n return { success: true }\n } catch (error) {\n return {\n success: false,\n error: `Failed to write file: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function safeDeleteFile(\n config: SecureFileConfig,\n filePath: string,\n): SafeDeleteFileResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n // \u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\n if (!existsSync(normalizedPath)) {\n return { success: false, error: 'File does not exist' }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u7C7B\u578B\n const stats = statSync(normalizedPath)\n if (!stats.isFile()) {\n return { success: false, error: 'Path is not a file' }\n }\n\n // \u68C0\u67E5\u5199\u6743\u9650\n if ((stats.mode & parseInt('200', 8)) === 0) {\n return { success: false, error: 'No write permission' }\n }\n\n // \u5B89\u5168\u5220\u9664\n unlinkSync(normalizedPath)\n return { success: true }\n } catch (error) {\n return {\n success: false,\n error: `Failed to delete file: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function safeCreateDirectory(\n config: SecureFileConfig,\n dirPath: string,\n mode: number = 0o755,\n): SafeCreateDirectoryResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath: dirPath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n if (existsSync(normalizedPath)) {\n const stats = statSync(normalizedPath)\n if (!stats.isDirectory()) {\n return {\n success: false,\n error: 'Path already exists and is not a directory',\n }\n }\n return { success: true }\n }\n\n mkdirSync(normalizedPath, { recursive: true, mode })\n return { success: true }\n } catch (error) {\n return {\n success: false,\n error: `Failed to create directory: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function safeGetFileInfo(\n config: SecureFileConfig,\n filePath: string,\n): SafeFileInfoResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n if (!existsSync(normalizedPath)) {\n return { success: false, error: 'File does not exist' }\n }\n\n const stats = statSync(normalizedPath)\n\n return {\n success: true,\n stats: {\n size: stats.size,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n mode: stats.mode,\n atime: stats.atime,\n mtime: stats.mtime,\n ctime: stats.ctime,\n },\n }\n } catch (error) {\n return {\n success: false,\n error: `Failed to get file info: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function normalizePathInput(path: string): string {\n return normalize(resolve(path))\n}\n", "import { normalize, resolve, relative, isAbsolute, parse } from 'node:path'\nimport type { ValidateFileNameResult, ValidateFilePathResult } from './types'\n\nexport function validateFilePath(args: {\n allowedBasePaths: ReadonlySet<string>\n filePath: string\n}): ValidateFilePathResult {\n const { filePath, allowedBasePaths } = args\n\n try {\n // \u89C4\u8303\u5316\u8DEF\u5F84\n const normalizedPath = normalize(filePath)\n\n // \u68C0\u67E5\u8DEF\u5F84\u957F\u5EA6\n if (normalizedPath.length > 4096) {\n return {\n isValid: false,\n normalizedPath,\n error: 'Path too long (max 4096 characters)',\n }\n }\n\n // \u68C0\u67E5\u662F\u5426\u5305\u542B\u8DEF\u5F84\u904D\u5386\u5B57\u7B26\n if (normalizedPath.includes('..') || normalizedPath.includes('~')) {\n return {\n isValid: false,\n normalizedPath,\n error: 'Path contains traversal characters',\n }\n }\n\n // \u68C0\u67E5\u662F\u5426\u5305\u542B\u53EF\u7591\u7684\u5B57\u7B26\u5E8F\u5217\n const suspiciousPatterns = [\n /\\.\\./, // \u7236\u76EE\u5F55\n /~/, // \u7528\u6237\u76EE\u5F55\n /\\$\\{/, // \u73AF\u5883\u53D8\u91CF\n /`/, // \u547D\u4EE4\u6267\u884C\n /\\|/, // \u7BA1\u9053\u7B26\n /;/, // \u547D\u4EE4\u5206\u9694\u7B26\n /&/, // \u540E\u53F0\u6267\u884C\n />/, // \u8F93\u51FA\u91CD\u5B9A\u5411\n /</, // \u8F93\u5165\u91CD\u5B9A\u5411\n ]\n\n for (const pattern of suspiciousPatterns) {\n if (pattern.test(normalizedPath)) {\n return {\n isValid: false,\n normalizedPath,\n error: `Path contains suspicious pattern: ${pattern}`,\n }\n }\n }\n\n // \u89E3\u6790\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\n const absolutePath = resolve(normalizedPath)\n\n // \u68C0\u67E5\u662F\u5426\u5728\u5141\u8BB8\u7684\u57FA\u7840\u8DEF\u5F84\u4E2D\n const isInAllowedPath = Array.from(allowedBasePaths).some(basePath => {\n const base = resolve(basePath)\n const rel = relative(base, absolutePath)\n if (!rel || rel === '') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n return true\n })\n\n if (!isInAllowedPath) {\n return {\n isValid: false,\n normalizedPath,\n error: 'Path is outside allowed directories',\n }\n }\n\n return { isValid: true, normalizedPath: absolutePath }\n } catch (error) {\n return {\n isValid: false,\n normalizedPath: filePath,\n error: `Path validation failed: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function validateFileName(filename: string): ValidateFileNameResult {\n // \u68C0\u67E5\u6587\u4EF6\u540D\u957F\u5EA6\n if (filename.length === 0) {\n return { isValid: false, error: 'Filename cannot be empty' }\n }\n\n if (filename.length > 255) {\n return { isValid: false, error: 'Filename too long (max 255 characters)' }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u540D\u5B57\u7B26\n const invalidChars = /[<>:\"/\\\\|?*\\x00-\\x1F]/\n if (invalidChars.test(filename)) {\n return { isValid: false, error: 'Filename contains invalid characters' }\n }\n\n // \u68C0\u67E5\u4FDD\u7559\u6587\u4EF6\u540D\n const reservedNames = [\n 'CON',\n 'PRN',\n 'AUX',\n 'NUL',\n 'COM1',\n 'COM2',\n 'COM3',\n 'COM4',\n 'COM5',\n 'COM6',\n 'COM7',\n 'COM8',\n 'COM9',\n 'LPT1',\n 'LPT2',\n 'LPT3',\n 'LPT4',\n 'LPT5',\n 'LPT6',\n 'LPT7',\n 'LPT8',\n 'LPT9',\n ]\n\n const baseName = filename.split('.')[0].toUpperCase()\n if (reservedNames.includes(baseName)) {\n return { isValid: false, error: 'Filename is reserved' }\n }\n\n // \u68C0\u67E5\u662F\u5426\u4EE5\u70B9\u5F00\u5934\u6216\u7ED3\u5C3E\n if (filename.startsWith('.') || filename.endsWith('.')) {\n return {\n isValid: false,\n error: 'Filename cannot start or end with a dot',\n }\n }\n\n // \u68C0\u67E5\u662F\u5426\u4EE5\u7A7A\u683C\u5F00\u5934\u6216\u7ED3\u5C3E\n if (filename.startsWith(' ') || filename.endsWith(' ')) {\n return {\n isValid: false,\n error: 'Filename cannot start or end with spaces',\n }\n }\n\n return { isValid: true }\n}\n", "import { highlight, supportsLanguage } from 'cli-highlight'\n\nexport function highlightCode(code: string, language: string): string {\n try {\n if (supportsLanguage(language)) {\n return highlight(code, { language })\n }\n return highlight(code, { language: 'markdown' })\n } catch {\n return highlight(code, { language: 'markdown' })\n }\n}\n", "export const MAX_LINES_TO_RENDER = 5\nexport const MAX_LINE_LENGTH = 2000\nexport const MAX_OUTPUT_SIZE = 0.25 * 1024 * 1024 // 0.25MB in bytes (post-truncation safeguard)\n\n// Common image extensions (compatibility)\nexport const IMAGE_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.webp',\n])\n\n// Maximum dimensions for images\nexport const MAX_WIDTH = 2000\nexport const MAX_HEIGHT = 2000\nexport const MAX_IMAGE_SIZE = 3.75 * 1024 * 1024 // 5MB in bytes, with base64 encoding\n\n// Binary extensions this tool refuses to read as text (parity with the reference CLI)\nexport const BINARY_EXTENSIONS = new Set([\n '.mp3',\n '.wav',\n '.flac',\n '.ogg',\n '.aac',\n '.m4a',\n '.wma',\n '.aiff',\n '.opus',\n '.mp4',\n '.avi',\n '.mov',\n '.wmv',\n '.flv',\n '.mkv',\n '.webm',\n '.m4v',\n '.mpeg',\n '.mpg',\n '.zip',\n '.rar',\n '.tar',\n '.gz',\n '.bz2',\n '.7z',\n '.xz',\n '.z',\n '.tgz',\n '.iso',\n '.exe',\n '.dll',\n '.so',\n '.dylib',\n '.app',\n '.msi',\n '.deb',\n '.rpm',\n '.bin',\n '.dat',\n '.db',\n '.sqlite',\n '.sqlite3',\n '.mdb',\n '.idx',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.odt',\n '.ods',\n '.odp',\n '.ttf',\n '.otf',\n '.woff',\n '.woff2',\n '.eot',\n '.psd',\n '.ai',\n '.eps',\n '.sketch',\n '.fig',\n '.xd',\n '.blend',\n '.obj',\n '.3ds',\n '.max',\n '.class',\n '.jar',\n '.war',\n '.pyc',\n '.pyo',\n '.rlib',\n '.swf',\n '.fla',\n])\n\nexport const formatFileSizeError = (sizeInBytes: number) =>\n `File content (${Math.round(sizeInBytes / 1024)}KB) exceeds maximum allowed size (${Math.round(MAX_OUTPUT_SIZE / 1024)}KB). Please use offset and limit parameters to read specific portions of the file, or use the Grep tool to search for specific content.`\n", "import type { DocumentBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { addLineNumbers } from '#core/utils/file'\nimport type { FileReadToolData } from './types'\n\nexport function renderResultForAssistant(data: FileReadToolData) {\n switch (data.type) {\n case 'image':\n return [\n {\n type: 'image',\n source: {\n type: 'base64',\n data: data.file.base64,\n media_type: data.file.type,\n },\n },\n ]\n case 'pdf':\n return [\n {\n type: 'document',\n source: {\n type: 'base64',\n media_type: 'application/pdf',\n data: data.file.base64,\n },\n } satisfies DocumentBlockParam,\n ]\n case 'notebook':\n return JSON.stringify(data.file, null, 2)\n case 'text':\n return addLineNumbers({\n content: data.file.content,\n startLine: data.file.startLine,\n })\n }\n}\n", "import { statSync } from 'fs'\nimport * as path from 'node:path'\nimport { normalizeFilePath, readTextContent } from '#core/utils/file'\nimport { emitReminderEvent } from '#core/services/systemReminder'\nimport {\n generateFileModificationReminder,\n recordFileRead,\n} from '#core/services/fileFreshness'\nimport { secureFileService } from '#core/utils/secureFile'\nimport { readFileBun } from '#runtime/file'\nimport { readImage } from './image'\nimport {\n IMAGE_EXTENSIONS,\n MAX_LINE_LENGTH,\n MAX_OUTPUT_SIZE,\n formatFileSizeError,\n} from './constants'\nimport type { FileReadToolData } from './types'\nimport { renderResultForAssistant } from './renderResultForAssistant'\n\nexport async function* callFileReadTool(\n args: { file_path: string; offset?: number; limit?: number },\n ctx: { readFileTimestamps: Record<string, number> },\n): AsyncGenerator<\n {\n type: 'result'\n data: FileReadToolData\n resultForAssistant: string | any[]\n },\n void,\n void\n> {\n const { file_path, offset = 1, limit } = args\n const ext = path.extname(file_path).toLowerCase()\n const fullFilePath = normalizeFilePath(file_path)\n\n recordFileRead(fullFilePath)\n\n emitReminderEvent('file:read', {\n filePath: fullFilePath,\n extension: ext,\n timestamp: Date.now(),\n })\n\n ctx.readFileTimestamps[fullFilePath] = statSync(fullFilePath).mtimeMs\n\n const modificationReminder = generateFileModificationReminder(fullFilePath)\n if (modificationReminder) {\n emitReminderEvent('file:modified', {\n filePath: fullFilePath,\n reminder: modificationReminder,\n timestamp: Date.now(),\n })\n }\n\n if (IMAGE_EXTENSIONS.has(ext)) {\n const data = await readImage(fullFilePath, ext)\n yield {\n type: 'result',\n data,\n resultForAssistant: renderResultForAssistant(data),\n }\n return\n }\n\n if (ext === '.ipynb') {\n const notebookRaw = await readFileBun(fullFilePath)\n const notebook = notebookRaw ? JSON.parse(notebookRaw) : null\n const data: FileReadToolData = {\n type: 'notebook',\n file: {\n filePath: file_path,\n cells: Array.isArray(notebook?.cells) ? notebook.cells : [],\n },\n }\n yield {\n type: 'result',\n data,\n resultForAssistant: renderResultForAssistant(data),\n }\n return\n }\n\n if (ext === '.pdf') {\n const fileReadResult = secureFileService.safeReadFile(fullFilePath, {\n encoding: 'buffer' as BufferEncoding,\n maxFileSize: 10 * 1024 * 1024,\n checkFileExtension: false,\n })\n if (!fileReadResult.success) {\n throw new Error(fileReadResult.error || 'Failed to read PDF file')\n }\n const buffer = fileReadResult.content as Buffer\n const data: FileReadToolData = {\n type: 'pdf',\n file: {\n filePath: file_path,\n base64: buffer.toString('base64'),\n originalSize: fileReadResult.stats?.size ?? buffer.byteLength,\n },\n }\n yield {\n type: 'result',\n data,\n resultForAssistant: renderResultForAssistant(data),\n }\n return\n }\n\n const startLine = offset\n const zeroBasedOffset = startLine === 0 ? 0 : startLine - 1\n const { content, lineCount, totalLines } = readTextContent(\n fullFilePath,\n zeroBasedOffset,\n limit,\n )\n\n const truncatedLines = content\n .split(/\\r?\\n/)\n .map(line =>\n line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) : line,\n )\n .join('\\n')\n\n if (Buffer.byteLength(truncatedLines, 'utf8') > MAX_OUTPUT_SIZE) {\n throw new Error(\n formatFileSizeError(Buffer.byteLength(truncatedLines, 'utf8')),\n )\n }\n\n const data: FileReadToolData = {\n type: 'text',\n file: {\n filePath: file_path,\n content: truncatedLines,\n numLines: lineCount,\n startLine,\n totalLines,\n },\n }\n\n yield {\n type: 'result',\n data,\n resultForAssistant: renderResultForAssistant(data),\n }\n}\n", "import { statSync } from 'fs'\nimport { logError } from '#core/utils/log'\nimport { secureFileService } from '#core/utils/secureFile'\nimport type { AnthropicImageMediaType } from './types'\nimport { MAX_HEIGHT, MAX_IMAGE_SIZE, MAX_WIDTH } from './constants'\n\ntype ImageToolResult = {\n type: 'image'\n file: {\n base64: string\n type: AnthropicImageMediaType\n originalSize: number\n }\n}\n\nfunction createImageResponse(\n buffer: Buffer,\n ext: string,\n originalSize: number,\n): ImageToolResult {\n const normalized: AnthropicImageMediaType =\n ext === '.jpg' || ext === '.jpeg'\n ? 'image/jpeg'\n : ext === '.png'\n ? 'image/png'\n : ext === '.gif'\n ? 'image/gif'\n : 'image/webp'\n return {\n type: 'image',\n file: {\n base64: buffer.toString('base64'),\n type: normalized,\n originalSize,\n },\n }\n}\n\nexport async function readImage(\n filePath: string,\n ext: string,\n): Promise<ImageToolResult> {\n try {\n const stats = statSync(filePath)\n const sharp = (await import('sharp')).default\n\n // Use secure file service to read the file\n const fileReadResult = secureFileService.safeReadFile(filePath, {\n encoding: 'buffer' as BufferEncoding,\n maxFileSize: MAX_IMAGE_SIZE,\n })\n\n if (!fileReadResult.success) {\n throw new Error(`Failed to read image file: ${fileReadResult.error}`)\n }\n\n const image = sharp(fileReadResult.content as Buffer)\n const metadata = await image.metadata()\n\n if (!metadata.width || !metadata.height) {\n if (stats.size > MAX_IMAGE_SIZE) {\n const compressedBuffer = await image.jpeg({ quality: 80 }).toBuffer()\n return createImageResponse(compressedBuffer, '.jpeg', stats.size)\n }\n }\n\n // Calculate dimensions while maintaining aspect ratio\n let width = metadata.width || 0\n let height = metadata.height || 0\n\n // Check if the original file just works\n if (\n stats.size <= MAX_IMAGE_SIZE &&\n width <= MAX_WIDTH &&\n height <= MAX_HEIGHT\n ) {\n // Use secure file service to read the file\n const fileReadResult = secureFileService.safeReadFile(filePath, {\n encoding: 'buffer' as BufferEncoding,\n maxFileSize: MAX_IMAGE_SIZE,\n })\n\n if (!fileReadResult.success) {\n throw new Error(`Failed to read image file: ${fileReadResult.error}`)\n }\n\n return createImageResponse(\n fileReadResult.content as Buffer,\n ext,\n stats.size,\n )\n }\n\n if (width > MAX_WIDTH) {\n height = Math.round((height * MAX_WIDTH) / width)\n width = MAX_WIDTH\n }\n\n if (height > MAX_HEIGHT) {\n width = Math.round((width * MAX_HEIGHT) / height)\n height = MAX_HEIGHT\n }\n\n // Resize image and convert to buffer\n const resizedImageBuffer = await image\n .resize(width, height, {\n fit: 'inside',\n withoutEnlargement: true,\n })\n .toBuffer()\n\n // If still too large after resize, compress quality\n if (resizedImageBuffer.length > MAX_IMAGE_SIZE) {\n const compressedBuffer = await image.jpeg({ quality: 80 }).toBuffer()\n return createImageResponse(compressedBuffer, '.jpeg', stats.size)\n }\n\n return createImageResponse(resizedImageBuffer, ext, stats.size)\n } catch (e) {\n logError(e)\n // If any error occurs during processing, return original image\n const stats = statSync(filePath)\n const fileReadResult = secureFileService.safeReadFile(filePath, {\n encoding: 'buffer' as BufferEncoding,\n maxFileSize: MAX_IMAGE_SIZE,\n })\n\n if (!fileReadResult.success) {\n throw new Error(`Failed to read image file: ${fileReadResult.error}`)\n }\n\n return createImageResponse(\n fileReadResult.content as Buffer,\n ext,\n stats.size,\n )\n }\n}\n", "import type { Hunk } from 'diff'\nimport { mkdirSync, statSync } from 'fs'\nimport { dirname, isAbsolute, relative, resolve } from 'path'\nimport { z } from 'zod'\nimport type { Tool } from '#core/tooling/Tool'\nimport {\n addLineNumbers,\n detectFileEncoding,\n detectLineEndings,\n detectRepoLineEndings,\n writeTextContent,\n} from '#core/utils/file'\nimport { readFileBun, fileExistsBun } from '#runtime/file'\nimport { getCwd } from '#core/utils/state'\nimport { PROMPT } from './prompt'\nimport { hasWritePermission } from '#core/utils/permissions/filesystem'\nimport { getPatch } from '#core/utils/diff'\nimport { emitReminderEvent } from '#core/services/systemReminder'\nimport { recordFileEdit } from '#core/services/fileFreshness'\n\nconst MAX_LINES_TO_RENDER_FOR_ASSISTANT = 16000\nconst TRUNCATED_MESSAGE =\n '<response clipped><NOTE>To save on context only part of this file has been shown to you. You should retry this tool after you have searched inside the file with Grep in order to find the line numbers of what you are looking for.</NOTE>'\n\nconst inputSchema = z.strictObject({\n file_path: z\n .string()\n .describe(\n 'The absolute path to the file to write (must be absolute, not relative)',\n ),\n content: z.string().describe('The content to write to the file'),\n})\n\nexport const FileWriteTool = {\n name: 'Write',\n async description() {\n return 'Write a file to the local filesystem.'\n },\n userFacingName: () => 'Write',\n async prompt() {\n return PROMPT\n },\n inputSchema,\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false // FileWriteTool modifies state/files, not safe for concurrent execution\n },\n needsPermissions({ file_path }) {\n return !hasWritePermission(file_path)\n },\n renderToolUseMessage(input, { verbose }) {\n return `file_path: ${verbose ? input.file_path : relative(getCwd(), input.file_path)}`\n },\n async validateInput({ file_path }, { readFileTimestamps }) {\n const fullFilePath = isAbsolute(file_path)\n ? file_path\n : resolve(getCwd(), file_path)\n\n if (fullFilePath.endsWith('.ipynb')) {\n return {\n result: false,\n message:\n 'This tool cannot write Jupyter notebooks. Use the NotebookEdit tool instead.',\n }\n }\n if (!fileExistsBun(fullFilePath)) {\n return { result: true }\n }\n\n const readTimestamp = readFileTimestamps[fullFilePath]\n if (!readTimestamp) {\n return {\n result: false,\n message:\n 'File has not been read yet. Read it first before writing to it.',\n }\n }\n\n // Check if file exists and get its last modified time\n const stats = statSync(fullFilePath)\n const lastWriteTime = stats.mtimeMs\n if (lastWriteTime > readTimestamp) {\n return {\n result: false,\n message:\n 'File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.',\n }\n }\n\n return { result: true }\n },\n async *call({ file_path, content }, { readFileTimestamps }) {\n const fullFilePath = isAbsolute(file_path)\n ? file_path\n : resolve(getCwd(), file_path)\n const dir = dirname(fullFilePath)\n const oldFileExists = fileExistsBun(fullFilePath)\n\n if (oldFileExists) {\n const readTimestamp = readFileTimestamps[fullFilePath]\n const lastWriteTime = statSync(fullFilePath).mtimeMs\n if (!readTimestamp || lastWriteTime > readTimestamp) {\n throw new Error(\n 'File has been unexpectedly modified. Read it again before attempting to write it.',\n )\n }\n }\n\n const enc = oldFileExists ? detectFileEncoding(fullFilePath) : 'utf-8'\n const oldContent = oldFileExists ? await readFileBun(fullFilePath) : null\n\n const endings = oldFileExists\n ? detectLineEndings(fullFilePath)\n : await detectRepoLineEndings(getCwd())\n\n mkdirSync(dir, { recursive: true })\n writeTextContent(fullFilePath, content, enc, endings!)\n\n // Record Agent edit operation for file freshness tracking\n recordFileEdit(fullFilePath, content)\n\n // Update read timestamp, to invalidate stale writes\n readFileTimestamps[fullFilePath] = statSync(fullFilePath).mtimeMs\n\n // Emit file edited event for system reminders\n emitReminderEvent('file:edited', {\n filePath: fullFilePath,\n content,\n oldContent: oldContent || '',\n timestamp: Date.now(),\n operation: oldFileExists ? 'update' : 'create',\n })\n\n if (oldContent) {\n const patch = getPatch({\n filePath: file_path,\n fileContents: oldContent,\n oldStr: oldContent,\n newStr: content,\n })\n\n const data = {\n type: 'update' as const,\n filePath: file_path,\n content,\n structuredPatch: patch,\n }\n yield {\n type: 'result',\n data,\n resultForAssistant: this.renderResultForAssistant(data),\n }\n return\n }\n\n const data = {\n type: 'create' as const,\n filePath: file_path,\n content,\n structuredPatch: [],\n }\n yield {\n type: 'result',\n data,\n resultForAssistant: this.renderResultForAssistant(data),\n }\n },\n renderResultForAssistant({ filePath, content, type }) {\n switch (type) {\n case 'create':\n return `File created successfully at: ${filePath}`\n case 'update':\n return `The file ${filePath} has been updated. Here's the result of running \\`cat -n\\` on a snippet of the edited file:\n${addLineNumbers({\n content:\n content.split(/\\r?\\n/).length > MAX_LINES_TO_RENDER_FOR_ASSISTANT\n ? content\n .split(/\\r?\\n/)\n .slice(0, MAX_LINES_TO_RENDER_FOR_ASSISTANT)\n .join('\\n') + TRUNCATED_MESSAGE\n : content,\n startLine: 1,\n})}`\n }\n },\n} satisfies Tool<\n typeof inputSchema,\n {\n type: 'create' | 'update'\n filePath: string\n content: string\n structuredPatch: Hunk[]\n }\n>\n", "import { FileReadTool } from '#tools/tools/filesystem/FileReadTool/FileReadTool'\n\nexport const PROMPT = `Writes a file to the local filesystem.\n\nUsage:\n- This tool will overwrite the existing file if there is one at the provided path.\n- If this is an existing file, you MUST use the ${FileReadTool.name} tool first to read the file's contents. This tool will fail if you did not read the file first.\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.\n- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.\n- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.`\n", "import { z } from 'zod'\nimport { Tool } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\nimport { ripGrep } from '#core/utils/ripgrep'\nimport { DESCRIPTION, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { existsSync, statSync } from 'fs'\nimport { isAbsolute, join, relative, resolve } from 'path'\nimport { hasReadPermission } from '#core/utils/permissions/filesystem'\n\nconst inputSchema = z.strictObject({\n pattern: z.string().describe('The glob pattern to match files against'),\n path: z\n .string()\n .optional()\n .describe(\n 'The directory to search in. If not specified, the current working directory will be used. IMPORTANT: Omit this field to use the default directory. DO NOT enter \"undefined\" or \"null\" - simply omit it for the default behavior. Must be a valid directory path if provided.',\n ),\n})\n\ntype Output = {\n durationMs: number\n numFiles: number\n filenames: string[]\n truncated: boolean\n}\n\nconst DEFAULT_LIMIT = 100\n\nexport const GlobTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n userFacingName() {\n return 'Search'\n },\n inputSchema,\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // GlobTool is read-only, safe for concurrent execution\n },\n needsPermissions({ path }) {\n return !hasReadPermission(path || getCwd())\n },\n async prompt() {\n return DESCRIPTION\n },\n async validateInput({ path }) {\n if (!path) return { result: true }\n const absolute = isAbsolute(path) ? path : resolve(getCwd(), path)\n if (!existsSync(absolute)) {\n return {\n result: false,\n message: `Directory does not exist: ${path}`,\n errorCode: 1,\n }\n }\n if (!statSync(absolute).isDirectory()) {\n return {\n result: false,\n message: `Path is not a directory: ${path}`,\n errorCode: 2,\n }\n }\n return { result: true }\n },\n renderToolUseMessage({ pattern, path }, { verbose }) {\n const absolutePath = path\n ? isAbsolute(path)\n ? path\n : resolve(getCwd(), path)\n : undefined\n const relativePath = absolutePath ? relative(getCwd(), absolutePath) : ''\n return `pattern: \"${pattern}\"${\n relativePath || verbose\n ? `, path: \"${verbose ? absolutePath : relativePath}\"`\n : ''\n }`\n },\n async *call({ pattern, path }, { abortController }) {\n const start = Date.now()\n const searchPath = path\n ? isAbsolute(path)\n ? path\n : resolve(getCwd(), path)\n : getCwd()\n\n // Default semantics: use ripgrep file listing with no-ignore + hidden,\n // sorted by modified time, filtered by --glob pattern.\n const raw = await ripGrep(\n [\n '--files',\n '--no-ignore',\n '--hidden',\n '--sort=modified',\n '--glob',\n pattern,\n ],\n searchPath,\n abortController.signal,\n )\n\n const files = raw.map(p => (isAbsolute(p) ? p : join(searchPath, p)))\n const truncated = files.length > DEFAULT_LIMIT\n const limitedFiles = files.slice(0, DEFAULT_LIMIT)\n const output: Output = {\n filenames: limitedFiles,\n durationMs: Date.now() - start,\n numFiles: limitedFiles.length,\n truncated,\n }\n yield {\n type: 'result',\n resultForAssistant: this.renderResultForAssistant(output),\n data: output,\n }\n },\n renderResultForAssistant(output) {\n let result = output.filenames.join('\\n')\n if (output.filenames.length === 0) {\n result = 'No files found'\n }\n // Only add truncation message if results were actually truncated\n else if (output.truncated) {\n result +=\n '\\n(Results are truncated. Consider using a more specific path or pattern.)'\n }\n return result\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME_FOR_PROMPT = 'Glob'\n\nexport const DESCRIPTION = `- Fast file pattern matching tool that works with any codebase size\n- Supports glob patterns like \"**/*.js\" or \"src/**/*.ts\"\n- Returns matching file paths sorted by modification time\n- Use this tool when you need to find files by name patterns\n- When you are doing an open ended search that may require multiple rounds of globbing and grepping, use the Agent tool instead\n- You can call multiple tools in a single response. It is always better to speculatively perform multiple searches in parallel if they are potentially useful.\n`\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { existsSync } from 'fs'\nimport { z } from 'zod'\nimport { Tool } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\nimport { getAbsoluteAndRelativePaths, getAbsolutePath } from '#core/utils/file'\nimport { DESCRIPTION, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { hasReadPermission } from '#core/utils/permissions/filesystem'\nimport { relative } from 'path'\nimport { formatPagination, truncateToCharBudget } from './helpers'\nimport type { GrepToolOutput } from './types'\nimport { runGrepTool } from './execute'\n\nconst inputSchema = z.strictObject({\n pattern: z\n .string()\n .describe('The regular expression pattern to search for in file contents'),\n path: z\n .string()\n .optional()\n .describe(\n 'File or directory to search in (rg PATH). Defaults to current working directory.',\n ),\n glob: z\n .string()\n .optional()\n .describe(\n 'Glob pattern to filter files (e.g. \"*.js\", \"*.{ts,tsx}\") - maps to rg --glob',\n ),\n output_mode: z\n .enum(['content', 'files_with_matches', 'count'])\n .optional()\n .describe(\n 'Output mode: \"content\" shows matching lines (supports -A/-B/-C context, -n line numbers, head_limit), \"files_with_matches\" shows file paths (supports head_limit), \"count\" shows match counts (supports head_limit). Defaults to \"files_with_matches\".',\n ),\n '-B': z\n .number()\n .optional()\n .describe(\n 'Number of lines to show before each match (rg -B). Requires output_mode: \"content\", ignored otherwise.',\n ),\n '-A': z\n .number()\n .optional()\n .describe(\n 'Number of lines to show after each match (rg -A). Requires output_mode: \"content\", ignored otherwise.',\n ),\n '-C': z\n .number()\n .optional()\n .describe(\n 'Number of lines to show before and after each match (rg -C). Requires output_mode: \"content\", ignored otherwise.',\n ),\n '-n': z\n .boolean()\n .optional()\n .describe(\n 'Show line numbers in output (rg -n). Requires output_mode: \"content\", ignored otherwise. Defaults to true.',\n ),\n '-i': z.boolean().optional().describe('Case insensitive search (rg -i)'),\n type: z\n .string()\n .optional()\n .describe(\n 'File type to search (rg --type). Common types: js, py, rust, go, java, etc. More efficient than include for standard file types.',\n ),\n head_limit: z\n .number()\n .optional()\n .describe(\n 'Limit output to first N lines/entries, equivalent to \"| head -N\". Works across all output modes: content (limits output lines), files_with_matches (limits file paths), count (limits count entries). Defaults based on \"cap\" experiment value: 0 (unlimited), 20, or 100.',\n ),\n offset: z\n .number()\n .optional()\n .describe(\n 'Skip first N lines/entries before applying head_limit, equivalent to \"| tail -n +N | head -N\". Works across all output modes. Defaults to 0.',\n ),\n multiline: z\n .boolean()\n .optional()\n .describe(\n 'Enable multiline mode where . matches newlines and patterns can span lines (rg -U --multiline-dotall). Default: false.',\n ),\n})\n\ntype Input = typeof inputSchema\ntype Output = GrepToolOutput\n\nexport const GrepTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n userFacingName() {\n return 'Search'\n },\n inputSchema,\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // GrepTool is read-only, safe for concurrent execution\n },\n async isEnabled() {\n return true\n },\n needsPermissions({ path }) {\n return !hasReadPermission(path || getCwd())\n },\n async prompt() {\n return DESCRIPTION\n },\n renderToolUseMessage(input: any, { verbose }: { verbose: boolean }) {\n const {\n pattern,\n path,\n glob,\n type,\n output_mode = 'files_with_matches',\n head_limit,\n } = input\n if (!pattern) return ''\n const parts = [`pattern: \"${pattern}\"`]\n if (path) {\n const { absolutePath, relativePath } = getAbsoluteAndRelativePaths(path)\n parts.push(`path: \"${verbose ? absolutePath : relativePath}\"`)\n }\n if (glob) parts.push(`glob: \"${glob}\"`)\n if (type) parts.push(`type: \"${type}\"`)\n if (output_mode !== 'files_with_matches') {\n parts.push(`output_mode: \"${output_mode}\"`)\n }\n if (head_limit !== undefined) parts.push(`head_limit: ${head_limit}`)\n return parts.join(', ')\n },\n renderToolUseRejectedMessage() {\n return null\n },\n renderToolResultMessage(output) {\n // Handle string content for backward compatibility\n if (typeof output === 'string') {\n // Convert string to Output type using tmpDeserializeOldLogResult if needed\n output = output as unknown as Output\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;Found </Text>\n <Text bold>\n {output.mode === 'content'\n ? (output.numLines ?? 0)\n : output.mode === 'count'\n ? (output.numMatches ?? 0)\n : output.numFiles}{' '}\n </Text>\n <Text>\n {output.mode === 'content'\n ? (output.numLines ?? 0) === 1\n ? 'line'\n : 'lines'\n : output.mode === 'count'\n ? (output.numMatches ?? 0) === 1\n ? 'match'\n : 'matches'\n : output.numFiles === 1\n ? 'file'\n : 'files'}\n </Text>\n </Box>\n )\n },\n renderResultForAssistant(result: Output) {\n const pagination = formatPagination(\n result.appliedLimit,\n result.appliedOffset,\n )\n\n if (result.mode === 'content') {\n const base = truncateToCharBudget(result.content || 'No matches found')\n return pagination\n ? `${base}\\n\\n[Showing results with pagination = ${pagination}]`\n : base\n }\n\n if (result.mode === 'count') {\n const base = truncateToCharBudget(result.content || 'No matches found')\n const numMatches = result.numMatches ?? 0\n const numFiles = result.numFiles ?? 0\n return (\n base +\n `\\n\\nFound ${numMatches} total ${numMatches === 1 ? 'occurrence' : 'occurrences'} across ${numFiles} ${numFiles === 1 ? 'file' : 'files'}.` +\n (pagination ? ` with pagination = ${pagination}` : '')\n )\n }\n\n // files_with_matches\n if (result.numFiles === 0) return 'No files found'\n const header = `Found ${result.numFiles} file${result.numFiles === 1 ? '' : 's'}${pagination ? ` ${pagination}` : ''}\\n${result.filenames.join('\\n')}`\n return truncateToCharBudget(header)\n },\n async validateInput({ path }: any) {\n if (path) {\n const abs = getAbsolutePath(path)\n if (!abs || !existsSync(abs)) {\n return {\n result: false,\n message: `Path does not exist: ${path}`,\n errorCode: 1,\n }\n }\n }\n return { result: true }\n },\n async *call(input: any, toolUseContext: any) {\n const output = await runGrepTool({ input, toolUseContext })\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n },\n} satisfies Tool<Input, Output>\n", "export const TOOL_NAME_FOR_PROMPT = 'Grep'\n\nexport const DESCRIPTION = `A powerful search tool built on ripgrep\n\n Usage:\n - ALWAYS use Grep for search tasks. NEVER invoke \\`grep\\` or \\`rg\\` as a Bash command. The Grep tool has been optimized for correct permissions and access.\n - Supports full regex syntax (e.g., \"log.*Error\", \"function\\\\s+\\\\w+\")\n - Filter files with glob parameter (e.g., \"*.js\", \"**/*.tsx\") or type parameter (e.g., \"js\", \"py\", \"rust\")\n - Output modes: \"content\" shows matching lines, \"files_with_matches\" shows only file paths (default), \"count\" shows match counts\n - Use Task tool for open-ended searches requiring multiple rounds\n - Pattern syntax: Uses ripgrep (not grep) - literal braces need escaping (use \\`interface\\\\{\\\\}\\` to find \\`interface{}\\` in Go code)\n - Multiline matching: By default patterns match within single lines only. For cross-line patterns like \\`struct \\\\{[\\\\s\\\\S]*?field\\`, use \\`multiline: true\\`\n`\n", "import { isAbsolute, relative } from 'path'\n\nimport { getCwd } from '#core/utils/state'\n\nexport const MAX_RESULT_CHARS = 20_000\nexport const EXCLUDED_DIRS = ['.git', '.svn', '.hg', '.bzr'] as const\n\nexport function paginate<T>(\n items: T[],\n limit: number | undefined,\n offset: number,\n): T[] {\n const windowed = offset > 0 ? items.slice(offset) : items\n if (limit === undefined || limit === 0) return windowed\n return windowed.slice(0, limit)\n}\n\nexport function truncateToCharBudget(text: string): string {\n if (text.length <= MAX_RESULT_CHARS) return text\n const head = text.slice(0, MAX_RESULT_CHARS)\n const truncatedLines = text.slice(MAX_RESULT_CHARS).split('\\n').length\n return `${head}\\n\\n... [${truncatedLines} lines truncated] ...`\n}\n\nexport function toProjectRelativeIfPossible(p: string): string {\n const projectRoot = getCwd()\n const rel = relative(projectRoot, p)\n if (!rel || rel === '') return p\n if (rel.startsWith('..')) return p\n if (isAbsolute(rel)) return p\n return rel\n}\n\nexport function formatPagination(\n limit: number | undefined,\n offset: number | undefined,\n): string {\n if (!limit && !offset) return ''\n return `limit: ${limit}, offset: ${offset ?? 0}`\n}\n\nexport function parseGlobString(glob: string): string[] {\n const parts = glob.split(/\\s+/).filter(Boolean)\n const expanded: string[] = []\n for (const part of parts) {\n if (part.includes('{') && part.includes('}')) {\n expanded.push(part)\n continue\n }\n expanded.push(...part.split(',').filter(Boolean))\n }\n return expanded\n}\n", "import { stat as statAsync } from 'fs/promises'\n\nimport { getAbsolutePath } from '#core/utils/file'\nimport { ripGrep } from '#core/utils/ripgrep'\nimport { getBunShellSandboxPlan } from '#core/utils/sandbox/bunShellSandboxPlan'\nimport { getCwd } from '#core/utils/state'\n\nimport {\n EXCLUDED_DIRS,\n paginate,\n parseGlobString,\n toProjectRelativeIfPossible,\n} from './helpers'\nimport type { GrepToolCallInput, GrepToolOutput } from './types'\nimport type { ToolUseContext } from '#core/tooling/Tool'\n\nexport async function runGrepTool(args: {\n input: GrepToolCallInput\n toolUseContext: ToolUseContext\n}): Promise<GrepToolOutput> {\n const {\n pattern,\n path,\n glob,\n type,\n output_mode = 'files_with_matches',\n '-B': before,\n '-A': after,\n '-C': context,\n '-n': lineNumbers = true,\n '-i': caseInsensitive = false,\n head_limit,\n offset = 0,\n multiline = false,\n } = args.input\n\n const start = Date.now()\n const absolutePath = getAbsolutePath(path) || getCwd()\n\n const baseArgs: string[] = ['--hidden']\n for (const dir of EXCLUDED_DIRS) {\n baseArgs.push('--glob', `!${dir}`)\n }\n baseArgs.push('--max-columns', '500')\n if (multiline) {\n baseArgs.push('-U', '--multiline-dotall')\n }\n if (caseInsensitive) {\n baseArgs.push('-i')\n }\n if (type) {\n baseArgs.push('--type', type)\n }\n\n const appliedLimit = head_limit !== undefined ? head_limit : undefined\n const appliedOffset = offset || 0\n\n if (glob) {\n for (const g of parseGlobString(glob)) {\n baseArgs.push('--glob', g)\n }\n }\n\n const rgArgs: string[] = [...baseArgs]\n if (output_mode === 'files_with_matches') rgArgs.push('-l')\n else if (output_mode === 'count') rgArgs.push('-c')\n\n if (lineNumbers && output_mode === 'content') rgArgs.push('-n')\n\n if (context !== undefined && output_mode === 'content') {\n rgArgs.push('-C', String(context))\n } else if (output_mode === 'content') {\n if (before !== undefined) rgArgs.push('-B', String(before))\n if (after !== undefined) rgArgs.push('-A', String(after))\n }\n\n if (String(pattern).startsWith('-')) rgArgs.push('-e', String(pattern))\n else rgArgs.push(String(pattern))\n\n const sandboxPlan = getBunShellSandboxPlan({\n command: 'rg',\n toolUseContext: args.toolUseContext,\n })\n const lines = await ripGrep(\n rgArgs,\n absolutePath,\n args.toolUseContext.abortController.signal,\n {\n sandbox: sandboxPlan.settings.enabled\n ? sandboxPlan.bunShellSandboxOptions\n : undefined,\n },\n )\n\n if (output_mode === 'content') {\n const rewritten = lines.map(line => {\n const idx = line.indexOf(':')\n if (idx > 0) {\n const filePart = line.slice(0, idx)\n const rest = line.slice(idx)\n return toProjectRelativeIfPossible(filePart) + rest\n }\n return line\n })\n\n const window = paginate(rewritten, appliedLimit, appliedOffset)\n return {\n mode: 'content',\n numFiles: 0,\n filenames: [],\n content: window.join('\\n'),\n numLines: window.length,\n ...(appliedLimit !== undefined ? { appliedLimit } : {}),\n ...(appliedOffset > 0 ? { appliedOffset } : {}),\n durationMs: Date.now() - start,\n }\n }\n\n if (output_mode === 'count') {\n const rewritten = lines.map(line => {\n const idx = line.lastIndexOf(':')\n if (idx > 0) {\n const filePart = line.slice(0, idx)\n const rest = line.slice(idx)\n return toProjectRelativeIfPossible(filePart) + rest\n }\n return line\n })\n\n const window = paginate(rewritten, appliedLimit, appliedOffset)\n let numMatches = 0\n let numFiles = 0\n for (const entry of window) {\n const idx = entry.lastIndexOf(':')\n if (idx > 0) {\n const countStr = entry.slice(idx + 1)\n const count = Number.parseInt(countStr, 10)\n if (!Number.isNaN(count)) {\n numMatches += count\n numFiles += 1\n }\n }\n }\n\n return {\n mode: 'count',\n numFiles,\n filenames: [],\n content: window.join('\\n'),\n numMatches,\n ...(appliedLimit !== undefined ? { appliedLimit } : {}),\n ...(appliedOffset > 0 ? { appliedOffset } : {}),\n durationMs: Date.now() - start,\n }\n }\n\n const stats = await Promise.all(\n lines.map(async filePath => {\n try {\n return await statAsync(filePath)\n } catch {\n return null\n }\n }),\n )\n\n const sorted = lines\n .map((filePath, i) => [filePath, stats[i]] as const)\n .sort((a, b) => {\n const diff = (b[1]?.mtimeMs ?? 0) - (a[1]?.mtimeMs ?? 0)\n if (diff !== 0) return diff\n return a[0].localeCompare(b[0])\n })\n .map(([filePath]) => filePath)\n\n const window = paginate(sorted, appliedLimit, appliedOffset).map(\n toProjectRelativeIfPossible,\n )\n\n return {\n mode: 'files_with_matches',\n filenames: window,\n numFiles: window.length,\n ...(appliedLimit !== undefined ? { appliedLimit } : {}),\n ...(appliedOffset > 0 ? { appliedOffset } : {}),\n durationMs: Date.now() - start,\n }\n}\n", "import { z } from 'zod'\nimport { Tool } from '#core/tooling/Tool'\nimport type { Message } from '#core/query'\nimport { createUserMessage } from '#core/utils/messages'\nimport { TOOL_NAME_FOR_PROMPT } from './prompt'\nimport {\n findCommand,\n getCommandAllowedToolsFromContext,\n getCommandFlags,\n getCommandOverrides,\n parseSlashCommand,\n} from './utils'\n\nconst inputSchema = z.strictObject({\n command: z\n .string()\n .describe(\n 'The slash command to execute with its arguments, e.g., \"/review-pr 123\"',\n ),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype Output = {\n success: boolean\n commandName: string\n}\n\ntype PromptLikeCommand = {\n type: 'prompt'\n name: string\n userFacingName?: () => string\n getPromptForCommand: (args: string) => Promise<Array<{ content: unknown }>>\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\n\nfunction isPromptLikeCommand(value: unknown): value is PromptLikeCommand {\n const record = asRecord(value)\n return (\n record?.type === 'prompt' &&\n typeof record.name === 'string' &&\n typeof record.getPromptForCommand === 'function'\n )\n}\n\nfunction isTextContentBlock(\n value: unknown,\n): value is { type: 'text'; text: string } {\n const record = asRecord(value)\n return record?.type === 'text' && typeof record.text === 'string'\n}\n\nfunction contentToText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n return content\n .map(b => (isTextContentBlock(b) ? b.text : ''))\n .join('\\n')\n .trim()\n}\n\nfunction getCommandName(cmd: PromptLikeCommand): string {\n const userFacing =\n typeof cmd.userFacingName === 'function' ? cmd.userFacingName() : ''\n return userFacing || cmd.name\n}\n\nexport const SlashCommandTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description({ command }: Input) {\n return `Execute slash command: ${command}`\n },\n userFacingName() {\n return 'SlashCommand'\n },\n inputSchema,\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return true\n },\n async prompt() {\n return `Execute a slash command within the main conversation\n\nHow slash commands work:\nWhen you use this tool or when a user types a slash command, you will see <command-message>{name} is running\u2026</command-message> followed by the expanded prompt. For example, if .claude/commands/foo.md contains \"Print today's date\", then /foo expands to that prompt in the next message.\n\nUsage:\n- \\`command\\` (required): The slash command to execute, including any arguments\n- Example: \\`command: \"/review-pr 123\"\\`\n\nIMPORTANT: Only use this tool for custom slash commands that are available in the current host. Do NOT use for:\n- Built-in CLI commands (like /help, /clear, etc.)\n- Commands you think might exist but are not available\n\nNotes:\n- When a user requests multiple slash commands, execute each one sequentially and check for <command-message>{name} is running\u2026</command-message> to verify each has been processed\n- Do not invoke a command that is already running. For example, if you see <command-message>foo is running\u2026</command-message>, do NOT use this tool with \"/foo\" - process the expanded prompt in the following message\n- If a user's command is not available, ask them to check the slash command file and consult the docs.\n`\n },\n renderToolUseMessage({ command }: Input, _options: { verbose: boolean }) {\n return command || ''\n },\n renderResultForAssistant(output: Output) {\n return `Launching command: /${output.commandName}`\n },\n async validateInput({ command }: Input, context) {\n const parsed = parseSlashCommand(command)\n if (!parsed) {\n return {\n result: false,\n message: `Invalid slash command format: ${command}`,\n errorCode: 1,\n }\n }\n\n const commands = Array.isArray(context?.options?.commands)\n ? context.options.commands\n : []\n\n const cmd = findCommand(parsed.commandName, commands)\n if (!cmd) {\n return {\n result: false,\n message: `Unknown slash command: ${parsed.commandName}`,\n errorCode: 2,\n }\n }\n\n const flags = getCommandFlags(cmd)\n if (flags.disableModelInvocation) {\n return {\n result: false,\n message: `Slash command ${parsed.commandName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,\n errorCode: 4,\n }\n }\n\n if (flags.disableNonInteractive) {\n return {\n result: false,\n message: `Slash command ${parsed.commandName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`,\n errorCode: 6,\n }\n }\n\n if (!isPromptLikeCommand(cmd)) {\n return {\n result: false,\n message: `Slash command ${parsed.commandName} is not a prompt-based command`,\n errorCode: 5,\n }\n }\n\n return { result: true }\n },\n async *call({ command }: Input, context) {\n const parsed = parseSlashCommand(command)\n if (!parsed) {\n throw new Error(`Invalid slash command format: ${command}`)\n }\n\n const commands = Array.isArray(context.options?.commands)\n ? context.options.commands\n : []\n const cmdUnknown = findCommand(parsed.commandName, commands)\n if (!cmdUnknown) {\n throw new Error(`Unknown slash command: ${parsed.commandName}`)\n }\n const flags = getCommandFlags(cmdUnknown)\n if (flags.disableModelInvocation) {\n throw new Error(\n `Slash command ${parsed.commandName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,\n )\n }\n if (flags.disableNonInteractive) {\n throw new Error(\n `Slash command ${parsed.commandName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`,\n )\n }\n if (!isPromptLikeCommand(cmdUnknown)) {\n throw new Error(\n `Slash command ${parsed.commandName} is not a prompt-based command. Use /${parsed.commandName} directly in the main conversation.`,\n )\n }\n\n const cmd = cmdUnknown\n const prompt = await cmd.getPromptForCommand(parsed.args)\n const expandedMessages: Message[] = prompt.map(msg => {\n const userMessage = createUserMessage(contentToText(msg.content))\n userMessage.options = {\n ...userMessage.options,\n isCustomCommand: true,\n commandName: getCommandName(cmd),\n commandArgs: parsed.args,\n }\n return userMessage\n })\n\n const commandNameForMeta = getCommandName(cmd)\n const { progressMessage, allowedTools, model, maxThinkingTokens } =\n getCommandOverrides(cmd)\n const metaMessage =\n createUserMessage(`<command-name>${commandNameForMeta}</command-name>\n<command-message>${commandNameForMeta} is ${progressMessage}\u2026</command-message>\n<command-args>${parsed.args}</command-args>`)\n\n const output: Output = { success: true, commandName: parsed.commandName }\n\n yield {\n type: 'result' as const,\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n newMessages: [metaMessage, ...expandedMessages],\n contextModifier:\n allowedTools.length > 0 || model || maxThinkingTokens !== undefined\n ? {\n modifyContext(ctx) {\n const next = { ...ctx }\n\n if (allowedTools.length > 0) {\n const prev = getCommandAllowedToolsFromContext(next)\n next.options = {\n ...(next.options || {}),\n commandAllowedTools: [\n ...new Set([...prev, ...allowedTools]),\n ],\n }\n }\n\n if (model) {\n next.options = { ...(next.options || {}), model }\n }\n\n if (maxThinkingTokens !== undefined) {\n next.options = {\n ...(next.options || {}),\n maxThinkingTokens,\n }\n }\n\n return next\n },\n }\n : undefined,\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME_FOR_PROMPT = 'SlashCommand'\nexport const DESCRIPTION = `- Executes predefined project commands stored in .claude/.kode/commands/*.md\n- Input: command string (e.g., \"/test\" or \"/deploy staging\")\n- Only executes known commands; otherwise returns an error`\n", "export type ParsedSlashCommand = { commandName: string; args: string }\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\n\nfunction stringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n return value.filter((item): item is string => typeof item === 'string')\n}\n\nexport function normalizeCommandModelName(model: unknown): string | undefined {\n if (typeof model !== 'string') return undefined\n const trimmed = model.trim()\n if (!trimmed || trimmed === 'inherit') return undefined\n if (trimmed === 'haiku') return 'quick'\n if (trimmed === 'sonnet') return 'task'\n if (trimmed === 'opus') return 'main'\n return trimmed\n}\n\nexport function parseSlashCommand(command: string): ParsedSlashCommand | null {\n const trimmed = command.trim()\n if (!trimmed.startsWith('/')) return null\n const withoutSlash = trimmed.slice(1)\n const spaceIdx = withoutSlash.indexOf(' ')\n const commandName =\n spaceIdx === -1\n ? withoutSlash.trim()\n : withoutSlash.slice(0, spaceIdx).trim()\n if (!commandName) return null\n const args = spaceIdx === -1 ? '' : withoutSlash.slice(spaceIdx + 1).trim()\n return { commandName, args }\n}\n\nexport function findCommand(\n commandName: string,\n commands: unknown[],\n): unknown | null {\n for (const c of commands) {\n const record = asRecord(c)\n if (!record) continue\n\n if (record.name === commandName) return c\n\n const userFacingName = record.userFacingName\n if (typeof userFacingName === 'function') {\n try {\n if (userFacingName.call(c) === commandName) return c\n } catch {}\n }\n\n if (Array.isArray(record.aliases) && record.aliases.includes(commandName)) {\n return c\n }\n }\n return null\n}\n\nexport function getCommandFlags(cmd: unknown): {\n disableModelInvocation: boolean\n disableNonInteractive: boolean\n} {\n const record = asRecord(cmd)\n return {\n disableModelInvocation: record?.disableModelInvocation === true,\n disableNonInteractive: record?.disableNonInteractive === true,\n }\n}\n\nexport function getCommandOverrides(cmd: unknown): {\n progressMessage: string\n allowedTools: string[]\n model: string | undefined\n maxThinkingTokens: number | undefined\n} {\n const record = asRecord(cmd)\n const progressMessage =\n typeof record?.progressMessage === 'string' && record.progressMessage.trim()\n ? record.progressMessage.trim()\n : 'running'\n\n const allowedTools = stringArray(record?.allowedTools)\n const model = normalizeCommandModelName(record?.model)\n const maxThinkingTokens =\n typeof record?.maxThinkingTokens === 'number'\n ? record.maxThinkingTokens\n : undefined\n\n return { progressMessage, allowedTools, model, maxThinkingTokens }\n}\n\nexport function getCommandAllowedToolsFromContext(ctx: unknown): string[] {\n const record = asRecord(ctx)\n const options = asRecord(record?.options)\n return stringArray(options?.commandAllowedTools)\n}\n", "import { z } from 'zod'\nimport { Tool } from '#core/tooling/Tool'\nimport type { Message } from '#core/query'\nimport { createUserMessage } from '#core/utils/messages'\nimport { TOOL_NAME_FOR_PROMPT } from './prompt'\nconst inputSchema = z.strictObject({\n skill: z\n .string()\n .describe(\n 'The skill name (no arguments). Use a value from <available_skills>.',\n ),\n args: z\n .string()\n .optional()\n .describe('Optional arguments for the skill (freeform text)'),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype Output = {\n success: boolean\n commandName: string\n allowedTools?: string[]\n model?: string\n}\n\ntype PromptLikeCommand = {\n type: 'prompt'\n name: string\n userFacingName?: () => string\n aliases?: string[]\n getPromptForCommand: (args: string) => Promise<Array<{ content: unknown }>>\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\nfunction isTextContentBlock(\n value: unknown,\n): value is { type: 'text'; text: string } {\n const record = asRecord(value)\n return record?.type === 'text' && typeof record.text === 'string'\n}\nfunction contentToText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n return content\n .map(b => (isTextContentBlock(b) ? b.text : ''))\n .join('\\n')\n .trim()\n}\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every(item => typeof item === 'string')\n}\n\nfunction isPromptLikeCommand(value: unknown): value is PromptLikeCommand {\n const record = asRecord(value)\n return (\n record?.type === 'prompt' &&\n typeof record.name === 'string' &&\n typeof record.getPromptForCommand === 'function'\n )\n}\n\nfunction getCommandName(cmd: PromptLikeCommand): string {\n const userFacing =\n typeof cmd.userFacingName === 'function' ? cmd.userFacingName() : ''\n return userFacing || cmd.name\n}\n\nfunction getDisableModelInvocation(cmd: unknown): boolean {\n const record = asRecord(cmd)\n return record?.disableModelInvocation === true\n}\n\nfunction getAllowedTools(cmd: unknown): string[] {\n const record = asRecord(cmd)\n return isStringArray(record?.allowedTools) ? record.allowedTools : []\n}\n\nfunction getModelSetting(cmd: unknown): string | undefined {\n const record = asRecord(cmd)\n return normalizeCommandModelName(record?.model)\n}\n\nfunction getMaxThinkingTokens(cmd: unknown): number | undefined {\n const record = asRecord(cmd)\n return typeof record?.maxThinkingTokens === 'number'\n ? record.maxThinkingTokens\n : undefined\n}\n\nfunction normalizeCommandModelName(model: unknown): string | undefined {\n if (typeof model !== 'string') return undefined\n const trimmed = model.trim()\n if (!trimmed || trimmed === 'inherit') return undefined\n if (trimmed === 'haiku') return 'quick'\n if (trimmed === 'sonnet') return 'task'\n if (trimmed === 'opus') return 'main'\n return trimmed\n}\n\nexport const SkillTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description({ skill }: Input) {\n return `Execute skill: ${skill}`\n },\n userFacingName() {\n return 'Skill'\n },\n inputSchema,\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return true\n },\n async prompt() {\n return `Execute a skill within the main conversation\n\n<skills_instructions>\nWhen users ask you to perform tasks, check if any available skills can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.\n\nWhen users ask you to run a \"slash command\" or reference \"/<something>\" (e.g., \"/commit\", \"/review-pr\"), they are referring to a skill. Use this tool to invoke the corresponding skill.\n\n<example>\nUser: \"run /commit\"\nAssistant: [Calls Skill tool with skill: \"commit\"]\n</example>\n\nHow to invoke:\n- Use this tool with the skill name and optional arguments\n- Examples:\n - \\`skill: \"pdf\"\\` - invoke the pdf skill\n - \\`skill: \"commit\", args: \"-m 'Fix bug'\"\\` - invoke with arguments\n - \\`skill: \"review-pr\", args: \"123\"\\` - invoke with arguments\n - \\`skill: \"ms-office-suite:pdf\"\\` - invoke using fully qualified name\n\nImportant:\n- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action\n- NEVER just announce or mention a skill in your text response without actually calling this tool\n- This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task\n- Only use skills that are available in the current host (if the host provides an <available_skills> list, only use those)\n- Do not invoke a skill that is already running\n- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)\n</skills_instructions>\n`\n },\n renderToolUseMessage({ skill }: Input, _options: { verbose: boolean }) {\n return skill || ''\n },\n renderResultForAssistant(output: Output) {\n return `Launching skill: ${output.commandName}`\n },\n async validateInput({ skill }: Input, context) {\n const raw = skill.trim()\n if (!raw) {\n return {\n result: false,\n message: `Invalid skill format: ${skill}`,\n errorCode: 1,\n }\n }\n const skillName = raw.startsWith('/') ? raw.slice(1) : raw\n\n const commands = Array.isArray(context?.options?.commands)\n ? context.options.commands\n : []\n const cmd = findCommand(skillName, commands)\n if (!cmd) {\n return {\n result: false,\n message: `Unknown skill: ${skillName}. No matching skill is available in the current host.`,\n errorCode: 2,\n }\n }\n\n if (getDisableModelInvocation(cmd)) {\n return {\n result: false,\n message: `Skill ${skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,\n errorCode: 4,\n }\n }\n\n if (!isPromptLikeCommand(cmd)) {\n return {\n result: false,\n message: `Skill ${skillName} is not a prompt-based skill`,\n errorCode: 5,\n }\n }\n\n return { result: true }\n },\n async *call({ skill, args }: Input, context) {\n const raw = skill.trim()\n const skillName = raw.startsWith('/') ? raw.slice(1) : raw\n\n const commands = Array.isArray(context.options?.commands)\n ? context.options.commands\n : []\n const cmd = findCommand(skillName, commands)\n if (!cmd) {\n throw new Error(`Unknown skill: ${skillName}`)\n }\n if (getDisableModelInvocation(cmd)) {\n throw new Error(\n `Skill ${skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,\n )\n }\n if (!isPromptLikeCommand(cmd)) {\n throw new Error(`Skill ${skillName} is not a prompt-based skill`)\n }\n\n const prompt = await cmd.getPromptForCommand(args ?? '')\n const expandedMessages: Message[] = prompt.map(msg => {\n const userMessage = createUserMessage(contentToText(msg.content))\n userMessage.options = {\n ...userMessage.options,\n isCustomCommand: true,\n commandName: getCommandName(cmd),\n commandArgs: '',\n }\n return userMessage\n })\n\n const allowedTools = getAllowedTools(cmd)\n const model = getModelSetting(cmd)\n const maxThinkingTokens = getMaxThinkingTokens(cmd)\n\n const output: Output = {\n success: true,\n commandName: skillName,\n allowedTools: allowedTools.length > 0 ? allowedTools : undefined,\n model,\n }\n\n yield {\n type: 'result' as const,\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n newMessages: expandedMessages,\n contextModifier:\n allowedTools.length > 0 || model || maxThinkingTokens !== undefined\n ? {\n modifyContext(ctx) {\n const next = { ...ctx }\n\n if (allowedTools.length > 0) {\n const prev = next.options?.commandAllowedTools ?? []\n next.options = {\n ...(next.options || {}),\n commandAllowedTools: [\n ...new Set([...prev, ...allowedTools]),\n ],\n }\n }\n\n if (model) {\n next.options = { ...(next.options || {}), model }\n }\n\n if (maxThinkingTokens !== undefined) {\n next.options = {\n ...(next.options || {}),\n maxThinkingTokens,\n }\n }\n\n return next\n },\n }\n : undefined,\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n\nfunction findCommand(commandName: string, commands: unknown[]): unknown | null {\n for (const candidate of commands) {\n const record = asRecord(candidate)\n if (!record) continue\n if (record.name === commandName) return candidate\n if (typeof record.userFacingName === 'function') {\n try {\n if (String(record.userFacingName()) === commandName) return candidate\n } catch {\n // ignore\n }\n }\n const aliases = record.aliases\n if (isStringArray(aliases) && aliases.includes(commandName)) {\n return candidate\n }\n }\n return null\n}\n", "export const TOOL_NAME_FOR_PROMPT = 'Skill'\nexport const DESCRIPTION = `- Executes predefined skills by name\n- Input: skill string\n- Fails if the skill is not available`\n", "import type { TodoItem as StoredTodoItem } from '#core/utils/todoStorage'\n\nexport type TodoRenderModel =\n | {\n kind: 'empty'\n message: string\n }\n | {\n kind: 'list'\n items: Array<{\n checkbox: '\u2610' | '\u2612'\n checkboxDim: boolean\n content: string\n contentBold: boolean\n contentDim: boolean\n contentStrikethrough: boolean\n }>\n }\n\nexport function getTodoRenderModel(todos: StoredTodoItem[]): TodoRenderModel {\n if (todos.length === 0) {\n return { kind: 'empty', message: 'No todos currently tracked' }\n }\n\n return {\n kind: 'list',\n items: todos.map(todo => {\n const isCompleted = todo.status === 'completed'\n const isInProgress = todo.status === 'in_progress'\n\n return {\n checkbox: isCompleted ? '\u2612' : '\u2610',\n checkboxDim: isCompleted,\n content: todo.content,\n contentBold: isInProgress,\n contentDim: isCompleted,\n contentStrikethrough: isCompleted,\n }\n }),\n }\n}\n", "import { marked, Token } from 'marked'\nimport { stripSystemMessages } from './messages'\nimport chalk from 'chalk'\nimport { EOL } from 'os'\nimport { highlight, supportsLanguage } from 'cli-highlight'\nimport { logError } from './log'\n\nexport function applyMarkdown(content: string): string {\n return marked\n .lexer(stripSystemMessages(content))\n .map(_ => format(_))\n .join('')\n .trim()\n}\n\nfunction format(\n token: Token,\n listDepth = 0,\n orderedListNumber: number | null = null,\n parent: Token | null = null,\n): string {\n switch (token.type) {\n case 'blockquote':\n return chalk.dim.italic((token.tokens ?? []).map(_ => format(_)).join(''))\n case 'code':\n if (token.lang && supportsLanguage(token.lang)) {\n return highlight(token.text, { language: token.lang }) + EOL\n } else {\n logError(\n `Language not supported while highlighting code, falling back to markdown: ${token.lang}`,\n )\n return highlight(token.text, { language: 'markdown' }) + EOL\n }\n case 'codespan':\n // inline code\n return chalk.blue(token.text)\n case 'em':\n return chalk.italic((token.tokens ?? []).map(_ => format(_)).join(''))\n case 'strong':\n return chalk.bold((token.tokens ?? []).map(_ => format(_)).join(''))\n case 'heading':\n switch (token.depth) {\n case 1: // h1\n return (\n chalk.bold.italic.underline(\n (token.tokens ?? []).map(_ => format(_)).join(''),\n ) +\n EOL +\n EOL\n )\n case 2: // h2\n return (\n chalk.bold((token.tokens ?? []).map(_ => format(_)).join('')) +\n EOL +\n EOL\n )\n default: // h3+\n return (\n chalk.bold.dim((token.tokens ?? []).map(_ => format(_)).join('')) +\n EOL +\n EOL\n )\n }\n case 'hr':\n return '---'\n case 'image':\n return `[Image: ${token.title}: ${token.href}]`\n case 'link':\n return chalk.blue(token.href)\n case 'list': {\n return token.items\n .map((_: Token, index: number) =>\n format(\n _,\n listDepth,\n token.ordered ? token.start + index : null,\n token,\n ),\n )\n .join('')\n }\n case 'list_item':\n return (token.tokens ?? [])\n .map(\n _ =>\n `${' '.repeat(listDepth)}${format(_, listDepth + 1, orderedListNumber, token)}`,\n )\n .join('')\n case 'paragraph':\n return (token.tokens ?? []).map(_ => format(_)).join('') + EOL\n case 'space':\n return EOL\n case 'text':\n if (parent?.type === 'list_item') {\n return `${orderedListNumber === null ? '-' : getListNumber(listDepth, orderedListNumber) + '.'} ${token.tokens ? token.tokens.map(_ => format(_, listDepth, orderedListNumber, token)).join('') : token.text}${EOL}`\n } else {\n return token.text\n }\n }\n // NOTE: tables are intentionally not handled by this formatter.\n return ''\n}\n\nconst DEPTH_1_LIST_NUMBERS = [\n 'a',\n 'b',\n 'c',\n 'd',\n 'e',\n 'f',\n 'g',\n 'h',\n 'i',\n 'j',\n 'k',\n 'l',\n 'm',\n 'n',\n 'o',\n 'p',\n 'q',\n 'r',\n 's',\n 't',\n 'u',\n 'v',\n 'w',\n 'x',\n 'y',\n 'z',\n 'aa',\n 'ab',\n 'ac',\n 'ad',\n 'ae',\n 'af',\n 'ag',\n 'ah',\n 'ai',\n 'aj',\n 'ak',\n 'al',\n 'am',\n 'an',\n 'ao',\n 'ap',\n 'aq',\n 'ar',\n 'as',\n 'at',\n 'au',\n 'av',\n 'aw',\n 'ax',\n 'ay',\n 'az',\n]\nconst DEPTH_2_LIST_NUMBERS = [\n 'i',\n 'ii',\n 'iii',\n 'iv',\n 'v',\n 'vi',\n 'vii',\n 'viii',\n 'ix',\n 'x',\n 'xi',\n 'xii',\n 'xiii',\n 'xiv',\n 'xv',\n 'xvi',\n 'xvii',\n 'xviii',\n 'xix',\n 'xx',\n 'xxi',\n 'xxii',\n 'xxiii',\n 'xxiv',\n 'xxv',\n 'xxvi',\n 'xxvii',\n 'xxviii',\n 'xxix',\n 'xxx',\n 'xxxi',\n 'xxxii',\n 'xxxiii',\n 'xxxiv',\n 'xxxv',\n 'xxxvi',\n 'xxxvii',\n 'xxxviii',\n 'xxxix',\n 'xl',\n]\n\nfunction getListNumber(listDepth: number, orderedListNumber: number): string {\n switch (listDepth) {\n case 0:\n case 1:\n return orderedListNumber.toString()\n case 2:\n return DEPTH_1_LIST_NUMBERS[orderedListNumber - 1]! // NOTE: list markers are intentionally fixed.\n case 3:\n return DEPTH_2_LIST_NUMBERS[orderedListNumber - 1]! // NOTE: list markers are intentionally fixed.\n default:\n return orderedListNumber.toString()\n }\n}\n", "function isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\n}\n\nexport function isPackagedRuntime(): boolean {\n if (isTruthyEnv(process.env.KODE_PACKAGED)) return true\n\n // Heuristic fallback: if we're not running under bun/node, assume packaged binary.\n try {\n const exec = (process.execPath || '').split(/[\\\\/]/).pop()?.toLowerCase()\n if (!exec) return false\n if (exec === 'bun' || exec === 'bun.exe') return false\n if (exec === 'node' || exec === 'node.exe') return false\n return true\n } catch {\n return false\n }\n}\n\nexport type TruncateResult = {\n text: string\n truncated: boolean\n omittedLines: number\n omittedChars: number\n}\n\nexport function truncateTextForDisplay(\n text: string,\n options?: { maxLines?: number; maxChars?: number },\n): TruncateResult {\n const maxLines = options?.maxLines ?? 120\n const maxChars = options?.maxChars ?? 12_000\n\n const normalized = String(text ?? '')\n const lines = normalized.split(/\\r?\\n/)\n\n let workingLines = lines\n let omittedLines = 0\n if (maxLines > 0 && lines.length > maxLines) {\n workingLines = lines.slice(0, maxLines)\n omittedLines = lines.length - maxLines\n }\n\n let workingText = workingLines.join('\\n')\n let omittedChars = 0\n if (maxChars > 0 && workingText.length > maxChars) {\n omittedChars = workingText.length - maxChars\n workingText = workingText.slice(0, maxChars)\n }\n\n const truncated = omittedLines > 0 || omittedChars > 0\n if (!truncated) {\n return {\n text: workingText,\n truncated: false,\n omittedLines: 0,\n omittedChars: 0,\n }\n }\n\n const suffixParts: string[] = []\n if (omittedLines > 0) {\n suffixParts.push(`${omittedLines} lines`)\n }\n if (omittedChars > 0) {\n suffixParts.push(`${omittedChars} chars`)\n }\n\n const suffix = `\\n\\n... [truncated ${suffixParts.join(' \u00B7 ')}] ...`\n return {\n text: workingText + suffix,\n truncated: true,\n omittedLines,\n omittedChars,\n }\n}\n\nexport function maybeTruncateVerboseToolOutput(\n text: string,\n options?: { maxLines?: number; maxChars?: number },\n): { text: string; truncated: boolean } {\n const maxLinesEnv = Number(process.env.KODE_TOOL_OUTPUT_MAX_LINES ?? '')\n const maxCharsEnv = Number(process.env.KODE_TOOL_OUTPUT_MAX_CHARS ?? '')\n const envOverrides = {\n maxLines:\n Number.isFinite(maxLinesEnv) && maxLinesEnv > 0 ? maxLinesEnv : undefined,\n maxChars:\n Number.isFinite(maxCharsEnv) && maxCharsEnv > 0 ? maxCharsEnv : undefined,\n }\n\n const effective = {\n maxLines: envOverrides.maxLines ?? options?.maxLines,\n maxChars: envOverrides.maxChars ?? options?.maxChars,\n }\n\n const fullAllowed = isTruthyEnv(process.env.KODE_TOOL_OUTPUT_FULL)\n if (!isPackagedRuntime() || fullAllowed) {\n return { text: String(text ?? ''), truncated: false }\n }\n\n const result = truncateTextForDisplay(String(text ?? ''), effective)\n return { text: result.text, truncated: result.truncated }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Box", "Text", "React", "z", "TOOL_NAME_FOR_PROMPT", "PROMPT", "response", "inputSchema", "z", "TOOL_NAME_FOR_PROMPT", "PROMPT", "React", "Box", "Text", "codeText", "result", "output", "EOL", "isAbsolute", "resolve", "React", "z", "Box", "Text", "Box", "Text", "React", "Box", "Text", "React", "React", "Box", "Text", "parseBoolLike", "path", "asRecord", "React", "Box", "Text", "React", "React", "Box", "Text", "resolve", "URL", "path", "resolve", "net", "resolve", "resolve", "renderResultForAssistant", "inputSchema", "z", "isAbsolute", "resolve", "base", "EOL", "Box", "Text", "React", "z", "inputSchema", "z", "React", "Box", "Text", "Box", "Text", "React", "z", "inputSchema", "z", "React", "Box", "Text", "Box", "Text", "relative", "React", "z", "logError", "DESCRIPTION", "PROMPT", "randomUUID", "isAbsolute", "resolve", "isAbsolute", "resolve", "randomUUID", "inputSchema", "z", "DESCRIPTION", "PROMPT", "relative", "Box", "Text", "mkdirSync", "statSync", "isAbsolute", "relative", "resolve", "z", "DESCRIPTION", "isAbsolute", "resolve", "_", "normalizeLineEndings", "isAbsolute", "resolve", "normalizeLineEndings", "inputSchema", "z", "DESCRIPTION", "relative", "isAbsolute", "resolve", "normalizeLineEndings", "statSync", "mkdirSync", "Box", "Text", "path", "extname", "relative", "React", "z", "DESCRIPTION", "PROMPT", "existsSync", "homedir", "existsSync", "readFileSync", "writeFileSync", "mkdirSync", "statSync", "dirname", "extname", "normalize", "resolve", "resolve", "relative", "isAbsolute", "existsSync", "extname", "statSync", "readFileSync", "dirname", "mkdirSync", "writeFileSync", "path", "normalize", "resolve", "homedir", "existsSync", "highlight", "supportsLanguage", "highlightCode", "MAX_LINE_LENGTH", "statSync", "path", "statSync", "statSync", "fileReadResult", "statSync", "data", "MAX_LINE_LENGTH", "inputSchema", "z", "DESCRIPTION", "PROMPT", "relative", "Box", "Text", "highlightCode", "extname", "mkdirSync", "statSync", "dirname", "isAbsolute", "relative", "resolve", "z", "PROMPT", "inputSchema", "z", "PROMPT", "relative", "isAbsolute", "resolve", "statSync", "dirname", "mkdirSync", "data", "z", "TOOL_NAME_FOR_PROMPT", "DESCRIPTION", "existsSync", "statSync", "isAbsolute", "join", "relative", "resolve", "inputSchema", "z", "TOOL_NAME_FOR_PROMPT", "DESCRIPTION", "path", "isAbsolute", "resolve", "existsSync", "statSync", "relative", "join", "Box", "Text", "React", "existsSync", "z", "TOOL_NAME_FOR_PROMPT", "DESCRIPTION", "isAbsolute", "relative", "relative", "isAbsolute", "path", "window", "inputSchema", "z", "TOOL_NAME_FOR_PROMPT", "DESCRIPTION", "path", "React", "Box", "Text", "existsSync", "z", "TOOL_NAME_FOR_PROMPT", "asRecord", "inputSchema", "z", "asRecord", "isTextContentBlock", "TOOL_NAME_FOR_PROMPT", "z", "TOOL_NAME_FOR_PROMPT", "inputSchema", "z", "asRecord", "isTextContentBlock", "contentToText", "isPromptLikeCommand", "getCommandName", "normalizeCommandModelName", "TOOL_NAME_FOR_PROMPT", "findCommand", "chalk", "EOL", "highlight", "supportsLanguage", "chalk", "supportsLanguage", "highlight", "EOL"]
7
+ }