@shareai-lab/kode 2.1.0 → 2.1.2

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 (205) hide show
  1. package/dist/chunks/{Doctor-AES5ON33.js → Doctor-TWRIVOVW.js} +13 -13
  2. package/dist/chunks/{LogList-PQJEJHHE.js → LogList-PUTPM24L.js} +10 -10
  3. package/dist/chunks/REPL-YGIR5VXC.js +78 -0
  4. package/dist/chunks/{ResumeConversation-OWQ3DB4M.js → ResumeConversation-IJMKQXBU.js} +44 -44
  5. package/dist/chunks/{ScreenFrame-AGLR6B4D.js → ScreenFrame-PQJRZ5DQ.js} +2 -2
  6. package/dist/chunks/{agentLoader-BMWB4UKI.js → agentLoader-GOYNJTAO.js} +5 -5
  7. package/dist/chunks/{agentsValidate-LSMJSFYW.js → agentsValidate-R26AKPAA.js} +6 -6
  8. package/dist/chunks/{ask-3TSZR6AJ.js → ask-6SYVJONJ.js} +18 -18
  9. package/dist/chunks/{autoUpdater-MEPC7LJF.js → autoUpdater-SDLJ5QSH.js} +4 -4
  10. package/dist/chunks/{chunk-NC3RX5AB.js → chunk-2B2TR2S3.js} +4 -4
  11. package/dist/chunks/{chunk-HDEYMVIJ.js → chunk-437YGKVA.js} +2 -2
  12. package/dist/chunks/{chunk-WGMKKKS2.js → chunk-4BBWDSDC.js} +1 -1
  13. package/dist/chunks/{chunk-KKOES3YK.js → chunk-4T5LR4P5.js} +55 -116
  14. package/dist/chunks/chunk-4T5LR4P5.js.map +7 -0
  15. package/dist/chunks/{chunk-PMC3BZ3M.js → chunk-5HZWM4JB.js} +1 -1
  16. package/dist/chunks/{chunk-REQTXUXO.js → chunk-5LBRVQT5.js} +1 -1
  17. package/dist/chunks/{chunk-BEDQTC44.js → chunk-5LL33G6X.js} +2 -2
  18. package/dist/chunks/{chunk-YUXYJB45.js → chunk-5RCVEFJS.js} +19 -8
  19. package/dist/chunks/chunk-5RCVEFJS.js.map +7 -0
  20. package/dist/chunks/{chunk-MDCOIZVX.js → chunk-6C6VNA2D.js} +2 -2
  21. package/dist/chunks/{chunk-P77NF36M.js → chunk-6CAQXUDY.js} +1 -1
  22. package/dist/chunks/{chunk-DPQE5NA4.js → chunk-7SRIFZDJ.js} +1 -1
  23. package/dist/chunks/{chunk-TI2CTTMA.js → chunk-7ZC22R33.js} +1 -1
  24. package/dist/chunks/{chunk-EV56PDOI.js → chunk-AX3VXMUS.js} +1 -1
  25. package/dist/chunks/{chunk-5MVUCX6O.js → chunk-AZHJLRRP.js} +1 -1
  26. package/dist/chunks/{chunk-LIBZWJEW.js → chunk-BNSPVA24.js} +11 -10
  27. package/dist/chunks/chunk-BNSPVA24.js.map +7 -0
  28. package/dist/chunks/{chunk-Z3J3WJ2K.js → chunk-BPMYW5DT.js} +415 -414
  29. package/dist/chunks/chunk-BPMYW5DT.js.map +7 -0
  30. package/dist/chunks/{chunk-QBW7VU7C.js → chunk-DWKF6SQH.js} +3 -3
  31. package/dist/chunks/{chunk-4RVYYLN7.js → chunk-E4C4N7OV.js} +1 -1
  32. package/dist/chunks/{chunk-4RVYYLN7.js.map → chunk-E4C4N7OV.js.map} +1 -1
  33. package/dist/chunks/chunk-ESRGV7DC.js +34 -0
  34. package/dist/chunks/chunk-ESRGV7DC.js.map +7 -0
  35. package/dist/chunks/{chunk-VSKGDU73.js → chunk-FKWFR23G.js} +2 -2
  36. package/dist/chunks/{chunk-E6BU32L2.js → chunk-H5F7M5D3.js} +2 -2
  37. package/dist/chunks/{chunk-DZPD6H7A.js → chunk-JXYXMP2Q.js} +2 -2
  38. package/dist/chunks/{chunk-65FLXXMH.js → chunk-KA543BHH.js} +8 -8
  39. package/dist/chunks/{chunk-MEQ7TAT7.js → chunk-KHMXPPO7.js} +4 -4
  40. package/dist/chunks/{chunk-G5ET7GFB.js → chunk-KQV5FGSS.js} +5 -5
  41. package/dist/chunks/{chunk-DPVCHIF7.js → chunk-KRBZO255.js} +1 -1
  42. package/dist/chunks/{chunk-Y33AS3MY.js → chunk-L2LWCVUF.js} +21 -7
  43. package/dist/chunks/chunk-L2LWCVUF.js.map +7 -0
  44. package/dist/chunks/{chunk-EKXQ7ZWV.js → chunk-L5ZJIOEF.js} +4 -4
  45. package/dist/chunks/{chunk-UUJN5ZCN.js → chunk-LBHVWSUP.js} +2 -2
  46. package/dist/chunks/{chunk-GL6HUBBX.js → chunk-LKDMUCWA.js} +6 -6
  47. package/dist/chunks/{chunk-HJCYE2AS.js → chunk-LUZMHHQF.js} +10 -10
  48. package/dist/chunks/{chunk-MXFN7OSL.js → chunk-MOGUUWKG.js} +1 -1
  49. package/dist/chunks/{chunk-4UDKRYWZ.js → chunk-N4772IDQ.js} +3 -3
  50. package/dist/chunks/{chunk-TJMA65RL.js → chunk-N5AH66UG.js} +168 -23
  51. package/dist/chunks/chunk-N5AH66UG.js.map +7 -0
  52. package/dist/chunks/{chunk-JJ67KF6A.js → chunk-PTIAF6KF.js} +4 -4
  53. package/dist/chunks/{chunk-YUJB4WDK.js → chunk-PVMCLI36.js} +1 -1
  54. package/dist/chunks/{chunk-3TLVYEGW.js → chunk-RTGKCKD3.js} +1 -1
  55. package/dist/chunks/{chunk-AKC4BUW5.js → chunk-SOBWNYOW.js} +7 -6
  56. package/dist/chunks/chunk-SOBWNYOW.js.map +7 -0
  57. package/dist/chunks/{chunk-3DBNJOZI.js → chunk-SUNG5KP5.js} +1 -1
  58. package/dist/chunks/{chunk-VBGSHKHX.js → chunk-SVRXO73D.js} +16 -13
  59. package/dist/chunks/chunk-SVRXO73D.js.map +7 -0
  60. package/dist/chunks/{chunk-Q55CB4Y4.js → chunk-WE7CQGRG.js} +2 -2
  61. package/dist/chunks/{chunk-V3IXG64X.js → chunk-WOMV4RCI.js} +404 -446
  62. package/dist/chunks/chunk-WOMV4RCI.js.map +7 -0
  63. package/dist/chunks/{chunk-ZAT5BSQI.js → chunk-WVJMXIKQ.js} +12 -12
  64. package/dist/chunks/{chunk-ZAT5BSQI.js.map → chunk-WVJMXIKQ.js.map} +1 -1
  65. package/dist/chunks/{chunk-DELUVYKS.js → chunk-XVNEJVZC.js} +2 -2
  66. package/dist/chunks/{chunk-KDY7XYYS.js → chunk-YQ3YJSMI.js} +1 -1
  67. package/dist/chunks/{chunk-6CNJ3CYQ.js → chunk-YUZBVKVH.js} +3 -3
  68. package/dist/chunks/{chunk-VJ2QSQ3E.js → chunk-ZXOTOID7.js} +2 -2
  69. package/dist/chunks/{client-OWTJ7TPE.js → client-QUCHWMEW.js} +5 -5
  70. package/dist/chunks/{customCommands-FA6HRXXV.js → customCommands-S6YGRUED.js} +5 -5
  71. package/dist/chunks/{engine-UBCAVO7E.js → engine-FRDEQVDF.js} +17 -17
  72. package/dist/chunks/{env-JIMGBRE2.js → env-YH77MILU.js} +3 -3
  73. package/dist/chunks/{kodeAgentSessionLoad-BZRTCPMB.js → kodeAgentSessionLoad-TBPU4TWU.js} +3 -3
  74. package/dist/chunks/{kodeAgentSessionResume-V3WB3OWQ.js → kodeAgentSessionResume-3CNE5T6N.js} +3 -3
  75. package/dist/chunks/{kodeHooks-R3YHG4ZI.js → kodeHooks-6SWQE5W7.js} +4 -4
  76. package/dist/chunks/{llm-C4F2Q7I2.js → llm-PONI6QWH.js} +47 -20
  77. package/dist/chunks/llm-PONI6QWH.js.map +7 -0
  78. package/dist/chunks/{llmLazy-IBED5LIH.js → llmLazy-O4T62IIT.js} +1 -1
  79. package/dist/chunks/{mcpCli-A744Z3FL.js → mcpCli-HIA4I4GG.js} +5 -5
  80. package/dist/chunks/{mentionProcessor-VV6DN2LJ.js → mentionProcessor-HH4EF7BE.js} +6 -6
  81. package/dist/chunks/{messages-ZR64JVON.js → messages-WKWCZBGM.js} +1 -1
  82. package/dist/chunks/{model-NPMMYL2U.js → model-4EIFU5QN.js} +5 -5
  83. package/dist/chunks/{openai-FEBNBOGM.js → openai-KTBJ2KNZ.js} +5 -5
  84. package/dist/chunks/{permissions-34CRWMCH.js → permissions-C3N4DKS2.js} +7 -7
  85. package/dist/chunks/{pluginRuntime-7YBUMVFI.js → pluginRuntime-2FKZLVA5.js} +3 -3
  86. package/dist/chunks/{pluginValidation-NZ4LOT3Q.js → pluginValidation-X5NZZCFA.js} +7 -7
  87. package/dist/chunks/registry-3UVW32YF.js +68 -0
  88. package/dist/chunks/{responsesStreaming-JNGE2P3D.js → responsesStreaming-LB4THIUM.js} +2 -2
  89. package/dist/chunks/{ripgrep-KGHLK4RO.js → ripgrep-N7O6M4IE.js} +4 -4
  90. package/dist/chunks/{runNonTextPrintMode-U3TKEYYN.js → runNonTextPrintMode-YFWCUTWZ.js} +12 -12
  91. package/dist/chunks/server-3CICV7EL.js +59 -0
  92. package/dist/chunks/server-FRP7OT4H.js +61 -0
  93. package/dist/chunks/{skillMarketplace-PPPUBC4N.js → skillMarketplace-4Y2H4JFK.js} +4 -4
  94. package/dist/chunks/{src-TVS6YABL.js → src-IETAWKYR.js} +30 -30
  95. package/dist/chunks/{src-QST7UD2A.js → src-OB2HE3RX.js} +27 -27
  96. package/dist/chunks/{src-DB7GKD4L.js → src-Y2IM2VKU.js} +78 -78
  97. package/dist/chunks/{thinking-O7LIIMFW.js → thinking-XG3FB4HO.js} +6 -6
  98. package/dist/chunks/{toolPermissionContext-UWGATCUZ.js → toolPermissionContext-RFYFDINH.js} +1 -1
  99. package/dist/chunks/{toolPermissionSettings-WD7CB37T.js → toolPermissionSettings-EEFURGBO.js} +5 -5
  100. package/dist/chunks/{useScreenLayout-PKLCMNZD.js → useScreenLayout-OUGQRR4I.js} +2 -2
  101. package/dist/chunks/{webOnlyMode-GJ6PQCPU.js → webOnlyMode-FRQBIAXG.js} +1 -1
  102. package/dist/entrypoints/cli.js +1 -1
  103. package/dist/entrypoints/daemon.js +1 -1
  104. package/dist/entrypoints/mcp.js +28 -28
  105. package/dist/index.js +5 -5
  106. package/dist/sdk/core.cjs +93 -34
  107. package/dist/sdk/core.cjs.map +3 -3
  108. package/dist/sdk/core.js +96 -37
  109. package/dist/sdk/core.js.map +4 -4
  110. package/dist/sdk/tools.cjs +1787 -1748
  111. package/dist/sdk/tools.cjs.map +4 -4
  112. package/dist/sdk/tools.js +1611 -1572
  113. package/dist/sdk/tools.js.map +4 -4
  114. package/package.json +1 -1
  115. package/dist/chunks/REPL-KD7YOSI5.js +0 -78
  116. package/dist/chunks/chunk-AKC4BUW5.js.map +0 -7
  117. package/dist/chunks/chunk-KKOES3YK.js.map +0 -7
  118. package/dist/chunks/chunk-LIBZWJEW.js.map +0 -7
  119. package/dist/chunks/chunk-LOCXPQNJ.js +0 -20
  120. package/dist/chunks/chunk-LOCXPQNJ.js.map +0 -7
  121. package/dist/chunks/chunk-TJMA65RL.js.map +0 -7
  122. package/dist/chunks/chunk-V3IXG64X.js.map +0 -7
  123. package/dist/chunks/chunk-VBGSHKHX.js.map +0 -7
  124. package/dist/chunks/chunk-Y33AS3MY.js.map +0 -7
  125. package/dist/chunks/chunk-YUXYJB45.js.map +0 -7
  126. package/dist/chunks/chunk-Z3J3WJ2K.js.map +0 -7
  127. package/dist/chunks/llm-C4F2Q7I2.js.map +0 -7
  128. package/dist/chunks/registry-FHPZ36EO.js +0 -68
  129. package/dist/chunks/server-Y42VR6YJ.js +0 -59
  130. package/dist/chunks/server-ZSC5G3TU.js +0 -61
  131. /package/dist/chunks/{Doctor-AES5ON33.js.map → Doctor-TWRIVOVW.js.map} +0 -0
  132. /package/dist/chunks/{LogList-PQJEJHHE.js.map → LogList-PUTPM24L.js.map} +0 -0
  133. /package/dist/chunks/{REPL-KD7YOSI5.js.map → REPL-YGIR5VXC.js.map} +0 -0
  134. /package/dist/chunks/{ResumeConversation-OWQ3DB4M.js.map → ResumeConversation-IJMKQXBU.js.map} +0 -0
  135. /package/dist/chunks/{ScreenFrame-AGLR6B4D.js.map → ScreenFrame-PQJRZ5DQ.js.map} +0 -0
  136. /package/dist/chunks/{agentLoader-BMWB4UKI.js.map → agentLoader-GOYNJTAO.js.map} +0 -0
  137. /package/dist/chunks/{agentsValidate-LSMJSFYW.js.map → agentsValidate-R26AKPAA.js.map} +0 -0
  138. /package/dist/chunks/{ask-3TSZR6AJ.js.map → ask-6SYVJONJ.js.map} +0 -0
  139. /package/dist/chunks/{autoUpdater-MEPC7LJF.js.map → autoUpdater-SDLJ5QSH.js.map} +0 -0
  140. /package/dist/chunks/{chunk-NC3RX5AB.js.map → chunk-2B2TR2S3.js.map} +0 -0
  141. /package/dist/chunks/{chunk-HDEYMVIJ.js.map → chunk-437YGKVA.js.map} +0 -0
  142. /package/dist/chunks/{chunk-WGMKKKS2.js.map → chunk-4BBWDSDC.js.map} +0 -0
  143. /package/dist/chunks/{chunk-PMC3BZ3M.js.map → chunk-5HZWM4JB.js.map} +0 -0
  144. /package/dist/chunks/{chunk-REQTXUXO.js.map → chunk-5LBRVQT5.js.map} +0 -0
  145. /package/dist/chunks/{chunk-BEDQTC44.js.map → chunk-5LL33G6X.js.map} +0 -0
  146. /package/dist/chunks/{chunk-MDCOIZVX.js.map → chunk-6C6VNA2D.js.map} +0 -0
  147. /package/dist/chunks/{chunk-P77NF36M.js.map → chunk-6CAQXUDY.js.map} +0 -0
  148. /package/dist/chunks/{chunk-DPQE5NA4.js.map → chunk-7SRIFZDJ.js.map} +0 -0
  149. /package/dist/chunks/{chunk-TI2CTTMA.js.map → chunk-7ZC22R33.js.map} +0 -0
  150. /package/dist/chunks/{chunk-EV56PDOI.js.map → chunk-AX3VXMUS.js.map} +0 -0
  151. /package/dist/chunks/{chunk-5MVUCX6O.js.map → chunk-AZHJLRRP.js.map} +0 -0
  152. /package/dist/chunks/{chunk-QBW7VU7C.js.map → chunk-DWKF6SQH.js.map} +0 -0
  153. /package/dist/chunks/{chunk-VSKGDU73.js.map → chunk-FKWFR23G.js.map} +0 -0
  154. /package/dist/chunks/{chunk-E6BU32L2.js.map → chunk-H5F7M5D3.js.map} +0 -0
  155. /package/dist/chunks/{chunk-DZPD6H7A.js.map → chunk-JXYXMP2Q.js.map} +0 -0
  156. /package/dist/chunks/{chunk-65FLXXMH.js.map → chunk-KA543BHH.js.map} +0 -0
  157. /package/dist/chunks/{chunk-MEQ7TAT7.js.map → chunk-KHMXPPO7.js.map} +0 -0
  158. /package/dist/chunks/{chunk-G5ET7GFB.js.map → chunk-KQV5FGSS.js.map} +0 -0
  159. /package/dist/chunks/{chunk-DPVCHIF7.js.map → chunk-KRBZO255.js.map} +0 -0
  160. /package/dist/chunks/{chunk-EKXQ7ZWV.js.map → chunk-L5ZJIOEF.js.map} +0 -0
  161. /package/dist/chunks/{chunk-UUJN5ZCN.js.map → chunk-LBHVWSUP.js.map} +0 -0
  162. /package/dist/chunks/{chunk-GL6HUBBX.js.map → chunk-LKDMUCWA.js.map} +0 -0
  163. /package/dist/chunks/{chunk-HJCYE2AS.js.map → chunk-LUZMHHQF.js.map} +0 -0
  164. /package/dist/chunks/{chunk-MXFN7OSL.js.map → chunk-MOGUUWKG.js.map} +0 -0
  165. /package/dist/chunks/{chunk-4UDKRYWZ.js.map → chunk-N4772IDQ.js.map} +0 -0
  166. /package/dist/chunks/{chunk-JJ67KF6A.js.map → chunk-PTIAF6KF.js.map} +0 -0
  167. /package/dist/chunks/{chunk-YUJB4WDK.js.map → chunk-PVMCLI36.js.map} +0 -0
  168. /package/dist/chunks/{chunk-3TLVYEGW.js.map → chunk-RTGKCKD3.js.map} +0 -0
  169. /package/dist/chunks/{chunk-3DBNJOZI.js.map → chunk-SUNG5KP5.js.map} +0 -0
  170. /package/dist/chunks/{chunk-Q55CB4Y4.js.map → chunk-WE7CQGRG.js.map} +0 -0
  171. /package/dist/chunks/{chunk-DELUVYKS.js.map → chunk-XVNEJVZC.js.map} +0 -0
  172. /package/dist/chunks/{chunk-KDY7XYYS.js.map → chunk-YQ3YJSMI.js.map} +0 -0
  173. /package/dist/chunks/{chunk-6CNJ3CYQ.js.map → chunk-YUZBVKVH.js.map} +0 -0
  174. /package/dist/chunks/{chunk-VJ2QSQ3E.js.map → chunk-ZXOTOID7.js.map} +0 -0
  175. /package/dist/chunks/{client-OWTJ7TPE.js.map → client-QUCHWMEW.js.map} +0 -0
  176. /package/dist/chunks/{customCommands-FA6HRXXV.js.map → customCommands-S6YGRUED.js.map} +0 -0
  177. /package/dist/chunks/{engine-UBCAVO7E.js.map → engine-FRDEQVDF.js.map} +0 -0
  178. /package/dist/chunks/{env-JIMGBRE2.js.map → env-YH77MILU.js.map} +0 -0
  179. /package/dist/chunks/{kodeAgentSessionLoad-BZRTCPMB.js.map → kodeAgentSessionLoad-TBPU4TWU.js.map} +0 -0
  180. /package/dist/chunks/{kodeAgentSessionResume-V3WB3OWQ.js.map → kodeAgentSessionResume-3CNE5T6N.js.map} +0 -0
  181. /package/dist/chunks/{kodeHooks-R3YHG4ZI.js.map → kodeHooks-6SWQE5W7.js.map} +0 -0
  182. /package/dist/chunks/{llmLazy-IBED5LIH.js.map → llmLazy-O4T62IIT.js.map} +0 -0
  183. /package/dist/chunks/{mcpCli-A744Z3FL.js.map → mcpCli-HIA4I4GG.js.map} +0 -0
  184. /package/dist/chunks/{mentionProcessor-VV6DN2LJ.js.map → mentionProcessor-HH4EF7BE.js.map} +0 -0
  185. /package/dist/chunks/{messages-ZR64JVON.js.map → messages-WKWCZBGM.js.map} +0 -0
  186. /package/dist/chunks/{model-NPMMYL2U.js.map → model-4EIFU5QN.js.map} +0 -0
  187. /package/dist/chunks/{openai-FEBNBOGM.js.map → openai-KTBJ2KNZ.js.map} +0 -0
  188. /package/dist/chunks/{permissions-34CRWMCH.js.map → permissions-C3N4DKS2.js.map} +0 -0
  189. /package/dist/chunks/{pluginRuntime-7YBUMVFI.js.map → pluginRuntime-2FKZLVA5.js.map} +0 -0
  190. /package/dist/chunks/{pluginValidation-NZ4LOT3Q.js.map → pluginValidation-X5NZZCFA.js.map} +0 -0
  191. /package/dist/chunks/{registry-FHPZ36EO.js.map → registry-3UVW32YF.js.map} +0 -0
  192. /package/dist/chunks/{responsesStreaming-JNGE2P3D.js.map → responsesStreaming-LB4THIUM.js.map} +0 -0
  193. /package/dist/chunks/{ripgrep-KGHLK4RO.js.map → ripgrep-N7O6M4IE.js.map} +0 -0
  194. /package/dist/chunks/{runNonTextPrintMode-U3TKEYYN.js.map → runNonTextPrintMode-YFWCUTWZ.js.map} +0 -0
  195. /package/dist/chunks/{server-Y42VR6YJ.js.map → server-3CICV7EL.js.map} +0 -0
  196. /package/dist/chunks/{server-ZSC5G3TU.js.map → server-FRP7OT4H.js.map} +0 -0
  197. /package/dist/chunks/{skillMarketplace-PPPUBC4N.js.map → skillMarketplace-4Y2H4JFK.js.map} +0 -0
  198. /package/dist/chunks/{src-TVS6YABL.js.map → src-IETAWKYR.js.map} +0 -0
  199. /package/dist/chunks/{src-QST7UD2A.js.map → src-OB2HE3RX.js.map} +0 -0
  200. /package/dist/chunks/{src-DB7GKD4L.js.map → src-Y2IM2VKU.js.map} +0 -0
  201. /package/dist/chunks/{thinking-O7LIIMFW.js.map → thinking-XG3FB4HO.js.map} +0 -0
  202. /package/dist/chunks/{toolPermissionContext-UWGATCUZ.js.map → toolPermissionContext-RFYFDINH.js.map} +0 -0
  203. /package/dist/chunks/{toolPermissionSettings-WD7CB37T.js.map → toolPermissionSettings-EEFURGBO.js.map} +0 -0
  204. /package/dist/chunks/{useScreenLayout-PKLCMNZD.js.map → useScreenLayout-OUGQRR4I.js.map} +0 -0
  205. /package/dist/chunks/{webOnlyMode-GJ6PQCPU.js.map → webOnlyMode-FRQBIAXG.js.map} +0 -0
