@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/core/src/utils/tokens.ts", "../../packages/core/src/messages.ts", "../../packages/core/src/services/fileFreshness.ts", "../../packages/core/src/utils/file.ts", "../../packages/core/src/utils/ripgrep.ts", "../../packages/core/src/utils/file/glob.ts", "../../packages/runtime/src/searcher.ts", "../../packages/core/src/utils/fileRecoveryCore.ts", "../../packages/core/src/utils/autoCompactThreshold.ts", "../../packages/core/src/utils/autoCompactCore.ts", "../../packages/core/src/feedback/binaryFeedback.ts", "../../packages/core/src/engine/query-executor.ts", "../../packages/core/src/utils/toolNameAliases.ts", "../../packages/core/src/engine/pipeline/tool-input.ts", "../../packages/core/src/engine/pipeline/tool-call.ts", "../../packages/core/src/engine/pipeline/tool-use.ts", "../../packages/core/src/engine/pipeline/tool-use-queue.ts", "../../packages/core/src/engine/pipeline/types.ts", "../../packages/core/src/query/agentEvents.ts", "../../packages/core/src/engine/message-pipeline.ts", "../../packages/core/src/engine/orchestrator.ts"],
4
+ "sourcesContent": ["import { Message } from '#core/query'\nimport { SYNTHETIC_ASSISTANT_MESSAGES } from './messages'\n\nexport function countTokens(messages: Message[]): number {\n let i = messages.length - 1\n while (i >= 0) {\n const message = messages[i]\n if (\n message?.type === 'assistant' &&\n 'usage' in message.message &&\n !(\n message.message.content[0]?.type === 'text' &&\n SYNTHETIC_ASSISTANT_MESSAGES.has(message.message.content[0].text)\n )\n ) {\n const { usage } = message.message\n return (\n usage.input_tokens +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0) +\n usage.output_tokens\n )\n }\n i--\n }\n return 0\n}\n\nexport function countCachedTokens(messages: Message[]): number {\n let i = messages.length - 1\n while (i >= 0) {\n const message = messages[i]\n if (message?.type === 'assistant' && 'usage' in message.message) {\n const { usage } = message.message\n return (\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0)\n )\n }\n i--\n }\n return 0\n}\n", "import type { Message } from './query'\n\ntype MessageState = Message[]\ntype MessageStateUpdater = MessageState | ((prev: MessageState) => MessageState)\ntype MessageStateSetter = (update: MessageStateUpdater) => void\n\nlet getMessages: () => Message[] = () => []\nlet setMessages: MessageStateSetter = () => {}\n\nexport function setMessagesGetter(getter: () => Message[]) {\n getMessages = getter\n}\n\nexport function getMessagesGetter(): () => Message[] {\n return getMessages\n}\n\nexport function setMessagesSetter(setter: MessageStateSetter) {\n setMessages = setter\n}\n\nexport function getMessagesSetter(): MessageStateSetter {\n return setMessages\n}\n\n// Global UI refresh mechanism for model configuration changes\nlet onModelConfigChange: (() => void) | null = null\n\nexport function setModelConfigChangeHandler(handler: () => void) {\n onModelConfigChange = handler\n}\n\nexport function triggerModelConfigChange() {\n if (onModelConfigChange) {\n onModelConfigChange()\n }\n}\n", "import { statSync, existsSync, watchFile, unwatchFile } from 'fs'\nimport {\n emitReminderEvent,\n systemReminderService,\n} from '#core/services/systemReminder'\nimport { getAgentFilePath } from '#core/utils/agentStorage'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\ninterface FileTimestamp {\n path: string\n lastRead: number\n lastModified: number\n size: number\n lastAgentEdit?: number // Track when Agent last edited this file\n}\n\ninterface FileFreshnessState {\n readTimestamps: Map<string, FileTimestamp>\n editConflicts: Set<string>\n sessionFiles: Set<string>\n watchedTodoFiles: Map<string, string> // agentId -> filePath\n}\n\nclass FileFreshnessService {\n private state: FileFreshnessState = {\n readTimestamps: new Map(),\n editConflicts: new Set(),\n sessionFiles: new Set(),\n watchedTodoFiles: new Map(),\n }\n\n constructor() {\n this.setupEventListeners()\n }\n\n /**\n * Setup event listeners for session management\n */\n private setupEventListeners(): void {\n // Listen for session startup events through the SystemReminderService\n systemReminderService.addEventListener(\n 'session:startup',\n (context: any) => {\n // Reset session state on startup\n this.resetSession()\n },\n )\n }\n\n /**\n * Record file read operation with timestamp tracking\n */\n public recordFileRead(filePath: string): void {\n try {\n if (!existsSync(filePath)) {\n return\n }\n\n const stats = statSync(filePath)\n const timestamp: FileTimestamp = {\n path: filePath,\n lastRead: Date.now(),\n lastModified: stats.mtimeMs,\n size: stats.size,\n }\n\n this.state.readTimestamps.set(filePath, timestamp)\n this.state.sessionFiles.add(filePath)\n\n // Emit file read event for system reminders\n emitReminderEvent('file:read', {\n filePath,\n timestamp: timestamp.lastRead,\n size: timestamp.size,\n modified: timestamp.lastModified,\n })\n } catch (error) {\n logError(error)\n debugLogger.warn('FILE_FRESHNESS_RECORD_READ_FAILED', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n /**\n * Check if file has been modified since last read\n */\n public checkFileFreshness(filePath: string): {\n isFresh: boolean\n lastRead?: number\n currentModified?: number\n conflict: boolean\n } {\n const recorded = this.state.readTimestamps.get(filePath)\n\n if (!recorded) {\n return { isFresh: true, conflict: false }\n }\n\n try {\n if (!existsSync(filePath)) {\n return { isFresh: false, conflict: true }\n }\n\n const currentStats = statSync(filePath)\n const isFresh = currentStats.mtimeMs <= recorded.lastModified\n const conflict = !isFresh\n\n if (conflict) {\n this.state.editConflicts.add(filePath)\n\n // Emit file conflict event\n emitReminderEvent('file:conflict', {\n filePath,\n lastRead: recorded.lastRead,\n lastModified: recorded.lastModified,\n currentModified: currentStats.mtimeMs,\n sizeDiff: currentStats.size - recorded.size,\n })\n }\n\n return {\n isFresh,\n lastRead: recorded.lastRead,\n currentModified: currentStats.mtimeMs,\n conflict,\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('FILE_FRESHNESS_CHECK_FAILED', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n return { isFresh: false, conflict: true }\n }\n }\n\n /**\n * Record file edit operation by Agent\n */\n public recordFileEdit(filePath: string, content?: string): void {\n try {\n const now = Date.now()\n\n // Update recorded timestamp after edit\n if (existsSync(filePath)) {\n const stats = statSync(filePath)\n const existing = this.state.readTimestamps.get(filePath)\n\n if (existing) {\n existing.lastModified = stats.mtimeMs\n existing.size = stats.size\n existing.lastAgentEdit = now // Mark this as Agent-initiated edit\n this.state.readTimestamps.set(filePath, existing)\n } else {\n // Create new record for Agent-edited file\n const timestamp: FileTimestamp = {\n path: filePath,\n lastRead: now,\n lastModified: stats.mtimeMs,\n size: stats.size,\n lastAgentEdit: now,\n }\n this.state.readTimestamps.set(filePath, timestamp)\n }\n }\n\n // Remove from conflicts since we just edited it\n this.state.editConflicts.delete(filePath)\n\n // Emit file edit event\n emitReminderEvent('file:edited', {\n filePath,\n timestamp: now,\n contentLength: content?.length || 0,\n source: 'agent',\n })\n } catch (error) {\n logError(error)\n debugLogger.warn('FILE_FRESHNESS_RECORD_EDIT_FAILED', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n public generateFileModificationReminder(filePath: string): string | null {\n const recorded = this.state.readTimestamps.get(filePath)\n\n if (!recorded) {\n return null\n }\n\n try {\n if (!existsSync(filePath)) {\n return `Note: ${filePath} was deleted since last read.`\n }\n\n const currentStats = statSync(filePath)\n const isModified = currentStats.mtimeMs > recorded.lastModified\n\n if (!isModified) {\n return null\n }\n\n // Check if this was an Agent-initiated change\n // Use small time tolerance to handle filesystem timestamp precision issues\n const TIME_TOLERANCE_MS = 100\n if (\n recorded.lastAgentEdit &&\n recorded.lastAgentEdit >= recorded.lastModified - TIME_TOLERANCE_MS\n ) {\n // Agent modified this file recently, no reminder needed\n // (context already contains before/after content)\n return null\n }\n\n // External modification detected - generate reminder\n return `Note: ${filePath} was modified externally since last read. The file may have changed outside of this session.`\n } catch (error) {\n logError(error)\n debugLogger.warn('FILE_FRESHNESS_CHECK_MODIFICATION_FAILED', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n }\n\n public getConflictedFiles(): string[] {\n return Array.from(this.state.editConflicts)\n }\n\n public getSessionFiles(): string[] {\n return Array.from(this.state.sessionFiles)\n }\n\n public resetSession(): void {\n // Clean up existing todo file watchers\n this.state.watchedTodoFiles.forEach(filePath => {\n try {\n unwatchFile(filePath)\n } catch (error) {\n logError(error)\n debugLogger.warn('FILE_FRESHNESS_UNWATCH_FAILED', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n })\n\n this.state = {\n readTimestamps: new Map(),\n editConflicts: new Set(),\n sessionFiles: new Set(),\n watchedTodoFiles: new Map(),\n }\n }\n\n /**\n * Start watching todo file for an agent\n */\n public startWatchingTodoFile(agentId: string): void {\n try {\n const filePath = getAgentFilePath(agentId)\n\n // Don't watch if already watching\n if (this.state.watchedTodoFiles.has(agentId)) {\n return\n }\n\n this.state.watchedTodoFiles.set(agentId, filePath)\n\n // Record initial state if file exists\n if (existsSync(filePath)) {\n this.recordFileRead(filePath)\n }\n\n // Start watching for changes\n watchFile(filePath, { interval: 1000 }, (curr, prev) => {\n // Check if this was an external modification\n const reminder = this.generateFileModificationReminder(filePath)\n if (reminder) {\n // File was modified externally, emit todo change reminder\n emitReminderEvent('todo:file_changed', {\n agentId,\n filePath,\n reminder,\n timestamp: Date.now(),\n currentStats: { mtime: curr.mtime, size: curr.size },\n previousStats: { mtime: prev.mtime, size: prev.size },\n })\n }\n })\n } catch (error) {\n logError(error)\n debugLogger.warn('FILE_FRESHNESS_TODO_WATCH_START_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n /**\n * Stop watching todo file for an agent\n */\n public stopWatchingTodoFile(agentId: string): void {\n try {\n const filePath = this.state.watchedTodoFiles.get(agentId)\n if (filePath) {\n unwatchFile(filePath)\n this.state.watchedTodoFiles.delete(agentId)\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('FILE_FRESHNESS_TODO_WATCH_STOP_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n public getFileInfo(filePath: string): FileTimestamp | null {\n return this.state.readTimestamps.get(filePath) || null\n }\n\n public isFileTracked(filePath: string): boolean {\n return this.state.readTimestamps.has(filePath)\n }\n\n /**\n * Retrieves files prioritized for recovery during conversation compression\n *\n * Selects recently accessed files based on:\n * - File access recency (most recent first)\n * - File type relevance (excludes dependencies, build artifacts)\n * - Development workflow importance\n *\n * Used to maintain coding context when conversation history is compressed\n */\n public getImportantFiles(maxFiles: number = 5): Array<{\n path: string\n timestamp: number\n size: number\n }> {\n return Array.from(this.state.readTimestamps.entries())\n .map(([path, info]) => ({\n path,\n timestamp: info.lastRead,\n size: info.size,\n }))\n .filter(file => this.isValidForRecovery(file.path))\n .sort((a, b) => b.timestamp - a.timestamp) // Newest first\n .slice(0, maxFiles)\n }\n\n /**\n * Determines which files are suitable for automatic recovery\n *\n * Excludes files that are typically not relevant for development context:\n * - Build artifacts and generated files\n * - Dependencies and cached files\n * - Temporary files and system directories\n */\n private isValidForRecovery(filePath: string): boolean {\n return (\n !filePath.includes('node_modules') &&\n !filePath.includes('.git') &&\n !filePath.startsWith('/tmp') &&\n !filePath.includes('.cache') &&\n !filePath.includes('dist/') &&\n !filePath.includes('build/')\n )\n }\n}\n\nexport const fileFreshnessService = new FileFreshnessService()\n\nexport const recordFileRead = (filePath: string) =>\n fileFreshnessService.recordFileRead(filePath)\nexport const recordFileEdit = (filePath: string, content?: string) =>\n fileFreshnessService.recordFileEdit(filePath, content)\nexport const checkFileFreshness = (filePath: string) =>\n fileFreshnessService.checkFileFreshness(filePath)\nexport const generateFileModificationReminder = (filePath: string) =>\n fileFreshnessService.generateFileModificationReminder(filePath)\nexport const resetFileFreshnessSession = () =>\n fileFreshnessService.resetSession()\nexport const startWatchingTodoFile = (agentId: string) =>\n fileFreshnessService.startWatchingTodoFile(agentId)\nexport const stopWatchingTodoFile = (agentId: string) =>\n fileFreshnessService.stopWatchingTodoFile(agentId)\n", "import {\n readFileSync,\n writeFileSync,\n openSync,\n readSync,\n closeSync,\n existsSync,\n readdirSync,\n} from 'fs'\nimport { logError } from './log'\nimport {\n isAbsolute,\n normalize,\n resolve,\n resolve as resolvePath,\n relative,\n sep,\n basename,\n dirname,\n extname,\n join,\n} from 'path'\nimport { cwd } from 'process'\nimport { listAllContentFiles } from './ripgrep'\nimport { LRUCache } from 'lru-cache'\nimport { getCwd } from './state'\nexport { glob } from './file/glob'\n\nexport type File = {\n filename: string\n content: string\n}\n\nexport type LineEndingType = 'CRLF' | 'LF'\n\nexport function readFileSafe(filepath: string): string | null {\n try {\n return readFileSync(filepath, 'utf-8')\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function isInDirectory(\n relativePath: string,\n relativeCwd: string,\n): boolean {\n if (relativePath === '.') {\n return true\n }\n\n // Reject paths starting with ~ (home directory)\n if (relativePath.startsWith('~')) {\n return false\n }\n\n // Reject paths containing null bytes or other sneaky characters\n if (relativePath.includes('\\0') || relativeCwd.includes('\\0')) {\n return false\n }\n\n // Normalize paths to resolve any '..' or '.' segments\n // and add trailing slashes\n let normalizedPath = normalize(relativePath)\n let normalizedCwd = normalize(relativeCwd)\n\n normalizedPath = normalizedPath.endsWith(sep)\n ? normalizedPath\n : normalizedPath + sep\n normalizedCwd = normalizedCwd.endsWith(sep)\n ? normalizedCwd\n : normalizedCwd + sep\n\n // Join with a base directory to make them absolute-like for comparison\n const fullPath = resolvePath(cwd(), normalizedCwd, normalizedPath)\n const fullCwd = resolvePath(cwd(), normalizedCwd)\n\n // Robust subpath check using path.relative (case-insensitive on Windows)\n const rel = relative(fullCwd, fullPath)\n if (!rel || rel === '') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n return true\n}\n\nexport function readTextContent(\n filePath: string,\n offset = 0,\n maxLines?: number,\n): { content: string; lineCount: number; totalLines: number } {\n const enc = detectFileEncoding(filePath)\n const content = readFileSync(filePath, enc)\n const lines = content.split(/\\r?\\n/)\n\n // Truncate number of lines if needed\n const toReturn =\n maxLines !== undefined && lines.length - offset > maxLines\n ? lines.slice(offset, offset + maxLines)\n : lines.slice(offset)\n\n return {\n content: toReturn.join('\\n'), // NOTE: Normalizes line endings to LF for display/LLM consumption.\n lineCount: toReturn.length,\n totalLines: lines.length,\n }\n}\n\nexport function writeTextContent(\n filePath: string,\n content: string,\n encoding: BufferEncoding,\n endings: LineEndingType,\n): void {\n let toWrite = content\n if (endings === 'CRLF') {\n toWrite = content.split('\\n').join('\\r\\n')\n }\n\n writeFileSync(filePath, toWrite, { encoding, flush: true })\n}\n\nconst repoEndingCache = new LRUCache<string, LineEndingType>({\n fetchMethod: path => detectRepoLineEndingsDirect(path),\n ttl: 5 * 60 * 1000,\n ttlAutopurge: false,\n max: 1000,\n})\n\nexport async function detectRepoLineEndings(\n filePath: string,\n): Promise<LineEndingType | undefined> {\n return repoEndingCache.fetch(resolve(filePath))\n}\n\nexport async function detectRepoLineEndingsDirect(\n cwd: string,\n): Promise<LineEndingType> {\n const abortController = new AbortController()\n setTimeout(() => {\n abortController.abort()\n }, 1_000)\n const allFiles = await listAllContentFiles(cwd, abortController.signal, 15)\n\n let crlfCount = 0\n for (const file of allFiles) {\n const lineEnding = detectLineEndings(file)\n if (lineEnding === 'CRLF') {\n crlfCount++\n }\n }\n\n return crlfCount > 3 ? 'CRLF' : 'LF'\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nfunction fetch<K extends {}, V extends {}>(\n cache: LRUCache<K, V>,\n key: K,\n value: () => V,\n): V {\n if (cache.has(key)) {\n return cache.get(key)!\n }\n\n const v = value()\n cache.set(key, v)\n return v\n}\n\nconst fileEncodingCache = new LRUCache<string, BufferEncoding>({\n fetchMethod: path => detectFileEncodingDirect(path),\n ttl: 5 * 60 * 1000,\n ttlAutopurge: false,\n max: 1000,\n})\n\nexport function detectFileEncoding(filePath: string): BufferEncoding {\n const k = resolve(filePath)\n return fetch(fileEncodingCache, k, () => detectFileEncodingDirect(k))\n}\n\nexport function detectFileEncodingDirect(filePath: string): BufferEncoding {\n const BUFFER_SIZE = 4096\n const buffer = Buffer.alloc(BUFFER_SIZE)\n\n let fd: number | undefined = undefined\n try {\n fd = openSync(filePath, 'r')\n const bytesRead = readSync(fd, buffer, 0, BUFFER_SIZE, 0)\n\n if (bytesRead >= 2) {\n if (buffer[0] === 0xff && buffer[1] === 0xfe) return 'utf16le'\n }\n\n if (\n bytesRead >= 3 &&\n buffer[0] === 0xef &&\n buffer[1] === 0xbb &&\n buffer[2] === 0xbf\n ) {\n return 'utf8'\n }\n\n const isUtf8 = buffer.slice(0, bytesRead).toString('utf8').length > 0\n return isUtf8 ? 'utf8' : 'ascii'\n } catch (error) {\n logError(`Error detecting encoding for file ${filePath}: ${error}`)\n return 'utf8'\n } finally {\n if (fd) closeSync(fd)\n }\n}\n\nconst lineEndingCache = new LRUCache<string, LineEndingType>({\n fetchMethod: path => detectLineEndingsDirect(path),\n ttl: 5 * 60 * 1000,\n ttlAutopurge: false,\n max: 1000,\n})\n\nexport function detectLineEndings(filePath: string): LineEndingType {\n const k = resolve(filePath)\n return fetch(lineEndingCache, k, () => detectLineEndingsDirect(k))\n}\n\nexport function detectLineEndingsDirect(\n filePath: string,\n encoding: BufferEncoding = 'utf8',\n): LineEndingType {\n try {\n const buffer = Buffer.alloc(4096)\n const fd = openSync(filePath, 'r')\n const bytesRead = readSync(fd, buffer, 0, 4096, 0)\n closeSync(fd)\n\n const content = buffer.toString(encoding, 0, bytesRead)\n let crlfCount = 0\n let lfCount = 0\n\n for (let i = 0; i < content.length; i++) {\n if (content[i] === '\\n') {\n if (i > 0 && content[i - 1] === '\\r') {\n crlfCount++\n } else {\n lfCount++\n }\n }\n }\n\n return crlfCount > lfCount ? 'CRLF' : 'LF'\n } catch (error) {\n logError(`Error detecting line endings for file ${filePath}: ${error}`)\n return 'LF'\n }\n}\n\nexport function normalizeFilePath(filePath: string): string {\n const absoluteFilePath = isAbsolute(filePath)\n ? filePath\n : resolve(getCwd(), filePath)\n\n // One weird trick for half-width space characters in MacOS screenshot filenames\n if (absoluteFilePath.endsWith(' AM.png')) {\n return absoluteFilePath.replace(\n ' AM.png',\n `${String.fromCharCode(8239)}AM.png`,\n )\n }\n\n // One weird trick for half-width space characters in MacOS screenshot filenames\n if (absoluteFilePath.endsWith(' PM.png')) {\n return absoluteFilePath.replace(\n ' PM.png',\n `${String.fromCharCode(8239)}PM.png`,\n )\n }\n\n return absoluteFilePath\n}\n\nexport function getAbsolutePath(path: string | undefined): string | undefined {\n return path ? (isAbsolute(path) ? path : resolve(getCwd(), path)) : undefined\n}\n\nexport function getAbsoluteAndRelativePaths(path: string | undefined): {\n absolutePath: string | undefined\n relativePath: string | undefined\n} {\n const absolutePath = getAbsolutePath(path)\n const relativePath = absolutePath\n ? relative(getCwd(), absolutePath)\n : undefined\n return { absolutePath, relativePath }\n}\n\n/**\n * Find files with the same name but different extensions in the same directory\n * @param filePath The path to the file that doesn't exist\n * @returns The found file with a different extension, or undefined if none found\n */\n\nexport function findSimilarFile(filePath: string): string | undefined {\n try {\n const dir = dirname(filePath)\n const fileBaseName = basename(filePath, extname(filePath))\n\n // Check if directory exists\n if (!existsSync(dir)) {\n return undefined\n }\n\n // Get all files in the directory\n const files = readdirSync(dir)\n\n // Find files with the same base name but different extension\n const similarFiles = files.filter(\n file =>\n basename(file, extname(file)) === fileBaseName &&\n join(dir, file) !== filePath,\n )\n\n // Return just the filename of the first match if found\n const firstMatch = similarFiles[0]\n if (firstMatch) {\n return firstMatch\n }\n return undefined\n } catch (error) {\n // In case of any errors, return undefined\n logError(`Error finding similar file for ${filePath}: ${error}`)\n return undefined\n }\n}\n\n/**\n * Adds cat -n style line numbers to the content\n */\nexport function addLineNumbers({\n content,\n // 1-indexed\n startLine,\n}: {\n content: string\n startLine: number\n}): string {\n if (!content) {\n return ''\n }\n\n return content\n .split(/\\r?\\n/)\n .map((line, index) => {\n const lineNum = index + startLine\n const numStr = String(lineNum)\n // Format: line numbers are padded to 6 chars, followed by a right arrow.\n if (numStr.length >= 6) {\n return `${numStr}\u2192${line}`\n }\n return `${numStr.padStart(6, ' ')}\u2192${line}`\n })\n .join('\\n') // NOTE: Normalizes line endings to LF for display/LLM consumption.\n}\n\n/**\n * Checks if a directory is empty by efficiently reading just the first entry\n * @param dirPath The path to the directory to check\n * @returns true if the directory is empty, false otherwise\n */\nexport function isDirEmpty(dirPath: string): boolean {\n try {\n const entries = readdirSync(dirPath)\n return entries.length === 0\n } catch (error) {\n logError(`Error checking directory: ${error}`)\n return false\n }\n}\n", "import { findActualExecutable } from 'spawn-rx'\nimport { memoize } from 'lodash-es'\nimport { existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport * as path from 'path'\nimport { logError } from './log'\nimport { execFileNoThrow } from './execFileNoThrow'\nimport { execFile } from 'child_process'\nimport debug from 'debug'\nimport { quote } from 'shell-quote'\nimport type { BunShellSandboxOptions } from '#runtime/shell'\nimport { BunShell } from '#runtime/shell'\n\nconst d = debug('kode:ripgrep')\n\nfunction getCurrentModuleUrl(): string {\n // CJS builds (for SDK require()) don't have `import.meta.url`.\n // ESM builds don't have `__filename`.\n if (typeof __filename === 'string' && __filename) {\n return pathToFileURL(__filename).href\n }\n return import.meta.url\n}\n\nfunction clearMemoizeCache(value: unknown): void {\n const candidate = value as { cache?: { clear?: () => void } }\n candidate.cache?.clear?.()\n}\n\nfunction getVscodeRipgrepPathOrThrow(): string {\n try {\n const req = createRequire(getCurrentModuleUrl())\n const mod = req('@vscode/ripgrep') as { rgPath?: unknown }\n if (typeof mod?.rgPath === 'string' && mod.rgPath.trim()) return mod.rgPath\n } catch (err) {\n throw new Error(\n [\n '@vscode/ripgrep is required but could not be loaded.',\n 'Fix:',\n '- Reinstall dependencies: bun install',\n '- Or install ripgrep system-wide and ensure `rg` is on PATH',\n err instanceof Error ? `Reason: ${err.message}` : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n )\n }\n throw new Error('Invalid @vscode/ripgrep export: rgPath missing')\n}\n\nfunction findRipgrepVendorRoot(): string | null {\n const explicit = process.env.KODE_RIPGREP_VENDOR_ROOT\n if (explicit && existsSync(explicit)) {\n return explicit\n }\n\n const startDir = path.dirname(fileURLToPath(getCurrentModuleUrl()))\n let dir = startDir\n for (let i = 0; i < 8; i++) {\n const direct = path.join(dir, 'vendor', 'ripgrep')\n if (existsSync(direct)) return direct\n\n const distVendor = path.join(dir, 'dist', 'vendor', 'ripgrep')\n if (existsSync(distVendor)) return distVendor\n\n const parent = path.dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n\n return null\n}\n\nfunction resolveExplicitRipgrepPathOrThrow(): string | null {\n const explicit = process.env.KODE_RIPGREP_PATH\n if (!explicit) return null\n if (!existsSync(explicit)) {\n throw new Error(`KODE_RIPGREP_PATH points to a missing file: ${explicit}`)\n }\n return explicit\n}\n\nfunction resolveVendorRipgrepPathOrNull(): string | null {\n const rgRoot = findRipgrepVendorRoot()\n if (!rgRoot) {\n return null\n }\n\n if (process.platform === 'win32') {\n // Prefer native arch, but fall back to x64 (works under emulation on some Windows ARM setups).\n const candidates = [`${process.arch}-win32`, 'x64-win32']\n for (const dirName of candidates) {\n const p = path.resolve(rgRoot, dirName, 'rg.exe')\n if (existsSync(p)) {\n d('internal ripgrep resolved as: %s', p)\n return p\n }\n }\n return null\n }\n\n const ret = path.resolve(rgRoot, `${process.arch}-${process.platform}`, 'rg')\n if (!existsSync(ret)) {\n return null\n }\n\n d('internal ripgrep resolved as: %s', ret)\n return ret\n}\n\nexport const getRipgrepPath = memoize((): string => {\n const explicit = resolveExplicitRipgrepPathOrThrow()\n if (explicit) return explicit\n\n const vscodeRgPath = getVscodeRipgrepPathOrThrow()\n\n const useBuiltinRipgrep = !!process.env.USE_BUILTIN_RIPGREP\n if (useBuiltinRipgrep) {\n d('Using builtin ripgrep because USE_BUILTIN_RIPGREP is set')\n const vendor = resolveVendorRipgrepPathOrNull()\n if (vendor) return vendor\n return vscodeRgPath\n }\n\n const { cmd } = findActualExecutable('rg', [])\n d(`ripgrep initially resolved as: ${cmd}`)\n if (cmd !== 'rg') return cmd\n\n const vendor = resolveVendorRipgrepPathOrNull()\n if (vendor) return vendor\n\n // Default fallback: ship a known-good ripgrep via @vscode/ripgrep.\n return vscodeRgPath\n})\n\nexport async function ripGrep(\n args: string[],\n target: string,\n abortSignal: AbortSignal,\n options?: { sandbox?: BunShellSandboxOptions },\n): Promise<string[]> {\n await codesignRipgrepIfNecessary()\n const rg = getRipgrepPath()\n d('ripgrep called: %s %o', rg, target, args)\n\n // NB: When running interactively, ripgrep does not require a path as its last\n // argument, but when run non-interactively, it will hang unless a path or file\n // pattern is provided\n if (options?.sandbox?.enabled === true) {\n const cmd = quote([rg, ...args, target])\n const result = await BunShell.getInstance().exec(cmd, abortSignal, 10_000, {\n sandbox: options.sandbox,\n })\n if (result.code === 1) return []\n if (result.code !== 0) {\n logError(`ripgrep failed with exit code ${result.code}: ${result.stderr}`)\n return []\n }\n return result.stdout.trim().split('\\n').filter(Boolean)\n }\n\n return new Promise(resolve => {\n execFile(\n getRipgrepPath(),\n [...args, target],\n {\n maxBuffer: 1_000_000,\n signal: abortSignal,\n timeout: 10_000,\n },\n (error, stdout) => {\n if (error) {\n // Exit code 1 from ripgrep means \"no matches found\" - this is normal\n if (error.code !== 1) {\n d('ripgrep error: %o', error)\n logError(error)\n }\n resolve([])\n } else {\n d('ripgrep succeeded with %s', stdout)\n resolve(stdout.trim().split('\\n').filter(Boolean))\n }\n },\n )\n })\n}\n\n// NB: We do something tricky here. We know that ripgrep processes common\n// ignore files for us, so we just ripgrep for any character, which matches\n// all non-empty files\nexport async function listAllContentFiles(\n path: string,\n abortSignal: AbortSignal,\n limit: number,\n): Promise<string[]> {\n try {\n d('listAllContentFiles called: %s', path)\n return (await ripGrep(['-l', '.', path], path, abortSignal)).slice(0, limit)\n } catch (e) {\n d('listAllContentFiles failed: %o', e)\n\n logError(e)\n return []\n }\n}\n\nlet alreadyDoneSignCheck = false\nasync function codesignRipgrepIfNecessary() {\n if (process.platform !== 'darwin' || alreadyDoneSignCheck) {\n return\n }\n\n alreadyDoneSignCheck = true\n\n // First, check to see if ripgrep is already signed\n d('checking if ripgrep is already signed')\n const lines = (\n await execFileNoThrow(\n 'codesign',\n ['-vv', '-d', getRipgrepPath()],\n undefined,\n undefined,\n false,\n )\n ).stdout.split('\\n')\n\n const needsSigned = lines.find(line => line.includes('linker-signed'))\n if (!needsSigned) {\n d('seems to be already signed')\n return\n }\n\n try {\n d('signing ripgrep')\n const signResult = await execFileNoThrow('codesign', [\n '--sign',\n '-',\n '--force',\n '--preserve-metadata=entitlements,requirements,flags,runtime',\n getRipgrepPath(),\n ])\n\n if (signResult.code !== 0) {\n d('failed to sign ripgrep: %o', signResult)\n logError(\n `Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`,\n )\n }\n\n d('removing quarantine')\n const quarantineResult = await execFileNoThrow('xattr', [\n '-d',\n 'com.apple.quarantine',\n getRipgrepPath(),\n ])\n\n if (quarantineResult.code !== 0) {\n d('failed to remove quarantine: %o', quarantineResult)\n logError(\n `Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`,\n )\n }\n } catch (e) {\n d('failed during sign: %o', e)\n logError(e)\n }\n}\n\n// Test helper: clear memoized path resolution and re-run any one-time checks.\nexport function resetRipgrepPathCacheForTests(): void {\n clearMemoizeCache(getRipgrepPath)\n alreadyDoneSignCheck = false\n}\n", "import { existsSync } from 'fs'\nimport { stat as statAsync } from 'fs/promises'\nimport { resolve } from 'path'\nimport { glob as globLib } from 'glob'\nimport { BunSearcher } from '#runtime/searcher'\n\nimport { logError } from '../log'\n\nexport async function glob(\n filePattern: string,\n cwd: string,\n { limit, offset }: { limit: number; offset: number },\n abortSignal: AbortSignal,\n): Promise<{ files: string[]; truncated: boolean }> {\n try {\n // Try fast globbing first (previously Bun globbing)\n const allFiles = await BunSearcher.glob(\n filePattern,\n cwd,\n limit + offset + 100,\n )\n\n // Sort by modification time (newest first for relevance)\n const resolvedFiles = allFiles\n .map(f => resolve(cwd, f))\n .filter(f => existsSync(f))\n const stats = await Promise.all(\n resolvedFiles.map(async file => {\n try {\n return await statAsync(file)\n } catch {\n return null\n }\n }),\n )\n const sortedFiles = resolvedFiles\n .map((file, i) => [file, stats[i]] as const)\n .filter(([, stat]) => stat !== null)\n .sort((a, b) => {\n const timeComparison = (b[1]!.mtimeMs ?? 0) - (a[1]!.mtimeMs ?? 0)\n if (timeComparison !== 0) return timeComparison\n return a[0].localeCompare(b[0])\n })\n .map(([file]) => file)\n\n const truncated = sortedFiles.length > offset + limit\n return {\n files: sortedFiles.slice(offset, offset + limit),\n truncated,\n }\n } catch (error) {\n // Fallback to glob library if the primary matcher fails\n logError(`BunSearcher failed, falling back to glob: ${error}`)\n const paths = await globLib([filePattern], {\n cwd,\n nocase: true,\n nodir: true,\n signal: abortSignal,\n stat: true,\n withFileTypes: true,\n })\n const sortedPaths = paths.sort(\n (a, b) => (b.mtimeMs ?? 0) - (a.mtimeMs ?? 0),\n )\n const truncated = sortedPaths.length > offset + limit\n return {\n files: sortedPaths\n .slice(offset, offset + limit)\n .map(path => path.fullpath()),\n truncated,\n }\n }\n}\n", "import { stat } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport { glob } from 'glob'\n\nconst d = (msg: string) => {\n if (process.env.DEBUG?.includes('kode:search')) {\n process.stderr.write(`[search] ${msg}\\n`)\n }\n}\n\nfunction logError(message: string): void {\n if (process.env.NODE_ENV === 'test') {\n console.error(message)\n }\n}\n\n/**\n * BunSearcher - Layered search using glob first, then fallback\n *\n * Strategy:\n * 1. Fast: Try glob for pattern matching\n * 2. Powerful: Fall back to ripgrep if glob fails or is insufficient\n * 3. Robust: Handle both file pattern matching and content searching\n */\nexport class BunSearcher {\n /**\n * Search for files matching a glob pattern\n */\n static async glob(\n pattern: string,\n cwd: string = process.cwd(),\n limit: number = 1000,\n ): Promise<string[]> {\n try {\n d(`glob: pattern=\"${pattern}\" cwd=\"${cwd}\" limit=${limit}`)\n const results = await glob(pattern, {\n cwd,\n nodir: true,\n withFileTypes: false,\n })\n return results.slice(0, limit)\n } catch (error) {\n d(\n `glob failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n logError(`BunSearcher.glob error: ${error}`)\n return []\n }\n }\n\n /**\n * List all files in a directory (non-empty files)\n * Uses glob to scan directory structure\n */\n static async listFiles(dir: string, limit: number = 1000): Promise<string[]> {\n try {\n d(`listFiles: dir=\"${dir}\" limit=${limit}`)\n // Scan all files recursively\n return await this.glob('**/*', dir, limit)\n } catch (error) {\n d(\n `listFiles failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n logError(`BunSearcher.listFiles error: ${error}`)\n return []\n }\n }\n\n /**\n * Filter glob results by file existence and properties\n */\n static async filterFiles(\n files: string[],\n cwd: string,\n filter?: (stats: { isFile: boolean; size: number }) => boolean,\n ): Promise<string[]> {\n const results: string[] = []\n\n for (const file of files) {\n try {\n const fullPath = resolve(cwd, file)\n const stats = await stat(fullPath)\n\n // Apply filter if provided\n if (filter && !filter({ isFile: stats.isFile(), size: stats.size })) {\n continue\n }\n\n results.push(file)\n } catch (error) {\n d(\n `filterFiles stat error for ${file}: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n return results\n }\n}\n", "import { readTextContent } from './file'\nimport { fileFreshnessService } from '#core/services/fileFreshness'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\n/**\n * File recovery configuration for auto-compact feature\n * These limits ensure recovered files don't overwhelm the compressed context\n */\nconst MAX_FILES_TO_RECOVER = 5\nconst MAX_TOKENS_PER_FILE = 10_000\nconst MAX_TOTAL_FILE_TOKENS = 50_000\n\n/**\n * Selects and reads recently accessed files for context recovery\n *\n * During auto-compact, this function preserves development context by:\n * - Selecting files based on recent access patterns\n * - Enforcing token budgets to prevent context bloat\n * - Truncating large files while preserving essential content\n *\n * @returns Array of file data with content, token counts, and truncation flags\n */\nexport async function selectAndReadFiles(): Promise<\n Array<{\n path: string\n content: string\n tokens: number\n truncated: boolean\n }>\n> {\n const importantFiles =\n fileFreshnessService.getImportantFiles(MAX_FILES_TO_RECOVER)\n const results = []\n let totalTokens = 0\n\n for (const fileInfo of importantFiles) {\n try {\n const { content } = readTextContent(fileInfo.path)\n const estimatedTokens = Math.ceil(content.length * 0.25)\n\n // Apply per-file token limit to prevent any single file from dominating context\n let finalContent = content\n let truncated = false\n\n if (estimatedTokens > MAX_TOKENS_PER_FILE) {\n const maxChars = Math.floor(MAX_TOKENS_PER_FILE / 0.25)\n finalContent = content.substring(0, maxChars)\n truncated = true\n }\n\n const finalTokens = Math.min(estimatedTokens, MAX_TOKENS_PER_FILE)\n\n // Enforce total token budget to maintain auto-compact effectiveness\n if (totalTokens + finalTokens > MAX_TOTAL_FILE_TOKENS) {\n break\n }\n\n totalTokens += finalTokens\n results.push({\n path: fileInfo.path,\n content: finalContent,\n tokens: finalTokens,\n truncated,\n })\n } catch (error) {\n // Skip files that cannot be read, don't let one failure stop the process\n logError(error)\n debugLogger.warn('FILE_RECOVERY_READ_FAILED', {\n path: fileInfo.path,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n return results\n}\n", "/**\n * Auto-compact triggers when token usage reaches this ratio of the context window.\n * Default: 90% of the context window.\n */\nexport const AUTO_COMPACT_THRESHOLD_RATIO = 0.9\n\nexport function calculateAutoCompactThresholds(\n tokenCount: number,\n contextLimit: number,\n ratio: number = AUTO_COMPACT_THRESHOLD_RATIO,\n): {\n isAboveAutoCompactThreshold: boolean\n percentUsed: number\n tokensRemaining: number\n contextLimit: number\n autoCompactThreshold: number\n ratio: number\n} {\n const safeContextLimit =\n Number.isFinite(contextLimit) && contextLimit > 0 ? contextLimit : 1\n const autoCompactThreshold = safeContextLimit * ratio\n\n return {\n isAboveAutoCompactThreshold: tokenCount >= autoCompactThreshold,\n percentUsed: Math.round((tokenCount / safeContextLimit) * 100),\n tokensRemaining: Math.max(0, autoCompactThreshold - tokenCount),\n contextLimit: safeContextLimit,\n autoCompactThreshold,\n ratio,\n }\n}\n", "import { Message } from '#core/query'\nimport { countTokens } from './tokens'\nimport { getMessagesGetter, getMessagesSetter } from '#core/messages'\nimport { getContext } from '#core/context'\nimport { getCodeStyle } from '#core/utils/style'\nimport { resetFileFreshnessSession } from '#core/services/fileFreshness'\nimport {\n createUserMessage,\n normalizeMessagesForAPI,\n} from '#core/utils/messages'\nimport { queryLLM } from '#core/ai/llmLazy'\nimport { selectAndReadFiles } from './fileRecoveryCore'\nimport { addLineNumbers } from './file'\nimport { getModelManager } from './model'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\nimport {\n AUTO_COMPACT_THRESHOLD_RATIO,\n calculateAutoCompactThresholds,\n} from './autoCompactThreshold'\n\n/**\n * Retrieves the context length for the current main conversation model.\n */\nasync function getMainConversationContextLimit(): Promise<number> {\n try {\n const modelManager = getModelManager()\n const resolution = modelManager.resolveModelWithInfo('main')\n const modelProfile = resolution.success ? resolution.profile : null\n\n if (modelProfile?.contextLength) {\n return modelProfile.contextLength\n }\n\n // Fallback to a reasonable default\n return 200_000\n } catch (error) {\n return 200_000\n }\n}\n\nconst COMPRESSION_PROMPT = `Please provide a comprehensive summary of our conversation structured as follows:\n\n## Technical Context\nDevelopment environment, tools, frameworks, and configurations in use. Programming languages, libraries, and technical constraints. File structure, directory organization, and project architecture.\n\n## Project Overview \nMain project goals, features, and scope. Key components, modules, and their relationships. Data models, APIs, and integration patterns.\n\n## Code Changes\nFiles created, modified, or analyzed during our conversation. Specific code implementations, functions, and algorithms added. Configuration changes and structural modifications.\n\n## Debugging & Issues\nProblems encountered and their root causes. Solutions implemented and their effectiveness. Error messages, logs, and diagnostic information.\n\n## Current Status\nWhat we just completed successfully. Current state of the codebase and any ongoing work. Test results, validation steps, and verification performed.\n\n## Pending Tasks\nImmediate next steps and priorities. Planned features, improvements, and refactoring. Known issues, technical debt, and areas needing attention.\n\n## User Preferences\nCoding style, formatting, and organizational preferences. Communication patterns and feedback style. Tool choices and workflow preferences.\n\n## Key Decisions\nImportant technical decisions made and their rationale. Alternative approaches considered and why they were rejected. Trade-offs accepted and their implications.\n\nFocus on information essential for continuing the conversation effectively, including specific details about code, files, errors, and plans.`\n\n/**\n * Calculates context usage thresholds based on the main model's capabilities\n * Uses the main model context length since compression tasks require a capable model\n */\nasync function calculateThresholds(tokenCount: number) {\n const contextLimit = await getMainConversationContextLimit()\n return calculateAutoCompactThresholds(\n tokenCount,\n contextLimit,\n AUTO_COMPACT_THRESHOLD_RATIO,\n )\n}\n\n/**\n * Determines if auto-compact should trigger based on token usage\n * Uses the main model context limit since compression requires a capable model\n */\nasync function shouldAutoCompact(messages: Message[]): Promise<boolean> {\n if (messages.length < 3) return false\n\n const tokenCount = countTokens(messages)\n const { isAboveAutoCompactThreshold } = await calculateThresholds(tokenCount)\n\n return isAboveAutoCompactThreshold\n}\n\n/**\n * Main entry point for automatic context compression\n *\n * This function is called before each query to check if the conversation\n * has grown too large and needs compression. When triggered, it:\n * - Generates a structured summary of the conversation using the main model\n * - Recovers recently accessed files to maintain development context\n * - Resets conversation state while preserving essential information\n *\n * Uses the main model for compression tasks to ensure high-quality summaries\n *\n * @param messages Current conversation messages\n * @param toolUseContext Execution context with model and tool configuration\n * @returns Updated messages (compressed if needed) and compression status\n */\nexport async function checkAutoCompact(\n messages: Message[],\n toolUseContext: any,\n): Promise<{ messages: Message[]; wasCompacted: boolean }> {\n if (!(await shouldAutoCompact(messages))) {\n return { messages, wasCompacted: false }\n }\n\n try {\n const compactedMessages = await executeAutoCompact(messages, toolUseContext)\n\n return {\n messages: compactedMessages,\n wasCompacted: true,\n }\n } catch (error) {\n // Graceful degradation: if auto-compact fails, continue with original messages\n // This ensures system remains functional even if compression encounters issues\n logError(error)\n debugLogger.warn('AUTO_COMPACT_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return { messages, wasCompacted: false }\n }\n}\n\n/**\n * Executes the conversation compression process using the main model\n *\n * This function generates a comprehensive summary using the main model\n * which is better suited for complex summarization tasks. It also\n * automatically recovers important files to maintain development context.\n */\nasync function executeAutoCompact(\n messages: Message[],\n toolUseContext: any,\n): Promise<Message[]> {\n const summaryRequest = createUserMessage(COMPRESSION_PROMPT)\n\n const tokenCount = countTokens(messages)\n const modelManager = getModelManager()\n const compactResolution = modelManager.resolveModelWithInfo('compact')\n const mainResolution = modelManager.resolveModelWithInfo('main')\n\n let compressionModelPointer: 'compact' | 'main' = 'compact'\n let compressionNotice: string | null = null\n\n if (!compactResolution.success || !compactResolution.profile) {\n compressionModelPointer = 'main'\n compressionNotice =\n compactResolution.error ||\n \"Compression model pointer 'compact' is not configured.\"\n } else {\n const compactBudget = Math.floor(\n compactResolution.profile.contextLength * 0.9,\n )\n if (compactBudget > 0 && tokenCount > compactBudget) {\n compressionModelPointer = 'main'\n compressionNotice = `Compression model '${compactResolution.profile.name}' does not fit current context (~${Math.round(tokenCount / 1000)}k tokens).`\n }\n }\n\n if (\n compressionModelPointer === 'main' &&\n (!mainResolution.success || !mainResolution.profile)\n ) {\n throw new Error(\n mainResolution.error ||\n \"Compression fallback failed: model pointer 'main' is not configured.\",\n )\n }\n\n const summaryResponse = await queryLLM(\n normalizeMessagesForAPI([...messages, summaryRequest]),\n [\n 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',\n ],\n 0,\n [],\n toolUseContext.abortController.signal,\n {\n safeMode: false,\n model: compressionModelPointer,\n prependCLISysprompt: true,\n },\n )\n\n const content = summaryResponse.message.content\n const summary =\n typeof content === 'string'\n ? content\n : content.length > 0 && content[0]?.type === 'text'\n ? content[0].text\n : null\n\n if (!summary) {\n throw new Error(\n 'Failed to generate conversation summary - response did not contain valid text content',\n )\n }\n\n summaryResponse.message.usage = {\n input_tokens: 0,\n output_tokens: summaryResponse.message.usage.output_tokens,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n }\n\n // Automatic file recovery: preserve recently accessed development files\n // This maintains coding context even after conversation compression\n const recoveredFiles = await selectAndReadFiles()\n\n const compactedMessages = [\n createUserMessage(\n compressionNotice\n ? `Context automatically compressed due to token limit. ${compressionNotice} Using '${compressionModelPointer}' for compression.`\n : `Context automatically compressed due to token limit. Using '${compressionModelPointer}' for compression.`,\n ),\n summaryResponse,\n ]\n\n // Append recovered files to maintain development workflow continuity\n // Files are prioritized by recency and importance, with strict token limits\n if (recoveredFiles.length > 0) {\n for (const file of recoveredFiles) {\n const contentWithLines = addLineNumbers({\n content: file.content,\n startLine: 1,\n })\n const recoveryMessage = createUserMessage(\n `**Recovered File: ${file.path}**\\n\\n\\`\\`\\`\\n${contentWithLines}\\n\\`\\`\\`\\n\\n` +\n `*Automatically recovered (${file.tokens} tokens)${file.truncated ? ' [truncated]' : ''}*`,\n )\n compactedMessages.push(recoveryMessage)\n }\n }\n\n // State cleanup to ensure fresh context after compression\n // Mirrors the cleanup sequence from manual /compact command\n getMessagesSetter()([])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetFileFreshnessSession()\n\n return compactedMessages\n}\n", "import type {\n TextBlock,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { AssistantMessage, BinaryFeedbackResult } from '#core/query'\nimport { MAIN_QUERY_TEMPERATURE } from '#core/ai/constants'\n\nimport { isEqual, zip } from 'lodash-es'\nimport { getGitState } from '#core/utils/git'\n\nexport type BinaryFeedbackChoice =\n | 'prefer-left'\n | 'prefer-right'\n | 'neither'\n | 'no-preference'\n\nexport type BinaryFeedbackChoose = (choice: BinaryFeedbackChoice) => void\n\ntype BinaryFeedbackConfig = {\n sampleFrequency: number\n}\n\nasync function getBinaryFeedbackConfig(): Promise<BinaryFeedbackConfig> {\n return { sampleFrequency: 0 }\n}\n\nfunction getMessageBlockSequence(m: AssistantMessage) {\n return m.message.content.map(cb => {\n if (cb.type === 'text') return 'text'\n if (cb.type === 'tool_use') return cb.name\n return cb.type // Handle other block types like 'thinking' or 'redacted_thinking'\n })\n}\n\n// Logging removed to minimize runtime surface area; behavior unaffected\n\nfunction textContentBlocksEqual(cb1: TextBlock, cb2: TextBlock): boolean {\n return cb1.text === cb2.text\n}\n\nfunction contentBlocksEqual(\n cb1: TextBlock | ToolUseBlock,\n cb2: TextBlock | ToolUseBlock,\n): boolean {\n if (cb1.type !== cb2.type) {\n return false\n }\n if (cb1.type === 'text') {\n return textContentBlocksEqual(cb1, cb2 as TextBlock)\n }\n cb2 = cb2 as ToolUseBlock\n return cb1.name === cb2.name && isEqual(cb1.input, cb2.input)\n}\n\nfunction allContentBlocksEqual(\n content1: (TextBlock | ToolUseBlock)[],\n content2: (TextBlock | ToolUseBlock)[],\n): boolean {\n if (content1.length !== content2.length) {\n return false\n }\n return zip(content1, content2).every(([cb1, cb2]) =>\n contentBlocksEqual(cb1!, cb2!),\n )\n}\n\nexport async function shouldUseBinaryFeedback(): Promise<boolean> {\n if (process.env.DISABLE_BINARY_FEEDBACK) {\n return false\n }\n if (process.env.FORCE_BINARY_FEEDBACK) {\n return true\n }\n if (process.env.USER_TYPE !== 'ant') {\n return false\n }\n if (process.env.NODE_ENV === 'test') {\n // Binary feedback breaks a couple tests related to checking for permission,\n // so we have to disable it in tests at the risk of hiding bugs\n return false\n }\n\n const config = await getBinaryFeedbackConfig()\n if (config.sampleFrequency === 0) {\n return false\n }\n if (Math.random() > config.sampleFrequency) {\n return false\n }\n return true\n}\n\nexport function messagePairValidForBinaryFeedback(\n m1: AssistantMessage,\n m2: AssistantMessage,\n): boolean {\n const logPass = () => {}\n const logFail = (_reason: string) => {}\n\n // Ignore thinking blocks, on the assumption that users don't find them very relevant\n // compared to other content types\n const nonThinkingBlocks1 = m1.message.content.filter(\n b => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n )\n const nonThinkingBlocks2 = m2.message.content.filter(\n b => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n )\n const hasToolUse =\n nonThinkingBlocks1.some(b => b.type === 'tool_use') ||\n nonThinkingBlocks2.some(b => b.type === 'tool_use')\n\n // If they're all text blocks, compare those\n if (!hasToolUse) {\n if (allContentBlocksEqual(nonThinkingBlocks1, nonThinkingBlocks2)) {\n logFail('contents_identical')\n return false\n }\n logPass()\n return true\n }\n\n // If there are tools, they're the most material difference between the messages.\n // Only show binary feedback if there's a tool use difference, ignoring text.\n if (\n allContentBlocksEqual(\n nonThinkingBlocks1.filter(b => b.type === 'tool_use'),\n nonThinkingBlocks2.filter(b => b.type === 'tool_use'),\n )\n ) {\n logFail('contents_identical')\n return false\n }\n\n logPass()\n return true\n}\n\nexport function getBinaryFeedbackResultForChoice(\n m1: AssistantMessage,\n m2: AssistantMessage,\n choice: BinaryFeedbackChoice,\n): BinaryFeedbackResult {\n switch (choice) {\n case 'prefer-left':\n return { message: m1, shouldSkipPermissionCheck: true }\n case 'prefer-right':\n return { message: m2, shouldSkipPermissionCheck: true }\n case 'no-preference':\n return {\n message: Math.random() < 0.5 ? m1 : m2,\n shouldSkipPermissionCheck: false,\n }\n case 'neither':\n return { message: null, shouldSkipPermissionCheck: false }\n }\n}\n// Keep a minimal exported stub to satisfy imports without side effects\nexport async function logBinaryFeedbackEvent(\n _m1: AssistantMessage,\n _m2: AssistantMessage,\n _choice: BinaryFeedbackChoice,\n): Promise<void> {}\n", "import {\n messagePairValidForBinaryFeedback,\n shouldUseBinaryFeedback,\n} from '#core/feedback/binaryFeedback'\n\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n ExtendedToolUseContext,\n} from './message-pipeline'\n\n// Returns a message if we got one, or `null` if the user cancelled.\nexport async function queryWithBinaryFeedback(\n toolUseContext: ExtendedToolUseContext,\n getAssistantResponse: () => Promise<AssistantMessage>,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): Promise<BinaryFeedbackResult> {\n if (\n process.env.USER_TYPE !== 'ant' ||\n !getBinaryFeedbackResponse ||\n !(await shouldUseBinaryFeedback())\n ) {\n const assistantMessage = await getAssistantResponse()\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n return { message: assistantMessage, shouldSkipPermissionCheck: false }\n }\n\n const [m1, m2] = await Promise.all([\n getAssistantResponse(),\n getAssistantResponse(),\n ])\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n if (m2.isApiErrorMessage) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n if (m1.isApiErrorMessage) {\n return { message: m2, shouldSkipPermissionCheck: false }\n }\n if (!messagePairValidForBinaryFeedback(m1, m2)) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n\n return await getBinaryFeedbackResponse(m1, m2)\n}\n", "export type ToolNameAliasResolution = {\n originalName: string\n resolvedName: string\n wasAliased: boolean\n}\n\n/**\n * Resolve reference CLI tool aliases to their canonical tool names.\n *\n * The reference CLI v2.0.75 unifies AgentOutputTool and BashOutputTool into TaskOutput\n * (with aliases). Kode keeps backward compatibility by resolving the alias names.\n */\nexport function resolveToolNameAlias(name: string): ToolNameAliasResolution {\n const originalName = name\n\n const resolvedName =\n name === 'AgentOutputTool'\n ? 'TaskOutput'\n : name === 'BashOutputTool'\n ? 'TaskOutput'\n : name === 'BashOutput'\n ? 'TaskOutput'\n : name === 'TaskOutputTool'\n ? 'TaskOutput'\n : name\n\n return {\n originalName,\n resolvedName,\n wasAliased: resolvedName !== originalName,\n }\n}\n", "import type { Tool } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\n\nexport function normalizeToolInput(\n tool: Tool,\n input: Record<string, unknown>,\n): Record<string, unknown> {\n if (tool.name === 'Bash') {\n const parsed = tool.inputSchema.parse(input) as {\n command: unknown\n timeout?: unknown\n description?: unknown\n run_in_background?: unknown\n dangerouslyDisableSandbox?: unknown\n } // already validated upstream, won't throw\n const command = parsed.command\n const timeout = parsed.timeout\n const description = parsed.description\n const run_in_background = parsed.run_in_background\n const dangerouslyDisableSandbox = parsed.dangerouslyDisableSandbox\n return {\n command: String(command)\n .replace(`cd ${getCwd()} && `, '')\n .replace(/\\\\\\\\;/g, '\\\\;'),\n ...(typeof timeout === 'number' ? { timeout } : {}),\n ...(typeof description === 'string' && description\n ? { description }\n : {}),\n ...(typeof run_in_background === 'boolean' && run_in_background\n ? { run_in_background }\n : {}),\n ...(typeof dangerouslyDisableSandbox === 'boolean' &&\n dangerouslyDisableSandbox\n ? { dangerouslyDisableSandbox }\n : {}),\n }\n }\n\n return input\n}\n\nexport function preprocessToolInput(\n tool: Tool,\n input: Record<string, unknown>,\n): Record<string, unknown> {\n if (tool.name === 'TaskOutput') {\n const task_id =\n (typeof input.task_id === 'string' && input.task_id) ||\n (typeof input.agentId === 'string' && input.agentId) ||\n (typeof input.bash_id === 'string' && input.bash_id) ||\n ''\n\n const block = typeof input.block === 'boolean' ? input.block : true\n\n const timeout =\n typeof input.timeout === 'number'\n ? input.timeout\n : typeof input.wait_up_to === 'number'\n ? input.wait_up_to * 1000\n : undefined\n\n return {\n task_id,\n block,\n ...(timeout !== undefined ? { timeout } : {}),\n }\n }\n\n return input\n}\n", "import type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { Tool, ToolUseContext } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\nimport { logError } from '#core/utils/log'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport {\n createAssistantMessage,\n createProgressMessage,\n createUserMessage,\n} from '#core/utils/messages'\nimport {\n getHookTranscriptPath,\n queueHookAdditionalContexts,\n queueHookSystemMessages,\n runPostToolUseHooks,\n runPreToolUseHooks,\n} from '#core/utils/kodeHooks'\n\nimport type { AssistantMessage, Message } from './types'\nimport { normalizeToolInput, preprocessToolInput } from './tool-input'\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 isPipelineMessage(value: unknown): value is Message {\n const record = asRecord(value)\n if (!record) return false\n return (\n record.type === 'user' ||\n record.type === 'assistant' ||\n record.type === 'progress'\n )\n}\n\nfunction toToolResultContent(value: unknown): ToolResultBlockParam['content'] {\n if (typeof value === 'string') return value\n if (Array.isArray(value)) return value as ToolResultBlockParam['content']\n return String(value)\n}\n\nexport async function* checkPermissionsAndCallTool(\n tool: Tool,\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n input: Record<string, unknown>,\n context: ToolUseContext,\n canUseTool: CanUseToolFn,\n assistantMessage: AssistantMessage,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const preprocessedInput = preprocessToolInput(tool, input)\n const isValidInput = tool.inputSchema.safeParse(preprocessedInput)\n if (!isValidInput.success) {\n let errorMessage = `InputValidationError: ${isValidInput.error.message}`\n\n if (tool.name === 'Read' && Object.keys(preprocessedInput).length === 0) {\n errorMessage =\n 'Error: The Read tool requires a \\'file_path\\' parameter to specify which file to read. Please provide the absolute path to the file you want to read. For example: {\"file_path\": \"/path/to/file.txt\"}'\n }\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: errorMessage,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n let normalizedInput = normalizeToolInput(tool, isValidInput.data)\n\n const isValidCall = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidCall?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidCall.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const hookOutcome = await runPreToolUseHooks({\n toolName: tool.name,\n toolInput: normalizedInput,\n toolUseId: toolUseID,\n permissionMode: context.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(context),\n safeMode: context.options?.safeMode ?? false,\n signal: context.abortController.signal,\n })\n if (hookOutcome.kind === 'block') {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: hookOutcome.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n if (hookOutcome.warnings.length > 0) {\n const warningText = hookOutcome.warnings.join('\\n')\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n createAssistantMessage(warningText),\n [],\n context.options?.tools ?? [],\n )\n }\n\n if (hookOutcome.systemMessages && hookOutcome.systemMessages.length > 0) {\n queueHookSystemMessages(context, hookOutcome.systemMessages)\n }\n if (\n hookOutcome.additionalContexts &&\n hookOutcome.additionalContexts.length > 0\n ) {\n queueHookAdditionalContexts(context, hookOutcome.additionalContexts)\n }\n\n if (hookOutcome.updatedInput) {\n const merged = { ...normalizedInput, ...hookOutcome.updatedInput }\n const parsed = tool.inputSchema.safeParse(merged)\n if (!parsed.success) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Hook updatedInput failed validation: ${parsed.error.message}`,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n normalizedInput = normalizeToolInput(tool, parsed.data)\n const isValidUpdate = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidUpdate?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidUpdate.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n }\n\n const hookPermissionDecision =\n hookOutcome.kind === 'allow' ? hookOutcome.permissionDecision : undefined\n\n const effectiveShouldSkipPermissionCheck =\n hookPermissionDecision === 'allow'\n ? true\n : hookPermissionDecision === 'ask'\n ? false\n : shouldSkipPermissionCheck\n\n const permissionContextForCall =\n hookPermissionDecision === 'ask' &&\n context.options?.toolPermissionContext &&\n context.options.toolPermissionContext.mode !== 'default'\n ? ({\n ...context,\n options: {\n ...context.options,\n toolPermissionContext: {\n ...context.options.toolPermissionContext,\n mode: 'default',\n },\n },\n } as const)\n : context\n\n const permissionResult = effectiveShouldSkipPermissionCheck\n ? ({ result: true } as const)\n : await canUseTool(\n tool,\n normalizedInput,\n { ...permissionContextForCall, toolUseId: toolUseID },\n assistantMessage,\n )\n\n if (permissionResult.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: permissionResult.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n try {\n const generator = tool.call(normalizedInput as never, {\n ...context,\n toolUseId: toolUseID,\n })\n\n for await (const result of generator) {\n switch (result.type) {\n case 'result': {\n const rawContent =\n result.resultForAssistant ??\n tool.renderResultForAssistant(result.data as never)\n const content = toToolResultContent(rawContent)\n const newMessages = Array.isArray(result.newMessages)\n ? result.newMessages.filter(isPipelineMessage)\n : []\n\n const postOutcome = await runPostToolUseHooks({\n toolName: tool.name,\n toolInput: normalizedInput,\n toolResult: result.data,\n toolUseId: toolUseID,\n permissionMode: context.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(context),\n safeMode: context.options?.safeMode ?? false,\n signal: context.abortController.signal,\n })\n\n if (postOutcome.systemMessages.length > 0) {\n queueHookSystemMessages(context, postOutcome.systemMessages)\n }\n if (postOutcome.additionalContexts.length > 0) {\n queueHookAdditionalContexts(context, postOutcome.additionalContexts)\n }\n if (postOutcome.warnings.length > 0) {\n const warningText = postOutcome.warnings.join('\\n')\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n createAssistantMessage(warningText),\n [],\n context.options?.tools ?? [],\n )\n }\n\n yield createUserMessage(\n [\n {\n type: 'tool_result',\n content,\n tool_use_id: toolUseID,\n },\n ],\n {\n data: result.data,\n resultForAssistant: content,\n ...(newMessages.length > 0 ? { newMessages } : {}),\n ...(result.contextModifier\n ? { contextModifier: result.contextModifier }\n : {}),\n },\n )\n\n for (const message of newMessages) {\n yield message\n }\n\n return\n }\n case 'progress':\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n result.content,\n result.normalizedMessages || [],\n result.tools || [],\n )\n break\n }\n }\n } catch (error) {\n const content = formatError(error)\n logError(error)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n }\n}\n\nfunction formatError(error: unknown): string {\n if (!(error instanceof Error)) return String(error)\n\n const parts = [error.message]\n if ('stderr' in error && typeof error.stderr === 'string') {\n parts.push(error.stderr)\n }\n if ('stdout' in error && typeof error.stdout === 'string') {\n parts.push(error.stdout)\n }\n\n const fullMessage = parts.filter(Boolean).join('\\n')\n if (fullMessage.length <= 10000) return fullMessage\n\n const halfLength = 5000\n const start = fullMessage.slice(0, halfLength)\n const end = fullMessage.slice(-halfLength)\n return `${start}\\n\\n... [${fullMessage.length - 10000} characters truncated] ...\\n\\n${end}`\n}\n", "import type { ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport { logError } from '#core/utils/log'\nimport { createUserMessage } from '#core/utils/messages'\nimport {\n debug as debugLogger,\n getCurrentRequest,\n logUserFriendly,\n} from '#core/utils/debugLogger'\nimport { resolveToolNameAlias } from '#core/utils/toolNameAliases'\nimport { setRequestStatus } from '#core/utils/requestStatus'\n\nimport type { AssistantMessage, ExtendedToolUseContext, Message } from './types'\nimport { checkPermissionsAndCallTool } from './tool-call'\n\nexport async function* runToolUse(\n toolUse: ToolUseBlock,\n siblingToolUseIDs: Set<string>,\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const currentRequest = getCurrentRequest()\n const aliasResolution = resolveToolNameAlias(toolUse.name)\n setRequestStatus({ kind: 'tool', detail: aliasResolution.resolvedName })\n\n debugLogger.flow('TOOL_USE_START', {\n toolName: toolUse.name,\n toolUseID: toolUse.id,\n inputSize: JSON.stringify(toolUse.input).length,\n siblingToolCount: siblingToolUseIDs.size,\n shouldSkipPermissionCheck: Boolean(shouldSkipPermissionCheck),\n requestId: currentRequest?.id,\n })\n\n logUserFriendly(\n 'TOOL_EXECUTION',\n {\n toolName: toolUse.name,\n action: 'Starting',\n target: toolUse.input ? Object.keys(toolUse.input).join(', ') : '',\n },\n currentRequest?.id,\n )\n\n const toolName = aliasResolution.resolvedName\n const tool = toolUseContext.options.tools.find(t => t.name === toolName)\n if (!tool) {\n debugLogger.error('TOOL_NOT_FOUND', {\n requestedTool: toolName,\n availableTools: toolUseContext.options.tools.map(t => t.name),\n toolUseID: toolUse.id,\n requestId: currentRequest?.id,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: No such tool available: ${toolName}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n return\n }\n\n const toolInput = toolUse.input as Record<string, unknown>\n\n debugLogger.flow('TOOL_VALIDATION_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n inputKeys: Object.keys(toolInput),\n requestId: currentRequest?.id,\n })\n\n try {\n for await (const message of checkPermissionsAndCallTool(\n tool,\n toolUse.id,\n siblingToolUseIDs,\n toolInput,\n toolUseContext as ToolUseContext,\n canUseTool,\n assistantMessage,\n shouldSkipPermissionCheck,\n )) {\n yield message\n }\n } catch (e) {\n logError(e)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Tool execution failed: ${e instanceof Error ? e.message : String(e)}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n }\n}\n", "import type { ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { Tool } from '#core/tooling/Tool'\nimport { resolveToolNameAlias } from '#core/utils/toolNameAliases'\nimport {\n createAssistantMessage,\n createProgressMessage,\n createUserMessage,\n REJECT_MESSAGE,\n} from '#core/utils/messages'\n\nimport type {\n AssistantMessage,\n ExtendedToolUseContext,\n Message,\n ProgressMessage,\n UserMessage,\n} from './types'\nimport { runToolUse } from './tool-use'\n\ntype ToolQueueEntry = {\n id: string\n block: ToolUseBlock\n assistantMessage: AssistantMessage\n status: 'queued' | 'executing' | 'completed' | 'yielded'\n isConcurrencySafe: boolean\n pendingProgress: ProgressMessage[]\n queuedProgressEmitted?: boolean\n results?: (UserMessage | AssistantMessage)[]\n contextModifiers?: Array<\n (ctx: ExtendedToolUseContext) => ExtendedToolUseContext\n >\n promise?: Promise<void>\n}\n\nfunction createSyntheticToolUseErrorMessage(\n toolUseId: string,\n reason: 'user_interrupted' | 'sibling_error',\n): UserMessage {\n if (reason === 'user_interrupted') {\n return createUserMessage([\n {\n type: 'tool_result',\n content: REJECT_MESSAGE,\n is_error: true,\n tool_use_id: toolUseId,\n },\n ])\n }\n\n return createUserMessage([\n {\n type: 'tool_result',\n content: '<tool_use_error>Sibling tool call errored</tool_use_error>',\n is_error: true,\n tool_use_id: toolUseId,\n },\n ])\n}\n\nexport class ToolUseQueue {\n private readonly toolDefinitions: Tool[]\n private readonly canUseTool: CanUseToolFn\n private readonly tools: ToolQueueEntry[] = []\n private toolUseContext: ExtendedToolUseContext\n private hasErrored = false\n private progressAvailableResolve: (() => void) | undefined\n private readonly siblingToolUseIDs: Set<string>\n private readonly shouldSkipPermissionCheck?: boolean\n\n constructor(options: {\n toolDefinitions: Tool[]\n canUseTool: CanUseToolFn\n toolUseContext: ExtendedToolUseContext\n siblingToolUseIDs: Set<string>\n shouldSkipPermissionCheck?: boolean\n }) {\n this.toolDefinitions = options.toolDefinitions\n this.canUseTool = options.canUseTool\n this.toolUseContext = options.toolUseContext\n this.siblingToolUseIDs = options.siblingToolUseIDs\n this.shouldSkipPermissionCheck = options.shouldSkipPermissionCheck\n }\n\n addTool(toolUse: ToolUseBlock, assistantMessage: AssistantMessage) {\n const resolvedToolName = resolveToolNameAlias(toolUse.name).resolvedName\n const toolDefinition = this.toolDefinitions.find(\n t => t.name === resolvedToolName,\n )\n const parsedInput = toolDefinition?.inputSchema.safeParse(toolUse.input)\n const isConcurrencySafe =\n toolDefinition && parsedInput?.success\n ? toolDefinition.isConcurrencySafe(parsedInput.data)\n : false\n\n this.tools.push({\n id: toolUse.id,\n block: toolUse,\n assistantMessage,\n status: 'queued',\n isConcurrencySafe,\n pendingProgress: [],\n queuedProgressEmitted: false,\n })\n\n void this.processQueue()\n }\n\n private canExecuteTool(isConcurrencySafe: boolean) {\n const executing = this.tools.filter(t => t.status === 'executing')\n return (\n executing.length === 0 ||\n (isConcurrencySafe && executing.every(t => t.isConcurrencySafe))\n )\n }\n\n private async processQueue() {\n for (const entry of this.tools) {\n if (entry.status !== 'queued') continue\n\n if (this.canExecuteTool(entry.isConcurrencySafe)) {\n await this.executeTool(entry)\n } else {\n // Reference CLI parity: show a queued \"Waiting\u2026\" line for blocked tool calls.\n if (!entry.queuedProgressEmitted) {\n entry.queuedProgressEmitted = true\n entry.pendingProgress.push(\n createProgressMessage(\n entry.id,\n this.siblingToolUseIDs,\n createAssistantMessage('<tool-progress>Waiting\u2026</tool-progress>'),\n [],\n this.toolUseContext.options.tools,\n ),\n )\n if (this.progressAvailableResolve) {\n this.progressAvailableResolve()\n this.progressAvailableResolve = undefined\n }\n }\n\n if (!entry.isConcurrencySafe) {\n break\n }\n }\n }\n }\n\n private getAbortReason(): 'sibling_error' | 'user_interrupted' | null {\n if (this.hasErrored) return 'sibling_error'\n if (this.toolUseContext.abortController.signal.aborted)\n return 'user_interrupted'\n return null\n }\n\n private async executeTool(entry: ToolQueueEntry) {\n entry.status = 'executing'\n\n const results: (UserMessage | AssistantMessage)[] = []\n const contextModifiers: Array<\n (ctx: ExtendedToolUseContext) => ExtendedToolUseContext\n > = []\n\n const promise = (async () => {\n const abortReason = this.getAbortReason()\n if (abortReason) {\n results.push(createSyntheticToolUseErrorMessage(entry.id, abortReason))\n entry.results = results\n entry.contextModifiers = contextModifiers\n entry.status = 'completed'\n return\n }\n\n const generator = runToolUse(\n entry.block,\n this.siblingToolUseIDs,\n entry.assistantMessage,\n this.canUseTool,\n this.toolUseContext,\n this.shouldSkipPermissionCheck,\n )\n\n let toolErrored = false\n\n for await (const message of generator) {\n const reason = this.getAbortReason()\n if (reason && !toolErrored) {\n results.push(createSyntheticToolUseErrorMessage(entry.id, reason))\n break\n }\n\n if (\n message.type === 'user' &&\n Array.isArray(message.message.content) &&\n message.message.content.some(\n block => block.type === 'tool_result' && block.is_error === true,\n )\n ) {\n this.hasErrored = true\n toolErrored = true\n }\n\n if (message.type === 'progress') {\n entry.pendingProgress.push(message)\n if (this.progressAvailableResolve) {\n this.progressAvailableResolve()\n this.progressAvailableResolve = undefined\n }\n } else {\n results.push(message)\n\n if (\n message.type === 'user' &&\n message.toolUseResult?.contextModifier\n ) {\n contextModifiers.push(\n message.toolUseResult.contextModifier.modifyContext,\n )\n }\n }\n }\n\n entry.results = results\n entry.contextModifiers = contextModifiers\n entry.status = 'completed'\n\n if (!entry.isConcurrencySafe && contextModifiers.length > 0) {\n for (const modifyContext of contextModifiers) {\n this.toolUseContext = modifyContext(this.toolUseContext)\n }\n }\n })()\n\n entry.promise = promise\n promise.finally(() => {\n void this.processQueue()\n })\n }\n\n private *getCompletedResults(): Generator<Message, void> {\n let barrierExecuting = false\n for (const entry of this.tools) {\n while (entry.pendingProgress.length > 0) {\n yield entry.pendingProgress.shift()!\n }\n\n if (entry.status === 'yielded') continue\n\n // Reference CLI parity: non-concurrency-safe tools act as an ordering barrier.\n // Still allow queued progress lines (e.g. \"Waiting\u2026\") to render for later tools.\n if (barrierExecuting) continue\n\n if (entry.status === 'completed' && entry.results) {\n entry.status = 'yielded'\n for (const message of entry.results) {\n yield message\n }\n } else if (entry.status === 'executing' && !entry.isConcurrencySafe) {\n barrierExecuting = true\n }\n }\n }\n\n private hasPendingProgress() {\n return this.tools.some(t => t.pendingProgress.length > 0)\n }\n\n private hasCompletedResults() {\n return this.tools.some(t => t.status === 'completed')\n }\n\n private hasExecutingTools() {\n return this.tools.some(t => t.status === 'executing')\n }\n\n private hasUnfinishedTools() {\n return this.tools.some(t => t.status !== 'yielded')\n }\n\n async *getRemainingResults(): AsyncGenerator<Message, void> {\n while (this.hasUnfinishedTools()) {\n await this.processQueue()\n\n for (const message of this.getCompletedResults()) {\n yield message\n }\n\n if (\n this.hasExecutingTools() &&\n !this.hasCompletedResults() &&\n !this.hasPendingProgress()\n ) {\n const promises = this.tools\n .filter(t => t.status === 'executing' && t.promise)\n .map(t => t.promise!)\n\n const progressPromise = new Promise<void>(resolve => {\n this.progressAvailableResolve = resolve\n })\n\n if (promises.length > 0) {\n await Promise.race([...promises, progressPromise])\n }\n }\n }\n\n for (const message of this.getCompletedResults()) {\n yield message\n }\n }\n\n getUpdatedContext() {\n return this.toolUseContext\n }\n}\n\nexport const __ToolUseQueueForTests = ToolUseQueue\n", "import type {\n Message as APIAssistantMessage,\n MessageParam,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { UUID } from '#core/types/common'\nimport type { Tool, ToolUseContext } from '#core/tooling/Tool'\nimport type { ToolPermissionContext } from '#core/types/toolPermissionContext'\nimport type { FullToolUseResult, NormalizedMessage } from '#core/utils/messages'\n\n// Extended ToolUseContext for query functions.\nexport interface ExtendedToolUseContext extends ToolUseContext {\n abortController: AbortController\n options: {\n commands: any[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n mcpClients?: any[]\n verbose: boolean\n safeMode: boolean\n maxThinkingTokens: number\n isKodingRequest?: boolean\n lastUserPrompt?: string\n model?: string | import('#config').ModelPointerType\n toolPermissionContext?: ToolPermissionContext\n /**\n * When true, the current execution context cannot show interactive permission prompts.\n * Any permission decision that would normally prompt should be auto-denied.\n */\n shouldAvoidPermissionPrompts?: boolean\n /**\n * When false, suppress reference CLI-compatible session persistence (.jsonl under config/projects).\n */\n persistSession?: boolean\n /**\n * Optional callback to get custom system prompt additions (e.g., output style).\n * Only called for the main agent.\n */\n getCustomSystemPromptAdditions?: () => string[]\n requestToolUsePermission?: NonNullable<\n ToolUseContext['options']\n >['requestToolUsePermission']\n }\n readFileTimestamps: { [filename: string]: number }\n setToolJSX: (jsx: any) => void\n requestId?: string\n}\n\nexport type Response = { costUSD: number; response: string }\n\nexport type UserMessage = {\n message: MessageParam\n type: 'user'\n uuid: UUID\n toolUseResult?: FullToolUseResult\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n commandName?: string\n commandArgs?: string\n }\n}\n\nexport type AssistantMessage = {\n costUSD: number\n durationMs: number\n message: APIAssistantMessage\n type: 'assistant'\n uuid: UUID\n isApiErrorMessage?: boolean\n requestId?: string\n responseId?: string // For GPT-5 Responses API state management\n}\n\nexport type BinaryFeedbackResult =\n | { message: AssistantMessage | null; shouldSkipPermissionCheck: false }\n | { message: AssistantMessage; shouldSkipPermissionCheck: true }\n\nexport type ProgressMessage = {\n content: AssistantMessage\n normalizedMessages: NormalizedMessage[]\n siblingToolUseIDs: Set<string>\n tools: Tool[]\n toolUseID: string\n type: 'progress'\n uuid: UUID\n}\n\n// Each array item is either a single message or a message-and-response pair\nexport type Message = UserMessage | AssistantMessage | ProgressMessage\n\ntype ToolUseLikeBlock = ToolUseBlock & {\n type: 'tool_use' | 'server_tool_use' | 'mcp_tool_use'\n}\n\nexport function isToolUseLikeBlock(block: any): block is ToolUseLikeBlock {\n return (\n block &&\n typeof block === 'object' &&\n (block.type === 'tool_use' ||\n block.type === 'server_tool_use' ||\n block.type === 'mcp_tool_use')\n )\n}\n\nexport const __isToolUseLikeBlockForTests = isToolUseLikeBlock\n", "import type { AgentEvent } from '#protocol/agentEvent'\nimport { kodeMessageToSdkMessage } from '#protocol/utils/kodeAgentStreamJson'\n\nimport type { Message } from './index'\n\nexport function messageToAgentEvent(\n message: Message,\n sessionId: string,\n): AgentEvent | null {\n return kodeMessageToSdkMessage(\n message as Parameters<typeof kodeMessageToSdkMessage>[0],\n sessionId,\n )\n}\n\nexport async function* messagesToAgentEvents(args: {\n source: AsyncIterable<Message>\n sessionId: string\n}): AsyncGenerator<AgentEvent, void> {\n for await (const message of args.source) {\n const event = messageToAgentEvent(message, args.sessionId)\n if (event) yield event\n }\n}\n", "import type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport { queryLLM } from '#core/ai/llmLazy'\nimport { formatSystemPromptWithContext } from '#core/services/systemPrompt'\nimport { emitReminderEvent } from '#core/services/systemReminder'\nimport { markPhase } from '#core/utils/debugLogger'\nimport {\n createAssistantMessage,\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n normalizeMessagesForAPI,\n} from '#core/utils/messages'\nimport {\n getPlanModeSystemPromptAdditions,\n hydratePlanSlugFromMessages,\n} from '#core/utils/planMode'\nimport { setRequestStatus } from '#core/utils/requestStatus'\nimport {\n BunShell,\n renderBackgroundShellStatusAttachment,\n renderBashNotification,\n} from '#runtime/shell'\nimport { getCwd } from '#core/utils/state'\nimport { checkAutoCompact } from '#core/utils/autoCompactCore'\nimport { asRecord } from '#core/hooks/types'\nimport {\n drainHookSystemPromptAdditions,\n getHookTranscriptPath,\n queueHookAdditionalContexts,\n queueHookSystemMessages,\n runStopHooks,\n runUserPromptSubmitHooks,\n updateHookTranscriptForMessages,\n} from '#core/utils/kodeHooks'\nimport { queryWithBinaryFeedback } from './query-executor'\nimport { ToolUseQueue } from './pipeline/tool-use-queue'\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n ExtendedToolUseContext,\n Message,\n UserMessage,\n} from './pipeline/types'\nimport { isToolUseLikeBlock } from './pipeline/types'\nexport type {\n AssistantMessage,\n BinaryFeedbackResult,\n ExtendedToolUseContext,\n Message,\n ProgressMessage,\n Response,\n UserMessage,\n} from './pipeline/types'\nexport { __isToolUseLikeBlockForTests } from './pipeline/types'\nexport { __ToolUseQueueForTests } from './pipeline/tool-use-queue'\nexport { runToolUse } from './pipeline/tool-use'\nexport { normalizeToolInput } from './pipeline/tool-input'\n\nexport async function* messagePipeline(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): AsyncGenerator<Message, void> {\n yield* messagePipelineCore(\n messages,\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n )\n}\nasync function* messagePipelineCore(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n hookState?: { stopHookActive?: boolean; stopHookAttempts?: number },\n): AsyncGenerator<Message, void> {\n setRequestStatus({ kind: 'thinking' })\n\n try {\n markPhase('QUERY_INIT')\n const stopHookActive = hookState?.stopHookActive === true\n const stopHookAttempts = hookState?.stopHookAttempts ?? 0\n\n // Auto-compact check\n const { messages: processedMessages, wasCompacted } =\n await checkAutoCompact(messages, toolUseContext)\n if (wasCompacted) {\n messages = processedMessages\n }\n\n // Reference CLI parity: bash-notification (Rt1) + background_shell_status attachments.\n // We inject these as synthetic assistant messages so the model can decide when to call TaskOutput.\n if (toolUseContext.agentId === 'main') {\n const shell = BunShell.getInstance()\n\n const notifications = shell.flushBashNotifications()\n for (const notification of notifications) {\n const text = renderBashNotification(notification)\n if (text.trim().length === 0) continue\n const msg = createAssistantMessage(text)\n messages = [...messages, msg]\n yield msg\n }\n\n const attachments = shell.flushBackgroundShellStatusAttachments()\n for (const attachment of attachments) {\n const text = renderBackgroundShellStatusAttachment(attachment)\n if (text.trim().length === 0) continue\n const msg = createAssistantMessage(\n `<tool-progress>${text}</tool-progress>`,\n )\n messages = [...messages, msg]\n yield msg\n }\n }\n\n // Hooks: keep an up-to-date transcript for hook scripts.\n updateHookTranscriptForMessages(toolUseContext, messages)\n\n // Hooks: UserPromptSubmit\n {\n const last = messages[messages.length - 1]\n let userPromptText: string | null = null\n if (last?.type === 'user') {\n const content = last.message.content\n if (typeof content === 'string') {\n userPromptText = content\n } else if (Array.isArray(content)) {\n const hasToolResult = content.some(\n (b: any) => b && typeof b === 'object' && b.type === 'tool_result',\n )\n if (!hasToolResult) {\n userPromptText = content\n .filter(\n (b: any) => b && typeof b === 'object' && b.type === 'text',\n )\n .map((b: any) => String(b.text ?? ''))\n .join('')\n }\n }\n }\n\n if (userPromptText !== null) {\n // Keep a stable copy of the user's last prompt (pre-reminder injection) so\n // tools can do intent-alignment checks against the actual user request.\n toolUseContext.options.lastUserPrompt = userPromptText\n\n const promptOutcome = await runUserPromptSubmitHooks({\n prompt: userPromptText,\n permissionMode: toolUseContext.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(toolUseContext),\n safeMode: toolUseContext.options?.safeMode ?? false,\n signal: toolUseContext.abortController.signal,\n })\n\n queueHookSystemMessages(toolUseContext, promptOutcome.systemMessages)\n queueHookAdditionalContexts(\n toolUseContext,\n promptOutcome.additionalContexts,\n )\n\n if (promptOutcome.decision === 'block') {\n yield createAssistantMessage(promptOutcome.message)\n return\n }\n }\n }\n\n markPhase('SYSTEM_PROMPT_BUILD')\n\n // Best-effort: recover plan slug from previous tool results (for resume flows).\n hydratePlanSlugFromMessages(messages, toolUseContext)\n\n const { systemPrompt: fullSystemPrompt, reminders } =\n formatSystemPromptWithContext(\n systemPrompt,\n context,\n toolUseContext.agentId,\n )\n\n // Default behavior: plan mode reminders are injected as system-level guidance.\n const planModeAdditions = getPlanModeSystemPromptAdditions(\n messages,\n toolUseContext,\n )\n if (planModeAdditions.length > 0) {\n fullSystemPrompt.push(...planModeAdditions)\n }\n\n const hookAdditions = drainHookSystemPromptAdditions(toolUseContext)\n if (hookAdditions.length > 0) {\n fullSystemPrompt.push(...hookAdditions)\n }\n\n // Inject custom system prompt additions (e.g., output style) for main agent\n if (toolUseContext.agentId === 'main') {\n const customAdditions =\n toolUseContext.options.getCustomSystemPromptAdditions?.() ?? []\n if (customAdditions.length > 0) {\n fullSystemPrompt.push(...customAdditions)\n }\n }\n\n // Emit session startup event\n emitReminderEvent('session:startup', {\n agentId: toolUseContext.agentId,\n messages: messages.length,\n timestamp: Date.now(),\n })\n\n // Inject reminders into the latest user message\n if (reminders && messages.length > 0) {\n // Find the last user message\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg?.type === 'user') {\n const lastUserMessage = msg as UserMessage\n messages[i] = {\n ...lastUserMessage,\n message: {\n ...lastUserMessage.message,\n content:\n typeof lastUserMessage.message.content === 'string'\n ? reminders + lastUserMessage.message.content\n : [\n ...(Array.isArray(lastUserMessage.message.content)\n ? lastUserMessage.message.content\n : []),\n { type: 'text', text: reminders },\n ],\n },\n }\n break\n }\n }\n }\n\n markPhase('LLM_PREPARATION')\n\n function getAssistantResponse() {\n return queryLLM(\n normalizeMessagesForAPI(messages),\n fullSystemPrompt,\n toolUseContext.options.maxThinkingTokens,\n toolUseContext.options.tools,\n toolUseContext.abortController.signal,\n {\n safeMode: toolUseContext.options.safeMode ?? false,\n model: toolUseContext.options.model || 'main',\n prependCLISysprompt: true,\n toolUseContext: toolUseContext,\n },\n )\n }\n\n const result = await queryWithBinaryFeedback(\n toolUseContext,\n getAssistantResponse,\n getBinaryFeedbackResponse,\n )\n\n // If request was cancelled, return immediately with interrupt message\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n if (result.message === null) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n const assistantMessage = result.message\n const shouldSkipPermissionCheck = result.shouldSkipPermissionCheck\n\n // @see https://docs.anthropic.com/en/docs/build-with-claude/tool-use\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n const toolUseMessages =\n assistantMessage.message.content.filter(isToolUseLikeBlock)\n\n // If there's no more tool use, we're done\n if (!toolUseMessages.length) {\n const stopHookEvent =\n toolUseContext.agentId && toolUseContext.agentId !== 'main'\n ? ('SubagentStop' as const)\n : ('Stop' as const)\n const record = asRecord(assistantMessage.message)\n const stopReason =\n (record && typeof record.stop_reason === 'string'\n ? record.stop_reason\n : '') ||\n (record && typeof record.stopReason === 'string'\n ? record.stopReason\n : '') ||\n 'end_turn'\n\n const stopOutcome = await runStopHooks({\n hookEvent: stopHookEvent,\n reason: String(stopReason ?? ''),\n agentId: toolUseContext.agentId,\n permissionMode: toolUseContext.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(toolUseContext),\n safeMode: toolUseContext.options?.safeMode ?? false,\n stopHookActive,\n signal: toolUseContext.abortController.signal,\n })\n\n if (stopOutcome.systemMessages.length > 0) {\n queueHookSystemMessages(toolUseContext, stopOutcome.systemMessages)\n }\n if (stopOutcome.additionalContexts.length > 0) {\n queueHookAdditionalContexts(\n toolUseContext,\n stopOutcome.additionalContexts,\n )\n }\n\n if (stopOutcome.decision === 'block') {\n queueHookSystemMessages(toolUseContext, [stopOutcome.message])\n const MAX_STOP_HOOK_ATTEMPTS = 5\n if (stopHookAttempts < MAX_STOP_HOOK_ATTEMPTS) {\n yield* await messagePipelineCore(\n [...messages, assistantMessage],\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n {\n stopHookActive: true,\n stopHookAttempts: stopHookAttempts + 1,\n },\n )\n return\n }\n }\n\n yield assistantMessage\n return\n }\n\n yield assistantMessage\n const siblingToolUseIDs = new Set<string>(toolUseMessages.map(_ => _.id))\n const toolQueue = new ToolUseQueue({\n toolDefinitions: toolUseContext.options.tools,\n canUseTool,\n toolUseContext,\n siblingToolUseIDs,\n shouldSkipPermissionCheck,\n })\n\n for (const toolUse of toolUseMessages) {\n toolQueue.addTool(toolUse, assistantMessage)\n }\n\n const toolMessagesForNextTurn: (UserMessage | AssistantMessage)[] = []\n for await (const message of toolQueue.getRemainingResults()) {\n yield message\n if (message.type !== 'progress') {\n toolMessagesForNextTurn.push(message as UserMessage | AssistantMessage)\n }\n }\n\n toolUseContext = toolQueue.getUpdatedContext()\n\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE_FOR_TOOL_USE)\n return\n }\n\n // Recursive query\n\n try {\n yield* await messagePipelineCore(\n [...messages, assistantMessage, ...toolMessagesForNextTurn],\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n hookState,\n )\n } catch (error) {\n // Re-throw the error to maintain the original behavior\n throw error\n }\n } finally {\n setRequestStatus({ kind: 'idle' })\n }\n}\n\nexport * from '../query/agentEvents'\n", "import type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport { getCwd } from '#core/utils/state'\nimport { appendSessionJsonlFromMessage } from '#protocol/utils/kodeAgentSessionLog'\n\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n Message,\n ExtendedToolUseContext,\n} from './message-pipeline'\nimport { messagePipeline } from './message-pipeline'\n\n/**\n * Core query orchestrator.\n *\n * Streams `Message` objects (user/assistant/progress) for a single user turn, including tool use.\n */\nexport async function* query(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): AsyncGenerator<Message, void> {\n const shouldPersistSession =\n toolUseContext.options?.persistSession !== false &&\n process.env.NODE_ENV !== 'test'\n const cwd = shouldPersistSession ? getCwd() : null\n\n for await (const message of messagePipeline(\n messages,\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n )) {\n if (shouldPersistSession) {\n appendSessionJsonlFromMessage({\n cwd: cwd ?? getCwd(),\n message,\n toolUseContext,\n })\n }\n yield message\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "existsSync", "resolve", "dirname", "join", "existsSync", "debug", "debug", "existsSync", "vendor", "resolve", "path", "path", "resolve", "cwd", "dirname", "existsSync", "join", "asRecord", "resolve", "cwd"]
7
+ }
@@ -0,0 +1,12 @@
1
+ // packages/core/src/utils/sanitizeAnthropicEnv.ts
2
+ var deprecatedAnthropicEnvVars = [
3
+ "ANTHROPIC_BASE_URL",
4
+ "ANTHROPIC_API_KEY",
5
+ "ANTHROPIC_API_TOKEN",
6
+ "ANTHROPIC_API_Token"
7
+ ];
8
+ for (const key of deprecatedAnthropicEnvVars) {
9
+ if (process.env[key]) {
10
+ delete process.env[key];
11
+ }
12
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../packages/core/src/utils/sanitizeAnthropicEnv.ts"],
4
+ "sourcesContent": ["// Clear deprecated Anthropic environment variables to avoid implicit overrides.\nconst deprecatedAnthropicEnvVars = [\n 'ANTHROPIC_BASE_URL',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_API_TOKEN',\n 'ANTHROPIC_API_Token',\n]\n\nfor (const key of deprecatedAnthropicEnvVars) {\n if (process.env[key]) {\n delete process.env[key]\n }\n}\n"],
5
+ "mappings": ";AACA,IAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,WAAW,OAAO,4BAA4B;AAC5C,MAAI,QAAQ,IAAI,GAAG,GAAG;AACpB,WAAO,QAAQ,IAAI,GAAG;AAAA,EACxB;AACF;",
6
+ "names": []
7
+ }
@@ -1,7 +1,4 @@
1
- import { createRequire as __kodeCreateRequire } from "node:module";
2
- const require = __kodeCreateRequire(import.meta.url);
3
-
4
- // src/utils/text/uuid.ts
1
+ // packages/core/src/utils/uuid.ts
5
2
  var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
6
3
  function isUuid(value) {
7
4
  return UUID_RE.test(value.trim());
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/utils/text/uuid.ts"],
3
+ "sources": ["../../packages/core/src/utils/uuid.ts"],
4
4
  "sourcesContent": ["const UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport function isUuid(value: string): boolean {\n return UUID_RE.test(value.trim())\n}\n"],
5
- "mappings": ";;;;AAAA,IAAM,UACJ;AAEK,SAAS,OAAO,OAAwB;AAC7C,SAAO,QAAQ,KAAK,MAAM,KAAK,CAAC;AAClC;",
5
+ "mappings": ";AAAA,IAAM,UACJ;AAEK,SAAS,OAAO,OAAwB;AAC7C,SAAO,QAAQ,KAAK,MAAM,KAAK,CAAC;AAClC;",
6
6
  "names": []
7
7
  }