@shareai-lab/kode 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +649 -25
  3. package/README.zh-CN.md +579 -0
  4. package/cli-acp.js +3 -17
  5. package/cli.js +5 -7
  6. package/dist/chunks/Doctor-M3J7GRTJ.js +12 -0
  7. package/dist/chunks/LogList-ISWZ6DDD.js +121 -0
  8. package/dist/chunks/LogList-ISWZ6DDD.js.map +7 -0
  9. package/dist/chunks/REPL-RQ6LO6S7.js +56 -0
  10. package/dist/chunks/ResumeConversation-6DMVBEGH.js +56 -0
  11. package/dist/chunks/agentLoader-FCRG3TFJ.js +31 -0
  12. package/dist/{agentsValidate-7LH4HTNR.js → chunks/agentsValidate-PEWMYN4Q.js} +97 -69
  13. package/dist/chunks/agentsValidate-PEWMYN4Q.js.map +7 -0
  14. package/dist/{ask-3NHFFUQG.js → chunks/ask-D7SOHJ6Z.js} +36 -44
  15. package/dist/chunks/ask-D7SOHJ6Z.js.map +7 -0
  16. package/dist/chunks/autoUpdater-CNESBOKO.js +19 -0
  17. package/dist/{chunk-AFFSCMYS.js → chunks/chunk-2JN5MY67.js} +12 -14
  18. package/dist/chunks/chunk-2JN5MY67.js.map +7 -0
  19. package/dist/chunks/chunk-2QONJ5MG.js +14 -0
  20. package/dist/chunks/chunk-2QONJ5MG.js.map +7 -0
  21. package/dist/chunks/chunk-2WEXPKHH.js +903 -0
  22. package/dist/chunks/chunk-2WEXPKHH.js.map +7 -0
  23. package/dist/{chunk-ARZSBOAO.js → chunks/chunk-3BYE3ME6.js} +717 -792
  24. package/dist/chunks/chunk-3BYE3ME6.js.map +7 -0
  25. package/dist/chunks/chunk-3JDNWX7W.js +1264 -0
  26. package/dist/chunks/chunk-3JDNWX7W.js.map +7 -0
  27. package/dist/chunks/chunk-3OEJVB5A.js +906 -0
  28. package/dist/chunks/chunk-3OEJVB5A.js.map +7 -0
  29. package/dist/chunks/chunk-3TNIOEBO.js +369 -0
  30. package/dist/chunks/chunk-3TNIOEBO.js.map +7 -0
  31. package/dist/chunks/chunk-4A46ZXMJ.js +67 -0
  32. package/dist/chunks/chunk-4A46ZXMJ.js.map +7 -0
  33. package/dist/{chunk-UHYRLID6.js → chunks/chunk-4ATBQOFO.js} +107 -55
  34. package/dist/chunks/chunk-4ATBQOFO.js.map +7 -0
  35. package/dist/chunks/chunk-4CRUCZR4.js +0 -0
  36. package/dist/{chunk-YC6LJCDE.js → chunks/chunk-4EO6SIQY.js} +32 -75
  37. package/dist/chunks/chunk-4EO6SIQY.js.map +7 -0
  38. package/dist/chunks/chunk-53M46S5I.js +64 -0
  39. package/dist/chunks/chunk-53M46S5I.js.map +7 -0
  40. package/dist/{chunk-JC6NCUG5.js → chunks/chunk-54KOYG5C.js} +0 -2
  41. package/dist/{chunk-EZXMVTDU.js → chunks/chunk-6BAS4WY6.js} +29 -45
  42. package/dist/chunks/chunk-6BAS4WY6.js.map +7 -0
  43. package/dist/{chunk-3IN27HA5.js → chunks/chunk-6KRRFSDN.js} +4 -6
  44. package/dist/chunks/chunk-6KRRFSDN.js.map +7 -0
  45. package/dist/chunks/chunk-6LJNZK4K.js +39 -0
  46. package/dist/chunks/chunk-6LJNZK4K.js.map +7 -0
  47. package/dist/chunks/chunk-6ZWEOSEI.js +666 -0
  48. package/dist/chunks/chunk-6ZWEOSEI.js.map +7 -0
  49. package/dist/chunks/chunk-77XDJMBP.js +3326 -0
  50. package/dist/chunks/chunk-77XDJMBP.js.map +7 -0
  51. package/dist/chunks/chunk-7RRW4NTB.js +6454 -0
  52. package/dist/chunks/chunk-7RRW4NTB.js.map +7 -0
  53. package/dist/chunks/chunk-7X3TW4JB.js +4520 -0
  54. package/dist/chunks/chunk-7X3TW4JB.js.map +7 -0
  55. package/dist/chunks/chunk-B3MW3YGY.js +1409 -0
  56. package/dist/chunks/chunk-B3MW3YGY.js.map +7 -0
  57. package/dist/chunks/chunk-BBJFHTBC.js +28 -0
  58. package/dist/chunks/chunk-BBJFHTBC.js.map +7 -0
  59. package/dist/chunks/chunk-BHDHXOXB.js +24 -0
  60. package/dist/chunks/chunk-BHDHXOXB.js.map +7 -0
  61. package/dist/{chunk-73WGVYLQ.js → chunks/chunk-BTA7SZ26.js} +152 -223
  62. package/dist/chunks/chunk-BTA7SZ26.js.map +7 -0
  63. package/dist/chunks/chunk-CDGRYGPZ.js +103 -0
  64. package/dist/chunks/chunk-CDGRYGPZ.js.map +7 -0
  65. package/dist/{chunk-S6HRABTA.js → chunks/chunk-CP6E5UG6.js} +1 -4
  66. package/dist/chunks/chunk-CP6E5UG6.js.map +7 -0
  67. package/dist/{chunk-QVLYOPO5.js → chunks/chunk-DQ4JHXMT.js} +462 -424
  68. package/dist/chunks/chunk-DQ4JHXMT.js.map +7 -0
  69. package/dist/chunks/chunk-DXD76CMV.js +208 -0
  70. package/dist/chunks/chunk-DXD76CMV.js.map +7 -0
  71. package/dist/chunks/chunk-GCQCAXJZ.js +0 -0
  72. package/dist/chunks/chunk-GELCZWMB.js +42 -0
  73. package/dist/chunks/chunk-GELCZWMB.js.map +7 -0
  74. package/dist/{chunk-K2CWOTI2.js → chunks/chunk-HJYOH4HC.js} +23 -18
  75. package/dist/chunks/chunk-HJYOH4HC.js.map +7 -0
  76. package/dist/chunks/chunk-HPYNW6TT.js +744 -0
  77. package/dist/chunks/chunk-HPYNW6TT.js.map +7 -0
  78. package/dist/{chunk-RZWOUA25.js → chunks/chunk-HRJ3ICQK.js} +59 -55
  79. package/dist/chunks/chunk-HRJ3ICQK.js.map +7 -0
  80. package/dist/{chunk-DZE5YA7L.js → chunks/chunk-IFCIADS3.js} +571 -573
  81. package/dist/chunks/chunk-IFCIADS3.js.map +7 -0
  82. package/dist/chunks/chunk-IN7XZ7BC.js +27 -0
  83. package/dist/chunks/chunk-IN7XZ7BC.js.map +7 -0
  84. package/dist/chunks/chunk-L7P4M4KW.js +193 -0
  85. package/dist/chunks/chunk-L7P4M4KW.js.map +7 -0
  86. package/dist/chunks/chunk-LB6TCPDI.js +0 -0
  87. package/dist/{chunk-3RUXVV4S.js → chunks/chunk-LOCXPQNJ.js} +1 -4
  88. package/dist/{chunk-3RUXVV4S.js.map → chunks/chunk-LOCXPQNJ.js.map} +2 -2
  89. package/dist/{chunk-7M2YN6TU.js → chunks/chunk-LOD5ZHCI.js} +213 -208
  90. package/dist/chunks/chunk-LOD5ZHCI.js.map +7 -0
  91. package/dist/{chunk-S3J2TLV6.js → chunks/chunk-M7P3QNRU.js} +1 -4
  92. package/dist/{chunk-S3J2TLV6.js.map → chunks/chunk-M7P3QNRU.js.map} +2 -2
  93. package/dist/chunks/chunk-PPHLQVL7.js +4234 -0
  94. package/dist/chunks/chunk-PPHLQVL7.js.map +7 -0
  95. package/dist/{chunk-ABLVTESJ.js → chunks/chunk-QAXE37B5.js} +1 -4
  96. package/dist/chunks/chunk-QAXE37B5.js.map +7 -0
  97. package/dist/chunks/chunk-QHQOBUF6.js +60 -0
  98. package/dist/chunks/chunk-QHQOBUF6.js.map +7 -0
  99. package/dist/{chunk-W7GRKO7Q.js → chunks/chunk-RPJXO7GG.js} +241 -214
  100. package/dist/chunks/chunk-RPJXO7GG.js.map +7 -0
  101. package/dist/{chunk-NPFOMITO.js → chunks/chunk-SWQV4KSY.js} +1 -4
  102. package/dist/{chunk-NPFOMITO.js.map → chunks/chunk-SWQV4KSY.js.map} +2 -2
  103. package/dist/chunks/chunk-SZLAPULP.js +28 -0
  104. package/dist/chunks/chunk-SZLAPULP.js.map +7 -0
  105. package/dist/{chunk-7U7L4NMD.js → chunks/chunk-T7RB5V5J.js} +23 -25
  106. package/dist/chunks/chunk-T7RB5V5J.js.map +7 -0
  107. package/dist/{chunk-HN4E4UUQ.js → chunks/chunk-TI2CTTMA.js} +25 -17
  108. package/dist/chunks/chunk-TI2CTTMA.js.map +7 -0
  109. package/dist/{chunk-ZVDRDPII.js → chunks/chunk-TNGVRTO5.js} +45 -20
  110. package/dist/chunks/chunk-TNGVRTO5.js.map +7 -0
  111. package/dist/chunks/chunk-TNWB3U5Y.js +2077 -0
  112. package/dist/chunks/chunk-TNWB3U5Y.js.map +7 -0
  113. package/dist/chunks/chunk-U2IHWPCU.js +12 -0
  114. package/dist/chunks/chunk-U2IHWPCU.js.map +7 -0
  115. package/dist/{chunk-KAA5BGMQ.js → chunks/chunk-UNOY3VJ2.js} +1 -4
  116. package/dist/{chunk-KAA5BGMQ.js.map → chunks/chunk-UNOY3VJ2.js.map} +2 -2
  117. package/dist/{chunk-MWRSY4X6.js → chunks/chunk-UVDJL6ZZ.js} +97 -58
  118. package/dist/chunks/chunk-UVDJL6ZZ.js.map +7 -0
  119. package/dist/chunks/chunk-VNCW4C2Z.js +13452 -0
  120. package/dist/chunks/chunk-VNCW4C2Z.js.map +7 -0
  121. package/dist/chunks/chunk-W5EGGA44.js +15 -0
  122. package/dist/chunks/chunk-W5EGGA44.js.map +7 -0
  123. package/dist/chunks/chunk-XR2W3MAM.js +1533 -0
  124. package/dist/chunks/chunk-XR2W3MAM.js.map +7 -0
  125. package/dist/{chunk-STSX7GIX.js → chunks/chunk-YIO5EBMQ.js} +423 -377
  126. package/dist/chunks/chunk-YIO5EBMQ.js.map +7 -0
  127. package/dist/chunks/chunk-ZBVLKZ5V.js +1062 -0
  128. package/dist/chunks/chunk-ZBVLKZ5V.js.map +7 -0
  129. package/dist/{chunk-E6YNABER.js → chunks/chunk-ZCLTZIVP.js} +1 -4
  130. package/dist/chunks/chunk-ZCLTZIVP.js.map +7 -0
  131. package/dist/chunks/client-SILZNM5N.js +42 -0
  132. package/dist/{config-RUSD6G5Y.js → chunks/config-25HRTPSP.js} +48 -10
  133. package/dist/chunks/cost-tracker-Z2UZT2J5.js +28 -0
  134. package/dist/{customCommands-TOIJFZAL.js → chunks/customCommands-TYMYZRG5.js} +11 -8
  135. package/dist/chunks/engine-MRVF6FK6.js +39 -0
  136. package/dist/{env-XGKBLU3D.js → chunks/env-TJ5NOBEB.js} +7 -5
  137. package/dist/{kodeAgentSessionId-X6XWQW7B.js → chunks/kodeAgentSessionId-VTNISJ2L.js} +2 -4
  138. package/dist/chunks/kodeAgentSessionLoad-YB2RKBGJ.js +15 -0
  139. package/dist/chunks/kodeAgentSessionResume-DZSIVKVA.js +13 -0
  140. package/dist/chunks/kodeAgentStreamJson-X5PLS2S6.js +11 -0
  141. package/dist/{kodeAgentStreamJsonSession-UGEZJJEB.js → chunks/kodeAgentStreamJsonSession-RDXM4XYF.js} +38 -24
  142. package/dist/chunks/kodeAgentStreamJsonSession-RDXM4XYF.js.map +7 -0
  143. package/dist/{chunk-4RTX4AG4.js → chunks/kodeAgentStructuredStdio-SVGDSB4P.js} +14 -9
  144. package/dist/chunks/kodeAgentStructuredStdio-SVGDSB4P.js.map +7 -0
  145. package/dist/{kodeHooks-QWM36A3D.js → chunks/kodeHooks-RVKYRJHG.js} +11 -9
  146. package/dist/{llm-ZUQC4WYM.js → chunks/llm-62N6T5ZT.js} +1734 -1526
  147. package/dist/chunks/llm-62N6T5ZT.js.map +7 -0
  148. package/dist/chunks/llmLazy-ZUSSE3ZA.js +13 -0
  149. package/dist/{mentionProcessor-EE3XFHCJ.js → chunks/mentionProcessor-RJW5UPJD.js} +46 -16
  150. package/dist/chunks/mentionProcessor-RJW5UPJD.js.map +7 -0
  151. package/dist/{messages-EOYQKPGM.js → chunks/messages-EEWWLPHN.js} +2 -6
  152. package/dist/chunks/model-5TIEKQPD.js +37 -0
  153. package/dist/{openai-RRCWW33N.js → chunks/openai-XXK3YZG4.js} +13 -10
  154. package/dist/{outputStyles-62Q3VH2J.js → chunks/outputStyles-FAJTXN2A.js} +6 -9
  155. package/dist/chunks/permissions-HO7INPWM.js +27 -0
  156. package/dist/{pluginRuntime-6ETCZ2LL.js → chunks/pluginRuntime-C7K5ULK2.js} +31 -48
  157. package/dist/chunks/pluginRuntime-C7K5ULK2.js.map +7 -0
  158. package/dist/chunks/pluginValidation-DAM7WRTC.js +20 -0
  159. package/dist/chunks/registry-XYJXMOA5.js +60 -0
  160. package/dist/chunks/responsesStreaming-JNGE2P3D.js +8 -0
  161. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js +577 -0
  162. package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js.map +7 -0
  163. package/dist/chunks/server-REXXF5IK.js +46 -0
  164. package/dist/{skillMarketplace-3RXQBVOL.js → chunks/skillMarketplace-N4HVHNST.js} +8 -6
  165. package/dist/chunks/src-OROQIWP3.js +44 -0
  166. package/dist/chunks/src-QXLGGMUW.js +1647 -0
  167. package/dist/chunks/src-QXLGGMUW.js.map +7 -0
  168. package/dist/{cli-DOPVY2CW.js → chunks/src-SSDT6MVP.js} +2659 -3384
  169. package/dist/chunks/src-SSDT6MVP.js.map +7 -0
  170. package/dist/chunks/theme-YBJUIMWK.js +10 -0
  171. package/dist/{toolPermissionContext-65L65VEZ.js → chunks/toolPermissionContext-MOCTRR7N.js} +2 -4
  172. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js +18 -0
  173. package/dist/chunks/toolPermissionSettings-EV2EJAXL.js.map +7 -0
  174. package/dist/chunks/uuid-6577SO6X.js +7 -0
  175. package/dist/chunks/uuid-6577SO6X.js.map +7 -0
  176. package/dist/chunks/webOnlyMode-ALXX7UQY.js +66 -0
  177. package/dist/chunks/webOnlyMode-ALXX7UQY.js.map +7 -0
  178. package/dist/entrypoints/cli.js +10 -0
  179. package/dist/entrypoints/cli.js.map +7 -0
  180. package/dist/entrypoints/daemon.js +10 -0
  181. package/dist/entrypoints/daemon.js.map +7 -0
  182. package/dist/entrypoints/mcp.js +71 -0
  183. package/dist/entrypoints/mcp.js.map +7 -0
  184. package/dist/index.js +6 -7
  185. package/dist/index.js.map +3 -3
  186. package/dist/sdk/client.cjs +391 -0
  187. package/dist/sdk/client.cjs.map +7 -0
  188. package/dist/sdk/client.js +364 -0
  189. package/dist/sdk/client.js.map +7 -0
  190. package/dist/sdk/core.cjs +19932 -0
  191. package/dist/sdk/core.cjs.map +7 -0
  192. package/dist/sdk/core.js +19893 -0
  193. package/dist/sdk/core.js.map +7 -0
  194. package/dist/sdk/daemon-client.cjs +257 -0
  195. package/dist/sdk/daemon-client.cjs.map +7 -0
  196. package/dist/sdk/daemon-client.js +221 -0
  197. package/dist/sdk/daemon-client.js.map +7 -0
  198. package/dist/sdk/protocol.cjs +170 -0
  199. package/dist/sdk/protocol.cjs.map +7 -0
  200. package/dist/sdk/protocol.js +140 -0
  201. package/dist/sdk/protocol.js.map +7 -0
  202. package/dist/sdk/runtime-node.cjs +236 -0
  203. package/dist/sdk/runtime-node.cjs.map +7 -0
  204. package/dist/sdk/runtime-node.js +222 -0
  205. package/dist/sdk/runtime-node.js.map +7 -0
  206. package/dist/sdk/runtime.cjs +17 -0
  207. package/dist/sdk/runtime.cjs.map +7 -0
  208. package/dist/sdk/runtime.js +0 -0
  209. package/dist/sdk/runtime.js.map +7 -0
  210. package/dist/sdk/tools.cjs +30300 -0
  211. package/dist/sdk/tools.cjs.map +7 -0
  212. package/dist/sdk/tools.js +30282 -0
  213. package/dist/sdk/tools.js.map +7 -0
  214. package/dist/webui/assets/index-5hlfByVS.css +1 -0
  215. package/dist/webui/assets/index-BR9lm1lA.js +82 -0
  216. package/dist/webui/index.html +28 -0
  217. package/package.json +93 -22
  218. package/scripts/binary-utils.cjs +12 -4
  219. package/scripts/cli-acp-wrapper.cjs +3 -17
  220. package/scripts/cli-wrapper.cjs +5 -7
  221. package/scripts/postinstall.js +8 -4
  222. package/dist/REPL-CW7AYLVL.js +0 -42
  223. package/dist/acp-VEPJ74LT.js +0 -1357
  224. package/dist/acp-VEPJ74LT.js.map +0 -7
  225. package/dist/agentsValidate-7LH4HTNR.js.map +0 -7
  226. package/dist/ask-3NHFFUQG.js.map +0 -7
  227. package/dist/autoUpdater-ITPIHCOI.js +0 -17
  228. package/dist/chunk-3IN27HA5.js.map +0 -7
  229. package/dist/chunk-4FX3IVPT.js +0 -164
  230. package/dist/chunk-4FX3IVPT.js.map +0 -7
  231. package/dist/chunk-4RTX4AG4.js.map +0 -7
  232. package/dist/chunk-5PDP7R6N.js +0 -515
  233. package/dist/chunk-5PDP7R6N.js.map +0 -7
  234. package/dist/chunk-73WGVYLQ.js.map +0 -7
  235. package/dist/chunk-7M2YN6TU.js.map +0 -7
  236. package/dist/chunk-7U7L4NMD.js.map +0 -7
  237. package/dist/chunk-ABLVTESJ.js.map +0 -7
  238. package/dist/chunk-AFFSCMYS.js.map +0 -7
  239. package/dist/chunk-ARZSBOAO.js.map +0 -7
  240. package/dist/chunk-CIG63V4E.js +0 -72
  241. package/dist/chunk-CIG63V4E.js.map +0 -7
  242. package/dist/chunk-CM3EGTG6.js +0 -1609
  243. package/dist/chunk-CM3EGTG6.js.map +0 -7
  244. package/dist/chunk-DZE5YA7L.js.map +0 -7
  245. package/dist/chunk-E6YNABER.js.map +0 -7
  246. package/dist/chunk-EZXMVTDU.js.map +0 -7
  247. package/dist/chunk-F2SJXUDI.js +0 -148
  248. package/dist/chunk-F2SJXUDI.js.map +0 -7
  249. package/dist/chunk-FC5ZCKBI.js +0 -30167
  250. package/dist/chunk-FC5ZCKBI.js.map +0 -7
  251. package/dist/chunk-HCBELH4J.js +0 -145
  252. package/dist/chunk-HCBELH4J.js.map +0 -7
  253. package/dist/chunk-HN4E4UUQ.js.map +0 -7
  254. package/dist/chunk-IZVMU4S2.js +0 -654
  255. package/dist/chunk-IZVMU4S2.js.map +0 -7
  256. package/dist/chunk-K2CWOTI2.js.map +0 -7
  257. package/dist/chunk-LC4TVOCZ.js +0 -835
  258. package/dist/chunk-LC4TVOCZ.js.map +0 -7
  259. package/dist/chunk-MIW7N2MY.js +0 -2613
  260. package/dist/chunk-MIW7N2MY.js.map +0 -7
  261. package/dist/chunk-MWRSY4X6.js.map +0 -7
  262. package/dist/chunk-ND3XWFO6.js +0 -34
  263. package/dist/chunk-ND3XWFO6.js.map +0 -7
  264. package/dist/chunk-QVLYOPO5.js.map +0 -7
  265. package/dist/chunk-RZWOUA25.js.map +0 -7
  266. package/dist/chunk-S6HRABTA.js.map +0 -7
  267. package/dist/chunk-STSX7GIX.js.map +0 -7
  268. package/dist/chunk-UHYRLID6.js.map +0 -7
  269. package/dist/chunk-UKHTVRJM.js +0 -47
  270. package/dist/chunk-UKHTVRJM.js.map +0 -7
  271. package/dist/chunk-UYXEDKOZ.js +0 -24
  272. package/dist/chunk-UYXEDKOZ.js.map +0 -7
  273. package/dist/chunk-W7GRKO7Q.js.map +0 -7
  274. package/dist/chunk-WVHORZQ5.js +0 -17
  275. package/dist/chunk-WVHORZQ5.js.map +0 -7
  276. package/dist/chunk-WWUWDNWW.js +0 -49
  277. package/dist/chunk-WWUWDNWW.js.map +0 -7
  278. package/dist/chunk-YC6LJCDE.js.map +0 -7
  279. package/dist/chunk-YXYYDIMI.js +0 -2931
  280. package/dist/chunk-YXYYDIMI.js.map +0 -7
  281. package/dist/chunk-ZVDRDPII.js.map +0 -7
  282. package/dist/cli-DOPVY2CW.js.map +0 -7
  283. package/dist/commands-2BF2CJ3A.js +0 -46
  284. package/dist/context-6FXPETYH.js +0 -30
  285. package/dist/costTracker-6SL26FDB.js +0 -19
  286. package/dist/kodeAgentSessionLoad-MITZADPB.js +0 -18
  287. package/dist/kodeAgentSessionResume-GVRWB4WO.js +0 -16
  288. package/dist/kodeAgentStreamJson-NXFN7TXH.js +0 -13
  289. package/dist/kodeAgentStreamJsonSession-UGEZJJEB.js.map +0 -7
  290. package/dist/kodeAgentStructuredStdio-HGWJT7CU.js +0 -10
  291. package/dist/llm-ZUQC4WYM.js.map +0 -7
  292. package/dist/llmLazy-54QQHA54.js +0 -15
  293. package/dist/loader-FYHJQES5.js +0 -28
  294. package/dist/mcp-J332IKT3.js +0 -49
  295. package/dist/mentionProcessor-EE3XFHCJ.js.map +0 -7
  296. package/dist/model-FV3JDJKH.js +0 -30
  297. package/dist/pluginRuntime-6ETCZ2LL.js.map +0 -7
  298. package/dist/pluginValidation-I4YKUWGS.js +0 -17
  299. package/dist/prompts-ZLEKDD77.js +0 -48
  300. package/dist/query-VFRJPBGD.js +0 -50
  301. package/dist/responsesStreaming-AW344PQO.js +0 -10
  302. package/dist/ripgrep-3NTIKQYW.js +0 -17
  303. package/dist/state-P5G6CO5V.js +0 -16
  304. package/dist/theme-3LWP3BG7.js +0 -14
  305. package/dist/toolPermissionSettings-3ROBVTUK.js +0 -18
  306. package/dist/tools-RO7HSSE5.js +0 -47
  307. package/dist/userInput-JSBJRFSK.js +0 -311
  308. package/dist/userInput-JSBJRFSK.js.map +0 -7
  309. package/dist/uuid-QN2CNKKN.js +0 -9
  310. /package/dist/{REPL-CW7AYLVL.js.map → chunks/Doctor-M3J7GRTJ.js.map} +0 -0
  311. /package/dist/{autoUpdater-ITPIHCOI.js.map → chunks/REPL-RQ6LO6S7.js.map} +0 -0
  312. /package/dist/{chunk-JC6NCUG5.js.map → chunks/ResumeConversation-6DMVBEGH.js.map} +0 -0
  313. /package/dist/{commands-2BF2CJ3A.js.map → chunks/agentLoader-FCRG3TFJ.js.map} +0 -0
  314. /package/dist/{config-RUSD6G5Y.js.map → chunks/autoUpdater-CNESBOKO.js.map} +0 -0
  315. /package/dist/{context-6FXPETYH.js.map → chunks/chunk-4CRUCZR4.js.map} +0 -0
  316. /package/dist/{costTracker-6SL26FDB.js.map → chunks/chunk-54KOYG5C.js.map} +0 -0
  317. /package/dist/{customCommands-TOIJFZAL.js.map → chunks/chunk-GCQCAXJZ.js.map} +0 -0
  318. /package/dist/{env-XGKBLU3D.js.map → chunks/chunk-LB6TCPDI.js.map} +0 -0
  319. /package/dist/{kodeAgentSessionId-X6XWQW7B.js.map → chunks/client-SILZNM5N.js.map} +0 -0
  320. /package/dist/{kodeAgentSessionLoad-MITZADPB.js.map → chunks/config-25HRTPSP.js.map} +0 -0
  321. /package/dist/{kodeAgentSessionResume-GVRWB4WO.js.map → chunks/cost-tracker-Z2UZT2J5.js.map} +0 -0
  322. /package/dist/{kodeAgentStreamJson-NXFN7TXH.js.map → chunks/customCommands-TYMYZRG5.js.map} +0 -0
  323. /package/dist/{kodeAgentStructuredStdio-HGWJT7CU.js.map → chunks/engine-MRVF6FK6.js.map} +0 -0
  324. /package/dist/{kodeHooks-QWM36A3D.js.map → chunks/env-TJ5NOBEB.js.map} +0 -0
  325. /package/dist/{llmLazy-54QQHA54.js.map → chunks/kodeAgentSessionId-VTNISJ2L.js.map} +0 -0
  326. /package/dist/{loader-FYHJQES5.js.map → chunks/kodeAgentSessionLoad-YB2RKBGJ.js.map} +0 -0
  327. /package/dist/{mcp-J332IKT3.js.map → chunks/kodeAgentSessionResume-DZSIVKVA.js.map} +0 -0
  328. /package/dist/{messages-EOYQKPGM.js.map → chunks/kodeAgentStreamJson-X5PLS2S6.js.map} +0 -0
  329. /package/dist/{model-FV3JDJKH.js.map → chunks/kodeHooks-RVKYRJHG.js.map} +0 -0
  330. /package/dist/{openai-RRCWW33N.js.map → chunks/llmLazy-ZUSSE3ZA.js.map} +0 -0
  331. /package/dist/{outputStyles-62Q3VH2J.js.map → chunks/messages-EEWWLPHN.js.map} +0 -0
  332. /package/dist/{pluginValidation-I4YKUWGS.js.map → chunks/model-5TIEKQPD.js.map} +0 -0
  333. /package/dist/{prompts-ZLEKDD77.js.map → chunks/openai-XXK3YZG4.js.map} +0 -0
  334. /package/dist/{query-VFRJPBGD.js.map → chunks/outputStyles-FAJTXN2A.js.map} +0 -0
  335. /package/dist/{responsesStreaming-AW344PQO.js.map → chunks/permissions-HO7INPWM.js.map} +0 -0
  336. /package/dist/{ripgrep-3NTIKQYW.js.map → chunks/pluginValidation-DAM7WRTC.js.map} +0 -0
  337. /package/dist/{skillMarketplace-3RXQBVOL.js.map → chunks/registry-XYJXMOA5.js.map} +0 -0
  338. /package/dist/{state-P5G6CO5V.js.map → chunks/responsesStreaming-JNGE2P3D.js.map} +0 -0
  339. /package/dist/{theme-3LWP3BG7.js.map → chunks/server-REXXF5IK.js.map} +0 -0
  340. /package/dist/{toolPermissionContext-65L65VEZ.js.map → chunks/skillMarketplace-N4HVHNST.js.map} +0 -0
  341. /package/dist/{toolPermissionSettings-3ROBVTUK.js.map → chunks/src-OROQIWP3.js.map} +0 -0
  342. /package/dist/{tools-RO7HSSE5.js.map → chunks/theme-YBJUIMWK.js.map} +0 -0
  343. /package/dist/{uuid-QN2CNKKN.js.map → chunks/toolPermissionContext-MOCTRR7N.js.map} +0 -0