@@ -7,17 +7,17 @@ import {
7
7
  shouldEnterAlternateScreen,
8
8
  terminalCapabilityManager,
9
9
  useKeypress
10
- } from "./chunk-DELUVYKS.js";
10
+ } from "./chunk-XVNEJVZC.js";
11
11
  import {
12
12
  ScreenFrame
13
- } from "./chunk-REQTXUXO.js";
13
+ } from "./chunk-5LBRVQT5.js";
14
14
  import {
15
15
  useScreenLayout
16
- } from "./chunk-DPQE5NA4.js";
16
+ } from "./chunk-7SRIFZDJ.js";
17
17
  import {
18
18
  describeToolPermissionRuleSource,
19
19
  findUnreachablePermissionRules
20
- } from "./chunk-TJMA65RL.js";
20
+ } from "./chunk-N5AH66UG.js";
21
21
  import {
22
22
  getTheme
23
23
  } from "./chunk-HDVL5VTM.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getSessionStoreProjectNameCandidatesForRead,
3
3
  getSessionStoreRoots
4
- } from "./chunk-DPVCHIF7.js";
4
+ } from "./chunk-KRBZO255.js";
5
5
 
6
6
  // packages/protocol/src/utils/kodeAgentSessionLoad.ts
7
7
  import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  logError
3
- } from "./chunk-AKC4BUW5.js";
3
+ } from "./chunk-SOBWNYOW.js";
4
4
 
5
5
  // packages/core/src/utils/json.ts
6
6
  function safeParseJSON(json) {
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-QHQOBUF6.js";
9
9
  import {
10
10
  MACRO
11
- } from "./chunk-P77NF36M.js";
11
+ } from "./chunk-6CAQXUDY.js";
12
12
  import {
13
13
  getKodeAgentSessionId
14
14
  } from "./chunk-SWQV4KSY.js";
@@ -36,11 +36,12 @@ var CONFIG_BASE_DIR = ".kode";
36
36
  var CONFIG_FILE = ".kode.json";
37
37
  var GITHUB_ISSUES_REPO_URL = "https://github.com/shareAI-lab/Anykode/issues";
