@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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../packages/tools/src/tools/filesystem/FileReadTool/FileReadTool.tsx", "../../packages/core/src/utils/anthropicProviderRuntime.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/prompt.ts", "../../packages/core/src/security/secureFile/service.ts", "../../packages/core/src/security/secureFile/operations.ts", "../../packages/core/src/security/secureFile/validators.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/highlight.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/constants.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/renderResultForAssistant.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/call.ts", "../../packages/runtime/src/file.ts", "../../packages/tools/src/tools/filesystem/FileReadTool/image.ts", "../../packages/core/src/utils/sha256.ts", "../../packages/tools/src/tools/filesystem/FileWriteTool/FileWriteTool.tsx", "../../packages/tools/src/tools/filesystem/FileWriteTool/prompt.ts", "../../packages/core/src/utils/diff.ts", "../../packages/core/src/utils/backgroundTasks.ts", "../../packages/core/src/utils/paste.ts", "../../packages/tools/src/tools/system/LspTool/format.ts", "../../packages/tools/src/tools/system/LspTool/lspConfig.ts", "../../packages/tools/src/tools/system/LspTool/call.ts", "../../packages/tools/src/tools/system/LspTool/lspManager.ts", "../../packages/tools/src/tools/system/LspTool/lspServer.ts", "../../packages/tools/src/tools/system/LspTool/lspJsonRpc.ts", "../../packages/core/src/utils/todoRenderModel.ts"],
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport { tmpdir } from 'node:os'\nimport * as path from 'node:path'\nimport { extname, relative } from 'node:path'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport type { Tool } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\nimport { findSimilarFile, normalizeFilePath } from '#core/utils/file'\nimport { getTheme } from '#core/utils/theme'\nimport { getKodeBaseDir } from '#core/utils/env'\nimport { LEGACY_ENV } from '#config/compat/legacyEnv'\nimport { DESCRIPTION, getPrompt } from './prompt'\nimport { hasReadPermission } from '#core/utils/permissions/filesystem'\nimport { secureFileService } from '#core/utils/secureFile'\nimport type { FileReadToolData } from './types'\nimport { highlightCode } from './highlight'\nimport {\n BINARY_EXTENSIONS,\n IMAGE_EXTENSIONS,\n MAX_LINES_TO_RENDER,\n MAX_OUTPUT_SIZE,\n formatFileSizeError,\n} from './constants'\nimport { renderResultForAssistant } from './renderResultForAssistant'\nimport { callFileReadTool } from './call'\n\nfunction toPosixPath(value: string): string {\n return value.replace(/\\\\/g, '/')\n}\n\nfunction isPosixPathWithinDir(posixPath: string, dirPosix: string): boolean {\n return posixPath === dirPosix || posixPath.startsWith(`${dirPosix}/`)\n}\n\nfunction getProjectKeyFromCwd(): string {\n return getCwd().replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nfunction getLegacyTmpBaseDir(): string {\n const override = process.env[LEGACY_ENV.codeTmpDir]\n if (typeof override === 'string') {\n const trimmed = override.trim()\n if (trimmed) return trimmed\n }\n if (process.platform === 'win32') {\n return process.env.TEMP?.trim() || tmpdir()\n }\n return '/tmp'\n}\n\nfunction extractTaskOutputIdFromPath(filePath: string): string | null {\n const posix = toPosixPath(normalizeFilePath(filePath))\n const projectKey = getProjectKeyFromCwd()\n\n const tasksDirs = [\n toPosixPath(path.join(getKodeBaseDir(), projectKey, 'tasks')),\n toPosixPath(\n path.join(getLegacyTmpBaseDir(), 'claude', projectKey, 'tasks'),\n ),\n ]\n\n for (const tasksDir of tasksDirs) {\n const prefix = `${tasksDir}/`\n if (!posix.startsWith(prefix)) continue\n if (!posix.endsWith('.output')) continue\n\n const id = posix.slice(prefix.length, -'.output'.length)\n if (id.length === 0 || id.length > 20) continue\n if (!/^[a-zA-Z0-9_-]+$/.test(id)) continue\n return id\n }\n\n return null\n}\n\nconst inputSchema = z.strictObject({\n file_path: z.string().describe('The absolute path to the file to read'),\n offset: z\n .number()\n .optional()\n .describe(\n 'The line number to start reading from. Only provide if the file is too large to read at once',\n ),\n limit: z\n .number()\n .optional()\n .describe(\n 'The number of lines to read. Only provide if the file is too large to read at once.',\n ),\n})\n\nexport const FileReadTool = {\n name: 'Read',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return getPrompt()\n },\n inputSchema,\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // FileRead is read-only, safe for concurrent execution\n },\n userFacingName(input?: z.infer<typeof inputSchema>) {\n const filePath = input?.file_path\n if (!filePath) return 'Read'\n\n const absolute = normalizeFilePath(filePath)\n const absolutePosix = toPosixPath(absolute)\n\n const planDirPosix = toPosixPath(path.join(getKodeBaseDir(), 'plans'))\n if (isPosixPathWithinDir(absolutePosix, planDirPosix)) {\n return 'Reading Plan'\n }\n\n if (extractTaskOutputIdFromPath(absolutePosix)) {\n return 'Read agent output'\n }\n\n return 'Read'\n },\n async isEnabled() {\n return true\n },\n needsPermissions({ file_path }) {\n return !hasReadPermission(file_path || getCwd())\n },\n renderToolUseMessage(input, { verbose }) {\n const { file_path, ...rest } = input\n const entries = [\n ['file_path', verbose ? file_path : relative(getCwd(), file_path)],\n ...Object.entries(rest),\n ]\n return entries\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n renderToolResultMessage(output) {\n const verbose = false // Set default value for verbose\n // NOTE: Directory trees are rendered non-recursively by default.\n switch (output.type) {\n case 'image':\n return (\n <Box justifyContent=\"space-between\" overflowX=\"hidden\" width=\"100%\">\n <Box flexDirection=\"row\" paddingLeft={2}>\n <Text color={getTheme().secondaryText}>(image content)</Text>\n </Box>\n </Box>\n )\n case 'text': {\n const { filePath, content, numLines } = output.file\n const contentWithFallback = content || '(empty file)'\n return (\n <Box justifyContent=\"space-between\" overflowX=\"hidden\" width=\"100%\">\n <Box flexDirection=\"row\" paddingLeft={2}>\n <Box flexDirection=\"column\">\n <Text>\n {highlightCode(\n verbose\n ? contentWithFallback\n : contentWithFallback\n .split('\\n')\n .slice(0, MAX_LINES_TO_RENDER)\n .filter(_ => _.trim() !== '')\n .join('\\n'),\n extname(filePath).slice(1),\n )}\n </Text>\n {!verbose && numLines > MAX_LINES_TO_RENDER && (\n <Text color={getTheme().secondaryText}>\n ... (+{numLines - MAX_LINES_TO_RENDER} lines)\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n )\n }\n }\n },\n async validateInput({ file_path, offset, limit }) {\n const fullFilePath = normalizeFilePath(file_path)\n\n // Use secure file service to check if file exists and get file info\n const fileCheck = secureFileService.safeGetFileInfo(fullFilePath)\n if (!fileCheck.success) {\n // Try to find a similar file with a different extension\n const similarFilename = findSimilarFile(fullFilePath)\n let message = 'File does not exist.'\n\n // If we found a similar file, suggest it to the assistant\n if (similarFilename) {\n message += ` Did you mean ${similarFilename}?`\n }\n\n return {\n result: false,\n message,\n }\n }\n\n const ext = path.extname(fullFilePath).toLowerCase()\n const fileSize = fileCheck.stats?.size ?? 0\n\n if (BINARY_EXTENSIONS.has(ext)) {\n return {\n result: false,\n message: `This tool cannot read binary files. The file appears to be a binary ${ext} file. Please use appropriate tools for binary file analysis.`,\n }\n }\n\n if (fileSize === 0 && IMAGE_EXTENSIONS.has(ext)) {\n return {\n result: false,\n message: 'Empty image files cannot be processed.',\n }\n }\n\n const isNotebook = ext === '.ipynb'\n const isPdf = ext === '.pdf'\n const isImage = IMAGE_EXTENSIONS.has(ext)\n if (!isImage && !isNotebook && !isPdf) {\n if (fileSize > MAX_OUTPUT_SIZE && !offset && !limit) {\n return {\n result: false,\n message: formatFileSizeError(fileSize),\n }\n }\n }\n\n return { result: true }\n },\n async *call({ file_path, offset = 1, limit = undefined }, ctx) {\n yield* callFileReadTool({ file_path, offset, limit }, ctx)\n },\n renderResultForAssistant,\n} satisfies Tool<typeof inputSchema, FileReadToolData>\n", "import { LEGACY_ENV } from '#core/compat/legacyEnv'\n\nconst TRUTHY_VALUES = new Set(['1', 'true', 'yes', 'on'])\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false\n return TRUTHY_VALUES.has(value.trim().toLowerCase())\n}\n\nexport type AnthropicProviderRuntime =\n | 'bedrock'\n | 'vertex'\n | 'foundry'\n | 'firstParty'\n\nexport function getAnthropicProviderRuntime(): AnthropicProviderRuntime {\n if (\n isTruthyEnv(\n process.env.KODE_USE_BEDROCK ??\n process.env[LEGACY_ENV.codeUseBedrock],\n )\n ) {\n return 'bedrock'\n }\n if (\n isTruthyEnv(\n process.env.KODE_USE_VERTEX ??\n process.env[LEGACY_ENV.codeUseVertex],\n )\n ) {\n return 'vertex'\n }\n if (\n isTruthyEnv(\n process.env.KODE_USE_FOUNDRY ??\n process.env[LEGACY_ENV.codeUseFoundry],\n )\n ) {\n return 'foundry'\n }\n return 'firstParty'\n}\n\nexport function isAnthropicFirstPartyRuntime(): boolean {\n return getAnthropicProviderRuntime() === 'firstParty'\n}\n", "import { isAnthropicFirstPartyRuntime } from '#core/utils/anthropicProviderRuntime'\n\nconst MAX_LINES_TO_READ = 2000\nconst MAX_LINE_LENGTH = 2000\n\nexport const DESCRIPTION = 'Read a file from the local filesystem.'\n\nexport function getPrompt(): string {\n const pdfLine = isAnthropicFirstPartyRuntime()\n ? '\\n- This tool can read PDF files (.pdf). PDFs are processed page by page, extracting both text and visual content for analysis.'\n : ''\n\n return `Reads a file from the local filesystem. You can access any file directly by using this tool.\nAssume this tool is able to read all files on the machine. If the User provides a path to a file assume that path is valid. It is okay to read a file that does not exist; an error will be returned.\n\nUsage:\n- The file_path parameter must be an absolute path, not a relative path\n- By default, it reads up to ${MAX_LINES_TO_READ} lines starting from the beginning of the file\n- You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters\n- Any lines longer than ${MAX_LINE_LENGTH} characters will be truncated\n- Results are returned using cat -n format, with line numbers starting at 1\n- This tool allows the assistant to read images (eg PNG, JPG, etc). When reading an image file the contents are presented visually since the assistant may be multimodal.${pdfLine}\n- This tool can read Jupyter notebooks (.ipynb files) and returns all cells with their outputs, combining code, text, and visualizations.\n- This tool can only read files, not directories. To read a directory, use an ls command via the Bash tool.\n- You can call multiple tools in a single response. It is always better to speculatively read multiple potentially useful files in parallel.\n- You will regularly be asked to read screenshots. If the user provides a path to a screenshot, ALWAYS use this tool to view the file at the path. This tool will work with all temporary file paths.\n- If you read a file that exists but has empty contents you will receive a system reminder warning in place of file contents.`\n}\n", "import { existsSync } from 'node:fs'\nimport { homedir } from 'node:os'\n\nimport {\n normalizePathInput,\n safeCreateDirectory,\n safeDeleteFile,\n safeExists,\n safeGetFileInfo,\n safeReadFile,\n safeWriteFile,\n} from './operations'\nimport type {\n SafeCreateDirectoryResult,\n SafeDeleteFileResult,\n SafeFileInfoResult,\n SafeReadFileOptions,\n SafeReadFileResult,\n SafeWriteFileOptions,\n SafeWriteFileResult,\n SecureFileConfig,\n ValidateFileNameResult,\n ValidateFilePathResult,\n} from './types'\nimport { validateFileName, validateFilePath } from './validators'\n\n/**\n * \u5B89\u5168\u6587\u4EF6\u7CFB\u7EDF\u64CD\u4F5C\u670D\u52A1\n * \u89E3\u51B3\u6587\u4EF6\u7CFB\u7EDF\u64CD\u4F5C\u4E2D\u7F3A\u5C11\u9002\u5F53\u9A8C\u8BC1\u548C\u9519\u8BEF\u5904\u7406\u7684\u95EE\u9898\n */\nexport class SecureFileService {\n private static instance: SecureFileService\n private allowedBasePaths: Set<string>\n private maxFileSize: number\n private allowedExtensions: Set<string>\n\n private constructor() {\n // \u5141\u8BB8\u7684\u57FA\u7840\u8DEF\u5F84\n this.allowedBasePaths = new Set([\n process.cwd(),\n homedir(),\n '/tmp',\n '/var/tmp',\n ])\n\n // \u9ED8\u8BA4\u6700\u5927\u6587\u4EF6\u5927\u5C0F (10MB)\n this.maxFileSize = 10 * 1024 * 1024\n\n // \u5141\u8BB8\u7684\u6587\u4EF6\u6269\u5C55\u540D\uFF08\u7A7A\u96C6\u5408\u8868\u793A\u4E0D\u9650\u5236\u6269\u5C55\u540D\uFF09\n this.allowedExtensions = new Set()\n }\n\n public static getInstance(): SecureFileService {\n if (!SecureFileService.instance) {\n SecureFileService.instance = new SecureFileService()\n }\n return SecureFileService.instance\n }\n\n private getConfig(): SecureFileConfig {\n return {\n allowedBasePaths: this.allowedBasePaths,\n maxFileSize: this.maxFileSize,\n allowedExtensions: this.allowedExtensions,\n }\n }\n\n /**\n * \u9A8C\u8BC1\u6587\u4EF6\u8DEF\u5F84\u662F\u5426\u5B89\u5168\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u9A8C\u8BC1\u7ED3\u679C\n */\n public validateFilePath(filePath: string): ValidateFilePathResult {\n return validateFilePath({\n allowedBasePaths: this.allowedBasePaths,\n filePath,\n })\n }\n\n /**\n * \u5B89\u5168\u5730\u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u6587\u4EF6\u662F\u5426\u5B58\u5728\n */\n public safeExists(filePath: string): boolean {\n return safeExists(this.getConfig(), filePath)\n }\n\n /**\n * \u5B89\u5168\u5730\u8BFB\u53D6\u6587\u4EF6\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @param options \u8BFB\u53D6\u9009\u9879\n * @returns \u8BFB\u53D6\u7ED3\u679C\n */\n public safeReadFile(\n filePath: string,\n options: SafeReadFileOptions = {},\n ): SafeReadFileResult {\n return safeReadFile(this.getConfig(), filePath, options)\n }\n\n /**\n * \u5B89\u5168\u5730\u5199\u5165\u6587\u4EF6\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @param content \u6587\u4EF6\u5185\u5BB9\n * @param options \u5199\u5165\u9009\u9879\n * @returns \u5199\u5165\u7ED3\u679C\n */\n public safeWriteFile(\n filePath: string,\n content: string | Buffer,\n options: SafeWriteFileOptions = {},\n ): SafeWriteFileResult {\n return safeWriteFile(this.getConfig(), filePath, content, options)\n }\n\n /**\n * \u5B89\u5168\u5730\u5220\u9664\u6587\u4EF6\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u5220\u9664\u7ED3\u679C\n */\n public safeDeleteFile(filePath: string): SafeDeleteFileResult {\n return safeDeleteFile(this.getConfig(), filePath)\n }\n\n /**\n * \u5B89\u5168\u5730\u521B\u5EFA\u76EE\u5F55\n * @param dirPath \u76EE\u5F55\u8DEF\u5F84\n * @param mode \u76EE\u5F55\u6743\u9650\n * @returns \u521B\u5EFA\u7ED3\u679C\n */\n public safeCreateDirectory(\n dirPath: string,\n mode: number = 0o755,\n ): SafeCreateDirectoryResult {\n return safeCreateDirectory(this.getConfig(), dirPath, mode)\n }\n\n /**\n * \u5B89\u5168\u5730\u83B7\u53D6\u6587\u4EF6\u4FE1\u606F\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u6587\u4EF6\u4FE1\u606F\n */\n public safeGetFileInfo(filePath: string): SafeFileInfoResult {\n return safeGetFileInfo(this.getConfig(), filePath)\n }\n\n /**\n * \u6DFB\u52A0\u5141\u8BB8\u7684\u57FA\u7840\u8DEF\u5F84\n * @param basePath \u57FA\u7840\u8DEF\u5F84\n */\n public addAllowedBasePath(basePath: string): {\n success: boolean\n error?: string\n } {\n try {\n const normalized = normalizePathInput(basePath)\n\n // \u9A8C\u8BC1\u8DEF\u5F84\u662F\u5426\u5B58\u5728\n if (!existsSync(normalized)) {\n return { success: false, error: 'Base path does not exist' }\n }\n\n this.allowedBasePaths.add(normalized)\n return { success: true }\n } catch (error) {\n return {\n success: false,\n error: `Failed to add base path: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n }\n\n /**\n * \u8BBE\u7F6E\u6700\u5927\u6587\u4EF6\u5927\u5C0F\n * @param maxSize \u6700\u5927\u6587\u4EF6\u5927\u5C0F\uFF08\u5B57\u8282\uFF09\n */\n public setMaxFileSize(maxSize: number): void {\n this.maxFileSize = maxSize\n }\n\n /**\n * \u6DFB\u52A0\u5141\u8BB8\u7684\u6587\u4EF6\u6269\u5C55\u540D\n * @param extensions \u6587\u4EF6\u6269\u5C55\u540D\u6570\u7EC4\n */\n public addAllowedExtensions(extensions: string[]): void {\n extensions.forEach(ext => {\n if (!ext.startsWith('.')) {\n ext = '.' + ext\n }\n this.allowedExtensions.add(ext.toLowerCase())\n })\n }\n\n /**\n * \u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5728\u5141\u8BB8\u7684\u57FA\u7840\u8DEF\u5F84\u4E2D\n * @param filePath \u6587\u4EF6\u8DEF\u5F84\n * @returns \u662F\u5426\u5141\u8BB8\n */\n public isPathAllowed(filePath: string): boolean {\n const validation = this.validateFilePath(filePath)\n return validation.isValid\n }\n\n /**\n * \u9A8C\u8BC1\u6587\u4EF6\u540D\u5B89\u5168\u6027\n * @param filename \u6587\u4EF6\u540D\n * @returns \u9A8C\u8BC1\u7ED3\u679C\n */\n public validateFileName(filename: string): ValidateFileNameResult {\n return validateFileName(filename)\n }\n}\n\n// \u5BFC\u51FA\u5355\u4F8B\u5B9E\u4F8B\nexport const secureFileService = SecureFileService.getInstance()\n", "import {\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n statSync,\n unlinkSync,\n renameSync,\n} from 'node:fs'\nimport { dirname, extname, normalize, resolve } from 'node:path'\n\nimport type {\n SafeCreateDirectoryResult,\n SafeDeleteFileResult,\n SafeFileInfoResult,\n SafeReadFileOptions,\n SafeReadFileResult,\n SafeWriteFileOptions,\n SafeWriteFileResult,\n SecureFileConfig,\n} from './types'\nimport { validateFilePath } from './validators'\n\nexport function safeExists(\n config: SecureFileConfig,\n filePath: string,\n): boolean {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return false\n }\n\n try {\n return existsSync(validation.normalizedPath)\n } catch {\n return false\n }\n}\n\nexport function safeReadFile(\n config: SecureFileConfig,\n filePath: string,\n options: SafeReadFileOptions = {},\n): SafeReadFileResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n // \u68C0\u67E5\u6587\u4EF6\u6269\u5C55\u540D\uFF08\u5982\u679C\u542F\u7528\uFF09\n if (options.checkFileExtension !== false) {\n const ext = extname(normalizedPath).toLowerCase()\n const allowedExts =\n options.allowedExtensions ?? Array.from(config.allowedExtensions)\n\n if (allowedExts.length > 0 && !allowedExts.includes(ext)) {\n return {\n success: false,\n error: `File extension '${ext}' is not allowed`,\n }\n }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\n if (!existsSync(normalizedPath)) {\n return { success: false, error: 'File does not exist' }\n }\n\n // \u83B7\u53D6\u6587\u4EF6\u4FE1\u606F\n const stats = statSync(normalizedPath)\n const maxSize = options.maxFileSize ?? config.maxFileSize\n\n // \u68C0\u67E5\u6587\u4EF6\u5927\u5C0F\n if (stats.size > maxSize) {\n return {\n success: false,\n error: `File too large (${stats.size} bytes, max ${maxSize} bytes)`,\n }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u7C7B\u578B\n if (!stats.isFile()) {\n return { success: false, error: 'Path is not a file' }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u6743\u9650\n if ((stats.mode & parseInt('400', 8)) === 0) {\n // \u68C0\u67E5\u8BFB\u6743\u9650\n return { success: false, error: 'No read permission' }\n }\n\n // \u8BFB\u53D6\u6587\u4EF6\u5185\u5BB9\n const content = readFileSync(normalizedPath, {\n encoding: options.encoding ?? 'utf8',\n })\n\n return {\n success: true,\n content,\n stats: {\n size: stats.size,\n mtime: stats.mtime,\n atime: stats.atime,\n mode: stats.mode,\n },\n }\n } catch (error) {\n return {\n success: false,\n error: `Failed to read file: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function safeWriteFile(\n config: SecureFileConfig,\n filePath: string,\n content: string | Buffer,\n options: SafeWriteFileOptions = {},\n): SafeWriteFileResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n // \u68C0\u67E5\u6587\u4EF6\u6269\u5C55\u540D\uFF08\u5982\u679C\u542F\u7528\uFF09\n if (options.checkFileExtension !== false) {\n const ext = extname(normalizedPath).toLowerCase()\n const allowedExts =\n options.allowedExtensions ?? Array.from(config.allowedExtensions)\n\n if (allowedExts.length > 0 && !allowedExts.includes(ext)) {\n return {\n success: false,\n error: `File extension '${ext}' is not allowed`,\n }\n }\n }\n\n // \u68C0\u67E5\u5185\u5BB9\u5927\u5C0F\n const encoding = options.encoding ?? 'utf8'\n const contentSize =\n typeof content === 'string'\n ? Buffer.byteLength(content, encoding)\n : content.length\n\n const maxSize = options.maxSize ?? config.maxFileSize\n if (contentSize > maxSize) {\n return {\n success: false,\n error: `Content too large (${contentSize} bytes, max ${maxSize} bytes)`,\n }\n }\n\n // \u521B\u5EFA\u76EE\u5F55\uFF08\u5982\u679C\u9700\u8981\uFF09\n if (options.createDirectory) {\n const dir = dirname(normalizedPath)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o755 })\n }\n }\n\n // \u539F\u5B50\u5199\u5165\uFF08\u5982\u679C\u542F\u7528\uFF09\n if (options.atomic) {\n const tempPath = `${normalizedPath}.tmp.${Date.now()}`\n\n try {\n // \u5199\u5165\u4E34\u65F6\u6587\u4EF6\n writeFileSync(tempPath, content, {\n encoding,\n mode: options.mode ?? 0o644,\n })\n\n // \u91CD\u547D\u540D\u4E3A\u76EE\u6807\u6587\u4EF6\n renameSync(tempPath, normalizedPath)\n } catch (renameError) {\n // \u6E05\u7406\u4E34\u65F6\u6587\u4EF6\n try {\n if (existsSync(tempPath)) {\n unlinkSync(tempPath)\n }\n } catch {\n // \u5FFD\u7565\u6E05\u7406\u9519\u8BEF\n }\n throw renameError\n }\n } else {\n // \u76F4\u63A5\u5199\u5165\n writeFileSync(normalizedPath, content, {\n encoding,\n mode: options.mode ?? 0o644,\n })\n }\n\n return { success: true }\n } catch (error) {\n return {\n success: false,\n error: `Failed to write file: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function safeDeleteFile(\n config: SecureFileConfig,\n filePath: string,\n): SafeDeleteFileResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n // \u68C0\u67E5\u6587\u4EF6\u662F\u5426\u5B58\u5728\n if (!existsSync(normalizedPath)) {\n return { success: false, error: 'File does not exist' }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u7C7B\u578B\n const stats = statSync(normalizedPath)\n if (!stats.isFile()) {\n return { success: false, error: 'Path is not a file' }\n }\n\n // \u68C0\u67E5\u5199\u6743\u9650\n if ((stats.mode & parseInt('200', 8)) === 0) {\n return { success: false, error: 'No write permission' }\n }\n\n // \u5B89\u5168\u5220\u9664\n unlinkSync(normalizedPath)\n return { success: true }\n } catch (error) {\n return {\n success: false,\n error: `Failed to delete file: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function safeCreateDirectory(\n config: SecureFileConfig,\n dirPath: string,\n mode: number = 0o755,\n): SafeCreateDirectoryResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath: dirPath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n if (existsSync(normalizedPath)) {\n const stats = statSync(normalizedPath)\n if (!stats.isDirectory()) {\n return {\n success: false,\n error: 'Path already exists and is not a directory',\n }\n }\n return { success: true }\n }\n\n mkdirSync(normalizedPath, { recursive: true, mode })\n return { success: true }\n } catch (error) {\n return {\n success: false,\n error: `Failed to create directory: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function safeGetFileInfo(\n config: SecureFileConfig,\n filePath: string,\n): SafeFileInfoResult {\n const validation = validateFilePath({\n allowedBasePaths: config.allowedBasePaths,\n filePath,\n })\n if (!validation.isValid) {\n return { success: false, error: validation.error }\n }\n\n try {\n const normalizedPath = validation.normalizedPath\n\n if (!existsSync(normalizedPath)) {\n return { success: false, error: 'File does not exist' }\n }\n\n const stats = statSync(normalizedPath)\n\n return {\n success: true,\n stats: {\n size: stats.size,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n mode: stats.mode,\n atime: stats.atime,\n mtime: stats.mtime,\n ctime: stats.ctime,\n },\n }\n } catch (error) {\n return {\n success: false,\n error: `Failed to get file info: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function normalizePathInput(path: string): string {\n return normalize(resolve(path))\n}\n", "import { normalize, resolve, relative, isAbsolute, parse } from 'node:path'\nimport type { ValidateFileNameResult, ValidateFilePathResult } from './types'\n\nexport function validateFilePath(args: {\n allowedBasePaths: ReadonlySet<string>\n filePath: string\n}): ValidateFilePathResult {\n const { filePath, allowedBasePaths } = args\n\n try {\n // \u89C4\u8303\u5316\u8DEF\u5F84\n const normalizedPath = normalize(filePath)\n\n // \u68C0\u67E5\u8DEF\u5F84\u957F\u5EA6\n if (normalizedPath.length > 4096) {\n return {\n isValid: false,\n normalizedPath,\n error: 'Path too long (max 4096 characters)',\n }\n }\n\n // \u68C0\u67E5\u662F\u5426\u5305\u542B\u8DEF\u5F84\u904D\u5386\u5B57\u7B26\n if (normalizedPath.includes('..') || normalizedPath.includes('~')) {\n return {\n isValid: false,\n normalizedPath,\n error: 'Path contains traversal characters',\n }\n }\n\n // \u68C0\u67E5\u662F\u5426\u5305\u542B\u53EF\u7591\u7684\u5B57\u7B26\u5E8F\u5217\n const suspiciousPatterns = [\n /\\.\\./, // \u7236\u76EE\u5F55\n /~/, // \u7528\u6237\u76EE\u5F55\n /\\$\\{/, // \u73AF\u5883\u53D8\u91CF\n /`/, // \u547D\u4EE4\u6267\u884C\n /\\|/, // \u7BA1\u9053\u7B26\n /;/, // \u547D\u4EE4\u5206\u9694\u7B26\n /&/, // \u540E\u53F0\u6267\u884C\n />/, // \u8F93\u51FA\u91CD\u5B9A\u5411\n /</, // \u8F93\u5165\u91CD\u5B9A\u5411\n ]\n\n for (const pattern of suspiciousPatterns) {\n if (pattern.test(normalizedPath)) {\n return {\n isValid: false,\n normalizedPath,\n error: `Path contains suspicious pattern: ${pattern}`,\n }\n }\n }\n\n // \u89E3\u6790\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\n const absolutePath = resolve(normalizedPath)\n\n // \u68C0\u67E5\u662F\u5426\u5728\u5141\u8BB8\u7684\u57FA\u7840\u8DEF\u5F84\u4E2D\n const isInAllowedPath = Array.from(allowedBasePaths).some(basePath => {\n const base = resolve(basePath)\n const rel = relative(base, absolutePath)\n if (!rel || rel === '') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n return true\n })\n\n if (!isInAllowedPath) {\n return {\n isValid: false,\n normalizedPath,\n error: 'Path is outside allowed directories',\n }\n }\n\n return { isValid: true, normalizedPath: absolutePath }\n } catch (error) {\n return {\n isValid: false,\n normalizedPath: filePath,\n error: `Path validation failed: ${error instanceof Error ? error.message : String(error)}`,\n }\n }\n}\n\nexport function validateFileName(filename: string): ValidateFileNameResult {\n // \u68C0\u67E5\u6587\u4EF6\u540D\u957F\u5EA6\n if (filename.length === 0) {\n return { isValid: false, error: 'Filename cannot be empty' }\n }\n\n if (filename.length > 255) {\n return { isValid: false, error: 'Filename too long (max 255 characters)' }\n }\n\n // \u68C0\u67E5\u6587\u4EF6\u540D\u5B57\u7B26\n const invalidChars = /[<>:\"/\\\\|?*\\x00-\\x1F]/\n if (invalidChars.test(filename)) {\n return { isValid: false, error: 'Filename contains invalid characters' }\n }\n\n // \u68C0\u67E5\u4FDD\u7559\u6587\u4EF6\u540D\n const reservedNames = [\n 'CON',\n 'PRN',\n 'AUX',\n 'NUL',\n 'COM1',\n 'COM2',\n 'COM3',\n 'COM4',\n 'COM5',\n 'COM6',\n 'COM7',\n 'COM8',\n 'COM9',\n 'LPT1',\n 'LPT2',\n 'LPT3',\n 'LPT4',\n 'LPT5',\n 'LPT6',\n 'LPT7',\n 'LPT8',\n 'LPT9',\n ]\n\n const baseName = filename.split('.')[0].toUpperCase()\n if (reservedNames.includes(baseName)) {\n return { isValid: false, error: 'Filename is reserved' }\n }\n\n // \u68C0\u67E5\u662F\u5426\u4EE5\u70B9\u5F00\u5934\u6216\u7ED3\u5C3E\n if (filename.startsWith('.') || filename.endsWith('.')) {\n return {\n isValid: false,\n error: 'Filename cannot start or end with a dot',\n }\n }\n\n // \u68C0\u67E5\u662F\u5426\u4EE5\u7A7A\u683C\u5F00\u5934\u6216\u7ED3\u5C3E\n if (filename.startsWith(' ') || filename.endsWith(' ')) {\n return {\n isValid: false,\n error: 'Filename cannot start or end with spaces',\n }\n }\n\n return { isValid: true }\n}\n", "import { highlight, supportsLanguage } from 'cli-highlight'\n\nexport function highlightCode(code: string, language: string): string {\n try {\n if (supportsLanguage(language)) {\n return highlight(code, { language })\n }\n return highlight(code, { language: 'markdown' })\n } catch {\n return highlight(code, { language: 'markdown' })\n }\n}\n", "export const MAX_LINES_TO_RENDER = 5\nexport const MAX_LINE_LENGTH = 2000\nexport const MAX_OUTPUT_SIZE = 0.25 * 1024 * 1024 // 0.25MB in bytes (post-truncation safeguard)\n\n// Common image extensions (compatibility)\nexport const IMAGE_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.webp',\n])\n\n// Maximum dimensions for images\nexport const MAX_WIDTH = 2000\nexport const MAX_HEIGHT = 2000\nexport const MAX_IMAGE_SIZE = 3.75 * 1024 * 1024 // 5MB in bytes, with base64 encoding\n\n// Binary extensions this tool refuses to read as text (compatibility with legacy clients)\nexport const BINARY_EXTENSIONS = new Set([\n '.mp3',\n '.wav',\n '.flac',\n '.ogg',\n '.aac',\n '.m4a',\n '.wma',\n '.aiff',\n '.opus',\n '.mp4',\n '.avi',\n '.mov',\n '.wmv',\n '.flv',\n '.mkv',\n '.webm',\n '.m4v',\n '.mpeg',\n '.mpg',\n '.zip',\n '.rar',\n '.tar',\n '.gz',\n '.bz2',\n '.7z',\n '.xz',\n '.z',\n '.tgz',\n '.iso',\n '.exe',\n '.dll',\n '.so',\n '.dylib',\n '.app',\n '.msi',\n '.deb',\n '.rpm',\n '.bin',\n '.dat',\n '.db',\n '.sqlite',\n '.sqlite3',\n '.mdb',\n '.idx',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.odt',\n '.ods',\n '.odp',\n '.ttf',\n '.otf',\n '.woff',\n '.woff2',\n '.eot',\n '.psd',\n '.ai',\n '.eps',\n '.sketch',\n '.fig',\n '.xd',\n '.blend',\n '.obj',\n '.3ds',\n '.max',\n '.class',\n '.jar',\n '.war',\n '.pyc',\n '.pyo',\n '.rlib',\n '.swf',\n '.fla',\n])\n\nexport const formatFileSizeError = (sizeInBytes: number) =>\n `File content (${Math.round(sizeInBytes / 1024)}KB) exceeds maximum allowed size (${Math.round(MAX_OUTPUT_SIZE / 1024)}KB). Please use offset and limit parameters to read specific portions of the file, or use the Grep tool to search for specific content.`\n", "import type { DocumentBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { addLineNumbers } from '#core/utils/file'\nimport type { FileReadToolData } from './types'\n\nexport function renderResultForAssistant(data: FileReadToolData) {\n switch (data.type) {\n case 'image':\n return [\n {\n type: 'image',\n source: {\n type: 'base64',\n data: data.file.base64,\n media_type: data.file.type,\n },\n },\n ]\n case 'pdf':\n return [\n {\n type: 'document',\n source: {\n type: 'base64',\n media_type: 'application/pdf',\n data: data.file.base64,\n },\n } satisfies DocumentBlockParam,\n ]\n case 'notebook':\n return JSON.stringify(data.file, null, 2)\n case 'text':\n return addLineNumbers({\n content: data.file.content,\n startLine: data.file.startLine,\n })\n }\n}\n", "import { statSync } from 'fs'\nimport * as path from 'node:path'\nimport { normalizeFilePath, readTextContent } from '#core/utils/file'\nimport { emitReminderEvent } from '#core/services/systemReminder'\nimport {\n generateFileModificationReminder,\n recordFileRead,\n} from '#core/services/fileFreshness'\nimport { secureFileService } from '#core/utils/secureFile'\nimport { readFileBun } from '#runtime/file'\nimport { readImage } from './image'\nimport {\n IMAGE_EXTENSIONS,\n MAX_LINE_LENGTH,\n MAX_OUTPUT_SIZE,\n formatFileSizeError,\n} from './constants'\nimport type { FileReadToolData } from './types'\nimport { renderResultForAssistant } from './renderResultForAssistant'\nimport { createAssistantMessage } from '#core/utils/messages'\nimport { sha256File } from '#core/utils/sha256'\n\nexport async function* callFileReadTool(\n args: { file_path: string; offset?: number; limit?: number },\n ctx: {\n readFileTimestamps: Record<string, number>\n readFileHashes?: Record<string, string>\n },\n): AsyncGenerator<\n {\n type: 'result'\n data: FileReadToolData\n resultForAssistant: string | any[]\n newMessages?: unknown[]\n },\n void,\n void\n> {\n const { file_path, offset = 1, limit } = args\n const ext = path.extname(file_path).toLowerCase()\n const fullFilePath = normalizeFilePath(file_path)\n\n recordFileRead(fullFilePath)\n\n emitReminderEvent('file:read', {\n filePath: fullFilePath,\n extension: ext,\n timestamp: Date.now(),\n })\n\n ctx.readFileTimestamps[fullFilePath] = statSync(fullFilePath).mtimeMs\n\n const modificationReminder = generateFileModificationReminder(fullFilePath)\n if (modificationReminder) {\n emitReminderEvent('file:modified', {\n filePath: fullFilePath,\n reminder: modificationReminder,\n timestamp: Date.now(),\n })\n }\n\n if (IMAGE_EXTENSIONS.has(ext)) {\n const data = await readImage(fullFilePath, ext)\n const dimensions = data.file.dimensions\n let dimensionNote: string | null = null\n if (\n dimensions?.originalWidth &&\n dimensions?.originalHeight &&\n dimensions?.displayWidth &&\n dimensions?.displayHeight &&\n dimensions.displayWidth > 0 &&\n dimensions.displayHeight > 0\n ) {\n if (\n dimensions.originalWidth !== dimensions.displayWidth ||\n dimensions.originalHeight !== dimensions.displayHeight\n ) {\n const scale = dimensions.originalWidth / dimensions.displayWidth\n dimensionNote = `[Image: original ${dimensions.originalWidth}x${dimensions.originalHeight}, displayed at ${dimensions.displayWidth}x${dimensions.displayHeight}. Multiply coordinates by ${scale.toFixed(2)} to map to original image.]`\n }\n }\n\n yield {\n type: 'result',\n data,\n resultForAssistant: renderResultForAssistant(data),\n ...(dimensionNote\n ? { newMessages: [createAssistantMessage(dimensionNote)] }\n : {}),\n }\n return\n }\n\n if (ext === '.ipynb') {\n const notebookRaw = await readFileBun(fullFilePath)\n const notebook = notebookRaw ? JSON.parse(notebookRaw) : null\n const data: FileReadToolData = {\n type: 'notebook',\n file: {\n filePath: file_path,\n cells: Array.isArray(notebook?.cells) ? notebook.cells : [],\n },\n }\n yield {\n type: 'result',\n data,\n resultForAssistant: renderResultForAssistant(data),\n }\n return\n }\n\n if (ext === '.pdf') {\n const fileReadResult = secureFileService.safeReadFile(fullFilePath, {\n encoding: 'buffer' as BufferEncoding,\n maxFileSize: 32 * 1024 * 1024,\n checkFileExtension: false,\n })\n if (!fileReadResult.success) {\n throw new Error(fileReadResult.error || 'Failed to read PDF file')\n }\n const buffer = fileReadResult.content as Buffer\n const data: FileReadToolData = {\n type: 'pdf',\n file: {\n filePath: file_path,\n base64: buffer.toString('base64'),\n originalSize: fileReadResult.stats?.size ?? buffer.byteLength,\n },\n }\n yield {\n type: 'result',\n data,\n resultForAssistant: renderResultForAssistant(data),\n }\n return\n }\n\n const startLine = offset\n const zeroBasedOffset = startLine === 0 ? 0 : startLine - 1\n const { content, lineCount, totalLines } = readTextContent(\n fullFilePath,\n zeroBasedOffset,\n limit,\n )\n\n const truncatedLines = content\n .split(/\\r?\\n/)\n .map(line =>\n line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) : line,\n )\n .join('\\n')\n\n if (Buffer.byteLength(truncatedLines, 'utf8') > MAX_OUTPUT_SIZE) {\n throw new Error(\n formatFileSizeError(Buffer.byteLength(truncatedLines, 'utf8')),\n )\n }\n\n const data: FileReadToolData = {\n type: 'text',\n file: {\n filePath: file_path,\n content: truncatedLines,\n numLines: lineCount,\n startLine,\n totalLines,\n },\n }\n\n try {\n ;(ctx.readFileHashes ??= {})[fullFilePath] = await sha256File(fullFilePath)\n } catch {\n // Hashing is best-effort; freshness guards will fall back to mtime-only behavior.\n }\n\n yield {\n type: 'result',\n data,\n resultForAssistant: renderResultForAssistant(data),\n }\n}\n", "/**\n * BunFile - File operations using Node.js fs APIs.\n *\n * Note: The function names remain for compatibility, even though the\n * implementation is now Node-compatible (no Bun runtime required).\n */\n\nimport { existsSync } from 'node:fs'\nimport { appendFile, open, readFile, stat, writeFile } from 'node:fs/promises'\n\nfunction logError(message: string): void {\n if (process.env.NODE_ENV === 'test') {\n console.error(message)\n }\n}\n\n/**\n * Read file. Returns null if the file doesn't exist or can't be read.\n */\nexport async function readFileBun(filepath: string): Promise<string | null> {\n try {\n if (!existsSync(filepath)) {\n return null\n }\n return await readFile(filepath, 'utf8')\n } catch (error) {\n logError(`readFileBun error for ${filepath}: ${error}`)\n return null\n }\n}\n\n/**\n * Write file. Returns whether the write succeeded.\n */\nexport async function writeFileBun(\n filepath: string,\n content: string | Buffer,\n): Promise<boolean> {\n try {\n await writeFile(filepath, content)\n return true\n } catch (error) {\n logError(`writeFileBun error for ${filepath}: ${error}`)\n return false\n }\n}\n\n/**\n * Check if file exists.\n */\nexport function fileExistsBun(filepath: string): boolean {\n return existsSync(filepath)\n}\n\n/**\n * Get file size. Returns 0 if file doesn't exist.\n */\nexport async function getFileSizeBun(filepath: string): Promise<number> {\n try {\n if (!existsSync(filepath)) {\n return 0\n }\n const s = await stat(filepath)\n return s.size\n } catch (error) {\n logError(`getFileSizeBun error for ${filepath}: ${error}`)\n return 0\n }\n}\n\n/**\n * Read file asynchronously with optional limit\n * Useful for large files where we only need partial content\n */\nexport async function readPartialFileBun(\n filepath: string,\n maxBytes?: number,\n): Promise<string | null> {\n try {\n if (!existsSync(filepath)) {\n return null\n }\n if (!maxBytes) {\n return await readFile(filepath, 'utf8')\n }\n\n const handle = await open(filepath, 'r')\n try {\n const buffer = Buffer.alloc(maxBytes)\n const { bytesRead } = await handle.read(buffer, 0, maxBytes, 0)\n return buffer.subarray(0, bytesRead).toString('utf8')\n } finally {\n await handle.close()\n }\n } catch (error) {\n logError(`readPartialFileBun error for ${filepath}: ${error}`)\n return null\n }\n}\n\n/**\n * Append to a file.\n */\nexport async function appendFileBun(\n filepath: string,\n content: string,\n): Promise<boolean> {\n try {\n await appendFile(filepath, content, 'utf8')\n return true\n } catch (error) {\n logError(`appendFileBun error for ${filepath}: ${error}`)\n return false\n }\n}\n", "import { statSync } from 'fs'\nimport { logError } from '#core/utils/log'\nimport { secureFileService } from '#core/utils/secureFile'\nimport type { AnthropicImageMediaType } from './types'\nimport { MAX_HEIGHT, MAX_IMAGE_SIZE, MAX_WIDTH } from './constants'\n\ntype ImageToolResult = {\n type: 'image'\n file: {\n base64: string\n type: AnthropicImageMediaType\n originalSize: number\n dimensions?: {\n originalWidth?: number\n originalHeight?: number\n displayWidth?: number\n displayHeight?: number\n }\n }\n}\n\nfunction createImageResponse(\n buffer: Buffer,\n ext: string,\n originalSize: number,\n dimensions?: {\n originalWidth?: number\n originalHeight?: number\n displayWidth?: number\n displayHeight?: number\n },\n): ImageToolResult {\n const normalized: AnthropicImageMediaType =\n ext === '.jpg' || ext === '.jpeg'\n ? 'image/jpeg'\n : ext === '.png'\n ? 'image/png'\n : ext === '.gif'\n ? 'image/gif'\n : 'image/webp'\n return {\n type: 'image',\n file: {\n base64: buffer.toString('base64'),\n type: normalized,\n originalSize,\n ...(dimensions ? { dimensions } : {}),\n },\n }\n}\n\nexport async function readImage(\n filePath: string,\n ext: string,\n): Promise<ImageToolResult> {\n try {\n const stats = statSync(filePath)\n const sharp = (await import('sharp')).default\n\n // Use secure file service to read the file\n const fileReadResult = secureFileService.safeReadFile(filePath, {\n encoding: 'buffer' as BufferEncoding,\n maxFileSize: MAX_IMAGE_SIZE,\n })\n\n if (!fileReadResult.success) {\n throw new Error(`Failed to read image file: ${fileReadResult.error}`)\n }\n\n const image = sharp(fileReadResult.content as Buffer)\n const metadata = await image.metadata()\n\n const originalWidth = metadata.width\n const originalHeight = metadata.height\n const hasDimensions = Boolean(originalWidth && originalHeight)\n\n if (!hasDimensions) {\n if (stats.size > MAX_IMAGE_SIZE) {\n const compressedBuffer = await image.jpeg({ quality: 80 }).toBuffer()\n return createImageResponse(compressedBuffer, '.jpeg', stats.size)\n }\n }\n\n // Calculate dimensions while maintaining aspect ratio\n let width = originalWidth || 0\n let height = originalHeight || 0\n\n // Check if the original file just works\n if (\n stats.size <= MAX_IMAGE_SIZE &&\n width <= MAX_WIDTH &&\n height <= MAX_HEIGHT\n ) {\n // Use secure file service to read the file\n const fileReadResult = secureFileService.safeReadFile(filePath, {\n encoding: 'buffer' as BufferEncoding,\n maxFileSize: MAX_IMAGE_SIZE,\n })\n\n if (!fileReadResult.success) {\n throw new Error(`Failed to read image file: ${fileReadResult.error}`)\n }\n\n const dimensions = hasDimensions\n ? {\n originalWidth,\n originalHeight,\n displayWidth: width,\n displayHeight: height,\n }\n : undefined\n\n return createImageResponse(\n fileReadResult.content as Buffer,\n ext,\n stats.size,\n dimensions,\n )\n }\n\n if (width > MAX_WIDTH) {\n height = Math.round((height * MAX_WIDTH) / width)\n width = MAX_WIDTH\n }\n\n if (height > MAX_HEIGHT) {\n width = Math.round((width * MAX_HEIGHT) / height)\n height = MAX_HEIGHT\n }\n\n // Resize image and convert to buffer\n const resizedImageBuffer = await image\n .resize(width, height, {\n fit: 'inside',\n withoutEnlargement: true,\n })\n .toBuffer()\n\n // If still too large after resize, compress quality\n const dimensions = hasDimensions\n ? {\n originalWidth,\n originalHeight,\n displayWidth: width,\n displayHeight: height,\n }\n : undefined\n\n if (resizedImageBuffer.length > MAX_IMAGE_SIZE) {\n const compressedBuffer = await image.jpeg({ quality: 80 }).toBuffer()\n return createImageResponse(\n compressedBuffer,\n '.jpeg',\n stats.size,\n dimensions,\n )\n }\n\n return createImageResponse(resizedImageBuffer, ext, stats.size, dimensions)\n } catch (e) {\n logError(e)\n // If any error occurs during processing, return original image\n const stats = statSync(filePath)\n const fileReadResult = secureFileService.safeReadFile(filePath, {\n encoding: 'buffer' as BufferEncoding,\n maxFileSize: MAX_IMAGE_SIZE,\n })\n\n if (!fileReadResult.success) {\n throw new Error(`Failed to read image file: ${fileReadResult.error}`)\n }\n\n return createImageResponse(\n fileReadResult.content as Buffer,\n ext,\n stats.size,\n )\n }\n}\n", "import { createHash } from 'node:crypto'\nimport { createReadStream } from 'node:fs'\n\nexport function sha256Text(text: string): string {\n return createHash('sha256').update(text, 'utf8').digest('hex')\n}\n\nexport async function sha256File(filePath: string): Promise<string> {\n const hash = createHash('sha256')\n await new Promise<void>((resolve, reject) => {\n const stream = createReadStream(filePath)\n stream.on('data', chunk => hash.update(chunk))\n stream.once('error', reject)\n stream.once('end', () => resolve())\n })\n return hash.digest('hex')\n}\n", "import type { Hunk } from 'diff'\nimport { mkdirSync, statSync } from 'fs'\nimport { dirname, isAbsolute, relative, resolve } from 'path'\nimport { z } from 'zod'\nimport type { Tool } from '#core/tooling/Tool'\nimport {\n addLineNumbers,\n detectFileEncoding,\n detectLineEndings,\n detectRepoLineEndings,\n writeTextContent,\n} from '#core/utils/file'\nimport { readFileBun, fileExistsBun } from '#runtime/file'\nimport { getCwd } from '#core/utils/state'\nimport { PROMPT } from './prompt'\nimport { hasWritePermission } from '#core/utils/permissions/filesystem'\nimport { getPatch } from '#core/utils/diff'\nimport { emitReminderEvent } from '#core/services/systemReminder'\nimport { recordFileEdit } from '#core/services/fileFreshness'\nimport { sha256File } from '#core/utils/sha256'\n\nconst MAX_LINES_TO_RENDER_FOR_ASSISTANT = 16000\nconst TRUNCATED_MESSAGE =\n '<response clipped><NOTE>To save on context only part of this file has been shown to you. You should retry this tool after you have searched inside the file with Grep in order to find the line numbers of what you are looking for.</NOTE>'\n\nconst inputSchema = z.strictObject({\n file_path: z\n .string()\n .describe(\n 'The absolute path to the file to write (must be absolute, not relative)',\n ),\n content: z.string().describe('The content to write to the file'),\n})\n\nexport const FileWriteTool = {\n name: 'Write',\n async description() {\n return 'Write a file to the local filesystem.'\n },\n userFacingName: () => 'Write',\n async prompt() {\n return PROMPT\n },\n inputSchema,\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false // FileWriteTool modifies state/files, not safe for concurrent execution\n },\n needsPermissions({ file_path }) {\n return !hasWritePermission(file_path)\n },\n renderToolUseMessage(input, { verbose }) {\n const fullPath = isAbsolute(input.file_path)\n ? input.file_path\n : resolve(getCwd(), input.file_path)\n return `file_path: ${fullPath}`\n },\n async validateInput({ file_path }, { readFileTimestamps, readFileHashes }) {\n const fullFilePath = isAbsolute(file_path)\n ? file_path\n : resolve(getCwd(), file_path)\n\n if (fullFilePath.endsWith('.ipynb')) {\n return {\n result: false,\n message:\n 'This tool cannot write Jupyter notebooks. Use the NotebookEdit tool instead.',\n }\n }\n if (!fileExistsBun(fullFilePath)) {\n return { result: true }\n }\n\n const readTimestamp = readFileTimestamps[fullFilePath]\n if (!readTimestamp) {\n return {\n result: false,\n message:\n 'File has not been read yet. Read it first before writing to it.',\n }\n }\n\n // Check if file exists and get its last modified time\n const stats = statSync(fullFilePath)\n const lastWriteTime = stats.mtimeMs\n if (lastWriteTime > readTimestamp) {\n const lastReadHash = readFileHashes?.[fullFilePath]\n if (!lastReadHash) {\n return {\n result: false,\n message:\n 'File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.',\n }\n }\n\n let currentHash: string\n try {\n currentHash = await sha256File(fullFilePath)\n } catch {\n return {\n result: false,\n message:\n 'File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.',\n }\n }\n if (currentHash !== lastReadHash) {\n return {\n result: false,\n message:\n 'File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.',\n }\n }\n\n // The file was touched (mtime changed) without content changes. Treat as fresh.\n readFileTimestamps[fullFilePath] = lastWriteTime\n }\n\n return { result: true }\n },\n async *call({ file_path, content }, { readFileTimestamps, readFileHashes }) {\n const fullFilePath = isAbsolute(file_path)\n ? file_path\n : resolve(getCwd(), file_path)\n const dir = dirname(fullFilePath)\n const oldFileExists = fileExistsBun(fullFilePath)\n\n if (oldFileExists) {\n const readTimestamp = readFileTimestamps[fullFilePath]\n const lastWriteTime = statSync(fullFilePath).mtimeMs\n if (!readTimestamp) {\n throw new Error(\n 'File has been unexpectedly modified. Read it again before attempting to write it.',\n )\n }\n if (lastWriteTime > readTimestamp) {\n const lastReadHash = readFileHashes?.[fullFilePath]\n if (lastReadHash) {\n let currentHash: string\n try {\n currentHash = await sha256File(fullFilePath)\n } catch {\n throw new Error(\n 'File has been unexpectedly modified. Read it again before attempting to write it.',\n )\n }\n if (currentHash === lastReadHash) {\n readFileTimestamps[fullFilePath] = lastWriteTime\n } else {\n throw new Error(\n 'File has been unexpectedly modified. Read it again before attempting to write it.',\n )\n }\n } else {\n throw new Error(\n 'File has been unexpectedly modified. Read it again before attempting to write it.',\n )\n }\n }\n }\n\n const enc = oldFileExists ? detectFileEncoding(fullFilePath) : 'utf-8'\n const oldContent = oldFileExists ? await readFileBun(fullFilePath) : null\n\n const endings = oldFileExists\n ? detectLineEndings(fullFilePath)\n : await detectRepoLineEndings(getCwd())\n\n mkdirSync(dir, { recursive: true })\n writeTextContent(fullFilePath, content, enc, endings!)\n\n // Record Agent edit operation for file freshness tracking\n recordFileEdit(fullFilePath, content)\n\n // Update read timestamp, to invalidate stale writes\n readFileTimestamps[fullFilePath] = statSync(fullFilePath).mtimeMs\n\n if (readFileHashes) {\n try {\n readFileHashes[fullFilePath] = await sha256File(fullFilePath)\n } catch {\n // ignore\n }\n }\n\n // Emit file edited event for system reminders\n emitReminderEvent('file:edited', {\n filePath: fullFilePath,\n content,\n oldContent: oldContent || '',\n timestamp: Date.now(),\n operation: oldFileExists ? 'update' : 'create',\n })\n\n if (oldContent) {\n const patch = getPatch({\n filePath: file_path,\n fileContents: oldContent,\n oldStr: oldContent,\n newStr: content,\n })\n\n const data = {\n type: 'update' as const,\n filePath: file_path,\n content,\n structuredPatch: patch,\n originalFile: oldContent,\n }\n yield {\n type: 'result',\n data,\n resultForAssistant: this.renderResultForAssistant(data),\n }\n return\n }\n\n const data = {\n type: 'create' as const,\n filePath: file_path,\n content,\n structuredPatch: [],\n originalFile: null,\n }\n yield {\n type: 'result',\n data,\n resultForAssistant: this.renderResultForAssistant(data),\n }\n },\n renderResultForAssistant({ filePath, content, type }) {\n switch (type) {\n case 'create':\n return `File created successfully at: ${filePath}`\n case 'update':\n return `The file ${filePath} has been updated. Here's the result of running \\`cat -n\\` on a snippet of the edited file:\n${addLineNumbers({\n content:\n content.split(/\\r?\\n/).length > MAX_LINES_TO_RENDER_FOR_ASSISTANT\n ? content\n .split(/\\r?\\n/)\n .slice(0, MAX_LINES_TO_RENDER_FOR_ASSISTANT)\n .join('\\n') + TRUNCATED_MESSAGE\n : content,\n startLine: 1,\n})}`\n }\n },\n} satisfies Tool<\n typeof inputSchema,\n {\n type: 'create' | 'update'\n filePath: string\n content: string\n structuredPatch: Hunk[]\n originalFile: string | null\n }\n>\n", "import { FileReadTool } from '#tools/tools/filesystem/FileReadTool/FileReadTool'\n\nexport const PROMPT = `Writes a file to the local filesystem.\n\nUsage:\n- This tool will overwrite the existing file if there is one at the provided path.\n- If this is an existing file, you MUST use the ${FileReadTool.name} tool first to read the file's contents. This tool will fail if you did not read the file first.\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.\n- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.\n- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.`\n", "import { type Hunk, structuredPatch } from 'diff'\n\nconst CONTEXT_LINES = 3\n\n// For some reason, & confuses the diff library, so we replace it with a token,\n// then substitute it back in after the diff is computed.\nconst AMPERSAND_TOKEN = '<<:AMPERSAND_TOKEN:>>'\n\nconst DOLLAR_TOKEN = '<<:DOLLAR_TOKEN:>>'\n\nexport function getPatch({\n filePath,\n fileContents,\n oldStr,\n newStr,\n}: {\n filePath: string\n fileContents: string\n oldStr: string\n newStr: string\n}): Hunk[] {\n return structuredPatch(\n filePath,\n filePath,\n fileContents.replaceAll('&', AMPERSAND_TOKEN).replaceAll('$', DOLLAR_TOKEN),\n fileContents\n .replaceAll('&', AMPERSAND_TOKEN)\n .replaceAll('$', DOLLAR_TOKEN)\n .replace(\n oldStr.replaceAll('&', AMPERSAND_TOKEN).replaceAll('$', DOLLAR_TOKEN),\n newStr.replaceAll('&', AMPERSAND_TOKEN).replaceAll('$', DOLLAR_TOKEN),\n ),\n undefined,\n undefined,\n { context: CONTEXT_LINES },\n ).hunks.map(_ => ({\n ..._,\n lines: _.lines.map(_ =>\n _.replaceAll(AMPERSAND_TOKEN, '&').replaceAll(DOLLAR_TOKEN, '$'),\n ),\n }))\n}\n", "import type { Message as ConversationMessage } from '#core/query'\n\nexport type BackgroundAgentStatus =\n | 'running'\n | 'completed'\n | 'failed'\n | 'killed'\n\nexport type BackgroundAgentTask = {\n type: 'async_agent'\n agentId: string\n parentAgentId?: string\n parentToolUseId?: string\n subagentType?: string\n model?: string\n description: string\n prompt: string\n status: BackgroundAgentStatus\n startedAt: number\n completedAt?: number\n error?: string\n resultText?: string\n messages: ConversationMessage[]\n retrieved?: boolean\n}\n\nexport type BackgroundAgentTaskRuntime = BackgroundAgentTask & {\n abortController: AbortController\n done: Promise<void>\n}\n\nconst backgroundTasks = new Map<string, BackgroundAgentTaskRuntime>()\n\nexport function getBackgroundAgentTask(\n agentId: string,\n): BackgroundAgentTaskRuntime | undefined {\n return backgroundTasks.get(agentId)\n}\n\nexport function getBackgroundAgentTaskSnapshot(\n agentId: string,\n): BackgroundAgentTask | undefined {\n const task = backgroundTasks.get(agentId)\n if (!task) return undefined\n const { abortController: _abortController, done: _done, ...snapshot } = task\n return snapshot\n}\n\nexport function listBackgroundAgentTaskSnapshots(): BackgroundAgentTask[] {\n const out: BackgroundAgentTask[] = []\n for (const task of backgroundTasks.values()) {\n const { abortController: _abortController, done: _done, ...snapshot } = task\n out.push(snapshot)\n }\n return out\n}\n\nexport function upsertBackgroundAgentTask(\n task: BackgroundAgentTaskRuntime,\n): void {\n backgroundTasks.set(task.agentId, task)\n}\n\nexport function markBackgroundAgentTaskRetrieved(agentId: string): void {\n const task = backgroundTasks.get(agentId)\n if (!task) return\n task.retrieved = true\n}\n\nexport function killBackgroundAgentTask(agentId: string): boolean {\n const task = backgroundTasks.get(agentId)\n if (!task) return false\n if (task.status !== 'running') return false\n\n task.status = 'killed'\n task.completedAt = Date.now()\n task.error = 'Killed by user'\n upsertBackgroundAgentTask(task)\n task.abortController.abort()\n return true\n}\n\nexport async function waitForBackgroundAgentTask(\n agentId: string,\n waitUpToMs: number,\n signal: AbortSignal,\n): Promise<BackgroundAgentTaskRuntime | undefined> {\n const task = backgroundTasks.get(agentId)\n if (!task) return undefined\n if (task.status !== 'running') return task\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('Request timed out'))\n }, waitUpToMs)\n timeoutId.unref?.()\n })\n\n const abortPromise = new Promise<never>((_, reject) => {\n if (signal.aborted) {\n reject(new Error('Request aborted'))\n return\n }\n const onAbort = () => reject(new Error('Request aborted'))\n signal.addEventListener('abort', onAbort, { once: true })\n })\n\n await Promise.race([task.done, timeoutPromise, abortPromise])\n return backgroundTasks.get(agentId)\n}\n", "export function normalizeLineEndings(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\n}\n\nexport function countLineBreaks(text: string): number {\n return (text.match(/\\r\\n|\\r|\\n/g) || []).length\n}\n\nexport const SPECIAL_PASTE_CHAR_THRESHOLD = 800\n\nexport function getSpecialPasteNewlineThreshold(terminalRows: number): number {\n return Math.min(terminalRows - 10, 2)\n}\n\nexport type SpecialPasteOptions = {\n terminalRows?: number\n charThreshold?: number\n}\n\nexport function shouldTreatAsSpecialPaste(\n text: string,\n options: SpecialPasteOptions = {},\n): boolean {\n const normalized = normalizeLineEndings(text)\n\n const terminalRows = options.terminalRows ?? process.stdout?.rows ?? 24\n const charThreshold = options.charThreshold ?? SPECIAL_PASTE_CHAR_THRESHOLD\n const newlineThreshold = getSpecialPasteNewlineThreshold(terminalRows)\n\n const newlineCount = countLineBreaks(normalized)\n return normalized.length > charThreshold || newlineCount > newlineThreshold\n}\n\nexport function shouldAggregatePasteChunk(\n input: string,\n hasPendingTimeout: boolean,\n): boolean {\n if (hasPendingTimeout) return true\n if (input.length > SPECIAL_PASTE_CHAR_THRESHOLD) return true\n\n // Avoid misclassifying escape-prefixed newline insert sequences from terminal keybindings (e.g. Option+Enter).\n if (input === '\\x1b\\r' || input === '\\x1b\\n') return false\n\n // Multi-line chunks (or CRLF bursts) are usually paste, but may be delivered in smaller batches.\n if (input.length > 1 && (input.includes('\\n') || input.includes('\\r')))\n return true\n\n return false\n}\n", "import { relative } from 'path'\nimport { getCwd } from '#core/utils/state'\n\nexport function extractSymbolAtPosition(\n lines: string[],\n zeroBasedLine: number,\n zeroBasedCharacter: number,\n): string | null {\n try {\n if (zeroBasedLine < 0 || zeroBasedLine >= lines.length) return null\n const line = lines[zeroBasedLine]\n if (zeroBasedCharacter < 0 || zeroBasedCharacter >= line.length) return null\n const tokenRe = /[\\w$'!]+|[+\\-*/%&|^~<>=]+/g\n let match: RegExpExecArray | null\n while ((match = tokenRe.exec(line)) !== null) {\n const start = match.index\n const end = start + match[0].length\n if (zeroBasedCharacter >= start && zeroBasedCharacter < end) {\n const token = match[0]\n return token.length > 30 ? `${token.slice(0, 27)}...` : token\n }\n }\n return null\n } catch {\n return null\n }\n}\n\nexport function toProjectRelativeIfPossible(filePath: string): string {\n const cwd = getCwd()\n try {\n const rel = relative(cwd, filePath)\n if (!rel || rel === '') return filePath\n if (rel.startsWith('..')) return filePath\n return rel\n } catch {\n return filePath\n }\n}\n\nfunction formatLocation(\n fileName: string,\n line0: number,\n character0: number,\n): string {\n return `${toProjectRelativeIfPossible(fileName)}:${line0 + 1}:${character0 + 1}`\n}\n\nexport function formatGoToDefinitionResult(\n locations: Array<{\n fileName: string\n line0: number\n character0: number\n }> | null,\n): { formatted: string; resultCount: number; fileCount: number } {\n if (!locations || locations.length === 0) {\n return {\n formatted:\n 'No definition found. This may occur if the cursor is not on a symbol, or if the definition is in an external library not indexed by the LSP server.',\n resultCount: 0,\n fileCount: 0,\n }\n }\n const fileCount = new Set(locations.map(l => l.fileName)).size\n if (locations.length === 1) {\n const loc = locations[0]\n return {\n formatted: `Defined in ${formatLocation(loc.fileName, loc.line0, loc.character0)}`,\n resultCount: 1,\n fileCount,\n }\n }\n return {\n formatted: `Found ${locations.length} definitions:\\n${locations\n .map(\n loc => ` ${formatLocation(loc.fileName, loc.line0, loc.character0)}`,\n )\n .join('\\n')}`,\n resultCount: locations.length,\n fileCount,\n }\n}\n\nexport function groupLocationsByFile<T extends { fileName: string }>(\n items: T[],\n): Map<string, T[]> {\n const grouped = new Map<string, T[]>()\n for (const item of items) {\n const key = toProjectRelativeIfPossible(item.fileName)\n const existing = grouped.get(key)\n if (existing) existing.push(item)\n else grouped.set(key, [item])\n }\n return grouped\n}\n\nexport function formatFindReferencesResult(\n references: Array<{\n fileName: string\n line0: number\n character0: number\n }> | null,\n): { formatted: string; resultCount: number; fileCount: number } {\n if (!references || references.length === 0) {\n return {\n formatted:\n 'No references found. This may occur if the symbol has no usages, or if the LSP server has not fully indexed the workspace.',\n resultCount: 0,\n fileCount: 0,\n }\n }\n if (references.length === 1) {\n const ref = references[0]\n return {\n formatted: `Found 1 reference:\\n ${formatLocation(ref.fileName, ref.line0, ref.character0)}`,\n resultCount: 1,\n fileCount: 1,\n }\n }\n\n const grouped = groupLocationsByFile(references)\n const lines: string[] = [\n `Found ${references.length} references across ${grouped.size} files:`,\n ]\n for (const [file, refs] of grouped) {\n lines.push(`\\n${file}:`)\n for (const ref of refs) {\n lines.push(` Line ${ref.line0 + 1}:${ref.character0 + 1}`)\n }\n }\n return {\n formatted: lines.join('\\n'),\n resultCount: references.length,\n fileCount: grouped.size,\n }\n}\n\nexport function formatHoverResult(\n hoverText: string | null,\n line0: number,\n character0: number,\n): { formatted: string; resultCount: number; fileCount: number } {\n if (!hoverText || hoverText.trim() === '') {\n return {\n formatted:\n 'No hover information available. This may occur if the cursor is not on a symbol, or if the LSP server has not fully indexed the file.',\n resultCount: 0,\n fileCount: 0,\n }\n }\n return {\n formatted: `Hover info at ${line0 + 1}:${character0 + 1}:\\n\\n${hoverText}`,\n resultCount: 1,\n fileCount: 1,\n }\n}\n\nexport function formatDocumentSymbolsResult(\n lines: string[],\n symbolCount: number,\n) {\n if (symbolCount === 0) {\n return {\n formatted:\n 'No symbols found in document. This may occur if the file is empty, not supported by the LSP server, or if the server has not fully indexed the file.',\n resultCount: 0,\n fileCount: 0,\n }\n }\n return {\n formatted: ['Document symbols:', ...lines].join('\\n'),\n resultCount: symbolCount,\n fileCount: 1,\n }\n}\n", "import { z } from 'zod'\nimport {\n getSessionPlugins,\n type SessionPlugin,\n} from '#core/utils/sessionPlugins'\nimport { LEGACY_ENV } from '#core/compat/legacyEnv'\nimport { KODE_HOOK_ENV } from '#core/compat/hookEnv'\nimport { existsSync, readFileSync } from 'node:fs'\nimport {\n basename,\n delimiter,\n dirname,\n extname,\n isAbsolute,\n join,\n relative,\n resolve,\n} from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { accessSync, constants, statSync } from 'node:fs'\n\nexport type LspServerSource =\n | {\n kind: 'plugin'\n pluginName: string\n pluginRoot: string\n configPath?: string\n }\n | { kind: 'unknown' }\n\nexport type ResolvedLspServerConfig = LspServerConfig & {\n name: string\n source: LspServerSource\n}\n\ntype LspServerIndexEntry = {\n serverName: string\n languageId: string\n}\n\nexport type LspServerIndex = Map<string, LspServerIndexEntry>\n\nconst nodeModulesBinCache = new Map<string, string[]>()\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction listNodeModulesBinDirs(startDir: string): string[] {\n const key = resolve(startDir)\n const cached = nodeModulesBinCache.get(key)\n if (cached) return cached\n\n const out: string[] = []\n let current = key\n for (let i = 0; i < 50; i++) {\n const candidate = join(current, 'node_modules', '.bin')\n if (existsSync(candidate)) out.push(candidate)\n\n const parent = dirname(current)\n if (parent === current) break\n current = parent\n }\n\n nodeModulesBinCache.set(key, out)\n return out\n}\n\nfunction mergePathList(\n prepend: string[],\n basePath: string | undefined,\n): string {\n const seen = new Set<string>()\n const out: string[] = []\n\n for (const dir of prepend) {\n const value = String(dir ?? '').trim()\n if (!value) continue\n if (seen.has(value)) continue\n seen.add(value)\n out.push(value)\n }\n\n const base = String(basePath ?? '')\n for (const dir of base.split(delimiter)) {\n const value = String(dir ?? '').trim()\n if (!value) continue\n if (seen.has(value)) continue\n seen.add(value)\n out.push(value)\n }\n\n return out.join(delimiter)\n}\n\nexport function buildLspServerProcessEnv(args: {\n cwd: string\n env?: Record<string, string>\n}): Record<string, string> {\n const mergedEnv = { ...process.env, ...(args.env ?? {}) } as Record<\n string,\n string\n >\n\n const toolDir = dirname(fileURLToPath(import.meta.url))\n const prepend = [\n ...listNodeModulesBinDirs(args.cwd),\n ...listNodeModulesBinDirs(toolDir),\n dirname(process.execPath),\n ]\n\n mergedEnv.PATH = mergePathList(prepend, mergedEnv.PATH ?? process.env.PATH)\n return mergedEnv\n}\n\nfunction stripJsonComments(input: string): string {\n let out = ''\n let inString = false\n let escaped = false\n let inLineComment = false\n let inBlockComment = false\n\n for (let i = 0; i < input.length; i++) {\n const ch = input[i]!\n const next = i + 1 < input.length ? input[i + 1]! : ''\n\n if (inLineComment) {\n if (ch === '\\n') {\n inLineComment = false\n out += ch\n }\n continue\n }\n\n if (inBlockComment) {\n if (ch === '*' && next === '/') {\n inBlockComment = false\n i++\n }\n continue\n }\n\n if (inString) {\n out += ch\n if (escaped) {\n escaped = false\n continue\n }\n if (ch === '\\\\') {\n escaped = true\n continue\n }\n if (ch === '\"') inString = false\n continue\n }\n\n if (ch === '\"') {\n inString = true\n out += ch\n continue\n }\n\n if (ch === '/' && next === '/') {\n inLineComment = true\n i++\n continue\n }\n\n if (ch === '/' && next === '*') {\n inBlockComment = true\n i++\n continue\n }\n\n out += ch\n }\n\n return out\n}\n\nfunction parseJsonOrJsonc(text: string): unknown {\n const raw = String(text ?? '')\n if (!raw.trim()) return null\n try {\n return JSON.parse(raw)\n } catch {\n try {\n return JSON.parse(stripJsonComments(raw))\n } catch {\n return null\n }\n }\n}\n\nfunction expandTemplateString(\n value: string,\n pluginRoot: string | null,\n missingVars?: string[],\n): string {\n return value.replace(/\\$\\{([^}]+)\\}/g, (match, rawKey) => {\n const raw = String(rawKey ?? '')\n const [keyPart, defaultValue] = raw.split(':-', 2)\n const k = String(keyPart ?? '').trim()\n if (!k) return match\n if (\n pluginRoot &&\n (k === KODE_HOOK_ENV.pluginRoot || k === LEGACY_ENV.pluginRoot)\n )\n return pluginRoot\n const env = process.env[k]\n if (env !== undefined) return env\n if (defaultValue !== undefined) return defaultValue\n missingVars?.push(k)\n return match\n })\n}\n\nfunction expandTemplateDeep(\n value: unknown,\n pluginRoot: string | null,\n missingVars?: string[],\n): unknown {\n if (typeof value === 'string')\n return expandTemplateString(value, pluginRoot, missingVars)\n if (Array.isArray(value))\n return value.map(v => expandTemplateDeep(v, pluginRoot, missingVars))\n if (isRecord(value)) {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) {\n out[k] = expandTemplateDeep(v, pluginRoot, missingVars)\n }\n return out\n }\n return value\n}\n\nfunction isAbsoluteLikePath(value: string): boolean {\n if (isAbsolute(value)) return true\n return /^[A-Za-z]:[\\\\/]/.test(value)\n}\n\nfunction isExecutableFile(filePath: string): boolean {\n try {\n const stat = statSync(filePath)\n if (!stat.isFile()) return false\n if (process.platform === 'win32') return true\n accessSync(filePath, constants.X_OK)\n return true\n } catch {\n return false\n }\n}\n\nexport function resolveExecutableFromEnv(args: {\n command: string\n cwd: string\n env?: Record<string, string>\n}): string | null {\n const command = String(args.command ?? '').trim()\n if (!command) return null\n\n // If a path is provided, resolve relative paths against the server cwd.\n if (\n command.includes('/') ||\n command.includes('\\\\') ||\n isAbsoluteLikePath(command)\n ) {\n const abs = isAbsoluteLikePath(command)\n ? command\n : resolve(args.cwd, command)\n return isExecutableFile(abs) ? abs : null\n }\n\n const pathValue = args.env?.PATH ?? process.env.PATH ?? ''\n const searchDirs = pathValue.split(delimiter).filter(Boolean)\n\n const isWin = process.platform === 'win32'\n const hasExtension = /\\.[A-Za-z0-9]+$/.test(command)\n\n const pathextRaw = args.env?.PATHEXT ?? process.env.PATHEXT ?? ''\n const pathext = isWin\n ? pathextRaw\n .split(';')\n .map(s => s.trim())\n .filter(Boolean)\n : []\n\n const extensionsToTry =\n isWin && !hasExtension\n ? pathext.length > 0\n ? pathext\n : ['.EXE', '.CMD', '.BAT', '.COM']\n : ['']\n\n for (const dir of searchDirs) {\n for (const ext of extensionsToTry) {\n const candidate = join(dir, `${command}${ext}`)\n if (isExecutableFile(candidate)) return candidate\n }\n }\n\n return null\n}\n\nexport function isLspServerRunnable(\n server: Pick<ResolvedLspServerConfig, 'command' | 'env' | 'workspaceFolder'>,\n): boolean {\n const cwd =\n typeof server.workspaceFolder === 'string' && server.workspaceFolder.trim()\n ? resolve(server.workspaceFolder.trim())\n : process.cwd()\n const mergedEnv = buildLspServerProcessEnv({ cwd, env: server.env })\n return resolveExecutableFromEnv({\n command: server.command,\n cwd,\n env: mergedEnv,\n })\n ? true\n : false\n}\n\nexport async function listRunnableLspServers(): Promise<\n ResolvedLspServerConfig[]\n> {\n const servers = await listResolvedLspServers()\n return servers.filter(s => isLspServerRunnable(s))\n}\n\nconst ExtensionKeySchema = z\n .string()\n .min(2)\n .refine(v => v.startsWith('.'), {\n message: 'File extensions must start with dot (e.g., \".ts\", not \"ts\")',\n })\n\nexport const LspServerConfigSchema = z.strictObject({\n command: z\n .string()\n .min(1)\n .refine(\n cmd => {\n if (/\\s/.test(cmd) && !isAbsoluteLikePath(cmd)) return false\n return true\n },\n {\n message:\n 'Command should not contain spaces. Use args array for arguments.',\n },\n )\n .describe(\n 'Command to execute the LSP server (e.g., \"typescript-language-server\")',\n ),\n args: z.array(z.string().min(1)).optional(),\n extensionToLanguage: z\n .record(ExtensionKeySchema, z.string().min(1))\n .refine(map => Object.keys(map).length > 0, {\n message: 'extensionToLanguage must have at least one mapping',\n }),\n transport: z.enum(['stdio', 'socket']).default('stdio'),\n env: z.record(z.string(), z.string()).optional(),\n initializationOptions: z.unknown().optional(),\n settings: z.unknown().optional(),\n workspaceFolder: z.string().optional(),\n startupTimeout: z.number().int().positive().optional(),\n shutdownTimeout: z.number().int().positive().optional(),\n restartOnCrash: z.boolean().optional(),\n maxRestarts: z.number().int().nonnegative().optional(),\n})\n\nexport type LspServerConfig = z.infer<typeof LspServerConfigSchema>\n\nfunction safeResolveWithin(rootDir: string, relPath: string): string | null {\n const trimmed = String(relPath ?? '').trim()\n if (!trimmed) return null\n if (isAbsolute(trimmed)) return null\n\n const normalized = trimmed.replace(/\\\\/g, '/')\n if (normalized.split('/').includes('..')) return null\n\n const abs = resolve(rootDir, trimmed)\n const rel = relative(rootDir, abs)\n if (!rel || rel.startsWith('..') || isAbsolute(rel)) return null\n return abs\n}\n\nfunction coerceLspServersRecord(raw: unknown): Record<string, unknown> | null {\n if (!isRecord(raw)) return null\n const nested = raw['lspServers']\n if (isRecord(nested)) return nested\n return raw\n}\n\nfunction requireRecordTopLevel(raw: unknown): Record<string, unknown> | null {\n if (!isRecord(raw)) return null\n return raw\n}\n\nconst warnedMissingEnvVarKeys = new Set<string>()\n\nfunction parseLspServersFromUnknown(\n raw: unknown,\n {\n pluginRoot,\n warnKeyPrefix,\n }: { pluginRoot: string | null; warnKeyPrefix: string },\n): Record<string, LspServerConfig> {\n const rawServers = coerceLspServersRecord(raw)\n if (!rawServers) return {}\n\n const missingVars: string[] = []\n const out: Record<string, LspServerConfig> = {}\n for (const [name, cfg] of Object.entries(rawServers)) {\n const expanded = expandTemplateDeep(cfg, pluginRoot, missingVars)\n const parsedCfg = LspServerConfigSchema.safeParse(expanded)\n if (!parsedCfg.success) continue\n out[name] = parsedCfg.data\n }\n\n if (missingVars.length > 0) {\n const unique = Array.from(new Set(missingVars)).join(', ')\n const warnKey = `${warnKeyPrefix}:${unique}`\n if (!warnedMissingEnvVarKeys.has(warnKey)) {\n warnedMissingEnvVarKeys.add(warnKey)\n console.warn(\n `Missing environment variables in plugin LSP config: ${unique}`,\n )\n }\n }\n return out\n}\n\nfunction parseLspServersFromTopLevelRecord(\n rawServers: Record<string, unknown>,\n args: { pluginRoot: string | null; warnKeyPrefix: string },\n): Record<string, LspServerConfig> {\n const missingVars: string[] = []\n const out: Record<string, LspServerConfig> = {}\n\n for (const [name, cfg] of Object.entries(rawServers)) {\n const expanded = expandTemplateDeep(cfg, args.pluginRoot, missingVars)\n const parsedCfg = LspServerConfigSchema.safeParse(expanded)\n if (!parsedCfg.success) continue\n out[name] = parsedCfg.data\n }\n\n if (missingVars.length > 0) {\n const unique = Array.from(new Set(missingVars)).join(', ')\n const warnKey = `${args.warnKeyPrefix}:${unique}`\n if (!warnedMissingEnvVarKeys.has(warnKey)) {\n warnedMissingEnvVarKeys.add(warnKey)\n console.warn(\n `Missing environment variables in plugin LSP config: ${unique}`,\n )\n }\n }\n\n return out\n}\n\nfunction loadLspServersFromFile(\n filePath: string,\n pluginRoot: string | null,\n): Record<string, LspServerConfig> {\n const rawText = readFileSync(filePath, 'utf8')\n const parsed = JSON.parse(rawText)\n const topLevel = requireRecordTopLevel(parsed)\n if (!topLevel) return {}\n return parseLspServersFromTopLevelRecord(topLevel, {\n pluginRoot,\n warnKeyPrefix: filePath,\n })\n}\n\nfunction loadPluginLspServersFromRootFile(pluginRoot: string): {\n servers: Record<string, LspServerConfig>\n configPath: string\n} | null {\n const configPath = join(pluginRoot, '.lsp.json')\n if (!existsSync(configPath)) return null\n\n try {\n const servers = loadLspServersFromFile(configPath, pluginRoot)\n return {\n servers,\n configPath,\n }\n } catch {\n return null\n }\n}\n\nfunction readPluginLspServers(plugin: SessionPlugin): Array<{\n name: string\n config: LspServerConfig\n source: LspServerSource\n}> {\n const pluginRoot = plugin.rootDir\n\n const merged: Array<{\n name: string\n config: LspServerConfig\n source: LspServerSource\n }> = []\n\n const rootFile = loadPluginLspServersFromRootFile(pluginRoot)\n if (rootFile) {\n for (const [name, cfg] of Object.entries(rootFile.servers)) {\n merged.push({\n name,\n config: cfg,\n source: {\n kind: 'plugin',\n pluginName: plugin.name,\n pluginRoot,\n configPath: rootFile.configPath,\n },\n })\n }\n }\n\n if (isRecord(plugin.manifest) && plugin.manifest['lspServers']) {\n const manifestValue = plugin.manifest['lspServers']\n const sources = Array.isArray(manifestValue)\n ? manifestValue\n : [manifestValue]\n\n for (const entry of sources) {\n if (typeof entry === 'string') {\n const abs = safeResolveWithin(pluginRoot, entry)\n if (!abs) continue\n if (!existsSync(abs)) continue\n try {\n const servers = loadLspServersFromFile(abs, pluginRoot)\n for (const [name, cfg] of Object.entries(servers)) {\n merged.push({\n name,\n config: cfg,\n source: {\n kind: 'plugin',\n pluginName: plugin.name,\n pluginRoot,\n configPath: abs,\n },\n })\n }\n } catch {\n continue\n }\n continue\n }\n\n const inline = requireRecordTopLevel(entry)\n if (!inline) continue\n\n const servers = parseLspServersFromTopLevelRecord(inline, {\n pluginRoot,\n warnKeyPrefix: `plugin:${plugin.name}:manifest:lspServers`,\n })\n for (const [name, cfg] of Object.entries(servers)) {\n merged.push({\n name,\n config: cfg,\n source: {\n kind: 'plugin',\n pluginName: plugin.name,\n pluginRoot,\n },\n })\n }\n }\n }\n\n return merged\n}\n\nexport async function listResolvedLspServers(): Promise<\n ResolvedLspServerConfig[]\n> {\n const merged = new Map<\n string,\n { config: LspServerConfig; source: LspServerSource }\n >()\n\n for (const plugin of getSessionPlugins()) {\n for (const entry of readPluginLspServers(plugin)) {\n merged.set(entry.name, { config: entry.config, source: entry.source })\n }\n }\n\n const out: ResolvedLspServerConfig[] = []\n for (const [name, { config, source }] of merged.entries()) {\n const parsed = LspServerConfigSchema.safeParse(config)\n if (!parsed.success) continue\n\n const pluginRoot =\n source.kind === 'plugin' ? source.pluginRoot : (process.cwd() as string)\n const env = {\n [KODE_HOOK_ENV.pluginRoot]: pluginRoot,\n [LEGACY_ENV.pluginRoot]: pluginRoot,\n ...(parsed.data.env ?? {}),\n }\n\n out.push({\n name,\n ...parsed.data,\n env,\n source,\n })\n }\n\n return out\n}\n\nexport function buildLspServerIndexFromServers(\n servers: ResolvedLspServerConfig[],\n): LspServerIndex {\n const index = new Map<string, LspServerIndexEntry>()\n\n for (const server of servers) {\n const mapping = server.extensionToLanguage ?? {}\n for (const [ext, languageId] of Object.entries(mapping)) {\n if (!ext || !languageId) continue\n // Preserve the first matching server for a given extension.\n if (!index.has(ext))\n index.set(ext, { serverName: server.name, languageId })\n }\n }\n\n return index\n}\n\nexport function lspServerForPath(\n serverIndex: LspServerIndex,\n filePath: string,\n): LspServerIndexEntry | null {\n const ext = extname(filePath)\n if (!ext) return null\n return serverIndex.get(ext) ?? null\n}\n\nexport function lspWorkspaceFolderForServer(\n server: ResolvedLspServerConfig,\n): string {\n const configured =\n typeof server.workspaceFolder === 'string'\n ? server.workspaceFolder.trim()\n : ''\n const folder = configured ? configured : process.cwd()\n return resolve(folder)\n}\n\nexport function lspRootUriForServer(server: ResolvedLspServerConfig): string {\n const folder = lspWorkspaceFolderForServer(server)\n return pathToFileURL(folder).href\n}\n\nexport function lspWorkspaceFoldersForServer(\n server: ResolvedLspServerConfig,\n): Array<{ uri: string; name: string }> {\n const folder = lspWorkspaceFolderForServer(server)\n return [{ uri: pathToFileURL(folder).href, name: basename(folder) }]\n}\n", "import type { ToolUseContext } from '#core/tooling/Tool'\nimport { getAbsolutePath } from '#core/utils/file'\nimport { extname } from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { readFile } from 'node:fs/promises'\nimport type { Input, Output } from './LspTool'\nimport {\n formatDocumentSymbolsResult,\n formatFindReferencesResult,\n formatGoToDefinitionResult,\n formatHoverResult,\n toProjectRelativeIfPossible,\n} from './format'\nimport { listResolvedLspServers } from './lspConfig'\nimport { LspServerManager } from './lspManager'\nimport type { LspServerRunState } from './lspServer'\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n if (Array.isArray(value)) return null\n return value as Record<string, unknown>\n}\n\nfunction uriToFilePath(uri: string): string | null {\n try {\n if (!uri.startsWith('file:')) return null\n return fileURLToPath(uri)\n } catch {\n return null\n }\n}\n\nfunction formatUriForDisplay(uri: string): string {\n const filePath = uriToFilePath(uri)\n if (filePath) return toProjectRelativeIfPossible(filePath)\n\n try {\n return decodeURIComponent(uri)\n } catch {\n return uri\n }\n}\n\nfunction positionFromRangeStart(\n range: unknown,\n): { line0: number; character0: number } | null {\n const record = asRecord(range)\n const start = record ? asRecord(record.start) : null\n if (!start) return null\n const line = start.line\n const character = start.character\n if (typeof line !== 'number' || typeof character !== 'number') return null\n return { line0: line, character0: character }\n}\n\nfunction coerceLocationArray(\n value: unknown,\n): Array<{ uri: string; range: unknown }> {\n if (!value) return []\n const list = Array.isArray(value) ? value : [value]\n const out: Array<{ uri: string; range: unknown }> = []\n for (const item of list) {\n const record = asRecord(item)\n if (!record) continue\n // LocationLink uses targetUri + targetSelectionRange/targetRange.\n if (typeof record.targetUri === 'string') {\n const range = record.targetSelectionRange ?? record.targetRange\n out.push({ uri: record.targetUri, range })\n continue\n }\n if (typeof record.uri === 'string') {\n out.push({ uri: record.uri, range: record.range })\n continue\n }\n }\n return out\n}\n\nfunction extractHoverText(hover: unknown): string | null {\n const record = asRecord(hover)\n if (!record) return null\n\n const contents = record.contents\n if (!contents) return null\n\n if (typeof contents === 'string') return contents\n\n // MarkupContent: { kind, value }\n const contentsRec = asRecord(contents)\n if (contentsRec && typeof contentsRec.value === 'string')\n return contentsRec.value\n\n // MarkedString[] or mixed array.\n if (Array.isArray(contents)) {\n const parts: string[] = []\n for (const block of contents) {\n if (typeof block === 'string') {\n parts.push(block)\n continue\n }\n const blockRec = asRecord(block)\n if (!blockRec) continue\n if (typeof blockRec.value === 'string') parts.push(blockRec.value)\n }\n const text = parts.join('\\n\\n').trim()\n return text.length > 0 ? text : null\n }\n\n // MarkedString: { language, value }\n if (contentsRec && typeof contentsRec.value === 'string')\n return contentsRec.value\n\n return null\n}\n\nfunction formatSymbolKind(kind: unknown): string {\n const k = typeof kind === 'number' ? kind : 0\n const map: Record<number, string> = {\n 1: 'File',\n 2: 'Module',\n 3: 'Namespace',\n 4: 'Package',\n 5: 'Class',\n 6: 'Method',\n 7: 'Property',\n 8: 'Field',\n 9: 'Constructor',\n 10: 'Enum',\n 11: 'Interface',\n 12: 'Function',\n 13: 'Variable',\n 14: 'Constant',\n 15: 'String',\n 16: 'Number',\n 17: 'Boolean',\n 18: 'Array',\n 19: 'Object',\n 20: 'Key',\n 21: 'Null',\n 22: 'EnumMember',\n 23: 'Struct',\n 24: 'Event',\n 25: 'Operator',\n 26: 'TypeParameter',\n }\n return map[k] ?? 'Unknown'\n}\n\nfunction countUniqueUris(uris: Array<string | null | undefined>): number {\n const set = new Set<string>()\n for (const uri of uris) {\n if (!uri) continue\n set.add(uri)\n }\n return set.size\n}\n\nfunction buildLspMethodParams(\n input: Input,\n absPath: string,\n): { method: string; params: unknown } {\n const uri = pathToFileURL(absPath).href\n const pos = { line: input.line - 1, character: input.character - 1 }\n\n switch (input.operation) {\n case 'goToDefinition':\n return {\n method: 'textDocument/definition',\n params: { textDocument: { uri }, position: pos },\n }\n case 'findReferences':\n return {\n method: 'textDocument/references',\n params: {\n textDocument: { uri },\n position: pos,\n context: { includeDeclaration: true },\n },\n }\n case 'hover':\n return {\n method: 'textDocument/hover',\n params: { textDocument: { uri }, position: pos },\n }\n case 'documentSymbol':\n return {\n method: 'textDocument/documentSymbol',\n params: { textDocument: { uri } },\n }\n case 'workspaceSymbol':\n return { method: 'workspace/symbol', params: { query: '' } }\n case 'goToImplementation':\n return {\n method: 'textDocument/implementation',\n params: { textDocument: { uri }, position: pos },\n }\n case 'prepareCallHierarchy':\n case 'incomingCalls':\n case 'outgoingCalls':\n return {\n method: 'textDocument/prepareCallHierarchy',\n params: { textDocument: { uri }, position: pos },\n }\n default: {\n const exhaustiveCheck: never = input.operation\n throw new Error(`Unsupported LSP operation: ${exhaustiveCheck}`)\n }\n }\n}\n\nfunction formatWorkspaceSymbols(result: unknown): {\n formatted: string\n resultCount: number\n fileCount: number\n} {\n const list = Array.isArray(result) ? result : []\n if (list.length === 0) {\n return {\n formatted:\n 'No symbols found in workspace. This may occur if the workspace is empty, or if the LSP server has not finished indexing the project.',\n resultCount: 0,\n fileCount: 0,\n }\n }\n\n const symbols = list\n .map(item => {\n const rec = asRecord(item)\n if (!rec) return null\n const location = asRecord(rec.location)\n if (!location) return null\n if (typeof location.uri !== 'string' || !location.uri) return null\n return rec\n })\n .filter(Boolean) as Record<string, unknown>[]\n\n if (symbols.length === 0) {\n return {\n formatted:\n 'No symbols found in workspace. This may occur if the workspace is empty, or if the LSP server has not finished indexing the project.',\n resultCount: 0,\n fileCount: 0,\n }\n }\n\n const grouped = new Map<string, Record<string, unknown>[]>()\n for (const sym of symbols) {\n const location = asRecord(sym.location)\n const uri =\n location && typeof location.uri === 'string' ? location.uri : null\n const fileKey = uri ? formatUriForDisplay(uri) : '<unknown location>'\n const existing = grouped.get(fileKey)\n if (existing) existing.push(sym)\n else grouped.set(fileKey, [sym])\n }\n\n const lines: string[] = [\n `Found ${symbols.length} symbol${symbols.length === 1 ? '' : 's'} in workspace:`,\n ]\n\n for (const [file, items] of grouped) {\n lines.push('', `${file}:`)\n for (const item of items) {\n const name = typeof item.name === 'string' ? item.name : '(anonymous)'\n const kind = formatSymbolKind(item.kind)\n const location = asRecord(item.location)\n const range = location ? location.range : null\n const pos = positionFromRangeStart(range)\n const line0 = pos?.line0 ?? 0\n let line = ` ${name} (${kind}) - Line ${line0 + 1}`\n if (typeof item.containerName === 'string' && item.containerName) {\n line += ` in ${item.containerName}`\n }\n lines.push(line)\n }\n }\n\n return {\n formatted: lines.join('\\n'),\n resultCount: symbols.length,\n fileCount: grouped.size,\n }\n}\n\nfunction formatCallHierarchyItem(item: Record<string, unknown>): string {\n const name = typeof item.name === 'string' ? item.name : '(anonymous)'\n const kind = formatSymbolKind(item.kind)\n\n const uri = typeof item.uri === 'string' ? item.uri : null\n if (!uri) return `${name} (${kind}) - <unknown location>`\n\n const fileForDisplay = formatUriForDisplay(uri)\n\n const range = asRecord(item.range)\n const start = range ? asRecord(range.start) : null\n const line0 = start && typeof start.line === 'number' ? start.line : null\n const line = typeof line0 === 'number' ? line0 + 1 : 1\n\n let out = `${name} (${kind}) - ${fileForDisplay}:${line}`\n\n if (typeof item.detail === 'string' && item.detail) {\n out += ` [${item.detail}]`\n }\n\n return out\n}\n\nfunction formatCallHierarchyItems(items: unknown): {\n formatted: string\n resultCount: number\n fileCount: number\n} {\n const list = Array.isArray(items) ? items : []\n if (list.length === 0) {\n return {\n formatted: 'No call hierarchy item found at this position',\n resultCount: 0,\n fileCount: 0,\n }\n }\n\n const parsed = list.map(item => asRecord(item))\n const uris = parsed.map(item =>\n item && typeof item.uri === 'string' ? item.uri : null,\n )\n\n if (list.length === 1) {\n const first = parsed[0]\n return {\n formatted: first\n ? `Call hierarchy item: ${formatCallHierarchyItem(first)}`\n : 'No call hierarchy item found at this position',\n resultCount: 1,\n fileCount: countUniqueUris(uris),\n }\n }\n\n const lines: string[] = [`Found ${list.length} call hierarchy items:`]\n for (const item of parsed) {\n if (!item) continue\n lines.push(` ${formatCallHierarchyItem(item)}`)\n }\n\n return {\n formatted: lines.join('\\n'),\n resultCount: list.length,\n fileCount: countUniqueUris(uris),\n }\n}\n\nfunction formatIncomingCalls(calls: unknown): {\n formatted: string\n resultCount: number\n fileCount: number\n} {\n const list = Array.isArray(calls) ? calls : []\n if (list.length === 0) {\n return {\n formatted: 'No incoming calls found (nothing calls this function)',\n resultCount: 0,\n fileCount: 0,\n }\n }\n\n const grouped = new Map<string, Array<Record<string, unknown>>>()\n const uris: Array<string | null> = []\n\n for (const call of list) {\n const rec = asRecord(call)\n if (!rec) continue\n const from = asRecord(rec.from)\n if (!from) continue\n\n const uri = typeof from.uri === 'string' ? from.uri : null\n uris.push(uri)\n const fileKey = uri ? formatUriForDisplay(uri) : '<unknown location>'\n\n const existing = grouped.get(fileKey)\n if (existing) existing.push(rec)\n else grouped.set(fileKey, [rec])\n }\n\n const lines: string[] = [\n `Found ${list.length} incoming call${list.length === 1 ? '' : 's'}:`,\n ]\n\n for (const [file, items] of grouped) {\n lines.push('', `${file}:`)\n for (const call of items) {\n const from = asRecord(call.from)\n if (!from) continue\n const kind = formatSymbolKind(from.kind)\n const range = asRecord(from.range)\n const start = range ? asRecord(range.start) : null\n const line0 = start && typeof start.line === 'number' ? start.line : null\n const line = typeof line0 === 'number' ? line0 + 1 : 1\n\n const name = typeof from.name === 'string' ? from.name : '(anonymous)'\n let text = ` ${name} (${kind}) - Line ${line}`\n\n const fromRanges = Array.isArray(call.fromRanges) ? call.fromRanges : []\n if (fromRanges.length > 0) {\n const refs = fromRanges\n .map(r => {\n const rr = asRecord(r)\n const rs = rr ? asRecord(rr.start) : null\n const rl = rs && typeof rs.line === 'number' ? rs.line : null\n const rc =\n rs && typeof rs.character === 'number' ? rs.character : null\n if (typeof rl !== 'number' || typeof rc !== 'number') return null\n return `${rl + 1}:${rc + 1}`\n })\n .filter(Boolean) as string[]\n if (refs.length > 0) text += ` [calls at: ${refs.join(', ')}]`\n }\n\n lines.push(text)\n }\n }\n\n return {\n formatted: lines.join('\\n'),\n resultCount: list.length,\n fileCount: countUniqueUris(uris),\n }\n}\n\nfunction formatOutgoingCalls(calls: unknown): {\n formatted: string\n resultCount: number\n fileCount: number\n} {\n const list = Array.isArray(calls) ? calls : []\n if (list.length === 0) {\n return {\n formatted: 'No outgoing calls found (this function calls nothing)',\n resultCount: 0,\n fileCount: 0,\n }\n }\n\n const grouped = new Map<string, Array<Record<string, unknown>>>()\n const uris: Array<string | null> = []\n\n for (const call of list) {\n const rec = asRecord(call)\n if (!rec) continue\n const to = asRecord(rec.to)\n if (!to) continue\n\n const uri = typeof to.uri === 'string' ? to.uri : null\n uris.push(uri)\n const fileKey = uri ? formatUriForDisplay(uri) : '<unknown location>'\n\n const existing = grouped.get(fileKey)\n if (existing) existing.push(rec)\n else grouped.set(fileKey, [rec])\n }\n\n const lines: string[] = [\n `Found ${list.length} outgoing call${list.length === 1 ? '' : 's'}:`,\n ]\n\n for (const [file, items] of grouped) {\n lines.push('', `${file}:`)\n for (const call of items) {\n const to = asRecord(call.to)\n if (!to) continue\n const kind = formatSymbolKind(to.kind)\n const range = asRecord(to.range)\n const start = range ? asRecord(range.start) : null\n const line0 = start && typeof start.line === 'number' ? start.line : null\n const line = typeof line0 === 'number' ? line0 + 1 : 1\n\n const name = typeof to.name === 'string' ? to.name : '(anonymous)'\n let text = ` ${name} (${kind}) - Line ${line}`\n\n const fromRanges = Array.isArray(call.fromRanges) ? call.fromRanges : []\n if (fromRanges.length > 0) {\n const refs = fromRanges\n .map(r => {\n const rr = asRecord(r)\n const rs = rr ? asRecord(rr.start) : null\n const rl = rs && typeof rs.line === 'number' ? rs.line : null\n const rc =\n rs && typeof rs.character === 'number' ? rs.character : null\n if (typeof rl !== 'number' || typeof rc !== 'number') return null\n return `${rl + 1}:${rc + 1}`\n })\n .filter(Boolean) as string[]\n if (refs.length > 0) text += ` [called from: ${refs.join(', ')}]`\n }\n\n lines.push(text)\n }\n }\n\n return {\n formatted: lines.join('\\n'),\n resultCount: list.length,\n fileCount: countUniqueUris(uris),\n }\n}\n\nlet cachedManager: { signature: string; manager: LspServerManager } | null =\n null\n\nexport type LspRuntimeServerStatus = {\n name: string\n state: LspServerRunState\n pid: number | null\n restartCount: number\n lastError: string | null\n}\n\nexport function getCachedLspRuntimeStatus(): {\n hasManager: boolean\n signature: string | null\n servers: LspRuntimeServerStatus[]\n} {\n if (!cachedManager) {\n return { hasManager: false, signature: null, servers: [] }\n }\n\n const servers: LspRuntimeServerStatus[] = []\n for (const [name, server] of cachedManager.manager.getAllServers()) {\n servers.push({\n name,\n state: server.state,\n pid: server.getProcessPid(),\n restartCount: server.restartCount,\n lastError: server.lastError ? server.lastError.message : null,\n })\n }\n\n return {\n hasManager: true,\n signature: cachedManager.signature,\n servers: servers.sort((a, b) => a.name.localeCompare(b.name)),\n }\n}\n\nasync function getLspManager(): Promise<LspServerManager | null> {\n const servers = await listResolvedLspServers()\n if (servers.length === 0) return null\n\n const signature = JSON.stringify(\n servers.map(s => ({\n name: s.name,\n command: s.command,\n args: s.args ?? [],\n transport: s.transport ?? 'stdio',\n extensionToLanguage: s.extensionToLanguage ?? {},\n workspaceFolder: s.workspaceFolder ?? '',\n env: s.env ?? {},\n initializationOptions: s.initializationOptions ?? null,\n settings: s.settings ?? null,\n startupTimeout: s.startupTimeout ?? null,\n shutdownTimeout: s.shutdownTimeout ?? null,\n restartOnCrash: s.restartOnCrash ?? false,\n maxRestarts: s.maxRestarts ?? null,\n })),\n )\n\n if (cachedManager && cachedManager.signature === signature) {\n return cachedManager.manager\n }\n\n if (cachedManager) {\n await cachedManager.manager.dispose()\n cachedManager = null\n }\n\n const manager = new LspServerManager(servers)\n await manager.initialize()\n cachedManager = { signature, manager }\n return manager\n}\n\nexport async function ensureLspManagerInitialized(): Promise<LspServerManager | null> {\n return await getLspManager()\n}\n\nexport async function* callLspTool(\n input: Input,\n _context: ToolUseContext,\n): AsyncGenerator<{\n type: 'result'\n data: Output\n resultForAssistant: string\n}> {\n const absPath = getAbsolutePath(input.filePath) ?? input.filePath\n\n const manager = await getLspManager()\n if (!manager) {\n const ext = extname(absPath)\n const out: Output = {\n operation: input.operation,\n result: `No LSP server available for file type: ${ext}`,\n filePath: input.filePath,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n try {\n const { method, params } = buildLspMethodParams(input, absPath)\n if (!manager.isFileOpen(absPath)) {\n const content = await readFile(absPath, 'utf8')\n await manager.openFile(absPath, content)\n }\n\n const result = await manager.sendRequest(absPath, method, params)\n if (result === undefined) {\n const ext = extname(absPath)\n const out: Output = {\n operation: input.operation,\n result: `No LSP server available for file type: ${ext}`,\n filePath: input.filePath,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n if (\n input.operation === 'goToDefinition' ||\n input.operation === 'goToImplementation'\n ) {\n const locations = coerceLocationArray(result)\n .map(loc => {\n const fileName = uriToFilePath(loc.uri)\n if (!fileName) return null\n const pos = positionFromRangeStart(loc.range)\n if (!pos) return null\n return { fileName, line0: pos.line0, character0: pos.character0 }\n })\n .filter(Boolean) as Array<{\n fileName: string\n line0: number\n character0: number\n }>\n\n const res = formatGoToDefinitionResult(locations)\n const out: Output = {\n operation: input.operation,\n result: res.formatted,\n filePath: input.filePath,\n resultCount: res.resultCount,\n fileCount: res.fileCount,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n if (input.operation === 'findReferences') {\n const locations = coerceLocationArray(result)\n .map(loc => {\n const fileName = uriToFilePath(loc.uri)\n if (!fileName) return null\n const pos = positionFromRangeStart(loc.range)\n if (!pos) return null\n return { fileName, line0: pos.line0, character0: pos.character0 }\n })\n .filter(Boolean) as Array<{\n fileName: string\n line0: number\n character0: number\n }>\n\n const res = formatFindReferencesResult(locations)\n const out: Output = {\n operation: input.operation,\n result: res.formatted,\n filePath: input.filePath,\n resultCount: res.resultCount,\n fileCount: res.fileCount,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n if (input.operation === 'hover') {\n const text = extractHoverText(result)\n const res = formatHoverResult(text, input.line - 1, input.character - 1)\n const out: Output = {\n operation: input.operation,\n result: res.formatted,\n filePath: input.filePath,\n resultCount: res.resultCount,\n fileCount: res.fileCount,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n if (input.operation === 'documentSymbol') {\n const symbols = Array.isArray(result) ? result : []\n\n if (symbols.length === 0) {\n const res = formatDocumentSymbolsResult([], 0)\n const out: Output = {\n operation: input.operation,\n result: res.formatted,\n filePath: input.filePath,\n resultCount: 0,\n fileCount: 0,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n const first = asRecord(symbols[0])\n const isDocumentSymbol = !!first && 'range' in first\n\n // Some LSP servers return SymbolInformation[] (which includes `location`) instead\n // of DocumentSymbol[]. In that case, use the same formatting as workspace symbols.\n if (!isDocumentSymbol) {\n const formatted = formatWorkspaceSymbols(symbols).formatted\n const out: Output = {\n operation: input.operation,\n result: formatted,\n filePath: input.filePath,\n resultCount: symbols.length,\n fileCount: 1,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n const lines: string[] = []\n let count = 0\n\n const walk = (items: unknown[], depth: number) => {\n for (const sym of items) {\n const rec = asRecord(sym)\n if (!rec) continue\n\n const name = typeof rec.name === 'string' ? rec.name : null\n if (!name) continue\n\n const kind = formatSymbolKind(rec.kind)\n const indent = ' '.repeat(depth)\n let line = `${indent}${name} (${kind})`\n\n if (typeof rec.detail === 'string' && rec.detail) {\n line += ` ${rec.detail}`\n }\n\n const range = asRecord(rec.range)\n const start = range ? asRecord(range.start) : null\n const line0 =\n start && typeof start.line === 'number' ? start.line : null\n const displayLine = typeof line0 === 'number' ? line0 + 1 : 1\n line += ` - Line ${displayLine}`\n\n lines.push(line)\n count += 1\n\n const children = Array.isArray(rec.children) ? rec.children : []\n if (children.length > 0) walk(children, depth + 1)\n }\n }\n\n walk(symbols, 0)\n\n const res = formatDocumentSymbolsResult(lines, count)\n const out: Output = {\n operation: input.operation,\n result: res.formatted,\n filePath: input.filePath,\n resultCount: count,\n fileCount: 1,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n if (input.operation === 'workspaceSymbol') {\n const res = formatWorkspaceSymbols(result)\n const out: Output = {\n operation: input.operation,\n result: res.formatted,\n filePath: input.filePath,\n resultCount: res.resultCount,\n fileCount: res.fileCount,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n if (input.operation === 'prepareCallHierarchy') {\n const res = formatCallHierarchyItems(result)\n const out: Output = {\n operation: input.operation,\n result: res.formatted,\n filePath: input.filePath,\n resultCount: res.resultCount,\n fileCount: res.fileCount,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n if (\n input.operation === 'incomingCalls' ||\n input.operation === 'outgoingCalls'\n ) {\n const items = Array.isArray(result) ? result : []\n if (items.length === 0) {\n const out: Output = {\n operation: input.operation,\n result: 'No call hierarchy item found at this position',\n filePath: input.filePath,\n resultCount: 0,\n fileCount: 0,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n const first = items[0]\n const nextMethod =\n input.operation === 'incomingCalls'\n ? 'callHierarchy/incomingCalls'\n : 'callHierarchy/outgoingCalls'\n const nextResult = await manager.sendRequest(absPath, nextMethod, {\n item: first,\n })\n\n const res =\n input.operation === 'incomingCalls'\n ? formatIncomingCalls(nextResult)\n : formatOutgoingCalls(nextResult)\n\n const out: Output = {\n operation: input.operation,\n result: res.formatted,\n filePath: input.filePath,\n resultCount: res.resultCount,\n fileCount: res.fileCount,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n\n const out: Output = {\n operation: input.operation,\n result: `Error performing ${input.operation}: Unsupported operation`,\n filePath: input.filePath,\n resultCount: 0,\n fileCount: 0,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n const out: Output = {\n operation: input.operation,\n result: `Error performing ${input.operation}: ${message}`,\n filePath: input.filePath,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n }\n}\n", "import { extname, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport type { ResolvedLspServerConfig } from './lspConfig'\nimport { LspServer } from './lspServer'\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n if (Array.isArray(value)) return null\n return value as Record<string, unknown>\n}\n\nexport class LspServerManager {\n private readonly servers = new Map<string, LspServer>()\n private readonly extensionToServerNames = new Map<string, string[]>()\n private readonly openFileServerByUri = new Map<string, string>()\n\n constructor(servers: ResolvedLspServerConfig[]) {\n for (const server of servers) {\n const rootPath =\n typeof server.workspaceFolder === 'string' &&\n server.workspaceFolder.trim()\n ? server.workspaceFolder.trim()\n : process.cwd()\n\n try {\n const instance = new LspServer({\n name: server.name,\n config: server,\n rootPath,\n })\n\n this.servers.set(server.name, instance)\n instance.onRequest('workspace/configuration', params => {\n const rec = asRecord(params)\n const items = rec && Array.isArray(rec.items) ? rec.items : []\n return items.map(() => null)\n })\n\n const mapping = server.extensionToLanguage ?? {}\n for (const ext of Object.keys(mapping)) {\n const key = ext.toLowerCase()\n const list = this.extensionToServerNames.get(key) ?? []\n list.push(server.name)\n this.extensionToServerNames.set(key, list)\n }\n } catch {\n continue\n }\n }\n\n // Keep the manager focused on \"query\" operations (definition, hover, refs, symbols).\n }\n\n async initialize(): Promise<void> {\n const starts: Promise<void>[] = []\n for (const server of this.servers.values()) {\n starts.push(server.start().catch(() => {}))\n }\n await Promise.allSettled(starts)\n }\n\n async shutdown(): Promise<void> {\n const errors: Error[] = []\n\n for (const [name, server] of this.servers.entries()) {\n if (server.state !== 'running') continue\n try {\n await server.stop()\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e))\n errors.push(\n new Error(`Failed to stop LSP server ${name}: ${err.message}`),\n )\n }\n }\n\n this.servers.clear()\n this.extensionToServerNames.clear()\n this.openFileServerByUri.clear()\n\n if (errors.length > 0) {\n throw new Error(\n `Failed to stop ${errors.length} LSP server(s): ${errors\n .map(e => e.message)\n .join('; ')}`,\n )\n }\n }\n\n getAllServers(): Map<string, LspServer> {\n return this.servers\n }\n\n getServerForFile(filePath: string): LspServer | undefined {\n const abs = resolve(filePath)\n const ext = extname(abs).toLowerCase()\n const servers = this.extensionToServerNames.get(ext)\n if (!servers || servers.length === 0) return undefined\n const firstName = servers[0]\n if (!firstName) return undefined\n return this.servers.get(firstName)\n }\n\n async ensureServerStarted(filePath: string): Promise<LspServer | undefined> {\n const server = this.getServerForFile(filePath)\n if (!server) return undefined\n if (server.state === 'stopped') {\n await server.start()\n }\n return server\n }\n\n async sendRequest(\n filePath: string,\n method: string,\n params: unknown,\n ): Promise<unknown | undefined> {\n const server = await this.ensureServerStarted(filePath)\n if (!server) return undefined\n return await server.sendRequest(method, params)\n }\n\n async openFile(filePath: string, content: string): Promise<void> {\n const server = await this.ensureServerStarted(filePath)\n if (!server) return\n\n const abs = resolve(filePath)\n const uri = pathToFileURL(abs).href\n\n if (this.openFileServerByUri.get(uri) === server.name) {\n return\n }\n\n const ext = extname(abs).toLowerCase()\n const languageId = server.config.extensionToLanguage?.[ext] ?? 'plaintext'\n\n const version = 1\n await server.sendNotification('textDocument/didOpen', {\n textDocument: {\n uri,\n languageId,\n version,\n text: content,\n },\n })\n\n this.openFileServerByUri.set(uri, server.name)\n }\n\n async changeFile(filePath: string, content: string): Promise<void> {\n const server = this.getServerForFile(filePath)\n if (!server || server.state !== 'running') {\n await this.openFile(filePath, content)\n return\n }\n\n const abs = resolve(filePath)\n const uri = pathToFileURL(abs).href\n\n if (this.openFileServerByUri.get(uri) !== server.name) {\n await this.openFile(filePath, content)\n return\n }\n\n const nextVersion = 1\n await server.sendNotification('textDocument/didChange', {\n textDocument: { uri, version: nextVersion },\n contentChanges: [{ text: content }],\n })\n }\n\n async saveFile(filePath: string): Promise<void> {\n const server = this.getServerForFile(filePath)\n if (!server || server.state !== 'running') return\n\n const abs = resolve(filePath)\n await server.sendNotification('textDocument/didSave', {\n textDocument: { uri: pathToFileURL(abs).href },\n })\n }\n\n async closeFile(filePath: string): Promise<void> {\n const server = this.getServerForFile(filePath)\n if (!server || server.state !== 'running') return\n\n const abs = resolve(filePath)\n const uri = pathToFileURL(abs).href\n await server.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n })\n this.openFileServerByUri.delete(uri)\n }\n\n isFileOpen(filePath: string): boolean {\n const uri = pathToFileURL(resolve(filePath)).href\n return this.openFileServerByUri.has(uri)\n }\n\n async dispose(): Promise<void> {\n await this.shutdown()\n }\n}\n", "import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { basename, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { JsonRpcResponseError, JsonRpcStreamConnection } from './lspJsonRpc'\nimport {\n buildLspServerProcessEnv,\n resolveExecutableFromEnv,\n type LspServerConfig,\n} from './lspConfig'\n\nconst CONTENT_MODIFIED_ERROR_CODE = -32801\nconst MAX_CONTENT_MODIFIED_RETRIES = 3\nconst CONTENT_MODIFIED_RETRY_BASE_MS = 500\nconst DEFAULT_STARTUP_TIMEOUT_MS = 15_000\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 5_000\n\nexport type LspServerRunState =\n | 'stopped'\n | 'starting'\n | 'running'\n | 'stopping'\n | 'error'\n\ntype NotificationHandler = (params: unknown) => void | Promise<void>\ntype RequestHandler = (params: unknown) => unknown | Promise<unknown>\n\nfunction asError(err: unknown): Error {\n return err instanceof Error ? err : new Error(String(err))\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nexport class LspServer {\n readonly name: string\n readonly config: LspServerConfig\n readonly rootPath: string\n\n state: LspServerRunState = 'stopped'\n startTime: Date | undefined\n lastError: Error | undefined\n restartCount = 0\n\n private child: ChildProcessWithoutNullStreams | null = null\n private rpc: JsonRpcStreamConnection | null = null\n private isInitialized = false\n private ignoreExitForPids = new Set<number>()\n\n private readonly notificationHandlers = new Map<\n string,\n Set<NotificationHandler>\n >()\n private readonly requestHandlers = new Map<string, RequestHandler>()\n\n constructor(args: {\n name: string\n config: LspServerConfig\n rootPath: string\n }) {\n this.name = args.name\n this.config = args.config\n this.rootPath = resolve(args.rootPath)\n }\n\n getProcessPid(): number | null {\n return this.child?.pid ?? null\n }\n\n private getShutdownTimeoutMs(): number {\n return DEFAULT_SHUTDOWN_TIMEOUT_MS\n }\n\n onNotification(method: string, handler: NotificationHandler): void {\n const key = String(method ?? '').trim()\n if (!key) return\n\n const set = this.notificationHandlers.get(key) ?? new Set()\n set.add(handler)\n this.notificationHandlers.set(key, set)\n\n if (this.rpc) {\n this.rpc.onNotification(key, handler)\n }\n }\n\n onRequest(method: string, handler: RequestHandler): void {\n const key = String(method ?? '').trim()\n if (!key) return\n\n this.requestHandlers.set(key, handler)\n if (this.rpc) {\n this.rpc.onRequest(key, handler)\n }\n }\n\n private async disposeProcess(): Promise<void> {\n const rpc = this.rpc\n const child = this.child\n this.rpc = null\n this.child = null\n this.isInitialized = false\n\n if (!rpc || !child) {\n rpc?.close()\n try {\n child?.kill()\n } catch {\n // ignore\n }\n return\n }\n\n if (typeof child.pid === 'number') {\n this.ignoreExitForPids.add(child.pid)\n }\n\n try {\n await rpc.sendRequest(\n 'shutdown',\n {},\n { timeoutMs: this.getShutdownTimeoutMs() },\n )\n } catch {\n // ignore\n }\n\n try {\n await rpc.sendNotification('exit', {})\n } catch {\n // ignore\n }\n\n rpc.close()\n\n try {\n child.kill()\n } catch {\n // ignore\n }\n }\n\n private installLifecycleHandlers(): void {\n const child = this.child\n if (!child) return\n\n const pid = child.pid\n child.once('exit', (code, signal) => {\n if (!pid) return\n if (this.ignoreExitForPids.has(pid)) {\n this.ignoreExitForPids.delete(pid)\n return\n }\n\n if (this.state === 'stopping' || this.state === 'stopped') return\n if (this.state === 'error') return\n\n const message = `LSP server exited (${this.name}): code=${code ?? 'null'} signal=${signal ?? 'null'}`\n const err = new Error(message)\n this.lastError = err\n this.state = 'error'\n this.rpc?.close(err)\n })\n\n child.once('error', err => {\n const message = `LSP server spawn error (${this.name}): ${asError(err).message}`\n const e = new Error(message)\n this.lastError = e\n this.state = 'error'\n this.rpc?.close(e)\n })\n }\n\n private installRpcHandlers(): void {\n const rpc = this.rpc\n if (!rpc) return\n\n // Minimal client-side handlers for common server requests.\n rpc.onRequest('client/registerCapability', async () => null)\n rpc.onRequest('client/unregisterCapability', async () => null)\n\n for (const [method, handler] of this.requestHandlers.entries()) {\n rpc.onRequest(method, handler)\n }\n for (const [method, handlers] of this.notificationHandlers.entries()) {\n for (const handler of handlers) {\n rpc.onNotification(method, handler)\n }\n }\n }\n\n async start(): Promise<void> {\n if (this.state === 'running' || this.state === 'starting') return\n\n this.state = 'starting'\n this.lastError = undefined\n this.startTime = undefined\n\n try {\n if (this.config.restartOnCrash !== undefined) {\n throw new Error(\n `LSP server '${this.name}': restartOnCrash is not yet implemented. Remove this field from the configuration.`,\n )\n }\n if (this.config.startupTimeout !== undefined) {\n throw new Error(\n `LSP server '${this.name}': startupTimeout is not yet implemented. Remove this field from the configuration.`,\n )\n }\n if (this.config.shutdownTimeout !== undefined) {\n throw new Error(\n `LSP server '${this.name}': shutdownTimeout is not yet implemented. Remove this field from the configuration.`,\n )\n }\n\n await this.disposeProcess()\n\n const command = String(this.config.command ?? '').trim()\n if (!command) throw new Error('LSP server command is empty')\n\n const args = Array.isArray(this.config.args) ? this.config.args : []\n const cwd =\n typeof this.config.workspaceFolder === 'string' &&\n this.config.workspaceFolder.trim()\n ? this.config.workspaceFolder.trim()\n : this.rootPath\n\n const env = buildLspServerProcessEnv({ cwd, env: this.config.env })\n const resolvedCommand =\n resolveExecutableFromEnv({ command, cwd, env }) ?? command\n\n this.child = spawn(resolvedCommand, args, { stdio: 'pipe', env, cwd })\n this.rpc = new JsonRpcStreamConnection({\n reader: this.child.stdout,\n writer: this.child.stdin,\n })\n\n this.installLifecycleHandlers()\n this.installRpcHandlers()\n\n const rootPath = resolve(cwd)\n const rootUri = pathToFileURL(rootPath).href\n const initializeParams: Record<string, unknown> = {\n processId: process.pid,\n initializationOptions: this.config.initializationOptions ?? {},\n workspaceFolders: [{ uri: rootUri, name: basename(rootPath) }],\n rootPath,\n rootUri,\n capabilities: {\n workspace: { configuration: false, workspaceFolders: false },\n textDocument: {\n synchronization: {\n dynamicRegistration: false,\n willSave: false,\n willSaveWaitUntil: false,\n didSave: true,\n },\n publishDiagnostics: {\n relatedInformation: true,\n tagSupport: { valueSet: [1, 2] },\n versionSupport: false,\n codeDescriptionSupport: true,\n dataSupport: false,\n },\n hover: {\n dynamicRegistration: false,\n contentFormat: ['markdown', 'plaintext'],\n },\n definition: { dynamicRegistration: false, linkSupport: true },\n references: { dynamicRegistration: false },\n documentSymbol: {\n dynamicRegistration: false,\n hierarchicalDocumentSymbolSupport: true,\n },\n callHierarchy: { dynamicRegistration: false },\n },\n general: { positionEncodings: ['utf-16'] },\n },\n }\n\n if (!this.rpc) throw new Error('LSP JSON-RPC connection not started')\n await this.rpc.sendRequest('initialize', initializeParams, {\n timeoutMs: DEFAULT_STARTUP_TIMEOUT_MS,\n })\n await this.rpc.sendNotification('initialized', {})\n\n this.isInitialized = true\n this.state = 'running'\n this.startTime = new Date()\n } catch (err) {\n const e = asError(err)\n this.lastError = e\n this.state = 'error'\n try {\n await this.disposeProcess()\n } catch {\n // ignore\n }\n throw e\n }\n }\n\n async stop(): Promise<void> {\n if (this.state === 'stopped' || this.state === 'stopping') return\n\n this.state = 'stopping'\n try {\n await this.disposeProcess()\n this.state = 'stopped'\n } catch (err) {\n const e = asError(err)\n this.lastError = e\n this.state = 'error'\n throw e\n }\n }\n\n async restart(): Promise<void> {\n try {\n await this.stop()\n } catch (err) {\n throw new Error(\n `Failed to stop LSP server '${this.name}' during restart: ${asError(err).message}`,\n )\n }\n\n this.restartCount += 1\n const max = this.config.maxRestarts ?? 3\n if (this.restartCount > max) {\n throw new Error(\n `Max restart attempts (${max}) exceeded for server '${this.name}'`,\n )\n }\n\n try {\n await this.start()\n } catch (err) {\n throw new Error(\n `Failed to start LSP server '${this.name}' during restart (attempt ${this.restartCount}/${max}): ${asError(err).message}`,\n )\n }\n }\n\n isHealthy(): boolean {\n return this.state === 'running' && this.isInitialized\n }\n\n async sendRequest(method: string, params: unknown): Promise<unknown> {\n if (!this.isHealthy() || !this.rpc) {\n const last = this.lastError\n ? `, last error: ${this.lastError.message}`\n : ''\n throw new Error(\n `Cannot send request to LSP server '${this.name}': server is ${this.state}${last}`,\n )\n }\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt <= MAX_CONTENT_MODIFIED_RETRIES; attempt++) {\n try {\n return await this.rpc.sendRequest(method, params, { timeoutMs: 30_000 })\n } catch (err) {\n const e = asError(err)\n lastError = e\n\n const code =\n err instanceof JsonRpcResponseError ? err.code : (err as any)?.code\n if (\n typeof code === 'number' &&\n code === CONTENT_MODIFIED_ERROR_CODE &&\n attempt < MAX_CONTENT_MODIFIED_RETRIES\n ) {\n const delay = CONTENT_MODIFIED_RETRY_BASE_MS * Math.pow(2, attempt)\n await sleep(delay)\n continue\n }\n break\n }\n }\n\n throw new Error(\n `LSP request '${method}' failed for server '${this.name}': ${lastError?.message ?? 'unknown error'}`,\n )\n }\n\n async sendNotification(method: string, params: unknown): Promise<void> {\n if (!this.isHealthy() || !this.rpc) {\n throw new Error(\n `Cannot send notification to LSP server '${this.name}': server is ${this.state}`,\n )\n }\n\n try {\n await this.rpc.sendNotification(method, params)\n } catch (err) {\n throw new Error(\n `LSP notification '${method}' failed for server '${this.name}': ${asError(err).message}`,\n )\n }\n }\n}\n", "import type { Readable, Writable } from 'node:stream'\n\nexport type JsonRpcErrorObject = {\n code: number\n message: string\n data?: unknown\n}\n\nexport class JsonRpcResponseError extends Error {\n readonly code: number\n readonly data?: unknown\n\n constructor(args: { code: number; message: string; data?: unknown }) {\n super(args.message)\n this.code = args.code\n this.data = args.data\n }\n}\n\nexport type JsonRpcResponse = {\n jsonrpc?: string\n id: number | string | null\n result?: unknown\n error?: JsonRpcErrorObject\n}\n\nexport type JsonRpcRequest = {\n jsonrpc?: string\n id: number | string\n method: string\n params?: unknown\n}\n\nexport type JsonRpcNotification = {\n jsonrpc?: string\n method: string\n params?: unknown\n}\n\ntype JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse\n\ntype Pending = {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n timeout?: NodeJS.Timeout\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n if (Array.isArray(value)) return null\n return value as Record<string, unknown>\n}\n\nfunction extractContentLength(headerText: string): number | null {\n const match = headerText.match(/^\\s*content-length\\s*:\\s*(\\d+)\\s*$/im)\n if (!match) return null\n const n = Number.parseInt(match[1]!, 10)\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\nasync function writeAll(stream: Writable, data: Buffer): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const ok = stream.write(data, err => {\n if (err) reject(err)\n })\n if (ok) {\n resolve()\n return\n }\n stream.once('drain', resolve)\n })\n}\n\nexport class JsonRpcStreamConnection {\n private readonly reader: Readable\n private readonly writer: Writable\n private buffer: Buffer = Buffer.alloc(0)\n private readonly pending = new Map<number | string, Pending>()\n private readonly notificationHandlers = new Map<\n string,\n Set<(params: unknown) => void | Promise<void>>\n >()\n private readonly requestHandlers = new Map<\n string,\n (params: unknown) => unknown | Promise<unknown>\n >()\n private nextId = 1\n private closed = false\n private writeQueue: Promise<void> = Promise.resolve()\n\n constructor(args: { reader: Readable; writer: Writable }) {\n this.reader = args.reader\n this.writer = args.writer\n\n this.reader.on('data', (chunk: Buffer) => {\n if (this.closed) return\n if (!chunk || chunk.length === 0) return\n this.buffer = Buffer.concat([this.buffer, chunk])\n this.processBuffer()\n })\n\n const onClose = () => this.close(new Error('JSON-RPC connection closed'))\n this.reader.once('close', onClose)\n this.reader.once('end', onClose)\n this.reader.once('error', (err: unknown) => {\n const e = err instanceof Error ? err : new Error(String(err))\n this.close(e)\n })\n this.writer.once('error', (err: unknown) => {\n const e = err instanceof Error ? err : new Error(String(err))\n this.close(e)\n })\n }\n\n private processBuffer(): void {\n while (true) {\n const headerEnd = this.buffer.indexOf('\\r\\n\\r\\n')\n if (headerEnd === -1) return\n\n const headerText = this.buffer.slice(0, headerEnd).toString('utf8')\n const len = extractContentLength(headerText)\n if (len === null) {\n // Invalid framing; drop everything to avoid infinite loops.\n this.buffer = Buffer.alloc(0)\n return\n }\n\n const bodyStart = headerEnd + 4\n if (this.buffer.length < bodyStart + len) return\n\n const body = this.buffer.slice(bodyStart, bodyStart + len)\n this.buffer = this.buffer.slice(bodyStart + len)\n\n try {\n const msg = JSON.parse(body.toString('utf8')) as unknown\n this.handleMessage(msg)\n } catch {\n // Ignore malformed messages.\n continue\n }\n }\n }\n\n private handleMessage(msg: unknown): void {\n if (Array.isArray(msg)) {\n for (const entry of msg) this.handleMessage(entry)\n return\n }\n\n const record = asRecord(msg)\n if (!record) return\n\n const method = typeof record.method === 'string' ? record.method : null\n const id = record.id\n const hasId = typeof id === 'number' || typeof id === 'string'\n\n if (method) {\n if (hasId) {\n void this.handleServerRequest(method, id, record.params)\n return\n }\n void this.handleServerNotification(method, record.params)\n return\n }\n\n if (hasId) {\n const pending = this.pending.get(id)\n if (!pending) return\n this.pending.delete(id)\n if (pending.timeout) clearTimeout(pending.timeout)\n\n const error = record.error\n if (error && typeof error === 'object') {\n const errRec = asRecord(error)\n const code = typeof errRec?.code === 'number' ? errRec.code : -32000\n const message =\n typeof errRec?.message === 'string'\n ? errRec.message\n : 'LSP JSON-RPC error'\n const data = errRec?.data\n pending.reject(new JsonRpcResponseError({ code, message, data }))\n return\n }\n pending.resolve(record.result)\n return\n }\n }\n\n onNotification(\n method: string,\n handler: (params: unknown) => void | Promise<void>,\n ): { dispose: () => void } {\n const key = String(method ?? '').trim()\n if (!key) return { dispose: () => {} }\n const set = this.notificationHandlers.get(key) ?? new Set()\n set.add(handler)\n this.notificationHandlers.set(key, set)\n return {\n dispose: () => {\n const handlers = this.notificationHandlers.get(key)\n if (!handlers) return\n handlers.delete(handler)\n if (handlers.size === 0) this.notificationHandlers.delete(key)\n },\n }\n }\n\n onRequest(\n method: string,\n handler: (params: unknown) => unknown | Promise<unknown>,\n ): { dispose: () => void } {\n const key = String(method ?? '').trim()\n if (!key) return { dispose: () => {} }\n this.requestHandlers.set(key, handler)\n return {\n dispose: () => {\n const current = this.requestHandlers.get(key)\n if (current === handler) this.requestHandlers.delete(key)\n },\n }\n }\n\n private async handleServerNotification(\n method: string,\n params: unknown,\n ): Promise<void> {\n const handlers = this.notificationHandlers.get(method)\n if (!handlers || handlers.size === 0) return\n for (const handler of handlers) {\n try {\n await handler(params)\n } catch {\n // Ignore handler errors to avoid crashing the connection.\n }\n }\n }\n\n private async handleServerRequest(\n method: string,\n id: number | string,\n params: unknown,\n ): Promise<void> {\n const handler = this.requestHandlers.get(method)\n if (!handler) {\n await this.sendResponse({\n jsonrpc: '2.0',\n id,\n error: { code: -32601, message: `Method not found: ${method}` },\n })\n return\n }\n\n try {\n const result = await handler(params)\n await this.sendResponse({ jsonrpc: '2.0', id, result: result ?? null })\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n await this.sendResponse({\n jsonrpc: '2.0',\n id,\n error: { code: -32603, message: e.message },\n })\n }\n }\n\n async sendNotification(method: string, params?: unknown): Promise<void> {\n if (this.closed) throw new Error('JSON-RPC connection is closed')\n const msg: JsonRpcNotification = { jsonrpc: '2.0', method, params }\n await this.sendRaw(msg)\n }\n\n async sendRequest(\n method: string,\n params?: unknown,\n options?: { timeoutMs?: number },\n ): Promise<unknown> {\n if (this.closed) throw new Error('JSON-RPC connection is closed')\n const id = this.nextId++\n const msg: JsonRpcRequest = { jsonrpc: '2.0', id, method, params }\n\n const timeoutMs =\n options?.timeoutMs && options.timeoutMs > 0 ? options.timeoutMs : null\n\n const promise = new Promise<unknown>((resolve, reject) => {\n const pending: Pending = { resolve, reject }\n if (timeoutMs) {\n pending.timeout = setTimeout(() => {\n this.pending.delete(id)\n reject(new Error(`LSP request timed out: ${method}`))\n }, timeoutMs)\n }\n this.pending.set(id, pending)\n })\n\n await this.sendRaw(msg)\n return await promise\n }\n\n private async sendResponse(msg: JsonRpcResponse): Promise<void> {\n await this.sendRaw(msg)\n }\n\n private async sendRaw(msg: JsonRpcMessage): Promise<void> {\n const payload = Buffer.from(JSON.stringify(msg), 'utf8')\n const header = Buffer.from(\n `Content-Length: ${payload.length}\\r\\n\\r\\n`,\n 'utf8',\n )\n const frame = Buffer.concat([header, payload])\n\n this.writeQueue = this.writeQueue.then(() => writeAll(this.writer, frame))\n await this.writeQueue\n }\n\n close(reason?: Error): void {\n if (this.closed) return\n this.closed = true\n\n const err = reason ?? new Error('JSON-RPC connection closed')\n for (const [id, pending] of this.pending) {\n this.pending.delete(id)\n if (pending.timeout) clearTimeout(pending.timeout)\n pending.reject(err)\n }\n }\n}\n", "import type { TodoItem as StoredTodoItem } from '#core/utils/todoStorage'\n\nexport type TodoRenderModel =\n | {\n kind: 'empty'\n message: string\n }\n | {\n kind: 'list'\n items: Array<{\n checkbox: '\u2610' | '\u2612'\n checkboxDim: boolean\n content: string\n contentBold: boolean\n contentDim: boolean\n contentStrikethrough: boolean\n }>\n }\n\nexport function getTodoRenderModel(todos: StoredTodoItem[]): TodoRenderModel {\n if (todos.length === 0) {\n return { kind: 'empty', message: 'No todos currently tracked' }\n }\n\n return {\n kind: 'list',\n items: todos.map(todo => {\n const isCompleted = todo.status === 'completed'\n const isInProgress = todo.status === 'in_progress'\n\n return {\n checkbox: isCompleted ? '\u2612' : '\u2610',\n checkboxDim: isCompleted,\n content: todo.content,\n contentBold: isInProgress,\n contentDim: isCompleted,\n contentStrikethrough: isCompleted,\n }\n }),\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "extname", "relative", "existsSync", "normalize", "resolve", "path", "normalize", "resolve", "existsSync", "MAX_LINE_LENGTH", "statSync", "existsSync", "logError", "existsSync", "statSync", "statSync", "fileReadResult", "dimensions", "resolve", "statSync", "data", "MAX_LINE_LENGTH", "relative", "extname", "mkdirSync", "statSync", "dirname", "isAbsolute", "resolve", "z", "_", "inputSchema", "z", "isAbsolute", "resolve", "statSync", "dirname", "mkdirSync", "data", "relative", "relative", "z", "existsSync", "readFileSync", "dirname", "extname", "isAbsolute", "join", "relative", "resolve", "statSync", "isAbsolute", "stat", "statSync", "resolve", "join", "z", "isAbsolute", "resolve", "relative", "readFileSync", "join", "existsSync", "servers", "extname", "fileURLToPath", "pathToFileURL", "readFile", "extname", "resolve", "pathToFileURL", "basename", "resolve", "pathToFileURL", "resolve", "resolve", "pathToFileURL", "basename", "asRecord", "resolve", "extname", "pathToFileURL", "asRecord", "fileURLToPath", "pathToFileURL", "extname", "readFile", "out", "res"]
7
+ }