@shareai-lab/kode 2.0.2 → 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-XP3CFN6F.js → chunks/agentsValidate-PEWMYN4Q.js} +97 -69
  13. package/dist/chunks/agentsValidate-PEWMYN4Q.js.map +7 -0
  14. package/dist/{ask-3G5H5KD5.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-EH34V7CY.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-K2MI4TPB.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-4GAIJGRH.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-54DNHKOD.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-BHGTA6JQ.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-OZNRLY3E.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-2PMO2FS2.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-NQLEUHMS.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-2KWKUXLT.js → chunks/chunk-HRJ3ICQK.js} +59 -55
  79. package/dist/chunks/chunk-HRJ3ICQK.js.map +7 -0
  80. package/dist/{chunk-ZQU3TXLC.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-IE2CG2TV.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-SRZZFAS7.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-SDGKPKDK.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-G6I7XROM.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-3TXNP6HH.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-QYFKRZQC.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-6ZMBCL23.js → chunks/config-25HRTPSP.js} +48 -10
  133. package/dist/chunks/cost-tracker-Z2UZT2J5.js +28 -0
  134. package/dist/{customCommands-DNEJS3ZU.js → chunks/customCommands-TYMYZRG5.js} +11 -8
  135. package/dist/chunks/engine-MRVF6FK6.js +39 -0
  136. package/dist/{env-OFAXZ3XG.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-GRWG3SPE.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-TDMXFWSO.js → chunks/kodeHooks-RVKYRJHG.js} +11 -9
  146. package/dist/{llm-XVXWYOHK.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-YD7YXYGF.js → chunks/mentionProcessor-RJW5UPJD.js} +46 -16
  150. package/dist/chunks/mentionProcessor-RJW5UPJD.js.map +7 -0
  151. package/dist/{messages-OFUJSPRV.js → chunks/messages-EEWWLPHN.js} +2 -6
  152. package/dist/chunks/model-5TIEKQPD.js +37 -0
  153. package/dist/{openai-5G5D5Q4B.js → chunks/openai-XXK3YZG4.js} +13 -10
  154. package/dist/{outputStyles-HLDXFQK3.js → chunks/outputStyles-FAJTXN2A.js} +6 -9
  155. package/dist/chunks/permissions-HO7INPWM.js +27 -0
  156. package/dist/{pluginRuntime-FPTKK6NY.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-PSNKDINM.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-SRV2INSL.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-GIU4ZIXM.js +0 -42
  223. package/dist/acp-H3VJ77YG.js +0 -1357
  224. package/dist/acp-H3VJ77YG.js.map +0 -7
  225. package/dist/agentsValidate-XP3CFN6F.js.map +0 -7
  226. package/dist/ask-3G5H5KD5.js.map +0 -7
  227. package/dist/autoUpdater-DNRMJWFQ.js +0 -17
  228. package/dist/chunk-2KWKUXLT.js.map +0 -7
  229. package/dist/chunk-2PMO2FS2.js.map +0 -7
  230. package/dist/chunk-3TXNP6HH.js.map +0 -7
  231. package/dist/chunk-4GAIJGRH.js.map +0 -7
  232. package/dist/chunk-4RTX4AG4.js.map +0 -7
  233. package/dist/chunk-54DNHKOD.js.map +0 -7
  234. package/dist/chunk-67PY5IX6.js +0 -34
  235. package/dist/chunk-67PY5IX6.js.map +0 -7
  236. package/dist/chunk-6DRDLOLP.js +0 -2613
  237. package/dist/chunk-6DRDLOLP.js.map +0 -7
  238. package/dist/chunk-7CQVZNQV.js +0 -1609
  239. package/dist/chunk-7CQVZNQV.js.map +0 -7
  240. package/dist/chunk-ABLVTESJ.js.map +0 -7
  241. package/dist/chunk-AIMIPK4B.js +0 -835
  242. package/dist/chunk-AIMIPK4B.js.map +0 -7
  243. package/dist/chunk-BHGTA6JQ.js.map +0 -7
  244. package/dist/chunk-CIG63V4E.js +0 -72
  245. package/dist/chunk-CIG63V4E.js.map +0 -7
  246. package/dist/chunk-E6YNABER.js.map +0 -7
  247. package/dist/chunk-EH34V7CY.js.map +0 -7
  248. package/dist/chunk-EZXMVTDU.js.map +0 -7
  249. package/dist/chunk-FH5CHM6L.js +0 -148
  250. package/dist/chunk-FH5CHM6L.js.map +0 -7
  251. package/dist/chunk-G6I7XROM.js.map +0 -7
  252. package/dist/chunk-HN4E4UUQ.js.map +0 -7
  253. package/dist/chunk-HSPVVDIW.js +0 -30198
  254. package/dist/chunk-HSPVVDIW.js.map +0 -7
  255. package/dist/chunk-IE2CG2TV.js.map +0 -7
  256. package/dist/chunk-K2MI4TPB.js.map +0 -7
  257. package/dist/chunk-MN77D2F7.js +0 -2931
  258. package/dist/chunk-MN77D2F7.js.map +0 -7
  259. package/dist/chunk-NQLEUHMS.js.map +0 -7
  260. package/dist/chunk-OIFQB3S4.js +0 -515
  261. package/dist/chunk-OIFQB3S4.js.map +0 -7
  262. package/dist/chunk-OWTG2W3A.js +0 -164
  263. package/dist/chunk-OWTG2W3A.js.map +0 -7
  264. package/dist/chunk-OZNRLY3E.js.map +0 -7
  265. package/dist/chunk-QYFKRZQC.js.map +0 -7
  266. package/dist/chunk-S6HRABTA.js.map +0 -7
  267. package/dist/chunk-SDGKPKDK.js.map +0 -7
  268. package/dist/chunk-SRZZFAS7.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-VBXVYQYY.js +0 -145
  274. package/dist/chunk-VBXVYQYY.js.map +0 -7
  275. package/dist/chunk-WVHORZQ5.js +0 -17
  276. package/dist/chunk-WVHORZQ5.js.map +0 -7
  277. package/dist/chunk-WWUWDNWW.js +0 -49
  278. package/dist/chunk-WWUWDNWW.js.map +0 -7
  279. package/dist/chunk-Z33T5YN5.js +0 -654
  280. package/dist/chunk-Z33T5YN5.js.map +0 -7
  281. package/dist/chunk-ZQU3TXLC.js.map +0 -7
  282. package/dist/cli-SRV2INSL.js.map +0 -7
  283. package/dist/commands-TWH6PGVG.js +0 -46
  284. package/dist/context-JQIOOI4W.js +0 -30
  285. package/dist/costTracker-6SL26FDB.js +0 -19
  286. package/dist/kodeAgentSessionLoad-6N27AC5K.js +0 -18
  287. package/dist/kodeAgentSessionResume-HUSAEO24.js +0 -16
  288. package/dist/kodeAgentStreamJson-NXFN7TXH.js +0 -13
  289. package/dist/kodeAgentStreamJsonSession-GRWG3SPE.js.map +0 -7
  290. package/dist/kodeAgentStructuredStdio-HGWJT7CU.js +0 -10
  291. package/dist/llm-XVXWYOHK.js.map +0 -7
  292. package/dist/llmLazy-7TD5N7XP.js +0 -15
  293. package/dist/loader-AUXIJTY6.js +0 -28
  294. package/dist/mcp-BXJ3K7NZ.js +0 -49
  295. package/dist/mentionProcessor-YD7YXYGF.js.map +0 -7
  296. package/dist/model-KPYCXWBK.js +0 -30
  297. package/dist/pluginRuntime-FPTKK6NY.js.map +0 -7
  298. package/dist/pluginValidation-DSFXZ4GF.js +0 -17
  299. package/dist/prompts-LWLAJRS2.js +0 -48
  300. package/dist/query-HVPWL27C.js +0 -50
  301. package/dist/responsesStreaming-AW344PQO.js +0 -10
  302. package/dist/ripgrep-YOPCY2GO.js +0 -17
  303. package/dist/state-KNRWP3FO.js +0 -16
  304. package/dist/theme-7S2QN2FO.js +0 -14
  305. package/dist/toolPermissionSettings-GPOBH4IV.js +0 -18
  306. package/dist/tools-FZU2FZBD.js +0 -47
  307. package/dist/userInput-VHNBN2MW.js +0 -311
  308. package/dist/userInput-VHNBN2MW.js.map +0 -7
  309. package/dist/uuid-QN2CNKKN.js +0 -9
  310. /package/dist/{REPL-GIU4ZIXM.js.map → chunks/Doctor-M3J7GRTJ.js.map} +0 -0
  311. /package/dist/{autoUpdater-DNRMJWFQ.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-TWH6PGVG.js.map → chunks/agentLoader-FCRG3TFJ.js.map} +0 -0
  314. /package/dist/{config-6ZMBCL23.js.map → chunks/autoUpdater-CNESBOKO.js.map} +0 -0
  315. /package/dist/{context-JQIOOI4W.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-DNEJS3ZU.js.map → chunks/chunk-GCQCAXJZ.js.map} +0 -0
  318. /package/dist/{env-OFAXZ3XG.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-6N27AC5K.js.map → chunks/config-25HRTPSP.js.map} +0 -0
  321. /package/dist/{kodeAgentSessionResume-HUSAEO24.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-TDMXFWSO.js.map → chunks/env-TJ5NOBEB.js.map} +0 -0
  325. /package/dist/{llmLazy-7TD5N7XP.js.map → chunks/kodeAgentSessionId-VTNISJ2L.js.map} +0 -0
  326. /package/dist/{loader-AUXIJTY6.js.map → chunks/kodeAgentSessionLoad-YB2RKBGJ.js.map} +0 -0
  327. /package/dist/{mcp-BXJ3K7NZ.js.map → chunks/kodeAgentSessionResume-DZSIVKVA.js.map} +0 -0
  328. /package/dist/{messages-OFUJSPRV.js.map → chunks/kodeAgentStreamJson-X5PLS2S6.js.map} +0 -0
  329. /package/dist/{model-KPYCXWBK.js.map → chunks/kodeHooks-RVKYRJHG.js.map} +0 -0
  330. /package/dist/{openai-5G5D5Q4B.js.map → chunks/llmLazy-ZUSSE3ZA.js.map} +0 -0
  331. /package/dist/{outputStyles-HLDXFQK3.js.map → chunks/messages-EEWWLPHN.js.map} +0 -0
  332. /package/dist/{pluginValidation-DSFXZ4GF.js.map → chunks/model-5TIEKQPD.js.map} +0 -0
  333. /package/dist/{prompts-LWLAJRS2.js.map → chunks/openai-XXK3YZG4.js.map} +0 -0
  334. /package/dist/{query-HVPWL27C.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-YOPCY2GO.js.map → chunks/pluginValidation-DAM7WRTC.js.map} +0 -0
  337. /package/dist/{skillMarketplace-PSNKDINM.js.map → chunks/registry-XYJXMOA5.js.map} +0 -0
  338. /package/dist/{state-KNRWP3FO.js.map → chunks/responsesStreaming-JNGE2P3D.js.map} +0 -0
  339. /package/dist/{theme-7S2QN2FO.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-GPOBH4IV.js.map → chunks/src-OROQIWP3.js.map} +0 -0
  342. /package/dist/{tools-FZU2FZBD.js.map → chunks/theme-YBJUIMWK.js.map} +0 -0
  343. /package/dist/{uuid-QN2CNKKN.js.map → chunks/toolPermissionContext-MOCTRR7N.js.map} +0 -0
@@ -1,164 +0,0 @@
1
- import { createRequire as __kodeCreateRequire } from "node:module";
2
- const require = __kodeCreateRequire(import.meta.url);
3
- import {
4
- BunShell,
5
- execFileNoThrow,
6
- logError
7
- } from "./chunk-MN77D2F7.js";
8
-
9
- // src/utils/system/ripgrep.ts
10
- import { rgPath } from "@vscode/ripgrep";
11
- import { findActualExecutable } from "spawn-rx";
12
- import { memoize } from "lodash-es";
13
- import { existsSync } from "node:fs";
14
- import { execFile } from "child_process";
15
- import debug from "debug";
16
- import { quote } from "shell-quote";
17
- var d = debug("kode:ripgrep");
18
- function isTruthyEnv(value) {
19
- if (!value) return false;
20
- return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase());
21
- }
22
- function resolveRipgrepPathOrThrow() {
23
- const explicit = process.env.KODE_RIPGREP_PATH;
24
- if (explicit) {
25
- if (!existsSync(explicit)) {
26
- throw new Error(`KODE_RIPGREP_PATH points to a missing file: ${explicit}`);
27
- }
28
- return explicit;
29
- }
30
- const preferBundled = isTruthyEnv(process.env.USE_BUILTIN_RIPGREP);
31
- if (!preferBundled) {
32
- const { cmd } = findActualExecutable("rg", []);
33
- d(`ripgrep initially resolved as: ${cmd}`);
34
- if (cmd !== "rg") {
35
- return cmd;
36
- }
37
- }
38
- if (!rgPath || !existsSync(rgPath)) {
39
- throw new Error(
40
- [
41
- "ripgrep (rg) was not found on PATH, and @vscode/ripgrep is missing.",
42
- "Fix:",
43
- "- Install ripgrep: https://github.com/BurntSushi/ripgrep",
44
- "- Or reinstall @shareai-lab/kode (ensure dependencies are present)"
45
- ].join("\n")
46
- );
47
- }
48
- d("Using @vscode/ripgrep fallback: %s", rgPath);
49
- return rgPath;
50
- }
51
- var getRipgrepPath = memoize(() => resolveRipgrepPathOrThrow());
52
- async function ripGrep(args, target, abortSignal, options) {
53
- await codesignRipgrepIfNecessary();
54
- const rg = getRipgrepPath();
55
- d("ripgrep called: %s %o", rg, target, args);
56
- if (options?.sandbox?.enabled === true) {
57
- const cmd = quote([rg, ...args, target]);
58
- const result = await BunShell.getInstance().exec(cmd, abortSignal, 1e4, {
59
- sandbox: options.sandbox
60
- });
61
- if (result.code === 1) return [];
62
- if (result.code !== 0) {
63
- logError(`ripgrep failed with exit code ${result.code}: ${result.stderr}`);
64
- return [];
65
- }
66
- return result.stdout.trim().split("\n").filter(Boolean);
67
- }
68
- return new Promise((resolve) => {
69
- execFile(
70
- rg,
71
- [...args, target],
72
- {
73
- maxBuffer: 1e6,
74
- signal: abortSignal,
75
- timeout: 1e4
76
- },
77
- (error, stdout) => {
78
- if (error) {
79
- if (error.code !== 1) {
80
- d("ripgrep error: %o", error);
81
- logError(error);
82
- }
83
- resolve([]);
84
- } else {
85
- d("ripgrep succeeded with %s", stdout);
86
- resolve(stdout.trim().split("\n").filter(Boolean));
87
- }
88
- }
89
- );
90
- });
91
- }
92
- async function listAllContentFiles(path, abortSignal, limit) {
93
- try {
94
- d("listAllContentFiles called: %s", path);
95
- return (await ripGrep(["-l", ".", path], path, abortSignal)).slice(0, limit);
96
- } catch (e) {
97
- d("listAllContentFiles failed: %o", e);
98
- logError(e);
99
- return [];
100
- }
101
- }
102
- var alreadyDoneSignCheck = false;
103
- async function codesignRipgrepIfNecessary() {
104
- if (process.platform !== "darwin" || alreadyDoneSignCheck) {
105
- return;
106
- }
107
- alreadyDoneSignCheck = true;
108
- d("checking if ripgrep is already signed");
109
- const lines = (await execFileNoThrow(
110
- "codesign",
111
- ["-vv", "-d", getRipgrepPath()],
112
- void 0,
113
- void 0,
114
- false
115
- )).stdout.split("\n");
116
- const needsSigned = lines.find((line) => line.includes("linker-signed"));
117
- if (!needsSigned) {
118
- d("seems to be already signed");
119
- return;
120
- }
121
- try {
122
- d("signing ripgrep");
123
- const signResult = await execFileNoThrow("codesign", [
124
- "--sign",
125
- "-",
126
- "--force",
127
- "--preserve-metadata=entitlements,requirements,flags,runtime",
128
- getRipgrepPath()
129
- ]);
130
- if (signResult.code !== 0) {
131
- d("failed to sign ripgrep: %o", signResult);
132
- logError(
133
- `Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`
134
- );
135
- }
136
- d("removing quarantine");
137
- const quarantineResult = await execFileNoThrow("xattr", [
138
- "-d",
139
- "com.apple.quarantine",
140
- getRipgrepPath()
141
- ]);
142
- if (quarantineResult.code !== 0) {
143
- d("failed to remove quarantine: %o", quarantineResult);
144
- logError(
145
- `Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`
146
- );
147
- }
148
- } catch (e) {
149
- d("failed during sign: %o", e);
150
- logError(e);
151
- }
152
- }
153
- function resetRipgrepPathCacheForTests() {
154
- ;
155
- getRipgrepPath.cache?.clear?.();
156
- alreadyDoneSignCheck = false;
157
- }
158
-
159
- export {
160
- getRipgrepPath,
161
- ripGrep,
162
- listAllContentFiles,
163
- resetRipgrepPathCacheForTests
164
- };
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/system/ripgrep.ts"],
4
- "sourcesContent": ["import { rgPath } from '@vscode/ripgrep'\nimport { findActualExecutable } from 'spawn-rx'\nimport { memoize } from 'lodash-es'\nimport { existsSync } from 'node:fs'\nimport { execFile } from 'child_process'\nimport debug from 'debug'\nimport { quote } from 'shell-quote'\nimport { logError } from '@utils/log'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport type { BunShellSandboxOptions } from '@utils/bun/shell'\nimport { BunShell } from '@utils/bun/shell'\n\nconst d = debug('kode:ripgrep')\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\n}\n\nfunction resolveRipgrepPathOrThrow(): string {\n const explicit = process.env.KODE_RIPGREP_PATH\n if (explicit) {\n if (!existsSync(explicit)) {\n throw new Error(`KODE_RIPGREP_PATH points to a missing file: ${explicit}`)\n }\n return explicit\n }\n\n const preferBundled = isTruthyEnv(process.env.USE_BUILTIN_RIPGREP)\n if (!preferBundled) {\n const { cmd } = findActualExecutable('rg', [])\n d(`ripgrep initially resolved as: ${cmd}`)\n if (cmd !== 'rg') {\n return cmd\n }\n }\n\n if (!rgPath || !existsSync(rgPath)) {\n throw new Error(\n [\n 'ripgrep (rg) was not found on PATH, and @vscode/ripgrep is missing.',\n 'Fix:',\n '- Install ripgrep: https://github.com/BurntSushi/ripgrep',\n '- Or reinstall @shareai-lab/kode (ensure dependencies are present)',\n ].join('\\n'),\n )\n }\n\n d('Using @vscode/ripgrep fallback: %s', rgPath)\n return rgPath\n}\n\nexport const getRipgrepPath = memoize((): string => resolveRipgrepPathOrThrow())\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 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 rg,\n [...args, target],\n {\n maxBuffer: 1_000_000,\n signal: abortSignal,\n timeout: 10_000,\n },\n (error, stdout) => {\n if (error) {\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\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(): Promise<void> {\n if (process.platform !== 'darwin' || alreadyDoneSignCheck) {\n return\n }\n\n alreadyDoneSignCheck = true\n\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\nexport function resetRipgrepPathCacheForTests(): void {\n ;(getRipgrepPath as any).cache?.clear?.()\n alreadyDoneSignCheck = false\n}\n\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/agent/loader.ts"],
4
- "sourcesContent": ["\nimport {\n existsSync,\n readFileSync,\n readdirSync,\n statSync,\n watch,\n type FSWatcher,\n} from 'fs'\nimport { basename, dirname, join, resolve } from 'path'\nimport { homedir } from 'os'\nimport matter from 'gray-matter'\nimport yaml from 'js-yaml'\nimport { memoize } from 'lodash-es'\nimport { z } from 'zod'\nimport { getCwd } from '@utils/state'\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\nimport { isSettingSourceEnabled } from '@utils/config/settingSources'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\n\nexport type AgentSource =\n | 'built-in'\n | 'plugin'\n | 'userSettings'\n | 'projectSettings'\n | 'flagSettings'\n | 'policySettings'\n\nexport type AgentLocation = 'built-in' | 'plugin' | 'user' | 'project'\n\nexport type AgentModel = 'inherit' | 'haiku' | 'sonnet' | 'opus' | (string & {})\n\nexport type AgentPermissionMode =\n | 'default'\n | 'acceptEdits'\n | 'plan'\n | 'bypassPermissions'\n | 'dontAsk'\n | 'delegate'\n\nexport interface AgentConfig {\n agentType: string\n whenToUse: string\n tools: string[] | '*'\n disallowedTools?: string[]\n skills?: string[]\n systemPrompt: string\n source: AgentSource\n location: AgentLocation\n baseDir?: string\n filename?: string\n color?: string\n model?: AgentModel\n permissionMode?: AgentPermissionMode\n forkContext?: boolean\n}\n\nfunction getClaudePolicyBaseDir(): string {\n switch (process.platform) {\n case 'darwin':\n return '/Library/Application Support/ClaudeCode'\n case 'win32':\n return existsSync('C:\\\\Program Files\\\\ClaudeCode')\n ? 'C:\\\\Program Files\\\\ClaudeCode'\n : 'C:\\\\ProgramData\\\\ClaudeCode'\n default:\n return '/etc/claude-code'\n }\n}\n\nfunction normalizeOverride(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed ? resolve(trimmed) : null\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n const out: string[] = []\n const seen = new Set<string>()\n for (const value of values) {\n if (!value) continue\n if (seen.has(value)) continue\n seen.add(value)\n out.push(value)\n }\n return out\n}\n\nfunction getUserConfigRoots(): string[] {\n const claudeOverride = normalizeOverride(process.env.CLAUDE_CONFIG_DIR)\n const kodeOverride = normalizeOverride(process.env.KODE_CONFIG_DIR)\n\n const hasAnyOverride = Boolean(claudeOverride || kodeOverride)\n if (hasAnyOverride) {\n return dedupeStrings([claudeOverride ?? '', kodeOverride ?? ''])\n }\n\n return dedupeStrings([join(homedir(), '.claude'), join(homedir(), '.kode')])\n}\n\nfunction findProjectAgentDirs(cwd: string): string[] {\n const result: string[] = []\n const home = resolve(homedir())\n let current = resolve(cwd)\n\n while (current !== home) {\n const claudeDir = join(current, '.claude', 'agents')\n if (existsSync(claudeDir)) result.push(claudeDir)\n\n const kodeDir = join(current, '.kode', 'agents')\n if (existsSync(kodeDir)) result.push(kodeDir)\n\n const parent = dirname(current)\n if (parent === current) break\n current = parent\n }\n\n return result\n}\n\nfunction listMarkdownFilesRecursively(rootDir: string): string[] {\n const files: string[] = []\n const visitedDirs = new Set<string>()\n\n const walk = (dirPath: string) => {\n let dirStat: ReturnType<typeof statSync>\n try {\n dirStat = statSync(dirPath)\n } catch {\n return\n }\n if (!dirStat.isDirectory()) return\n\n const dirKey = `${dirStat.dev}:${dirStat.ino}`\n if (visitedDirs.has(dirKey)) return\n visitedDirs.add(dirKey)\n\n let entries: Array<{\n name: string\n isDirectory(): boolean\n isFile(): boolean\n isSymbolicLink(): boolean\n }>\n try {\n entries = readdirSync(dirPath, {\n withFileTypes: true,\n encoding: 'utf8',\n }) as any\n } catch {\n return\n }\n\n for (const entry of entries) {\n const name = String(entry.name ?? '')\n const fullPath = join(dirPath, name)\n\n if (entry.isDirectory()) {\n walk(fullPath)\n continue\n }\n\n if (entry.isFile()) {\n if (name.endsWith('.md')) files.push(fullPath)\n continue\n }\n\n if (entry.isSymbolicLink()) {\n try {\n const st = statSync(fullPath)\n if (st.isDirectory()) {\n walk(fullPath)\n } else if (st.isFile() && name.endsWith('.md')) {\n files.push(fullPath)\n }\n } catch {\n continue\n }\n }\n }\n }\n\n if (!existsSync(rootDir)) return []\n walk(rootDir)\n return files\n}\n\nfunction readMarkdownFile(filePath: string): { frontmatter: any; content: string } | null {\n try {\n const raw = readFileSync(filePath, 'utf8')\n const yamlSchema = (yaml as any).JSON_SCHEMA\n const matterOptions = {\n engines: {\n yaml: {\n parse: (input: string) =>\n yaml.load(input, yamlSchema ? { schema: yamlSchema } : undefined) ??\n {},\n },\n },\n }\n const parsed = matter(raw, matterOptions)\n return {\n frontmatter: (parsed.data as any) ?? {},\n content: String(parsed.content ?? ''),\n }\n } catch {\n return null\n }\n}\n\nfunction splitCliList(values: string[]): string[] {\n if (values.length === 0) return []\n const out: string[] = []\n\n for (const value of values) {\n if (!value) continue\n let current = ''\n let inParens = false\n\n for (const ch of value) {\n switch (ch) {\n case '(':\n inParens = true\n current += ch\n break\n case ')':\n inParens = false\n current += ch\n break\n case ',':\n if (inParens) {\n current += ch\n } else {\n const trimmed = current.trim()\n if (trimmed) out.push(trimmed)\n current = ''\n }\n break\n case ' ':\n if (inParens) {\n current += ch\n } else {\n const trimmed = current.trim()\n if (trimmed) out.push(trimmed)\n current = ''\n }\n break\n default:\n current += ch\n }\n }\n\n const trimmed = current.trim()\n if (trimmed) out.push(trimmed)\n }\n\n return out\n}\n\nfunction normalizeToolList(value: unknown): string[] | null {\n if (value === undefined || value === null) return null\n if (!value) return []\n\n let raw: string[] = []\n if (typeof value === 'string') raw = [value]\n else if (Array.isArray(value))\n raw = value.filter((v): v is string => typeof v === 'string')\n\n if (raw.length === 0) return []\n const parsed = splitCliList(raw)\n if (parsed.includes('*')) return ['*']\n return parsed\n}\n\nfunction z2A(value: unknown): string[] | undefined {\n const normalized = normalizeToolList(value)\n if (normalized === null) return value === undefined ? undefined : []\n if (normalized.includes('*')) return undefined\n return normalized\n}\n\nfunction qP(value: unknown): string[] {\n const normalized = normalizeToolList(value)\n if (normalized === null) return []\n return normalized\n}\n\nconst VALID_PERMISSION_MODES = [\n 'default',\n 'acceptEdits',\n 'plan',\n 'bypassPermissions',\n 'dontAsk',\n 'delegate',\n] as const\n\nfunction sourceToLocation(source: AgentSource): AgentLocation {\n switch (source) {\n case 'plugin':\n return 'plugin'\n case 'userSettings':\n return 'user'\n case 'projectSettings':\n return 'project'\n case 'built-in':\n case 'flagSettings':\n case 'policySettings':\n default:\n return 'built-in'\n }\n}\n\nfunction parseAgentFromFile(options: {\n filePath: string\n baseDir: string\n source: Exclude<AgentSource, 'flagSettings' | 'built-in'>\n}): AgentConfig | null {\n const parsed = readMarkdownFile(options.filePath)\n if (!parsed) return null\n\n try {\n const fm = parsed.frontmatter ?? {}\n let name: unknown = fm.name\n let description: unknown = fm.description\n\n if (!name || typeof name !== 'string' || !description || typeof description !== 'string') {\n return null\n }\n\n const whenToUse = description.replace(/\\\\n/g, '\\n')\n const filename = basename(options.filePath, '.md')\n\n const color = typeof fm.color === 'string' ? fm.color : undefined\n\n let modelRaw: unknown = fm.model\n if (typeof modelRaw !== 'string' && typeof fm.model_name === 'string') {\n modelRaw = fm.model_name\n }\n let model =\n typeof modelRaw === 'string' ? modelRaw.trim() : undefined\n if (model === '') model = undefined\n\n const forkContextValue: unknown = fm.forkContext\n if (\n forkContextValue !== undefined &&\n forkContextValue !== 'true' &&\n forkContextValue !== 'false'\n ) {\n debugLogger.warn('AGENT_LOADER_INVALID_FORK_CONTEXT', {\n filePath: options.filePath,\n forkContext: String(forkContextValue),\n })\n }\n const forkContext = forkContextValue === 'true'\n\n if (forkContext && model && model !== 'inherit') {\n debugLogger.warn('AGENT_LOADER_FORK_CONTEXT_MODEL_OVERRIDE', {\n filePath: options.filePath,\n model,\n })\n model = 'inherit'\n }\n\n const permissionModeValue: unknown = fm.permissionMode\n const permissionModeIsValid =\n typeof permissionModeValue === 'string' &&\n VALID_PERMISSION_MODES.includes(permissionModeValue as AgentPermissionMode)\n if (\n typeof permissionModeValue === 'string' &&\n permissionModeValue &&\n !permissionModeIsValid\n ) {\n debugLogger.warn('AGENT_LOADER_INVALID_PERMISSION_MODE', {\n filePath: options.filePath,\n permissionMode: permissionModeValue,\n valid: VALID_PERMISSION_MODES,\n })\n }\n\n const toolsList = z2A(fm.tools)\n const tools: string[] | '*' =\n toolsList === undefined || toolsList.includes('*') ? '*' : toolsList\n\n const disallowedRaw =\n fm.disallowedTools ??\n fm['disallowed-tools'] ??\n fm['disallowed_tools']\n const disallowedTools = disallowedRaw !== undefined ? z2A(disallowedRaw) : undefined\n\n const skills = qP(fm.skills)\n const systemPrompt = parsed.content.trim()\n\n const agent: AgentConfig = {\n agentType: name,\n whenToUse,\n tools,\n ...(disallowedTools !== undefined ? { disallowedTools } : {}),\n ...(skills.length > 0 ? { skills } : { skills: [] }),\n systemPrompt,\n source: options.source,\n location: sourceToLocation(options.source),\n baseDir: options.baseDir,\n filename,\n ...(color ? { color } : {}),\n ...(model ? { model: model as AgentModel } : {}),\n ...(permissionModeIsValid ? { permissionMode: permissionModeValue as AgentPermissionMode } : {}),\n ...(forkContext ? { forkContext: true } : {}),\n }\n\n return agent\n } catch {\n return null\n }\n}\n\nconst agentJsonSchema = z.object({\n description: z.string().min(1, 'Description cannot be empty'),\n tools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n prompt: z.string().min(1, 'Prompt cannot be empty'),\n model: z.string().optional(),\n permissionMode: z.enum(VALID_PERMISSION_MODES).optional(),\n})\n\nconst agentsJsonSchema = z.record(z.string(), agentJsonSchema)\n\nfunction parseAgentFromJson(agentType: string, value: unknown): AgentConfig | null {\n const parsed = agentJsonSchema.safeParse(value)\n if (!parsed.success) return null\n\n const toolsList = z2A(parsed.data.tools)\n const disallowedList =\n parsed.data.disallowedTools !== undefined ? z2A(parsed.data.disallowedTools) : undefined\n const model =\n typeof parsed.data.model === 'string' ? parsed.data.model.trim() : undefined\n\n return {\n agentType,\n whenToUse: parsed.data.description,\n tools: toolsList === undefined || toolsList.includes('*') ? '*' : toolsList,\n ...(disallowedList !== undefined ? { disallowedTools: disallowedList } : {}),\n systemPrompt: parsed.data.prompt,\n source: 'flagSettings',\n location: 'built-in',\n ...(model ? { model: model as AgentModel } : {}),\n ...(parsed.data.permissionMode ? { permissionMode: parsed.data.permissionMode } : {}),\n }\n}\n\nlet FLAG_AGENTS: AgentConfig[] = []\n\nexport function setFlagAgentsFromCliJson(json: string | undefined): void {\n if (!json) {\n FLAG_AGENTS = []\n clearAgentCache()\n return\n }\n\n let raw: unknown\n try {\n raw = JSON.parse(json)\n } catch (err) {\n logError(err)\n debugLogger.warn('AGENT_LOADER_FLAG_AGENTS_JSON_PARSE_FAILED', {\n error: err instanceof Error ? err.message : String(err),\n })\n FLAG_AGENTS = []\n clearAgentCache()\n return\n }\n\n const parsed = agentsJsonSchema.safeParse(raw)\n if (!parsed.success) {\n logError(parsed.error)\n debugLogger.warn('AGENT_LOADER_FLAG_AGENTS_SCHEMA_INVALID', {\n error: parsed.error.message,\n })\n FLAG_AGENTS = []\n clearAgentCache()\n return\n }\n\n FLAG_AGENTS = Object.entries(parsed.data)\n .map(([agentType, value]) => parseAgentFromJson(agentType, value))\n .filter((agent): agent is AgentConfig => agent !== null)\n\n clearAgentCache()\n}\n\nconst BUILTIN_GENERAL_PURPOSE: AgentConfig = {\n agentType: 'general-purpose',\n whenToUse:\n 'General-purpose agent for researching complex questions, searching for code, and executing multi-step tasks',\n tools: '*',\n systemPrompt: `You are a general-purpose agent. Given the user's task, use the tools available to complete it efficiently and thoroughly.\n\nWhen to use your capabilities:\n- Searching for code, configurations, and patterns across large codebases\n- Analyzing multiple files to understand system architecture \n- Investigating complex questions that require exploring many files\n- Performing multi-step research tasks\n\nGuidelines:\n- For file searches: Use Grep or Glob when you need to search broadly. Use FileRead when you know the specific file path.\n- For analysis: Start broad and narrow down. Use multiple search strategies if the first doesn't yield results.\n- Be thorough: Check multiple locations, consider different naming conventions, look for related files.\n- Complete tasks directly using your capabilities.`,\n source: 'built-in',\n location: 'built-in',\n baseDir: 'built-in',\n}\n\nconst BUILTIN_EXPLORE: AgentConfig = {\n agentType: 'Explore',\n whenToUse:\n 'Fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (eg. \"src/components/**/*.tsx\"), search code for keywords (eg. \"API endpoints\"), or answer questions about the codebase (eg. \"how do API endpoints work?\"). When calling this agent, specify the desired thoroughness level: \"quick\" for basic searches, \"medium\" for moderate exploration, or \"very thorough\" for comprehensive analysis across multiple locations and naming conventions.',\n tools: '*',\n disallowedTools: ['Task', 'ExitPlanMode', 'Edit', 'Write', 'NotebookEdit'],\n model: 'haiku',\n systemPrompt: `You are a file search specialist. You excel at thoroughly navigating and exploring codebases.\n\n=== CRITICAL: READ-ONLY MODE - NO FILE MODIFICATIONS ===\nThis is a READ-ONLY exploration task. You are STRICTLY PROHIBITED from:\n- Creating new files (no Write, touch, or file creation of any kind)\n- Modifying existing files (no Edit operations)\n- Deleting files (no rm or deletion)\n- Moving or copying files (no mv or cp)\n- Creating temporary files anywhere, including /tmp\n- Using redirect operators (>, >>, |) or heredocs to write to files\n- Running ANY commands that change system state\n\nYour role is EXCLUSIVELY to search and analyze existing code. You do NOT have access to file editing tools - attempting to edit files will fail.\n\nYour strengths:\n- Rapidly finding files using glob patterns\n- Searching code and text with powerful regex patterns\n- Reading and analyzing file contents\n\nGuidelines:\n- Use Glob for broad file pattern matching\n- Use Grep for searching file contents with regex\n- Use Read when you know the specific file path you need to read\n- Use Bash ONLY for read-only operations (ls, git status, git log, git diff, find, cat, head, tail)\n- NEVER use Bash for: mkdir, touch, rm, cp, mv, git add, git commit, npm install, pip install, or any file creation/modification\n- Adapt your search approach based on the thoroughness level specified by the caller\n- Return file paths as absolute paths in your final response\n- For clear communication, avoid using emojis\n- Communicate your final report directly as a regular message - do NOT attempt to create files\n\nNOTE: You are meant to be a fast agent that returns output as quickly as possible. In order to achieve this you must:\n- Make efficient use of the tools that you have at your disposal: be smart about how you search for files and implementations\n- Wherever possible you should try to spawn multiple parallel tool calls for grepping and reading files\n\nComplete the user's search request efficiently and report your findings clearly.`,\n source: 'built-in',\n location: 'built-in',\n baseDir: 'built-in',\n}\n\nconst BUILTIN_PLAN: AgentConfig = {\n agentType: 'Plan',\n whenToUse:\n 'Software architect agent for designing implementation plans. Use this when you need to plan the implementation strategy for a task. Returns step-by-step plans, identifies critical files, and considers architectural trade-offs.',\n tools: '*',\n disallowedTools: ['Task', 'ExitPlanMode', 'Edit', 'Write', 'NotebookEdit'],\n model: 'inherit',\n systemPrompt: `You are a software architect and planning specialist. Your role is to explore the codebase and design implementation plans.\n\n=== CRITICAL: READ-ONLY MODE - NO FILE MODIFICATIONS ===\nThis is a READ-ONLY planning task. You are STRICTLY PROHIBITED from:\n- Creating new files (no Write, touch, or file creation of any kind)\n- Modifying existing files (no Edit operations)\n- Deleting files (no rm or deletion)\n- Moving or copying files (no mv or cp)\n- Creating temporary files anywhere, including /tmp\n- Using redirect operators (>, >>, |) or heredocs to write to files\n- Running ANY commands that change system state\n\nYour role is EXCLUSIVELY to explore the codebase and design implementation plans. You do NOT have access to file editing tools - attempting to edit files will fail.\n\nYou will be provided with a set of requirements and optionally a perspective on how to approach the design process.\n\n## Your Process\n\n1. **Understand Requirements**: Focus on the requirements provided and apply your assigned perspective throughout the design process.\n\n2. **Explore Thoroughly**:\n - Read any files provided to you in the initial prompt\n - Find existing patterns and conventions using Glob, Grep, and Read\n - Understand the current architecture\n - Identify similar features as reference\n - Trace through relevant code paths\n - Use Bash ONLY for read-only operations (ls, git status, git log, git diff, find, cat, head, tail)\n - NEVER use Bash for: mkdir, touch, rm, cp, mv, git add, git commit, npm install, pip install, or any file creation/modification\n\n3. **Design Solution**:\n - Create implementation approach based on your assigned perspective\n - Consider trade-offs and architectural decisions\n - Follow existing patterns where appropriate\n\n4. **Detail the Plan**:\n - Provide step-by-step implementation strategy\n - Identify dependencies and sequencing\n - Anticipate potential challenges\n\n## Required Output\n\nEnd your response with:\n\n### Critical Files for Implementation\nList 3-5 files most critical for implementing this plan:\n- path/to/file1.ts - [Brief reason: e.g., \"Core logic to modify\"]\n- path/to/file2.ts - [Brief reason: e.g., \"Interfaces to implement\"]\n- path/to/file3.ts - [Brief reason: e.g., \"Pattern to follow\"]\n\nREMEMBER: You can ONLY explore and plan. You CANNOT and MUST NOT write, edit, or modify any files. You do NOT have access to file editing tools.`,\n source: 'built-in',\n location: 'built-in',\n baseDir: 'built-in',\n}\n\nconst BUILTIN_STATUSLINE_SETUP: AgentConfig = {\n agentType: 'statusline-setup',\n whenToUse:\n 'Set up the CLI status line command (writes to ~/.kode/settings.json statusLine). Use when the user runs /statusline.',\n tools: ['Read', 'Edit', 'Bash'],\n systemPrompt: `You are the status line setup agent.\n\nYour job is to configure a fast, single-line status command for the CLI UI.\n\nRequirements:\n- Write/update the user's ~/.kode/settings.json and set the top-level key \"statusLine\" to a shell command string.\n- IMPORTANT: When using Read/Edit tools, use absolute paths (do not pass \"~\" to tool inputs).\n- The command must be quick (ideally <200ms), produce a single line, and be safe to run repeatedly.\n- Prefer using information that is generally available: current directory, git branch/dirty state, etc.\n- If you can't infer the user's preferred status info from their shell config, ask them what they want and propose a reasonable default.\n\nSuggested approach:\n1) Inspect common shell config files (Read):\n - macOS/Linux: ~/.zshrc, ~/.bashrc, ~/.config/fish/config.fish\n - Windows: consider PowerShell profile if the user provides its location\n2) Propose a statusLine command:\n - macOS/Linux: e.g. a small sh snippet that prints cwd basename and git branch if present\n - Windows: e.g. a short PowerShell one-liner that prints similar info\n3) Update ~/.kode/settings.json:\n - If the file does not exist, create it as a minimal JSON object.\n - Preserve unrelated fields if present.\n4) Reply with the exact command you set and how the user can change/remove it later.`,\n source: 'built-in',\n location: 'built-in',\n baseDir: 'built-in',\n}\n\nfunction mergeAgents(allAgents: AgentConfig[]): AgentConfig[] {\n const builtIn = allAgents.filter(a => a.source === 'built-in')\n const plugin = allAgents.filter(a => a.source === 'plugin')\n const user = allAgents.filter(a => a.source === 'userSettings')\n const project = allAgents.filter(a => a.source === 'projectSettings')\n const flag = allAgents.filter(a => a.source === 'flagSettings')\n const policy = allAgents.filter(a => a.source === 'policySettings')\n\n const ordered = [builtIn, plugin, user, project, flag, policy]\n const map = new Map<string, AgentConfig>()\n for (const group of ordered) {\n for (const agent of group) {\n map.set(agent.agentType, agent)\n }\n }\n return Array.from(map.values())\n}\n\nfunction inodeKeyForPath(filePath: string): string | null {\n try {\n const st = statSync(filePath)\n if (typeof (st as any).dev === 'number' && typeof (st as any).ino === 'number') {\n return `${(st as any).dev}:${(st as any).ino}`\n }\n return null\n } catch {\n return null\n }\n}\n\nfunction scanAgentPaths(options: {\n dirPathOrFile: string\n baseDir: string\n source: Exclude<AgentSource, 'built-in' | 'flagSettings'>\n seenInodes: Map<string, AgentSource>\n}): AgentConfig[] {\n const out: AgentConfig[] = []\n\n const addFile = (filePath: string) => {\n if (!filePath.endsWith('.md')) return\n\n const inodeKey = inodeKeyForPath(filePath)\n if (inodeKey) {\n const existing = options.seenInodes.get(inodeKey)\n if (existing) return\n options.seenInodes.set(inodeKey, options.source)\n }\n\n const agent = parseAgentFromFile({\n filePath,\n baseDir: options.baseDir,\n source: options.source,\n })\n if (agent) out.push(agent)\n }\n\n let st: ReturnType<typeof statSync>\n try {\n st = statSync(options.dirPathOrFile)\n } catch {\n return []\n }\n\n if (st.isFile()) {\n addFile(options.dirPathOrFile)\n return out\n }\n\n if (!st.isDirectory()) return []\n\n for (const filePath of listMarkdownFilesRecursively(options.dirPathOrFile)) {\n addFile(filePath)\n }\n\n return out\n}\n\nasync function loadAllAgents(): Promise<{\n activeAgents: AgentConfig[]\n allAgents: AgentConfig[]\n}> {\n const builtinAgents: AgentConfig[] = [\n BUILTIN_GENERAL_PURPOSE,\n BUILTIN_STATUSLINE_SETUP,\n BUILTIN_EXPLORE,\n BUILTIN_PLAN,\n ]\n\n const seenInodes = new Map<string, AgentSource>()\n\n const sessionPlugins = getSessionPlugins()\n const pluginAgentDirs = sessionPlugins.flatMap(p => p.agentsDirs ?? [])\n const pluginAgents = pluginAgentDirs.flatMap(dir =>\n scanAgentPaths({\n dirPathOrFile: dir,\n baseDir: dir,\n source: 'plugin',\n seenInodes,\n }),\n )\n\n const policyAgentsDir = join(getClaudePolicyBaseDir(), '.claude', 'agents')\n const policyAgents = scanAgentPaths({\n dirPathOrFile: policyAgentsDir,\n baseDir: policyAgentsDir,\n source: 'policySettings',\n seenInodes,\n })\n\n const userAgents: AgentConfig[] = []\n if (isSettingSourceEnabled('userSettings')) {\n for (const root of getUserConfigRoots()) {\n const dir = join(root, 'agents')\n userAgents.push(\n ...scanAgentPaths({\n dirPathOrFile: dir,\n baseDir: dir,\n source: 'userSettings',\n seenInodes,\n }),\n )\n }\n }\n\n const projectAgents: AgentConfig[] = []\n if (isSettingSourceEnabled('projectSettings')) {\n const dirs = findProjectAgentDirs(getCwd())\n for (const dir of dirs) {\n projectAgents.push(\n ...scanAgentPaths({\n dirPathOrFile: dir,\n baseDir: dir,\n source: 'projectSettings',\n seenInodes,\n }),\n )\n }\n }\n\n const allAgents: AgentConfig[] = [\n ...builtinAgents,\n ...pluginAgents,\n ...userAgents,\n ...projectAgents,\n ...FLAG_AGENTS,\n ...policyAgents,\n ]\n\n const activeAgents = mergeAgents(allAgents)\n return { activeAgents, allAgents }\n}\n\nexport const getActiveAgents = memoize(async (): Promise<AgentConfig[]> => {\n const { activeAgents } = await loadAllAgents()\n return activeAgents\n})\n\nexport const getAllAgents = memoize(async (): Promise<AgentConfig[]> => {\n const { allAgents } = await loadAllAgents()\n return allAgents\n})\n\nexport const getAgentByType = memoize(\n async (agentType: string): Promise<AgentConfig | undefined> => {\n const agents = await getActiveAgents()\n return agents.find(agent => agent.agentType === agentType)\n },\n)\n\nexport const getAvailableAgentTypes = memoize(async (): Promise<string[]> => {\n const agents = await getActiveAgents()\n return agents.map(agent => agent.agentType)\n})\n\nexport function clearAgentCache(): void {\n getActiveAgents.cache?.clear?.()\n getAllAgents.cache?.clear?.()\n getAgentByType.cache?.clear?.()\n getAvailableAgentTypes.cache?.clear?.()\n}\n\nlet watchers: FSWatcher[] = []\n\nexport async function startAgentWatcher(onChange?: () => void): Promise<void> {\n await stopAgentWatcher()\n\n const watchDirs: string[] = []\n\n watchDirs.push(join(getClaudePolicyBaseDir(), '.claude', 'agents'))\n\n if (isSettingSourceEnabled('userSettings')) {\n for (const root of getUserConfigRoots()) {\n watchDirs.push(join(root, 'agents'))\n }\n }\n\n if (isSettingSourceEnabled('projectSettings')) {\n watchDirs.push(...findProjectAgentDirs(getCwd()))\n }\n\n for (const plugin of getSessionPlugins()) {\n for (const dir of plugin.agentsDirs ?? []) {\n watchDirs.push(dir)\n }\n }\n\n for (const dirPath of dedupeStrings(watchDirs)) {\n if (!existsSync(dirPath)) continue\n try {\n const watcher = watch(\n dirPath,\n { recursive: false },\n async (_eventType, filename) => {\n if (filename && filename.endsWith('.md')) {\n clearAgentCache()\n onChange?.()\n }\n },\n )\n watchers.push(watcher)\n } catch {\n continue\n }\n }\n}\n\nexport async function stopAgentWatcher(): Promise<void> {\n try {\n for (const watcher of watchers) {\n try {\n watcher.close()\n } catch {\n }\n }\n } finally {\n watchers = []\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["trimmed"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/log/debugLogger.ts"],
4
- "sourcesContent": ["import { existsSync, mkdirSync, appendFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport { format } from 'node:util'\nimport chalk from 'chalk'\nimport envPaths from 'env-paths'\nimport { PRODUCT_COMMAND } from '@constants/product'\nimport { SESSION_ID } from './index'\nimport type { Message } from '@kode-types/conversation'\n\nexport enum LogLevel {\n TRACE = 'TRACE',\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n WARN = 'WARN',\n ERROR = 'ERROR',\n FLOW = 'FLOW',\n API = 'API',\n STATE = 'STATE',\n REMINDER = 'REMINDER',\n}\n\nconst isDebugMode = () =>\n process.argv.includes('--debug-verbose') ||\n process.argv.includes('--mcp-debug') ||\n process.argv.some(\n arg => arg === '--debug' || arg === '-d' || arg.startsWith('--debug='),\n )\nconst isVerboseMode = () => process.argv.includes('--verbose')\nconst isDebugVerboseMode = () => process.argv.includes('--debug-verbose')\n\nconst TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.INFO,\n LogLevel.REMINDER,\n])\n\nconst DEBUG_VERBOSE_TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.FLOW,\n LogLevel.API,\n LogLevel.STATE,\n LogLevel.INFO,\n LogLevel.REMINDER,\n])\n\nconst USER_FRIENDLY_LEVELS = new Set([\n 'SESSION_START',\n 'QUERY_START',\n 'QUERY_PROGRESS',\n 'QUERY_COMPLETE',\n 'TOOL_EXECUTION',\n 'ERROR_OCCURRED',\n 'PERFORMANCE_SUMMARY',\n])\n\nconst STARTUP_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, '-')\nconst REQUEST_START_TIME = Date.now()\n\nconst KODE_DIR = join(homedir(), '.kode')\nfunction getProjectDir(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nconst DEBUG_PATHS = {\n base: () => join(KODE_DIR, getProjectDir(process.cwd()), 'debug'),\n detailed: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-detailed.log`),\n flow: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-flow.log`),\n api: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-api.log`),\n state: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-state.log`),\n}\n\nfunction ensureDebugDir() {\n const debugDir = DEBUG_PATHS.base()\n if (!existsSync(debugDir)) {\n mkdirSync(debugDir, { recursive: true })\n }\n}\n\ninterface LogEntry {\n timestamp: string\n level: LogLevel\n phase: string\n requestId?: string\n data: any\n elapsed?: number\n}\n\nclass RequestContext {\n public readonly id: string\n public readonly startTime: number\n private phases: Map<string, number> = new Map()\n\n constructor() {\n this.id = randomUUID().slice(0, 8)\n this.startTime = Date.now()\n }\n\n markPhase(phase: string) {\n this.phases.set(phase, Date.now() - this.startTime)\n }\n\n getPhaseTime(phase: string): number {\n return this.phases.get(phase) || 0\n }\n\n getAllPhases(): Record<string, number> {\n return Object.fromEntries(this.phases)\n }\n}\n\nconst activeRequests = new Map<string, RequestContext>()\nlet currentRequest: RequestContext | null = null\n\nfunction terminalLog(...args: unknown[]): void {\n process.stderr.write(`${format(...args)}\\n`)\n}\n\nfunction writeToFile(filePath: string, entry: LogEntry) {\n if (!isDebugMode()) return\n\n try {\n ensureDebugDir()\n const logLine =\n JSON.stringify(\n {\n ...entry,\n sessionId: SESSION_ID,\n pid: process.pid,\n uptime: Date.now() - REQUEST_START_TIME,\n },\n null,\n 2,\n ) + ',\\n'\n\n appendFileSync(filePath, logLine)\n } catch (error) {\n }\n}\n\nconst recentLogs = new Map<string, number>()\nconst LOG_DEDUPE_WINDOW_MS = 5000\n\nfunction getDedupeKey(level: LogLevel, phase: string, data: any): string {\n if (phase.startsWith('CONFIG_')) {\n const file = data?.file || ''\n return `${level}:${phase}:${file}`\n }\n\n return `${level}:${phase}`\n}\n\nfunction shouldLogWithDedupe(\n level: LogLevel,\n phase: string,\n data: any,\n): boolean {\n const key = getDedupeKey(level, phase, data)\n const now = Date.now()\n const lastLogTime = recentLogs.get(key)\n\n if (!lastLogTime || now - lastLogTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.set(key, now)\n\n for (const [oldKey, oldTime] of recentLogs.entries()) {\n if (now - oldTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.delete(oldKey)\n }\n }\n\n return true\n }\n\n return false\n}\nfunction formatMessages(messages: any): string {\n if (Array.isArray(messages)) {\n const recentMessages = messages.slice(-5)\n return recentMessages\n .map((msg, index) => {\n const role = msg.role || 'unknown'\n let content = ''\n\n if (typeof msg.content === 'string') {\n content =\n msg.content.length > 300\n ? msg.content.substring(0, 300) + '...'\n : msg.content\n } else if (typeof msg.content === 'object') {\n content = '[complex_content]'\n } else {\n content = String(msg.content || '')\n }\n\n const totalIndex = messages.length - recentMessages.length + index\n return `[${totalIndex}] ${chalk.dim(role)}: ${content}`\n })\n .join('\\n ')\n }\n\n if (typeof messages === 'string') {\n try {\n const parsed = JSON.parse(messages)\n if (Array.isArray(parsed)) {\n return formatMessages(parsed)\n }\n } catch {\n }\n }\n\n if (typeof messages === 'string' && messages.length > 200) {\n return messages.substring(0, 200) + '...'\n }\n\n return typeof messages === 'string' ? messages : JSON.stringify(messages)\n}\n\nfunction shouldShowInTerminal(level: LogLevel): boolean {\n if (!isDebugMode()) return false\n\n if (isDebugVerboseMode()) {\n return DEBUG_VERBOSE_TERMINAL_LOG_LEVELS.has(level)\n }\n\n return TERMINAL_LOG_LEVELS.has(level)\n}\n\nfunction logToTerminal(entry: LogEntry) {\n if (!shouldShowInTerminal(entry.level)) return\n\n const { level, phase, data, requestId, elapsed } = entry\n const timestamp = new Date().toISOString().slice(11, 23)\n\n let prefix = ''\n let color = chalk.gray\n\n switch (level) {\n case LogLevel.FLOW:\n prefix = '\uD83D\uDD04'\n color = chalk.cyan\n break\n case LogLevel.API:\n prefix = '\uD83C\uDF10'\n color = chalk.yellow\n break\n case LogLevel.STATE:\n prefix = '\uD83D\uDCCA'\n color = chalk.blue\n break\n case LogLevel.ERROR:\n prefix = '\u274C'\n color = chalk.red\n break\n case LogLevel.WARN:\n prefix = '\u26A0\uFE0F'\n color = chalk.yellow\n break\n case LogLevel.INFO:\n prefix = '\u2139\uFE0F'\n color = chalk.green\n break\n case LogLevel.TRACE:\n prefix = '\uD83D\uDCC8'\n color = chalk.magenta\n break\n default:\n prefix = '\uD83D\uDD0D'\n color = chalk.gray\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId}]`) : ''\n const elapsedStr = elapsed !== undefined ? chalk.dim(`+${elapsed}ms`) : ''\n\n let dataStr = ''\n if (typeof data === 'object' && data !== null) {\n if (data.messages) {\n const formattedMessages = formatMessages(data.messages)\n dataStr = JSON.stringify(\n {\n ...data,\n messages: `\\n ${formattedMessages}`,\n },\n null,\n 2,\n )\n } else {\n dataStr = JSON.stringify(data, null, 2)\n }\n } else {\n dataStr = typeof data === 'string' ? data : JSON.stringify(data)\n }\n\n terminalLog(\n `${color(`[${timestamp}]`)} ${prefix} ${color(phase)} ${reqId} ${dataStr} ${elapsedStr}`,\n )\n}\n\nexport function debugLog(\n level: LogLevel,\n phase: string,\n data: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n if (!shouldLogWithDedupe(level, phase, data)) {\n return\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n phase,\n data,\n requestId: requestId || currentRequest?.id,\n elapsed: currentRequest ? Date.now() - currentRequest.startTime : undefined,\n }\n\n writeToFile(DEBUG_PATHS.detailed(), entry)\n\n switch (level) {\n case LogLevel.FLOW:\n writeToFile(DEBUG_PATHS.flow(), entry)\n break\n case LogLevel.API:\n writeToFile(DEBUG_PATHS.api(), entry)\n break\n case LogLevel.STATE:\n writeToFile(DEBUG_PATHS.state(), entry)\n break\n }\n\n logToTerminal(entry)\n}\n\nexport const debug = {\n flow: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.FLOW, phase, data, requestId),\n\n api: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.API, phase, data, requestId),\n\n state: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, phase, data, requestId),\n\n info: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.INFO, phase, data, requestId),\n\n warn: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.WARN, phase, data, requestId),\n\n error: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.ERROR, phase, data, requestId),\n\n trace: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.TRACE, phase, data, requestId),\n\n ui: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, `UI_${phase}`, data, requestId),\n}\n\nexport function startRequest(): RequestContext {\n const ctx = new RequestContext()\n currentRequest = ctx\n activeRequests.set(ctx.id, ctx)\n\n debug.flow('REQUEST_START', {\n requestId: ctx.id,\n activeRequests: activeRequests.size,\n })\n\n return ctx\n}\n\nexport function endRequest(ctx?: RequestContext) {\n const request = ctx || currentRequest\n if (!request) return\n\n debug.flow('REQUEST_END', {\n requestId: request.id,\n totalTime: Date.now() - request.startTime,\n phases: request.getAllPhases(),\n })\n\n activeRequests.delete(request.id)\n if (currentRequest === request) {\n currentRequest = null\n }\n}\n\nexport function getCurrentRequest(): RequestContext | null {\n return currentRequest\n}\n\nexport function markPhase(phase: string, data?: any) {\n if (!currentRequest) return\n\n currentRequest.markPhase(phase)\n debug.flow(`PHASE_${phase.toUpperCase()}`, {\n requestId: currentRequest.id,\n elapsed: currentRequest.getPhaseTime(phase),\n data,\n })\n}\n\nexport function logReminderEvent(\n eventType: string,\n reminderData: any,\n agentId?: string,\n) {\n if (!isDebugMode()) return\n\n debug.info('REMINDER_EVENT_TRIGGERED', {\n eventType,\n agentId: agentId || 'default',\n reminderType: reminderData.type || 'unknown',\n reminderCategory: reminderData.category || 'general',\n reminderPriority: reminderData.priority || 'medium',\n contentLength: reminderData.content ? reminderData.content.length : 0,\n timestamp: Date.now(),\n })\n}\n\nexport function logAPIError(context: {\n model: string\n endpoint: string\n status: number\n error: any\n request?: any\n response?: any\n provider?: string\n}) {\n const errorDir = join(KODE_DIR, 'logs', 'error', 'api')\n\n if (!existsSync(errorDir)) {\n try {\n mkdirSync(errorDir, { recursive: true })\n } catch (err) {\n terminalLog('Failed to create error log directory:', err)\n return\n }\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n const sanitizedModel = context.model.replace(/[^a-zA-Z0-9-_]/g, '_')\n const filename = `${sanitizedModel}_${timestamp}.log`\n const filepath = join(errorDir, filename)\n\n const fullLogContent = {\n timestamp: new Date().toISOString(),\n sessionId: SESSION_ID,\n requestId: getCurrentRequest()?.id,\n model: context.model,\n provider: context.provider,\n endpoint: context.endpoint,\n status: context.status,\n error: context.error,\n request: context.request,\n response: context.response,\n environment: {\n nodeVersion: process.version,\n platform: process.platform,\n cwd: process.cwd(),\n },\n }\n\n try {\n appendFileSync(filepath, JSON.stringify(fullLogContent, null, 2) + '\\n')\n appendFileSync(filepath, '='.repeat(80) + '\\n\\n')\n } catch (err) {\n terminalLog('Failed to write API error log:', err)\n }\n\n if (isDebugMode()) {\n debug.error('API_ERROR', {\n model: context.model,\n status: context.status,\n error:\n typeof context.error === 'string'\n ? context.error\n : context.error?.message || 'Unknown error',\n endpoint: context.endpoint,\n logFile: filename,\n })\n }\n\n if (isVerboseMode() || isDebugVerboseMode()) {\n terminalLog()\n terminalLog(chalk.red('\u2501'.repeat(60)))\n terminalLog(chalk.red.bold('\u26A0\uFE0F API Error'))\n terminalLog(chalk.red('\u2501'.repeat(60)))\n\n terminalLog(chalk.white(' Model: ') + chalk.yellow(context.model))\n terminalLog(chalk.white(' Status: ') + chalk.red(context.status))\n\n let errorMessage = 'Unknown error'\n if (typeof context.error === 'string') {\n errorMessage = context.error\n } else if (context.error?.message) {\n errorMessage = context.error.message\n } else if (context.error?.error?.message) {\n errorMessage = context.error.error.message\n }\n\n terminalLog(chalk.white(' Error: ') + chalk.red(errorMessage))\n\n if (context.response) {\n terminalLog()\n terminalLog(chalk.gray(' Response:'))\n const responseStr =\n typeof context.response === 'string'\n ? context.response\n : JSON.stringify(context.response, null, 2)\n\n responseStr.split('\\n').forEach(line => {\n terminalLog(chalk.gray(' ' + line))\n })\n }\n\n terminalLog()\n terminalLog(chalk.dim(` \uD83D\uDCC1 Full log: ${filepath}`))\n terminalLog(chalk.red('\u2501'.repeat(60)))\n terminalLog()\n }\n}\n\nexport function logLLMInteraction(context: {\n systemPrompt: string\n messages: any[]\n response: any\n usage?: { inputTokens: number; outputTokens: number }\n timing: { start: number; end: number }\n apiFormat?: 'anthropic' | 'openai'\n}) {\n if (!isDebugMode()) return\n\n const duration = context.timing.end - context.timing.start\n\n terminalLog('\\n' + chalk.blue('\uD83E\uDDE0 LLM CALL DEBUG'))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n\n terminalLog(chalk.yellow('\uD83D\uDCCA Context Overview:'))\n terminalLog(` Messages Count: ${context.messages.length}`)\n terminalLog(` System Prompt Length: ${context.systemPrompt.length} chars`)\n terminalLog(` Duration: ${duration.toFixed(0)}ms`)\n\n if (context.usage) {\n terminalLog(\n ` Token Usage: ${context.usage.inputTokens} \u2192 ${context.usage.outputTokens}`,\n )\n }\n\n const apiLabel = context.apiFormat\n ? ` (${context.apiFormat.toUpperCase()})`\n : ''\n terminalLog(chalk.cyan(`\\n\uD83D\uDCAC Real API Messages${apiLabel} (last 10):`))\n\n const recentMessages = context.messages.slice(-10)\n recentMessages.forEach((msg, index) => {\n const globalIndex = context.messages.length - recentMessages.length + index\n const roleColor =\n msg.role === 'user'\n ? 'green'\n : msg.role === 'assistant'\n ? 'blue'\n : msg.role === 'system'\n ? 'yellow'\n : 'gray'\n\n let content = ''\n let isReminder = false\n\n if (typeof msg.content === 'string') {\n if (msg.content.includes('<system-reminder>')) {\n isReminder = true\n const reminderContent = msg.content\n .replace(/<\\/?system-reminder>/g, '')\n .trim()\n content = `\uD83D\uDD14 ${reminderContent.length > 800 ? reminderContent.substring(0, 800) + '...' : reminderContent}`\n } else {\n const maxLength =\n msg.role === 'user' ? 1000 : msg.role === 'system' ? 1200 : 800\n content =\n msg.content.length > maxLength\n ? msg.content.substring(0, maxLength) + '...'\n : msg.content\n }\n } else if (Array.isArray(msg.content)) {\n const textBlocks = msg.content.filter(\n (block: any) => block.type === 'text',\n )\n const toolBlocks = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (textBlocks.length > 0) {\n const text = textBlocks[0].text || ''\n const maxLength = msg.role === 'assistant' ? 1000 : 800\n content =\n text.length > maxLength ? text.substring(0, maxLength) + '...' : text\n }\n if (toolBlocks.length > 0) {\n content += ` [+ ${toolBlocks.length} tool calls]`\n }\n if (textBlocks.length === 0 && toolBlocks.length === 0) {\n content = `[${msg.content.length} blocks: ${msg.content.map(b => b.type || 'unknown').join(', ')}]`\n }\n } else {\n content = '[complex_content]'\n }\n\n if (isReminder) {\n terminalLog(\n ` [${globalIndex}] ${chalk.magenta('\uD83D\uDD14 REMINDER')}: ${chalk.dim(content)}`,\n )\n } else {\n const roleIcon =\n msg.role === 'user'\n ? '\uD83D\uDC64'\n : msg.role === 'assistant'\n ? '\uD83E\uDD16'\n : msg.role === 'system'\n ? '\u2699\uFE0F'\n : '\uD83D\uDCC4'\n terminalLog(\n ` [${globalIndex}] ${(chalk as any)[roleColor](roleIcon + ' ' + msg.role.toUpperCase())}: ${content}`,\n )\n }\n\n if (msg.role === 'assistant' && Array.isArray(msg.content)) {\n const toolCalls = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (toolCalls.length > 0) {\n terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${toolCalls.length}): ${toolCalls.map((t: any) => t.name).join(', ')}`,\n ),\n )\n toolCalls.forEach((tool: any, idx: number) => {\n const inputStr = JSON.stringify(tool.input || {})\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n terminalLog(\n chalk.dim(` [${idx}] ${tool.name}: ${displayInput}`),\n )\n })\n }\n }\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${msg.tool_calls.length}): ${msg.tool_calls.map((t: any) => t.function.name).join(', ')}`,\n ),\n )\n msg.tool_calls.forEach((tool: any, idx: number) => {\n const inputStr = tool.function.arguments || '{}'\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n terminalLog(\n chalk.dim(` [${idx}] ${tool.function.name}: ${displayInput}`),\n )\n })\n }\n })\n\n terminalLog(chalk.magenta('\\n\uD83E\uDD16 LLM Response:'))\n\n let responseContent = ''\n let toolCalls: any[] = []\n\n if (Array.isArray(context.response.content)) {\n const textBlocks = context.response.content.filter(\n (block: any) => block.type === 'text',\n )\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\n toolCalls = context.response.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n } else if (typeof context.response.content === 'string') {\n responseContent = context.response.content\n toolCalls = context.response.tool_calls || context.response.toolCalls || []\n } else if (context.response.message?.content) {\n if (Array.isArray(context.response.message.content)) {\n const textBlocks = context.response.message.content.filter(\n (block: any) => block.type === 'text',\n )\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\n toolCalls = context.response.message.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n } else if (typeof context.response.message.content === 'string') {\n responseContent = context.response.message.content\n }\n } else {\n responseContent = JSON.stringify(\n context.response.content || context.response || '',\n )\n }\n\n const maxResponseLength = 1000\n const displayContent =\n responseContent.length > maxResponseLength\n ? responseContent.substring(0, maxResponseLength) + '...'\n : responseContent\n terminalLog(` Content: ${displayContent}`)\n\n if (toolCalls.length > 0) {\n const toolNames = toolCalls.map(\n (t: any) => t.name || t.function?.name || 'unknown',\n )\n terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 Tool Calls (${toolCalls.length}): ${toolNames.join(', ')}`,\n ),\n )\n toolCalls.forEach((tool: any, index: number) => {\n const toolName = tool.name || tool.function?.name || 'unknown'\n const toolInput = tool.input || tool.function?.arguments || '{}'\n const inputStr =\n typeof toolInput === 'string' ? toolInput : JSON.stringify(toolInput)\n const maxToolInputLength = 300\n const displayInput =\n inputStr.length > maxToolInputLength\n ? inputStr.substring(0, maxToolInputLength) + '...'\n : inputStr\n terminalLog(chalk.dim(` [${index}] ${toolName}: ${displayInput}`))\n })\n }\n\n terminalLog(\n ` Stop Reason: ${context.response.stop_reason || context.response.finish_reason || 'unknown'}`,\n )\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n}\n\nexport function logSystemPromptConstruction(construction: {\n basePrompt: string\n kodeContext?: string\n reminders: string[]\n finalPrompt: string\n}) {\n if (!isDebugMode()) return\n\n terminalLog('\\n' + chalk.yellow('\uD83D\uDCDD SYSTEM PROMPT CONSTRUCTION'))\n terminalLog(` Base Prompt: ${construction.basePrompt.length} chars`)\n\n if (construction.kodeContext) {\n terminalLog(` + Kode Context: ${construction.kodeContext.length} chars`)\n }\n\n if (construction.reminders.length > 0) {\n terminalLog(\n ` + Dynamic Reminders: ${construction.reminders.length} items`,\n )\n construction.reminders.forEach((reminder, index) => {\n terminalLog(chalk.dim(` [${index}] ${reminder.substring(0, 80)}...`))\n })\n }\n\n terminalLog(` = Final Length: ${construction.finalPrompt.length} chars`)\n}\n\nexport function logContextCompression(compression: {\n beforeMessages: number\n afterMessages: number\n trigger: string\n preservedFiles: string[]\n compressionRatio: number\n}) {\n if (!isDebugMode()) return\n\n terminalLog('\\n' + chalk.red('\uD83D\uDDDC\uFE0F CONTEXT COMPRESSION'))\n terminalLog(` Trigger: ${compression.trigger}`)\n terminalLog(\n ` Messages: ${compression.beforeMessages} \u2192 ${compression.afterMessages}`,\n )\n terminalLog(\n ` Compression Ratio: ${(compression.compressionRatio * 100).toFixed(1)}%`,\n )\n\n if (compression.preservedFiles.length > 0) {\n terminalLog(` Preserved Files: ${compression.preservedFiles.join(', ')}`)\n }\n}\n\nexport function logUserFriendly(type: string, data: any, requestId?: string) {\n if (!isDebugMode()) return\n\n const timestamp = new Date().toLocaleTimeString()\n let message = ''\n let color = chalk.gray\n let icon = '\u2022'\n\n switch (type) {\n case 'SESSION_START':\n icon = '\uD83D\uDE80'\n color = chalk.green\n message = `Session started with ${data.model || 'default model'}`\n break\n case 'QUERY_START':\n icon = '\uD83D\uDCAD'\n color = chalk.blue\n message = `Processing query: \"${data.query?.substring(0, 50)}${data.query?.length > 50 ? '...' : ''}\"`\n break\n case 'QUERY_PROGRESS':\n icon = '\u23F3'\n color = chalk.yellow\n message = `${data.phase} (${data.elapsed}ms)`\n break\n case 'QUERY_COMPLETE':\n icon = '\u2705'\n color = chalk.green\n message = `Query completed in ${data.duration}ms - Cost: $${data.cost} - ${data.tokens} tokens`\n break\n case 'TOOL_EXECUTION':\n icon = '\uD83D\uDD27'\n color = chalk.cyan\n message = `${data.toolName}: ${data.action} ${data.target ? '\u2192 ' + data.target : ''}`\n break\n case 'ERROR_OCCURRED':\n icon = '\u274C'\n color = chalk.red\n message = `${data.error} ${data.context ? '(' + data.context + ')' : ''}`\n break\n case 'PERFORMANCE_SUMMARY':\n icon = '\uD83D\uDCCA'\n color = chalk.magenta\n message = `Session: ${data.queries} queries, $${data.totalCost}, ${data.avgResponseTime}ms avg`\n break\n default:\n message = JSON.stringify(data)\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId.slice(0, 8)}]`) : ''\n terminalLog(`${color(`[${timestamp}]`)} ${icon} ${color(message)} ${reqId}`)\n}\n\nexport function initDebugLogger() {\n if (!isDebugMode()) return\n\n debug.info('DEBUG_LOGGER_INIT', {\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n })\n\n const terminalLevels = isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS).join(', ')\n : Array.from(TERMINAL_LOG_LEVELS).join(', ')\n\n terminalLog(\n chalk.dim(`[DEBUG] Terminal output filtered to: ${terminalLevels}`),\n )\n terminalLog(\n chalk.dim(`[DEBUG] Complete logs saved to: ${DEBUG_PATHS.base()}`),\n )\n if (!isDebugVerboseMode()) {\n terminalLog(\n chalk.dim(\n `[DEBUG] Use --debug-verbose for detailed system logs (FLOW, API, STATE)`,\n ),\n )\n }\n}\n\ninterface ErrorDiagnosis {\n errorType: string\n category:\n | 'NETWORK'\n | 'API'\n | 'PERMISSION'\n | 'CONFIG'\n | 'SYSTEM'\n | 'USER_INPUT'\n severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'\n description: string\n suggestions: string[]\n debugSteps: string[]\n relatedLogs?: string[]\n}\n\nexport function diagnoseError(error: any, context?: any): ErrorDiagnosis {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const errorStack = error instanceof Error ? error.stack : undefined\n\n if (\n errorMessage.includes('aborted') ||\n errorMessage.includes('AbortController')\n ) {\n return {\n errorType: 'REQUEST_ABORTED',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description:\n 'Request was aborted, often due to user cancellation or timeout',\n suggestions: [\n '\u68C0\u67E5\u662F\u5426\u6309\u4E0B\u4E86 ESC \u952E\u53D6\u6D88\u8BF7\u6C42',\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u7A33\u5B9A',\n '\u9A8C\u8BC1 AbortController \u72B6\u6001: isActive \u548C signal.aborted \u5E94\u8BE5\u4E00\u81F4',\n '\u67E5\u770B\u662F\u5426\u6709\u91CD\u590D\u7684\u8BF7\u6C42\u5BFC\u81F4\u51B2\u7A81',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u6A21\u5F0F\u67E5\u770B\u8BE6\u7EC6\u7684\u8BF7\u6C42\u6D41\u7A0B',\n '\u68C0\u67E5 debug \u65E5\u5FD7\u4E2D\u7684 BINARY_FEEDBACK_* \u4E8B\u4EF6',\n '\u9A8C\u8BC1 REQUEST_START \u548C REQUEST_END \u65E5\u5FD7\u914D\u5BF9',\n '\u67E5\u770B QUERY_ABORTED \u4E8B\u4EF6\u7684\u89E6\u53D1\u539F\u56E0',\n ],\n }\n }\n\n if (\n errorMessage.includes('api-key') ||\n errorMessage.includes('authentication') ||\n errorMessage.includes('401')\n ) {\n return {\n errorType: 'API_AUTHENTICATION',\n category: 'API',\n severity: 'HIGH',\n description: 'API authentication failed - invalid or missing API key',\n suggestions: [\n '\u8FD0\u884C /login \u91CD\u65B0\u8BBE\u7F6E API \u5BC6\u94A5',\n '\u68C0\u67E5 ~/.kode/ \u914D\u7F6E\u6587\u4EF6\u4E2D\u7684 API \u5BC6\u94A5',\n '\u9A8C\u8BC1 API \u5BC6\u94A5\u662F\u5426\u5DF2\u8FC7\u671F\u6216\u88AB\u64A4\u9500',\n '\u786E\u8BA4\u4F7F\u7528\u7684 provider \u8BBE\u7F6E\u6B63\u786E (anthropic/opendev/bigdream)',\n ],\n debugSteps: [\n '\u68C0\u67E5 CONFIG_LOAD \u65E5\u5FD7\u4E2D\u7684 provider \u548C API \u5BC6\u94A5\u72B6\u6001',\n '\u8FD0\u884C kode doctor \u68C0\u67E5\u7CFB\u7EDF\u5065\u5EB7\u72B6\u6001',\n '\u67E5\u770B API_ERROR \u65E5\u5FD7\u4E86\u89E3\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 kode config \u547D\u4EE4\u67E5\u770B\u5F53\u524D\u914D\u7F6E',\n ],\n }\n }\n\n if (\n errorMessage.includes('ECONNREFUSED') ||\n errorMessage.includes('ENOTFOUND') ||\n errorMessage.includes('timeout')\n ) {\n return {\n errorType: 'NETWORK_CONNECTION',\n category: 'NETWORK',\n severity: 'HIGH',\n description: 'Network connection failed - unable to reach API endpoint',\n suggestions: [\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38',\n '\u786E\u8BA4\u9632\u706B\u5899\u6CA1\u6709\u963B\u6B62\u76F8\u5173\u7AEF\u53E3',\n '\u68C0\u67E5 proxy \u8BBE\u7F6E\u662F\u5426\u6B63\u786E',\n '\u5C1D\u8BD5\u5207\u6362\u5230\u4E0D\u540C\u7684\u7F51\u7EDC\u73AF\u5883',\n '\u9A8C\u8BC1 baseURL \u914D\u7F6E\u662F\u5426\u6B63\u786E',\n ],\n debugSteps: [\n '\u68C0\u67E5 API_REQUEST_START \u548C\u76F8\u5173\u7F51\u7EDC\u65E5\u5FD7',\n '\u67E5\u770B LLM_REQUEST_ERROR \u4E2D\u7684\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 ping \u6216 curl \u6D4B\u8BD5 API \u7AEF\u70B9\u8FDE\u901A\u6027',\n '\u68C0\u67E5\u4F01\u4E1A\u7F51\u7EDC\u662F\u5426\u9700\u8981\u4EE3\u7406\u8BBE\u7F6E',\n ],\n }\n }\n\n if (\n errorMessage.includes('permission') ||\n errorMessage.includes('EACCES') ||\n errorMessage.includes('denied')\n ) {\n return {\n errorType: 'PERMISSION_DENIED',\n category: 'PERMISSION',\n severity: 'MEDIUM',\n description: 'Permission denied - insufficient access rights',\n suggestions: [\n '\u68C0\u67E5\u6587\u4EF6\u548C\u76EE\u5F55\u7684\u8BFB\u5199\u6743\u9650',\n '\u786E\u8BA4\u5F53\u524D\u7528\u6237\u6709\u8DB3\u591F\u7684\u7CFB\u7EDF\u6743\u9650',\n '\u67E5\u770B\u662F\u5426\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C',\n '\u68C0\u67E5\u5DE5\u5177\u6743\u9650\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B PERMISSION_* \u65E5\u5FD7\u4E86\u89E3\u6743\u9650\u68C0\u67E5\u8FC7\u7A0B',\n '\u68C0\u67E5\u6587\u4EF6\u7CFB\u7EDF\u6743\u9650: ls -la',\n '\u9A8C\u8BC1\u5DE5\u5177\u5BA1\u6279\u72B6\u6001',\n '\u67E5\u770B TOOL_* \u76F8\u5173\u7684\u8C03\u8BD5\u65E5\u5FD7',\n ],\n }\n }\n\n if (\n errorMessage.includes('substring is not a function') ||\n errorMessage.includes('content')\n ) {\n return {\n errorType: 'RESPONSE_FORMAT',\n category: 'API',\n severity: 'MEDIUM',\n description: 'LLM response format mismatch between different providers',\n suggestions: [\n '\u68C0\u67E5\u5F53\u524D\u4F7F\u7528\u7684 provider \u662F\u5426\u4E0E\u671F\u671B\u4E00\u81F4',\n '\u9A8C\u8BC1\u54CD\u5E94\u683C\u5F0F\u5904\u7406\u903B\u8F91',\n '\u786E\u8BA4\u4E0D\u540C provider \u7684\u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u68C0\u67E5\u662F\u5426\u9700\u8981\u66F4\u65B0\u54CD\u5E94\u89E3\u6790\u4EE3\u7801',\n ],\n debugSteps: [\n '\u67E5\u770B LLM_CALL_DEBUG \u4E2D\u7684\u54CD\u5E94\u683C\u5F0F',\n '\u68C0\u67E5 provider \u914D\u7F6E\u548C\u5B9E\u9645\u4F7F\u7528\u7684 API',\n '\u5BF9\u6BD4 Anthropic \u548C OpenAI \u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u9A8C\u8BC1 logLLMInteraction \u51FD\u6570\u7684\u683C\u5F0F\u5904\u7406',\n ],\n }\n }\n\n if (\n errorMessage.includes('too long') ||\n errorMessage.includes('context') ||\n errorMessage.includes('token')\n ) {\n return {\n errorType: 'CONTEXT_OVERFLOW',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: 'Context window exceeded - conversation too long',\n suggestions: [\n '\u8FD0\u884C /compact \u624B\u52A8\u538B\u7F29\u5BF9\u8BDD\u5386\u53F2',\n '\u68C0\u67E5\u81EA\u52A8\u538B\u7F29\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n '\u51CF\u5C11\u5355\u6B21\u8F93\u5165\u7684\u5185\u5BB9\u957F\u5EA6',\n '\u6E05\u7406\u4E0D\u5FC5\u8981\u7684\u4E0A\u4E0B\u6587\u4FE1\u606F',\n ],\n debugSteps: [\n '\u67E5\u770B AUTO_COMPACT_* \u65E5\u5FD7\u68C0\u67E5\u538B\u7F29\u89E6\u53D1',\n '\u68C0\u67E5 token \u4F7F\u7528\u91CF\u548C\u9608\u503C',\n '\u67E5\u770B CONTEXT_COMPRESSION \u76F8\u5173\u65E5\u5FD7',\n '\u9A8C\u8BC1\u6A21\u578B\u7684\u6700\u5927 token \u9650\u5236',\n ],\n }\n }\n\n if (\n errorMessage.includes('config') ||\n (errorMessage.includes('undefined') && context?.configRelated)\n ) {\n return {\n errorType: 'CONFIGURATION',\n category: 'CONFIG',\n severity: 'MEDIUM',\n description: 'Configuration error - missing or invalid settings',\n suggestions: [\n '\u8FD0\u884C kode config \u68C0\u67E5\u914D\u7F6E\u8BBE\u7F6E',\n '\u5220\u9664\u635F\u574F\u7684\u914D\u7F6E\u6587\u4EF6\u91CD\u65B0\u521D\u59CB\u5316',\n '\u68C0\u67E5 JSON \u914D\u7F6E\u6587\u4EF6\u8BED\u6CD5\u662F\u5426\u6B63\u786E',\n '\u9A8C\u8BC1\u73AF\u5883\u53D8\u91CF\u8BBE\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B CONFIG_LOAD \u548C CONFIG_SAVE \u65E5\u5FD7',\n '\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650',\n '\u9A8C\u8BC1 JSON \u683C\u5F0F: cat ~/.kode/config.json | jq',\n '\u67E5\u770B\u914D\u7F6E\u7F13\u5B58\u76F8\u5173\u7684\u8C03\u8BD5\u4FE1\u606F',\n ],\n }\n }\n\n return {\n errorType: 'UNKNOWN',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: `Unexpected error: ${errorMessage}`,\n suggestions: [\n '\u91CD\u65B0\u542F\u52A8\u5E94\u7528\u7A0B\u5E8F',\n '\u68C0\u67E5\u7CFB\u7EDF\u8D44\u6E90\u662F\u5426\u5145\u8DB3',\n '\u67E5\u770B\u5B8C\u6574\u7684\u9519\u8BEF\u65E5\u5FD7\u83B7\u53D6\u66F4\u591A\u4FE1\u606F',\n '\u5982\u679C\u95EE\u9898\u6301\u7EED\uFF0C\u8BF7\u62A5\u544A\u6B64\u9519\u8BEF',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u83B7\u53D6\u8BE6\u7EC6\u65E5\u5FD7',\n '\u68C0\u67E5 error.log \u4E2D\u7684\u5B8C\u6574\u9519\u8BEF\u4FE1\u606F',\n '\u67E5\u770B\u7CFB\u7EDF\u8D44\u6E90\u4F7F\u7528\u60C5\u51B5',\n '\u6536\u96C6\u91CD\u73B0\u6B65\u9AA4\u548C\u73AF\u5883\u4FE1\u606F',\n ],\n relatedLogs: errorStack ? [errorStack] : undefined,\n }\n}\n\nexport function logErrorWithDiagnosis(\n error: any,\n context?: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n const diagnosis = diagnoseError(error, context)\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n debug.error(\n 'ERROR_OCCURRED',\n {\n error: errorMessage,\n errorType: diagnosis.errorType,\n category: diagnosis.category,\n severity: diagnosis.severity,\n context,\n },\n requestId,\n )\n\n terminalLog('\\n' + chalk.red('\uD83D\uDEA8 ERROR DIAGNOSIS'))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n\n terminalLog(chalk.red(`\u274C ${diagnosis.errorType}`))\n terminalLog(\n chalk.dim(\n `Category: ${diagnosis.category} | Severity: ${diagnosis.severity}`,\n ),\n )\n terminalLog(`\\n${diagnosis.description}`)\n\n terminalLog(chalk.yellow('\\n\uD83D\uDCA1 Recovery Suggestions:'))\n diagnosis.suggestions.forEach((suggestion, index) => {\n terminalLog(` ${index + 1}. ${suggestion}`)\n })\n\n terminalLog(chalk.cyan('\\n\uD83D\uDD0D Debug Steps:'))\n diagnosis.debugSteps.forEach((step, index) => {\n terminalLog(` ${index + 1}. ${step}`)\n })\n\n if (diagnosis.relatedLogs && diagnosis.relatedLogs.length > 0) {\n terminalLog(chalk.magenta('\\n\uD83D\uDCCB Related Information:'))\n diagnosis.relatedLogs.forEach((log, index) => {\n const truncatedLog =\n log.length > 200 ? log.substring(0, 200) + '...' : log\n terminalLog(chalk.dim(` ${truncatedLog}`))\n })\n }\n\n const debugPath = DEBUG_PATHS.base()\n terminalLog(chalk.gray(`\\n\uD83D\uDCC1 Complete logs: ${debugPath}`))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n}\nexport function getDebugInfo() {\n return {\n isDebugMode: isDebugMode(),\n isVerboseMode: isVerboseMode(),\n isDebugVerboseMode: isDebugVerboseMode(),\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n currentRequest: currentRequest?.id,\n activeRequests: Array.from(activeRequests.keys()),\n terminalLogLevels: isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS)\n : Array.from(TERMINAL_LOG_LEVELS),\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["toolCalls"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/types/toolPermissionContext.ts"],
4
- "sourcesContent": ["import type { PermissionMode } from './permissionMode'\n\n\nexport type ToolPermissionUpdateDestination =\n | 'session'\n | 'localSettings'\n | 'userSettings'\n | 'projectSettings'\n | 'flagSettings'\n | 'policySettings'\n | 'cliArg'\n | 'command'\n\nexport type ToolPermissionRuleBehavior = 'allow' | 'deny' | 'ask'\n\nexport type AdditionalWorkingDirectoryEntry = {\n path: string\n source: ToolPermissionUpdateDestination\n}\n\nexport type ToolPermissionContext = {\n mode: PermissionMode\n additionalWorkingDirectories: Map<string, AdditionalWorkingDirectoryEntry>\n alwaysAllowRules: Partial<Record<ToolPermissionUpdateDestination, string[]>>\n alwaysDenyRules: Partial<Record<ToolPermissionUpdateDestination, string[]>>\n alwaysAskRules: Partial<Record<ToolPermissionUpdateDestination, string[]>>\n isBypassPermissionsModeAvailable: boolean\n}\n\nexport type ToolPermissionContextUpdate =\n | {\n type: 'setMode'\n mode: PermissionMode\n destination: ToolPermissionUpdateDestination\n }\n | {\n type: 'addRules'\n destination: ToolPermissionUpdateDestination\n behavior: ToolPermissionRuleBehavior\n rules: string[]\n }\n | {\n type: 'replaceRules'\n destination: ToolPermissionUpdateDestination\n behavior: ToolPermissionRuleBehavior\n rules: string[]\n }\n | {\n type: 'removeRules'\n destination: ToolPermissionUpdateDestination\n behavior: ToolPermissionRuleBehavior\n rules: string[]\n }\n | {\n type: 'addDirectories'\n destination: ToolPermissionUpdateDestination\n directories: string[]\n }\n | {\n type: 'removeDirectories'\n destination: ToolPermissionUpdateDestination\n directories: string[]\n }\n\nexport function createDefaultToolPermissionContext(options?: {\n isBypassPermissionsModeAvailable?: boolean\n}): ToolPermissionContext {\n return {\n mode: 'default',\n additionalWorkingDirectories: new Map(),\n alwaysAllowRules: {},\n alwaysDenyRules: {},\n alwaysAskRules: {},\n isBypassPermissionsModeAvailable:\n options?.isBypassPermissionsModeAvailable ?? false,\n }\n}\n\nexport function applyToolPermissionContextUpdate(\n context: ToolPermissionContext,\n update: ToolPermissionContextUpdate,\n): ToolPermissionContext {\n switch (update.type) {\n case 'setMode':\n return { ...context, mode: update.mode }\n case 'addRules': {\n const key =\n update.behavior === 'allow'\n ? 'alwaysAllowRules'\n : update.behavior === 'deny'\n ? 'alwaysDenyRules'\n : 'alwaysAskRules'\n const existing = context[key][update.destination] ?? []\n return {\n ...context,\n [key]: {\n ...context[key],\n [update.destination]: [...existing, ...update.rules],\n },\n }\n }\n case 'replaceRules': {\n const key =\n update.behavior === 'allow'\n ? 'alwaysAllowRules'\n : update.behavior === 'deny'\n ? 'alwaysDenyRules'\n : 'alwaysAskRules'\n return {\n ...context,\n [key]: {\n ...context[key],\n [update.destination]: [...update.rules],\n },\n }\n }\n case 'removeRules': {\n const key =\n update.behavior === 'allow'\n ? 'alwaysAllowRules'\n : update.behavior === 'deny'\n ? 'alwaysDenyRules'\n : 'alwaysAskRules'\n const current = context[key][update.destination] ?? []\n const toRemove = new Set(update.rules)\n const next = current.filter(rule => !toRemove.has(rule))\n return {\n ...context,\n [key]: {\n ...context[key],\n [update.destination]: next,\n },\n }\n }\n case 'addDirectories': {\n const nextDirs = new Map(context.additionalWorkingDirectories)\n for (const dir of update.directories) {\n nextDirs.set(dir, { path: dir, source: update.destination })\n }\n return { ...context, additionalWorkingDirectories: nextDirs }\n }\n case 'removeDirectories': {\n const nextDirs = new Map(context.additionalWorkingDirectories)\n for (const dir of update.directories) {\n nextDirs.delete(dir)\n }\n return { ...context, additionalWorkingDirectories: nextDirs }\n }\n default:\n return context\n }\n}\n\nexport function applyToolPermissionContextUpdates(\n context: ToolPermissionContext,\n updates: ToolPermissionContextUpdate[],\n): ToolPermissionContext {\n let next = context\n for (const update of updates) {\n next = applyToolPermissionContextUpdate(next, update)\n }\n return next\n}\n\nexport function isPersistableToolPermissionDestination(\n destination: ToolPermissionUpdateDestination,\n): destination is 'localSettings' | 'userSettings' | 'projectSettings' {\n return (\n destination === 'localSettings' ||\n destination === 'userSettings' ||\n destination === 'projectSettings'\n )\n}\n\nexport function canUserModifyToolPermissionUpdate(\n update: ToolPermissionContextUpdate,\n): boolean {\n if (update.destination !== 'policySettings') return true\n if (update.type === 'removeRules') return false\n if (update.type === 'replaceRules') return false\n if (update.type === 'removeDirectories') return false\n return true\n}\n"],
5
- "mappings": ";;;;AAgEO,SAAS,mCAAmC,SAEzB;AACxB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,8BAA8B,oBAAI,IAAI;AAAA,IACtC,kBAAkB,CAAC;AAAA,IACnB,iBAAiB,CAAC;AAAA,IAClB,gBAAgB,CAAC;AAAA,IACjB,kCACE,SAAS,oCAAoC;AAAA,EACjD;AACF;AAEO,SAAS,iCACd,SACA,QACuB;AACvB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,MAAM,OAAO,KAAK;AAAA,IACzC,KAAK,YAAY;AACf,YAAM,MACJ,OAAO,aAAa,UAChB,qBACA,OAAO,aAAa,SAClB,oBACA;AACR,YAAM,WAAW,QAAQ,GAAG,EAAE,OAAO,WAAW,KAAK,CAAC;AACtD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,UACL,GAAG,QAAQ,GAAG;AAAA,UACd,CAAC,OAAO,WAAW,GAAG,CAAC,GAAG,UAAU,GAAG,OAAO,KAAK;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,MACJ,OAAO,aAAa,UAChB,qBACA,OAAO,aAAa,SAClB,oBACA;AACR,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,UACL,GAAG,QAAQ,GAAG;AAAA,UACd,CAAC,OAAO,WAAW,GAAG,CAAC,GAAG,OAAO,KAAK;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,MACJ,OAAO,aAAa,UAChB,qBACA,OAAO,aAAa,SAClB,oBACA;AACR,YAAM,UAAU,QAAQ,GAAG,EAAE,OAAO,WAAW,KAAK,CAAC;AACrD,YAAM,WAAW,IAAI,IAAI,OAAO,KAAK;AACrC,YAAM,OAAO,QAAQ,OAAO,UAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;AACvD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,UACL,GAAG,QAAQ,GAAG;AAAA,UACd,CAAC,OAAO,WAAW,GAAG;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAM,WAAW,IAAI,IAAI,QAAQ,4BAA4B;AAC7D,iBAAW,OAAO,OAAO,aAAa;AACpC,iBAAS,IAAI,KAAK,EAAE,MAAM,KAAK,QAAQ,OAAO,YAAY,CAAC;AAAA,MAC7D;AACA,aAAO,EAAE,GAAG,SAAS,8BAA8B,SAAS;AAAA,IAC9D;AAAA,IACA,KAAK,qBAAqB;AACxB,YAAM,WAAW,IAAI,IAAI,QAAQ,4BAA4B;AAC7D,iBAAW,OAAO,OAAO,aAAa;AACpC,iBAAS,OAAO,GAAG;AAAA,MACrB;AACA,aAAO,EAAE,GAAG,SAAS,8BAA8B,SAAS;AAAA,IAC9D;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,kCACd,SACA,SACuB;AACvB,MAAI,OAAO;AACX,aAAW,UAAU,SAAS;AAC5B,WAAO,iCAAiC,MAAM,MAAM;AAAA,EACtD;AACA,SAAO;AACT;AAEO,SAAS,uCACd,aACqE;AACrE,SACE,gBAAgB,mBAChB,gBAAgB,kBAChB,gBAAgB;AAEpB;AAEO,SAAS,kCACd,QACS;AACT,MAAI,OAAO,gBAAgB,iBAAkB,QAAO;AACpD,MAAI,OAAO,SAAS,cAAe,QAAO;AAC1C,MAAI,OAAO,SAAS,eAAgB,QAAO;AAC3C,MAAI,OAAO,SAAS,oBAAqB,QAAO;AAChD,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/theme/index.ts"],
4
- "sourcesContent": ["import { getGlobalConfig } from '@utils/config'\n\nexport interface Theme {\n bashBorder: string\n kode: string\n noting: string\n notingBorder: string\n permission: string\n autoAccept: string\n planMode: string\n secondaryBorder: string\n inputBorder: string\n text: string\n secondaryText: string\n suggestion: string\n success: string\n error: string\n warning: string\n primary: string\n secondary: string\n diff: {\n added: string\n removed: string\n addedDimmed: string\n removedDimmed: string\n }\n}\n\nconst lightTheme: Theme = {\n bashBorder: '#FF6E57',\n kode: '#FFC233',\n noting: '#222222',\n notingBorder: '#10b981',\n permission: '#e9c61aff',\n autoAccept: '#8700ff',\n planMode: '#006666',\n secondaryBorder: '#999',\n inputBorder: '#a5b4fc',\n text: '#000',\n secondaryText: '#666',\n suggestion: '#32e98aff',\n success: '#2c7a39',\n error: '#ab2b3f',\n warning: '#966c1e',\n primary: '#000',\n secondary: '#666',\n diff: {\n added: '#69db7c',\n removed: '#ffa8b4',\n addedDimmed: '#c7e1cb',\n removedDimmed: '#fdd2d8',\n },\n}\n\nconst lightDaltonizedTheme: Theme = {\n bashBorder: '#FF6E57',\n kode: '#FFC233',\n noting: '#222222',\n notingBorder: '#059669',\n permission: '#3366ff',\n autoAccept: '#8700ff',\n planMode: '#006666',\n secondaryBorder: '#999',\n inputBorder: '#93a5f5',\n text: '#000',\n secondaryText: '#666',\n suggestion: '#3366ff',\n success: '#006699',\n error: '#cc0000',\n warning: '#ff9900',\n primary: '#000',\n secondary: '#666',\n diff: {\n added: '#99ccff',\n removed: '#ffcccc',\n addedDimmed: '#d1e7fd',\n removedDimmed: '#ffe9e9',\n },\n}\n\nconst darkTheme: Theme = {\n bashBorder: '#FF6E57',\n kode: '#FFC233',\n noting: '#222222',\n notingBorder: '#34d399',\n permission: '#b1b9f9',\n autoAccept: '#af87ff',\n planMode: '#48968c',\n secondaryBorder: '#888',\n inputBorder: '#818cf8',\n text: '#fff',\n secondaryText: '#999',\n suggestion: '#b1b9f9',\n success: '#4eba65',\n error: '#ff6b80',\n warning: '#ffc107',\n primary: '#fff',\n secondary: '#999',\n diff: {\n added: '#225c2b',\n removed: '#7a2936',\n addedDimmed: '#47584a',\n removedDimmed: '#69484d',\n },\n}\n\nconst darkDaltonizedTheme: Theme = {\n bashBorder: '#FF6E57',\n kode: '#FFC233',\n noting: '#222222',\n notingBorder: '#10b981',\n permission: '#99ccff',\n autoAccept: '#af87ff',\n planMode: '#48968c',\n secondaryBorder: '#888',\n inputBorder: '#7c8ff5',\n text: '#fff',\n secondaryText: '#999',\n suggestion: '#99ccff',\n success: '#3399ff',\n error: '#ff6666',\n warning: '#ffcc00',\n primary: '#fff',\n secondary: '#999',\n diff: {\n added: '#004466',\n removed: '#660000',\n addedDimmed: '#3e515b',\n removedDimmed: '#3e2c2c',\n },\n}\n\nexport type ThemeNames =\n | 'dark'\n | 'light'\n | 'light-daltonized'\n | 'dark-daltonized'\n\nexport function getTheme(overrideTheme?: ThemeNames): Theme {\n const config = getGlobalConfig()\n switch (overrideTheme ?? config.theme) {\n case 'light':\n return lightTheme\n case 'light-daltonized':\n return lightDaltonizedTheme\n case 'dark-daltonized':\n return darkDaltonizedTheme\n default:\n return darkTheme\n }\n}\n"],
5
- "mappings": ";;;;;;;AA4BA,IAAM,aAAoB;AAAA,EACxB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AACF;AAEA,IAAM,uBAA8B;AAAA,EAClC,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AACF;AAEA,IAAM,YAAmB;AAAA,EACvB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AACF;AAEA,IAAM,sBAA6B;AAAA,EACjC,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AACF;AAQO,SAAS,SAAS,eAAmC;AAC1D,QAAM,SAAS,gBAAgB;AAC/B,UAAQ,iBAAiB,OAAO,OAAO;AAAA,IACrC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/services/plugins/customCommands.ts"],
4
- "sourcesContent": ["import { existsSync, readFileSync, readdirSync, statSync } from 'fs'\nimport { basename, dirname, join, relative, resolve, sep } from 'path'\nimport { homedir } from 'os'\nimport { memoize } from 'lodash-es'\nimport type { MessageParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { Command } from '@commands'\nimport { getCwd } from '@utils/state'\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\nimport { getKodeBaseDir } from '@utils/config/env'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\nimport { execFile } from 'child_process'\nimport { promisify } from 'util'\nimport matter from 'gray-matter'\nimport yaml from 'js-yaml'\n\nconst execFileAsync = promisify(execFile)\n\nexport async function executeBashCommands(content: string): Promise<string> {\n const bashCommandRegex = /!\\`([^`]+)\\`/g\n const matches = [...content.matchAll(bashCommandRegex)]\n\n if (matches.length === 0) {\n return content\n }\n\n let result = content\n\n for (const match of matches) {\n const fullMatch = match[0]\n const command = match[1].trim()\n\n try {\n const parts = command.split(/\\s+/)\n const cmd = parts[0]\n const args = parts.slice(1)\n\n const { stdout, stderr } = await execFileAsync(cmd, args, {\n timeout: 5000,\n encoding: 'utf8',\n cwd: getCwd(),\n })\n\n const output = stdout.trim() || stderr.trim() || '(no output)'\n result = result.replace(fullMatch, output)\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMAND_BASH_EXEC_FAILED', {\n command,\n error: error instanceof Error ? error.message : String(error),\n })\n result = result.replace(fullMatch, `(error executing: ${command})`)\n }\n }\n\n return result\n}\n\nexport async function resolveFileReferences(content: string): Promise<string> {\n const fileRefRegex = /@([a-zA-Z0-9/._-]+(?:\\.[a-zA-Z0-9]+)?)/g\n const matches = [...content.matchAll(fileRefRegex)]\n\n if (matches.length === 0) {\n return content\n }\n\n let result = content\n\n for (const match of matches) {\n const fullMatch = match[0]\n const filePath = match[1]\n\n if (filePath.startsWith('agent-')) {\n continue\n }\n\n try {\n const fullPath = join(getCwd(), filePath)\n\n if (existsSync(fullPath)) {\n const fileContent = readFileSync(fullPath, { encoding: 'utf-8' })\n\n const formattedContent = `\\n\\n## File: ${filePath}\\n\\`\\`\\`\\n${fileContent}\\n\\`\\`\\`\\n`\n result = result.replace(fullMatch, formattedContent)\n } else {\n result = result.replace(fullMatch, `(file not found: ${filePath})`)\n }\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMAND_FILE_READ_FAILED', {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n result = result.replace(fullMatch, `(error reading: ${filePath})`)\n }\n }\n\n return result\n}\n\nexport interface CustomCommandFrontmatter {\n description?: string\n 'allowed-tools'?: string[]\n 'argument-hint'?: string\n when_to_use?: string\n version?: string\n model?: string\n maxThinkingTokens?: number | string\n max_thinking_tokens?: number | string\n 'max-thinking-tokens'?: number | string\n name?: string\n 'disable-model-invocation'?: boolean | string\n}\n\nexport interface CustomCommandWithScope {\n type: 'prompt'\n name: string\n description: string\n isEnabled: boolean\n isHidden: boolean\n aliases?: string[]\n progressMessage: string\n userFacingName(): string\n getPromptForCommand(args: string): Promise<MessageParam[]>\n allowedTools?: string[]\n maxThinkingTokens?: number\n argumentHint?: string\n whenToUse?: string\n version?: string\n model?: string\n isSkill?: boolean\n disableModelInvocation?: boolean\n hasUserSpecifiedDescription?: boolean\n source?: 'localSettings' | 'userSettings' | 'pluginDir'\n scope?: 'user' | 'project'\n filePath?: string\n}\n\nexport interface CustomCommandFile {\n frontmatter: CustomCommandFrontmatter\n content: string\n filePath: string\n}\n\nexport function parseFrontmatter(content: string): {\n frontmatter: CustomCommandFrontmatter\n content: string\n} {\n const yamlSchema = (yaml as any).JSON_SCHEMA\n const parsed = matter(content, {\n engines: {\n yaml: {\n parse: (input: string) =>\n yaml.load(input, yamlSchema ? { schema: yamlSchema } : undefined) ??\n {},\n },\n },\n })\n return {\n frontmatter: (parsed.data ?? {}) as CustomCommandFrontmatter,\n content: parsed.content ?? '',\n }\n}\n\ntype CommandSource = 'localSettings' | 'userSettings' | 'pluginDir'\n\nfunction isSkillMarkdownFile(filePath: string): boolean {\n return /^skill\\.md$/i.test(basename(filePath))\n}\n\nfunction getUserKodeBaseDir(): string {\n return getKodeBaseDir()\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (typeof value === 'string') {\n const normalized = value.trim().toLowerCase()\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\n }\n return false\n}\n\nfunction parseAllowedTools(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map(v => String(v).trim()).filter(Boolean)\n }\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (!trimmed) return []\n return trimmed\n .split(/\\s+/)\n .map(v => v.trim())\n .filter(Boolean)\n }\n return []\n}\n\nfunction parseMaxThinkingTokens(\n frontmatter: CustomCommandFrontmatter,\n): number | undefined {\n const raw =\n (frontmatter as any).maxThinkingTokens ??\n (frontmatter as any).max_thinking_tokens ??\n (frontmatter as any)['max-thinking-tokens'] ??\n (frontmatter as any)['max_thinking_tokens']\n if (raw === undefined || raw === null) return undefined\n const value = typeof raw === 'number' ? raw : Number(String(raw).trim())\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\n}\n\nfunction sourceLabel(source: CommandSource): string {\n if (source === 'localSettings') return 'project'\n if (source === 'userSettings') return 'user'\n if (source === 'pluginDir') return 'plugin'\n return 'unknown'\n}\n\nfunction extractDescriptionFromMarkdown(\n markdown: string,\n fallback: string,\n): string {\n const lines = markdown.split(/\\r?\\n/)\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n const heading = trimmed.match(/^#{1,6}\\s+(.*)$/)\n if (heading?.[1]) return heading[1].trim()\n return trimmed.length > 120 ? `${trimmed.slice(0, 117)}...` : trimmed\n }\n return fallback\n}\n\nfunction namespaceFromDirPath(dirPath: string, baseDir: string): string {\n const relPath = relative(baseDir, dirPath)\n if (!relPath || relPath === '.' || relPath.startsWith('..')) return ''\n return relPath.split(sep).join(':')\n}\n\nfunction nameForCommandFile(filePath: string, baseDir: string): string {\n if (isSkillMarkdownFile(filePath)) {\n const skillDir = dirname(filePath)\n const parentDir = dirname(skillDir)\n const skillName = basename(skillDir)\n const namespace = namespaceFromDirPath(parentDir, baseDir)\n return namespace ? `${namespace}:${skillName}` : skillName\n }\n\n const dir = dirname(filePath)\n const namespace = namespaceFromDirPath(dir, baseDir)\n const fileName = basename(filePath).replace(/\\.md$/i, '')\n return namespace ? `${namespace}:${fileName}` : fileName\n}\n\ntype CommandFileRecord = {\n baseDir: string\n filePath: string\n frontmatter: CustomCommandFrontmatter\n content: string\n source: CommandSource\n scope: 'user' | 'project'\n}\n\nfunction buildPluginQualifiedName(\n pluginName: string,\n localName: string,\n): string {\n const p = pluginName.trim()\n const l = localName.trim()\n if (!p) return l\n if (!l || l === p) return p\n return `${p}:${l}`\n}\n\nfunction nameForPluginCommandFile(\n filePath: string,\n commandsDir: string,\n pluginName: string,\n): string {\n const rel = relative(commandsDir, filePath)\n const noExt = rel.replace(/\\.md$/i, '')\n const localName = noExt.split(sep).filter(Boolean).join(':')\n return buildPluginQualifiedName(pluginName, localName)\n}\n\nfunction createPluginPromptCommandFromFile(record: {\n pluginName: string\n commandsDir: string\n filePath: string\n frontmatter: CustomCommandFrontmatter\n content: string\n}): CustomCommandWithScope | null {\n const name = nameForPluginCommandFile(\n record.filePath,\n record.commandsDir,\n record.pluginName,\n )\n if (!name) return null\n\n const descriptionText =\n record.frontmatter.description ??\n extractDescriptionFromMarkdown(record.content, 'Custom command')\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\n const argumentHint = record.frontmatter['argument-hint']\n const whenToUse = record.frontmatter.when_to_use\n const version = record.frontmatter.version\n const disableModelInvocation = toBoolean(\n record.frontmatter['disable-model-invocation'],\n )\n const model =\n record.frontmatter.model === 'inherit'\n ? undefined\n : record.frontmatter.model\n\n return {\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\n isEnabled: true,\n isHidden: false,\n filePath: record.filePath,\n aliases: [],\n progressMessage: 'running',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: false,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!record.frontmatter.description,\n source: 'pluginDir',\n scope: 'project',\n userFacingName() {\n return name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = record.content\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n }\n}\n\nfunction loadPluginCommandsFromDir(args: {\n pluginName: string\n commandsDir: string\n signal: AbortSignal\n}): CustomCommandWithScope[] {\n let commandsBaseDir = args.commandsDir\n let files: string[] = []\n try {\n const st = statSync(args.commandsDir)\n if (st.isFile()) {\n if (!args.commandsDir.toLowerCase().endsWith('.md')) return []\n files = [args.commandsDir]\n commandsBaseDir = dirname(args.commandsDir)\n } else if (st.isDirectory()) {\n files = listMarkdownFilesRecursively(args.commandsDir, args.signal)\n } else {\n return []\n }\n } catch {\n return []\n }\n\n const out: CustomCommandWithScope[] = []\n for (const filePath of files) {\n if (args.signal.aborted) break\n try {\n const raw = readFileSync(filePath, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n const cmd = createPluginPromptCommandFromFile({\n pluginName: args.pluginName,\n commandsDir: commandsBaseDir,\n filePath,\n frontmatter,\n content,\n })\n if (cmd) out.push(cmd)\n } catch {\n }\n }\n return out\n}\n\nfunction loadPluginSkillDirectoryCommandsFromBaseDir(args: {\n pluginName: string\n skillsDir: string\n}): CustomCommandWithScope[] {\n if (!existsSync(args.skillsDir)) return []\n\n const out: CustomCommandWithScope[] = []\n let entries\n try {\n entries = readdirSync(args.skillsDir, { withFileTypes: true })\n } catch {\n return []\n }\n\n const strictMode = toBoolean(process.env.KODE_SKILLS_STRICT)\n const validateName = (skillName: string): boolean => {\n if (skillName.length < 1 || skillName.length > 64) return false\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\n const skillDir = join(args.skillsDir, entry.name)\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) continue\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n\n const dirName = entry.name\n const declaredName =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n const effectiveDeclaredName =\n declaredName && declaredName === dirName ? declaredName : ''\n if (declaredName && declaredName !== dirName) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\n dirName,\n declaredName,\n skillFile,\n })\n }\n const name = buildPluginQualifiedName(args.pluginName, dirName)\n if (!validateName(dirName)) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { dirName, skillFile })\n }\n const descriptionText =\n frontmatter.description ??\n extractDescriptionFromMarkdown(content, 'Skill')\n if (strictMode) {\n const d =\n typeof frontmatter.description === 'string'\n ? frontmatter.description.trim()\n : ''\n if (!d || d.length > 1024) continue\n }\n\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\n const argumentHint = frontmatter['argument-hint']\n const whenToUse = frontmatter.when_to_use\n const version = frontmatter.version\n const disableModelInvocation = toBoolean(\n frontmatter['disable-model-invocation'],\n )\n const model =\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\n\n out.push({\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\n isEnabled: true,\n isHidden: true,\n aliases: [],\n filePath: skillFile,\n progressMessage: 'loading',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: true,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!frontmatter.description,\n source: 'pluginDir',\n scope: 'project',\n userFacingName() {\n return effectiveDeclaredName\n ? buildPluginQualifiedName(args.pluginName, effectiveDeclaredName)\n : name\n },\n async getPromptForCommand(argsText: string): Promise<MessageParam[]> {\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\n const trimmedArgs = argsText.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n })\n } catch {\n }\n }\n\n return out\n}\n\nfunction applySkillFilePreference(\n files: CommandFileRecord[],\n): CommandFileRecord[] {\n const grouped = new Map<string, CommandFileRecord[]>()\n for (const file of files) {\n const key = dirname(file.filePath)\n const existing = grouped.get(key) ?? []\n existing.push(file)\n grouped.set(key, existing)\n }\n\n const result: CommandFileRecord[] = []\n for (const group of grouped.values()) {\n const skillFiles = group.filter(f => isSkillMarkdownFile(f.filePath))\n if (skillFiles.length > 0) {\n result.push(skillFiles[0]!)\n continue\n }\n result.push(...group)\n }\n return result\n}\n\nfunction createPromptCommandFromFile(\n record: CommandFileRecord,\n): CustomCommandWithScope | null {\n const isSkill = isSkillMarkdownFile(record.filePath)\n const name = nameForCommandFile(record.filePath, record.baseDir)\n if (!name) return null\n\n const descriptionText =\n record.frontmatter.description ??\n extractDescriptionFromMarkdown(\n record.content,\n isSkill ? 'Skill' : 'Custom command',\n )\n\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\n const argumentHint = record.frontmatter['argument-hint']\n const whenToUse = record.frontmatter.when_to_use\n const version = record.frontmatter.version\n const disableModelInvocation = toBoolean(\n record.frontmatter['disable-model-invocation'],\n )\n const model =\n record.frontmatter.model === 'inherit'\n ? undefined\n : record.frontmatter.model\n\n const description = `${descriptionText} (${sourceLabel(record.source)})`\n const progressMessage = isSkill ? 'loading' : 'running'\n const skillBaseDir = isSkill ? dirname(record.filePath) : undefined\n\n return {\n type: 'prompt',\n name,\n description,\n isEnabled: true,\n isHidden: false,\n filePath: record.filePath,\n aliases: [],\n progressMessage,\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!record.frontmatter.description,\n source: record.source,\n scope: record.scope,\n userFacingName() {\n return name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = record.content\n if (isSkill && skillBaseDir) {\n prompt = `Base directory for this skill: ${skillBaseDir}\\n\\n${prompt}`\n }\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n }\n}\n\nfunction listMarkdownFilesRecursively(\n baseDir: string,\n signal: AbortSignal,\n): string[] {\n const results: string[] = []\n const queue: string[] = [baseDir]\n while (queue.length > 0) {\n if (signal.aborted) break\n const currentDir = queue.pop()!\n let entries\n try {\n entries = readdirSync(currentDir, { withFileTypes: true })\n } catch {\n continue\n }\n for (const entry of entries) {\n if (signal.aborted) break\n const fullPath = join(currentDir, entry.name)\n if (entry.isDirectory()) {\n queue.push(fullPath)\n continue\n }\n if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {\n results.push(fullPath)\n }\n }\n }\n return results\n}\n\nfunction loadCommandMarkdownFilesFromBaseDir(\n baseDir: string,\n source: CommandSource,\n scope: 'user' | 'project',\n signal: AbortSignal,\n): CommandFileRecord[] {\n if (!existsSync(baseDir)) return []\n const files = listMarkdownFilesRecursively(baseDir, signal)\n const records: CommandFileRecord[] = []\n for (const filePath of files) {\n if (signal.aborted) break\n try {\n const raw = readFileSync(filePath, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n records.push({ baseDir, filePath, frontmatter, content, source, scope })\n } catch {\n }\n }\n return records\n}\n\nfunction loadSkillDirectoryCommandsFromBaseDir(\n skillsDir: string,\n source: CommandSource,\n scope: 'user' | 'project',\n): CustomCommandWithScope[] {\n if (!existsSync(skillsDir)) return []\n\n const out: CustomCommandWithScope[] = []\n let entries\n try {\n entries = readdirSync(skillsDir, { withFileTypes: true })\n } catch {\n return []\n }\n\n const strictMode = toBoolean(process.env.KODE_SKILLS_STRICT)\n const validateName = (skillName: string): boolean => {\n if (skillName.length < 1 || skillName.length > 64) return false\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\n const skillDir = join(skillsDir, entry.name)\n const skillFileCandidates = [\n join(skillDir, 'SKILL.md'),\n join(skillDir, 'skill.md'),\n ]\n const skillFile = skillFileCandidates.find(p => existsSync(p))\n if (!skillFile) continue\n\n try {\n const raw = readFileSync(skillFile, 'utf8')\n const { frontmatter, content } = parseFrontmatter(raw)\n\n const dirName = entry.name\n const declaredName =\n typeof (frontmatter as any).name === 'string'\n ? String((frontmatter as any).name).trim()\n : ''\n const effectiveDeclaredName =\n declaredName && declaredName === dirName ? declaredName : ''\n if (declaredName && declaredName !== dirName) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\n dirName,\n declaredName,\n skillFile,\n })\n }\n const name = dirName\n if (!validateName(name)) {\n if (strictMode) continue\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { name, skillFile })\n }\n const descriptionText =\n frontmatter.description ??\n extractDescriptionFromMarkdown(content, 'Skill')\n if (strictMode) {\n const d =\n typeof frontmatter.description === 'string'\n ? frontmatter.description.trim()\n : ''\n if (!d || d.length > 1024) continue\n }\n\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\n const argumentHint = frontmatter['argument-hint']\n const whenToUse = frontmatter.when_to_use\n const version = frontmatter.version\n const disableModelInvocation = toBoolean(\n frontmatter['disable-model-invocation'],\n )\n const model =\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\n\n out.push({\n type: 'prompt',\n name,\n description: `${descriptionText} (${sourceLabel(source)})`,\n isEnabled: true,\n isHidden: true,\n aliases: [],\n filePath: skillFile,\n progressMessage: 'loading',\n allowedTools,\n maxThinkingTokens,\n argumentHint,\n whenToUse,\n version,\n model,\n isSkill: true,\n disableModelInvocation,\n hasUserSpecifiedDescription: !!frontmatter.description,\n source,\n scope,\n userFacingName() {\n return effectiveDeclaredName || name\n },\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\n const trimmedArgs = args.trim()\n if (trimmedArgs) {\n if (prompt.includes('$ARGUMENTS')) {\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\n } else {\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\n }\n }\n return [{ role: 'user', content: prompt }]\n },\n })\n } catch {\n }\n }\n\n return out\n}\n\nexport const loadCustomCommands = memoize(\n async (): Promise<CustomCommandWithScope[]> => {\n const cwd = getCwd()\n const userKodeBaseDir = getUserKodeBaseDir()\n const sessionPlugins = getSessionPlugins()\n\n const projectLegacyCommandsDir = join(cwd, '.claude', 'commands')\n const userLegacyCommandsDir = join(homedir(), '.claude', 'commands')\n const projectKodeCommandsDir = join(cwd, '.kode', 'commands')\n const userKodeCommandsDir = join(userKodeBaseDir, 'commands')\n\n const projectLegacySkillsDir = join(cwd, '.claude', 'skills')\n const userLegacySkillsDir = join(homedir(), '.claude', 'skills')\n const projectKodeSkillsDir = join(cwd, '.kode', 'skills')\n const userKodeSkillsDir = join(userKodeBaseDir, 'skills')\n\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), 3000)\n\n try {\n const commandFiles = applySkillFilePreference([\n ...loadCommandMarkdownFilesFromBaseDir(\n projectLegacyCommandsDir,\n 'localSettings',\n 'project',\n abortController.signal,\n ),\n ...loadCommandMarkdownFilesFromBaseDir(\n projectKodeCommandsDir,\n 'localSettings',\n 'project',\n abortController.signal,\n ),\n ...loadCommandMarkdownFilesFromBaseDir(\n userLegacyCommandsDir,\n 'userSettings',\n 'user',\n abortController.signal,\n ),\n ...loadCommandMarkdownFilesFromBaseDir(\n userKodeCommandsDir,\n 'userSettings',\n 'user',\n abortController.signal,\n ),\n ])\n\n const fileCommands = commandFiles\n .map(createPromptCommandFromFile)\n .filter((cmd): cmd is CustomCommandWithScope => cmd !== null)\n\n const skillDirCommands: CustomCommandWithScope[] = [\n ...loadSkillDirectoryCommandsFromBaseDir(\n projectLegacySkillsDir,\n 'localSettings',\n 'project',\n ),\n ...loadSkillDirectoryCommandsFromBaseDir(\n projectKodeSkillsDir,\n 'localSettings',\n 'project',\n ),\n ...loadSkillDirectoryCommandsFromBaseDir(\n userLegacySkillsDir,\n 'userSettings',\n 'user',\n ),\n ...loadSkillDirectoryCommandsFromBaseDir(\n userKodeSkillsDir,\n 'userSettings',\n 'user',\n ),\n ]\n\n const pluginCommands: CustomCommandWithScope[] = []\n if (sessionPlugins.length > 0) {\n for (const plugin of sessionPlugins) {\n for (const commandsDir of plugin.commandsDirs) {\n pluginCommands.push(\n ...loadPluginCommandsFromDir({\n pluginName: plugin.name,\n commandsDir,\n signal: abortController.signal,\n }),\n )\n }\n for (const skillsDir of plugin.skillsDirs) {\n pluginCommands.push(\n ...loadPluginSkillDirectoryCommandsFromBaseDir({\n pluginName: plugin.name,\n skillsDir,\n }),\n )\n }\n }\n }\n\n const ordered = [\n ...fileCommands,\n ...skillDirCommands,\n ...pluginCommands,\n ].filter(cmd => cmd.isEnabled)\n\n const seen = new Set<string>()\n const unique: CustomCommandWithScope[] = []\n for (const cmd of ordered) {\n const key = cmd.userFacingName()\n if (seen.has(key)) continue\n seen.add(key)\n unique.push(cmd)\n }\n\n return unique\n } catch (error) {\n logError(error)\n debugLogger.warn('CUSTOM_COMMANDS_LOAD_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return []\n } finally {\n clearTimeout(timeout)\n }\n },\n () => {\n const cwd = getCwd()\n const userKodeBaseDir = getUserKodeBaseDir()\n const dirs = [\n join(homedir(), '.claude', 'commands'),\n join(cwd, '.claude', 'commands'),\n join(userKodeBaseDir, 'commands'),\n join(cwd, '.kode', 'commands'),\n join(homedir(), '.claude', 'skills'),\n join(cwd, '.claude', 'skills'),\n join(userKodeBaseDir, 'skills'),\n join(cwd, '.kode', 'skills'),\n ]\n const exists = dirs.map(d => (existsSync(d) ? '1' : '0')).join('')\n return `${cwd}:${exists}:${Math.floor(Date.now() / 60000)}`\n },\n)\n\nexport const reloadCustomCommands = (): void => {\n loadCustomCommands.cache.clear()\n}\n\nexport function getCustomCommandDirectories(): {\n userClaudeCommands: string\n projectClaudeCommands: string\n userClaudeSkills: string\n projectClaudeSkills: string\n userKodeCommands: string\n projectKodeCommands: string\n userKodeSkills: string\n projectKodeSkills: string\n} {\n const userKodeBaseDir = getUserKodeBaseDir()\n return {\n userClaudeCommands: join(homedir(), '.claude', 'commands'),\n projectClaudeCommands: join(getCwd(), '.claude', 'commands'),\n userClaudeSkills: join(homedir(), '.claude', 'skills'),\n projectClaudeSkills: join(getCwd(), '.claude', 'skills'),\n userKodeCommands: join(userKodeBaseDir, 'commands'),\n projectKodeCommands: join(getCwd(), '.kode', 'commands'),\n userKodeSkills: join(userKodeBaseDir, 'skills'),\n projectKodeSkills: join(getCwd(), '.kode', 'skills'),\n }\n}\n\nexport function hasCustomCommands(): boolean {\n const dirs = getCustomCommandDirectories()\n return (\n existsSync(dirs.userClaudeCommands) ||\n existsSync(dirs.projectClaudeCommands) ||\n existsSync(dirs.userClaudeSkills) ||\n existsSync(dirs.projectClaudeSkills) ||\n existsSync(dirs.userKodeCommands) ||\n existsSync(dirs.projectKodeCommands) ||\n existsSync(dirs.userKodeSkills) ||\n existsSync(dirs.projectKodeSkills)\n )\n}\n"],
5
- "mappings": "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",
6
- "names": ["namespace"]
7
- }