38
38
  var ASCII_LOGO = `
39
- _ __ _ ____ _ ___
40
- | |/ /___ __| | ___ / ___| | |_ _|
41
- | ' // _ \\ / _\` |/ _ \\| | | | | |
42
- | . \\ (_) | (_| | __/| |___| |___ | |
43
- |_|\\_\\___/ \\__,_|\\___| \\____|_____|___|`;
39
+ \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557
40
+ \u2588\u2588\u2551 \u2588\u2588\u2554\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551
41
+ \u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551
42
+ \u2588\u2588\u2554\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551
43
+ \u2588\u2588\u2551 \u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551
44
+ \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D`;
44
45
 
45
46
  // packages/core/src/logging/log/paths.ts
46
47
  function resolveEnvPaths() {
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../packages/core/src/utils/execFileNoThrow.ts", "../../packages/core/src/logging/log/paths.ts", "../../packages/core/src/constants/product.ts", "../../packages/core/src/logging/log/errors.ts", "../../packages/core/src/logging/log/jsonLog.ts", "../../packages/core/src/logging/log/filesystem.ts", "../../packages/core/src/logging/log/messages.ts", "../../packages/core/src/plan/mode/paths.ts", "../../packages/core/src/plan/mode/slug.ts", "../../packages/core/src/plan/mode/state.ts", "../../packages/core/src/plan/mode/systemPrompt.ts", "../../packages/core/src/plan/mode/reminders.ts", "../../packages/core/src/plan/mode.ts", "../../packages/core/src/logging/log/loadLogList.ts", "../../packages/core/src/logging/log/util.ts", "../../packages/core/src/utils/env.ts"],
4
+ "sourcesContent": ["import { execFile } from 'child_process'\nimport { getCwd } from './state'\nimport { logError } from './log'\n\nconst MS_IN_SECOND = 1000\nconst SECONDS_IN_MINUTE = 60\n\n/**\n * execFile, but always resolves (never throws)\n */\nexport function execFileNoThrow(\n file: string,\n args: string[],\n abortSignal?: AbortSignal,\n timeout = 10 * SECONDS_IN_MINUTE * MS_IN_SECOND,\n preserveOutputOnError = true,\n): Promise<{ stdout: string; stderr: string; code: number }> {\n return new Promise(resolve => {\n try {\n execFile(\n file,\n args,\n {\n maxBuffer: 1_000_000,\n signal: abortSignal,\n timeout,\n cwd: getCwd(),\n },\n (error, stdout, stderr) => {\n if (error) {\n if (preserveOutputOnError) {\n const errorCode = typeof error.code === 'number' ? error.code : 1\n resolve({\n stdout: stdout || '',\n stderr: stderr || '',\n code: errorCode,\n })\n } else {\n resolve({ stdout: '', stderr: '', code: 1 })\n }\n } else {\n resolve({ stdout, stderr, code: 0 })\n }\n },\n )\n } catch (error) {\n logError(error)\n resolve({ stdout: '', stderr: '', code: 1 })\n }\n })\n}\n", "import { existsSync } from 'fs'\nimport { join } from 'path'\nimport envPathsImport from 'env-paths'\nimport { PRODUCT_COMMAND } from '#core/constants/product'\nimport { getKodeBaseDir } from '#core/utils/env'\n\nfunction resolveEnvPaths(): typeof envPathsImport {\n if (typeof envPathsImport === 'function') return envPathsImport\n const fallback = (envPathsImport as unknown as { default?: unknown }).default\n if (typeof fallback === 'function') {\n return fallback as typeof envPathsImport\n }\n throw new Error('env-paths did not resolve to a callable function')\n}\n\nconst paths = resolveEnvPaths()(PRODUCT_COMMAND)\n\nfunction getProjectDir(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nfunction getLegacyCacheRoot(): string {\n return process.env.KODE_LEGACY_CACHE_ROOT ?? paths.cache\n}\n\nfunction getNewLogRoot(): string {\n return process.env.KODE_LOG_ROOT ?? getKodeBaseDir()\n}\n\nexport const CACHE_PATHS = {\n errors: () => join(getNewLogRoot(), getProjectDir(process.cwd()), 'errors'),\n messages: () =>\n join(getNewLogRoot(), getProjectDir(process.cwd()), 'messages'),\n mcpLogs: (serverName: string) =>\n join(\n getLegacyCacheRoot(),\n getProjectDir(process.cwd()),\n `mcp-logs-${serverName}`,\n ),\n}\n\nexport const LEGACY_CACHE_PATHS = {\n errors: () =>\n join(getLegacyCacheRoot(), getProjectDir(process.cwd()), 'errors'),\n messages: () =>\n join(getLegacyCacheRoot(), getProjectDir(process.cwd()), 'messages'),\n mcpLogs: (serverName: string) =>\n join(\n getLegacyCacheRoot(),\n getProjectDir(process.cwd()),\n `mcp-logs-${serverName}`,\n ),\n}\n\nexport function dateToFilename(date: Date): string {\n return date.toISOString().replace(/[:.]/g, '-')\n}\n\nexport const DATE = dateToFilename(new Date())\n\nexport function getErrorsPath(): string {\n return join(CACHE_PATHS.errors(), DATE + '.jsonl')\n}\n\nexport function getLegacyErrorsPath(): string {\n return join(CACHE_PATHS.errors(), DATE + '.txt')\n}\n\nexport function getMessagesPath(\n messageLogName: string,\n forkNumber: number,\n sidechainNumber: number,\n): string {\n return join(\n CACHE_PATHS.messages(),\n `${messageLogName}${forkNumber > 0 ? `-${forkNumber}` : ''}${\n sidechainNumber > 0 ? `-sidechain-${sidechainNumber}` : ''\n }.json`,\n )\n}\n\nexport function parseLogFilename(filename: string): {\n date: string\n forkNumber: number | undefined\n sidechainNumber: number | undefined\n} {\n const base = filename.split('.')[0]!\n // Default timestamp format has 6 segments: 2025-01-27T01-31-35-104Z\n const segments = base.split('-')\n const hasSidechain = base.includes('-sidechain-')\n\n let date = base\n let forkNumber: number | undefined = undefined\n let sidechainNumber: number | undefined = undefined\n\n if (hasSidechain) {\n const sidechainIndex = segments.indexOf('sidechain')\n sidechainNumber = Number(segments[sidechainIndex + 1])\n // Fork number is before sidechain if exists\n if (sidechainIndex > 6) {\n forkNumber = Number(segments[sidechainIndex - 1])\n date = segments.slice(0, 6).join('-')\n } else {\n date = segments.slice(0, 6).join('-')\n }\n } else if (segments.length > 6) {\n // Has fork number\n const lastSegment = Number(segments[segments.length - 1])\n forkNumber = lastSegment >= 0 ? lastSegment : undefined\n date = segments.slice(0, 6).join('-')\n } else {\n // Basic timestamp only\n date = base\n }\n\n return { date, forkNumber, sidechainNumber }\n}\n\nexport function getNextAvailableLogForkNumber(\n date: string,\n forkNumber: number,\n // Main chain has sidechainNumber 0\n sidechainNumber: number,\n): number {\n while (existsSync(getMessagesPath(date, forkNumber, sidechainNumber))) {\n forkNumber++\n }\n return forkNumber\n}\n\nexport function getNextAvailableLogSidechainNumber(\n date: string,\n forkNumber: number,\n): number {\n let sidechainNumber = 1\n while (existsSync(getMessagesPath(date, forkNumber, sidechainNumber))) {\n sidechainNumber++\n }\n return sidechainNumber\n}\n\nexport function getForkNumberFromFilename(\n filename: string,\n): number | undefined {\n const base = filename.split('.')[0]!\n const segments = base.split('-')\n const hasSidechain = base.includes('-sidechain-')\n\n if (hasSidechain) {\n const sidechainIndex = segments.indexOf('sidechain')\n if (sidechainIndex > 6) {\n return Number(segments[sidechainIndex - 1])\n }\n return undefined\n }\n\n if (segments.length > 6) {\n const lastNumber = Number(segments[segments.length - 1])\n return lastNumber >= 0 ? lastNumber : undefined\n }\n return undefined\n}\n", "export const PRODUCT_NAME = 'Kode'\nexport const PRODUCT_URL = 'https://github.com/shareAI-lab/Anykode'\nexport const PROJECT_FILE = 'AGENTS.md'\nexport const PRODUCT_COMMAND = 'kode'\nexport const CONFIG_BASE_DIR = '.kode'\nexport const CONFIG_FILE = '.kode.json'\nexport const GITHUB_ISSUES_REPO_URL =\n 'https://github.com/shareAI-lab/Anykode/issues'\n\nexport const ASCII_LOGO = `\n\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\n\u2588\u2588\u2551 \u2588\u2588\u2554\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551\n\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\n\u2588\u2588\u2554\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\n\u2588\u2588\u2551 \u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551\n\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D`\n", "import { mkdirSync, writeFileSync, existsSync } from 'fs'\nimport { join } from 'path'\n\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\n\nimport { appendToJsonLog, readJsonLog } from './jsonLog'\nimport {\n CACHE_PATHS,\n DATE,\n getErrorsPath,\n getLegacyErrorsPath,\n} from './paths'\n\nconst IN_MEMORY_ERROR_LOG: Array<{ error: string; timestamp: string }> = []\nconst MAX_IN_MEMORY_ERRORS = 100 // Limit to prevent memory issues\n\nexport function logError(error: unknown): void {\n try {\n if (process.env.NODE_ENV === 'test') {\n console.error(error)\n }\n\n const errorStr =\n error instanceof Error ? error.stack || error.message : String(error)\n\n const errorInfo = {\n error: errorStr,\n timestamp: new Date().toISOString(),\n }\n\n if (IN_MEMORY_ERROR_LOG.length >= MAX_IN_MEMORY_ERRORS) {\n IN_MEMORY_ERROR_LOG.shift() // Remove oldest error\n }\n IN_MEMORY_ERROR_LOG.push(errorInfo)\n\n appendToJsonLog(getErrorsPath(), {\n error: errorStr,\n })\n } catch {\n // pass\n }\n}\n\nexport function getErrorsLog(): object[] {\n return [\n ...readJsonLog(getErrorsPath()),\n ...readJsonLog(getLegacyErrorsPath()),\n ]\n}\n\nexport function getInMemoryErrors(): object[] {\n return [...IN_MEMORY_ERROR_LOG]\n}\n\nexport function logMCPError(serverName: string, error: unknown): void {\n try {\n const logDir = CACHE_PATHS.mcpLogs(serverName)\n const errorStr =\n error instanceof Error ? error.stack || error.message : String(error)\n const timestamp = new Date().toISOString()\n\n const logFile = join(logDir, DATE + '.txt')\n\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true })\n }\n\n if (!existsSync(logFile)) {\n writeFileSync(logFile, '[]', 'utf8')\n }\n\n const errorInfo = {\n error: errorStr,\n timestamp,\n sessionId: getKodeAgentSessionId(),\n cwd: process.cwd(),\n }\n\n const messages = readJsonLog(logFile)\n messages.push(errorInfo)\n writeFileSync(logFile, JSON.stringify(messages, null, 2), 'utf8')\n } catch {\n // Silently fail\n }\n}\n", "import { existsSync, readFileSync } from 'fs'\nimport { dirname } from 'path'\nimport { MACRO } from '#core/constants/macros'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\n\nimport { safeAppendFile, safeMkdir, safeWriteFile } from './filesystem'\n\nfunction stripBom(content: string): string {\n return content.charCodeAt(0) === 0xfeff ? content.slice(1) : content\n}\n\nfunction isWhitespace(code: number): boolean {\n return code === 0x09 || code === 0x0a || code === 0x0d || code === 0x20\n}\n\nfunction findJsonValueEnd(input: string, start: number): number | null {\n const first = input[start]\n if (!first) return null\n\n if (first === '{' || first === '[') {\n const stack: string[] = [first === '{' ? '}' : ']']\n let inString = false\n let escaped = false\n for (let i = start + 1; i < input.length; i++) {\n const ch = input[i]\n if (!ch) break\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 stack.push('}')\n continue\n }\n if (ch === '[') {\n stack.push(']')\n continue\n }\n\n if (ch === '}' || ch === ']') {\n const expected = stack[stack.length - 1]\n if (expected !== ch) return null\n stack.pop()\n if (stack.length === 0) return i + 1\n }\n }\n return null\n }\n\n if (first === '\"') {\n let escaped = false\n for (let i = start + 1; i < input.length; i++) {\n const ch = input[i]\n if (!ch) break\n if (escaped) {\n escaped = false\n continue\n }\n if (ch === '\\\\') {\n escaped = true\n continue\n }\n if (ch === '\"') {\n return i + 1\n }\n }\n return null\n }\n\n for (let i = start; i < input.length; i++) {\n const ch = input[i]\n if (!ch) break\n if (ch === ',' || ch === ']') return i\n if (isWhitespace(ch.charCodeAt(0))) return i\n }\n\n return input.length\n}\n\nfunction recoverJsonArrayPrefix(content: string): unknown[] {\n const input = stripBom(content)\n let i = 0\n while (i < input.length && isWhitespace(input.charCodeAt(i))) i++\n if (input[i] !== '[') return []\n\n i++\n const values: unknown[] = []\n\n while (i < input.length) {\n while (i < input.length) {\n const ch = input[i]\n if (!ch) break\n const code = ch.charCodeAt(0)\n if (isWhitespace(code) || ch === ',') {\n i++\n continue\n }\n break\n }\n\n if (i >= input.length) break\n if (input[i] === ']') break\n\n const end = findJsonValueEnd(input, i)\n if (!end) break\n const slice = input.slice(i, end)\n try {\n values.push(JSON.parse(slice))\n } catch {\n break\n }\n i = end\n }\n\n return values\n}\n\nfunction recoverJsonlObjects(content: string): unknown[] {\n const values: unknown[] = []\n for (const rawLine of stripBom(content).split('\\n')) {\n const line = rawLine.trim()\n if (!line) continue\n try {\n values.push(JSON.parse(line))\n } catch {\n // ignore invalid line\n }\n }\n return values\n}\n\nexport function readJsonLog(path: string): object[] {\n if (!existsSync(path)) {\n return []\n }\n let content: string\n try {\n content = readFileSync(path, 'utf8')\n } catch {\n return []\n }\n\n try {\n const parsed = JSON.parse(content)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n const recovered = recoverJsonArrayPrefix(content)\n if (recovered.length) return recovered as object[]\n const recoveredJsonl = recoverJsonlObjects(content)\n if (recoveredJsonl.length) return recoveredJsonl as object[]\n return []\n }\n}\n\nexport function appendToJsonLog(path: string, message: object): void {\n if (process.env.USER_TYPE === 'external') {\n return\n }\n\n const dir = dirname(path)\n if (!safeMkdir(dir)) {\n return\n }\n\n const messageWithTimestamp = {\n ...message,\n cwd: process.cwd(),\n userType: process.env.USER_TYPE,\n sessionId: getKodeAgentSessionId(),\n timestamp: new Date().toISOString(),\n version: MACRO.VERSION,\n }\n\n if (path.endsWith('.jsonl')) {\n const line = JSON.stringify(messageWithTimestamp) + '\\n'\n safeAppendFile(path, line)\n return\n }\n\n // Create messages file with empty array if it doesn't exist\n if (!existsSync(path) && !safeWriteFile(path, '[]')) {\n return\n }\n\n const messages = readJsonLog(path)\n messages.push(messageWithTimestamp)\n\n safeWriteFile(path, JSON.stringify(messages, null, 2))\n}\n", "import {\n appendFileSync,\n existsSync,\n mkdirSync,\n renameSync,\n unlinkSync,\n writeFileSync,\n} from 'fs'\n\nconst PERMISSION_ERROR_CODES = new Set(['EACCES', 'EPERM', 'EROFS'])\n\nfunction isPermissionError(error: unknown): error is NodeJS.ErrnoException {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n PERMISSION_ERROR_CODES.has((error as NodeJS.ErrnoException).code ?? '')\n )\n}\n\nexport function safeMkdir(dir: string): boolean {\n if (existsSync(dir)) return true\n try {\n mkdirSync(dir, { recursive: true })\n return true\n } catch (error) {\n if (isPermissionError(error)) {\n return false\n }\n throw error\n }\n}\n\nexport function safeWriteFile(\n path: string,\n data: string,\n encoding: BufferEncoding = 'utf8',\n): boolean {\n const tmpPath = `${path}.${process.pid}.${Date.now()}.tmp`\n try {\n writeFileSync(tmpPath, data, encoding)\n renameSync(tmpPath, path)\n return true\n } catch (error) {\n try {\n unlinkSync(tmpPath)\n } catch {\n // ignore\n }\n if (isPermissionError(error)) {\n return false\n }\n throw error\n }\n}\n\nexport function safeAppendFile(\n path: string,\n data: string,\n encoding: BufferEncoding = 'utf8',\n): boolean {\n try {\n appendFileSync(path, data, { encoding })\n return true\n } catch (error) {\n if (isPermissionError(error)) {\n return false\n }\n throw error\n }\n}\n", "import { dirname } from 'path'\nimport { MACRO } from '#core/constants/macros'\nimport { getPlanSlugForConversationKey } from '#core/utils/planMode'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\n\nimport { safeMkdir, safeWriteFile } from './filesystem'\n\nexport function overwriteLog(\n path: string,\n messages: object[],\n options?: { conversationKey?: string },\n): void {\n if (process.env.USER_TYPE === 'external') {\n return\n }\n\n if (!messages.length) {\n return\n }\n\n const dir = dirname(path)\n if (!safeMkdir(dir)) {\n return\n }\n\n const slug = options?.conversationKey\n ? getPlanSlugForConversationKey(options.conversationKey)\n : null\n\n const messagesWithMetadata = messages.map(message => ({\n ...message,\n ...(slug ? { slug } : {}),\n cwd: process.cwd(),\n userType: process.env.USER_TYPE,\n sessionId: getKodeAgentSessionId(),\n timestamp: new Date().toISOString(),\n version: MACRO.VERSION,\n }))\n\n safeWriteFile(path, JSON.stringify(messagesWithMetadata, null, 2))\n}\n", "import { existsSync, mkdirSync, readFileSync, realpathSync } from 'fs'\nimport { isAbsolute, join, relative, resolve, parse } from 'path'\nimport {\n generateSlug,\n getPlanSlugForConversationKey,\n setPlanSlug,\n} from './slug'\nimport { getActivePlanConversationKey, DEFAULT_CONVERSATION_KEY } from './state'\nimport { getKodeBaseDir } from '#core/utils/env'\n\nconst MAX_SLUG_ATTEMPTS = 10\n\nexport function getPlanDirectory(): string {\n const dir = join(getKodeBaseDir(), 'plans')\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n return dir\n}\n\nfunction getOrCreatePlanSlug(conversationKey: string): string {\n const existing = getPlanSlugForConversationKey(conversationKey)\n if (existing) return existing\n\n const dir = getPlanDirectory()\n\n let slug: string | null = null\n for (let attempt = 0; attempt < MAX_SLUG_ATTEMPTS; attempt++) {\n slug = generateSlug()\n const path = join(dir, `${slug}.md`)\n if (!existsSync(path)) break\n }\n\n if (!slug) slug = generateSlug()\n\n setPlanSlug(conversationKey, slug)\n return slug\n}\n\nexport function getPlanFilePath(\n agentId?: string,\n conversationKey?: string,\n): string {\n const dir = getPlanDirectory()\n const key = conversationKey ?? DEFAULT_CONVERSATION_KEY\n const slug = getOrCreatePlanSlug(key)\n\n if (!agentId) return join(dir, `${slug}.md`)\n return join(dir, `${slug}-agent-${agentId}.md`)\n}\n\nfunction resolveExistingPath(path: string): string {\n const resolved = resolve(path)\n try {\n return realpathSync(resolved)\n } catch {\n return resolved\n }\n}\n\nexport function isPlanFilePathForActiveConversation(path: string): boolean {\n const key = getActivePlanConversationKey() ?? DEFAULT_CONVERSATION_KEY\n const planDir = resolveExistingPath(getPlanDirectory())\n const expectedMainPlanPath = resolveExistingPath(\n getPlanFilePath(undefined, key),\n )\n const target = resolveExistingPath(path)\n\n const rel = relative(planDir, target)\n if (!rel || rel === '') return false\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n\n const expectedSlug = parse(expectedMainPlanPath).name\n const targetName = parse(target).name\n return (\n targetName === expectedSlug ||\n targetName.startsWith(`${expectedSlug}-agent-`)\n )\n}\n\nexport function isMainPlanFilePathForActiveConversation(path: string): boolean {\n const key = getActivePlanConversationKey() ?? DEFAULT_CONVERSATION_KEY\n const expected = resolveExistingPath(getPlanFilePath(undefined, key))\n const target = resolveExistingPath(path)\n return target === expected\n}\n\nexport function isPathInPlanDirectory(path: string): boolean {\n const dir = resolve(getPlanDirectory())\n const target = resolve(path)\n const rel = relative(dir, target)\n if (!rel || rel === '') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n return true\n}\n\nexport function readPlanFile(\n agentId?: string,\n conversationKey?: string,\n): { content: string; exists: boolean; planFilePath: string } {\n const planFilePath = getPlanFilePath(agentId, conversationKey)\n if (!existsSync(planFilePath)) {\n return { content: '', exists: false, planFilePath }\n }\n return {\n content: readFileSync(planFilePath, 'utf8'),\n exists: true,\n planFilePath,\n }\n}\n", "import { randomBytes } from 'crypto'\nimport { parse } from 'path'\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport {\n PLAN_SLUG_ADJECTIVES,\n PLAN_SLUG_NOUNS,\n PLAN_SLUG_VERBS,\n} from '#protocol/utils/planSlugWords'\n\nimport { getConversationKey } from './state'\n\nconst planSlugCache = new Map<string, string>()\n\nfunction pickIndex(length: number): number {\n return randomBytes(4).readUInt32BE(0) % length\n}\n\nfunction pickWord(words: readonly string[]): string {\n return words[pickIndex(words.length)]!\n}\n\nexport function generateSlug(): string {\n const adjective = pickWord(PLAN_SLUG_ADJECTIVES)\n const verb = pickWord(PLAN_SLUG_VERBS)\n const noun = pickWord(PLAN_SLUG_NOUNS)\n return `${adjective}-${verb}-${noun}`\n}\n\nexport function setPlanSlug(conversationKey: string, slug: string): void {\n planSlugCache.set(conversationKey, slug)\n}\n\nexport function getPlanSlugForConversationKey(\n conversationKey: string,\n): string | null {\n return planSlugCache.get(conversationKey) ?? null\n}\n\nexport function extractSlugFromPlanFilePath(\n planFilePath: string,\n): string | null {\n if (!planFilePath) return null\n const baseName = parse(planFilePath).name\n if (!baseName) return null\n\n const agentMarker = '-agent-'\n const idx = baseName.lastIndexOf(agentMarker)\n if (idx === -1) return baseName\n if (idx === 0) return null\n return baseName.slice(0, idx)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction getTrimmedString(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nexport function hydratePlanSlugFromMessages(\n messages: unknown[],\n context?: ToolUseContext,\n): boolean {\n const conversationKey = getConversationKey(context)\n if (planSlugCache.has(conversationKey)) return true\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (!isRecord(msg)) continue\n\n const directSlug = getTrimmedString(msg.slug)\n if (directSlug) {\n planSlugCache.set(conversationKey, directSlug)\n return true\n }\n\n const toolUseResult = msg.toolUseResult\n if (!isRecord(toolUseResult)) continue\n const data = toolUseResult.data\n if (!isRecord(data)) continue\n\n const planFilePath =\n getTrimmedString(data.planFilePath) || getTrimmedString(data.filePath)\n if (!planFilePath) continue\n\n const slug = extractSlugFromPlanFilePath(planFilePath)\n if (!slug) continue\n\n planSlugCache.set(conversationKey, slug)\n return true\n }\n\n return false\n}\n\nexport function __resetPlanSlugsForTests(): void {\n planSlugCache.clear()\n}\n", "import type { ToolUseContext } from '#core/tooling/Tool'\n\nexport const DEFAULT_CONVERSATION_KEY = 'default'\n\nexport type PlanModeFlags = {\n hasExitedPlanMode: boolean\n needsPlanModeExitAttachment: boolean\n}\n\nexport type PlanModeAttachmentState = {\n hasInjected: boolean\n lastInjectedAssistantTurn: number\n}\n\nconst planModeEnabledByConversationKey = new Map<string, boolean>()\nconst planModeFlagsByConversationKey = new Map<string, PlanModeFlags>()\nconst planModeAttachmentStateByAgentKey = new Map<\n string,\n PlanModeAttachmentState\n>()\n\nlet activePlanConversationKey: string | null = null\n\nexport function getConversationKey(\n context?: Pick<ToolUseContext, 'options'>,\n): string {\n const messageLogName =\n context?.options?.messageLogName ?? DEFAULT_CONVERSATION_KEY\n const forkNumber = context?.options?.forkNumber ?? 0\n return `${messageLogName}:${forkNumber}`\n}\n\nexport function getPlanConversationKey(\n context?: Pick<ToolUseContext, 'options'>,\n): string {\n return getConversationKey(context)\n}\n\nexport function setActivePlanConversationKey(conversationKey: string): void {\n activePlanConversationKey = conversationKey\n}\n\nexport function getActivePlanConversationKey(): string | null {\n return activePlanConversationKey\n}\n\nexport function getAgentKey(\n context?: Pick<ToolUseContext, 'options' | 'agentId'>,\n): string {\n const conversationKey = getConversationKey(context)\n const agentId = context?.agentId ?? 'main'\n return `${conversationKey}:${agentId}`\n}\n\nexport function isPlanModeEnabled(context?: ToolUseContext): boolean {\n const key = getConversationKey(context)\n return planModeEnabledByConversationKey.get(key) ?? false\n}\n\nexport function setPlanModeEnabledForConversationKey(\n conversationKey: string,\n enabled: boolean,\n): void {\n planModeEnabledByConversationKey.set(conversationKey, enabled)\n}\n\nexport function getPlanModeFlags(conversationKey: string): PlanModeFlags {\n const existing = planModeFlagsByConversationKey.get(conversationKey)\n if (existing) return existing\n const created: PlanModeFlags = {\n hasExitedPlanMode: false,\n needsPlanModeExitAttachment: false,\n }\n planModeFlagsByConversationKey.set(conversationKey, created)\n return created\n}\n\nexport function getPlanModeAttachmentState(\n agentKey: string,\n): PlanModeAttachmentState | undefined {\n return planModeAttachmentStateByAgentKey.get(agentKey)\n}\n\nexport function setPlanModeAttachmentState(\n agentKey: string,\n state: PlanModeAttachmentState,\n): void {\n planModeAttachmentStateByAgentKey.set(agentKey, state)\n}\n\nexport function __resetPlanModeStateForTests(): void {\n planModeEnabledByConversationKey.clear()\n planModeFlagsByConversationKey.clear()\n planModeAttachmentStateByAgentKey.clear()\n activePlanConversationKey = null\n}\n", "import { existsSync } from 'fs'\nimport type { ToolUseContext } from '#core/tooling/Tool'\n\nimport {\n getPlanFilePath,\n isMainPlanFilePathForActiveConversation,\n isPathInPlanDirectory,\n isPlanFilePathForActiveConversation,\n} from './paths'\nimport {\n getAgentKey,\n getConversationKey,\n getPlanModeAttachmentState,\n getPlanModeFlags,\n isPlanModeEnabled,\n setPlanModeAttachmentState,\n} from './state'\nimport {\n buildPlanModeExitReminder,\n buildPlanModeMainReminder,\n buildPlanModeReentryReminder,\n buildPlanModeSubAgentReminder,\n wrapSystemReminder,\n} from './reminders'\n\nconst TURNS_BETWEEN_ATTACHMENTS = 5\n\nexport {\n isPlanFilePathForActiveConversation,\n isMainPlanFilePathForActiveConversation,\n isPathInPlanDirectory,\n}\n\nexport function getPlanModeSystemPromptAdditions(\n messages: Array<{ type?: string }>,\n context: ToolUseContext,\n): string[] {\n const conversationKey = getConversationKey(context)\n const agentKey = getAgentKey(context)\n const flags = getPlanModeFlags(conversationKey)\n const additions: string[] = []\n\n const assistantTurns = messages.filter(m => m?.type === 'assistant').length\n\n if (isPlanModeEnabled(context)) {\n const previous = getPlanModeAttachmentState(agentKey) ?? {\n hasInjected: false,\n lastInjectedAssistantTurn: -Infinity,\n }\n\n if (\n previous.hasInjected &&\n assistantTurns - previous.lastInjectedAssistantTurn <\n TURNS_BETWEEN_ATTACHMENTS\n ) {\n return []\n }\n\n const planFilePath = getPlanFilePath(context.agentId, conversationKey)\n const planExists = existsSync(planFilePath)\n\n if (flags.hasExitedPlanMode && planExists) {\n additions.push(\n wrapSystemReminder(buildPlanModeReentryReminder(planFilePath)),\n )\n flags.hasExitedPlanMode = false\n }\n\n const isSubAgent = !!context.agentId\n additions.push(\n wrapSystemReminder(\n isSubAgent\n ? buildPlanModeSubAgentReminder({ planExists, planFilePath })\n : buildPlanModeMainReminder({ planExists, planFilePath }),\n ),\n )\n\n setPlanModeAttachmentState(agentKey, {\n hasInjected: true,\n lastInjectedAssistantTurn: assistantTurns,\n })\n\n return additions\n }\n\n if (flags.needsPlanModeExitAttachment) {\n const planFilePath = getPlanFilePath(context.agentId, conversationKey)\n additions.push(wrapSystemReminder(buildPlanModeExitReminder(planFilePath)))\n flags.needsPlanModeExitAttachment = false\n }\n\n return additions\n}\n", "import { LEGACY_ENV } from '#core/compat/legacyEnv'\n\nfunction getMaxParallelExploreAgents(): number {\n const raw =\n process.env.KODE_PLAN_V2_EXPLORE_AGENT_COUNT ??\n process.env[LEGACY_ENV.codePlanV2ExploreAgentCount]\n if (raw) {\n const parsed = Number.parseInt(raw, 10)\n if (Number.isFinite(parsed) && parsed > 0 && parsed <= 10) return parsed\n }\n return 3\n}\n\nfunction getMaxParallelPlanAgents(): number {\n const raw =\n process.env.KODE_PLAN_V2_AGENT_COUNT ??\n process.env[LEGACY_ENV.codePlanV2AgentCount]\n if (raw) {\n const parsed = Number.parseInt(raw, 10)\n if (Number.isFinite(parsed) && parsed > 0 && parsed <= 10) return parsed\n }\n return 1\n}\n\nexport function buildPlanModeMainReminder(args: {\n planExists: boolean\n planFilePath: string\n}): string {\n const { planExists, planFilePath } = args\n\n const writeToolName = 'Write'\n const editToolName = 'Edit'\n const askUserToolName = 'AskUserQuestion'\n const exploreAgentType = 'Explore'\n const planAgentType = 'Plan'\n const exitPlanModeToolName = 'ExitPlanMode'\n\n const maxParallelExploreAgents = getMaxParallelExploreAgents()\n const maxParallelPlanAgents = getMaxParallelPlanAgents()\n\n return `Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits (with the exception of the plan file mentioned below), run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. This supercedes any other instructions you have received.\n\n## Plan File Info:\n${planExists ? `A plan file already exists at ${planFilePath}. You can read it and make incremental edits using the ${editToolName} tool.` : `No plan file exists yet. You should create your plan at ${planFilePath} using the ${writeToolName} tool.`}\nYou should build your plan incrementally by writing to or editing this file. NOTE that this is the only file you are allowed to edit - other than this you are only allowed to take READ-ONLY actions.\n\n## Plan Workflow\n\n### Phase 1: Initial Understanding\nGoal: Gain a comprehensive understanding of the user's request by reading through code and asking them questions. Critical: In this phase you should only use the ${exploreAgentType} subagent type.\n\n1. Focus on understanding the user's request and the code associated with their request\n\n2. **Launch up to ${maxParallelExploreAgents} ${exploreAgentType} agents IN PARALLEL** (single message, multiple tool calls) to efficiently explore the codebase.\n - Use 1 agent when the task is isolated to known files, the user provided specific file paths, or you're making a small targeted change.\n - Use multiple agents when: the scope is uncertain, multiple areas of the codebase are involved, or you need to understand existing patterns before planning.\n - Quality over quantity - ${maxParallelExploreAgents} agents maximum, but you should try to use the minimum number of agents necessary (usually just 1)\n - If using multiple agents: Provide each agent with a specific search focus or area to explore. Example: One agent searches for existing implementations, another explores related components, a third investigates testing patterns\n\n3. After exploring the code, use the ${askUserToolName} tool to clarify ambiguities in the user request up front.\n\n### Phase 2: Design\nGoal: Design an implementation approach.\n\nLaunch ${planAgentType} agent(s) to design the implementation based on the user's intent and your exploration results from Phase 1.\n\nYou can launch up to ${maxParallelPlanAgents} agent(s) in parallel.\n\n**Guidelines:**\n- **Default**: Launch at least 1 Plan agent for most tasks - it helps validate your understanding and consider alternatives\n- **Skip agents**: Only for truly trivial tasks (typo fixes, single-line changes, simple renames)\n${\n maxParallelPlanAgents > 1\n ? `- **Multiple agents**: Use up to ${maxParallelPlanAgents} agents for complex tasks that benefit from different perspectives\n\nExamples of when to use multiple agents:\n- The task touches multiple parts of the codebase\n- It's a large refactor or architectural change\n- There are many edge cases to consider\n- You'd benefit from exploring different approaches\n\nExample perspectives by task type:\n- New feature: simplicity vs performance vs maintainability\n- Bug fix: root cause vs workaround vs prevention\n- Refactoring: minimal change vs clean architecture\n`\n : ''\n}\nIn the agent prompt:\n- Provide comprehensive background context from Phase 1 exploration including filenames and code path traces\n- Describe requirements and constraints\n- Request a detailed implementation plan\n\n### Phase 3: Review\nGoal: Review the plan(s) from Phase 2 and ensure alignment with the user's intentions.\n1. Read the critical files identified by agents to deepen your understanding\n2. Ensure that the plans align with the user's original request\n3. Use ${askUserToolName} to clarify any remaining questions with the user\n\n### Phase 4: Final Plan\nGoal: Write your final plan to the plan file (the only file you can edit).\n- Include only your recommended approach, not all alternatives\n- Ensure that the plan file is concise enough to scan quickly, but detailed enough to execute effectively\n- Include the paths of critical files to be modified\n\n### Phase 5: Call ${exitPlanModeToolName}\nAt the very end of your turn, once you have asked the user questions and are happy with your final plan file - you should always call ${exitPlanModeToolName} to indicate to the user that you are done planning.\nThis is critical - your turn should only end with either asking the user a question or calling ${exitPlanModeToolName}. Do not stop unless it's for these 2 reasons.\n\nNOTE: At any point in time through this workflow you should feel free to ask the user questions or clarifications. Don't make large assumptions about user intent. The goal is to present a well researched plan to the user, and tie any loose ends before implementation begins.`\n}\n\nexport function buildPlanModeSubAgentReminder(args: {\n planExists: boolean\n planFilePath: string\n}): string {\n const { planExists, planFilePath } = args\n\n const writeToolName = 'Write'\n const editToolName = 'Edit'\n const askUserToolName = 'AskUserQuestion'\n\n return `Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits, run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. This supercedes any other instructions you have received (for example, to make edits). Instead, you should:\n\n## Plan File Info:\n${planExists ? `A plan file already exists at ${planFilePath}. You can read it and make incremental edits using the ${editToolName} tool if you need to.` : `No plan file exists yet. You should create your plan at ${planFilePath} using the ${writeToolName} tool if you need to.`}\nYou should build your plan incrementally by writing to or editing this file. NOTE that this is the only file you are allowed to edit - other than this you are only allowed to take READ-ONLY actions.\nAnswer the user's query comprehensively, using the ${askUserToolName} tool if you need to ask the user clarifying questions. If you do use the ${askUserToolName}, make sure to ask all clarifying questions you need to fully understand the user's intent before proceeding.`\n}\n\nexport function buildPlanModeReentryReminder(planFilePath: string): string {\n const exitPlanModeToolName = 'ExitPlanMode'\n\n return `## Re-entering Plan Mode\n\nYou are returning to plan mode after having previously exited it. A plan file exists at ${planFilePath} from your previous planning session.\n\n**Before proceeding with any new planning, you should:**\n1. Read the existing plan file to understand what was previously planned\n2. Evaluate the user's current request against that plan\n3. Decide how to proceed:\n - **Different task**: If the user's request is for a different task\u2014even if it's similar or related\u2014start fresh by overwriting the existing plan\n - **Same task, continuing**: If this is explicitly a continuation or refinement of the exact same task, modify the existing plan while cleaning up outdated or irrelevant sections\n4. Continue on with the plan process and most importantly you should always edit the plan file one way or the other before calling ${exitPlanModeToolName}\n\nTreat this as a fresh planning session. Do not assume the existing plan is relevant without evaluating it first.`\n}\n\nexport function buildPlanModeExitReminder(planFilePath: string): string {\n return `## Exited Plan Mode\n\nYou have exited plan mode. You can now make edits, run tools, and take actions. The plan file is located at ${planFilePath} if you need to reference it.`\n}\n\nexport function wrapSystemReminder(text: string): string {\n return `<system-reminder>\\n${text}\\n</system-reminder>`\n}\n", "import type { ToolUseContext } from '#core/tooling/Tool'\n\nimport { getPlanFilePath, getPlanDirectory, readPlanFile } from './mode/paths'\nimport {\n getActivePlanConversationKey,\n getAgentKey,\n getConversationKey,\n getPlanConversationKey,\n getPlanModeAttachmentState,\n getPlanModeFlags,\n isPlanModeEnabled,\n setActivePlanConversationKey,\n setPlanModeAttachmentState,\n setPlanModeEnabledForConversationKey,\n __resetPlanModeStateForTests,\n} from './mode/state'\nimport {\n getPlanModeSystemPromptAdditions,\n isMainPlanFilePathForActiveConversation,\n isPathInPlanDirectory,\n isPlanFilePathForActiveConversation,\n} from './mode/systemPrompt'\nimport {\n getPlanSlugForConversationKey,\n hydratePlanSlugFromMessages,\n setPlanSlug,\n __resetPlanSlugsForTests,\n} from './mode/slug'\n\nexport {\n getPlanConversationKey,\n setActivePlanConversationKey,\n getActivePlanConversationKey,\n getPlanModeSystemPromptAdditions,\n isPlanModeEnabled,\n setPlanSlug,\n getPlanSlugForConversationKey,\n hydratePlanSlugFromMessages,\n getPlanDirectory,\n getPlanFilePath,\n isPlanFilePathForActiveConversation,\n isMainPlanFilePathForActiveConversation,\n isPathInPlanDirectory,\n readPlanFile,\n}\n\nexport function enterPlanMode(context?: ToolUseContext): {\n planFilePath: string\n} {\n const key = getConversationKey(context)\n setPlanModeEnabledForConversationKey(key, true)\n return { planFilePath: getPlanFilePath(context?.agentId, key) }\n}\n\nexport function enterPlanModeForConversationKey(conversationKey: string): void {\n setPlanModeEnabledForConversationKey(conversationKey, true)\n}\n\nexport function exitPlanMode(context?: ToolUseContext): {\n planFilePath: string\n} {\n const key = getConversationKey(context)\n setPlanModeEnabledForConversationKey(key, false)\n\n const flags = getPlanModeFlags(key)\n flags.hasExitedPlanMode = true\n flags.needsPlanModeExitAttachment = true\n\n return { planFilePath: getPlanFilePath(context?.agentId, key) }\n}\n\nexport function exitPlanModeForConversationKey(conversationKey: string): void {\n setPlanModeEnabledForConversationKey(conversationKey, false)\n const flags = getPlanModeFlags(conversationKey)\n flags.hasExitedPlanMode = true\n flags.needsPlanModeExitAttachment = true\n}\n\nexport function __resetPlanModeForTests(): void {\n __resetPlanModeStateForTests()\n __resetPlanSlugsForTests()\n}\n", "import {\n existsSync,\n mkdirSync,\n readdirSync,\n statSync,\n copyFileSync,\n promises as fsPromises,\n} from 'fs'\nimport { join } from 'path'\n\nimport type { LogOption, SerializedMessage } from '#core/types/logs'\n\nimport { logError } from './errors'\nimport { readJsonLog } from './jsonLog'\nimport { CACHE_PATHS, LEGACY_CACHE_PATHS, parseLogFilename } from './paths'\nimport { parseISOString, sortLogs } from './util'\n\nconst MIGRATION_MESSAGE_LOG_LIMIT = 50\nlet didMigrateMessageLogs = false\n\nfunction migrateLegacyMessageLogsIfNeeded() {\n if (didMigrateMessageLogs) return\n didMigrateMessageLogs = true\n\n const legacyDir = LEGACY_CACHE_PATHS.messages()\n const newDir = CACHE_PATHS.messages()\n\n if (!existsSync(legacyDir)) return\n\n const newHasAny =\n existsSync(newDir) &&\n readdirSync(newDir).some(file => file.endsWith('.json'))\n if (newHasAny) return\n\n try {\n mkdirSync(newDir, { recursive: true })\n } catch {\n return\n }\n\n let legacyFiles: string[] = []\n try {\n legacyFiles = readdirSync(legacyDir).filter(file => file.endsWith('.json'))\n } catch {\n return\n }\n\n const sorted = legacyFiles\n .map(file => {\n try {\n const stats = statSync(join(legacyDir, file))\n return { file, mtimeMs: stats.mtimeMs }\n } catch {\n return { file, mtimeMs: 0 }\n }\n })\n .sort((a, b) => b.mtimeMs - a.mtimeMs)\n .slice(0, MIGRATION_MESSAGE_LOG_LIMIT)\n\n for (const { file } of sorted) {\n const src = join(legacyDir, file)\n const dest = join(newDir, file)\n if (existsSync(dest)) continue\n try {\n copyFileSync(src, dest)\n } catch {\n // Best-effort migration; ignore per-file failures.\n }\n }\n}\n\nexport async function loadLogList(\n path = CACHE_PATHS.messages(),\n): Promise<LogOption[]> {\n if (path === CACHE_PATHS.messages()) {\n migrateLegacyMessageLogsIfNeeded()\n }\n\n const searchPaths =\n path === CACHE_PATHS.messages()\n ? [CACHE_PATHS.messages(), LEGACY_CACHE_PATHS.messages()]\n : [path]\n\n const existingPaths = searchPaths.filter(p => existsSync(p))\n if (existingPaths.length === 0) {\n logError(`No logs found at ${path}`)\n return []\n }\n\n const filesWithDir = (\n await Promise.all(\n existingPaths.map(async dirPath => {\n const dirFiles = await fsPromises.readdir(dirPath)\n return dirFiles.map(file => ({ file, dirPath }))\n }),\n )\n ).flat()\n\n const seen = new Set<string>()\n const uniqueFiles = filesWithDir.filter(({ file }) => {\n if (seen.has(file)) return false\n seen.add(file)\n return true\n })\n\n const logData = await Promise.all(\n uniqueFiles.map(async ({ file, dirPath }, i) => {\n const fullPath = join(dirPath, file)\n const messages = readJsonLog(fullPath) as SerializedMessage[]\n const firstMessage = messages[0]\n const lastMessage = messages[messages.length - 1]\n const firstPrompt =\n firstMessage?.type === 'user' &&\n typeof firstMessage?.message?.content === 'string'\n ? firstMessage?.message?.content\n : 'No prompt'\n\n const { date, forkNumber, sidechainNumber } = parseLogFilename(file)\n return {\n date,\n forkNumber,\n fullPath,\n messages,\n value: i, // overwritten after sorting\n created: parseISOString(firstMessage?.timestamp || date),\n modified: lastMessage?.timestamp\n ? parseISOString(lastMessage.timestamp)\n : parseISOString(date),\n firstPrompt:\n firstPrompt.split('\\n')[0]?.slice(0, 50) +\n (firstPrompt.length > 50 ? '\u2026' : '') || 'No prompt',\n messageCount: messages.length,\n sidechainNumber,\n }\n }),\n )\n\n return sortLogs(logData.filter(_ => _.messages.length)).map((_, i) => ({\n ..._,\n value: i,\n }))\n}\n", "import type { LogOption } from '#core/types/logs'\n\nexport function sortLogs(logs: LogOption[]): LogOption[] {\n return logs.sort((a, b) => {\n // Sort by modified date (newest first)\n const modifiedDiff = b.modified.getTime() - a.modified.getTime()\n if (modifiedDiff !== 0) {\n return modifiedDiff\n }\n\n // If modified dates are equal, sort by created date\n const createdDiff = b.created.getTime() - a.created.getTime()\n if (createdDiff !== 0) {\n return createdDiff\n }\n\n // If both dates are equal, sort by fork number\n return (b.forkNumber ?? 0) - (a.forkNumber ?? 0)\n })\n}\n\nexport function formatDate(date: Date): string {\n const now = new Date()\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n\n const isToday = date.toDateString() === now.toDateString()\n const isYesterday = date.toDateString() === yesterday.toDateString()\n\n const timeStr = date\n .toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n })\n .toLowerCase()\n\n if (isToday) {\n return `Today at ${timeStr}`\n } else if (isYesterday) {\n return `Yesterday at ${timeStr}`\n } else {\n return (\n date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n }) + ` at ${timeStr}`\n )\n }\n}\n\nexport function parseISOString(s: string): Date {\n const b = s.split(/\\D+/)\n return new Date(\n Date.UTC(\n parseInt(b[0]!, 10),\n parseInt(b[1]!, 10) - 1,\n parseInt(b[2]!, 10),\n parseInt(b[3]!, 10),\n parseInt(b[4]!, 10),\n parseInt(b[5]!, 10),\n parseInt(b[6]!, 10),\n ),\n )\n}\n", "import { execFileNoThrow } from './execFileNoThrow'\nimport { memoize } from 'lodash-es'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { CONFIG_FILE } from '#core/constants/product'\nimport { getKodeRoot } from '#config/dataRoots'\n// Base directory for local Kode data files.\n//\n// Note: this must be a function (not a fixed const) because tests (and some host\n// integrations) may set env vars after modules are loaded.\nexport function getKodeBaseDir(): string {\n return getKodeRoot()\n}\n\n// Config and data paths\nexport function getGlobalConfigFilePath(): string {\n const hasOverride = Boolean(\n process.env.KODE_CONFIG_DIR || process.env.ANYKODE_CONFIG_DIR,\n )\n return hasOverride\n ? join(getKodeBaseDir(), 'config.json')\n : join(homedir(), CONFIG_FILE)\n}\n\nexport function getMemoryDir(): string {\n return join(getKodeBaseDir(), 'memory')\n}\n\n// Back-compat exports (prefer calling the functions above in new code).\nexport const KODE_BASE_DIR = getKodeBaseDir()\nexport const GLOBAL_CONFIG_FILE = getGlobalConfigFilePath()\nexport const MEMORY_DIR = getMemoryDir()\n\nconst getIsDocker = memoize(async (): Promise<boolean> => {\n // Check for .dockerenv file\n const { code } = await execFileNoThrow('test', ['-f', '/.dockerenv'])\n if (code !== 0) {\n return false\n }\n return process.platform === 'linux'\n})\n\nconst hasInternetAccess = memoize(async (): Promise<boolean> => {\n const offline =\n process.env.KODE_OFFLINE ??\n process.env.OFFLINE ??\n process.env.NO_NETWORK ??\n ''\n const normalized = String(offline).trim().toLowerCase()\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return false\n return true\n})\n\n// all of these should be immutable\nexport const env = {\n getIsDocker,\n hasInternetAccess,\n isCI: Boolean(process.env.CI),\n platform:\n process.platform === 'win32'\n ? 'windows'\n : process.platform === 'darwin'\n ? 'macos'\n : 'linux',\n nodeVersion: process.version,\n terminal: process.env.TERM_PROGRAM,\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["mkdirSync", "writeFileSync", "existsSync", "join", "existsSync", "existsSync", "existsSync", "join", "existsSync", "mkdirSync", "writeFileSync", "dirname", "existsSync", "mkdirSync", "readFileSync", "join", "parse", "join", "existsSync", "mkdirSync", "existsSync", "readFileSync", "existsSync", "existsSync", "dirname", "existsSync", "mkdirSync", "join", "existsSync", "mkdirSync", "join", "resolve", "join", "join"]
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getModelManager
3
- } from "./chunk-VSKGDU73.js";
3
+ } from "./chunk-FKWFR23G.js";
4
4
  import {
5
5
  getGlobalConfig
6
6
  } from "./chunk-EYEZUJGL.js";
