newcraw 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/REPL-CTTH53A7.js +50 -0
  2. package/dist/{acp-J4WDYGRX.js → acp-25PIN25O.js} +69 -40
  3. package/dist/acp-25PIN25O.js.map +7 -0
  4. package/dist/{agentsValidate-UBOER2IN.js → agentsValidate-BXDD54YP.js} +13 -10
  5. package/dist/{agentsValidate-UBOER2IN.js.map → agentsValidate-BXDD54YP.js.map} +1 -1
  6. package/dist/{ask-MGUO3L35.js → ask-EL4XAA5P.js} +62 -52
  7. package/dist/ask-EL4XAA5P.js.map +7 -0
  8. package/dist/{autoUpdater-2GS6LRPK.js → autoUpdater-DKMSJXWW.js} +5 -4
  9. package/dist/{chunk-2C43OXE7.js → chunk-2OVXJBJV.js} +38 -59
  10. package/dist/chunk-2OVXJBJV.js.map +7 -0
  11. package/dist/{chunk-53A4JHFW.js → chunk-3D3C7MRI.js} +23 -4
  12. package/dist/chunk-3D3C7MRI.js.map +7 -0
  13. package/dist/{chunk-VKI7ORIO.js → chunk-3ZQRACCP.js} +37 -18
  14. package/dist/{chunk-VKI7ORIO.js.map → chunk-3ZQRACCP.js.map} +1 -1
  15. package/dist/chunk-4A6CDBDH.js +822 -0
  16. package/dist/chunk-4A6CDBDH.js.map +7 -0
  17. package/dist/{chunk-VQSCECTS.js → chunk-53VETVCP.js} +6 -4
  18. package/dist/{chunk-VQSCECTS.js.map → chunk-53VETVCP.js.map} +1 -1
  19. package/dist/{chunk-WWDVA4NV.js → chunk-6WT3ZRYF.js} +22 -6
  20. package/dist/{chunk-WWDVA4NV.js.map → chunk-6WT3ZRYF.js.map} +1 -1
  21. package/dist/{chunk-RUXIBQ3B.js → chunk-7E2L7EH2.js} +4 -4
  22. package/dist/{chunk-VHS2MZQS.js → chunk-7PWVUHQ2.js} +9 -6
  23. package/dist/{chunk-VHS2MZQS.js.map → chunk-7PWVUHQ2.js.map} +1 -1
  24. package/dist/{chunk-2EFL22PV.js → chunk-ADJ4YEII.js} +7 -3
  25. package/dist/chunk-ADJ4YEII.js.map +7 -0
  26. package/dist/chunk-AKNZJBBU.js +372 -0
  27. package/dist/chunk-AKNZJBBU.js.map +7 -0
  28. package/dist/chunk-ALQSPHXV.js +135 -0
  29. package/dist/chunk-ALQSPHXV.js.map +7 -0
  30. package/dist/{chunk-XS6PU75S.js → chunk-APSIF3YK.js} +1 -1
  31. package/dist/{chunk-IM33F5CM.js → chunk-BMJ5XGFR.js} +1668 -1623
  32. package/dist/chunk-BMJ5XGFR.js.map +7 -0
  33. package/dist/chunk-BQCOSNM3.js +93 -0
  34. package/dist/chunk-BQCOSNM3.js.map +7 -0
  35. package/dist/{chunk-OJIMOLIC.js → chunk-BTCASL4X.js} +3621 -7413
  36. package/dist/chunk-BTCASL4X.js.map +7 -0
  37. package/dist/chunk-CHB5K4GI.js +107 -0
  38. package/dist/chunk-CHB5K4GI.js.map +7 -0
  39. package/dist/{chunk-QH2M65BR.js → chunk-D2FSAFMO.js} +7 -3
  40. package/dist/{chunk-QH2M65BR.js.map → chunk-D2FSAFMO.js.map} +1 -1
  41. package/dist/chunk-D4OZACS2.js +35 -0
  42. package/dist/{chunk-IIFUDVGS.js → chunk-ENLHVQCX.js} +310 -177
  43. package/dist/chunk-ENLHVQCX.js.map +7 -0
  44. package/dist/{chunk-A7X6OCZE.js → chunk-ERKWSZ3K.js} +1 -1
  45. package/dist/{chunk-UYRR6F5S.js → chunk-FSSZHQEJ.js} +9 -3
  46. package/dist/{chunk-UYRR6F5S.js.map → chunk-FSSZHQEJ.js.map} +1 -1
  47. package/dist/chunk-GV73HKJO.js +5473 -0
  48. package/dist/chunk-GV73HKJO.js.map +7 -0
  49. package/dist/{chunk-GZTCXXSS.js → chunk-GZ4BEVMZ.js} +57 -46
  50. package/dist/{chunk-GZTCXXSS.js.map → chunk-GZ4BEVMZ.js.map} +1 -1
  51. package/dist/chunk-HLBLZKZH.js +45 -0
  52. package/dist/chunk-HLBLZKZH.js.map +7 -0
  53. package/dist/chunk-JLVECHVJ.js +36 -0
  54. package/dist/chunk-JLVECHVJ.js.map +7 -0
  55. package/dist/chunk-KNSAVNMD.js +683 -0
  56. package/dist/{chunk-F3COCCAE.js.map → chunk-KNSAVNMD.js.map} +1 -1
  57. package/dist/{chunk-V5U6BHT2.js → chunk-KRN3WHHL.js} +7 -3
  58. package/dist/{chunk-V5U6BHT2.js.map → chunk-KRN3WHHL.js.map} +1 -1
  59. package/dist/{chunk-3LMXSKZ7.js → chunk-NFYAVT54.js} +1 -1
  60. package/dist/chunk-NT7RDVDA.js +33 -0
  61. package/dist/{chunk-KQSHIOZK.js.map → chunk-NT7RDVDA.js.map} +1 -1
  62. package/dist/chunk-NW7WSLD5.js +166 -0
  63. package/dist/{chunk-ZYSVG4X3.js.map → chunk-NW7WSLD5.js.map} +2 -2
  64. package/dist/{chunk-HSJ6HYAO.js → chunk-P52SGBC4.js} +18 -10
  65. package/dist/chunk-P52SGBC4.js.map +7 -0
  66. package/dist/{chunk-XXU2NVOE.js → chunk-PC6QOCGI.js} +30 -6
  67. package/dist/chunk-PC6QOCGI.js.map +7 -0
  68. package/dist/{chunk-N5OHRWG2.js → chunk-QSRXXZO7.js} +4 -2
  69. package/dist/{chunk-N5OHRWG2.js.map → chunk-QSRXXZO7.js.map} +1 -1
  70. package/dist/{chunk-DEF3KFP7.js → chunk-QZFKONA3.js} +4 -2
  71. package/dist/{chunk-DEF3KFP7.js.map → chunk-QZFKONA3.js.map} +1 -1
  72. package/dist/{chunk-JWXQNBBA.js → chunk-RE226X4F.js} +7 -1
  73. package/dist/{chunk-JWXQNBBA.js.map → chunk-RE226X4F.js.map} +1 -1
  74. package/dist/chunk-RF57YWGW.js +88 -0
  75. package/dist/chunk-RF57YWGW.js.map +7 -0
  76. package/dist/chunk-UGBECBIR.js +62 -0
  77. package/dist/chunk-UGBECBIR.js.map +7 -0
  78. package/dist/chunk-UYWZQVH5.js +35 -0
  79. package/dist/chunk-UYWZQVH5.js.map +7 -0
  80. package/dist/{chunk-LOIZNQOU.js → chunk-VHZRJ7RI.js} +9 -3
  81. package/dist/{chunk-LOIZNQOU.js.map → chunk-VHZRJ7RI.js.map} +1 -1
  82. package/dist/{chunk-XMGUQHMF.js → chunk-VSSVN6WG.js} +11 -1
  83. package/dist/chunk-VSSVN6WG.js.map +7 -0
  84. package/dist/{chunk-OZHBEG7U.js → chunk-XV7LPJNT.js} +15 -5
  85. package/dist/{chunk-OZHBEG7U.js.map → chunk-XV7LPJNT.js.map} +1 -1
  86. package/dist/chunk-Y7MDOB3N.js +65 -0
  87. package/dist/chunk-Y7MDOB3N.js.map +7 -0
  88. package/dist/{chunk-BWYKUDJR.js → chunk-ZLAB3Z4G.js} +14 -8
  89. package/dist/{chunk-BWYKUDJR.js.map → chunk-ZLAB3Z4G.js.map} +1 -1
  90. package/dist/{chunk-755HIAI3.js → chunk-ZMO4E7IW.js} +3 -42
  91. package/dist/chunk-ZMO4E7IW.js.map +7 -0
  92. package/dist/{cli-KZGF3FV5.js → cli-Z2BNJWHT.js} +251 -485
  93. package/dist/cli-Z2BNJWHT.js.map +7 -0
  94. package/dist/commands-3Y3OQOXT.js +54 -0
  95. package/dist/{config-GTJWCNPF.js → config-5RS7HDIK.js} +9 -6
  96. package/dist/{context-WF3TTXQU.js → context-XZXRRYKS.js} +8 -7
  97. package/dist/{costTracker-2G3ZI2JF.js → costTracker-VSWW7SRT.js} +3 -2
  98. package/dist/{customCommands-QOWK57EX.js → customCommands-6KDAODFQ.js} +6 -5
  99. package/dist/{env-37BAP7QF.js → env-WIM2DQ4L.js} +10 -7
  100. package/dist/{gateway-IZYO6YFJ.js → gateway-DKHC7H3K.js} +542 -96
  101. package/dist/gateway-DKHC7H3K.js.map +7 -0
  102. package/dist/identity-3KZQQVBG.js +16 -0
  103. package/dist/index.js +8 -6
  104. package/dist/index.js.map +1 -1
  105. package/dist/{kodeAgentSessionId-KTGFX2BE.js → kodeAgentSessionId-4SH24DVH.js} +1 -1
  106. package/dist/{kodeAgentSessionLoad-6F7SJXBC.js → kodeAgentSessionLoad-4S452GGD.js} +6 -5
  107. package/dist/{kodeAgentSessionResume-UEEDRJ3N.js → kodeAgentSessionResume-MSMG4QUR.js} +6 -5
  108. package/dist/{kodeAgentStreamJson-VIXFTYL5.js → kodeAgentStreamJson-4ZKIWKS3.js} +4 -2
  109. package/dist/{kodeAgentStreamJsonSession-XC3IPREZ.js → kodeAgentStreamJsonSession-CYG6MLKP.js} +15 -4
  110. package/dist/kodeAgentStreamJsonSession-CYG6MLKP.js.map +7 -0
  111. package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js → kodeAgentStructuredStdio-5DCUC6V6.js} +3 -3
  112. package/dist/{kodeHooks-V36SHCTC.js → kodeHooks-WX3N6CL6.js} +6 -5
  113. package/dist/{llm-CYUDKJNR.js → llm-V2W4KJIA.js} +239 -57
  114. package/dist/llm-V2W4KJIA.js.map +7 -0
  115. package/dist/{llmLazy-IXVVBRTN.js → llmLazy-I7SO67YA.js} +2 -2
  116. package/dist/{loader-OEJ6C3TN.js → loader-YJGRGJNH.js} +6 -5
  117. package/dist/{mcp-KE3SILMX.js → mcp-WG3RQQCZ.js} +10 -9
  118. package/dist/{mentionProcessor-GAU2WAYB.js → mentionProcessor-PKWDUKTN.js} +14 -7
  119. package/dist/{mentionProcessor-GAU2WAYB.js.map → mentionProcessor-PKWDUKTN.js.map} +1 -1
  120. package/dist/{messages-WCSGGSEU.js → messages-RXHQ6VKL.js} +2 -2
  121. package/dist/{model-4TQIV5J2.js → model-JNWAZGT7.js} +10 -7
  122. package/dist/{openai-KTZV6F7N.js → openai-6NL5UXO7.js} +8 -7
  123. package/dist/{outputStyles-WX5RYQOA.js → outputStyles-BVPXT3MW.js} +6 -5
  124. package/dist/{pluginRuntime-JXMJZ2LC.js → pluginRuntime-XHI3TCRJ.js} +11 -8
  125. package/dist/{pluginRuntime-JXMJZ2LC.js.map → pluginRuntime-XHI3TCRJ.js.map} +1 -1
  126. package/dist/{pluginValidation-JNQZYLUP.js → pluginValidation-WDFL352C.js} +8 -7
  127. package/dist/prompts-C4RUFGX2.js +58 -0
  128. package/dist/query-IA3UKMGR.js +58 -0
  129. package/dist/{responsesStreaming-2AIT6GHG.js → responsesStreaming-JORGEFQC.js} +1 -1
  130. package/dist/{ripgrep-KDPQAMB2.js → ripgrep-BHDXRABJ.js} +5 -4
  131. package/dist/sandbox-QOXESHL4.js +63 -0
  132. package/dist/{skillMarketplace-IXAGP3Q2.js → skillMarketplace-RIAMO2YA.js} +5 -4
  133. package/dist/{state-MSCYLB6Y.js → state-TM2XZQE2.js} +6 -3
  134. package/dist/structuredOutput-KAVFUV2Z.js +9 -0
  135. package/dist/theme-BXUQNXSD.js +15 -0
  136. package/dist/thinking-BCZ4WDT6.js +18 -0
  137. package/dist/{toolPermissionContext-I3IXPVED.js → toolPermissionContext-JCQ5MFUT.js} +1 -1
  138. package/dist/toolPermissionContext-JCQ5MFUT.js.map +7 -0
  139. package/dist/toolPermissionContextState-ILRPUITK.js +24 -0
  140. package/dist/toolPermissionContextState-ILRPUITK.js.map +7 -0
  141. package/dist/{toolPermissionSettings-EUZKGZU2.js → toolPermissionSettings-LNYZ6XFE.js} +9 -8
  142. package/dist/toolPermissionSettings-LNYZ6XFE.js.map +7 -0
  143. package/dist/tools-HIPUGTF5.js +55 -0
  144. package/dist/tools-HIPUGTF5.js.map +7 -0
  145. package/dist/{userInput-LJL4CVOB.js → userInput-I33T2RX2.js} +49 -34
  146. package/dist/{userInput-LJL4CVOB.js.map → userInput-I33T2RX2.js.map} +1 -1
  147. package/dist/{uuid-VA3KVASX.js → uuid-RQH3OZ3W.js} +1 -1
  148. package/dist/uuid-RQH3OZ3W.js.map +7 -0
  149. package/dist/workspace-EP63OB5S.js +21 -0
  150. package/dist/workspace-EP63OB5S.js.map +7 -0
  151. package/package.json +1 -1
  152. package/web/dist/assets/index-XuLVvSQF.js +251 -0
  153. package/web/dist/assets/index-pSid9IlY.css +10 -0
  154. package/web/dist/index.html +2 -2
  155. package/dist/REPL-IAK7ZN2Z.js +0 -42
  156. package/dist/acp-J4WDYGRX.js.map +0 -7
  157. package/dist/ask-MGUO3L35.js.map +0 -7
  158. package/dist/chunk-2C43OXE7.js.map +0 -7
  159. package/dist/chunk-2EFL22PV.js.map +0 -7
  160. package/dist/chunk-53A4JHFW.js.map +0 -7
  161. package/dist/chunk-755HIAI3.js.map +0 -7
  162. package/dist/chunk-AXWJI6N5.js +0 -11
  163. package/dist/chunk-F3COCCAE.js +0 -654
  164. package/dist/chunk-HSJ6HYAO.js.map +0 -7
  165. package/dist/chunk-IIFUDVGS.js.map +0 -7
  166. package/dist/chunk-IM33F5CM.js.map +0 -7
  167. package/dist/chunk-KQSHIOZK.js +0 -24
  168. package/dist/chunk-OJIMOLIC.js.map +0 -7
  169. package/dist/chunk-XMGUQHMF.js.map +0 -7
  170. package/dist/chunk-XXU2NVOE.js.map +0 -7
  171. package/dist/chunk-ZYSVG4X3.js +0 -151
  172. package/dist/cli-KZGF3FV5.js.map +0 -7
  173. package/dist/commands-AVEBLFVS.js +0 -46
  174. package/dist/gateway-IZYO6YFJ.js.map +0 -7
  175. package/dist/kodeAgentStreamJsonSession-XC3IPREZ.js.map +0 -7
  176. package/dist/llm-CYUDKJNR.js.map +0 -7
  177. package/dist/prompts-LE6GK75N.js +0 -48
  178. package/dist/query-GGIP6PWG.js +0 -50
  179. package/dist/theme-GAMFOLBW.js +0 -14
  180. package/dist/tools-3HOUIDM3.js +0 -47
  181. package/web/dist/assets/index-COAJqX1Z.css +0 -1
  182. package/web/dist/assets/index-CzS_4LmC.js +0 -179
  183. /package/dist/{REPL-IAK7ZN2Z.js.map → REPL-CTTH53A7.js.map} +0 -0
  184. /package/dist/{autoUpdater-2GS6LRPK.js.map → autoUpdater-DKMSJXWW.js.map} +0 -0
  185. /package/dist/{chunk-RUXIBQ3B.js.map → chunk-7E2L7EH2.js.map} +0 -0
  186. /package/dist/{chunk-XS6PU75S.js.map → chunk-APSIF3YK.js.map} +0 -0
  187. /package/dist/{chunk-AXWJI6N5.js.map → chunk-D4OZACS2.js.map} +0 -0
  188. /package/dist/{chunk-A7X6OCZE.js.map → chunk-ERKWSZ3K.js.map} +0 -0
  189. /package/dist/{chunk-3LMXSKZ7.js.map → chunk-NFYAVT54.js.map} +0 -0
  190. /package/dist/{commands-AVEBLFVS.js.map → commands-3Y3OQOXT.js.map} +0 -0
  191. /package/dist/{config-GTJWCNPF.js.map → config-5RS7HDIK.js.map} +0 -0
  192. /package/dist/{context-WF3TTXQU.js.map → context-XZXRRYKS.js.map} +0 -0
  193. /package/dist/{costTracker-2G3ZI2JF.js.map → costTracker-VSWW7SRT.js.map} +0 -0
  194. /package/dist/{customCommands-QOWK57EX.js.map → customCommands-6KDAODFQ.js.map} +0 -0
  195. /package/dist/{env-37BAP7QF.js.map → env-WIM2DQ4L.js.map} +0 -0
  196. /package/dist/{kodeAgentSessionId-KTGFX2BE.js.map → identity-3KZQQVBG.js.map} +0 -0
  197. /package/dist/{kodeAgentSessionLoad-6F7SJXBC.js.map → kodeAgentSessionId-4SH24DVH.js.map} +0 -0
  198. /package/dist/{kodeAgentSessionResume-UEEDRJ3N.js.map → kodeAgentSessionLoad-4S452GGD.js.map} +0 -0
  199. /package/dist/{kodeAgentStreamJson-VIXFTYL5.js.map → kodeAgentSessionResume-MSMG4QUR.js.map} +0 -0
  200. /package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js.map → kodeAgentStreamJson-4ZKIWKS3.js.map} +0 -0
  201. /package/dist/{kodeHooks-V36SHCTC.js.map → kodeAgentStructuredStdio-5DCUC6V6.js.map} +0 -0
  202. /package/dist/{llmLazy-IXVVBRTN.js.map → kodeHooks-WX3N6CL6.js.map} +0 -0
  203. /package/dist/{loader-OEJ6C3TN.js.map → llmLazy-I7SO67YA.js.map} +0 -0
  204. /package/dist/{mcp-KE3SILMX.js.map → loader-YJGRGJNH.js.map} +0 -0
  205. /package/dist/{messages-WCSGGSEU.js.map → mcp-WG3RQQCZ.js.map} +0 -0
  206. /package/dist/{model-4TQIV5J2.js.map → messages-RXHQ6VKL.js.map} +0 -0
  207. /package/dist/{openai-KTZV6F7N.js.map → model-JNWAZGT7.js.map} +0 -0
  208. /package/dist/{outputStyles-WX5RYQOA.js.map → openai-6NL5UXO7.js.map} +0 -0
  209. /package/dist/{pluginValidation-JNQZYLUP.js.map → outputStyles-BVPXT3MW.js.map} +0 -0
  210. /package/dist/{prompts-LE6GK75N.js.map → pluginValidation-WDFL352C.js.map} +0 -0
  211. /package/dist/{query-GGIP6PWG.js.map → prompts-C4RUFGX2.js.map} +0 -0
  212. /package/dist/{responsesStreaming-2AIT6GHG.js.map → query-IA3UKMGR.js.map} +0 -0
  213. /package/dist/{ripgrep-KDPQAMB2.js.map → responsesStreaming-JORGEFQC.js.map} +0 -0
  214. /package/dist/{skillMarketplace-IXAGP3Q2.js.map → ripgrep-BHDXRABJ.js.map} +0 -0
  215. /package/dist/{state-MSCYLB6Y.js.map → sandbox-QOXESHL4.js.map} +0 -0
  216. /package/dist/{theme-GAMFOLBW.js.map → skillMarketplace-RIAMO2YA.js.map} +0 -0
  217. /package/dist/{toolPermissionContext-I3IXPVED.js.map → state-TM2XZQE2.js.map} +0 -0
  218. /package/dist/{toolPermissionSettings-EUZKGZU2.js.map → structuredOutput-KAVFUV2Z.js.map} +0 -0
  219. /package/dist/{tools-3HOUIDM3.js.map → theme-BXUQNXSD.js.map} +0 -0
  220. /package/dist/{uuid-VA3KVASX.js.map → thinking-BCZ4WDT6.js.map} +0 -0