@@ -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/agent/storage.ts", "../src/utils/session/todoStorage.ts", "../src/services/system/systemReminder.ts"],
4
- "sourcesContent": ["import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\n\n\nfunction getConfigDirectory(): string {\n return (\n process.env.KODE_CONFIG_DIR ??\n process.env.ANYKODE_CONFIG_DIR ??\n join(homedir(), '.kode')\n )\n}\n\nfunction getSessionId(): string {\n return process.env.ANYKODE_SESSION_ID ?? 'default-session'\n}\n\nexport function getAgentFilePath(agentId: string): string {\n const sessionId = getSessionId()\n const filename = `${sessionId}-agent-${agentId}.json`\n const configDir = getConfigDirectory()\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true })\n }\n\n return join(configDir, filename)\n}\n\nexport function readAgentData<T = any>(agentId: string): T | null {\n const filePath = getAgentFilePath(agentId)\n\n if (!existsSync(filePath)) {\n return null\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as T\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_READ_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n}\n\nexport function writeAgentData<T = any>(agentId: string, data: T): void {\n const filePath = getAgentFilePath(agentId)\n\n try {\n writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8')\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_WRITE_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\nexport function getDefaultAgentId(): string {\n return 'default'\n}\n\nexport function resolveAgentId(agentId?: string): string {\n return agentId || getDefaultAgentId()\n}\n\nexport function generateAgentId(): string {\n return randomUUID()\n}\n", "import { setSessionState, getSessionState } from './sessionState'\nimport { readAgentData, writeAgentData, resolveAgentId } from '@utils/agent/storage'\n\nexport interface TodoItem {\n id: string\n content: string\n status: 'pending' | 'in_progress' | 'completed'\n activeForm: string\n priority: 'high' | 'medium' | 'low'\n createdAt?: number\n updatedAt?: number\n tags?: string[]\n estimatedHours?: number\n previousStatus?: 'pending' | 'in_progress' | 'completed'\n}\n\nexport interface TodoQuery {\n status?: TodoItem['status'][]\n priority?: TodoItem['priority'][]\n contentMatch?: string\n tags?: string[]\n dateRange?: { from?: Date; to?: Date }\n}\n\nexport interface TodoStorageConfig {\n maxTodos: number\n autoArchiveCompleted: boolean\n sortBy: 'createdAt' | 'updatedAt' | 'priority' | 'status'\n sortOrder: 'asc' | 'desc'\n}\n\nconst TODO_STORAGE_KEY = 'todos'\nconst TODO_CONFIG_KEY = 'todoConfig'\nconst TODO_CACHE_KEY = 'todoCache'\n\nconst DEFAULT_CONFIG: TodoStorageConfig = {\n maxTodos: 100,\n autoArchiveCompleted: false,\n sortBy: 'status',\n sortOrder: 'desc',\n}\n\nlet todoCache: TodoItem[] | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL = 5000\n\nexport interface TodoMetrics {\n totalOperations: number\n cacheHits: number\n cacheMisses: number\n lastOperation: number\n}\n\nfunction invalidateCache(): void {\n todoCache = null\n cacheTimestamp = 0\n}\n\nfunction updateMetrics(operation: string, cacheHit: boolean = false): void {\n const sessionState = getSessionState() as any\n const metrics = sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n\n metrics.totalOperations++\n metrics.lastOperation = Date.now()\n\n if (cacheHit) {\n metrics.cacheHits++\n } else {\n metrics.cacheMisses++\n }\n\n setSessionState({\n ...sessionState,\n todoMetrics: metrics,\n })\n}\n\nexport function getTodoMetrics(): TodoMetrics {\n const sessionState = getSessionState() as any\n return (\n sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n )\n}\n\nexport function getTodos(agentId?: string): TodoItem[] {\n const resolvedAgentId = resolveAgentId(agentId)\n const now = Date.now()\n\n if (agentId) {\n updateMetrics('getTodos', false)\n const agentTodos = readAgentData<TodoItem[]>(resolvedAgentId) || []\n\n const agentCacheKey = `todoCache_${resolvedAgentId}`\n\n return agentTodos.map(todo => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n }\n\n if (todoCache && now - cacheTimestamp < CACHE_TTL) {\n updateMetrics('getTodos', true)\n return todoCache.map(todo => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n }\n\n updateMetrics('getTodos', false)\n const sessionState = getSessionState()\n const todos = (sessionState as any)[TODO_STORAGE_KEY] || []\n\n todoCache = [...todos].map((todo: TodoItem) => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n cacheTimestamp = now\n\n return todoCache\n}\n\nexport function setTodos(todos: TodoItem[], agentId?: string): void {\n const resolvedAgentId = resolveAgentId(agentId)\n const config = getTodoConfig()\n const existingTodos = getTodos(agentId)\n\n if (agentId) {\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n const existingTodo = existingTodos.find(\n existing => existing.id === todo.id,\n )\n\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n writeAgentData(resolvedAgentId, updatedTodos)\n updateMetrics('setTodos')\n return\n }\n\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n const existingTodo = existingTodos.find(existing => existing.id === todo.id)\n\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n setSessionState({\n ...getSessionState(),\n [TODO_STORAGE_KEY]: updatedTodos,\n } as any)\n\n invalidateCache()\n updateMetrics('setTodos')\n}\n\nexport function getTodoConfig(): TodoStorageConfig {\n const sessionState = getSessionState() as any\n return { ...DEFAULT_CONFIG, ...(sessionState[TODO_CONFIG_KEY] || {}) }\n}\n\nexport function setTodoConfig(config: Partial<TodoStorageConfig>): void {\n const currentConfig = getTodoConfig()\n const newConfig = { ...currentConfig, ...config }\n\n setSessionState({\n ...getSessionState(),\n [TODO_CONFIG_KEY]: newConfig,\n } as any)\n\n if (config.sortBy || config.sortOrder) {\n const todos = getTodos()\n setTodos(todos)\n }\n}\n\nexport function addTodo(\n todo: Omit<TodoItem, 'createdAt' | 'updatedAt'>,\n): TodoItem[] {\n const todos = getTodos()\n\n if (todos.some(existing => existing.id === todo.id)) {\n throw new Error(`Todo with ID '${todo.id}' already exists`)\n }\n\n const newTodo: TodoItem = {\n ...todo,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }\n\n const updatedTodos = [...todos, newTodo]\n setTodos(updatedTodos)\n updateMetrics('addTodo')\n return updatedTodos\n}\n\nexport function updateTodo(id: string, updates: Partial<TodoItem>): TodoItem[] {\n const todos = getTodos()\n const existingTodo = todos.find(todo => todo.id === id)\n\n if (!existingTodo) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.map(todo =>\n todo.id === id ? { ...todo, ...updates, updatedAt: Date.now() } : todo,\n )\n\n setTodos(updatedTodos)\n updateMetrics('updateTodo')\n return updatedTodos\n}\n\nexport function deleteTodo(id: string): TodoItem[] {\n const todos = getTodos()\n const todoExists = todos.some(todo => todo.id === id)\n\n if (!todoExists) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.filter(todo => todo.id !== id)\n setTodos(updatedTodos)\n updateMetrics('deleteTodo')\n return updatedTodos\n}\n\nexport function clearTodos(): void {\n setTodos([])\n updateMetrics('clearTodos')\n}\n\nexport function getTodoById(id: string): TodoItem | undefined {\n const todos = getTodos()\n updateMetrics('getTodoById')\n return todos.find(todo => todo.id === id)\n}\n\nexport function getTodosByStatus(status: TodoItem['status']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByStatus')\n return todos.filter(todo => todo.status === status)\n}\n\nexport function getTodosByPriority(priority: TodoItem['priority']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByPriority')\n return todos.filter(todo => todo.priority === priority)\n}\n\nexport function queryTodos(query: TodoQuery): TodoItem[] {\n const todos = getTodos()\n updateMetrics('queryTodos')\n\n return todos.filter(todo => {\n if (query.status && !query.status.includes(todo.status)) {\n return false\n }\n\n if (query.priority && !query.priority.includes(todo.priority)) {\n return false\n }\n\n if (\n query.contentMatch &&\n !todo.content.toLowerCase().includes(query.contentMatch.toLowerCase())\n ) {\n return false\n }\n\n if (query.tags && todo.tags) {\n const hasMatchingTag = query.tags.some(tag => todo.tags!.includes(tag))\n if (!hasMatchingTag) return false\n }\n\n if (query.dateRange) {\n const todoDate = new Date(todo.createdAt || 0)\n if (query.dateRange.from && todoDate < query.dateRange.from) return false\n if (query.dateRange.to && todoDate > query.dateRange.to) return false\n }\n\n return true\n })\n}\n\nexport function getTodoStatistics() {\n const todos = getTodos()\n const metrics = getTodoMetrics()\n\n return {\n total: todos.length,\n byStatus: {\n pending: todos.filter(t => t.status === 'pending').length,\n in_progress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n },\n byPriority: {\n high: todos.filter(t => t.priority === 'high').length,\n medium: todos.filter(t => t.priority === 'medium').length,\n low: todos.filter(t => t.priority === 'low').length,\n },\n metrics,\n cacheEfficiency:\n metrics.totalOperations > 0\n ? Math.round((metrics.cacheHits / metrics.totalOperations) * 100)\n : 0,\n }\n}\n\nexport function optimizeTodoStorage(): void {\n invalidateCache()\n\n const todos = getTodos()\n const validTodos = todos.filter(\n todo =>\n todo.id &&\n todo.content &&\n todo.activeForm &&\n ['pending', 'in_progress', 'completed'].includes(todo.status) &&\n ['high', 'medium', 'low'].includes(todo.priority),\n )\n\n if (validTodos.length !== todos.length) {\n setTodos(validTodos)\n }\n\n updateMetrics('optimizeTodoStorage')\n}\n", "import { getTodos, TodoItem } from '@utils/session/todoStorage'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\n\nexport interface ReminderMessage {\n role: 'system'\n content: string\n isMeta: boolean\n timestamp: number\n type: string\n priority: 'low' | 'medium' | 'high'\n category: 'task' | 'security' | 'performance' | 'general'\n}\n\ninterface ReminderConfig {\n todoEmptyReminder: boolean\n securityReminder: boolean\n performanceReminder: boolean\n maxRemindersPerSession: number\n}\n\ninterface SessionReminderState {\n lastTodoUpdate: number\n lastFileAccess: number\n sessionStartTime: number\n remindersSent: Set<string>\n contextPresent: boolean\n reminderCount: number\n config: ReminderConfig\n}\n\nclass SystemReminderService {\n private sessionState: SessionReminderState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n config: {\n todoEmptyReminder: true,\n securityReminder: true,\n performanceReminder: true,\n maxRemindersPerSession: 10,\n },\n }\n\n private eventDispatcher = new Map<string, Array<(context: any) => void>>()\n private reminderCache = new Map<string, ReminderMessage>()\n\n constructor() {\n this.setupEventDispatcher()\n }\n\n public generateReminders(\n hasContext: boolean = false,\n agentId?: string,\n ): ReminderMessage[] {\n this.sessionState.contextPresent = hasContext\n\n if (!hasContext) {\n return []\n }\n\n if (\n this.sessionState.reminderCount >=\n this.sessionState.config.maxRemindersPerSession\n ) {\n return []\n }\n\n const reminders: ReminderMessage[] = []\n const currentTime = Date.now()\n\n const reminderGenerators = [\n () => this.dispatchTodoEvent(agentId),\n () => this.dispatchSecurityEvent(),\n () => this.dispatchPerformanceEvent(),\n () => this.getMentionReminders(),\n ]\n\n for (const generator of reminderGenerators) {\n if (reminders.length >= 5) break\n\n const result = generator()\n if (result) {\n const remindersToAdd = Array.isArray(result) ? result : [result]\n reminders.push(...remindersToAdd)\n this.sessionState.reminderCount += remindersToAdd.length\n }\n }\n\n return reminders\n }\n\n private dispatchTodoEvent(agentId?: string): ReminderMessage | null {\n if (!this.sessionState.config.todoEmptyReminder) return null\n\n const todos = getTodos(agentId)\n const currentTime = Date.now()\n const agentKey = agentId || 'default'\n\n if (\n todos.length === 0 &&\n !this.sessionState.remindersSent.has(`todo_empty_${agentKey}`)\n ) {\n this.sessionState.remindersSent.add(`todo_empty_${agentKey}`)\n return this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n 'This is a reminder that your todo list is currently empty. DO NOT mention this to the user explicitly because they are already aware. If you are working on tasks that would benefit from a todo list please use the TodoWrite tool to create one. If not, please feel free to ignore. Again do not mention this message to the user.',\n currentTime,\n )\n }\n\n if (todos.length > 0) {\n const reminderKey = `todo_updated_${agentKey}_${todos.length}_${this.getTodoStateHash(todos)}`\n\n if (this.reminderCache.has(reminderKey)) {\n return this.reminderCache.get(reminderKey)!\n }\n\n if (!this.sessionState.remindersSent.has(reminderKey)) {\n this.sessionState.remindersSent.add(reminderKey)\n this.clearTodoReminders(agentKey)\n\n const todoContent = JSON.stringify(\n todos.map(todo => ({\n content:\n todo.content.length > 100\n ? todo.content.substring(0, 100) + '...'\n : todo.content,\n status: todo.status,\n activeForm:\n todo.activeForm && todo.activeForm.length > 100\n ? todo.activeForm.substring(0, 100) + '...'\n : todo.activeForm || todo.content,\n })),\n )\n\n const reminder = this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n `Your todo list has changed. DO NOT mention this explicitly to the user. Here are the latest contents of your todo list:\\n\\n${todoContent}. Continue on with the tasks at hand if applicable.`,\n currentTime,\n )\n\n this.reminderCache.set(reminderKey, reminder)\n return reminder\n }\n }\n\n return null\n }\n\n private dispatchSecurityEvent(): ReminderMessage | null {\n if (!this.sessionState.config.securityReminder) return null\n\n const currentTime = Date.now()\n\n if (\n this.sessionState.lastFileAccess > 0 &&\n !this.sessionState.remindersSent.has('file_security')\n ) {\n this.sessionState.remindersSent.add('file_security')\n return this.createReminderMessage(\n 'security',\n 'security',\n 'high',\n 'Whenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.',\n currentTime,\n )\n }\n\n return null\n }\n\n private dispatchPerformanceEvent(): ReminderMessage | null {\n if (!this.sessionState.config.performanceReminder) return null\n\n const currentTime = Date.now()\n const sessionDuration = currentTime - this.sessionState.sessionStartTime\n\n if (\n sessionDuration > 30 * 60 * 1000 &&\n !this.sessionState.remindersSent.has('performance_long_session')\n ) {\n this.sessionState.remindersSent.add('performance_long_session')\n return this.createReminderMessage(\n 'performance',\n 'performance',\n 'low',\n 'Long session detected. Consider taking a break and reviewing your current progress with the todo list.',\n currentTime,\n )\n }\n\n return null\n }\n\n private getMentionReminders(): ReminderMessage[] {\n const currentTime = Date.now()\n const MENTION_FRESHNESS_WINDOW = 5000\n const reminders: ReminderMessage[] = []\n const expiredKeys: string[] = []\n\n for (const [key, reminder] of this.reminderCache.entries()) {\n if (this.isMentionReminder(reminder)) {\n const age = currentTime - reminder.timestamp\n if (age <= MENTION_FRESHNESS_WINDOW) {\n reminders.push(reminder)\n } else {\n expiredKeys.push(key)\n }\n }\n }\n\n expiredKeys.forEach(key => this.reminderCache.delete(key))\n\n return reminders\n }\n\n private isMentionReminder(reminder: ReminderMessage): boolean {\n const mentionTypes = ['agent_mention', 'file_mention', 'ask_model_mention']\n return mentionTypes.includes(reminder.type)\n }\n\n public generateFileChangeReminder(context: any): ReminderMessage | null {\n const { agentId, filePath, reminder } = context\n\n if (!reminder) {\n return null\n }\n\n const currentTime = Date.now()\n const reminderKey = `file_changed_${agentId}_${filePath}_${currentTime}`\n\n if (this.sessionState.remindersSent.has(reminderKey)) {\n return null\n }\n\n this.sessionState.remindersSent.add(reminderKey)\n\n return this.createReminderMessage(\n 'file_changed',\n 'general',\n 'medium',\n reminder,\n currentTime,\n )\n }\n\n private createReminderMessage(\n type: string,\n category: ReminderMessage['category'],\n priority: ReminderMessage['priority'],\n content: string,\n timestamp: number,\n ): ReminderMessage {\n return {\n role: 'system',\n content: `<system-reminder>\\n${content}\\n</system-reminder>`,\n isMeta: true,\n timestamp,\n type,\n priority,\n category,\n }\n }\n\n private getTodoStateHash(todos: TodoItem[]): string {\n return todos\n .map(t => `${t.content}:${t.status}:${t.activeForm || t.content}`)\n .sort()\n .join('|')\n }\n\n private clearTodoReminders(agentId?: string): void {\n const agentKey = agentId || 'default'\n for (const key of this.sessionState.remindersSent) {\n if (key.startsWith(`todo_updated_${agentKey}_`)) {\n this.sessionState.remindersSent.delete(key)\n }\n }\n }\n\n private setupEventDispatcher(): void {\n this.addEventListener('session:startup', context => {\n this.resetSession()\n\n this.sessionState.sessionStartTime = Date.now()\n this.sessionState.contextPresent =\n Object.keys(context.context || {}).length > 0\n })\n\n this.addEventListener('todo:changed', context => {\n this.sessionState.lastTodoUpdate = Date.now()\n this.clearTodoReminders(context.agentId)\n })\n\n this.addEventListener('todo:file_changed', context => {\n const agentId = context.agentId || 'default'\n this.clearTodoReminders(agentId)\n this.sessionState.lastTodoUpdate = Date.now()\n\n const reminder = this.generateFileChangeReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n agentId,\n type: 'file_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('file:read', context => {\n this.sessionState.lastFileAccess = Date.now()\n })\n\n this.addEventListener('file:edited', context => {\n })\n\n this.addEventListener('agent:mentioned', context => {\n this.createMentionReminder({\n type: 'agent_mention',\n key: `agent_mention_${context.agentType}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST use the Task tool with subagent_type=\"${context.agentType}\" to delegate this task to the specified agent. Provide a detailed, self-contained task description that fully captures the user's intent for the ${context.agentType} agent to execute.`,\n timestamp: context.timestamp,\n })\n })\n\n this.addEventListener('file:mentioned', context => {\n this.createMentionReminder({\n type: 'file_mention',\n key: `file_mention_${context.filePath}_${context.timestamp}`,\n category: 'general',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST read the entire content of the file at path: ${context.filePath} using the Read tool to understand the full context before proceeding with the user's request.`,\n timestamp: context.timestamp,\n })\n })\n\n this.addEventListener('ask-model:mentioned', context => {\n this.createMentionReminder({\n type: 'ask_model_mention',\n key: `ask_model_mention_${context.modelName}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.modelName}. You MUST use the AskExpertModelTool to consult this specific model for expert opinions and analysis. Provide the user's question or context clearly to get the most relevant response from ${context.modelName}.`,\n timestamp: context.timestamp,\n })\n })\n }\n\n public addEventListener(\n event: string,\n callback: (context: any) => void,\n ): void {\n if (!this.eventDispatcher.has(event)) {\n this.eventDispatcher.set(event, [])\n }\n this.eventDispatcher.get(event)!.push(callback)\n }\n\n public emitEvent(event: string, context: any): void {\n const listeners = this.eventDispatcher.get(event) || []\n listeners.forEach(callback => {\n try {\n callback(context)\n } catch (error) {\n logError(error)\n debugLogger.warn('SYSTEM_REMINDER_LISTENER_ERROR', {\n event,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n })\n }\n\n private createMentionReminder(params: {\n type: string\n key: string\n category: ReminderMessage['category']\n priority: ReminderMessage['priority']\n content: string\n timestamp: number\n }): void {\n if (!this.sessionState.remindersSent.has(params.key)) {\n this.sessionState.remindersSent.add(params.key)\n\n const reminder = this.createReminderMessage(\n params.type,\n params.category,\n params.priority,\n params.content,\n params.timestamp,\n )\n\n this.reminderCache.set(params.key, reminder)\n }\n }\n\n public resetSession(): void {\n this.sessionState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n config: { ...this.sessionState.config },\n }\n this.reminderCache.clear()\n }\n\n public updateConfig(config: Partial<ReminderConfig>): void {\n this.sessionState.config = { ...this.sessionState.config, ...config }\n }\n\n public getSessionState(): SessionReminderState {\n return { ...this.sessionState }\n }\n}\n\nexport const systemReminderService = new SystemReminderService()\n\nexport const generateSystemReminders = (\n hasContext: boolean = false,\n agentId?: string,\n) => systemReminderService.generateReminders(hasContext, agentId)\n\nexport const generateFileChangeReminder = (context: any) =>\n systemReminderService.generateFileChangeReminder(context)\n\nexport const emitReminderEvent = (event: string, context: any) =>\n systemReminderService.emitEvent(event, context)\n\nexport const resetReminderSession = () => systemReminderService.resetSession()\nexport const getReminderSessionState = () =>\n systemReminderService.getSessionState()\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAK3B,SAAS,qBAA6B;AACpC,SACE,QAAQ,IAAI,mBACZ,QAAQ,IAAI,sBACZ,KAAK,QAAQ,GAAG,OAAO;AAE3B;AAEA,SAAS,eAAuB;AAC9B,SAAO,QAAQ,IAAI,sBAAsB;AAC3C;AAEO,SAAS,iBAAiB,SAAyB;AACxD,QAAM,YAAY,aAAa;AAC/B,QAAM,WAAW,GAAG,SAAS,UAAU,OAAO;AAC9C,QAAM,YAAY,mBAAmB;AAErC,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,cAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,SAAO,KAAK,WAAW,QAAQ;AACjC;AAEO,SAAS,cAAuB,SAA2B;AAChE,QAAM,WAAW,iBAAiB,OAAO;AAEzC,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,UAAU,OAAO;AAC9C,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,aAAS,KAAK;AACd,UAAY,KAAK,6BAA6B;AAAA,MAC5C;AAAA,MACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAwB,SAAiB,MAAe;AACtE,QAAM,WAAW,iBAAiB,OAAO;AAEzC,MAAI;AACF,kBAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AAAA,EAChE,SAAS,OAAO;AACd,aAAS,KAAK;AACd,UAAY,KAAK,8BAA8B;AAAA,MAC7C;AAAA,MACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,CAAC;AACD,UAAM;AAAA,EACR;AACF;AAEO,SAAS,oBAA4B;AAC1C,SAAO;AACT;AAEO,SAAS,eAAe,SAA0B;AACvD,SAAO,WAAW,kBAAkB;AACtC;AAEO,SAAS,kBAA0B;AACxC,SAAO,WAAW;AACpB;;;AC9CA,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AAGxB,IAAM,iBAAoC;AAAA,EACxC,UAAU;AAAA,EACV,sBAAsB;AAAA,EACtB,QAAQ;AAAA,EACR,WAAW;AACb;AAEA,IAAI,YAA+B;AACnC,IAAI,iBAAiB;AACrB,IAAM,YAAY;AASlB,SAAS,kBAAwB;AAC/B,cAAY;AACZ,mBAAiB;AACnB;AAEA,SAAS,cAAc,WAAmB,WAAoB,OAAa;AACzE,QAAM,eAAe,gBAAgB;AACrC,QAAM,UAAU,aAAa,eAAe;AAAA,IAC1C,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAEA,UAAQ;AACR,UAAQ,gBAAgB,KAAK,IAAI;AAEjC,MAAI,UAAU;AACZ,YAAQ;AAAA,EACV,OAAO;AACL,YAAQ;AAAA,EACV;AAEA,kBAAgB;AAAA,IACd,GAAG;AAAA,IACH,aAAa;AAAA,EACf,CAAC;AACH;AAcO,SAAS,SAAS,SAA8B;AACrD,QAAM,kBAAkB,eAAe,OAAO;AAC9C,QAAM,MAAM,KAAK,IAAI;AAErB,MAAI,SAAS;AACX,kBAAc,YAAY,KAAK;AAC/B,UAAM,aAAa,cAA0B,eAAe,KAAK,CAAC;AAElE,UAAM,gBAAgB,aAAa,eAAe;AAElD,WAAO,WAAW,IAAI,WAAS;AAAA,MAC7B,GAAG;AAAA,MACH,YAAY,KAAK,cAAc,KAAK;AAAA,IACtC,EAAE;AAAA,EACJ;AAEA,MAAI,aAAa,MAAM,iBAAiB,WAAW;AACjD,kBAAc,YAAY,IAAI;AAC9B,WAAO,UAAU,IAAI,WAAS;AAAA,MAC5B,GAAG;AAAA,MACH,YAAY,KAAK,cAAc,KAAK;AAAA,IACtC,EAAE;AAAA,EACJ;AAEA,gBAAc,YAAY,KAAK;AAC/B,QAAM,eAAe,gBAAgB;AACrC,QAAM,QAAS,aAAqB,gBAAgB,KAAK,CAAC;AAE1D,cAAY,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,UAAoB;AAAA,IAC9C,GAAG;AAAA,IACH,YAAY,KAAK,cAAc,KAAK;AAAA,EACtC,EAAE;AACF,mBAAiB;AAEjB,SAAO;AACT;AAEO,SAAS,SAAS,OAAmB,SAAwB;AAClE,QAAM,kBAAkB,eAAe,OAAO;AAC9C,QAAM,SAAS,cAAc;AAC7B,QAAM,gBAAgB,SAAS,OAAO;AAEtC,MAAI,SAAS;AACX,QAAI,MAAM,SAAS,OAAO,UAAU;AAClC,YAAM,IAAI;AAAA,QACR,gCAAgC,OAAO,QAAQ;AAAA,MACjD;AAAA,IACF;AAEA,QAAIA,kBAAiB;AACrB,QAAI,OAAO,sBAAsB;AAC/B,MAAAA,kBAAiB,MAAM,OAAO,UAAQ,KAAK,WAAW,WAAW;AAAA,IACnE;AAEA,UAAMC,gBAAeD,gBAAe,IAAI,UAAQ;AAC9C,YAAM,eAAe,cAAc;AAAA,QACjC,cAAY,SAAS,OAAO,KAAK;AAAA,MACnC;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,KAAK,cAAc,KAAK;AAAA,QACpC,WAAW,KAAK,IAAI;AAAA,QACpB,WAAW,KAAK,aAAa,KAAK,IAAI;AAAA,QACtC,gBACE,cAAc,WAAW,KAAK,SAC1B,cAAc,SACd,KAAK;AAAA,MACb;AAAA,IACF,CAAC;AAED,mBAAe,iBAAiBC,aAAY;AAC5C,kBAAc,UAAU;AACxB;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,OAAO,UAAU;AAClC,UAAM,IAAI;AAAA,MACR,gCAAgC,OAAO,QAAQ;AAAA,IACjD;AAAA,EACF;AAEA,MAAI,iBAAiB;AACrB,MAAI,OAAO,sBAAsB;AAC/B,qBAAiB,MAAM,OAAO,UAAQ,KAAK,WAAW,WAAW;AAAA,EACnE;AAEA,QAAM,eAAe,eAAe,IAAI,UAAQ;AAC9C,UAAM,eAAe,cAAc,KAAK,cAAY,SAAS,OAAO,KAAK,EAAE;AAE3E,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY,KAAK,cAAc,KAAK;AAAA,MACpC,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,KAAK,aAAa,KAAK,IAAI;AAAA,MACtC,gBACE,cAAc,WAAW,KAAK,SAC1B,cAAc,SACd,KAAK;AAAA,IACb;AAAA,EACF,CAAC;AAED,kBAAgB;AAAA,IACd,GAAG,gBAAgB;AAAA,IACnB,CAAC,gBAAgB,GAAG;AAAA,EACtB,CAAQ;AAER,kBAAgB;AAChB,gBAAc,UAAU;AAC1B;AAEO,SAAS,gBAAmC;AACjD,QAAM,eAAe,gBAAgB;AACrC,SAAO,EAAE,GAAG,gBAAgB,GAAI,aAAa,eAAe,KAAK,CAAC,EAAG;AACvE;;;ACjLA,IAAM,wBAAN,MAA4B;AAAA,EAClB,eAAqC;AAAA,IAC3C,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,kBAAkB,KAAK,IAAI;AAAA,IAC3B,eAAe,oBAAI,IAAI;AAAA,IACvB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,QAAQ;AAAA,MACN,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,kBAAkB,oBAAI,IAA2C;AAAA,EACjE,gBAAgB,oBAAI,IAA6B;AAAA,EAEzD,cAAc;AACZ,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEO,kBACL,aAAsB,OACtB,SACmB;AACnB,SAAK,aAAa,iBAAiB;AAEnC,QAAI,CAAC,YAAY;AACf,aAAO,CAAC;AAAA,IACV;AAEA,QACE,KAAK,aAAa,iBAClB,KAAK,aAAa,OAAO,wBACzB;AACA,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,YAA+B,CAAC;AACtC,UAAM,cAAc,KAAK,IAAI;AAE7B,UAAM,qBAAqB;AAAA,MACzB,MAAM,KAAK,kBAAkB,OAAO;AAAA,MACpC,MAAM,KAAK,sBAAsB;AAAA,MACjC,MAAM,KAAK,yBAAyB;AAAA,MACpC,MAAM,KAAK,oBAAoB;AAAA,IACjC;AAEA,eAAW,aAAa,oBAAoB;AAC1C,UAAI,UAAU,UAAU,EAAG;AAE3B,YAAM,SAAS,UAAU;AACzB,UAAI,QAAQ;AACV,cAAM,iBAAiB,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAC/D,kBAAU,KAAK,GAAG,cAAc;AAChC,aAAK,aAAa,iBAAiB,eAAe;AAAA,MACpD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,SAA0C;AAClE,QAAI,CAAC,KAAK,aAAa,OAAO,kBAAmB,QAAO;AAExD,UAAM,QAAQ,SAAS,OAAO;AAC9B,UAAM,cAAc,KAAK,IAAI;AAC7B,UAAM,WAAW,WAAW;AAE5B,QACE,MAAM,WAAW,KACjB,CAAC,KAAK,aAAa,cAAc,IAAI,cAAc,QAAQ,EAAE,GAC7D;AACA,WAAK,aAAa,cAAc,IAAI,cAAc,QAAQ,EAAE;AAC5D,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,cAAc,gBAAgB,QAAQ,IAAI,MAAM,MAAM,IAAI,KAAK,iBAAiB,KAAK,CAAC;AAE5F,UAAI,KAAK,cAAc,IAAI,WAAW,GAAG;AACvC,eAAO,KAAK,cAAc,IAAI,WAAW;AAAA,MAC3C;AAEA,UAAI,CAAC,KAAK,aAAa,cAAc,IAAI,WAAW,GAAG;AACrD,aAAK,aAAa,cAAc,IAAI,WAAW;AAC/C,aAAK,mBAAmB,QAAQ;AAEhC,cAAM,cAAc,KAAK;AAAA,UACvB,MAAM,IAAI,WAAS;AAAA,YACjB,SACE,KAAK,QAAQ,SAAS,MAClB,KAAK,QAAQ,UAAU,GAAG,GAAG,IAAI,QACjC,KAAK;AAAA,YACX,QAAQ,KAAK;AAAA,YACb,YACE,KAAK,cAAc,KAAK,WAAW,SAAS,MACxC,KAAK,WAAW,UAAU,GAAG,GAAG,IAAI,QACpC,KAAK,cAAc,KAAK;AAAA,UAChC,EAAE;AAAA,QACJ;AAEA,cAAM,WAAW,KAAK;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,EAA8H,WAAW;AAAA,UACzI;AAAA,QACF;AAEA,aAAK,cAAc,IAAI,aAAa,QAAQ;AAC5C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAgD;AACtD,QAAI,CAAC,KAAK,aAAa,OAAO,iBAAkB,QAAO;AAEvD,UAAM,cAAc,KAAK,IAAI;AAE7B,QACE,KAAK,aAAa,iBAAiB,KACnC,CAAC,KAAK,aAAa,cAAc,IAAI,eAAe,GACpD;AACA,WAAK,aAAa,cAAc,IAAI,eAAe;AACnD,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,2BAAmD;AACzD,QAAI,CAAC,KAAK,aAAa,OAAO,oBAAqB,QAAO;AAE1D,UAAM,cAAc,KAAK,IAAI;AAC7B,UAAM,kBAAkB,cAAc,KAAK,aAAa;AAExD,QACE,kBAAkB,KAAK,KAAK,OAC5B,CAAC,KAAK,aAAa,cAAc,IAAI,0BAA0B,GAC/D;AACA,WAAK,aAAa,cAAc,IAAI,0BAA0B;AAC9D,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,sBAAyC;AAC/C,UAAM,cAAc,KAAK,IAAI;AAC7B,UAAM,2BAA2B;AACjC,UAAM,YAA+B,CAAC;AACtC,UAAM,cAAwB,CAAC;AAE/B,eAAW,CAAC,KAAK,QAAQ,KAAK,KAAK,cAAc,QAAQ,GAAG;AAC1D,UAAI,KAAK,kBAAkB,QAAQ,GAAG;AACpC,cAAM,MAAM,cAAc,SAAS;AACnC,YAAI,OAAO,0BAA0B;AACnC,oBAAU,KAAK,QAAQ;AAAA,QACzB,OAAO;AACL,sBAAY,KAAK,GAAG;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,gBAAY,QAAQ,SAAO,KAAK,cAAc,OAAO,GAAG,CAAC;AAEzD,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,UAAoC;AAC5D,UAAM,eAAe,CAAC,iBAAiB,gBAAgB,mBAAmB;AAC1E,WAAO,aAAa,SAAS,SAAS,IAAI;AAAA,EAC5C;AAAA,EAEO,2BAA2B,SAAsC;AACtE,UAAM,EAAE,SAAS,UAAU,SAAS,IAAI;AAExC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,KAAK,IAAI;AAC7B,UAAM,cAAc,gBAAgB,OAAO,IAAI,QAAQ,IAAI,WAAW;AAEtE,QAAI,KAAK,aAAa,cAAc,IAAI,WAAW,GAAG;AACpD,aAAO;AAAA,IACT;AAEA,SAAK,aAAa,cAAc,IAAI,WAAW;AAE/C,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBACN,MACA,UACA,UACA,SACA,WACiB;AACjB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,EAAsB,OAAO;AAAA;AAAA,MACtC,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAA2B;AAClD,WAAO,MACJ,IAAI,OAAK,GAAG,EAAE,OAAO,IAAI,EAAE,MAAM,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,EAChE,KAAK,EACL,KAAK,GAAG;AAAA,EACb;AAAA,EAEQ,mBAAmB,SAAwB;AACjD,UAAM,WAAW,WAAW;AAC5B,eAAW,OAAO,KAAK,aAAa,eAAe;AACjD,UAAI,IAAI,WAAW,gBAAgB,QAAQ,GAAG,GAAG;AAC/C,aAAK,aAAa,cAAc,OAAO,GAAG;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,uBAA6B;AACnC,SAAK,iBAAiB,mBAAmB,aAAW;AAClD,WAAK,aAAa;AAElB,WAAK,aAAa,mBAAmB,KAAK,IAAI;AAC9C,WAAK,aAAa,iBAChB,OAAO,KAAK,QAAQ,WAAW,CAAC,CAAC,EAAE,SAAS;AAAA,IAChD,CAAC;AAED,SAAK,iBAAiB,gBAAgB,aAAW;AAC/C,WAAK,aAAa,iBAAiB,KAAK,IAAI;AAC5C,WAAK,mBAAmB,QAAQ,OAAO;AAAA,IACzC,CAAC;AAED,SAAK,iBAAiB,qBAAqB,aAAW;AACpD,YAAM,UAAU,QAAQ,WAAW;AACnC,WAAK,mBAAmB,OAAO;AAC/B,WAAK,aAAa,iBAAiB,KAAK,IAAI;AAE5C,YAAM,WAAW,KAAK,2BAA2B,OAAO;AACxD,UAAI,UAAU;AACZ,aAAK,UAAU,mBAAmB;AAAA,UAChC,UAAU,SAAS;AAAA,UACnB;AAAA,UACA,MAAM;AAAA,UACN,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,SAAK,iBAAiB,aAAa,aAAW;AAC5C,WAAK,aAAa,iBAAiB,KAAK,IAAI;AAAA,IAC9C,CAAC;AAED,SAAK,iBAAiB,eAAe,aAAW;AAAA,IAChD,CAAC;AAED,SAAK,iBAAiB,mBAAmB,aAAW;AAClD,WAAK,sBAAsB;AAAA,QACzB,MAAM;AAAA,QACN,KAAK,iBAAiB,QAAQ,SAAS,IAAI,QAAQ,SAAS;AAAA,QAC5D,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS,uBAAuB,QAAQ,eAAe,oDAAoD,QAAQ,SAAS,qJAAqJ,QAAQ,SAAS;AAAA,QAClS,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH,CAAC;AAED,SAAK,iBAAiB,kBAAkB,aAAW;AACjD,WAAK,sBAAsB;AAAA,QACzB,MAAM;AAAA,QACN,KAAK,gBAAgB,QAAQ,QAAQ,IAAI,QAAQ,SAAS;AAAA,QAC1D,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS,uBAAuB,QAAQ,eAAe,2DAA2D,QAAQ,QAAQ;AAAA,QAClI,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH,CAAC;AAED,SAAK,iBAAiB,uBAAuB,aAAW;AACtD,WAAK,sBAAsB;AAAA,QACzB,MAAM;AAAA,QACN,KAAK,qBAAqB,QAAQ,SAAS,IAAI,QAAQ,SAAS;AAAA,QAChE,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS,uBAAuB,QAAQ,SAAS,gMAAgM,QAAQ,SAAS;AAAA,QAClQ,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEO,iBACL,OACA,UACM;AACN,QAAI,CAAC,KAAK,gBAAgB,IAAI,KAAK,GAAG;AACpC,WAAK,gBAAgB,IAAI,OAAO,CAAC,CAAC;AAAA,IACpC;AACA,SAAK,gBAAgB,IAAI,KAAK,EAAG,KAAK,QAAQ;AAAA,EAChD;AAAA,EAEO,UAAU,OAAe,SAAoB;AAClD,UAAM,YAAY,KAAK,gBAAgB,IAAI,KAAK,KAAK,CAAC;AACtD,cAAU,QAAQ,cAAY;AAC5B,UAAI;AACF,iBAAS,OAAO;AAAA,MAClB,SAAS,OAAO;AACd,iBAAS,KAAK;AACd,cAAY,KAAK,kCAAkC;AAAA,UACjD;AAAA,UACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,sBAAsB,QAOrB;AACP,QAAI,CAAC,KAAK,aAAa,cAAc,IAAI,OAAO,GAAG,GAAG;AACpD,WAAK,aAAa,cAAc,IAAI,OAAO,GAAG;AAE9C,YAAM,WAAW,KAAK;AAAA,QACpB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAEA,WAAK,cAAc,IAAI,OAAO,KAAK,QAAQ;AAAA,IAC7C;AAAA,EACF;AAAA,EAEO,eAAqB;AAC1B,SAAK,eAAe;AAAA,MAClB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,kBAAkB,KAAK,IAAI;AAAA,MAC3B,eAAe,oBAAI,IAAI;AAAA,MACvB,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,QAAQ,EAAE,GAAG,KAAK,aAAa,OAAO;AAAA,IACxC;AACA,SAAK,cAAc,MAAM;AAAA,EAC3B;AAAA,EAEO,aAAa,QAAuC;AACzD,SAAK,aAAa,SAAS,EAAE,GAAG,KAAK,aAAa,QAAQ,GAAG,OAAO;AAAA,EACtE;AAAA,EAEO,kBAAwC;AAC7C,WAAO,EAAE,GAAG,KAAK,aAAa;AAAA,EAChC;AACF;AAEO,IAAM,wBAAwB,IAAI,sBAAsB;AAExD,IAAM,0BAA0B,CACrC,aAAsB,OACtB,YACG,sBAAsB,kBAAkB,YAAY,OAAO;AAKzD,IAAM,oBAAoB,CAAC,OAAe,YAC/C,sBAAsB,UAAU,OAAO,OAAO;AAEzC,IAAM,uBAAuB,MAAM,sBAAsB,aAAa;",
6
- "names": ["processedTodos", "updatedTodos"]
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/utils/text/generators.ts"],
4
- "sourcesContent": ["const NO_VALUE = Symbol('NO_VALUE')\n\nexport async function lastX<A>(as: AsyncGenerator<A>): Promise<A> {\n let lastValue: A | typeof NO_VALUE = NO_VALUE\n for await (const a of as) {\n lastValue = a\n }\n if (lastValue === NO_VALUE) {\n throw new Error('No items in generator')\n }\n return lastValue\n}\n\ntype QueuedGenerator<A> = {\n done: boolean | void\n value: A | void\n generator: AsyncGenerator<A, void>\n promise: Promise<QueuedGenerator<A>>\n}\n\nexport async function* all<A>(\n generators: AsyncGenerator<A, void>[],\n concurrencyCap = Infinity,\n): AsyncGenerator<A, void> {\n const next = (generator: AsyncGenerator<A, void>) => {\n const promise: Promise<QueuedGenerator<A>> = generator\n .next()\n .then(({ done, value }) => ({\n done,\n value,\n generator,\n promise,\n }))\n return promise\n }\n const waiting = [...generators]\n const promises = new Set<Promise<QueuedGenerator<A>>>()\n\n while (promises.size < concurrencyCap && waiting.length > 0) {\n const gen = waiting.shift()!\n promises.add(next(gen))\n }\n\n while (promises.size > 0) {\n const { done, value, generator, promise } = await Promise.race(promises)\n promises.delete(promise)\n\n if (!done) {\n promises.add(next(generator))\n if (value !== undefined) {\n yield value as A\n }\n } else if (waiting.length > 0) {\n const nextGen = waiting.shift()!\n promises.add(next(nextGen))\n }\n }\n}\n"],
5
- "mappings": ";;;;AAAA,IAAM,WAAW,OAAO,UAAU;AAElC,eAAsB,MAAS,IAAmC;AAChE,MAAI,YAAiC;AACrC,mBAAiB,KAAK,IAAI;AACxB,gBAAY;AAAA,EACd;AACA,MAAI,cAAc,UAAU;AAC1B,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/permissions/toolPermissionSettings.ts"],
4
- "sourcesContent": ["import type {\n ToolPermissionContext,\n ToolPermissionContextUpdate,\n ToolPermissionRuleBehavior,\n ToolPermissionUpdateDestination,\n} from '@kode-types/toolPermissionContext'\nimport {\n createDefaultToolPermissionContext,\n isPersistableToolPermissionDestination,\n} from '@kode-types/toolPermissionContext'\nimport { getCurrentProjectConfig } from '@utils/config'\nimport { getCwd } from '@utils/state'\nimport { logError } from '@utils/log'\nimport {\n getSettingsFileCandidates,\n loadSettingsWithLegacyFallback,\n saveSettingsToPrimaryAndSyncLegacy,\n type SettingsFile,\n} from '@utils/config/settingsFiles'\n\ntype SettingsPermissions = {\n allow?: unknown\n deny?: unknown\n ask?: unknown\n additionalDirectories?: unknown\n}\n\ntype SettingsFileWithPermissions = {\n permissions?: SettingsPermissions\n [key: string]: unknown\n}\n\nfunction uniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const out: string[] = []\n const seen = new Set<string>()\n for (const item of value) {\n if (typeof item !== 'string') continue\n if (seen.has(item)) continue\n seen.add(item)\n out.push(item)\n }\n return out\n}\n\nfunction getPrimarySettingsFilePathForDestination(options: {\n destination: ToolPermissionUpdateDestination\n projectDir?: string\n homeDir?: string\n}): string | null {\n const candidates = getSettingsFileCandidates({\n destination: options.destination as any,\n projectDir: options.projectDir,\n homeDir: options.homeDir,\n })\n return candidates?.primary ?? null\n}\n\nexport function loadToolPermissionContextFromDisk(options?: {\n projectDir?: string\n homeDir?: string\n includeKodeProjectConfig?: boolean\n isBypassPermissionsModeAvailable?: boolean\n}): ToolPermissionContext {\n const projectDir = options?.projectDir ?? getCwd()\n const homeDir = options?.homeDir\n const includeKodeProjectConfig = options?.includeKodeProjectConfig ?? true\n\n const base = createDefaultToolPermissionContext({\n isBypassPermissionsModeAvailable:\n options?.isBypassPermissionsModeAvailable ?? false,\n })\n\n const destinations: ToolPermissionUpdateDestination[] = [\n 'userSettings',\n 'projectSettings',\n 'localSettings',\n ]\n\n for (const destination of destinations) {\n const settings = loadSettingsWithLegacyFallback({\n destination: destination as any,\n projectDir,\n homeDir,\n migrateToPrimary: true,\n }).settings as SettingsFileWithPermissions | null\n const perms = settings?.permissions\n const allow = uniqueStrings(perms?.allow)\n const deny = uniqueStrings(perms?.deny)\n const ask = uniqueStrings(perms?.ask)\n const additionalDirectories = uniqueStrings(perms?.additionalDirectories)\n\n if (allow.length > 0) base.alwaysAllowRules[destination] = allow\n if (deny.length > 0) base.alwaysDenyRules[destination] = deny\n if (ask.length > 0) base.alwaysAskRules[destination] = ask\n\n for (const dir of additionalDirectories) {\n base.additionalWorkingDirectories.set(dir, {\n path: dir,\n source: destination,\n })\n }\n }\n\n if (includeKodeProjectConfig) {\n try {\n const cfg = getCurrentProjectConfig()\n const allow = Array.isArray(cfg.allowedTools) ? cfg.allowedTools : []\n const deny = Array.isArray((cfg as any).deniedTools)\n ? (cfg as any).deniedTools\n : []\n const ask = Array.isArray((cfg as any).askedTools)\n ? (cfg as any).askedTools\n : []\n\n if (allow.length > 0) {\n const prev = base.alwaysAllowRules.localSettings ?? []\n base.alwaysAllowRules.localSettings = [...new Set([...prev, ...allow])]\n }\n if (deny.length > 0) {\n const prev = base.alwaysDenyRules.localSettings ?? []\n base.alwaysDenyRules.localSettings = [...new Set([...prev, ...deny])]\n }\n if (ask.length > 0) {\n const prev = base.alwaysAskRules.localSettings ?? []\n base.alwaysAskRules.localSettings = [...new Set([...prev, ...ask])]\n }\n } catch (error) {\n logError(error)\n }\n }\n\n return base\n}\n\nfunction getOrCreatePermissions(\n settings: SettingsFileWithPermissions,\n): Required<SettingsFileWithPermissions>['permissions'] {\n const existing = settings.permissions\n if (existing && typeof existing === 'object') {\n return existing as SettingsPermissions\n }\n settings.permissions = {}\n return settings.permissions as SettingsPermissions\n}\n\nfunction behaviorKey(\n behavior: ToolPermissionRuleBehavior,\n): keyof SettingsPermissions {\n switch (behavior) {\n case 'allow':\n return 'allow'\n case 'deny':\n return 'deny'\n case 'ask':\n return 'ask'\n }\n}\n\nexport function persistToolPermissionUpdateToDisk(options: {\n update: ToolPermissionContextUpdate\n projectDir?: string\n homeDir?: string\n}): { persisted: boolean } {\n const update = options.update\n if (!isPersistableToolPermissionDestination(update.destination)) {\n return { persisted: false }\n }\n if (update.type === 'setMode') {\n return { persisted: false }\n }\n\n const filePath = getPrimarySettingsFilePathForDestination({\n destination: update.destination,\n projectDir: options.projectDir,\n homeDir: options.homeDir,\n })\n if (!filePath) return { persisted: false }\n\n const existing =\n (loadSettingsWithLegacyFallback({\n destination: update.destination as any,\n projectDir: options.projectDir,\n homeDir: options.homeDir,\n migrateToPrimary: true,\n }).settings as SettingsFileWithPermissions | null) ?? {}\n const permissions = getOrCreatePermissions(existing)\n\n try {\n switch (update.type) {\n case 'addRules':\n case 'replaceRules':\n case 'removeRules': {\n const key = behaviorKey(update.behavior)\n const current = uniqueStrings(permissions[key])\n\n if (update.type === 'addRules') {\n const merged = [...new Set([...current, ...update.rules])]\n permissions[key] = merged\n } else if (update.type === 'replaceRules') {\n permissions[key] = uniqueStrings(update.rules)\n } else {\n const toRemove = new Set(update.rules)\n permissions[key] = current.filter(rule => !toRemove.has(rule))\n }\n break\n }\n case 'addDirectories':\n case 'removeDirectories': {\n const current = uniqueStrings(permissions.additionalDirectories)\n if (update.type === 'addDirectories') {\n permissions.additionalDirectories = [\n ...new Set([...current, ...update.directories]),\n ]\n } else {\n const toRemove = new Set(update.directories)\n permissions.additionalDirectories = current.filter(\n dir => !toRemove.has(dir),\n )\n }\n break\n }\n default:\n return { persisted: false }\n }\n\n saveSettingsToPrimaryAndSyncLegacy({\n destination: update.destination as any,\n projectDir: options.projectDir,\n homeDir: options.homeDir,\n settings: existing as SettingsFile,\n syncLegacyIfExists: true,\n })\n return { persisted: true }\n } catch (error) {\n logError(error)\n return { persisted: 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/session/kodeHooks.ts"],
4
- "sourcesContent": ["import { spawn } from 'child_process'\nimport { existsSync, readFileSync, statSync } from 'fs'\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'fs'\nimport { tmpdir } from 'os'\nimport { join } from 'path'\nimport { minimatch } from 'minimatch'\nimport { logError } from '@utils/log'\nimport { getCwd } from '@utils/state'\nimport { getKodeAgentSessionId } from '@utils/protocol/kodeAgentSessionId'\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\nimport { loadSettingsWithLegacyFallback } from '@utils/config/settingsFiles'\n\ntype HookEventName =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'Stop'\n | 'SubagentStop'\n | 'UserPromptSubmit'\n | 'SessionStart'\n | 'SessionEnd'\n\ntype CommandHook = {\n type: 'command'\n command: string\n timeout?: number\n pluginRoot?: string\n}\n\ntype PromptHook = {\n type: 'prompt'\n prompt: string\n timeout?: number\n pluginRoot?: string\n}\n\ntype Hook = CommandHook | PromptHook\n\ntype HookMatcher = {\n matcher: string\n hooks: Hook[]\n}\n\ntype HookFileEnvelope = {\n description?: unknown\n hooks?: unknown\n [key: string]: unknown\n}\n\ntype HooksSettings = Partial<Record<HookEventName, HookMatcher[]>> & {\n [key: string]: unknown\n}\n\ntype SettingsFileWithHooks = {\n hooks?: HooksSettings\n [key: string]: unknown\n}\n\nexport type PreToolUseHookOutcome =\n | {\n kind: 'allow'\n warnings: string[]\n permissionDecision?: 'allow' | 'ask'\n updatedInput?: Record<string, unknown>\n systemMessages?: string[]\n additionalContexts?: string[]\n }\n | {\n kind: 'block'\n message: string\n systemMessages?: string[]\n additionalContexts?: string[]\n }\n\ntype CachedHooks = {\n mtimeMs: number\n byEvent: Partial<Record<HookEventName, HookMatcher[]>>\n}\n\nconst cache = new Map<string, CachedHooks>()\nconst pluginHooksCache = new Map<string, CachedHooks>()\nconst sessionStartCache = new Map<string, { additionalContext: string }>()\n\ntype HookRuntimeState = {\n transcriptPath?: string\n queuedSystemMessages: string[]\n queuedAdditionalContexts: string[]\n}\n\nconst HOOK_RUNTIME_STATE_KEY = '__kodeHookRuntimeState'\n\nfunction getHookRuntimeState(toolUseContext: any): HookRuntimeState {\n const existing = toolUseContext?.[HOOK_RUNTIME_STATE_KEY]\n if (\n existing &&\n typeof existing === 'object' &&\n Array.isArray((existing as any).queuedSystemMessages) &&\n Array.isArray((existing as any).queuedAdditionalContexts)\n ) {\n return existing as HookRuntimeState\n }\n const created: HookRuntimeState = {\n transcriptPath: undefined,\n queuedSystemMessages: [],\n queuedAdditionalContexts: [],\n }\n if (toolUseContext && typeof toolUseContext === 'object') {\n ;(toolUseContext as any)[HOOK_RUNTIME_STATE_KEY] = created\n }\n return created\n}\n\nexport function updateHookTranscriptForMessages(\n toolUseContext: any,\n messages: any[],\n): void {\n const state = getHookRuntimeState(toolUseContext)\n const sessionId = getKodeAgentSessionId()\n\n const dir = join(tmpdir(), 'kode-hooks-transcripts')\n try {\n mkdirSync(dir, { recursive: true })\n } catch {}\n\n if (!state.transcriptPath) {\n state.transcriptPath = join(dir, `${sessionId}.transcript.txt`)\n }\n\n const lines: string[] = []\n for (const msg of Array.isArray(messages) ? messages : []) {\n if (!msg || typeof msg !== 'object') continue\n if (msg.type !== 'user' && msg.type !== 'assistant') continue\n\n if (msg.type === 'user') {\n const content = (msg as any)?.message?.content\n if (typeof content === 'string') {\n lines.push(`user: ${content}`)\n continue\n }\n if (Array.isArray(content)) {\n const parts: string[] = []\n for (const block of content) {\n if (!block || typeof block !== 'object') continue\n if (block.type === 'text') parts.push(String(block.text ?? ''))\n if (block.type === 'tool_result')\n parts.push(`[tool_result] ${String(block.content ?? '')}`)\n }\n lines.push(`user: ${parts.join('')}`)\n }\n continue\n }\n\n const content = (msg as any)?.message?.content\n if (typeof content === 'string') {\n lines.push(`assistant: ${content}`)\n continue\n }\n if (!Array.isArray(content)) continue\n\n const parts: string[] = []\n for (const block of content) {\n if (!block || typeof block !== 'object') continue\n if (block.type === 'text') parts.push(String(block.text ?? ''))\n if (block.type === 'tool_use' || block.type === 'server_tool_use') {\n parts.push(\n `[tool_use:${String(block.name ?? '')}] ${hookValueForPrompt(block.input)}`,\n )\n }\n if (block.type === 'mcp_tool_use') {\n parts.push(\n `[mcp_tool_use:${String(block.name ?? '')}] ${hookValueForPrompt(block.input)}`,\n )\n }\n }\n lines.push(`assistant: ${parts.join('')}`)\n }\n\n try {\n writeFileSync(state.transcriptPath, lines.join('\\n') + '\\n', 'utf8')\n } catch {}\n}\n\nexport function drainHookSystemPromptAdditions(toolUseContext: any): string[] {\n const state = getHookRuntimeState(toolUseContext)\n const systemMessages = state.queuedSystemMessages.splice(\n 0,\n state.queuedSystemMessages.length,\n )\n const contexts = state.queuedAdditionalContexts.splice(\n 0,\n state.queuedAdditionalContexts.length,\n )\n\n const additions: string[] = []\n if (systemMessages.length > 0) {\n additions.push(\n ['\\n# Hook system messages', ...systemMessages.map(m => m.trim())]\n .filter(Boolean)\n .join('\\n\\n'),\n )\n }\n if (contexts.length > 0) {\n additions.push(\n ['\\n# Hook additional context', ...contexts.map(m => m.trim())]\n .filter(Boolean)\n .join('\\n\\n'),\n )\n }\n return additions\n}\n\nexport function getHookTranscriptPath(toolUseContext: any): string | undefined {\n return getHookRuntimeState(toolUseContext).transcriptPath\n}\n\nexport function queueHookSystemMessages(\n toolUseContext: any,\n messages: string[],\n): void {\n const state = getHookRuntimeState(toolUseContext)\n for (const msg of messages) {\n const trimmed = String(msg ?? '').trim()\n if (trimmed) state.queuedSystemMessages.push(trimmed)\n }\n}\n\nexport function queueHookAdditionalContexts(\n toolUseContext: any,\n contexts: string[],\n): void {\n const state = getHookRuntimeState(toolUseContext)\n for (const ctx of contexts) {\n const trimmed = String(ctx ?? '').trim()\n if (trimmed) state.queuedAdditionalContexts.push(trimmed)\n }\n}\n\nfunction isCommandHook(value: unknown): value is CommandHook {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as any).type === 'command' &&\n typeof (value as any).command === 'string' &&\n Boolean((value as any).command.trim())\n )\n}\n\nfunction isPromptHook(value: unknown): value is PromptHook {\n return (\n value !== null &&\n typeof value === 'object' &&\n (value as any).type === 'prompt' &&\n typeof (value as any).prompt === 'string' &&\n Boolean((value as any).prompt.trim())\n )\n}\n\nfunction isHook(value: unknown): value is Hook {\n return isCommandHook(value) || isPromptHook(value)\n}\n\nfunction parseHookMatchers(value: unknown): HookMatcher[] {\n if (!Array.isArray(value)) return []\n\n const out: HookMatcher[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object') continue\n const matcher =\n typeof (item as any).matcher === 'string'\n ? (item as any).matcher.trim()\n : ''\n const effectiveMatcher = matcher || '*'\n const hooksRaw = (item as any).hooks\n const hooks = Array.isArray(hooksRaw) ? hooksRaw.filter(isHook) : []\n if (hooks.length === 0) continue\n out.push({ matcher: effectiveMatcher, hooks })\n }\n return out\n}\n\nfunction parseHooksByEvent(\n rawHooks: unknown,\n): Partial<Record<HookEventName, HookMatcher[]>> {\n if (!rawHooks || typeof rawHooks !== 'object') return {}\n const hooks: any = rawHooks\n return {\n PreToolUse: parseHookMatchers(hooks.PreToolUse),\n PostToolUse: parseHookMatchers(hooks.PostToolUse),\n Stop: parseHookMatchers(hooks.Stop),\n SubagentStop: parseHookMatchers(hooks.SubagentStop),\n UserPromptSubmit: parseHookMatchers(hooks.UserPromptSubmit),\n SessionStart: parseHookMatchers(hooks.SessionStart),\n SessionEnd: parseHookMatchers(hooks.SessionEnd),\n }\n}\n\nfunction loadInlinePluginHooksByEvent(plugin: {\n manifestPath: string\n manifest: unknown\n}): Partial<Record<HookEventName, HookMatcher[]>> | null {\n const manifestHooks = (plugin.manifest as any)?.hooks\n if (\n !manifestHooks ||\n typeof manifestHooks !== 'object' ||\n Array.isArray(manifestHooks)\n )\n return null\n\n const hookObj =\n (manifestHooks as any).hooks &&\n typeof (manifestHooks as any).hooks === 'object' &&\n !Array.isArray((manifestHooks as any).hooks)\n ? (manifestHooks as any).hooks\n : manifestHooks\n\n const cacheKey = `${plugin.manifestPath}#inlineHooks`\n try {\n const stat = statSync(plugin.manifestPath)\n const cached = pluginHooksCache.get(cacheKey)\n if (cached && cached.mtimeMs === stat.mtimeMs) return cached.byEvent\n\n const byEvent = parseHooksByEvent(hookObj)\n pluginHooksCache.set(cacheKey, { mtimeMs: stat.mtimeMs, byEvent })\n return byEvent\n } catch (err) {\n logError(err)\n pluginHooksCache.delete(cacheKey)\n return null\n }\n}\n\nfunction loadPreToolUseMatchers(projectDir: string): HookMatcher[] {\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'projectSettings',\n projectDir,\n migrateToPrimary: true,\n })\n const settingsPath = loaded.usedPath\n if (!settingsPath) return []\n try {\n const stat = statSync(settingsPath)\n const cached = cache.get(settingsPath)\n if (cached && cached.mtimeMs === stat.mtimeMs)\n return cached.byEvent.PreToolUse ?? []\n\n const parsed = loaded.settings as SettingsFileWithHooks | null\n const byEvent = parseHooksByEvent(parsed?.hooks)\n cache.set(settingsPath, { mtimeMs: stat.mtimeMs, byEvent })\n return byEvent.PreToolUse ?? []\n } catch {\n cache.delete(settingsPath)\n return []\n }\n}\n\nfunction loadSettingsMatchers(\n projectDir: string,\n event: HookEventName,\n): HookMatcher[] {\n const loaded = loadSettingsWithLegacyFallback({\n destination: 'projectSettings',\n projectDir,\n migrateToPrimary: true,\n })\n const settingsPath = loaded.usedPath\n if (!settingsPath) return []\n try {\n const stat = statSync(settingsPath)\n const cached = cache.get(settingsPath)\n if (cached && cached.mtimeMs === stat.mtimeMs)\n return cached.byEvent[event] ?? []\n\n const parsed = loaded.settings as SettingsFileWithHooks | null\n const byEvent = parseHooksByEvent(parsed?.hooks)\n cache.set(settingsPath, { mtimeMs: stat.mtimeMs, byEvent })\n return byEvent[event] ?? []\n } catch {\n cache.delete(settingsPath)\n return []\n }\n}\n\nfunction matcherMatchesTool(matcher: string, toolName: string): boolean {\n if (!matcher) return false\n if (matcher === '*' || matcher === 'all') return true\n if (matcher === toolName) return true\n try {\n if (minimatch(toolName, matcher, { dot: true, nocase: false })) return true\n } catch {\n }\n try {\n if (new RegExp(matcher).test(toolName)) return true\n } catch {\n }\n return false\n}\n\nfunction buildShellCommand(command: string): string[] {\n if (process.platform === 'win32') {\n return ['cmd.exe', '/d', '/s', '/c', command]\n }\n return ['/bin/sh', '-c', command]\n}\n\nasync function runCommandHook(args: {\n command: string\n stdinJson: unknown\n cwd: string\n env?: Record<string, string>\n signal?: AbortSignal\n}): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n const cmd = buildShellCommand(args.command)\n const proc = spawn(cmd[0], cmd.slice(1), {\n cwd: args.cwd,\n env: { ...(process.env as any), ...(args.env ?? {}) },\n stdio: ['pipe', 'pipe', 'pipe'],\n windowsHide: true,\n })\n\n let wasAborted = false\n const onAbort = () => {\n wasAborted = true\n try {\n proc.kill()\n } catch {}\n }\n if (args.signal) {\n if (args.signal.aborted) onAbort()\n args.signal.addEventListener('abort', onAbort, { once: true })\n }\n\n try {\n const input = JSON.stringify(args.stdinJson)\n try {\n proc.stdin?.write(input)\n proc.stdin?.end()\n } catch {}\n\n let stdout = ''\n let stderr = ''\n\n const collect = (\n stream: NodeJS.ReadableStream | null,\n append: (chunk: string) => void,\n ): { done: Promise<void>; cleanup: () => void } => {\n if (!stream) {\n return { done: Promise.resolve(), cleanup: () => {} }\n }\n try {\n ;(stream as any).setEncoding?.('utf8')\n } catch {}\n\n let resolveDone: (() => void) | null = null\n const done = new Promise<void>(resolve => {\n resolveDone = resolve\n })\n\n const finish = () => {\n cleanup()\n if (!resolveDone) return\n resolveDone()\n resolveDone = null\n }\n\n const onData = (chunk: unknown) => {\n append(\n typeof chunk === 'string'\n ? chunk\n : Buffer.isBuffer(chunk)\n ? chunk.toString('utf8')\n : String(chunk),\n )\n }\n\n const onError = () => finish()\n\n const cleanup = () => {\n stream.off('data', onData)\n stream.off('end', finish)\n stream.off('close', finish)\n stream.off('error', onError)\n }\n\n stream.on('data', onData)\n stream.once('end', finish)\n stream.once('close', finish)\n stream.once('error', onError)\n\n return { done, cleanup }\n }\n\n const stdoutCollector = collect(proc.stdout, chunk => {\n stdout += chunk\n })\n const stderrCollector = collect(proc.stderr, chunk => {\n stderr += chunk\n })\n\n const exitCode = await new Promise<number>(resolve => {\n proc.once('exit', (code, signal) => {\n if (typeof code === 'number') return resolve(code)\n if (signal) return resolve(143)\n return resolve(0)\n })\n proc.once('error', () => resolve(1))\n })\n\n await Promise.race([\n Promise.allSettled([stdoutCollector.done, stderrCollector.done]),\n new Promise(resolve => setTimeout(resolve, 250)),\n ])\n stdoutCollector.cleanup()\n stderrCollector.cleanup()\n\n return {\n exitCode: wasAborted && exitCode === 0 ? 143 : exitCode,\n stdout,\n stderr,\n }\n } finally {\n if (args.signal) {\n try {\n args.signal.removeEventListener('abort', onAbort)\n } catch {}\n }\n }\n}\n\nfunction mergeAbortSignals(signals: Array<AbortSignal | undefined>): {\n signal: AbortSignal\n cleanup: () => void\n} {\n const controller = new AbortController()\n const onAbort = () => controller.abort()\n\n const cleanups: Array<() => void> = []\n for (const signal of signals) {\n if (!signal) continue\n if (signal.aborted) {\n controller.abort()\n continue\n }\n signal.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => {\n try {\n signal.removeEventListener('abort', onAbort)\n } catch {}\n })\n }\n\n return {\n signal: controller.signal,\n cleanup: () => cleanups.forEach(fn => fn()),\n }\n}\n\nfunction withHookTimeout(args: {\n timeoutSeconds?: number\n parentSignal?: AbortSignal\n fallbackTimeoutMs: number\n}): { signal: AbortSignal; cleanup: () => void } {\n const timeoutMs =\n typeof args.timeoutSeconds === 'number' &&\n Number.isFinite(args.timeoutSeconds)\n ? Math.max(0, Math.floor(args.timeoutSeconds * 1000))\n : args.fallbackTimeoutMs\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' &&\n typeof (AbortSignal as any).timeout === 'function'\n ? (AbortSignal as any).timeout(timeoutMs)\n : (() => {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n const signal = controller.signal\n ;(signal as any).__cleanup = () => clearTimeout(timer)\n return signal\n })()\n\n const merged = mergeAbortSignals([args.parentSignal, timeoutSignal])\n const timeoutCleanup =\n typeof (timeoutSignal as any).__cleanup === 'function'\n ? (timeoutSignal as any).__cleanup\n : () => {}\n\n return {\n signal: merged.signal,\n cleanup: () => {\n merged.cleanup()\n timeoutCleanup()\n },\n }\n}\n\nfunction coerceHookMessage(stdout: string, stderr: string): string {\n const s = (stderr || '').trim()\n if (s) return s\n const o = (stdout || '').trim()\n if (o) return o\n return 'Hook blocked the tool call.'\n}\n\nfunction coerceHookPermissionMode(mode: unknown): 'ask' | 'allow' {\n if (mode === 'acceptEdits' || mode === 'bypassPermissions') return 'allow'\n return 'ask'\n}\n\nfunction extractFirstJsonObject(text: string): string | null {\n let start = -1\n let depth = 0\n let inString = false\n let escaped = false\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]\n\n if (start === -1) {\n if (ch === '{') {\n start = i\n depth = 1\n }\n continue\n }\n\n if (inString) {\n if (escaped) {\n escaped = false\n continue\n }\n if (ch === '\\\\') {\n escaped = true\n continue\n }\n if (ch === '\"') {\n inString = false\n }\n continue\n }\n\n if (ch === '\"') {\n inString = true\n continue\n }\n\n if (ch === '{') {\n depth++\n continue\n }\n if (ch === '}') {\n depth--\n if (depth === 0) return text.slice(start, i + 1)\n }\n }\n\n return null\n}\n\nfunction parseSessionStartAdditionalContext(stdout: string): string | null {\n const trimmed = String(stdout ?? '').trim()\n if (!trimmed) return null\n\n const jsonStr = extractFirstJsonObject(trimmed) ?? trimmed\n try {\n const parsed = JSON.parse(jsonStr)\n const additional =\n parsed &&\n typeof parsed === 'object' &&\n (parsed as any).hookSpecificOutput &&\n typeof (parsed as any).hookSpecificOutput.additionalContext === 'string'\n ? String((parsed as any).hookSpecificOutput.additionalContext)\n : null\n return additional && additional.trim() ? additional : null\n } catch {\n return null\n }\n}\n\nfunction tryParseHookJson(stdout: string): any | null {\n const trimmed = String(stdout ?? '').trim()\n if (!trimmed) return null\n const jsonStr = extractFirstJsonObject(trimmed) ?? trimmed\n try {\n const parsed = JSON.parse(jsonStr)\n return parsed && typeof parsed === 'object' ? parsed : null\n } catch {\n return null\n }\n}\n\nfunction normalizePermissionDecision(\n value: unknown,\n): 'allow' | 'deny' | 'ask' | 'passthrough' | null {\n if (typeof value !== 'string') return null\n const normalized = value.trim().toLowerCase()\n if (normalized === 'allow' || normalized === 'approve') return 'allow'\n if (normalized === 'deny' || normalized === 'block') return 'deny'\n if (normalized === 'ask') return 'ask'\n if (normalized === 'passthrough' || normalized === 'continue')\n return 'passthrough'\n return null\n}\n\nfunction normalizeStopDecision(value: unknown): 'approve' | 'block' | null {\n if (typeof value !== 'string') return null\n const normalized = value.trim().toLowerCase()\n if (normalized === 'approve' || normalized === 'allow') return 'approve'\n if (normalized === 'block' || normalized === 'deny') return 'block'\n return null\n}\n\nfunction hookValueForPrompt(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nfunction interpolatePromptHookTemplate(\n template: string,\n hookInput: Record<string, unknown>,\n): string {\n return String(template ?? '')\n .replaceAll('$TOOL_INPUT', hookValueForPrompt(hookInput.tool_input))\n .replaceAll('$TOOL_RESULT', hookValueForPrompt(hookInput.tool_result))\n .replaceAll('$TOOL_RESPONSE', hookValueForPrompt(hookInput.tool_response))\n .replaceAll('$USER_PROMPT', hookValueForPrompt(hookInput.user_prompt))\n .replaceAll('$PROMPT', hookValueForPrompt(hookInput.prompt))\n .replaceAll('$REASON', hookValueForPrompt(hookInput.reason))\n}\n\nfunction extractAssistantText(message: any): string {\n const content = (message as any)?.message?.content\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n return content\n .filter((b: any) => b && typeof b === 'object' && b.type === 'text')\n .map((b: any) => String(b.text ?? ''))\n .join('')\n}\n\nasync function runPromptHook(args: {\n hook: PromptHook\n hookEvent: HookEventName\n hookInput: Record<string, unknown>\n safeMode: boolean\n parentSignal?: AbortSignal\n fallbackTimeoutMs: number\n}): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: args.hook.timeout,\n parentSignal: args.parentSignal,\n fallbackTimeoutMs: args.fallbackTimeoutMs,\n })\n\n try {\n const { queryQuick } = await import('@services/llmLazy')\n\n const systemPrompt = [\n 'You are executing a Kode prompt hook.',\n 'Return a single JSON object only (no markdown, no prose).',\n `hook_event_name: ${args.hookEvent}`,\n 'Valid fields include:',\n '- systemMessage: string',\n '- decision: \\\"approve\\\" | \\\"block\\\" (Stop/SubagentStop only)',\n '- reason: string (Stop/SubagentStop only)',\n '- hookSpecificOutput.permissionDecision: \\\"allow\\\" | \\\"deny\\\" | \\\"ask\\\" | \\\"passthrough\\\" (PreToolUse only)',\n '- hookSpecificOutput.updatedInput: object (PreToolUse only)',\n '- hookSpecificOutput.additionalContext: string (SessionStart/any)',\n ]\n\n const promptText = interpolatePromptHookTemplate(\n args.hook.prompt,\n args.hookInput,\n )\n const userPrompt = `${promptText}\\n\\n# Hook input JSON\\n${hookValueForPrompt(args.hookInput)}`\n\n const response = await queryQuick({\n systemPrompt,\n userPrompt,\n signal,\n })\n\n return { exitCode: 0, stdout: extractAssistantText(response), stderr: '' }\n } catch (err) {\n return {\n exitCode: 1,\n stdout: '',\n stderr: err instanceof Error ? err.message : String(err),\n }\n } finally {\n cleanup()\n }\n}\n\nfunction applyEnvFileToProcessEnv(envFilePath: string): void {\n let raw: string\n try {\n raw = readFileSync(envFilePath, 'utf8')\n } catch {\n return\n }\n\n const lines = raw.split(/\\r?\\n/)\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n\n const withoutExport = trimmed.startsWith('export ')\n ? trimmed.slice('export '.length).trim()\n : trimmed\n\n const eq = withoutExport.indexOf('=')\n if (eq <= 0) continue\n\n const key = withoutExport.slice(0, eq).trim()\n let value = withoutExport.slice(eq + 1).trim()\n if (!key) continue\n\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n\n process.env[key] = value\n }\n}\n\nfunction loadPluginPreToolUseMatchers(projectDir: string): HookMatcher[] {\n const plugins = getSessionPlugins()\n if (plugins.length === 0) return []\n\n const out: HookMatcher[] = []\n for (const plugin of plugins) {\n for (const hookPath of plugin.hooksFiles ?? []) {\n try {\n const stat = statSync(hookPath)\n const cached = pluginHooksCache.get(hookPath)\n if (cached && cached.mtimeMs === stat.mtimeMs) {\n out.push(\n ...(cached.byEvent.PreToolUse ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n continue\n }\n\n const raw = readFileSync(hookPath, 'utf8')\n const parsed = JSON.parse(raw) as HookFileEnvelope\n const hookObj =\n parsed && typeof parsed === 'object' && parsed.hooks\n ? parsed.hooks\n : parsed\n const byEvent = parseHooksByEvent(hookObj)\n pluginHooksCache.set(hookPath, { mtimeMs: stat.mtimeMs, byEvent })\n out.push(\n ...(byEvent.PreToolUse ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n } catch (err) {\n logError(err)\n continue\n }\n }\n\n const inlineByEvent = loadInlinePluginHooksByEvent(plugin)\n if (inlineByEvent?.PreToolUse) {\n out.push(\n ...inlineByEvent.PreToolUse.map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n }\n }\n\n return out\n}\n\nfunction loadPluginMatchers(\n projectDir: string,\n event: HookEventName,\n): HookMatcher[] {\n const plugins = getSessionPlugins()\n if (plugins.length === 0) return []\n\n const out: HookMatcher[] = []\n for (const plugin of plugins) {\n for (const hookPath of plugin.hooksFiles ?? []) {\n try {\n const stat = statSync(hookPath)\n const cached = pluginHooksCache.get(hookPath)\n if (cached && cached.mtimeMs === stat.mtimeMs) {\n out.push(\n ...(cached.byEvent[event] ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n continue\n }\n\n const raw = readFileSync(hookPath, 'utf8')\n const parsed = JSON.parse(raw) as HookFileEnvelope\n const hookObj =\n parsed && typeof parsed === 'object' && parsed.hooks\n ? parsed.hooks\n : parsed\n const byEvent = parseHooksByEvent(hookObj)\n pluginHooksCache.set(hookPath, { mtimeMs: stat.mtimeMs, byEvent })\n out.push(\n ...(byEvent[event] ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n } catch (err) {\n logError(err)\n continue\n }\n }\n\n const inlineByEvent = loadInlinePluginHooksByEvent(plugin)\n if (inlineByEvent?.[event]) {\n out.push(\n ...(inlineByEvent[event] ?? []).map(m => ({\n matcher: m.matcher,\n hooks: m.hooks.map(h => ({ ...h, pluginRoot: plugin.rootDir })),\n })),\n )\n }\n }\n return out\n}\n\nfunction parseSessionStartHooks(value: unknown): CommandHook[] {\n if (!Array.isArray(value)) return []\n const out: CommandHook[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object') continue\n const hooksRaw = (item as any).hooks\n const hooks = Array.isArray(hooksRaw) ? hooksRaw.filter(isCommandHook) : []\n out.push(...hooks)\n }\n return out\n}\n\nexport async function getSessionStartAdditionalContext(args?: {\n permissionMode?: unknown\n cwd?: string\n signal?: AbortSignal\n}): Promise<string> {\n const sessionId = getKodeAgentSessionId()\n const cached = sessionStartCache.get(sessionId)\n if (cached) return cached.additionalContext\n\n const projectDir = args?.cwd ?? getCwd()\n const plugins = getSessionPlugins()\n if (plugins.length === 0) {\n sessionStartCache.set(sessionId, { additionalContext: '' })\n return ''\n }\n\n const envFileDir = mkdtempSync(join(tmpdir(), 'kode-env-'))\n const envFilePath = join(envFileDir, `${sessionId}.env`)\n try {\n writeFileSync(envFilePath, '', 'utf8')\n } catch {\n }\n\n const additionalContexts: string[] = []\n\n try {\n for (const plugin of plugins) {\n for (const hookPath of plugin.hooksFiles ?? []) {\n let hookObj: any\n try {\n const raw = readFileSync(hookPath, 'utf8')\n const parsed = JSON.parse(raw) as HookFileEnvelope\n hookObj =\n parsed && typeof parsed === 'object' && parsed.hooks\n ? parsed.hooks\n : parsed\n } catch {\n continue\n }\n\n const hooks = parseSessionStartHooks(hookObj?.SessionStart).map(h => ({\n ...h,\n pluginRoot: plugin.rootDir,\n }))\n if (hooks.length === 0) continue\n\n for (const hook of hooks) {\n const payload = {\n session_id: sessionId,\n cwd: projectDir,\n hook_event_name: 'SessionStart',\n permission_mode: coerceHookPermissionMode(args?.permissionMode),\n }\n\n const result = await runCommandHook({\n command: hook.command,\n stdinJson: payload,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot\n ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot }\n : {}),\n CLAUDE_ENV_FILE: envFilePath,\n },\n signal: args?.signal,\n })\n\n if (result.exitCode !== 0) continue\n const injected = parseSessionStartAdditionalContext(result.stdout)\n if (injected) additionalContexts.push(injected)\n }\n }\n\n const inlineHooks = (plugin.manifest as any)?.hooks\n if (\n inlineHooks &&\n typeof inlineHooks === 'object' &&\n !Array.isArray(inlineHooks)\n ) {\n const hookObj =\n (inlineHooks as any).hooks &&\n typeof (inlineHooks as any).hooks === 'object' &&\n !Array.isArray((inlineHooks as any).hooks)\n ? (inlineHooks as any).hooks\n : inlineHooks\n\n const hooks = parseSessionStartHooks(\n (hookObj as any)?.SessionStart,\n ).map(h => ({\n ...h,\n pluginRoot: plugin.rootDir,\n }))\n if (hooks.length > 0) {\n for (const hook of hooks) {\n const payload = {\n session_id: sessionId,\n cwd: projectDir,\n hook_event_name: 'SessionStart',\n permission_mode: coerceHookPermissionMode(args?.permissionMode),\n }\n\n const result = await runCommandHook({\n command: hook.command,\n stdinJson: payload,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot\n ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot }\n : {}),\n CLAUDE_ENV_FILE: envFilePath,\n },\n signal: args?.signal,\n })\n\n if (result.exitCode !== 0) continue\n const injected = parseSessionStartAdditionalContext(result.stdout)\n if (injected) additionalContexts.push(injected)\n }\n }\n }\n }\n } finally {\n applyEnvFileToProcessEnv(envFilePath)\n try {\n rmSync(envFileDir, { recursive: true, force: true })\n } catch {}\n }\n\n const additionalContext = additionalContexts.filter(Boolean).join('\\n\\n')\n sessionStartCache.set(sessionId, { additionalContext })\n return additionalContext\n}\n\nexport async function runPreToolUseHooks(args: {\n toolName: string\n toolInput: Record<string, unknown>\n toolUseId: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n signal?: AbortSignal\n}): Promise<PreToolUseHookOutcome> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, 'PreToolUse'),\n ...loadPluginMatchers(projectDir, 'PreToolUse'),\n ]\n if (matchers.length === 0) return { kind: 'allow', warnings: [] }\n\n const applicable = matchers.filter(m =>\n matcherMatchesTool(m.matcher, args.toolName),\n )\n if (applicable.length === 0) return { kind: 'allow', warnings: [] }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: 'PreToolUse',\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n tool_name: args.toolName,\n tool_input: args.toolInput,\n tool_use_id: args.toolUseId,\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n const additionalContexts: string[] = []\n\n let mergedUpdatedInput: Record<string, unknown> | undefined\n let permissionDecision: 'allow' | 'ask' | null = null\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: 'PreToolUse',\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { hook, result } = item.value\n\n if (result.exitCode === 2) {\n return {\n kind: 'block',\n message: coerceHookMessage(result.stdout, result.stderr),\n }\n }\n\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n\n const additional =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n typeof json.hookSpecificOutput.additionalContext === 'string'\n ? String(json.hookSpecificOutput.additionalContext)\n : null\n if (additional && additional.trim()) {\n additionalContexts.push(additional.trim())\n }\n\n const decision = normalizePermissionDecision(\n json.hookSpecificOutput?.permissionDecision,\n )\n if (decision === 'deny') {\n const msg =\n systemMessages.length > 0\n ? systemMessages.join('\\n\\n')\n : coerceHookMessage(result.stdout, result.stderr)\n return {\n kind: 'block',\n message: msg,\n systemMessages,\n additionalContexts,\n }\n }\n\n if (decision === 'ask') {\n permissionDecision = 'ask'\n } else if (decision === 'allow') {\n if (!permissionDecision) permissionDecision = 'allow'\n }\n\n const updated =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n json.hookSpecificOutput.updatedInput &&\n typeof json.hookSpecificOutput.updatedInput === 'object'\n ? (json.hookSpecificOutput.updatedInput as Record<string, unknown>)\n : null\n if (updated) {\n mergedUpdatedInput = { ...(mergedUpdatedInput ?? {}), ...updated }\n }\n }\n\n return {\n kind: 'allow',\n warnings,\n permissionDecision:\n permissionDecision === 'allow'\n ? 'allow'\n : permissionDecision === 'ask'\n ? 'ask'\n : undefined,\n updatedInput:\n permissionDecision === 'allow' ? mergedUpdatedInput : undefined,\n systemMessages,\n additionalContexts,\n }\n}\n\nexport async function runPostToolUseHooks(args: {\n toolName: string\n toolInput: Record<string, unknown>\n toolResult: unknown\n toolUseId: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n signal?: AbortSignal\n}): Promise<{\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n}> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, 'PostToolUse'),\n ...loadPluginMatchers(projectDir, 'PostToolUse'),\n ]\n if (matchers.length === 0) {\n return { warnings: [], systemMessages: [], additionalContexts: [] }\n }\n\n const applicable = matchers.filter(m =>\n matcherMatchesTool(m.matcher, args.toolName),\n )\n if (applicable.length === 0) {\n return { warnings: [], systemMessages: [], additionalContexts: [] }\n }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: 'PostToolUse',\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n tool_name: args.toolName,\n tool_input: args.toolInput,\n tool_result: args.toolResult,\n tool_response: args.toolResult,\n tool_use_id: args.toolUseId,\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n const additionalContexts: string[] = []\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: 'PostToolUse',\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { result } = item.value\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n\n const additional =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n typeof json.hookSpecificOutput.additionalContext === 'string'\n ? String(json.hookSpecificOutput.additionalContext)\n : null\n if (additional && additional.trim()) {\n additionalContexts.push(additional.trim())\n }\n }\n\n return { warnings, systemMessages, additionalContexts }\n}\n\nexport type StopHookOutcome =\n | {\n decision: 'approve'\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n }\n | {\n decision: 'block'\n message: string\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n }\n\nexport async function runStopHooks(args: {\n hookEvent: 'Stop' | 'SubagentStop'\n reason?: string\n agentId?: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n stopHookActive?: boolean\n signal?: AbortSignal\n}): Promise<StopHookOutcome> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, args.hookEvent),\n ...loadPluginMatchers(projectDir, args.hookEvent),\n ]\n if (matchers.length === 0) {\n return {\n decision: 'approve',\n warnings: [],\n systemMessages: [],\n additionalContexts: [],\n }\n }\n\n const applicable = matchers.filter(m => matcherMatchesTool(m.matcher, '*'))\n if (applicable.length === 0) {\n return {\n decision: 'approve',\n warnings: [],\n systemMessages: [],\n additionalContexts: [],\n }\n }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: args.hookEvent,\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n reason: args.reason,\n stop_hook_active: args.stopHookActive === true,\n ...(args.hookEvent === 'SubagentStop'\n ? { agent_id: args.agentId, agent_transcript_path: args.transcriptPath }\n : {}),\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n const additionalContexts: string[] = []\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: args.hookEvent,\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { result } = item.value\n\n if (result.exitCode === 2) {\n return {\n decision: 'block',\n message: coerceHookMessage(result.stdout, result.stderr),\n warnings,\n systemMessages,\n additionalContexts,\n }\n }\n\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n\n const additional =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n typeof json.hookSpecificOutput.additionalContext === 'string'\n ? String(json.hookSpecificOutput.additionalContext)\n : null\n if (additional && additional.trim()) {\n additionalContexts.push(additional.trim())\n }\n\n const stopDecision = normalizeStopDecision(json.decision)\n if (stopDecision === 'block') {\n const reason =\n typeof json.reason === 'string' && json.reason.trim()\n ? json.reason.trim()\n : null\n const msg =\n reason ||\n (systemMessages.length > 0\n ? systemMessages.join('\\n\\n')\n : coerceHookMessage(result.stdout, result.stderr))\n return {\n decision: 'block',\n message: msg,\n warnings,\n systemMessages,\n additionalContexts,\n }\n }\n }\n\n return { decision: 'approve', warnings, systemMessages, additionalContexts }\n}\n\nexport type UserPromptHookOutcome =\n | {\n decision: 'allow'\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n }\n | {\n decision: 'block'\n message: string\n warnings: string[]\n systemMessages: string[]\n additionalContexts: string[]\n }\n\nexport async function runUserPromptSubmitHooks(args: {\n prompt: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n signal?: AbortSignal\n}): Promise<UserPromptHookOutcome> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, 'UserPromptSubmit'),\n ...loadPluginMatchers(projectDir, 'UserPromptSubmit'),\n ]\n if (matchers.length === 0) {\n return {\n decision: 'allow',\n warnings: [],\n systemMessages: [],\n additionalContexts: [],\n }\n }\n\n const applicable = matchers.filter(m => matcherMatchesTool(m.matcher, '*'))\n if (applicable.length === 0) {\n return {\n decision: 'allow',\n warnings: [],\n systemMessages: [],\n additionalContexts: [],\n }\n }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: 'UserPromptSubmit',\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n user_prompt: args.prompt,\n prompt: args.prompt,\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n const additionalContexts: string[] = []\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: 'UserPromptSubmit',\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { result } = item.value\n\n if (result.exitCode === 2) {\n return {\n decision: 'block',\n message: coerceHookMessage(result.stdout, result.stderr),\n warnings,\n systemMessages,\n additionalContexts,\n }\n }\n\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n\n const additional =\n json.hookSpecificOutput &&\n typeof json.hookSpecificOutput === 'object' &&\n typeof json.hookSpecificOutput.additionalContext === 'string'\n ? String(json.hookSpecificOutput.additionalContext)\n : null\n if (additional && additional.trim()) {\n additionalContexts.push(additional.trim())\n }\n\n const stopDecision = normalizeStopDecision(json.decision)\n if (stopDecision === 'block') {\n const reason =\n typeof json.reason === 'string' && json.reason.trim()\n ? json.reason.trim()\n : null\n const msg =\n reason ||\n (systemMessages.length > 0\n ? systemMessages.join('\\n\\n')\n : coerceHookMessage(result.stdout, result.stderr))\n return {\n decision: 'block',\n message: msg,\n warnings,\n systemMessages,\n additionalContexts,\n }\n }\n }\n\n return { decision: 'allow', warnings, systemMessages, additionalContexts }\n}\n\nexport async function runSessionEndHooks(args: {\n reason: string\n permissionMode?: unknown\n cwd?: string\n transcriptPath?: string\n safeMode?: boolean\n signal?: AbortSignal\n}): Promise<{ warnings: string[]; systemMessages: string[] }> {\n const projectDir = args.cwd ?? getCwd()\n const matchers = [\n ...loadSettingsMatchers(projectDir, 'SessionEnd'),\n ...loadPluginMatchers(projectDir, 'SessionEnd'),\n ]\n if (matchers.length === 0) return { warnings: [], systemMessages: [] }\n\n const applicable = matchers.filter(m => matcherMatchesTool(m.matcher, '*'))\n if (applicable.length === 0) return { warnings: [], systemMessages: [] }\n\n const hookInput: Record<string, unknown> = {\n session_id: getKodeAgentSessionId(),\n transcript_path: args.transcriptPath,\n cwd: projectDir,\n hook_event_name: 'SessionEnd',\n permission_mode: coerceHookPermissionMode(args.permissionMode),\n reason: args.reason,\n }\n\n const warnings: string[] = []\n const systemMessages: string[] = []\n\n const executions: Array<\n Promise<{\n hook: Hook\n result: { exitCode: number; stdout: string; stderr: string }\n }>\n > = []\n\n for (const entry of applicable) {\n for (const hook of entry.hooks) {\n if (hook.type === 'prompt') {\n executions.push(\n runPromptHook({\n hook,\n hookEvent: 'SessionEnd',\n hookInput,\n safeMode: args.safeMode ?? false,\n parentSignal: args.signal,\n fallbackTimeoutMs: 30_000,\n }).then(result => ({ hook, result })),\n )\n continue\n }\n\n const { signal, cleanup } = withHookTimeout({\n timeoutSeconds: hook.timeout,\n parentSignal: args.signal,\n fallbackTimeoutMs: 60_000,\n })\n executions.push(\n runCommandHook({\n command: hook.command,\n stdinJson: hookInput,\n cwd: projectDir,\n env: {\n CLAUDE_PROJECT_DIR: projectDir,\n ...(hook.pluginRoot ? { CLAUDE_PLUGIN_ROOT: hook.pluginRoot } : {}),\n },\n signal,\n })\n .then(result => ({ hook, result }))\n .finally(cleanup),\n )\n }\n }\n\n const settled = await Promise.allSettled(executions)\n for (const item of settled) {\n if (item.status === 'rejected') {\n logError(item.reason)\n warnings.push(`Hook failed to run: ${String(item.reason ?? '')}`)\n continue\n }\n\n const { result } = item.value\n if (result.exitCode !== 0) {\n warnings.push(coerceHookMessage(result.stdout, result.stderr))\n continue\n }\n\n const json = tryParseHookJson(result.stdout)\n if (!json) continue\n if (typeof json.systemMessage === 'string' && json.systemMessage.trim()) {\n systemMessages.push(json.systemMessage.trim())\n }\n }\n\n return { warnings, systemMessages }\n}\n\nexport function __resetKodeHooksCacheForTests(): void {\n cache.clear()\n pluginHooksCache.clear()\n sessionStartCache.clear()\n}\n"],
5
- "mappings": "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",
6
- "names": ["content", "parts"]
7
- }
@@ -1,72 +0,0 @@
1
- import { createRequire as __kodeCreateRequire } from "node:module";
2
- const require = __kodeCreateRequire(import.meta.url);
3
-
4
- // src/utils/protocol/kodeAgentStreamJson.ts
5
- function normalizeToolUseBlockTypes(block) {
6
- if (!block || typeof block !== "object") return block;
7
- if (block.type === "server_tool_use" || block.type === "mcp_tool_use") {
8
- return { ...block, type: "tool_use" };
9
- }
10
- return block;
11
- }
12
- function makeSdkInitMessage(args) {
13
- return {
14
- type: "system",
15
- subtype: "init",
16
- session_id: args.sessionId,
17
- cwd: args.cwd,
18
- model: args.model,
19
- tools: args.tools,
20
- ...args.slashCommands ? { slash_commands: args.slashCommands } : {}
21
- };
22
- }
23
- function makeSdkResultMessage(args) {
24
- return {
25
- type: "result",
26
- subtype: args.isError ? "error_during_execution" : "success",
27
- result: args.result,
28
- ...args.structuredOutput ? { structured_output: args.structuredOutput } : {},
29
- num_turns: args.numTurns,
30
- usage: args.usage,
31
- total_cost_usd: args.totalCostUsd,
32
- duration_ms: args.durationMs,
33
- duration_api_ms: args.durationApiMs,
34
- is_error: args.isError,
35
- session_id: args.sessionId
36
- };
37
- }
38
- function kodeMessageToSdkMessage(message, sessionId) {
39
- if (message.type === "progress") return null;
40
- if (message.type === "user") {
41
- return {
42
- type: "user",
43
- session_id: sessionId,
44
- uuid: message.uuid,
45
- parent_tool_use_id: null,
46
- message: {
47
- role: "user",
48
- content: message.message.content
49
- }
50
- };
51
- }
52
- if (message.type === "assistant") {
53
- const content = Array.isArray(message.message.content) ? message.message.content.map(normalizeToolUseBlockTypes) : [];
54
- return {
55
- type: "assistant",
56
- session_id: sessionId,
57
- uuid: message.uuid,
58
- parent_tool_use_id: null,
59
- message: {
60
- role: "assistant",
61
- content
62
- }
63
- };
64
- }
65
- return null;
66
- }
67
-
68
- export {
69
- makeSdkInitMessage,
70
- makeSdkResultMessage,
71
- kodeMessageToSdkMessage
72
- };
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/protocol/kodeAgentStreamJson.ts"],
4
- "sourcesContent": ["import type { Message as KodeMessage } from '@query'\n\n\nexport type SdkMessage =\n | {\n type: 'system'\n subtype: string\n session_id?: string\n model?: string\n cwd?: string\n tools?: string[]\n slash_commands?: string[]\n status?: string\n uuid?: string\n }\n | {\n type: 'user'\n session_id?: string\n uuid?: string\n parent_tool_use_id?: string | null\n message: { role: 'user'; content: any }\n }\n | {\n type: 'assistant'\n session_id?: string\n uuid?: string\n parent_tool_use_id?: string | null\n message: { role: 'assistant'; content: any[] }\n }\n | {\n type: 'result'\n subtype: 'success' | 'error_during_execution' | 'error_max_turns'\n result?: string\n structured_output?: Record<string, unknown>\n num_turns: number\n usage?: any\n total_cost_usd: number\n duration_ms: number\n duration_api_ms: number\n is_error: boolean\n session_id: string\n }\n | {\n type: 'log'\n log: { level: 'debug' | 'info' | 'warn' | 'error'; message: string }\n }\n\nfunction normalizeToolUseBlockTypes(block: any): any {\n if (!block || typeof block !== 'object') return block\n if (block.type === 'server_tool_use' || block.type === 'mcp_tool_use') {\n return { ...block, type: 'tool_use' }\n }\n return block\n}\n\nexport function makeSdkInitMessage(args: {\n sessionId: string\n cwd: string\n model?: string\n tools?: string[]\n slashCommands?: string[]\n}): SdkMessage {\n return {\n type: 'system',\n subtype: 'init',\n session_id: args.sessionId,\n cwd: args.cwd,\n model: args.model,\n tools: args.tools,\n ...(args.slashCommands ? { slash_commands: args.slashCommands } : {}),\n }\n}\n\nexport function makeSdkResultMessage(args: {\n sessionId: string\n result: string\n structuredOutput?: Record<string, unknown>\n numTurns: number\n usage?: any\n totalCostUsd: number\n durationMs: number\n durationApiMs: number\n isError: boolean\n}): SdkMessage {\n return {\n type: 'result',\n subtype: args.isError ? 'error_during_execution' : 'success',\n result: args.result,\n ...(args.structuredOutput\n ? { structured_output: args.structuredOutput }\n : {}),\n num_turns: args.numTurns,\n usage: args.usage,\n total_cost_usd: args.totalCostUsd,\n duration_ms: args.durationMs,\n duration_api_ms: args.durationApiMs,\n is_error: args.isError,\n session_id: args.sessionId,\n }\n}\n\nexport function kodeMessageToSdkMessage(\n message: KodeMessage,\n sessionId: string,\n): SdkMessage | null {\n if (message.type === 'progress') return null\n\n if (message.type === 'user') {\n return {\n type: 'user',\n session_id: sessionId,\n uuid: message.uuid,\n parent_tool_use_id: null,\n message: {\n role: 'user',\n content: message.message.content as any,\n },\n }\n }\n\n if (message.type === 'assistant') {\n const content = Array.isArray(message.message.content)\n ? message.message.content.map(normalizeToolUseBlockTypes)\n : []\n return {\n type: 'assistant',\n session_id: sessionId,\n uuid: message.uuid,\n parent_tool_use_id: null,\n message: {\n role: 'assistant',\n content: content as any[],\n },\n }\n }\n\n return null\n}\n"],
5
- "mappings": ";;;;AA+CA,SAAS,2BAA2B,OAAiB;AACnD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,MAAI,MAAM,SAAS,qBAAqB,MAAM,SAAS,gBAAgB;AACrE,WAAO,EAAE,GAAG,OAAO,MAAM,WAAW;AAAA,EACtC;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,MAMpB;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,KAAK;AAAA,IACjB,KAAK,KAAK;AAAA,IACV,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,GAAI,KAAK,gBAAgB,EAAE,gBAAgB,KAAK,cAAc,IAAI,CAAC;AAAA,EACrE;AACF;AAEO,SAAS,qBAAqB,MAUtB;AACb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,KAAK,UAAU,2BAA2B;AAAA,IACnD,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,mBACL,EAAE,mBAAmB,KAAK,iBAAiB,IAC3C,CAAC;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,gBAAgB,KAAK;AAAA,IACrB,aAAa,KAAK;AAAA,IAClB,iBAAiB,KAAK;AAAA,IACtB,UAAU,KAAK;AAAA,IACf,YAAY,KAAK;AAAA,EACnB;AACF;AAEO,SAAS,wBACd,SACA,WACmB;AACnB,MAAI,QAAQ,SAAS,WAAY,QAAO;AAExC,MAAI,QAAQ,SAAS,QAAQ;AAC3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,oBAAoB;AAAA,MACpB,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS,QAAQ,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,aAAa;AAChC,UAAM,UAAU,MAAM,QAAQ,QAAQ,QAAQ,OAAO,IACjD,QAAQ,QAAQ,QAAQ,IAAI,0BAA0B,IACtD,CAAC;AACL,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,oBAAoB;AAAA,MACpB,SAAS;AAAA,QACP,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;",
6
- "names": []
7
- }