@@ -5,7 +5,7 @@ import {
5
5
  getMessagesSetter,
6
6
  readTextContent,
7
7
  resetFileFreshnessSession
8
- } from "./chunk-EKXQ7ZWV.js";
8
+ } from "./chunk-L5ZJIOEF.js";
9
9
  import {
10
10
  MaxBudgetUsdExceededError
11
11
  } from "./chunk-XXTEA5GR.js";
@@ -19,23 +19,23 @@ import {
19
19
  appendSessionJsonlFromMessage,
20
20
  appendSessionSummaryRecord,
21
21
  sanitizeProjectNameForSessionStore
22
- } from "./chunk-DPVCHIF7.js";
22
+ } from "./chunk-KRBZO255.js";
23
23
  import {
24
24
  formatSystemPromptWithContext
25
- } from "./chunk-G5ET7GFB.js";
25
+ } from "./chunk-KQV5FGSS.js";
26
26
  import {
27
27
  getCodeStyle,
28
28
  getContext
29
- } from "./chunk-MEQ7TAT7.js";
29
+ } from "./chunk-KHMXPPO7.js";
30
30
  import {
31
31
  emitReminderEvent
32
- } from "./chunk-DZPD6H7A.js";
32
+ } from "./chunk-JXYXMP2Q.js";
33
33
  import {
34
34
  setRequestStatus
35
- } from "./chunk-LOCXPQNJ.js";
35
+ } from "./chunk-ESRGV7DC.js";
36
36
  import {
37
37
  queryLLM
38
- } from "./chunk-NC3RX5AB.js";
38
+ } from "./chunk-2B2TR2S3.js";
39
39
  import {
40
40
  INTERRUPT_MESSAGE,
41
41
  INTERRUPT_MESSAGE_FOR_TOOL_USE,
@@ -45,7 +45,7 @@ import {
45
45
  createProgressMessage,
46
46
  createUserMessage,
47
47
  normalizeMessagesForAPI
48
- } from "./chunk-Y33AS3MY.js";
48
+ } from "./chunk-L2LWCVUF.js";
49
49
  import {
50
50
  getTotalCost
51
51
  } from "./chunk-GJYXZ5IL.js";