@@ -1,46 +0,0 @@
1
- import { createRequire as __newcrawCreateRequire } from "node:module";
2
- const require = __newcrawCreateRequire(import.meta.url);
3
- import {
4
- getCommand,
5
- getCommands,
6
- hasCommand
7
- } from "./chunk-OJIMOLIC.js";
8
- import "./chunk-XS6PU75S.js";
9
- import "./chunk-WWDVA4NV.js";
10
- import "./chunk-VQSCECTS.js";
11
- import "./chunk-HSJ6HYAO.js";
12
- import "./chunk-3LMXSKZ7.js";
13
- import "./chunk-XXU2NVOE.js";
14
- import "./chunk-JX5ZQYTQ.js";
15
- import "./chunk-XJQATPV7.js";
16
- import "./chunk-V5U6BHT2.js";
17
- import "./chunk-7ZFLZNOW.js";
18
- import "./chunk-VHS2MZQS.js";
19
- import "./chunk-QH2M65BR.js";
20
- import "./chunk-RUXIBQ3B.js";
21
- import "./chunk-JWXQNBBA.js";
22
- import "./chunk-2C43OXE7.js";
23
- import "./chunk-BWYKUDJR.js";
24
- import "./chunk-2EFL22PV.js";
25
- import "./chunk-U7S4MEYP.js";
26
- import "./chunk-UYRR6F5S.js";
27
- import "./chunk-TY3CCSAT.js";
28
- import "./chunk-LOIZNQOU.js";
29
- import "./chunk-INJSFEKL.js";
30
- import "./chunk-2UO3BFZH.js";
31
- import "./chunk-A7X6OCZE.js";
32
- import "./chunk-F3COCCAE.js";
33
- import "./chunk-53A4JHFW.js";
34
- import "./chunk-DEF3KFP7.js";
35
- import "./chunk-IIFUDVGS.js";
36
- import "./chunk-KQSHIOZK.js";
37
- import "./chunk-GZTCXXSS.js";
38
- import "./chunk-IM33F5CM.js";
39
- import "./chunk-ZYSVG4X3.js";
40
- import "./chunk-755HIAI3.js";
41
- import "./chunk-AXWJI6N5.js";
42
- export {
43
- getCommand,
44
- getCommands,
45
- hasCommand
46
- };
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/sessions/manager.ts", "../src/gateway/agentCore.ts", "../src/gateway/middleware.ts", "../src/channels/http.ts", "../src/gateway/gateway.ts", "../src/channels/websocket.ts", "../src/channels/cli.ts", "../src/sessions/storage.ts", "../src/entrypoints/gateway.ts"],
4
- "sourcesContent": ["import type { Session, SessionStorage } from './types'\r\n\r\nexport class SessionManager {\r\n constructor(private storage: SessionStorage) {}\r\n\r\n async getOrCreate(key: string): Promise<Session> {\r\n const existing = await this.storage.load(key)\r\n if (existing) return existing\r\n return this.createNew(key)\r\n }\r\n\r\n async save(session: Session): Promise<void> {\r\n await this.storage.save(session.key, session)\r\n }\r\n\r\n async get(key: string): Promise<Session | null> {\r\n return this.storage.load(key)\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n await this.storage.delete(key)\r\n }\r\n\r\n async listKeys(): Promise<string[]> {\r\n return this.storage.list()\r\n }\r\n\r\n private createNew(key: string): Session {\r\n return {\r\n key,\r\n messages: [],\r\n createdAt: Date.now(),\r\n updatedAt: Date.now(),\r\n metadata: {},\r\n }\r\n }\r\n}\r\n", "import { cwd as processCwd } from 'process'\r\nimport type { Tool } from '@tool'\r\nimport type { CanUseToolFn } from '@newcraw-types/canUseTool'\r\nimport type { Message } from '@query'\r\nimport { createUserMessage, createAssistantMessage } from '@utils/messages'\r\nimport { getDomain } from '../core/domains'\r\nimport { getIdentity, getIdentityPrompt } from '../core/identity'\r\nimport type { SessionMessage } from '../sessions/types'\r\n\r\nexport interface GatewayQueryOptions {\r\n prompt: string\r\n domain?: string\r\n cwd?: string\r\n safeMode?: boolean\r\n tools?: Tool[]\r\n sessionMessages?: Message[]\r\n}\r\n\r\nexport interface GatewayQueryResult {\r\n resultText: string\r\n messages: Message[]\r\n totalCost: number\r\n}\r\n\r\nconst gatewayPermissionHandler: CanUseToolFn = async (\r\n tool,\r\n _input,\r\n _context,\r\n _assistantMessage,\r\n) => {\r\n if (tool.isReadOnly()) {\r\n return { result: true }\r\n }\r\n return { result: true }\r\n}\r\n\r\nasync function loadGatewayTools(domainId: string): Promise<Tool[]> {\r\n const { getTools } = await import('@tools')\r\n const domain = getDomain(domainId)\r\n\r\n const allTools = await getTools()\r\n\r\n if (!domain) return allTools\r\n\r\n const allowedNames = new Set(domain.tools())\r\n const filtered = allTools.filter(t => allowedNames.has(t.name))\r\n return filtered.length > 0 ? filtered : allTools\r\n}\r\n\r\nexport function convertSessionHistory(history: SessionMessage[]): Message[] {\r\n return history.map(msg =>\r\n msg.role === 'user'\r\n ? createUserMessage(msg.content)\r\n : createAssistantMessage(msg.content),\r\n )\r\n}\r\n\r\nexport async function gatewayQuery(options: GatewayQueryOptions): Promise<GatewayQueryResult> {\r\n const { ask } = await import('../app/ask')\r\n const { setCwd } = await import('@utils/state')\r\n\r\n const identity = getIdentity()\r\n const domainId = options.domain ?? identity.domain\r\n const cwd = options.cwd ?? processCwd()\r\n\r\n await setCwd(cwd)\r\n\r\n const tools = options.tools ?? (await loadGatewayTools(domainId))\r\n\r\n const result = await ask({\r\n commands: [],\r\n safeMode: options.safeMode ?? false,\r\n hasPermissionsToUseTool: gatewayPermissionHandler,\r\n messageLogName: `gateway-${Date.now()}`,\r\n prompt: options.prompt,\r\n cwd,\r\n tools,\r\n verbose: false,\r\n initialMessages: options.sessionMessages,\r\n persistSession: false,\r\n domain: domainId,\r\n })\r\n\r\n return {\r\n resultText: result.resultText,\r\n messages: [],\r\n totalCost: result.totalCost,\r\n }\r\n}\r\n\r\nexport async function* gatewayQueryStream(options: GatewayQueryOptions): AsyncGenerator<{\r\n type: 'text' | 'tool_call' | 'tool_result' | 'thinking' | 'done'\r\n content: string\r\n}> {\r\n const { query } = await import('@query')\r\n const { getSystemPrompt } = await import('@constants/prompts')\r\n const { getContext } = await import('@context')\r\n const { setCwd } = await import('@utils/state')\r\n\r\n const identity = getIdentity()\r\n const domainId = options.domain ?? identity.domain\r\n const cwd = options.cwd ?? processCwd()\r\n\r\n await setCwd(cwd)\r\n\r\n const tools = options.tools ?? (await loadGatewayTools(domainId))\r\n\r\n const [systemPrompt, context] = await Promise.all([\r\n getSystemPrompt({ domain: domainId }),\r\n getContext(),\r\n ])\r\n\r\n const userMessage = createUserMessage(options.prompt)\r\n const messages: Message[] = [...(options.sessionMessages ?? []), userMessage]\r\n const abortController = new AbortController()\r\n\r\n const seenToolUseIds = new Set<string>()\r\n\r\n for await (const msg of query(\r\n messages,\r\n systemPrompt,\r\n context,\r\n gatewayPermissionHandler,\r\n {\r\n options: {\r\n commands: [],\r\n tools,\r\n verbose: false,\r\n safeMode: options.safeMode ?? false,\r\n forkNumber: 0,\r\n messageLogName: `gateway-${Date.now()}`,\r\n maxThinkingTokens: 0,\r\n persistSession: false,\r\n shouldAvoidPermissionPrompts: true,\r\n },\r\n abortController,\r\n messageId: undefined,\r\n readFileTimestamps: {},\r\n setToolJSX: () => {},\r\n },\r\n )) {\r\n if (msg.type === 'assistant') {\r\n for (const block of msg.message.content) {\r\n if (block.type === 'text' && block.text) {\r\n yield { type: 'text', content: block.text }\r\n } else if (block.type === 'thinking' && (block as any).thinking) {\r\n yield { type: 'thinking', content: (block as any).thinking }\r\n } else if (block.type === 'tool_use') {\r\n seenToolUseIds.add(block.id)\r\n const inputBrief = JSON.stringify(block.input).slice(0, 200)\r\n yield { type: 'tool_call', content: `${block.name}(${inputBrief})` }\r\n }\r\n }\r\n } else if (msg.type === 'progress') {\r\n for (const block of msg.content.message.content) {\r\n if (block.type === 'tool_use' && !seenToolUseIds.has(block.id)) {\r\n seenToolUseIds.add(block.id)\r\n const inputBrief = JSON.stringify(block.input).slice(0, 200)\r\n yield { type: 'tool_call', content: `${block.name}(${inputBrief})` }\r\n }\r\n }\r\n } else if (msg.type === 'user') {\r\n const content = msg.message.content\r\n if (Array.isArray(content)) {\r\n for (const block of content as any[]) {\r\n if (block.type === 'tool_result') {\r\n const raw = typeof block.content === 'string'\r\n ? block.content\r\n : JSON.stringify(block.content)\r\n yield { type: 'tool_result', content: raw.slice(0, 500) }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n yield { type: 'done', content: '' }\r\n}\r\n", "import type { UnifiedMessage, AgentResponse } from '../channels/types'\r\n\r\nexport interface MiddlewareContext {\r\n message: UnifiedMessage\r\n channelId: string\r\n startTime: number\r\n metadata: Record<string, unknown>\r\n}\r\n\r\nexport type NextFn = () => Promise<void>\r\nexport type Middleware = (ctx: MiddlewareContext, next: NextFn) => Promise<void>\r\n\r\nexport function composeMiddleware(middlewares: Middleware[]): Middleware {\r\n return async (ctx, next) => {\r\n let index = -1\r\n async function dispatch(i: number): Promise<void> {\r\n if (i <= index) throw new Error('next() called multiple times')\r\n index = i\r\n const fn = i < middlewares.length ? middlewares[i] : next\r\n await fn(ctx, () => dispatch(i + 1))\r\n }\r\n await dispatch(0)\r\n }\r\n}\r\n\r\nexport function loggingMiddleware(): Middleware {\r\n return async (ctx, next) => {\r\n const { channelId, message } = ctx\r\n const preview = message.text.length > 80\r\n ? message.text.slice(0, 80) + '...'\r\n : message.text\r\n console.log(`[${new Date().toISOString()}] ${channelId}:${message.sessionKey} \u2190 \"${preview}\"`)\r\n\r\n await next()\r\n\r\n const elapsed = Date.now() - ctx.startTime\r\n console.log(`[${new Date().toISOString()}] ${channelId}:${message.sessionKey} \u2192 done (${elapsed}ms)`)\r\n }\r\n}\r\n\r\nexport function rateLimitMiddleware(options: {\r\n windowMs?: number\r\n maxRequests?: number\r\n} = {}): Middleware {\r\n const windowMs = options.windowMs ?? 60_000\r\n const maxRequests = options.maxRequests ?? 30\r\n const hits = new Map<string, number[]>()\r\n\r\n return async (ctx, next) => {\r\n const key = `${ctx.message.sessionKey}`\r\n const now = Date.now()\r\n const timestamps = hits.get(key) ?? []\r\n\r\n const windowStart = now - windowMs\r\n const recent = timestamps.filter(t => t > windowStart)\r\n\r\n if (recent.length >= maxRequests) {\r\n ctx.metadata.rateLimited = true\r\n throw new Error(`Rate limit exceeded: ${maxRequests} requests per ${windowMs / 1000}s`)\r\n }\r\n\r\n recent.push(now)\r\n hits.set(key, recent)\r\n\r\n if (hits.size > 10_000) {\r\n for (const [k, v] of hits) {\r\n const filtered = v.filter(t => t > windowStart)\r\n if (filtered.length === 0) hits.delete(k)\r\n else hits.set(k, filtered)\r\n }\r\n }\r\n\r\n await next()\r\n }\r\n}\r\n\r\nexport function maxConcurrencyMiddleware(options: {\r\n maxPerSession?: number\r\n} = {}): Middleware {\r\n const max = options.maxPerSession ?? 1\r\n const active = new Map<string, number>()\r\n\r\n return async (ctx, next) => {\r\n const key = ctx.message.sessionKey\r\n const current = active.get(key) ?? 0\r\n\r\n if (current >= max) {\r\n throw new Error('Another request is already in progress for this session')\r\n }\r\n\r\n active.set(key, current + 1)\r\n try {\r\n await next()\r\n } finally {\r\n const val = active.get(key) ?? 1\r\n if (val <= 1) active.delete(key)\r\n else active.set(key, val - 1)\r\n }\r\n }\r\n}\r\n", "import { createServer, type IncomingMessage, type ServerResponse } from 'http'\r\nimport { randomUUID } from 'crypto'\r\nimport { resolve, join, extname } from 'path'\r\nimport { readFile, stat } from 'fs/promises'\r\nimport type { Channel, AgentResponse, MessageHandler } from './types'\r\n\r\nconst MIME_TYPES: Record<string, string> = {\r\n '.html': 'text/html; charset=utf-8',\r\n '.js': 'application/javascript; charset=utf-8',\r\n '.css': 'text/css; charset=utf-8',\r\n '.json': 'application/json; charset=utf-8',\r\n '.png': 'image/png',\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.gif': 'image/gif',\r\n '.svg': 'image/svg+xml',\r\n '.ico': 'image/x-icon',\r\n '.woff': 'font/woff',\r\n '.woff2': 'font/woff2',\r\n '.ttf': 'font/ttf',\r\n '.webp': 'image/webp',\r\n}\r\n\r\nexport interface HttpChannelConfig {\r\n port: number\r\n host?: string\r\n authToken?: string\r\n corsOrigin?: string\r\n webDistDir?: string\r\n}\r\n\r\ntype StreamHandler = (msg: import('./types').UnifiedMessage, res: ServerResponse) => Promise<void>\r\n\r\nexport class HttpChannel implements Channel {\r\n readonly id = 'http'\r\n readonly name = 'HTTP API'\r\n\r\n private server: ReturnType<typeof createServer> | null = null\r\n private handler: MessageHandler | null = null\r\n private streamHandler: StreamHandler | null = null\r\n private pendingResponses = new Map<string, AgentResponse[]>()\r\n\r\n constructor(private config: HttpChannelConfig) {}\r\n\r\n onMessage(handler: MessageHandler): void {\r\n this.handler = handler\r\n }\r\n\r\n onStreamMessage(handler: StreamHandler): void {\r\n this.streamHandler = handler\r\n }\r\n\r\n async start(): Promise<void> {\r\n this.server = createServer((req, res) => this.handleRequest(req, res))\r\n await new Promise<void>((resolve) => {\r\n this.server!.listen(this.config.port, this.config.host ?? '0.0.0.0', resolve)\r\n })\r\n console.log(`[HTTP] Listening on ${this.config.host ?? '0.0.0.0'}:${this.config.port}`)\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (this.server) {\r\n await new Promise<void>((resolve) => this.server!.close(() => resolve()))\r\n this.server = null\r\n }\r\n }\r\n\r\n async sendResponse(requestId: string, response: AgentResponse): Promise<void> {\r\n const pending = this.pendingResponses.get(requestId)\r\n if (pending) {\r\n pending.push(response)\r\n }\r\n }\r\n\r\n private setCorsHeaders(res: ServerResponse): void {\r\n const origin = this.config.corsOrigin ?? '*'\r\n res.setHeader('Access-Control-Allow-Origin', origin)\r\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')\r\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization')\r\n }\r\n\r\n private checkAuth(req: IncomingMessage, res: ServerResponse): boolean {\r\n if (!this.config.authToken) return true\r\n const auth = req.headers.authorization\r\n if (auth !== `Bearer ${this.config.authToken}`) {\r\n res.writeHead(401, { 'Content-Type': 'application/json' })\r\n res.end(JSON.stringify({ error: 'Unauthorized' }))\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n this.setCorsHeaders(res)\r\n\r\n if (req.method === 'OPTIONS') {\r\n res.writeHead(204)\r\n res.end()\r\n return\r\n }\r\n\r\n if (req.method === 'GET' && req.url === '/health') {\r\n res.setHeader('Content-Type', 'application/json')\r\n res.writeHead(200)\r\n res.end(JSON.stringify({ status: 'ok', timestamp: Date.now() }))\r\n return\r\n }\r\n\r\n if (req.method === 'POST' && req.url === '/api/chat') {\r\n await this.handleChat(req, res)\r\n return\r\n }\r\n\r\n if (req.method === 'POST' && req.url === '/api/chat/stream') {\r\n await this.handleChatStream(req, res)\r\n return\r\n }\r\n\r\n // Static file serving for web UI (SPA fallback)\r\n if (req.method === 'GET' && this.config.webDistDir) {\r\n const served = await this.serveStatic(req, res)\r\n if (served) return\r\n }\r\n\r\n res.setHeader('Content-Type', 'application/json')\r\n res.writeHead(404)\r\n res.end(JSON.stringify({ error: 'Not found' }))\r\n }\r\n\r\n private async serveStatic(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\r\n const distDir = this.config.webDistDir\r\n if (!distDir) return false\r\n\r\n const urlPath = new URL(req.url ?? '/', `http://${req.headers.host}`).pathname\r\n const safePath = urlPath.replace(/\\.\\./g, '').replace(/\\/+/g, '/')\r\n\r\n // Try the exact file first, then fallback to index.html (SPA)\r\n const candidates = [\r\n join(distDir, safePath),\r\n join(distDir, safePath, 'index.html'),\r\n ]\r\n\r\n for (const filePath of candidates) {\r\n const resolved = resolve(filePath)\r\n if (!resolved.startsWith(resolve(distDir))) continue\r\n\r\n try {\r\n const fileStat = await stat(resolved)\r\n if (fileStat.isFile()) {\r\n const ext = extname(resolved)\r\n const mime = MIME_TYPES[ext] ?? 'application/octet-stream'\r\n const content = await readFile(resolved)\r\n res.setHeader('Content-Type', mime)\r\n if (ext !== '.html') {\r\n res.setHeader('Cache-Control', 'public, max-age=31536000, immutable')\r\n }\r\n res.writeHead(200)\r\n res.end(content)\r\n return true\r\n }\r\n } catch {\r\n // file not found, continue\r\n }\r\n }\r\n\r\n // SPA fallback: serve index.html for non-file paths\r\n try {\r\n const indexPath = join(distDir, 'index.html')\r\n const content = await readFile(indexPath)\r\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\r\n res.writeHead(200)\r\n res.end(content)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n private async handleChat(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n res.setHeader('Content-Type', 'application/json')\r\n if (!this.checkAuth(req, res)) return\r\n\r\n try {\r\n const body = await readBody(req)\r\n const { message, userId = 'default', sessionKey } = JSON.parse(body)\r\n\r\n if (!message || typeof message !== 'string') {\r\n res.writeHead(400)\r\n res.end(JSON.stringify({ error: 'Missing \"message\" field' }))\r\n return\r\n }\r\n\r\n if (!this.handler) {\r\n res.writeHead(503)\r\n res.end(JSON.stringify({ error: 'No handler registered' }))\r\n return\r\n }\r\n\r\n const requestId = randomUUID()\r\n this.pendingResponses.set(requestId, [])\r\n\r\n await this.handler({\r\n channelId: 'http',\r\n userId: requestId,\r\n sessionKey: sessionKey ?? `http:${userId}`,\r\n text: message,\r\n metadata: { originalUserId: userId, requestId },\r\n })\r\n\r\n const responses = this.pendingResponses.get(requestId) ?? []\r\n this.pendingResponses.delete(requestId)\r\n\r\n const textParts = responses\r\n .filter(r => r.type === 'text')\r\n .map(r => r.content)\r\n\r\n res.writeHead(200)\r\n res.end(JSON.stringify({\r\n response: textParts.join('\\n'),\r\n details: responses.filter(r => r.type !== 'done'),\r\n }))\r\n } catch (err: any) {\r\n res.writeHead(500)\r\n res.end(JSON.stringify({ error: err.message ?? 'Internal server error' }))\r\n }\r\n }\r\n\r\n private async handleChatStream(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n if (!this.checkAuth(req, res)) return\r\n\r\n try {\r\n const body = await readBody(req)\r\n const { message, userId = 'default', sessionKey } = JSON.parse(body)\r\n\r\n if (!message || typeof message !== 'string') {\r\n res.setHeader('Content-Type', 'application/json')\r\n res.writeHead(400)\r\n res.end(JSON.stringify({ error: 'Missing \"message\" field' }))\r\n return\r\n }\r\n\r\n if (!this.streamHandler) {\r\n res.setHeader('Content-Type', 'application/json')\r\n res.writeHead(503)\r\n res.end(JSON.stringify({ error: 'Streaming not available' }))\r\n return\r\n }\r\n\r\n res.writeHead(200, {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n 'X-Accel-Buffering': 'no',\r\n })\r\n\r\n const unifiedMsg: import('./types').UnifiedMessage = {\r\n channelId: 'http',\r\n userId,\r\n sessionKey: sessionKey ?? `http:${userId}`,\r\n text: message,\r\n metadata: { requestId: randomUUID() },\r\n }\r\n\r\n await this.streamHandler(unifiedMsg, res)\r\n } catch (err: any) {\r\n if (!res.headersSent) {\r\n res.setHeader('Content-Type', 'application/json')\r\n res.writeHead(500)\r\n res.end(JSON.stringify({ error: err.message ?? 'Internal server error' }))\r\n } else {\r\n writeSseEvent(res, 'error', { error: err.message ?? 'Internal server error' })\r\n res.end()\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function writeSseEvent(res: ServerResponse, event: string, data: unknown): void {\r\n res.write(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`)\r\n}\r\n\r\nfunction readBody(req: IncomingMessage): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const chunks: Buffer[] = []\r\n let size = 0\r\n const MAX_BODY_SIZE = 1024 * 1024\r\n\r\n req.on('data', (chunk: Buffer) => {\r\n size += chunk.length\r\n if (size > MAX_BODY_SIZE) {\r\n req.destroy()\r\n reject(new Error('Request body too large'))\r\n return\r\n }\r\n chunks.push(chunk)\r\n })\r\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')))\r\n req.on('error', reject)\r\n })\r\n}\r\n", "import type { ServerResponse } from 'http'\r\nimport type { Channel, UnifiedMessage, AgentResponse } from '../channels/types'\r\nimport { SessionManager } from '../sessions/manager'\r\nimport type { Session, SessionStorage } from '../sessions/types'\r\nimport { getIdentity } from '../core/identity'\r\nimport { gatewayQuery, gatewayQueryStream, convertSessionHistory } from './agentCore'\r\nimport { type Middleware, type MiddlewareContext, composeMiddleware } from './middleware'\r\nimport { HttpChannel, writeSseEvent } from '../channels/http'\r\n\r\nexport interface GatewayConfig {\r\n storage: SessionStorage\r\n domain?: string\r\n cwd?: string\r\n safeMode?: boolean\r\n middleware?: Middleware[]\r\n onError?: (error: Error, context?: string) => void\r\n}\r\n\r\nexport class Gateway {\r\n private channels = new Map<string, Channel>()\r\n private sessions: SessionManager\r\n private config: GatewayConfig\r\n private middlewareChain: Middleware | null = null\r\n\r\n constructor(config: GatewayConfig) {\r\n this.config = config\r\n this.sessions = new SessionManager(config.storage)\r\n if (config.middleware && config.middleware.length > 0) {\r\n this.middlewareChain = composeMiddleware(config.middleware)\r\n }\r\n }\r\n\r\n registerChannel(channel: Channel): void {\r\n if (this.channels.has(channel.id)) {\r\n throw new Error(`Channel \"${channel.id}\" is already registered`)\r\n }\r\n this.channels.set(channel.id, channel)\r\n channel.onMessage((msg) => this.handleMessage(channel, msg))\r\n\r\n if (channel instanceof HttpChannel) {\r\n channel.onStreamMessage((msg, res) => this.handleSseStream(msg, res))\r\n }\r\n }\r\n\r\n getChannel(id: string): Channel | undefined {\r\n return this.channels.get(id)\r\n }\r\n\r\n listChannels(): Channel[] {\r\n return [...this.channels.values()]\r\n }\r\n\r\n getSessionManager(): SessionManager {\r\n return this.sessions\r\n }\r\n\r\n private async runWithMiddleware(\r\n channel: Channel,\r\n msg: UnifiedMessage,\r\n handler: () => Promise<void>,\r\n ): Promise<void> {\r\n if (!this.middlewareChain) {\r\n await handler()\r\n return\r\n }\r\n\r\n const ctx: MiddlewareContext = {\r\n message: msg,\r\n channelId: channel.id,\r\n startTime: Date.now(),\r\n metadata: {},\r\n }\r\n\r\n await this.middlewareChain(ctx, handler)\r\n }\r\n\r\n private async handleMessage(channel: Channel, msg: UnifiedMessage): Promise<void> {\r\n try {\r\n await this.runWithMiddleware(channel, msg, async () => {\r\n const session = await this.sessions.getOrCreate(msg.sessionKey)\r\n const domainId = this.config.domain ?? getIdentity().domain\r\n\r\n session.messages.push({\r\n role: 'user',\r\n content: msg.text,\r\n timestamp: Date.now(),\r\n })\r\n\r\n const isStreamCapable = !(channel instanceof HttpChannel)\r\n\r\n if (isStreamCapable) {\r\n await this.handleStreamingChannel(channel, msg, domainId, session)\r\n } else {\r\n await this.handleBlockingChannel(channel, msg, domainId, session)\r\n }\r\n })\r\n } catch (err: any) {\r\n this.config.onError?.(err, `channel=${channel.id} user=${msg.userId}`)\r\n await channel.sendResponse(msg.userId, {\r\n type: 'error',\r\n content: err.message ?? 'Internal error',\r\n })\r\n }\r\n }\r\n\r\n private async handleBlockingChannel(\r\n channel: Channel,\r\n msg: UnifiedMessage,\r\n domainId: string,\r\n session: Session,\r\n ): Promise<void> {\r\n const history = session.messages.slice(0, -1)\r\n const result = await gatewayQuery({\r\n prompt: msg.text,\r\n domain: domainId,\r\n cwd: this.config.cwd,\r\n safeMode: this.config.safeMode,\r\n sessionMessages: convertSessionHistory(history),\r\n })\r\n\r\n session.messages.push({\r\n role: 'assistant',\r\n content: result.resultText,\r\n timestamp: Date.now(),\r\n })\r\n await this.sessions.save(session)\r\n\r\n await channel.sendResponse(msg.userId, {\r\n type: 'text',\r\n content: result.resultText,\r\n })\r\n await channel.sendResponse(msg.userId, { type: 'done', content: '' })\r\n }\r\n\r\n private async handleStreamingChannel(\r\n channel: Channel,\r\n msg: UnifiedMessage,\r\n domainId: string,\r\n session: Session,\r\n ): Promise<void> {\r\n const chunks: string[] = []\r\n const history = session.messages.slice(0, -1)\r\n\r\n for await (const chunk of gatewayQueryStream({\r\n prompt: msg.text,\r\n domain: domainId,\r\n cwd: this.config.cwd,\r\n safeMode: this.config.safeMode,\r\n sessionMessages: convertSessionHistory(history),\r\n })) {\r\n if (chunk.type === 'text') {\r\n chunks.push(chunk.content)\r\n }\r\n await channel.sendResponse(msg.userId, {\r\n type: chunk.type as AgentResponse['type'],\r\n content: chunk.content,\r\n })\r\n }\r\n\r\n session.messages.push({\r\n role: 'assistant',\r\n content: chunks.join(''),\r\n timestamp: Date.now(),\r\n })\r\n await this.sessions.save(session)\r\n }\r\n\r\n private async handleSseStream(msg: UnifiedMessage, res: ServerResponse): Promise<void> {\r\n const domainId = this.config.domain ?? getIdentity().domain\r\n const session = await this.sessions.getOrCreate(msg.sessionKey)\r\n\r\n session.messages.push({\r\n role: 'user',\r\n content: msg.text,\r\n timestamp: Date.now(),\r\n })\r\n\r\n const chunks: string[] = []\r\n\r\n const history = session.messages.slice(0, -1)\r\n\r\n try {\r\n for await (const chunk of gatewayQueryStream({\r\n prompt: msg.text,\r\n domain: domainId,\r\n cwd: this.config.cwd,\r\n safeMode: this.config.safeMode,\r\n sessionMessages: convertSessionHistory(history),\r\n })) {\r\n if (chunk.type === 'text') {\r\n chunks.push(chunk.content)\r\n }\r\n writeSseEvent(res, chunk.type, { content: chunk.content })\r\n }\r\n\r\n session.messages.push({\r\n role: 'assistant',\r\n content: chunks.join(''),\r\n timestamp: Date.now(),\r\n })\r\n await this.sessions.save(session)\r\n } catch (err: any) {\r\n writeSseEvent(res, 'error', { error: err.message ?? 'Internal error' })\r\n this.config.onError?.(err, `sse user=${msg.userId}`)\r\n } finally {\r\n res.end()\r\n }\r\n }\r\n\r\n async start(): Promise<void> {\r\n const startPromises = [...this.channels.values()].map(ch => ch.start())\r\n await Promise.all(startPromises)\r\n const identity = getIdentity()\r\n console.log(`[Gateway] Started with ${this.channels.size} channel(s) \u2014 identity: ${identity.name}, domain: ${this.config.domain ?? identity.domain}`)\r\n }\r\n\r\n async stop(): Promise<void> {\r\n const stopPromises = [...this.channels.values()].map(ch => ch.stop())\r\n await Promise.all(stopPromises)\r\n console.log('[Gateway] Stopped')\r\n }\r\n}\r\n", "import { createServer, type Server as HttpServer } from 'http'\r\nimport { WebSocketServer, type WebSocket } from 'ws'\r\nimport { randomUUID } from 'crypto'\r\nimport type { Channel, AgentResponse, MessageHandler, UnifiedMessage } from './types'\r\n\r\nexport interface WebSocketChannelConfig {\r\n port: number\r\n host?: string\r\n authToken?: string\r\n /** Attach to an existing HTTP server instead of creating one */\r\n server?: HttpServer\r\n}\r\n\r\ninterface WsClient {\r\n ws: WebSocket\r\n userId: string\r\n sessionKey: string\r\n}\r\n\r\nexport class WebSocketChannel implements Channel {\r\n readonly id = 'websocket'\r\n readonly name = 'WebSocket'\r\n\r\n private wss: WebSocketServer | null = null\r\n private ownServer: HttpServer | null = null\r\n private handler: MessageHandler | null = null\r\n private clients = new Map<string, WsClient>()\r\n private pendingResponses = new Map<string, AgentResponse[]>()\r\n\r\n constructor(private config: WebSocketChannelConfig) {}\r\n\r\n onMessage(handler: MessageHandler): void {\r\n this.handler = handler\r\n }\r\n\r\n async start(): Promise<void> {\r\n if (this.config.server) {\r\n this.wss = new WebSocketServer({ server: this.config.server })\r\n } else {\r\n this.ownServer = createServer()\r\n this.wss = new WebSocketServer({ server: this.ownServer })\r\n await new Promise<void>((resolve) => {\r\n this.ownServer!.listen(this.config.port, this.config.host ?? '0.0.0.0', resolve)\r\n })\r\n console.log(`[WebSocket] Listening on ${this.config.host ?? '0.0.0.0'}:${this.config.port}`)\r\n }\r\n\r\n this.wss.on('connection', (ws, req) => this.handleConnection(ws, req))\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (this.wss) {\r\n for (const client of this.clients.values()) {\r\n client.ws.close(1001, 'Server shutting down')\r\n }\r\n this.clients.clear()\r\n this.wss.close()\r\n this.wss = null\r\n }\r\n if (this.ownServer) {\r\n await new Promise<void>((resolve) => this.ownServer!.close(() => resolve()))\r\n this.ownServer = null\r\n }\r\n }\r\n\r\n async sendResponse(clientId: string, response: AgentResponse): Promise<void> {\r\n const client = this.clients.get(clientId)\r\n if (client && client.ws.readyState === 1 /* OPEN */) {\r\n client.ws.send(JSON.stringify({\r\n type: 'response',\r\n data: response,\r\n }))\r\n }\r\n\r\n const pending = this.pendingResponses.get(clientId)\r\n if (pending) {\r\n pending.push(response)\r\n }\r\n }\r\n\r\n private handleConnection(ws: WebSocket, req: import('http').IncomingMessage): void {\r\n if (this.config.authToken) {\r\n const url = new URL(req.url ?? '/', `http://${req.headers.host}`)\r\n const token = url.searchParams.get('token')\r\n if (token !== this.config.authToken) {\r\n ws.close(4001, 'Unauthorized')\r\n return\r\n }\r\n }\r\n\r\n const clientId = randomUUID()\r\n this.clients.set(clientId, {\r\n ws,\r\n userId: clientId,\r\n sessionKey: `ws:${clientId}`,\r\n })\r\n\r\n ws.on('message', (raw) => this.handleWsMessage(clientId, raw))\r\n ws.on('close', () => {\r\n this.clients.delete(clientId)\r\n })\r\n ws.on('error', (err) => {\r\n console.error(`[WebSocket] Client ${clientId} error:`, err.message)\r\n this.clients.delete(clientId)\r\n })\r\n\r\n ws.send(JSON.stringify({\r\n type: 'connected',\r\n data: { clientId },\r\n }))\r\n }\r\n\r\n private async handleWsMessage(clientId: string, raw: import('ws').RawData): Promise<void> {\r\n let parsed: any\r\n try {\r\n parsed = JSON.parse(String(raw))\r\n } catch {\r\n this.sendToClient(clientId, {\r\n type: 'error',\r\n data: { error: 'Invalid JSON' },\r\n })\r\n return\r\n }\r\n\r\n const { type, message, userId, sessionKey } = parsed\r\n\r\n if (type === 'ping') {\r\n this.sendToClient(clientId, { type: 'pong', data: {} })\r\n return\r\n }\r\n\r\n if (type !== 'chat' || !message || typeof message !== 'string') {\r\n this.sendToClient(clientId, {\r\n type: 'error',\r\n data: { error: 'Expected { type: \"chat\", message: \"...\" }' },\r\n })\r\n return\r\n }\r\n\r\n if (!this.handler) {\r\n this.sendToClient(clientId, {\r\n type: 'error',\r\n data: { error: 'No handler registered' },\r\n })\r\n return\r\n }\r\n\r\n const resolvedUserId = userId ?? clientId\r\n const resolvedSessionKey = sessionKey ?? `ws:${resolvedUserId}`\r\n\r\n const client = this.clients.get(clientId)\r\n if (client) {\r\n client.userId = resolvedUserId\r\n client.sessionKey = resolvedSessionKey\r\n }\r\n\r\n try {\r\n await this.handler({\r\n channelId: 'websocket',\r\n userId: clientId,\r\n sessionKey: resolvedSessionKey,\r\n text: message,\r\n metadata: { originalUserId: resolvedUserId },\r\n })\r\n } catch (err: any) {\r\n this.sendToClient(clientId, {\r\n type: 'error',\r\n data: { error: err.message ?? 'Internal error' },\r\n })\r\n }\r\n }\r\n\r\n private sendToClient(clientId: string, msg: { type: string; data: unknown }): void {\r\n const client = this.clients.get(clientId)\r\n if (client && client.ws.readyState === 1) {\r\n client.ws.send(JSON.stringify(msg))\r\n }\r\n }\r\n\r\n}\r\n", "import { createInterface, type Interface as ReadlineInterface } from 'readline'\nimport type { Channel, AgentResponse, MessageHandler } from './types'\n\nexport interface CliChannelOptions {\n userId?: string\n prompt?: string\n input?: NodeJS.ReadableStream\n output?: NodeJS.WritableStream\n}\n\nexport class CliChannel implements Channel {\n readonly id = 'cli'\n readonly name = 'CLI'\n\n private handler: MessageHandler | null = null\n private rl: ReadlineInterface | null = null\n private userId: string\n private promptStr: string\n private input: NodeJS.ReadableStream\n private output: NodeJS.WritableStream\n private active = false\n\n constructor(options: CliChannelOptions = {}) {\n this.userId = options.userId ?? 'cli-user'\n this.promptStr = options.prompt ?? '> '\n this.input = options.input ?? process.stdin\n this.output = options.output ?? process.stdout\n }\n\n onMessage(handler: MessageHandler): void {\n this.handler = handler\n }\n\n async start(): Promise<void> {\n this.active = true\n this.rl = createInterface({\n input: this.input,\n output: this.output,\n prompt: this.promptStr,\n })\n\n this.rl.on('line', async (line: string) => {\n const text = line.trim()\n if (!text) {\n this.rl?.prompt()\n return\n }\n\n if (text === '/exit' || text === '/quit') {\n await this.stop()\n return\n }\n\n if (!this.handler) {\n this.rl?.prompt()\n return\n }\n\n this.rl?.pause()\n try {\n await this.handler({\n channelId: this.id,\n userId: this.userId,\n sessionKey: `cli:${this.userId}`,\n text,\n })\n } finally {\n if (this.active) {\n this.rl?.resume()\n this.rl?.prompt()\n }\n }\n })\n\n this.rl.on('close', () => {\n this.active = false\n })\n\n setTimeout(() => {\n if (this.active) {\n this.output.write('\\n')\n this.rl?.prompt()\n }\n }, 100)\n }\n\n async stop(): Promise<void> {\n this.active = false\n this.rl?.close()\n this.rl = null\n }\n\n async sendResponse(_userId: string, response: AgentResponse): Promise<void> {\n if (!this.active) return\n\n switch (response.type) {\n case 'text':\n this.write(response.content)\n break\n case 'thinking':\n this.write(`[thinking] ${response.content}`)\n break\n case 'error':\n this.write(`[error] ${response.content}`)\n break\n case 'tool_call':\n this.write(`[tool] ${response.content}`)\n break\n case 'tool_result':\n this.write(`[result] ${response.content}`)\n break\n case 'done':\n this.write('')\n break\n }\n }\n\n async requestPermission(_userId: string, description: string): Promise<boolean> {\n if (!this.rl) return false\n\n return new Promise((resolve) => {\n this.write(`\\n[Permission] ${description}`)\n this.rl!.question('Allow? (y/n) ', (answer: string) => {\n resolve(answer.trim().toLowerCase().startsWith('y'))\n })\n })\n }\n\n private write(text: string): void {\n this.output.write(`${text}\\n`)\n }\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from 'fs'\r\nimport { join } from 'path'\r\nimport type { Session, SessionStorage } from './types'\r\n\r\nexport class FileSessionStorage implements SessionStorage {\r\n constructor(private dir: string) {\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true })\r\n }\r\n }\r\n\r\n private filePath(key: string): string {\r\n const safeKey = key.replace(/[^a-zA-Z0-9_-]/g, '_')\r\n return join(this.dir, `${safeKey}.json`)\r\n }\r\n\r\n async load(key: string): Promise<Session | null> {\r\n const path = this.filePath(key)\r\n if (!existsSync(path)) return null\r\n try {\r\n return JSON.parse(readFileSync(path, 'utf-8'))\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n async save(key: string, session: Session): Promise<void> {\r\n session.updatedAt = Date.now()\r\n writeFileSync(this.filePath(key), JSON.stringify(session, null, 2), 'utf-8')\r\n }\r\n\r\n async list(): Promise<string[]> {\r\n if (!existsSync(this.dir)) return []\r\n return readdirSync(this.dir)\r\n .filter(f => f.endsWith('.json'))\r\n .map(f => f.replace('.json', ''))\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n const path = this.filePath(key)\r\n if (existsSync(path)) unlinkSync(path)\r\n }\r\n}\r\n", "#!/usr/bin/env bun\r\n\r\nimport { Gateway } from '../gateway/gateway'\r\nimport { HttpChannel } from '../channels/http'\r\nimport { WebSocketChannel } from '../channels/websocket'\r\nimport { CliChannel } from '../channels/cli'\r\nimport { FileSessionStorage } from '../sessions/storage'\r\nimport { setIdentity } from '../core/identity'\r\nimport { loggingMiddleware, rateLimitMiddleware, maxConcurrencyMiddleware } from '../gateway/middleware'\r\nimport { join, dirname } from 'path'\r\nimport { homedir } from 'os'\r\nimport { existsSync } from 'fs'\r\nimport { fileURLToPath } from 'url'\r\n\r\ninterface GatewayCliOptions {\r\n port: number\r\n wsPort?: number\r\n host: string\r\n domain: string\r\n authToken?: string\r\n corsOrigin?: string\r\n sessionDir?: string\r\n cwd?: string\r\n safeMode: boolean\r\n enableLogging: boolean\r\n rateLimit?: number\r\n name?: string\r\n description?: string\r\n cli?: boolean\r\n webDir?: string\r\n}\r\n\r\nfunction parseArgs(argv: string[]): GatewayCliOptions {\r\n const opts: GatewayCliOptions = {\r\n port: 3000,\r\n host: '0.0.0.0',\r\n domain: 'general',\r\n safeMode: false,\r\n enableLogging: true,\r\n }\r\n\r\n for (let i = 2; i < argv.length; i++) {\r\n const arg = argv[i]\r\n const next = argv[i + 1]\r\n\r\n switch (arg) {\r\n case '--port':\r\n opts.port = parseInt(next, 10); i++; break\r\n case '--ws-port':\r\n opts.wsPort = parseInt(next, 10); i++; break\r\n case '--host':\r\n opts.host = next; i++; break\r\n case '--domain':\r\n opts.domain = next; i++; break\r\n case '--auth-token':\r\n opts.authToken = next; i++; break\r\n case '--cors-origin':\r\n opts.corsOrigin = next; i++; break\r\n case '--session-dir':\r\n opts.sessionDir = next; i++; break\r\n case '--cwd':\r\n opts.cwd = next; i++; break\r\n case '--safe-mode':\r\n opts.safeMode = true; break\r\n case '--no-logging':\r\n opts.enableLogging = false; break\r\n case '--rate-limit':\r\n opts.rateLimit = parseInt(next, 10); i++; break\r\n case '--name':\r\n opts.name = next; i++; break\r\n case '--description':\r\n opts.description = next; i++; break\r\n case '--cli':\r\n opts.cli = true; break\r\n case '--web-dir':\r\n opts.webDir = next; i++; break\r\n case '--help':\r\n printHelp(); process.exit(0)\r\n }\r\n }\r\n\r\n return opts\r\n}\r\n\r\nfunction printHelp(): void {\r\n console.log(`\r\nUsage: newcraw gateway [options]\r\n\r\nOptions:\r\n --port <number> HTTP port (default: 3000)\r\n --ws-port <number> WebSocket port (if omitted, WS is disabled)\r\n --host <string> Bind host (default: 0.0.0.0)\r\n --domain <string> Domain: coding | general (default: general)\r\n --auth-token <string> Bearer token for API / WS auth\r\n --cors-origin <string> CORS origin (default: *)\r\n --session-dir <path> Session storage directory\r\n --cwd <path> Working directory for agent\r\n --safe-mode Enable safe mode (restrict dangerous operations)\r\n --no-logging Disable request logging\r\n --rate-limit <number> Max requests per minute per session (default: 30)\r\n --name <string> Agent name\r\n --description <string> Agent description\r\n --cli Enable interactive CLI channel (stdin/stdout REPL)\r\n --web-dir <path> Serve web UI from directory (default: auto-detect web/dist)\r\n --help Show this help\r\n\r\nEndpoints:\r\n GET /health Health check\r\n POST /api/chat Blocking JSON response\r\n POST /api/chat/stream SSE streaming response\r\n WS ws://host:ws-port WebSocket (bidirectional streaming)\r\n`)\r\n}\r\n\r\nfunction resolveWebDir(explicit?: string): string | undefined {\r\n if (explicit) {\r\n return existsSync(explicit) ? explicit : undefined\r\n }\r\n const thisDir = dirname(fileURLToPath(import.meta.url))\r\n const candidates = [\r\n join(process.cwd(), 'web', 'dist'),\r\n // Built output lives in dist/ \u2014 one level up reaches package root\r\n join(thisDir, '..', 'web', 'dist'),\r\n // Source layout lives in src/entrypoints/ \u2014 two levels up reaches project root\r\n join(thisDir, '..', '..', 'web', 'dist'),\r\n ]\r\n for (const candidate of candidates) {\r\n if (existsSync(join(candidate, 'index.html'))) {\r\n return candidate\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nasync function main(): Promise<void> {\r\n const opts = parseArgs(process.argv)\r\n\r\n if (opts.name || opts.description) {\r\n setIdentity({\r\n ...(opts.name ? { name: opts.name } : {}),\r\n ...(opts.description ? { description: opts.description } : {}),\r\n domain: opts.domain,\r\n })\r\n }\r\n\r\n const sessionDir = opts.sessionDir ?? join(homedir(), '.newcraw', 'gateway-sessions')\r\n const storage = new FileSessionStorage(sessionDir)\r\n\r\n const middleware = []\r\n if (opts.enableLogging) middleware.push(loggingMiddleware())\r\n middleware.push(rateLimitMiddleware({ maxRequests: opts.rateLimit ?? 30 }))\r\n middleware.push(maxConcurrencyMiddleware())\r\n\r\n const gateway = new Gateway({\r\n storage,\r\n domain: opts.domain,\r\n cwd: opts.cwd,\r\n safeMode: opts.safeMode,\r\n middleware,\r\n onError: (err, ctx) => console.error(`[Gateway Error] ${ctx}:`, err.message),\r\n })\r\n\r\n const webDistDir = resolveWebDir(opts.webDir)\r\n if (webDistDir) {\r\n console.log(`[Gateway] Serving web UI from ${webDistDir}`)\r\n }\r\n\r\n const httpChannel = new HttpChannel({\r\n port: opts.port,\r\n host: opts.host,\r\n authToken: opts.authToken,\r\n corsOrigin: opts.corsOrigin,\r\n webDistDir,\r\n })\r\n gateway.registerChannel(httpChannel)\r\n\r\n if (opts.wsPort) {\r\n const wsChannel = new WebSocketChannel({\r\n port: opts.wsPort,\r\n host: opts.host,\r\n authToken: opts.authToken,\r\n })\r\n gateway.registerChannel(wsChannel)\r\n }\r\n\r\n if (opts.cli) {\r\n const cliChannel = new CliChannel({ prompt: `[${opts.name ?? 'NewCraw'}] > ` })\r\n gateway.registerChannel(cliChannel)\r\n }\r\n\r\n process.on('SIGINT', async () => {\r\n await gateway.stop()\r\n process.exit(0)\r\n })\r\n\r\n process.on('SIGTERM', async () => {\r\n await gateway.stop()\r\n process.exit(0)\r\n })\r\n\r\n await gateway.start()\r\n}\r\n\r\nmain().catch((err) => {\r\n console.error('Fatal:', err)\r\n process.exit(1)\r\n})\r\n"],
5
- "mappings": "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",
6
- "names": ["resolve", "createServer", "randomUUID", "resolve", "resolve", "join", "join", "existsSync"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/protocol/kodeAgentStreamJsonSession.ts"],
4
- "sourcesContent": ["import type { Message } from '@query'\r\nimport type { CanUseToolFn } from '@newcraw-types/canUseTool'\r\nimport type { ToolUseContext } from '@tool'\r\nimport { createUserMessage } from '@utils/messages'\r\nimport {\r\n kodeMessageToSdkMessage,\r\n makeSdkResultMessage,\r\n type SdkMessage,\r\n} from './kodeAgentStreamJson'\r\nimport type { KodeAgentStructuredStdio } from './kodeAgentStructuredStdio'\r\n\r\ntype QueryFn = (\r\n messages: Message[],\r\n systemPrompt: string[],\r\n context: { [k: string]: string },\r\n canUseTool: CanUseToolFn,\r\n toolUseContext: ToolUseContext & { setToolJSX: (jsx: any) => void },\r\n) => AsyncGenerator<Message, void>\r\n\r\nexport async function runKodeAgentStreamJsonSession(args: {\r\n structured: KodeAgentStructuredStdio\r\n query: QueryFn\r\n writeSdkLine: (obj: SdkMessage) => void\r\n sessionId: string\r\n systemPrompt: string[]\r\n jsonSchema?: Record<string, unknown> | null\r\n context: { [k: string]: string }\r\n canUseTool: CanUseToolFn\r\n toolUseContextBase: Omit<ToolUseContext, 'abortController'> & {\r\n abortController?: never\r\n setToolJSX: (jsx: any) => void\r\n }\r\n replayUserMessages: boolean\r\n getTotalCostUsd: () => number\r\n onActiveTurnAbortControllerChanged?: (\r\n controller: AbortController | null,\r\n ) => void\r\n initialMessages?: Message[]\r\n}): Promise<void> {\r\n const conversation: Message[] = [...(args.initialMessages ?? [])]\r\n const seenUserUuids = new Set<string>()\r\n\r\n while (true) {\r\n let sdkUser: any\r\n try {\r\n sdkUser = await args.structured.nextUserMessage()\r\n } catch {\r\n return\r\n }\r\n\r\n const sdkMessage = sdkUser?.message\r\n const sdkContent = sdkMessage?.content\r\n if (typeof sdkContent !== 'string' && !Array.isArray(sdkContent)) {\r\n throw new Error('Error: Invalid stream-json user message content')\r\n }\r\n\r\n const providedUuid =\r\n typeof sdkUser?.uuid === 'string' && sdkUser.uuid\r\n ? String(sdkUser.uuid)\r\n : null\r\n\r\n const userMsg = createUserMessage(sdkContent as any) as any\r\n if (providedUuid) {\r\n userMsg.uuid = providedUuid\r\n }\r\n\r\n const isDuplicate = Boolean(providedUuid && seenUserUuids.has(providedUuid))\r\n\r\n if (args.replayUserMessages) {\r\n const sdkUserOut = kodeMessageToSdkMessage(userMsg, args.sessionId)\r\n if (sdkUserOut) args.writeSdkLine(sdkUserOut)\r\n }\r\n\r\n if (isDuplicate) {\r\n continue\r\n }\r\n\r\n if (providedUuid) seenUserUuids.add(providedUuid)\r\n\r\n conversation.push(userMsg)\r\n\r\n const costBefore = args.getTotalCostUsd()\r\n const startedAt = Date.now()\r\n const turnAbortController = new AbortController()\r\n args.onActiveTurnAbortControllerChanged?.(turnAbortController)\r\n\r\n let lastAssistant: any | null = null\r\n let queryError: unknown = null\r\n const toAppend: Message[] = []\r\n\r\n try {\r\n const inputForTurn = [...conversation]\r\n for await (const m of args.query(\r\n inputForTurn,\r\n args.systemPrompt,\r\n args.context,\r\n args.canUseTool,\r\n {\r\n ...args.toolUseContextBase,\r\n abortController: turnAbortController,\r\n } as any,\r\n )) {\r\n if (m.type === 'assistant') lastAssistant = m as any\r\n if (m.type !== 'progress') {\r\n toAppend.push(m)\r\n }\r\n\r\n const sdk = kodeMessageToSdkMessage(m as any, args.sessionId)\r\n if (sdk) args.writeSdkLine(sdk)\r\n }\r\n } catch (e) {\r\n queryError = e\r\n try {\r\n turnAbortController.abort()\r\n } catch {}\r\n } finally {\r\n args.onActiveTurnAbortControllerChanged?.(null)\r\n }\r\n\r\n conversation.push(...toAppend)\r\n\r\n const textFromAssistant = lastAssistant?.message?.content?.find(\r\n (c: any) => c.type === 'text',\r\n )?.text\r\n const resultText =\r\n typeof textFromAssistant === 'string'\r\n ? textFromAssistant\r\n : queryError instanceof Error\r\n ? queryError.message\r\n : queryError\r\n ? String(queryError)\r\n : ''\r\n\r\n let structuredOutput: Record<string, unknown> | undefined\r\n if (args.jsonSchema && !queryError) {\r\n try {\r\n const fenced = String(resultText).trim()\r\n const unfenced = (() => {\r\n const m = fenced.match(/^```(?:json)?\\\\s*([\\\\s\\\\S]*?)\\\\s*```$/i)\r\n return m ? m[1]!.trim() : fenced\r\n })()\r\n\r\n const parsed = JSON.parse(unfenced)\r\n const Ajv = (await import('ajv')).default as any\r\n const ajv = new Ajv({ allErrors: true, strict: false })\r\n const validate = ajv.compile(args.jsonSchema)\r\n const ok = validate(parsed)\r\n if (!ok) {\r\n const errorText =\r\n typeof ajv.errorsText === 'function'\r\n ? ajv.errorsText(validate.errors, { separator: '; ' })\r\n : JSON.stringify(validate.errors ?? [])\r\n throw new Error(\r\n `Structured output failed JSON schema validation: ${errorText}`,\r\n )\r\n }\r\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\r\n throw new Error('Structured output must be a JSON object')\r\n }\r\n structuredOutput = parsed as Record<string, unknown>\r\n } catch (e) {\r\n queryError = e\r\n }\r\n }\r\n\r\n const usage = lastAssistant?.message?.usage\r\n const durationMs = Date.now() - startedAt\r\n const totalCostUsd = Math.max(0, args.getTotalCostUsd() - costBefore)\r\n const isError = Boolean(queryError) || turnAbortController.signal.aborted\r\n\r\n args.writeSdkLine(\r\n makeSdkResultMessage({\r\n sessionId: args.sessionId,\r\n result: String(resultText),\r\n structuredOutput,\r\n numTurns: 1,\r\n usage,\r\n totalCostUsd,\r\n durationMs,\r\n durationApiMs: 0,\r\n isError,\r\n }) as any,\r\n )\r\n }\r\n}\r\n"],
5
- "mappings": "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",
6
- "names": []
7
- }