@@ -60,22 +60,22 @@ import {
60
60
  runStopHooks,
61
61
  runUserPromptSubmitHooks,
62
62
  updateHookTranscriptForMessages
63
- } from "./chunk-BEDQTC44.js";
63
+ } from "./chunk-5LL33G6X.js";
64
64
  import {
65
65
  getModelManager
66
- } from "./chunk-VSKGDU73.js";
66
+ } from "./chunk-FKWFR23G.js";
67
67
  import {
68
68
  debug,
69
69
  getCurrentRequest,
70
70
  logUserFriendly,
71
71
  markPhase
72
- } from "./chunk-KDY7XYYS.js";
72
+ } from "./chunk-YQ3YJSMI.js";
73
73
  import {
74
74
  getKodeBaseDir,
75
75
  getPlanModeSystemPromptAdditions,
76
76
  hydratePlanSlugFromMessages,
77
77
  logError
78
- } from "./chunk-AKC4BUW5.js";
78
+ } from "./chunk-SOBWNYOW.js";
79
79
  import {
80
80
  getCwd
81
81
  } from "./chunk-5ARRC2T2.js";
@@ -95,7 +95,10 @@ function countTokens(messages) {
95
95
  const message = messages[i];
96
96
  if (message?.type === "assistant" && "usage" in message.message && !(message.message.content[0]?.type === "text" && SYNTHETIC_ASSISTANT_MESSAGES.has(message.message.content[0].text))) {
97
97
  const { usage } = message.message;
98
- return usage.input_tokens + (usage.cache_creation_input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0) + usage.output_tokens;
98
+ const total = usage.input_tokens + (usage.cache_creation_input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0) + usage.output_tokens;
99
+ if (total > 0) {
100
+ return total;
101
+ }
99
102
  }
100
103
  i--;
101
104
  }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../packages/core/src/utils/tokens.ts", "../../packages/core/src/utils/fileRecoveryCore.ts", "../../packages/core/src/utils/autoCompactThreshold.ts", "../../packages/core/src/utils/autoCompactCore.ts", "../../packages/core/src/feedback/binaryFeedback.ts", "../../packages/core/src/engine/query-executor.ts", "../../packages/core/src/utils/toolNameAliases.ts", "../../packages/core/src/utils/toolResultPersistence.ts", "../../packages/core/src/engine/pipeline/tool-input.ts", "../../packages/core/src/engine/pipeline/tool-call.ts", "../../packages/core/src/engine/pipeline/tool-use.ts", "../../packages/core/src/engine/pipeline/tool-use-queue.ts", "../../packages/core/src/engine/pipeline/types.ts", "../../packages/core/src/query/agentEvents.ts", "../../packages/core/src/engine/message-pipeline.ts", "../../packages/core/src/engine/orchestrator.ts"],
4
+ "sourcesContent": ["import { Message } from '#core/query'\nimport { SYNTHETIC_ASSISTANT_MESSAGES } from './messages'\n\nexport function countTokens(messages: Message[]): number {\n let i = messages.length - 1\n while (i >= 0) {\n const message = messages[i]\n if (\n message?.type === 'assistant' &&\n 'usage' in message.message &&\n !(\n message.message.content[0]?.type === 'text' &&\n SYNTHETIC_ASSISTANT_MESSAGES.has(message.message.content[0].text)\n )\n ) {\n const { usage } = message.message\n const total =\n usage.input_tokens +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0) +\n usage.output_tokens\n if (total > 0) {\n return total\n }\n }\n i--\n }\n return 0\n}\n\nexport function countCachedTokens(messages: Message[]): number {\n let i = messages.length - 1\n while (i >= 0) {\n const message = messages[i]\n if (message?.type === 'assistant' && 'usage' in message.message) {\n const { usage } = message.message\n return (\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0)\n )\n }\n i--\n }\n return 0\n}\n", "import { readTextContent } from './file'\nimport { fileFreshnessService } from '#core/services/fileFreshness'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\n/**\n * File recovery configuration for auto-compact feature\n * These limits ensure recovered files don't overwhelm the compressed context\n */\nconst MAX_FILES_TO_RECOVER = 5\nconst MAX_TOKENS_PER_FILE = 10_000\nconst MAX_TOTAL_FILE_TOKENS = 50_000\n\n/**\n * Selects and reads recently accessed files for context recovery\n *\n * During auto-compact, this function preserves development context by:\n * - Selecting files based on recent access patterns\n * - Enforcing token budgets to prevent context bloat\n * - Truncating large files while preserving essential content\n *\n * @returns Array of file data with content, token counts, and truncation flags\n */\nexport async function selectAndReadFiles(): Promise<\n Array<{\n path: string\n content: string\n tokens: number\n truncated: boolean\n }>\n> {\n const importantFiles =\n fileFreshnessService.getImportantFiles(MAX_FILES_TO_RECOVER)\n const results = []\n let totalTokens = 0\n\n for (const fileInfo of importantFiles) {\n try {\n const { content } = readTextContent(fileInfo.path)\n const estimatedTokens = Math.ceil(content.length * 0.25)\n\n // Apply per-file token limit to prevent any single file from dominating context\n let finalContent = content\n let truncated = false\n\n if (estimatedTokens > MAX_TOKENS_PER_FILE) {\n const maxChars = Math.floor(MAX_TOKENS_PER_FILE / 0.25)\n finalContent = content.substring(0, maxChars)\n truncated = true\n }\n\n const finalTokens = Math.min(estimatedTokens, MAX_TOKENS_PER_FILE)\n\n // Enforce total token budget to maintain auto-compact effectiveness\n if (totalTokens + finalTokens > MAX_TOTAL_FILE_TOKENS) {\n break\n }\n\n totalTokens += finalTokens\n results.push({\n path: fileInfo.path,\n content: finalContent,\n tokens: finalTokens,\n truncated,\n })\n } catch (error) {\n // Skip files that cannot be read, don't let one failure stop the process\n logError(error)\n debugLogger.warn('FILE_RECOVERY_READ_FAILED', {\n path: fileInfo.path,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n return results\n}\n", "/**\n * Auto-compact triggers when token usage reaches this ratio of the context window.\n * Default: 90% of the context window.\n */\nexport const AUTO_COMPACT_THRESHOLD_RATIO = 0.9\n\nexport function calculateAutoCompactThresholds(\n tokenCount: number,\n contextLimit: number,\n ratio: number = AUTO_COMPACT_THRESHOLD_RATIO,\n): {\n isAboveAutoCompactThreshold: boolean\n percentUsed: number\n tokensRemaining: number\n contextLimit: number\n autoCompactThreshold: number\n ratio: number\n} {\n const safeContextLimit =\n Number.isFinite(contextLimit) && contextLimit > 0 ? contextLimit : 1\n const autoCompactThreshold = safeContextLimit * ratio\n\n return {\n isAboveAutoCompactThreshold: tokenCount >= autoCompactThreshold,\n percentUsed: Math.round((tokenCount / safeContextLimit) * 100),\n tokensRemaining: Math.max(0, autoCompactThreshold - tokenCount),\n contextLimit: safeContextLimit,\n autoCompactThreshold,\n ratio,\n }\n}\n", "import { Message } from '#core/query'\nimport { countTokens } from './tokens'\nimport { getMessagesSetter } from '#core/messages'\nimport { getContext } from '#core/context'\nimport { getCodeStyle } from '#core/utils/style'\nimport { resetFileFreshnessSession } from '#core/services/fileFreshness'\nimport {\n createUserMessage,\n normalizeMessagesForAPI,\n} from '#core/utils/messages'\nimport { queryLLM } from '#core/ai/llmLazy'\nimport { selectAndReadFiles } from './fileRecoveryCore'\nimport { addLineNumbers } from './file'\nimport { getModelManager } from './model'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\nimport {\n AUTO_COMPACT_THRESHOLD_RATIO,\n calculateAutoCompactThresholds,\n} from './autoCompactThreshold'\nimport {\n appendSessionJsonlFromMessage,\n appendSessionSummaryRecord,\n} from '#protocol/utils/kodeAgentSessionLog'\nimport { getCwd } from '#core/utils/state'\n\n/**\n * Retrieves the context length for the current main conversation model.\n */\nasync function getMainConversationContextLimit(): Promise<number> {\n try {\n const modelManager = getModelManager()\n const resolution = modelManager.resolveModelWithInfo('main')\n const modelProfile = resolution.success ? resolution.profile : null\n\n if (modelProfile?.contextLength) {\n return modelProfile.contextLength\n }\n\n // Fallback to a reasonable default\n return 200_000\n } catch (error) {\n return 200_000\n }\n}\n\nconst COMPRESSION_PROMPT = `Please provide a comprehensive summary of our conversation structured as follows:\n\n## Technical Context\nDevelopment environment, tools, frameworks, and configurations in use. Programming languages, libraries, and technical constraints. File structure, directory organization, and project architecture.\n\n## Project Overview \nMain project goals, features, and scope. Key components, modules, and their relationships. Data models, APIs, and integration patterns.\n\n## Code Changes\nFiles created, modified, or analyzed during our conversation. Specific code implementations, functions, and algorithms added. Configuration changes and structural modifications.\n\n## Debugging & Issues\nProblems encountered and their root causes. Solutions implemented and their effectiveness. Error messages, logs, and diagnostic information.\n\n## Current Status\nWhat we just completed successfully. Current state of the codebase and any ongoing work. Test results, validation steps, and verification performed.\n\n## Pending Tasks\nImmediate next steps and priorities. Planned features, improvements, and refactoring. Known issues, technical debt, and areas needing attention.\n\n## User Preferences\nCoding style, formatting, and organizational preferences. Communication patterns and feedback style. Tool choices and workflow preferences.\n\n## Key Decisions\nImportant technical decisions made and their rationale. Alternative approaches considered and why they were rejected. Trade-offs accepted and their implications.\n\nFocus on information essential for continuing the conversation effectively, including specific details about code, files, errors, and plans.`\n\n/**\n * Calculates context usage thresholds based on the main model's capabilities\n * Uses the main model context length since compression tasks require a capable model\n */\nasync function calculateThresholds(tokenCount: number) {\n const contextLimit = await getMainConversationContextLimit()\n return calculateAutoCompactThresholds(\n tokenCount,\n contextLimit,\n AUTO_COMPACT_THRESHOLD_RATIO,\n )\n}\n\n/**\n * Determines if auto-compact should trigger based on token usage\n * Uses the main model context limit since compression requires a capable model\n */\nasync function shouldAutoCompact(messages: Message[]): Promise<boolean> {\n if (messages.length < 3) return false\n\n const tokenCount = countTokens(messages)\n const { isAboveAutoCompactThreshold } = await calculateThresholds(tokenCount)\n\n return isAboveAutoCompactThreshold\n}\n\n/**\n * Main entry point for automatic context compression\n *\n * This function is called before each query to check if the conversation\n * has grown too large and needs compression. When triggered, it:\n * - Generates a structured summary of the conversation using the main model\n * - Recovers recently accessed files to maintain development context\n * - Resets conversation state while preserving essential information\n *\n * Uses the main model for compression tasks to ensure high-quality summaries\n *\n * @param messages Current conversation messages\n * @param toolUseContext Execution context with model and tool configuration\n * @returns Updated messages (compressed if needed) and compression status\n */\nexport async function checkAutoCompact(\n messages: Message[],\n toolUseContext: any,\n): Promise<{ messages: Message[]; wasCompacted: boolean }> {\n if (!(await shouldAutoCompact(messages))) {\n return { messages, wasCompacted: false }\n }\n\n try {\n const pendingUserMessage =\n messages.length > 0 && messages[messages.length - 1]?.type === 'user'\n ? (messages[messages.length - 1] ?? null)\n : null\n const history = pendingUserMessage ? messages.slice(0, -1) : messages\n\n const compactedHistory = await executeAutoCompact(history, toolUseContext)\n const compactedMessages = pendingUserMessage\n ? [...compactedHistory, pendingUserMessage]\n : compactedHistory\n\n // Replace the visible transcript in interactive mode so the user sees the\n // new compressed context (and we keep the pending prompt intact).\n getMessagesSetter()?.(compactedMessages)\n\n return {\n messages: compactedMessages,\n wasCompacted: true,\n }\n } catch (error) {\n // Graceful degradation: if auto-compact fails, continue with original messages\n // This ensures system remains functional even if compression encounters issues\n logError(error)\n debugLogger.warn('AUTO_COMPACT_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return { messages, wasCompacted: false }\n }\n}\n\n/**\n * Executes the conversation compression process using the main model\n *\n * This function generates a comprehensive summary using the main model\n * which is better suited for complex summarization tasks. It also\n * automatically recovers important files to maintain development context.\n */\nasync function executeAutoCompact(\n messages: Message[],\n toolUseContext: any,\n): Promise<Message[]> {\n const summaryRequest = createUserMessage(COMPRESSION_PROMPT)\n\n const tokenCount = countTokens(messages)\n const modelManager = getModelManager()\n const compactResolution = modelManager.resolveModelWithInfo('compact')\n const mainResolution = modelManager.resolveModelWithInfo('main')\n\n let compressionModelPointer: 'compact' | 'main' = 'compact'\n let compressionNotice: string | null = null\n\n if (!compactResolution.success || !compactResolution.profile) {\n compressionModelPointer = 'main'\n compressionNotice =\n compactResolution.error ||\n \"Compression model pointer 'compact' is not configured.\"\n } else {\n const compactBudget = Math.floor(\n compactResolution.profile.contextLength * 0.9,\n )\n if (compactBudget > 0 && tokenCount > compactBudget) {\n compressionModelPointer = 'main'\n compressionNotice = `Compression model '${compactResolution.profile.name}' does not fit current context (~${Math.round(tokenCount / 1000)}k tokens).`\n }\n }\n\n if (\n compressionModelPointer === 'main' &&\n (!mainResolution.success || !mainResolution.profile)\n ) {\n throw new Error(\n mainResolution.error ||\n \"Compression fallback failed: model pointer 'main' is not configured.\",\n )\n }\n\n const summaryResponse = await queryLLM(\n normalizeMessagesForAPI([...messages, summaryRequest]),\n [\n 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',\n ],\n 0,\n [],\n toolUseContext.abortController.signal,\n {\n safeMode: false,\n model: compressionModelPointer,\n prependCLISysprompt: true,\n },\n )\n\n const content = summaryResponse.message.content\n const summary =\n typeof content === 'string'\n ? content\n : content.length > 0 && content[0]?.type === 'text'\n ? content[0].text\n : null\n\n if (!summary) {\n throw new Error(\n 'Failed to generate conversation summary - response did not contain valid text content',\n )\n }\n\n summaryResponse.message.usage = {\n input_tokens: 0,\n output_tokens: summaryResponse.message.usage.output_tokens,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n }\n\n // Automatic file recovery: preserve recently accessed development files\n // This maintains coding context even after conversation compression\n const recoveredFiles = await selectAndReadFiles()\n\n const compactedMessages = [\n createUserMessage(\n compressionNotice\n ? `Context automatically compressed due to token limit. ${compressionNotice} Using '${compressionModelPointer}' for compression.`\n : `Context automatically compressed due to token limit. Using '${compressionModelPointer}' for compression.`,\n ),\n summaryResponse,\n ]\n\n // Append recovered files to maintain development workflow continuity\n // Files are prioritized by recency and importance, with strict token limits\n if (recoveredFiles.length > 0) {\n for (const file of recoveredFiles) {\n const contentWithLines = addLineNumbers({\n content: file.content,\n startLine: 1,\n })\n const recoveryMessage = createUserMessage(\n `**Recovered File: ${file.path}**\\n\\n\\`\\`\\`\\n${contentWithLines}\\n\\`\\`\\`\\n\\n` +\n `*Automatically recovered (${file.tokens} tokens)${file.truncated ? ' [truncated]' : ''}*`,\n )\n compactedMessages.push(recoveryMessage)\n }\n }\n\n // Persist the compaction boundary (best-effort) so resume screens can show a stable summary\n // and long sessions don't require loading the entire pre-compaction transcript.\n if (\n process.env.NODE_ENV !== 'test' &&\n toolUseContext?.options?.persistSession !== false\n ) {\n try {\n const cwd = getCwd()\n for (const msg of compactedMessages) {\n appendSessionJsonlFromMessage({ cwd, message: msg, toolUseContext })\n }\n appendSessionSummaryRecord({\n cwd,\n summary,\n leafUuid: summaryResponse.uuid,\n })\n } catch {\n // best-effort only\n }\n }\n\n // State cleanup to ensure fresh context after compression\n // Mirrors the cleanup sequence from manual /compact command\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetFileFreshnessSession()\n\n return compactedMessages\n}\n", "import type {\n TextBlock,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { AssistantMessage, BinaryFeedbackResult } from '#core/query'\nimport { MAIN_QUERY_TEMPERATURE } from '#core/ai/constants'\n\nimport { isEqual, zip } from 'lodash-es'\nimport { getGitState } from '#core/utils/git'\n\nexport type BinaryFeedbackChoice =\n | 'prefer-left'\n | 'prefer-right'\n | 'neither'\n | 'no-preference'\n\nexport type BinaryFeedbackChoose = (choice: BinaryFeedbackChoice) => void\n\ntype BinaryFeedbackConfig = {\n sampleFrequency: number\n}\n\nasync function getBinaryFeedbackConfig(): Promise<BinaryFeedbackConfig> {\n return { sampleFrequency: 0 }\n}\n\nfunction getMessageBlockSequence(m: AssistantMessage) {\n return m.message.content.map(cb => {\n if (cb.type === 'text') return 'text'\n if (cb.type === 'tool_use') return cb.name\n return cb.type // Handle other block types like 'thinking' or 'redacted_thinking'\n })\n}\n\n// Logging removed to minimize runtime surface area; behavior unaffected\n\nfunction textContentBlocksEqual(cb1: TextBlock, cb2: TextBlock): boolean {\n return cb1.text === cb2.text\n}\n\nfunction contentBlocksEqual(\n cb1: TextBlock | ToolUseBlock,\n cb2: TextBlock | ToolUseBlock,\n): boolean {\n if (cb1.type !== cb2.type) {\n return false\n }\n if (cb1.type === 'text') {\n return textContentBlocksEqual(cb1, cb2 as TextBlock)\n }\n cb2 = cb2 as ToolUseBlock\n return cb1.name === cb2.name && isEqual(cb1.input, cb2.input)\n}\n\nfunction allContentBlocksEqual(\n content1: (TextBlock | ToolUseBlock)[],\n content2: (TextBlock | ToolUseBlock)[],\n): boolean {\n if (content1.length !== content2.length) {\n return false\n }\n return zip(content1, content2).every(([cb1, cb2]) =>\n contentBlocksEqual(cb1!, cb2!),\n )\n}\n\nexport async function shouldUseBinaryFeedback(): Promise<boolean> {\n if (process.env.DISABLE_BINARY_FEEDBACK) {\n return false\n }\n if (process.env.FORCE_BINARY_FEEDBACK) {\n return true\n }\n if (process.env.USER_TYPE !== 'ant') {\n return false\n }\n if (process.env.NODE_ENV === 'test') {\n // Binary feedback breaks a couple tests related to checking for permission,\n // so we have to disable it in tests at the risk of hiding bugs\n return false\n }\n\n const config = await getBinaryFeedbackConfig()\n if (config.sampleFrequency === 0) {\n return false\n }\n if (Math.random() > config.sampleFrequency) {\n return false\n }\n return true\n}\n\nexport function messagePairValidForBinaryFeedback(\n m1: AssistantMessage,\n m2: AssistantMessage,\n): boolean {\n const logPass = () => {}\n const logFail = (_reason: string) => {}\n\n // Ignore thinking blocks, on the assumption that users don't find them very relevant\n // compared to other content types\n const nonThinkingBlocks1 = m1.message.content.filter(\n b => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n )\n const nonThinkingBlocks2 = m2.message.content.filter(\n b => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n )\n const hasToolUse =\n nonThinkingBlocks1.some(b => b.type === 'tool_use') ||\n nonThinkingBlocks2.some(b => b.type === 'tool_use')\n\n // If they're all text blocks, compare those\n if (!hasToolUse) {\n if (allContentBlocksEqual(nonThinkingBlocks1, nonThinkingBlocks2)) {\n logFail('contents_identical')\n return false\n }\n logPass()\n return true\n }\n\n // If there are tools, they're the most material difference between the messages.\n // Only show binary feedback if there's a tool use difference, ignoring text.\n if (\n allContentBlocksEqual(\n nonThinkingBlocks1.filter(b => b.type === 'tool_use'),\n nonThinkingBlocks2.filter(b => b.type === 'tool_use'),\n )\n ) {\n logFail('contents_identical')\n return false\n }\n\n logPass()\n return true\n}\n\nexport function getBinaryFeedbackResultForChoice(\n m1: AssistantMessage,\n m2: AssistantMessage,\n choice: BinaryFeedbackChoice,\n): BinaryFeedbackResult {\n switch (choice) {\n case 'prefer-left':\n return { message: m1, shouldSkipPermissionCheck: true }\n case 'prefer-right':\n return { message: m2, shouldSkipPermissionCheck: true }\n case 'no-preference':\n return {\n message: Math.random() < 0.5 ? m1 : m2,\n shouldSkipPermissionCheck: false,\n }\n case 'neither':\n return { message: null, shouldSkipPermissionCheck: false }\n }\n}\n// Keep a minimal exported stub to satisfy imports without side effects\nexport async function logBinaryFeedbackEvent(\n _m1: AssistantMessage,\n _m2: AssistantMessage,\n _choice: BinaryFeedbackChoice,\n): Promise<void> {}\n", "import {\n messagePairValidForBinaryFeedback,\n shouldUseBinaryFeedback,\n} from '#core/feedback/binaryFeedback'\n\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n ExtendedToolUseContext,\n} from './message-pipeline'\n\n// Returns a message if we got one, or `null` if the user cancelled.\nexport async function queryWithBinaryFeedback(\n toolUseContext: ExtendedToolUseContext,\n getAssistantResponse: () => Promise<AssistantMessage>,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): Promise<BinaryFeedbackResult> {\n if (\n process.env.USER_TYPE !== 'ant' ||\n !getBinaryFeedbackResponse ||\n !(await shouldUseBinaryFeedback())\n ) {\n const assistantMessage = await getAssistantResponse()\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n return { message: assistantMessage, shouldSkipPermissionCheck: false }\n }\n\n const [m1, m2] = await Promise.all([\n getAssistantResponse(),\n getAssistantResponse(),\n ])\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n if (m2.isApiErrorMessage) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n if (m1.isApiErrorMessage) {\n return { message: m2, shouldSkipPermissionCheck: false }\n }\n if (!messagePairValidForBinaryFeedback(m1, m2)) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n\n return await getBinaryFeedbackResponse(m1, m2)\n}\n", "export type ToolNameAliasResolution = {\n originalName: string\n resolvedName: string\n wasAliased: boolean\n}\n\ntype ToolNameAliasGroups = Record<string, readonly string[]>\n\nfunction buildToolNameAliasMap(\n groups: ToolNameAliasGroups,\n): Record<string, string> {\n const aliasToCanonical: Record<string, string> = {}\n\n for (const [canonicalName, aliases] of Object.entries(groups)) {\n for (const alias of aliases) {\n const existing = aliasToCanonical[alias]\n if (existing && existing !== canonicalName) {\n throw new Error(\n `Tool name alias conflict for \"${alias}\": \"${existing}\" vs \"${canonicalName}\"`,\n )\n }\n aliasToCanonical[alias] = canonicalName\n }\n }\n\n return aliasToCanonical\n}\n\nconst CANONICAL_TOOL_ALIASES: ToolNameAliasGroups = {\n // Some upstream clients unify AgentOutputTool and BashOutputTool into TaskOutput (with aliases).\n TaskOutput: [\n 'AgentOutputTool',\n 'BashOutputTool',\n 'BashOutput',\n 'TaskOutputTool',\n ],\n\n // Legacy client tool surfaces use lowerCamelCase for these MCP helpers.\n // Kode keeps canonical ids but accepts legacy names as aliases.\n ListMcpResourcesTool: ['listMcpResources'],\n ReadMcpResourceTool: ['readMcpResource'],\n}\n\nconst TOOL_NAME_ALIAS_MAP = buildToolNameAliasMap(CANONICAL_TOOL_ALIASES)\n\nexport function __buildToolNameAliasMapForTests(\n groups: ToolNameAliasGroups,\n): Record<string, string> {\n return buildToolNameAliasMap(groups)\n}\n\n/**\n * Resolve legacy tool aliases to their canonical tool names.\n *\n * Some upstream clients unify AgentOutputTool and BashOutputTool into TaskOutput.\n * (with aliases). Kode keeps backward compatibility by resolving the alias names.\n */\nexport function resolveToolNameAlias(name: string): ToolNameAliasResolution {\n const originalName = name\n const resolvedName = TOOL_NAME_ALIAS_MAP[name] ?? name\n\n return {\n originalName,\n resolvedName,\n wasAliased: resolvedName !== originalName,\n }\n}\n", "import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { getKodeBaseDir } from '#core/utils/env'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\nimport { sanitizeProjectNameForSessionStore } from '#protocol/utils/kodeAgentSessionLog'\n\nexport const PERSISTED_OUTPUT_OPEN_TAG = '<persisted-output>'\nexport const PERSISTED_OUTPUT_CLOSE_TAG = '</persisted-output>'\n\nexport const OLD_TOOL_RESULT_CONTENT_CLEARED_MARKER =\n '[Old tool result content cleared]'\n\nconst DEFAULT_MAX_RESULT_SIZE_CHARS = 400_000\nconst PREVIEW_CHARS = 2_000\n\ntype ToolResultContent = string | any[]\n\ntype PersistedToolResult = {\n filepath: string\n originalSize: number\n isJson: boolean\n preview: string\n hasMore: boolean\n}\n\nfunction toLocaleNumber(value: number): string {\n try {\n return value.toLocaleString()\n } catch {\n return String(value)\n }\n}\n\nfunction buildSessionToolResultsDir(cwd: string): string {\n const baseDir = getKodeBaseDir()\n const projectKey = sanitizeProjectNameForSessionStore(cwd)\n const sessionId = getKodeAgentSessionId()\n return join(baseDir, 'projects', projectKey, sessionId, 'tool-results')\n}\n\nfunction hasImageBlock(content: any[]): boolean {\n return content.some(\n block =>\n block &&\n typeof block === 'object' &&\n 'type' in block &&\n (block as any).type === 'image',\n )\n}\n\nfunction buildPreview(args: { content: string; maxChars: number }): {\n preview: string\n hasMore: boolean\n} {\n if (args.content.length <= args.maxChars) {\n return { preview: args.content, hasMore: false }\n }\n\n const slice = args.content.slice(0, args.maxChars)\n const lastNewline = slice.lastIndexOf('\\n')\n const cutAt = lastNewline > args.maxChars * 0.5 ? lastNewline : args.maxChars\n return { preview: args.content.slice(0, cutAt), hasMore: true }\n}\n\nfunction formatPersistedOutput(meta: PersistedToolResult): string {\n const originalSize = toLocaleNumber(meta.originalSize)\n const previewChars = toLocaleNumber(PREVIEW_CHARS)\n\n let out = `${PERSISTED_OUTPUT_OPEN_TAG}\\n`\n out += `Output too large (${originalSize}). Full output saved to: ${meta.filepath}\\n\\n`\n out += `Preview (first ${previewChars}):\\n`\n out += meta.preview\n out += meta.hasMore ? '\\n...\\n' : '\\n'\n out += PERSISTED_OUTPUT_CLOSE_TAG\n return out\n}\n\nfunction persistToolResultContent(args: {\n cwd: string\n toolUseId: string\n content: ToolResultContent\n}): PersistedToolResult | null {\n let isJson = false\n let serialized: string\n if (Array.isArray(args.content)) {\n isJson = true\n serialized = JSON.stringify(args.content, null, 2)\n } else {\n serialized = args.content\n }\n\n const dir = buildSessionToolResultsDir(args.cwd)\n try {\n mkdirSync(dir, { recursive: true })\n } catch {\n return null\n }\n\n const ext = isJson ? 'json' : 'txt'\n const filepath = join(dir, `${args.toolUseId}.${ext}`)\n\n try {\n if (!existsSync(filepath)) {\n writeFileSync(filepath, serialized, 'utf8')\n }\n } catch {\n return null\n }\n\n const { preview, hasMore } = buildPreview({\n content: serialized,\n maxChars: PREVIEW_CHARS,\n })\n\n return {\n filepath,\n originalSize: serialized.length,\n isJson,\n preview,\n hasMore,\n }\n}\n\nexport function maybePersistOversizedToolResult(args: {\n cwd: string\n toolUseId: string\n content: ToolResultContent\n maxResultSizeChars?: number\n}): ToolResultContent {\n const contentValue = args.content\n if (!contentValue) return contentValue\n\n if (Array.isArray(contentValue) && hasImageBlock(contentValue)) {\n return contentValue\n }\n\n const maxSize = args.maxResultSizeChars ?? DEFAULT_MAX_RESULT_SIZE_CHARS\n const estimatedSize =\n typeof contentValue === 'string'\n ? contentValue.length\n : JSON.stringify(contentValue).length\n if (estimatedSize <= maxSize) return contentValue\n\n const persisted = persistToolResultContent({\n cwd: args.cwd,\n toolUseId: args.toolUseId,\n content: contentValue,\n })\n if (!persisted) return contentValue\n\n return formatPersistedOutput(persisted)\n}\n", "import type { Tool } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\n\nexport function normalizeToolInput(\n tool: Tool,\n input: Record<string, unknown>,\n): Record<string, unknown> {\n if (tool.name === 'Bash') {\n const parsed = tool.inputSchema.parse(input) as {\n command: unknown\n timeout?: unknown\n description?: unknown\n run_in_background?: unknown\n dangerouslyDisableSandbox?: unknown\n } // already validated upstream, won't throw\n const command = parsed.command\n const timeout = parsed.timeout\n const description = parsed.description\n const run_in_background = parsed.run_in_background\n const dangerouslyDisableSandbox = parsed.dangerouslyDisableSandbox\n return {\n command: String(command)\n .replace(`cd ${getCwd()} && `, '')\n .replace(/\\\\\\\\;/g, '\\\\;'),\n ...(typeof timeout === 'number' ? { timeout } : {}),\n ...(typeof description === 'string' && description\n ? { description }\n : {}),\n ...(typeof run_in_background === 'boolean' && run_in_background\n ? { run_in_background }\n : {}),\n ...(typeof dangerouslyDisableSandbox === 'boolean' &&\n dangerouslyDisableSandbox\n ? { dangerouslyDisableSandbox }\n : {}),\n }\n }\n\n return input\n}\n\nexport function preprocessToolInput(\n tool: Tool,\n input: Record<string, unknown>,\n): Record<string, unknown> {\n return input\n}\n", "import type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { Tool, ToolUseContext } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\nimport { logError } from '#core/utils/log'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport {\n createAssistantMessage,\n createProgressMessage,\n createUserMessage,\n} from '#core/utils/messages'\nimport { maybePersistOversizedToolResult } from '#core/utils/toolResultPersistence'\nimport {\n getHookTranscriptPath,\n queueHookAdditionalContexts,\n queueHookSystemMessages,\n runPostToolUseHooks,\n runPreToolUseHooks,\n} from '#core/utils/kodeHooks'\n\nimport type { AssistantMessage, Message } from './types'\nimport { normalizeToolInput, preprocessToolInput } from './tool-input'\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\n\nfunction isPipelineMessage(value: unknown): value is Message {\n const record = asRecord(value)\n if (!record) return false\n return (\n record.type === 'user' ||\n record.type === 'assistant' ||\n record.type === 'progress'\n )\n}\n\nfunction toToolResultContent(value: unknown): ToolResultBlockParam['content'] {\n if (typeof value === 'string') return value\n if (Array.isArray(value)) return value as ToolResultBlockParam['content']\n return String(value)\n}\n\nexport async function* checkPermissionsAndCallTool(\n tool: Tool,\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n input: Record<string, unknown>,\n context: ToolUseContext,\n canUseTool: CanUseToolFn,\n assistantMessage: AssistantMessage,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const preprocessedInput = preprocessToolInput(tool, input)\n const isValidInput = tool.inputSchema.safeParse(preprocessedInput)\n if (!isValidInput.success) {\n let errorMessage = `InputValidationError: ${isValidInput.error.message}`\n\n if (tool.name === 'Read' && Object.keys(preprocessedInput).length === 0) {\n errorMessage =\n 'Error: The Read tool requires a \\'file_path\\' parameter to specify which file to read. Please provide the absolute path to the file you want to read. For example: {\"file_path\": \"/path/to/file.txt\"}'\n }\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: errorMessage,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n let normalizedInput = normalizeToolInput(tool, isValidInput.data)\n\n const isValidCall = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidCall?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidCall.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const hookOutcome = await runPreToolUseHooks({\n toolName: tool.name,\n toolInput: normalizedInput,\n toolUseId: toolUseID,\n permissionMode: context.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(context),\n safeMode: context.options?.safeMode ?? false,\n signal: context.abortController.signal,\n })\n if (hookOutcome.kind === 'block') {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: hookOutcome.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n if (hookOutcome.warnings.length > 0) {\n const warningText = hookOutcome.warnings.join('\\n')\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n createAssistantMessage(warningText),\n [],\n context.options?.tools ?? [],\n )\n }\n\n if (hookOutcome.systemMessages && hookOutcome.systemMessages.length > 0) {\n queueHookSystemMessages(context, hookOutcome.systemMessages)\n }\n if (\n hookOutcome.additionalContexts &&\n hookOutcome.additionalContexts.length > 0\n ) {\n queueHookAdditionalContexts(context, hookOutcome.additionalContexts)\n }\n\n if (hookOutcome.updatedInput) {\n const merged = { ...normalizedInput, ...hookOutcome.updatedInput }\n const parsed = tool.inputSchema.safeParse(merged)\n if (!parsed.success) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Hook updatedInput failed validation: ${parsed.error.message}`,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n normalizedInput = normalizeToolInput(tool, parsed.data)\n const isValidUpdate = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidUpdate?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidUpdate.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n }\n\n const hookPermissionDecision =\n hookOutcome.kind === 'allow' ? hookOutcome.permissionDecision : undefined\n\n const effectiveShouldSkipPermissionCheck =\n hookPermissionDecision === 'allow'\n ? true\n : hookPermissionDecision === 'ask'\n ? false\n : shouldSkipPermissionCheck\n\n const permissionContextForCall =\n hookPermissionDecision === 'ask' &&\n context.options?.toolPermissionContext &&\n context.options.toolPermissionContext.mode !== 'default'\n ? ({\n ...context,\n options: {\n ...context.options,\n toolPermissionContext: {\n ...context.options.toolPermissionContext,\n mode: 'default',\n },\n },\n } as const)\n : context\n\n const permissionResult = effectiveShouldSkipPermissionCheck\n ? ({ result: true } as const)\n : await canUseTool(\n tool,\n normalizedInput,\n { ...permissionContextForCall, toolUseId: toolUseID },\n assistantMessage,\n )\n\n if (permissionResult.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: permissionResult.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n try {\n const generator = tool.call(normalizedInput as never, {\n ...context,\n toolUseId: toolUseID,\n })\n\n for await (const result of generator) {\n switch (result.type) {\n case 'result': {\n const rawContent =\n result.resultForAssistant ??\n tool.renderResultForAssistant(result.data as never)\n const content = maybePersistOversizedToolResult({\n cwd: getCwd(),\n toolUseId: toolUseID,\n content: toToolResultContent(rawContent),\n maxResultSizeChars: tool.maxResultSizeChars,\n })\n const newMessages = Array.isArray(result.newMessages)\n ? result.newMessages.filter(isPipelineMessage)\n : []\n\n const postOutcome = await runPostToolUseHooks({\n toolName: tool.name,\n toolInput: normalizedInput,\n toolResult: result.data,\n toolUseId: toolUseID,\n permissionMode: context.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(context),\n safeMode: context.options?.safeMode ?? false,\n signal: context.abortController.signal,\n })\n\n if (postOutcome.systemMessages.length > 0) {\n queueHookSystemMessages(context, postOutcome.systemMessages)\n }\n if (postOutcome.additionalContexts.length > 0) {\n queueHookAdditionalContexts(context, postOutcome.additionalContexts)\n }\n if (postOutcome.warnings.length > 0) {\n const warningText = postOutcome.warnings.join('\\n')\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n createAssistantMessage(warningText),\n [],\n context.options?.tools ?? [],\n )\n }\n\n yield createUserMessage(\n [\n {\n type: 'tool_result',\n content,\n tool_use_id: toolUseID,\n },\n ],\n {\n data: result.data,\n resultForAssistant: content,\n ...(newMessages.length > 0 ? { newMessages } : {}),\n ...(result.contextModifier\n ? { contextModifier: result.contextModifier }\n : {}),\n },\n )\n\n for (const message of newMessages) {\n yield message\n }\n\n return\n }\n case 'progress':\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n result.content,\n result.normalizedMessages || [],\n result.tools || [],\n )\n break\n }\n }\n } catch (error) {\n const content = formatError(error)\n logError(error)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n }\n}\n\nfunction formatError(error: unknown): string {\n if (!(error instanceof Error)) return String(error)\n\n const parts = [error.message]\n if ('stderr' in error && typeof error.stderr === 'string') {\n parts.push(error.stderr)\n }\n if ('stdout' in error && typeof error.stdout === 'string') {\n parts.push(error.stdout)\n }\n\n const fullMessage = parts.filter(Boolean).join('\\n')\n if (fullMessage.length <= 10000) return fullMessage\n\n const halfLength = 5000\n const start = fullMessage.slice(0, halfLength)\n const end = fullMessage.slice(-halfLength)\n return `${start}\\n\\n... [${fullMessage.length - 10000} characters truncated] ...\\n\\n${end}`\n}\n", "import type { ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport { logError } from '#core/utils/log'\nimport { createUserMessage } from '#core/utils/messages'\nimport {\n debug as debugLogger,\n getCurrentRequest,\n logUserFriendly,\n} from '#core/utils/debugLogger'\nimport { resolveToolNameAlias } from '#core/utils/toolNameAliases'\nimport { setRequestStatus } from '#core/utils/requestStatus'\n\nimport type { AssistantMessage, ExtendedToolUseContext, Message } from './types'\nimport { checkPermissionsAndCallTool } from './tool-call'\n\nexport async function* runToolUse(\n toolUse: ToolUseBlock,\n siblingToolUseIDs: Set<string>,\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const currentRequest = getCurrentRequest()\n const aliasResolution = resolveToolNameAlias(toolUse.name)\n setRequestStatus({ kind: 'tool', detail: aliasResolution.resolvedName })\n\n debugLogger.flow('TOOL_USE_START', {\n toolName: toolUse.name,\n toolUseID: toolUse.id,\n inputSize: JSON.stringify(toolUse.input).length,\n siblingToolCount: siblingToolUseIDs.size,\n shouldSkipPermissionCheck: Boolean(shouldSkipPermissionCheck),\n requestId: currentRequest?.id,\n })\n\n logUserFriendly(\n 'TOOL_EXECUTION',\n {\n toolName: toolUse.name,\n action: 'Starting',\n target: toolUse.input ? Object.keys(toolUse.input).join(', ') : '',\n },\n currentRequest?.id,\n )\n\n const toolName = aliasResolution.resolvedName\n const tool = toolUseContext.options.tools.find(t => t.name === toolName)\n if (!tool) {\n debugLogger.error('TOOL_NOT_FOUND', {\n requestedTool: toolName,\n availableTools: toolUseContext.options.tools.map(t => t.name),\n toolUseID: toolUse.id,\n requestId: currentRequest?.id,\n })\n\n const notFoundMessage = aliasResolution.wasAliased\n ? `Error: No such tool available: ${aliasResolution.originalName} (resolved to ${toolName})`\n : `Error: No such tool available: ${toolName}`\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: notFoundMessage,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n return\n }\n\n const toolInput = toolUse.input as Record<string, unknown>\n\n debugLogger.flow('TOOL_VALIDATION_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n inputKeys: Object.keys(toolInput),\n requestId: currentRequest?.id,\n })\n\n try {\n for await (const message of checkPermissionsAndCallTool(\n tool,\n toolUse.id,\n siblingToolUseIDs,\n toolInput,\n toolUseContext as ToolUseContext,\n canUseTool,\n assistantMessage,\n shouldSkipPermissionCheck,\n )) {\n yield message\n }\n } catch (e) {\n logError(e)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Tool execution failed: ${e instanceof Error ? e.message : String(e)}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n }\n}\n", "import type { ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { Tool } from '#core/tooling/Tool'\nimport { resolveToolNameAlias } from '#core/utils/toolNameAliases'\nimport {\n createAssistantMessage,\n createProgressMessage,\n createUserMessage,\n REJECT_MESSAGE,\n} from '#core/utils/messages'\n\nimport type {\n AssistantMessage,\n ExtendedToolUseContext,\n Message,\n ProgressMessage,\n UserMessage,\n} from './types'\nimport { runToolUse } from './tool-use'\n\ntype ToolQueueEntry = {\n id: string\n block: ToolUseBlock\n assistantMessage: AssistantMessage\n status: 'queued' | 'executing' | 'completed' | 'yielded'\n isConcurrencySafe: boolean\n pendingProgress: ProgressMessage[]\n queuedProgressEmitted?: boolean\n results?: (UserMessage | AssistantMessage)[]\n contextModifiers?: Array<\n (ctx: ExtendedToolUseContext) => ExtendedToolUseContext\n >\n promise?: Promise<void>\n}\n\nfunction createSyntheticToolUseErrorMessage(\n toolUseId: string,\n reason: 'user_interrupted' | 'sibling_error',\n): UserMessage {\n if (reason === 'user_interrupted') {\n return createUserMessage([\n {\n type: 'tool_result',\n content: REJECT_MESSAGE,\n is_error: true,\n tool_use_id: toolUseId,\n },\n ])\n }\n\n return createUserMessage([\n {\n type: 'tool_result',\n content: '<tool_use_error>Sibling tool call errored</tool_use_error>',\n is_error: true,\n tool_use_id: toolUseId,\n },\n ])\n}\n\nexport class ToolUseQueue {\n private readonly toolDefinitions: Tool[]\n private readonly canUseTool: CanUseToolFn\n private readonly tools: ToolQueueEntry[] = []\n private toolUseContext: ExtendedToolUseContext\n private hasErrored = false\n private progressAvailableResolve: (() => void) | undefined\n private readonly siblingToolUseIDs: Set<string>\n private readonly shouldSkipPermissionCheck?: boolean\n\n constructor(options: {\n toolDefinitions: Tool[]\n canUseTool: CanUseToolFn\n toolUseContext: ExtendedToolUseContext\n siblingToolUseIDs: Set<string>\n shouldSkipPermissionCheck?: boolean\n }) {\n this.toolDefinitions = options.toolDefinitions\n this.canUseTool = options.canUseTool\n this.toolUseContext = options.toolUseContext\n this.siblingToolUseIDs = options.siblingToolUseIDs\n this.shouldSkipPermissionCheck = options.shouldSkipPermissionCheck\n }\n\n addTool(toolUse: ToolUseBlock, assistantMessage: AssistantMessage) {\n const resolvedToolName = resolveToolNameAlias(toolUse.name).resolvedName\n const toolDefinition = this.toolDefinitions.find(\n t => t.name === resolvedToolName,\n )\n const parsedInput = toolDefinition?.inputSchema.safeParse(toolUse.input)\n const isConcurrencySafe =\n toolDefinition && parsedInput?.success\n ? toolDefinition.isConcurrencySafe(parsedInput.data)\n : false\n\n this.tools.push({\n id: toolUse.id,\n block: toolUse,\n assistantMessage,\n status: 'queued',\n isConcurrencySafe,\n pendingProgress: [],\n queuedProgressEmitted: false,\n })\n\n void this.processQueue()\n }\n\n private canExecuteTool(isConcurrencySafe: boolean) {\n const executing = this.tools.filter(t => t.status === 'executing')\n return (\n executing.length === 0 ||\n (isConcurrencySafe && executing.every(t => t.isConcurrencySafe))\n )\n }\n\n private async processQueue() {\n for (const entry of this.tools) {\n if (entry.status !== 'queued') continue\n\n if (this.canExecuteTool(entry.isConcurrencySafe)) {\n await this.executeTool(entry)\n } else {\n // Compatibility: show a queued \"Waiting\u2026\" line for blocked tool calls.\n if (!entry.queuedProgressEmitted) {\n entry.queuedProgressEmitted = true\n entry.pendingProgress.push(\n createProgressMessage(\n entry.id,\n this.siblingToolUseIDs,\n createAssistantMessage('<tool-progress>Waiting\u2026</tool-progress>'),\n [],\n this.toolUseContext.options.tools,\n ),\n )\n if (this.progressAvailableResolve) {\n this.progressAvailableResolve()\n this.progressAvailableResolve = undefined\n }\n }\n\n if (!entry.isConcurrencySafe) {\n break\n }\n }\n }\n }\n\n private getAbortReason(): 'sibling_error' | 'user_interrupted' | null {\n if (this.hasErrored) return 'sibling_error'\n if (this.toolUseContext.abortController.signal.aborted)\n return 'user_interrupted'\n return null\n }\n\n private async executeTool(entry: ToolQueueEntry) {\n entry.status = 'executing'\n\n const results: (UserMessage | AssistantMessage)[] = []\n const contextModifiers: Array<\n (ctx: ExtendedToolUseContext) => ExtendedToolUseContext\n > = []\n\n const promise = (async () => {\n const abortReason = this.getAbortReason()\n if (abortReason) {\n results.push(createSyntheticToolUseErrorMessage(entry.id, abortReason))\n entry.results = results\n entry.contextModifiers = contextModifiers\n entry.status = 'completed'\n return\n }\n\n const generator = runToolUse(\n entry.block,\n this.siblingToolUseIDs,\n entry.assistantMessage,\n this.canUseTool,\n this.toolUseContext,\n this.shouldSkipPermissionCheck,\n )\n\n let toolErrored = false\n\n for await (const message of generator) {\n const reason = this.getAbortReason()\n if (reason && !toolErrored) {\n results.push(createSyntheticToolUseErrorMessage(entry.id, reason))\n break\n }\n\n if (\n message.type === 'user' &&\n Array.isArray(message.message.content) &&\n message.message.content.some(\n block => block.type === 'tool_result' && block.is_error === true,\n )\n ) {\n this.hasErrored = true\n toolErrored = true\n }\n\n if (message.type === 'progress') {\n entry.pendingProgress.push(message)\n if (this.progressAvailableResolve) {\n this.progressAvailableResolve()\n this.progressAvailableResolve = undefined\n }\n } else {\n results.push(message)\n\n if (\n message.type === 'user' &&\n message.toolUseResult?.contextModifier\n ) {\n contextModifiers.push(\n message.toolUseResult.contextModifier.modifyContext,\n )\n }\n }\n }\n\n entry.results = results\n entry.contextModifiers = contextModifiers\n entry.status = 'completed'\n\n if (!entry.isConcurrencySafe && contextModifiers.length > 0) {\n for (const modifyContext of contextModifiers) {\n this.toolUseContext = modifyContext(this.toolUseContext)\n }\n }\n })()\n\n entry.promise = promise\n promise.finally(() => {\n void this.processQueue()\n })\n }\n\n private *getCompletedResults(): Generator<Message, void> {\n let barrierExecuting = false\n for (const entry of this.tools) {\n while (entry.pendingProgress.length > 0) {\n yield entry.pendingProgress.shift()!\n }\n\n if (entry.status === 'yielded') continue\n\n // Compatibility: non-concurrency-safe tools act as an ordering barrier.\n // Still allow queued progress lines (e.g. \"Waiting\u2026\") to render for later tools.\n if (barrierExecuting) continue\n\n if (entry.status === 'completed' && entry.results) {\n entry.status = 'yielded'\n for (const message of entry.results) {\n yield message\n }\n } else if (entry.status === 'executing' && !entry.isConcurrencySafe) {\n barrierExecuting = true\n }\n }\n }\n\n private hasPendingProgress() {\n return this.tools.some(t => t.pendingProgress.length > 0)\n }\n\n private hasCompletedResults() {\n return this.tools.some(t => t.status === 'completed')\n }\n\n private hasExecutingTools() {\n return this.tools.some(t => t.status === 'executing')\n }\n\n private hasUnfinishedTools() {\n return this.tools.some(t => t.status !== 'yielded')\n }\n\n async *getRemainingResults(): AsyncGenerator<Message, void> {\n while (this.hasUnfinishedTools()) {\n await this.processQueue()\n\n for (const message of this.getCompletedResults()) {\n yield message\n }\n\n if (\n this.hasExecutingTools() &&\n !this.hasCompletedResults() &&\n !this.hasPendingProgress()\n ) {\n const promises = this.tools\n .filter(t => t.status === 'executing' && t.promise)\n .map(t => t.promise!)\n\n const progressPromise = new Promise<void>(resolve => {\n this.progressAvailableResolve = resolve\n })\n\n if (promises.length > 0) {\n await Promise.race([...promises, progressPromise])\n }\n }\n }\n\n for (const message of this.getCompletedResults()) {\n yield message\n }\n }\n\n getUpdatedContext() {\n return this.toolUseContext\n }\n}\n\nexport const __ToolUseQueueForTests = ToolUseQueue\n", "import type {\n Message as APIAssistantMessage,\n MessageParam,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { UUID } from '#core/types/common'\nimport type { Tool, ToolUseContext } from '#core/tooling/Tool'\nimport type { ToolPermissionContext } from '#core/types/toolPermissionContext'\nimport type { FullToolUseResult, NormalizedMessage } from '#core/utils/messages'\n\n// Extended ToolUseContext for query functions.\nexport interface ExtendedToolUseContext extends ToolUseContext {\n abortController: AbortController\n /**\n * Internal counter for the number of model calls (\"turns\") executed in the current run.\n * Used for non-interactive `--max-turns` enforcement and SDK `num_turns` reporting.\n */\n turnCount?: number\n options: {\n commands: any[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n mcpClients?: any[]\n verbose: boolean\n safeMode: boolean\n onStreamEvent?: (event: unknown) => void\n maxBudgetUsd?: number\n maxTurns?: number\n maxThinkingTokens: number\n thinkingMode?: 'auto' | 'enabled' | 'disabled'\n isKodingRequest?: boolean\n commandAllowedTools?: string[]\n lastUserPrompt?: string\n model?: string | import('#config').ModelPointerType\n toolPermissionContext?: ToolPermissionContext\n /**\n * When true, the current execution context cannot show interactive permission prompts.\n * Any permission decision that would normally prompt should be auto-denied.\n */\n shouldAvoidPermissionPrompts?: boolean\n /**\n * When false, suppress legacy-compatible session persistence (.jsonl under config/projects).\n */\n persistSession?: boolean\n /**\n * Optional callback to get custom system prompt additions (e.g., output style).\n * Only called for the main agent.\n */\n getCustomSystemPromptAdditions?: () => string[]\n requestToolUsePermission?: NonNullable<\n ToolUseContext['options']\n >['requestToolUsePermission']\n }\n readFileTimestamps: { [filename: string]: number }\n setToolJSX: (jsx: any) => void\n requestId?: string\n}\n\nexport type Response = { costUSD: number; response: string }\n\nexport type UserMessage = {\n message: MessageParam\n type: 'user'\n uuid: UUID\n toolUseResult?: FullToolUseResult\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n commandName?: string\n commandArgs?: string\n }\n}\n\nexport type AssistantMessage = {\n costUSD: number\n durationMs: number\n message: APIAssistantMessage\n type: 'assistant'\n uuid: UUID\n isApiErrorMessage?: boolean\n requestId?: string\n responseId?: string // For GPT-5 Responses API state management\n}\n\nexport type BinaryFeedbackResult =\n | { message: AssistantMessage | null; shouldSkipPermissionCheck: false }\n | { message: AssistantMessage; shouldSkipPermissionCheck: true }\n\nexport type ProgressMessage = {\n content: AssistantMessage\n normalizedMessages: NormalizedMessage[]\n siblingToolUseIDs: Set<string>\n tools: Tool[]\n toolUseID: string\n type: 'progress'\n uuid: UUID\n}\n\n// Each array item is either a single message or a message-and-response pair\nexport type Message = UserMessage | AssistantMessage | ProgressMessage\n\ntype ToolUseLikeBlock = ToolUseBlock & {\n type: 'tool_use' | 'server_tool_use' | 'mcp_tool_use'\n}\n\nexport function isToolUseLikeBlock(block: any): block is ToolUseLikeBlock {\n return (\n block &&\n typeof block === 'object' &&\n (block.type === 'tool_use' ||\n block.type === 'server_tool_use' ||\n block.type === 'mcp_tool_use')\n )\n}\n\nexport const __isToolUseLikeBlockForTests = isToolUseLikeBlock\n", "import type { AgentEvent } from '#protocol/agentEvent'\nimport { kodeMessageToSdkMessage } from '#protocol/utils/kodeAgentStreamJson'\n\nimport type { Message } from './index'\n\nexport function messageToAgentEvent(\n message: Message,\n sessionId: string,\n): AgentEvent | null {\n return kodeMessageToSdkMessage(\n message as Parameters<typeof kodeMessageToSdkMessage>[0],\n sessionId,\n )\n}\n\nexport async function* messagesToAgentEvents(args: {\n source: AsyncIterable<Message>\n sessionId: string\n}): AsyncGenerator<AgentEvent, void> {\n for await (const message of args.source) {\n const event = messageToAgentEvent(message, args.sessionId)\n if (event) yield event\n }\n}\n", "import type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport { queryLLM } from '#core/ai/llmLazy'\nimport { getTotalCost } from '#core/cost-tracker'\nimport { MaxBudgetUsdExceededError } from '#core/errors/maxBudgetUsd'\nimport { MaxTurnsExceededError } from '#core/errors/maxTurns'\nimport { formatSystemPromptWithContext } from '#core/services/systemPrompt'\nimport { emitReminderEvent } from '#core/services/systemReminder'\nimport { addNotification } from '#core/services/notificationCenter'\nimport { markPhase } from '#core/utils/debugLogger'\nimport {\n createAssistantMessage,\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n normalizeMessagesForAPI,\n} from '#core/utils/messages'\nimport {\n getPlanModeSystemPromptAdditions,\n hydratePlanSlugFromMessages,\n} from '#core/utils/planMode'\nimport { setRequestStatus } from '#core/utils/requestStatus'\nimport {\n BunShell,\n renderBackgroundShellStatusAttachment,\n renderBashNotification,\n} from '#runtime/shell'\nimport { getCwd } from '#core/utils/state'\nimport { checkAutoCompact } from '#core/utils/autoCompactCore'\nimport { asRecord } from '#core/hooks/types'\nimport {\n drainHookSystemPromptAdditions,\n getHookTranscriptPath,\n queueHookAdditionalContexts,\n queueHookSystemMessages,\n runStopHooks,\n runUserPromptSubmitHooks,\n updateHookTranscriptForMessages,\n} from '#core/utils/kodeHooks'\nimport { queryWithBinaryFeedback } from './query-executor'\nimport { ToolUseQueue } from './pipeline/tool-use-queue'\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n ExtendedToolUseContext,\n Message,\n UserMessage,\n} from './pipeline/types'\nimport { isToolUseLikeBlock } from './pipeline/types'\nexport type {\n AssistantMessage,\n BinaryFeedbackResult,\n ExtendedToolUseContext,\n Message,\n ProgressMessage,\n Response,\n UserMessage,\n} from './pipeline/types'\nexport { __isToolUseLikeBlockForTests } from './pipeline/types'\nexport { __ToolUseQueueForTests } from './pipeline/tool-use-queue'\nexport { runToolUse } from './pipeline/tool-use'\nexport { normalizeToolInput } from './pipeline/tool-input'\n\nexport async function* messagePipeline(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): AsyncGenerator<Message, void> {\n yield* messagePipelineCore(\n messages,\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n )\n}\nasync function* messagePipelineCore(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n hookState?: { stopHookActive?: boolean; stopHookAttempts?: number },\n): AsyncGenerator<Message, void> {\n setRequestStatus({ kind: 'thinking' })\n\n try {\n markPhase('QUERY_INIT')\n const stopHookActive = hookState?.stopHookActive === true\n const stopHookAttempts = hookState?.stopHookAttempts ?? 0\n\n const maxTurns = toolUseContext.options.maxTurns\n const normalizedMaxTurns =\n typeof maxTurns === 'number' && Number.isFinite(maxTurns) && maxTurns > 0\n ? Math.trunc(maxTurns)\n : undefined\n\n const turnsUsed = (() => {\n const raw = toolUseContext.turnCount\n if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 0) {\n return 0\n }\n return Math.trunc(raw)\n })()\n toolUseContext.turnCount = turnsUsed\n\n if (normalizedMaxTurns !== undefined && turnsUsed >= normalizedMaxTurns) {\n throw new MaxTurnsExceededError({\n maxTurns: normalizedMaxTurns,\n turnCount: turnsUsed,\n })\n }\n\n const maxBudgetUsd = toolUseContext.options.maxBudgetUsd\n if (\n typeof maxBudgetUsd === 'number' &&\n Number.isFinite(maxBudgetUsd) &&\n maxBudgetUsd > 0\n ) {\n const totalCostUsd = getTotalCost()\n if (totalCostUsd >= maxBudgetUsd) {\n throw new MaxBudgetUsdExceededError({ maxBudgetUsd, totalCostUsd })\n }\n }\n\n // Auto-compact check\n const { messages: processedMessages, wasCompacted } =\n await checkAutoCompact(messages, toolUseContext)\n if (wasCompacted) {\n messages = processedMessages\n }\n\n // Compatibility: task-notification + background_shell_status attachments.\n // We inject these as synthetic assistant messages so the model can decide when to call TaskOutput.\n if (toolUseContext.agentId === 'main') {\n const shell = BunShell.getInstance()\n\n const notifications = shell.flushBashNotifications()\n for (const notification of notifications) {\n const status = notification.status\n const exitCode = notification.exitCode\n const summarySuffix =\n status === 'completed'\n ? `completed${exitCode !== undefined ? ` (exit ${exitCode})` : ''}`\n : status === 'failed'\n ? `failed${exitCode !== undefined ? ` (exit ${exitCode})` : ''}`\n : 'was killed'\n\n addNotification({\n title: 'Background bash',\n message: `${notification.description} \u2014 ${summarySuffix}. Output: ${notification.outputFile}`,\n source: 'system',\n kind: status === 'failed' ? 'error' : 'info',\n })\n\n const text = renderBashNotification(notification)\n if (text.trim().length === 0) continue\n const msg = createAssistantMessage(text)\n messages = [...messages, msg]\n yield msg\n }\n\n const attachments = shell.flushBackgroundShellStatusAttachments()\n for (const attachment of attachments) {\n const text = renderBackgroundShellStatusAttachment(attachment)\n if (text.trim().length === 0) continue\n const msg = createAssistantMessage(\n `<tool-progress>${text}</tool-progress>`,\n )\n messages = [...messages, msg]\n yield msg\n }\n }\n\n // Hooks: keep an up-to-date transcript for hook scripts.\n updateHookTranscriptForMessages(toolUseContext, messages)\n\n // Hooks: UserPromptSubmit\n {\n const last = messages[messages.length - 1]\n let userPromptText: string | null = null\n if (last?.type === 'user') {\n const content = last.message.content\n if (typeof content === 'string') {\n userPromptText = content\n } else if (Array.isArray(content)) {\n const hasToolResult = content.some(\n (b: any) => b && typeof b === 'object' && b.type === 'tool_result',\n )\n if (!hasToolResult) {\n userPromptText = content\n .filter(\n (b: any) => b && typeof b === 'object' && b.type === 'text',\n )\n .map((b: any) => String(b.text ?? ''))\n .join('')\n }\n }\n }\n\n if (userPromptText !== null) {\n // Keep a stable copy of the user's last prompt (pre-reminder injection) so\n // tools can do intent-alignment checks against the actual user request.\n toolUseContext.options.lastUserPrompt = userPromptText\n\n const promptOutcome = await runUserPromptSubmitHooks({\n prompt: userPromptText,\n permissionMode: toolUseContext.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(toolUseContext),\n safeMode: toolUseContext.options?.safeMode ?? false,\n signal: toolUseContext.abortController.signal,\n })\n\n queueHookSystemMessages(toolUseContext, promptOutcome.systemMessages)\n queueHookAdditionalContexts(\n toolUseContext,\n promptOutcome.additionalContexts,\n )\n\n if (promptOutcome.decision === 'block') {\n yield createAssistantMessage(promptOutcome.message)\n return\n }\n }\n }\n\n markPhase('SYSTEM_PROMPT_BUILD')\n\n // Best-effort: recover plan slug from previous tool results (for resume flows).\n hydratePlanSlugFromMessages(messages, toolUseContext)\n\n const { systemPrompt: fullSystemPrompt, reminders } =\n formatSystemPromptWithContext(\n systemPrompt,\n context,\n toolUseContext.agentId,\n )\n\n // Default behavior: plan mode reminders are injected as system-level guidance.\n const planModeAdditions = getPlanModeSystemPromptAdditions(\n messages,\n toolUseContext,\n )\n if (planModeAdditions.length > 0) {\n fullSystemPrompt.push(...planModeAdditions)\n }\n\n const hookAdditions = drainHookSystemPromptAdditions(toolUseContext)\n if (hookAdditions.length > 0) {\n fullSystemPrompt.push(...hookAdditions)\n }\n\n // Inject custom system prompt additions (e.g., output style) for main agent\n if (toolUseContext.agentId === 'main') {\n const customAdditions =\n toolUseContext.options.getCustomSystemPromptAdditions?.() ?? []\n if (customAdditions.length > 0) {\n fullSystemPrompt.push(...customAdditions)\n }\n }\n\n // Emit session startup event\n emitReminderEvent('session:startup', {\n agentId: toolUseContext.agentId,\n messages: messages.length,\n timestamp: Date.now(),\n })\n\n // Inject reminders into the latest user message\n if (reminders && messages.length > 0) {\n // Find the last user message\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg?.type === 'user') {\n const lastUserMessage = msg as UserMessage\n messages[i] = {\n ...lastUserMessage,\n message: {\n ...lastUserMessage.message,\n content:\n typeof lastUserMessage.message.content === 'string'\n ? reminders + lastUserMessage.message.content\n : [\n ...(Array.isArray(lastUserMessage.message.content)\n ? lastUserMessage.message.content\n : []),\n { type: 'text', text: reminders },\n ],\n },\n }\n break\n }\n }\n }\n\n markPhase('LLM_PREPARATION')\n\n function getAssistantResponse() {\n return queryLLM(\n normalizeMessagesForAPI(messages),\n fullSystemPrompt,\n toolUseContext.options.maxThinkingTokens,\n toolUseContext.options.tools,\n toolUseContext.abortController.signal,\n {\n safeMode: toolUseContext.options.safeMode ?? false,\n model: toolUseContext.options.model || 'main',\n prependCLISysprompt: true,\n toolUseContext: toolUseContext,\n },\n )\n }\n\n const result = await queryWithBinaryFeedback(\n toolUseContext,\n getAssistantResponse,\n getBinaryFeedbackResponse,\n )\n\n // If request was cancelled, return immediately with interrupt message\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n if (result.message === null) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n const assistantMessage = result.message\n toolUseContext.turnCount = turnsUsed + 1\n const shouldSkipPermissionCheck = result.shouldSkipPermissionCheck\n\n // @see https://docs.anthropic.com/en/docs/build-with-claude/tool-use\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n const toolUseMessages =\n assistantMessage.message.content.filter(isToolUseLikeBlock)\n\n // If there's no more tool use, we're done\n if (!toolUseMessages.length) {\n const stopHookEvent =\n toolUseContext.agentId && toolUseContext.agentId !== 'main'\n ? ('SubagentStop' as const)\n : ('Stop' as const)\n const record = asRecord(assistantMessage.message)\n const stopReason =\n (record && typeof record.stop_reason === 'string'\n ? record.stop_reason\n : '') ||\n (record && typeof record.stopReason === 'string'\n ? record.stopReason\n : '') ||\n 'end_turn'\n\n const stopOutcome = await runStopHooks({\n hookEvent: stopHookEvent,\n reason: String(stopReason ?? ''),\n agentId: toolUseContext.agentId,\n permissionMode: toolUseContext.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(toolUseContext),\n safeMode: toolUseContext.options?.safeMode ?? false,\n stopHookActive,\n signal: toolUseContext.abortController.signal,\n })\n\n if (stopOutcome.systemMessages.length > 0) {\n queueHookSystemMessages(toolUseContext, stopOutcome.systemMessages)\n }\n if (stopOutcome.additionalContexts.length > 0) {\n queueHookAdditionalContexts(\n toolUseContext,\n stopOutcome.additionalContexts,\n )\n }\n\n if (stopOutcome.decision === 'block') {\n queueHookSystemMessages(toolUseContext, [stopOutcome.message])\n const MAX_STOP_HOOK_ATTEMPTS = 5\n if (stopHookAttempts < MAX_STOP_HOOK_ATTEMPTS) {\n yield* await messagePipelineCore(\n [...messages, assistantMessage],\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n {\n stopHookActive: true,\n stopHookAttempts: stopHookAttempts + 1,\n },\n )\n return\n }\n }\n\n yield assistantMessage\n return\n }\n\n yield assistantMessage\n const siblingToolUseIDs = new Set<string>(toolUseMessages.map(_ => _.id))\n const toolQueue = new ToolUseQueue({\n toolDefinitions: toolUseContext.options.tools,\n canUseTool,\n toolUseContext,\n siblingToolUseIDs,\n shouldSkipPermissionCheck,\n })\n\n for (const toolUse of toolUseMessages) {\n toolQueue.addTool(toolUse, assistantMessage)\n }\n\n const toolMessagesForNextTurn: (UserMessage | AssistantMessage)[] = []\n for await (const message of toolQueue.getRemainingResults()) {\n yield message\n if (message.type !== 'progress') {\n toolMessagesForNextTurn.push(message as UserMessage | AssistantMessage)\n }\n }\n\n toolUseContext = toolQueue.getUpdatedContext()\n\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE_FOR_TOOL_USE)\n return\n }\n\n // Recursive query\n\n try {\n yield* await messagePipelineCore(\n [...messages, assistantMessage, ...toolMessagesForNextTurn],\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n hookState,\n )\n } catch (error) {\n // Re-throw the error to maintain the original behavior\n throw error\n }\n } finally {\n setRequestStatus({ kind: 'idle' })\n }\n}\n\nexport * from '../query/agentEvents'\n", "import type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport { getCwd } from '#core/utils/state'\nimport { appendSessionJsonlFromMessage } from '#protocol/utils/kodeAgentSessionLog'\n\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n Message,\n ExtendedToolUseContext,\n} from './message-pipeline'\nimport { messagePipeline } from './message-pipeline'\n\n/**\n * Core query orchestrator.\n *\n * Streams `Message` objects (user/assistant/progress) for a single user turn, including tool use.\n */\nexport async function* query(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): AsyncGenerator<Message, void> {\n const shouldPersistSession =\n toolUseContext.options?.persistSession !== false &&\n process.env.NODE_ENV !== 'test'\n const cwd = shouldPersistSession ? getCwd() : null\n\n if (shouldPersistSession) {\n const last = messages[messages.length - 1]\n if (last?.type === 'user') {\n appendSessionJsonlFromMessage({\n cwd: cwd ?? getCwd(),\n message: last,\n toolUseContext,\n })\n }\n }\n\n for await (const message of messagePipeline(\n messages,\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n )) {\n if (shouldPersistSession) {\n appendSessionJsonlFromMessage({\n cwd: cwd ?? getCwd(),\n message,\n toolUseContext,\n })\n }\n yield message\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["asRecord"]
7
+ }