newcraw 1.0.2 → 1.0.4
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.
- package/dist/REPL-DECTPCL5.js +50 -0
- package/dist/{acp-J4WDYGRX.js → acp-HA476EHW.js} +69 -40
- package/dist/acp-HA476EHW.js.map +7 -0
- package/dist/{agentsValidate-UBOER2IN.js → agentsValidate-EDPFUUMG.js} +13 -10
- package/dist/{agentsValidate-UBOER2IN.js.map → agentsValidate-EDPFUUMG.js.map} +1 -1
- package/dist/{ask-MGUO3L35.js → ask-5SP4YYRD.js} +62 -52
- package/dist/ask-5SP4YYRD.js.map +7 -0
- package/dist/{autoUpdater-2GS6LRPK.js → autoUpdater-FFMM2DR7.js} +5 -4
- package/dist/chunk-2BVCVKKB.js +135 -0
- package/dist/chunk-2BVCVKKB.js.map +7 -0
- package/dist/{chunk-2C43OXE7.js → chunk-2JCTO2EY.js} +38 -59
- package/dist/chunk-2JCTO2EY.js.map +7 -0
- package/dist/{chunk-OJIMOLIC.js → chunk-3CKC4ABU.js} +3631 -7464
- package/dist/chunk-3CKC4ABU.js.map +7 -0
- package/dist/chunk-ARCEUG3V.js +88 -0
- package/dist/chunk-ARCEUG3V.js.map +7 -0
- package/dist/{chunk-RUXIBQ3B.js → chunk-BJYXLCRS.js} +4 -4
- package/dist/{chunk-VKI7ORIO.js → chunk-BMKE6FT5.js} +37 -18
- package/dist/{chunk-VKI7ORIO.js.map → chunk-BMKE6FT5.js.map} +1 -1
- package/dist/chunk-BQCOSNM3.js +93 -0
- package/dist/chunk-BQCOSNM3.js.map +7 -0
- package/dist/chunk-CHB5K4GI.js +107 -0
- package/dist/chunk-CHB5K4GI.js.map +7 -0
- package/dist/chunk-D4OZACS2.js +35 -0
- package/dist/chunk-EHQ2M5B4.js +166 -0
- package/dist/{chunk-ZYSVG4X3.js.map → chunk-EHQ2M5B4.js.map} +2 -2
- package/dist/chunk-EUBZGAIN.js +372 -0
- package/dist/chunk-EUBZGAIN.js.map +7 -0
- package/dist/{chunk-UYRR6F5S.js → chunk-FIMCETCB.js} +9 -3
- package/dist/{chunk-UYRR6F5S.js.map → chunk-FIMCETCB.js.map} +1 -1
- package/dist/{chunk-DEF3KFP7.js → chunk-GVLJUD6R.js} +4 -2
- package/dist/{chunk-DEF3KFP7.js.map → chunk-GVLJUD6R.js.map} +1 -1
- package/dist/chunk-HLBLZKZH.js +45 -0
- package/dist/chunk-HLBLZKZH.js.map +7 -0
- package/dist/{chunk-XS6PU75S.js → chunk-IVWPPTDM.js} +1 -1
- package/dist/{chunk-A7X6OCZE.js → chunk-IXFBUXQW.js} +1 -1
- package/dist/{chunk-HSJ6HYAO.js → chunk-IZZTKEZH.js} +18 -10
- package/dist/chunk-IZZTKEZH.js.map +7 -0
- package/dist/{chunk-2EFL22PV.js → chunk-JI4HCLK7.js} +7 -3
- package/dist/chunk-JI4HCLK7.js.map +7 -0
- package/dist/chunk-JLVECHVJ.js +36 -0
- package/dist/chunk-JLVECHVJ.js.map +7 -0
- package/dist/{chunk-XXU2NVOE.js → chunk-KJTPUTU7.js} +30 -6
- package/dist/chunk-KJTPUTU7.js.map +7 -0
- package/dist/{chunk-V5U6BHT2.js → chunk-KS646CDL.js} +7 -3
- package/dist/{chunk-V5U6BHT2.js.map → chunk-KS646CDL.js.map} +1 -1
- package/dist/{chunk-53A4JHFW.js → chunk-MJ3MLGVB.js} +23 -4
- package/dist/chunk-MJ3MLGVB.js.map +7 -0
- package/dist/chunk-MJLWBVZP.js +822 -0
- package/dist/chunk-MJLWBVZP.js.map +7 -0
- package/dist/chunk-MMF5RMLU.js +65 -0
- package/dist/chunk-MMF5RMLU.js.map +7 -0
- package/dist/{chunk-QH2M65BR.js → chunk-MUW3J7CP.js} +7 -3
- package/dist/{chunk-QH2M65BR.js.map → chunk-MUW3J7CP.js.map} +1 -1
- package/dist/{chunk-3LMXSKZ7.js → chunk-NFXLN6FJ.js} +1 -1
- package/dist/chunk-NT7RDVDA.js +33 -0
- package/dist/{chunk-KQSHIOZK.js.map → chunk-NT7RDVDA.js.map} +1 -1
- package/dist/{chunk-OZHBEG7U.js → chunk-O4EKE3YR.js} +15 -5
- package/dist/{chunk-OZHBEG7U.js.map → chunk-O4EKE3YR.js.map} +1 -1
- package/dist/chunk-Q2OBTLBI.js +5473 -0
- package/dist/chunk-Q2OBTLBI.js.map +7 -0
- package/dist/{chunk-WWDVA4NV.js → chunk-QJ7MQIHN.js} +22 -6
- package/dist/{chunk-WWDVA4NV.js.map → chunk-QJ7MQIHN.js.map} +1 -1
- package/dist/{chunk-N5OHRWG2.js → chunk-QSRXXZO7.js} +4 -2
- package/dist/{chunk-N5OHRWG2.js.map → chunk-QSRXXZO7.js.map} +1 -1
- package/dist/{chunk-GZTCXXSS.js → chunk-QT5GS374.js} +57 -46
- package/dist/{chunk-GZTCXXSS.js.map → chunk-QT5GS374.js.map} +1 -1
- package/dist/chunk-QX5Y5CE5.js +683 -0
- package/dist/{chunk-F3COCCAE.js.map → chunk-QX5Y5CE5.js.map} +1 -1
- package/dist/{chunk-IIFUDVGS.js → chunk-U6IF5D3J.js} +310 -177
- package/dist/chunk-U6IF5D3J.js.map +7 -0
- package/dist/{chunk-VQSCECTS.js → chunk-UPRKGNBR.js} +6 -4
- package/dist/{chunk-VQSCECTS.js.map → chunk-UPRKGNBR.js.map} +1 -1
- package/dist/chunk-UUCRNFMH.js +62 -0
- package/dist/chunk-UUCRNFMH.js.map +7 -0
- package/dist/chunk-UYWZQVH5.js +35 -0
- package/dist/chunk-UYWZQVH5.js.map +7 -0
- package/dist/{chunk-XMGUQHMF.js → chunk-VSSVN6WG.js} +11 -1
- package/dist/chunk-VSSVN6WG.js.map +7 -0
- package/dist/{chunk-VHS2MZQS.js → chunk-W7Q3VYAB.js} +9 -6
- package/dist/{chunk-VHS2MZQS.js.map → chunk-W7Q3VYAB.js.map} +1 -1
- package/dist/{chunk-JWXQNBBA.js → chunk-WAXMRSVR.js} +7 -1
- package/dist/{chunk-JWXQNBBA.js.map → chunk-WAXMRSVR.js.map} +1 -1
- package/dist/{chunk-BWYKUDJR.js → chunk-X3NER6FY.js} +14 -8
- package/dist/{chunk-BWYKUDJR.js.map → chunk-X3NER6FY.js.map} +1 -1
- package/dist/{chunk-IM33F5CM.js → chunk-XYQZLDRB.js} +1668 -1623
- package/dist/chunk-XYQZLDRB.js.map +7 -0
- package/dist/{chunk-LOIZNQOU.js → chunk-ZM5FMRLS.js} +9 -3
- package/dist/{chunk-LOIZNQOU.js.map → chunk-ZM5FMRLS.js.map} +1 -1
- package/dist/{chunk-755HIAI3.js → chunk-ZMO4E7IW.js} +3 -42
- package/dist/chunk-ZMO4E7IW.js.map +7 -0
- package/dist/{cli-KZGF3FV5.js → cli-4KO6TA5J.js} +251 -485
- package/dist/cli-4KO6TA5J.js.map +7 -0
- package/dist/commands-JSY7CGSU.js +54 -0
- package/dist/{config-GTJWCNPF.js → config-DQEFVW3Y.js} +9 -6
- package/dist/{context-WF3TTXQU.js → context-HVQCTO5R.js} +8 -7
- package/dist/{costTracker-2G3ZI2JF.js → costTracker-VSWW7SRT.js} +3 -2
- package/dist/{customCommands-QOWK57EX.js → customCommands-XCINU5TG.js} +6 -5
- package/dist/{env-37BAP7QF.js → env-ZOPEXWMF.js} +10 -7
- package/dist/{gateway-IZYO6YFJ.js → gateway-SUXSILQL.js} +542 -96
- package/dist/gateway-SUXSILQL.js.map +7 -0
- package/dist/identity-3KZQQVBG.js +16 -0
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/{kodeAgentSessionId-KTGFX2BE.js → kodeAgentSessionId-4SH24DVH.js} +1 -1
- package/dist/{kodeAgentSessionLoad-6F7SJXBC.js → kodeAgentSessionLoad-HB3BYVNG.js} +6 -5
- package/dist/{kodeAgentSessionResume-UEEDRJ3N.js → kodeAgentSessionResume-IGSZZY3G.js} +6 -5
- package/dist/{kodeAgentStreamJson-VIXFTYL5.js → kodeAgentStreamJson-4ZKIWKS3.js} +4 -2
- package/dist/{kodeAgentStreamJsonSession-XC3IPREZ.js → kodeAgentStreamJsonSession-4L76UC75.js} +15 -4
- package/dist/kodeAgentStreamJsonSession-4L76UC75.js.map +7 -0
- package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js → kodeAgentStructuredStdio-5DCUC6V6.js} +3 -3
- package/dist/{kodeHooks-V36SHCTC.js → kodeHooks-H6DMC3XX.js} +6 -5
- package/dist/{llm-CYUDKJNR.js → llm-OJZ6DZVC.js} +306 -60
- package/dist/llm-OJZ6DZVC.js.map +7 -0
- package/dist/{llmLazy-IXVVBRTN.js → llmLazy-TDLZZDPL.js} +2 -2
- package/dist/{loader-OEJ6C3TN.js → loader-MOVYZ76M.js} +6 -5
- package/dist/{mcp-KE3SILMX.js → mcp-DUYSIR5L.js} +10 -9
- package/dist/{mentionProcessor-GAU2WAYB.js → mentionProcessor-EKVLXJN4.js} +14 -7
- package/dist/{mentionProcessor-GAU2WAYB.js.map → mentionProcessor-EKVLXJN4.js.map} +1 -1
- package/dist/{messages-WCSGGSEU.js → messages-23ICFVMC.js} +2 -2
- package/dist/{model-4TQIV5J2.js → model-FUBCTRTV.js} +10 -7
- package/dist/{openai-KTZV6F7N.js → openai-SMYIAIO4.js} +8 -7
- package/dist/{outputStyles-WX5RYQOA.js → outputStyles-HBOYJFBE.js} +6 -5
- package/dist/{pluginRuntime-JXMJZ2LC.js → pluginRuntime-ATZMDZA7.js} +11 -8
- package/dist/{pluginRuntime-JXMJZ2LC.js.map → pluginRuntime-ATZMDZA7.js.map} +1 -1
- package/dist/{pluginValidation-JNQZYLUP.js → pluginValidation-7CGOMT6F.js} +8 -7
- package/dist/prompts-MFESKNYZ.js +58 -0
- package/dist/query-BFEFOX4S.js +58 -0
- package/dist/{responsesStreaming-2AIT6GHG.js → responsesStreaming-JORGEFQC.js} +1 -1
- package/dist/{ripgrep-KDPQAMB2.js → ripgrep-KNJBCJIQ.js} +5 -4
- package/dist/sandbox-P3FR4G4D.js +63 -0
- package/dist/{skillMarketplace-IXAGP3Q2.js → skillMarketplace-PCMKVV4O.js} +5 -4
- package/dist/{state-MSCYLB6Y.js → state-XBYIQ7R4.js} +6 -3
- package/dist/structuredOutput-KAVFUV2Z.js +9 -0
- package/dist/theme-4ZSXUILR.js +15 -0
- package/dist/thinking-TTNUZUB3.js +18 -0
- package/dist/{toolPermissionContext-I3IXPVED.js → toolPermissionContext-JCQ5MFUT.js} +1 -1
- package/dist/toolPermissionContext-JCQ5MFUT.js.map +7 -0
- package/dist/toolPermissionContextState-R6ZGMKP6.js +24 -0
- package/dist/toolPermissionContextState-R6ZGMKP6.js.map +7 -0
- package/dist/{toolPermissionSettings-EUZKGZU2.js → toolPermissionSettings-GMEYTJEA.js} +9 -8
- package/dist/toolPermissionSettings-GMEYTJEA.js.map +7 -0
- package/dist/tools-7FVKB7BG.js +55 -0
- package/dist/tools-7FVKB7BG.js.map +7 -0
- package/dist/{userInput-LJL4CVOB.js → userInput-SZEUY5J6.js} +49 -34
- package/dist/{userInput-LJL4CVOB.js.map → userInput-SZEUY5J6.js.map} +1 -1
- package/dist/{uuid-VA3KVASX.js → uuid-RQH3OZ3W.js} +1 -1
- package/dist/uuid-RQH3OZ3W.js.map +7 -0
- package/dist/workspace-EP63OB5S.js +21 -0
- package/dist/workspace-EP63OB5S.js.map +7 -0
- package/package.json +2 -2
- package/web/dist/assets/index-XuLVvSQF.js +251 -0
- package/web/dist/assets/index-pSid9IlY.css +10 -0
- package/web/dist/index.html +2 -2
- package/dist/REPL-IAK7ZN2Z.js +0 -42
- package/dist/acp-J4WDYGRX.js.map +0 -7
- package/dist/ask-MGUO3L35.js.map +0 -7
- package/dist/chunk-2C43OXE7.js.map +0 -7
- package/dist/chunk-2EFL22PV.js.map +0 -7
- package/dist/chunk-53A4JHFW.js.map +0 -7
- package/dist/chunk-755HIAI3.js.map +0 -7
- package/dist/chunk-AXWJI6N5.js +0 -11
- package/dist/chunk-F3COCCAE.js +0 -654
- package/dist/chunk-HSJ6HYAO.js.map +0 -7
- package/dist/chunk-IIFUDVGS.js.map +0 -7
- package/dist/chunk-IM33F5CM.js.map +0 -7
- package/dist/chunk-KQSHIOZK.js +0 -24
- package/dist/chunk-OJIMOLIC.js.map +0 -7
- package/dist/chunk-XMGUQHMF.js.map +0 -7
- package/dist/chunk-XXU2NVOE.js.map +0 -7
- package/dist/chunk-ZYSVG4X3.js +0 -151
- package/dist/cli-KZGF3FV5.js.map +0 -7
- package/dist/commands-AVEBLFVS.js +0 -46
- package/dist/gateway-IZYO6YFJ.js.map +0 -7
- package/dist/kodeAgentStreamJsonSession-XC3IPREZ.js.map +0 -7
- package/dist/llm-CYUDKJNR.js.map +0 -7
- package/dist/prompts-LE6GK75N.js +0 -48
- package/dist/query-GGIP6PWG.js +0 -50
- package/dist/theme-GAMFOLBW.js +0 -14
- package/dist/tools-3HOUIDM3.js +0 -47
- package/web/dist/assets/index-COAJqX1Z.css +0 -1
- package/web/dist/assets/index-CzS_4LmC.js +0 -179
- /package/dist/{REPL-IAK7ZN2Z.js.map → REPL-DECTPCL5.js.map} +0 -0
- /package/dist/{autoUpdater-2GS6LRPK.js.map → autoUpdater-FFMM2DR7.js.map} +0 -0
- /package/dist/{chunk-RUXIBQ3B.js.map → chunk-BJYXLCRS.js.map} +0 -0
- /package/dist/{chunk-AXWJI6N5.js.map → chunk-D4OZACS2.js.map} +0 -0
- /package/dist/{chunk-XS6PU75S.js.map → chunk-IVWPPTDM.js.map} +0 -0
- /package/dist/{chunk-A7X6OCZE.js.map → chunk-IXFBUXQW.js.map} +0 -0
- /package/dist/{chunk-3LMXSKZ7.js.map → chunk-NFXLN6FJ.js.map} +0 -0
- /package/dist/{commands-AVEBLFVS.js.map → commands-JSY7CGSU.js.map} +0 -0
- /package/dist/{config-GTJWCNPF.js.map → config-DQEFVW3Y.js.map} +0 -0
- /package/dist/{context-WF3TTXQU.js.map → context-HVQCTO5R.js.map} +0 -0
- /package/dist/{costTracker-2G3ZI2JF.js.map → costTracker-VSWW7SRT.js.map} +0 -0
- /package/dist/{customCommands-QOWK57EX.js.map → customCommands-XCINU5TG.js.map} +0 -0
- /package/dist/{env-37BAP7QF.js.map → env-ZOPEXWMF.js.map} +0 -0
- /package/dist/{kodeAgentSessionId-KTGFX2BE.js.map → identity-3KZQQVBG.js.map} +0 -0
- /package/dist/{kodeAgentSessionLoad-6F7SJXBC.js.map → kodeAgentSessionId-4SH24DVH.js.map} +0 -0
- /package/dist/{kodeAgentSessionResume-UEEDRJ3N.js.map → kodeAgentSessionLoad-HB3BYVNG.js.map} +0 -0
- /package/dist/{kodeAgentStreamJson-VIXFTYL5.js.map → kodeAgentSessionResume-IGSZZY3G.js.map} +0 -0
- /package/dist/{kodeAgentStructuredStdio-SI5C7AAD.js.map → kodeAgentStreamJson-4ZKIWKS3.js.map} +0 -0
- /package/dist/{kodeHooks-V36SHCTC.js.map → kodeAgentStructuredStdio-5DCUC6V6.js.map} +0 -0
- /package/dist/{llmLazy-IXVVBRTN.js.map → kodeHooks-H6DMC3XX.js.map} +0 -0
- /package/dist/{loader-OEJ6C3TN.js.map → llmLazy-TDLZZDPL.js.map} +0 -0
- /package/dist/{mcp-KE3SILMX.js.map → loader-MOVYZ76M.js.map} +0 -0
- /package/dist/{messages-WCSGGSEU.js.map → mcp-DUYSIR5L.js.map} +0 -0
- /package/dist/{model-4TQIV5J2.js.map → messages-23ICFVMC.js.map} +0 -0
- /package/dist/{openai-KTZV6F7N.js.map → model-FUBCTRTV.js.map} +0 -0
- /package/dist/{outputStyles-WX5RYQOA.js.map → openai-SMYIAIO4.js.map} +0 -0
- /package/dist/{pluginValidation-JNQZYLUP.js.map → outputStyles-HBOYJFBE.js.map} +0 -0
- /package/dist/{prompts-LE6GK75N.js.map → pluginValidation-7CGOMT6F.js.map} +0 -0
- /package/dist/{query-GGIP6PWG.js.map → prompts-MFESKNYZ.js.map} +0 -0
- /package/dist/{responsesStreaming-2AIT6GHG.js.map → query-BFEFOX4S.js.map} +0 -0
- /package/dist/{ripgrep-KDPQAMB2.js.map → responsesStreaming-JORGEFQC.js.map} +0 -0
- /package/dist/{skillMarketplace-IXAGP3Q2.js.map → ripgrep-KNJBCJIQ.js.map} +0 -0
- /package/dist/{state-MSCYLB6Y.js.map → sandbox-P3FR4G4D.js.map} +0 -0
- /package/dist/{theme-GAMFOLBW.js.map → skillMarketplace-PCMKVV4O.js.map} +0 -0
- /package/dist/{toolPermissionContext-I3IXPVED.js.map → state-XBYIQ7R4.js.map} +0 -0
- /package/dist/{toolPermissionSettings-EUZKGZU2.js.map → structuredOutput-KAVFUV2Z.js.map} +0 -0
- /package/dist/{tools-3HOUIDM3.js.map → theme-4ZSXUILR.js.map} +0 -0
- /package/dist/{uuid-VA3KVASX.js.map → thinking-TTNUZUB3.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/sessions/manager.ts", "../src/gateway/agentCore.ts", "../src/gateway/middleware.ts", "../src/channels/http.ts", "../src/gateway/openaiCompat.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, ReasoningEvent } from '@query'\r\nimport { createUserMessage, createAssistantMessage } from '@utils/messages'\r\nimport { getIdentity } from '../core/identity'\r\nimport { createQueryOptions } from '../core/queryOptionsFactory'\r\nimport { matchSkillForPrompt, buildSkillMatchDirective } from '../core/skillMatcher'\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 return { result: true }\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 { 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 userMessage = createUserMessage(options.prompt)\r\n const messages: Message[] = [...(options.sessionMessages ?? []), userMessage]\r\n const messageLogName = `gateway-${Date.now()}`\r\n\r\n const [systemPrompt, context, queryOpts, skillMatch] = await Promise.all([\r\n getSystemPrompt({ domain: domainId }),\r\n getContext(),\r\n createQueryOptions({\r\n messages,\r\n safeMode: options.safeMode,\r\n messageLogName,\r\n verbose: false,\r\n persistSession: false,\r\n }),\r\n matchSkillForPrompt(options.prompt),\r\n ])\r\n\r\n if (skillMatch) {\r\n systemPrompt.unshift(buildSkillMatchDirective(skillMatch))\r\n }\r\n\r\n const abortController = new AbortController()\r\n\r\n for await (const m of query(\r\n messages,\r\n systemPrompt,\r\n context,\r\n gatewayPermissionHandler,\r\n {\r\n ...queryOpts,\r\n abortController,\r\n },\r\n )) {\r\n messages.push(m)\r\n }\r\n\r\n const last = messages[messages.length - 1]\r\n const resultText =\r\n last?.type === 'assistant'\r\n ? (last.message.content.find((c: any) => c.type === 'text') as any)?.text ?? ''\r\n : ''\r\n\r\n return {\r\n resultText,\r\n messages: [],\r\n totalCost: 0,\r\n }\r\n}\r\n\r\nexport type StreamChunkType = 'text' | 'tool_call' | 'tool_result' | 'thinking' | 'reasoning' | 'status' | 'usage' | 'done'\r\n\r\nexport async function* gatewayQueryStream(options: GatewayQueryOptions): AsyncGenerator<{\r\n type: StreamChunkType\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 userMessage = createUserMessage(options.prompt)\r\n const messages: Message[] = [...(options.sessionMessages ?? []), userMessage]\r\n const messageLogName = `gateway-${Date.now()}`\r\n\r\n const [systemPrompt, context, queryOpts, skillMatch] = await Promise.all([\r\n getSystemPrompt({ domain: domainId }),\r\n getContext(),\r\n createQueryOptions({\r\n messages,\r\n safeMode: options.safeMode,\r\n messageLogName,\r\n verbose: false,\r\n persistSession: false,\r\n }),\r\n matchSkillForPrompt(options.prompt),\r\n ])\r\n\r\n if (skillMatch) {\r\n systemPrompt.unshift(buildSkillMatchDirective(skillMatch))\r\n }\r\n\r\n const abortController = new AbortController()\r\n const seenToolUseIds = new Set<string>()\r\n const toolTrace: { name: string; input: string; succeeded: boolean }[] = []\r\n const reasoningEvents: ReasoningEvent[] = []\r\n\r\n let modelName = 'unknown'\r\n try {\r\n const { getModelManager } = await import('@utils/model')\r\n const manager = getModelManager()\r\n modelName = manager.getModelName('main') ?? 'unknown'\r\n } catch { /* model info unavailable */ }\r\n\r\n yield {\r\n type: 'status',\r\n content: JSON.stringify({\r\n model: modelName,\r\n state: 'started',\r\n iteration: 0,\r\n timestamp: Date.now(),\r\n }),\r\n }\r\n\r\n let iterationCount = 0\r\n let totalInputTokens = 0\r\n let totalOutputTokens = 0\r\n let totalCacheReadTokens = 0\r\n let totalCacheCreationTokens = 0\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 ...queryOpts,\r\n abortController,\r\n reasoningEvents,\r\n },\r\n )) {\r\n while (reasoningEvents.length > 0) {\r\n const event = reasoningEvents.shift()!\r\n yield { type: 'reasoning', content: JSON.stringify(event) }\r\n }\r\n\r\n if (msg.type === 'assistant') {\r\n iterationCount++\r\n\r\n const usage = (msg.message as any).usage\r\n if (usage) {\r\n const input = usage.input_tokens ?? 0\r\n const output = usage.output_tokens ?? 0\r\n const cacheRead = usage.cache_read_input_tokens ?? 0\r\n const cacheCreation = usage.cache_creation_input_tokens ?? 0\r\n totalInputTokens += input\r\n totalOutputTokens += output\r\n totalCacheReadTokens += cacheRead\r\n totalCacheCreationTokens += cacheCreation\r\n\r\n yield {\r\n type: 'usage',\r\n content: JSON.stringify({\r\n inputTokens: input,\r\n outputTokens: output,\r\n cacheReadTokens: cacheRead,\r\n cacheCreationTokens: cacheCreation,\r\n totalInputTokens,\r\n totalOutputTokens,\r\n totalCacheReadTokens,\r\n totalCacheCreationTokens,\r\n costUSD: msg.costUSD ?? 0,\r\n iteration: iterationCount,\r\n }),\r\n }\r\n }\r\n\r\n yield {\r\n type: 'status',\r\n content: JSON.stringify({\r\n model: modelName,\r\n state: 'thinking',\r\n iteration: iterationCount,\r\n toolCallCount: toolTrace.length,\r\n timestamp: Date.now(),\r\n }),\r\n }\r\n\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 toolTrace.push({ name: block.name, input: inputBrief, succeeded: true })\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 toolTrace.push({ name: block.name, input: inputBrief, succeeded: true })\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 const isError = (block as any).is_error === true\r\n || raw.includes('error')\r\n || raw.includes('Error')\r\n || raw.includes('REDIRECT')\r\n if (isError && toolTrace.length > 0) {\r\n toolTrace[toolTrace.length - 1].succeeded = false\r\n }\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 while (reasoningEvents.length > 0) {\r\n const event = reasoningEvents.shift()!\r\n yield { type: 'reasoning', content: JSON.stringify(event) }\r\n }\r\n\r\n if (toolTrace.length > 0) {\r\n const steps = toolTrace.map((t, i) => {\r\n const status = t.succeeded ? '\u2713' : '\u2717'\r\n return `${i + 1}. ${status} ${t.name}`\r\n })\r\n const summary = `\\n\\n---\\n**\u83B7\u53D6\u8DEF\u5F84**: ${steps.join(' \u2192 ')}`\r\n yield { type: 'text', content: summary }\r\n }\r\n\r\n yield {\r\n type: 'status',\r\n content: JSON.stringify({\r\n model: modelName,\r\n state: 'completed',\r\n iteration: iterationCount,\r\n toolCallCount: toolTrace.length,\r\n totalInputTokens,\r\n totalOutputTokens,\r\n timestamp: Date.now(),\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\nimport {\r\n convertOpenAIRequestToGateway,\r\n buildCompletionResponse,\r\n buildChunk,\r\n buildDoneChunk,\r\n type OpenAIChatCompletionRequest,\r\n} from '../gateway/openaiCompat'\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 if (req.method === 'POST' && (req.url === '/v1/chat/completions' || req.url === '/chat/completions')) {\r\n await this.handleOpenAICompat(req, res)\r\n return\r\n }\r\n\r\n if (req.method === 'GET' && req.url === '/v1/models') {\r\n await this.handleOpenAIModels(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 private async handleOpenAICompat(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n if (!this.checkAuth(req, res)) return\r\n\r\n try {\r\n const raw = await readBody(req)\r\n const body: OpenAIChatCompletionRequest = JSON.parse(raw)\r\n const model = body.model ?? 'kode-agent'\r\n const isStream = body.stream === true\r\n\r\n const gatewayOpts = convertOpenAIRequestToGateway(body, `openai:${randomUUID().slice(0, 8)}`)\r\n\r\n if (!gatewayOpts.prompt) {\r\n res.setHeader('Content-Type', 'application/json')\r\n res.writeHead(400)\r\n res.end(JSON.stringify({\r\n error: { message: 'No user message found in messages array', type: 'invalid_request_error', code: 'missing_user_message' },\r\n }))\r\n return\r\n }\r\n\r\n if (isStream) {\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 completionId = `chatcmpl-${randomUUID().replace(/-/g, '').slice(0, 24)}`\r\n let streamEnded = false\r\n\r\n const safeWrite = (data: string): boolean => {\r\n if (streamEnded || res.writableEnded || res.destroyed) return false\r\n try {\r\n return res.write(data)\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n safeWrite(`data: ${JSON.stringify(buildChunk(completionId, model, { role: 'assistant', content: '' }))}\\n\\n`)\r\n\r\n if (this.streamHandler) {\r\n const unifiedMsg: import('./types').UnifiedMessage = {\r\n channelId: 'http',\r\n userId: 'openai-compat',\r\n sessionKey: `openai:${randomUUID().slice(0, 8)}`,\r\n text: gatewayOpts.prompt,\r\n metadata: { requestId: randomUUID(), openaiCompat: true },\r\n }\r\n\r\n const interceptRes = Object.create(res) as ServerResponse\r\n interceptRes.write = ((data: any) => {\r\n if (typeof data === 'string' && data.startsWith('event:')) {\r\n const lines = data.split('\\n')\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n try {\r\n const parsed = JSON.parse(line.slice(6))\r\n if (parsed.type === 'text' || (parsed.content && typeof parsed.content === 'string')) {\r\n const textContent = parsed.content ?? parsed.text ?? ''\r\n if (textContent) {\r\n safeWrite(`data: ${JSON.stringify(buildChunk(completionId, model, { content: textContent }))}\\n\\n`)\r\n }\r\n }\r\n } catch {\r\n // non-JSON SSE line, skip\r\n }\r\n }\r\n }\r\n return true\r\n }\r\n return safeWrite(data)\r\n }) as any\r\n interceptRes.end = (() => {}) as any\r\n\r\n await this.streamHandler(unifiedMsg, interceptRes)\r\n }\r\n\r\n safeWrite(`data: ${JSON.stringify(buildDoneChunk(completionId, model))}\\n\\n`)\r\n safeWrite('data: [DONE]\\n\\n')\r\n streamEnded = true\r\n res.end()\r\n } else {\r\n if (!this.handler) {\r\n res.setHeader('Content-Type', 'application/json')\r\n res.writeHead(503)\r\n res.end(JSON.stringify({\r\n error: { message: 'Service unavailable', type: 'server_error' },\r\n }))\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: `openai:${requestId.slice(0, 8)}`,\r\n text: gatewayOpts.prompt,\r\n metadata: { requestId, openaiCompat: true },\r\n })\r\n\r\n const responses = this.pendingResponses.get(requestId) ?? []\r\n this.pendingResponses.delete(requestId)\r\n\r\n const textContent = responses\r\n .filter(r => r.type === 'text')\r\n .map(r => r.content)\r\n .join('')\r\n\r\n const completion = buildCompletionResponse(model, textContent)\r\n res.setHeader('Content-Type', 'application/json')\r\n res.writeHead(200)\r\n res.end(JSON.stringify(completion))\r\n }\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({\r\n error: { message: err.message ?? 'Internal server error', type: 'server_error' },\r\n }))\r\n } else if (!res.writableEnded && !res.destroyed) {\r\n try {\r\n res.write(`data: ${JSON.stringify({ error: { message: err.message } })}\\n\\n`)\r\n res.write('data: [DONE]\\n\\n')\r\n res.end()\r\n } catch {\r\n // response already closed\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async handleOpenAIModels(_req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n res.setHeader('Content-Type', 'application/json')\r\n res.writeHead(200)\r\n res.end(JSON.stringify({\r\n object: 'list',\r\n data: [\r\n {\r\n id: 'kode-agent',\r\n object: 'model',\r\n created: Math.floor(Date.now() / 1000),\r\n owned_by: 'kode',\r\n },\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 { randomUUID } from 'crypto'\r\nimport type { GatewayQueryOptions } from './agentCore'\r\n\r\nexport interface OpenAIChatCompletionRequest {\r\n model?: string\r\n messages: OpenAIChatMessage[]\r\n stream?: boolean\r\n temperature?: number\r\n max_tokens?: number\r\n tools?: OpenAIToolDef[]\r\n tool_choice?: string | object\r\n top_p?: number\r\n n?: number\r\n stop?: string | string[]\r\n}\r\n\r\nexport interface OpenAIChatMessage {\r\n role: 'system' | 'user' | 'assistant' | 'tool'\r\n content: string | null\r\n name?: string\r\n tool_calls?: OpenAIToolCall[]\r\n tool_call_id?: string\r\n}\r\n\r\nexport interface OpenAIToolDef {\r\n type: 'function'\r\n function: {\r\n name: string\r\n description?: string\r\n parameters?: Record<string, unknown>\r\n strict?: boolean\r\n }\r\n}\r\n\r\nexport interface OpenAIToolCall {\r\n id: string\r\n type: 'function'\r\n function: {\r\n name: string\r\n arguments: string\r\n }\r\n}\r\n\r\nexport interface OpenAIChatCompletionResponse {\r\n id: string\r\n object: 'chat.completion'\r\n created: number\r\n model: string\r\n choices: OpenAIChatCompletionChoice[]\r\n usage: {\r\n prompt_tokens: number\r\n completion_tokens: number\r\n total_tokens: number\r\n }\r\n}\r\n\r\nexport interface OpenAIChatCompletionChoice {\r\n index: number\r\n message: {\r\n role: 'assistant'\r\n content: string | null\r\n tool_calls?: OpenAIToolCall[]\r\n }\r\n finish_reason: 'stop' | 'tool_calls' | 'length' | null\r\n}\r\n\r\nexport interface OpenAIChatCompletionChunk {\r\n id: string\r\n object: 'chat.completion.chunk'\r\n created: number\r\n model: string\r\n choices: OpenAIChatCompletionChunkChoice[]\r\n usage?: {\r\n prompt_tokens: number\r\n completion_tokens: number\r\n total_tokens: number\r\n } | null\r\n}\r\n\r\nexport interface OpenAIChatCompletionChunkChoice {\r\n index: number\r\n delta: {\r\n role?: 'assistant'\r\n content?: string | null\r\n tool_calls?: Partial<OpenAIToolCall>[]\r\n }\r\n finish_reason: 'stop' | 'tool_calls' | 'length' | null\r\n}\r\n\r\nexport interface OpenAICompatGatewayResult extends GatewayQueryOptions {\r\n systemPrompt?: string\r\n conversationHistory?: OpenAIChatMessage[]\r\n openaiTools?: OpenAIToolDef[]\r\n}\r\n\r\nexport function convertOpenAIRequestToGateway(\r\n body: OpenAIChatCompletionRequest,\r\n sessionKey: string,\r\n): OpenAICompatGatewayResult {\r\n const messages = body.messages ?? []\r\n let prompt = ''\r\n let systemPrompt = ''\r\n\r\n const systemMessages = messages.filter(m => m.role === 'system')\r\n if (systemMessages.length > 0) {\r\n systemPrompt = systemMessages\r\n .map(m => m.content ?? '')\r\n .filter(Boolean)\r\n .join('\\n\\n')\r\n }\r\n\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n if (messages[i].role === 'user' && messages[i].content) {\r\n prompt = messages[i].content as string\r\n break\r\n }\r\n }\r\n\r\n const conversationHistory = messages.filter(m => m.role !== 'system')\r\n\r\n const contextParts: string[] = []\r\n\r\n if (systemPrompt) {\r\n contextParts.push(`<system_context>\\n${systemPrompt}\\n</system_context>`)\r\n }\r\n\r\n const priorMessages = conversationHistory.slice(0, -1)\r\n if (priorMessages.length > 0) {\r\n const historyLines = priorMessages\r\n .map(m => {\r\n if (m.role === 'assistant') {\r\n if (m.tool_calls && m.tool_calls.length > 0) {\r\n const toolDescs = m.tool_calls\r\n .map(tc => `[tool_call: ${tc.function.name}(${tc.function.arguments})]`)\r\n .join(' ')\r\n return `Assistant: ${m.content ?? ''} ${toolDescs}`\r\n }\r\n return `Assistant: ${m.content ?? ''}`\r\n }\r\n if (m.role === 'tool') {\r\n return `Tool(${m.tool_call_id ?? m.name ?? ''}): ${m.content ?? ''}`\r\n }\r\n if (m.role === 'user') {\r\n return `User: ${m.content ?? ''}`\r\n }\r\n return ''\r\n })\r\n .filter(Boolean)\r\n if (historyLines.length > 0) {\r\n contextParts.push(`<conversation_history>\\n${historyLines.join('\\n')}\\n</conversation_history>`)\r\n }\r\n }\r\n\r\n if (body.tools && body.tools.length > 0) {\r\n const toolDescriptions = body.tools\r\n .map(t => `- ${t.function.name}: ${t.function.description ?? '(no description)'}`)\r\n .join('\\n')\r\n contextParts.push(`<available_tools>\\n${toolDescriptions}\\n</available_tools>`)\r\n }\r\n\r\n if (contextParts.length > 0 && prompt) {\r\n prompt = `${contextParts.join('\\n\\n')}\\n\\n${prompt}`\r\n }\r\n\r\n return {\r\n prompt,\r\n domain: 'coding',\r\n safeMode: false,\r\n systemPrompt,\r\n conversationHistory,\r\n openaiTools: body.tools,\r\n }\r\n}\r\n\r\nexport function buildCompletionResponse(\r\n model: string,\r\n content: string,\r\n): OpenAIChatCompletionResponse {\r\n return {\r\n id: `chatcmpl-${randomUUID().replace(/-/g, '').slice(0, 24)}`,\r\n object: 'chat.completion',\r\n created: Math.floor(Date.now() / 1000),\r\n model,\r\n choices: [\r\n {\r\n index: 0,\r\n message: {\r\n role: 'assistant',\r\n content,\r\n },\r\n finish_reason: 'stop',\r\n },\r\n ],\r\n usage: {\r\n prompt_tokens: 0,\r\n completion_tokens: 0,\r\n total_tokens: 0,\r\n },\r\n }\r\n}\r\n\r\nexport function buildChunk(\r\n completionId: string,\r\n model: string,\r\n delta: OpenAIChatCompletionChunkChoice['delta'],\r\n finishReason: OpenAIChatCompletionChunkChoice['finish_reason'] = null,\r\n): OpenAIChatCompletionChunk {\r\n return {\r\n id: completionId,\r\n object: 'chat.completion.chunk',\r\n created: Math.floor(Date.now() / 1000),\r\n model,\r\n choices: [\r\n {\r\n index: 0,\r\n delta,\r\n finish_reason: finishReason,\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function buildToolCallChunk(\r\n completionId: string,\r\n model: string,\r\n toolCallIndex: number,\r\n toolCallId: string,\r\n functionName: string,\r\n argumentsChunk: string,\r\n): OpenAIChatCompletionChunk {\r\n return buildChunk(completionId, model, {\r\n tool_calls: [\r\n {\r\n id: toolCallId,\r\n type: 'function',\r\n function: {\r\n name: functionName,\r\n arguments: argumentsChunk,\r\n },\r\n },\r\n ],\r\n })\r\n}\r\n\r\nexport function buildDoneChunk(\r\n completionId: string,\r\n model: string,\r\n): OpenAIChatCompletionChunk {\r\n return {\r\n id: completionId,\r\n object: 'chat.completion.chunk',\r\n created: Math.floor(Date.now() / 1000),\r\n model,\r\n choices: [\r\n {\r\n index: 0,\r\n delta: {},\r\n finish_reason: 'stop',\r\n },\r\n ],\r\n usage: {\r\n prompt_tokens: 0,\r\n completion_tokens: 0,\r\n total_tokens: 0,\r\n },\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\nimport { enableConfigs, getGlobalConfig } from '@utils/config'\r\nimport { showSetupScreens } from './cli/setupScreens'\r\nimport { logError } from '@utils/log'\r\nimport { tryInitSandboxPool, shutdownSandboxPool } from '@services/sandbox'\r\nimport {\r\n registerHealthProbe,\r\n startPeriodicHealthCheck,\r\n stopPeriodicHealthCheck,\r\n} from '@services/ai/healthCheck'\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 try {\r\n enableConfigs()\r\n } catch (e) {\r\n logError(e)\r\n }\r\n\r\n const config = getGlobalConfig()\r\n if (!config.hasCompletedOnboarding) {\r\n await showSetupScreens(opts.safeMode)\r\n }\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 const { pool: sandboxPool, capabilities: sandboxCaps } = await tryInitSandboxPool()\r\n if (sandboxPool) {\r\n console.log(`[Gateway] Container sandbox ready: ${sandboxCaps.name} (${sandboxCaps.version ?? 'unknown'})${sandboxCaps.rootless ? ' [rootless]' : ''}`)\r\n } else {\r\n console.log(`[Gateway] Container sandbox not available (bwrap/sandbox-exec fallback active)`)\r\n }\r\n\r\n registerHealthProbe(async (provider: string) => {\r\n try {\r\n const { getModelManager } = await import('@utils/model')\r\n const manager = getModelManager()\r\n const profiles = [\r\n manager.getModel('main'),\r\n manager.getModel('task'),\r\n manager.getModel('quick'),\r\n ].filter(Boolean)\r\n const match = profiles.find((p: any) => p?.provider === provider)\r\n if (!match) return true\r\n const OpenAI = (await import('openai')).default\r\n const client = new OpenAI({\r\n apiKey: (match as any).apiKey ?? process.env.OPENAI_API_KEY ?? 'sk-probe',\r\n baseURL: (match as any).baseUrl,\r\n timeout: 10_000,\r\n })\r\n await client.models.list()\r\n return true\r\n } catch {\r\n return false\r\n }\r\n })\r\n\r\n try {\r\n const { getModelManager } = await import('@utils/model')\r\n const manager = getModelManager()\r\n const providerSet = new Set<string>()\r\n for (const role of ['main', 'task', 'quick'] as const) {\r\n const profile = manager.getModel(role)\r\n if (profile && (profile as any).provider) {\r\n providerSet.add((profile as any).provider)\r\n }\r\n }\r\n if (providerSet.size > 0) {\r\n startPeriodicHealthCheck([...providerSet])\r\n }\r\n } catch {\r\n // model manager not ready yet\r\n }\r\n\r\n process.on('SIGINT', async () => {\r\n stopPeriodicHealthCheck()\r\n await shutdownSandboxPool()\r\n await gateway.stop()\r\n process.exit(0)\r\n })\r\n\r\n process.on('SIGTERM', async () => {\r\n stopPeriodicHealthCheck()\r\n await shutdownSandboxPool()\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": ["randomUUID", "resolve", "randomUUID", "createServer", "randomUUID", "resolve", "resolve", "join", "join", "existsSync", "existsSync", "join"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
|
+
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
getIdentity,
|
|
5
|
+
getIdentityPrompt,
|
|
6
|
+
resetIdentity,
|
|
7
|
+
setIdentity
|
|
8
|
+
} from "./chunk-JLVECHVJ.js";
|
|
9
|
+
import "./chunk-UYWZQVH5.js";
|
|
10
|
+
import "./chunk-D4OZACS2.js";
|
|
11
|
+
export {
|
|
12
|
+
getIdentity,
|
|
13
|
+
getIdentityPrompt,
|
|
14
|
+
resetIdentity,
|
|
15
|
+
setIdentity
|
|
16
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
2
|
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
|
-
MACRO
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
MACRO,
|
|
5
|
+
init_macros
|
|
6
|
+
} from "./chunk-EHQ2M5B4.js";
|
|
7
|
+
import "./chunk-D4OZACS2.js";
|
|
7
8
|
|
|
8
9
|
// src/entrypoints/index.ts
|
|
10
|
+
init_macros();
|
|
9
11
|
function hasFlag(...flags) {
|
|
10
12
|
return process.argv.some((arg) => flags.includes(arg));
|
|
11
13
|
}
|
|
@@ -28,9 +30,9 @@ Common options:
|
|
|
28
30
|
process.exit(0);
|
|
29
31
|
}
|
|
30
32
|
if (hasFlag("--acp")) {
|
|
31
|
-
await import("./acp-
|
|
33
|
+
await import("./acp-HA476EHW.js");
|
|
32
34
|
} else if (process.argv[2] === "gateway") {
|
|
33
|
-
await import("./gateway-
|
|
35
|
+
await import("./gateway-SUXSILQL.js");
|
|
34
36
|
} else {
|
|
35
|
-
await import("./cli-
|
|
37
|
+
await import("./cli-4KO6TA5J.js");
|
|
36
38
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/entrypoints/index.ts"],
|
|
4
4
|
"sourcesContent": ["import { MACRO } from '../constants/macros'\r\n\r\nfunction hasFlag(...flags: string[]): boolean {\r\n return process.argv.some(arg => flags.includes(arg))\r\n}\r\n\r\nif (hasFlag('--version', '-v')) {\r\n process.stdout.write(`${MACRO.VERSION || ''}\\n`)\r\n process.exit(0)\r\n}\r\n\r\nif (hasFlag('--help-lite')) {\r\n process.stdout.write(\r\n `Usage: newcraw [options] [command] [prompt]\\n\\n` +\r\n `Common options:\\n` +\r\n ` -h, --help Show full help\\n` +\r\n ` -v, --version Show version\\n` +\r\n ` -p, --print Print response and exit (non-interactive)\\n` +\r\n ` -c, --cwd <cwd> Set working directory\\n`,\r\n )\r\n process.exit(0)\r\n}\r\n\r\nif (hasFlag('--acp')) {\r\n await import('./acp.js')\r\n} else if (process.argv[2] === 'gateway') {\r\n await import('./gateway.js')\r\n} else {\r\n await import('./cli.js')\r\n}\r\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;AAAA;AAEA,SAAS,WAAW,OAA0B;AAC5C,SAAO,QAAQ,KAAK,KAAK,SAAO,MAAM,SAAS,GAAG,CAAC;AACrD;AAEA,IAAI,QAAQ,aAAa,IAAI,GAAG;AAC9B,UAAQ,OAAO,MAAM,GAAG,MAAM,WAAW,EAAE;AAAA,CAAI;AAC/C,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAI,QAAQ,aAAa,GAAG;AAC1B,UAAQ,OAAO;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AACA,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAI,QAAQ,OAAO,GAAG;AACpB,QAAM,OAAO,mBAAU;AACzB,WAAW,QAAQ,KAAK,CAAC,MAAM,WAAW;AACxC,QAAM,OAAO,uBAAc;AAC7B,OAAO;AACL,QAAM,OAAO,mBAAU;AACzB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,13 +4,14 @@ import {
|
|
|
4
4
|
findMostRecentKodeAgentSessionId,
|
|
5
5
|
loadKodeAgentSessionLogData,
|
|
6
6
|
loadKodeAgentSessionMessages
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-NFXLN6FJ.js";
|
|
8
|
+
import "./chunk-KJTPUTU7.js";
|
|
9
9
|
import "./chunk-JX5ZQYTQ.js";
|
|
10
10
|
import "./chunk-7ZFLZNOW.js";
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-XYQZLDRB.js";
|
|
12
|
+
import "./chunk-UYWZQVH5.js";
|
|
13
|
+
import "./chunk-EHQ2M5B4.js";
|
|
14
|
+
import "./chunk-D4OZACS2.js";
|
|
14
15
|
export {
|
|
15
16
|
findMostRecentKodeAgentSessionId,
|
|
16
17
|
loadKodeAgentSessionLogData,
|
|
@@ -3,13 +3,14 @@ const require = __newcrawCreateRequire(import.meta.url);
|
|
|
3
3
|
import {
|
|
4
4
|
listKodeAgentSessions,
|
|
5
5
|
resolveResumeSessionIdentifier
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-IVWPPTDM.js";
|
|
7
|
+
import "./chunk-KJTPUTU7.js";
|
|
8
8
|
import "./chunk-JX5ZQYTQ.js";
|
|
9
9
|
import "./chunk-7ZFLZNOW.js";
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-XYQZLDRB.js";
|
|
11
|
+
import "./chunk-UYWZQVH5.js";
|
|
12
|
+
import "./chunk-EHQ2M5B4.js";
|
|
13
|
+
import "./chunk-D4OZACS2.js";
|
|
13
14
|
export {
|
|
14
15
|
listKodeAgentSessions,
|
|
15
16
|
resolveResumeSessionIdentifier
|
|
@@ -3,11 +3,13 @@ const require = __newcrawCreateRequire(import.meta.url);
|
|
|
3
3
|
import {
|
|
4
4
|
kodeMessageToSdkMessage,
|
|
5
5
|
makeSdkInitMessage,
|
|
6
|
+
makeSdkReasoningMessage,
|
|
6
7
|
makeSdkResultMessage
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-VSSVN6WG.js";
|
|
9
|
+
import "./chunk-D4OZACS2.js";
|
|
9
10
|
export {
|
|
10
11
|
kodeMessageToSdkMessage,
|
|
11
12
|
makeSdkInitMessage,
|
|
13
|
+
makeSdkReasoningMessage,
|
|
12
14
|
makeSdkResultMessage
|
|
13
15
|
};
|
package/dist/{kodeAgentStreamJsonSession-XC3IPREZ.js → kodeAgentStreamJsonSession-4L76UC75.js}
RENAMED
|
@@ -2,12 +2,13 @@ import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
kodeMessageToSdkMessage,
|
|
5
|
+
makeSdkReasoningMessage,
|
|
5
6
|
makeSdkResultMessage
|
|
6
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-VSSVN6WG.js";
|
|
7
8
|
import {
|
|
8
9
|
createUserMessage
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-IXFBUXQW.js";
|
|
11
|
+
import "./chunk-D4OZACS2.js";
|
|
11
12
|
|
|
12
13
|
// src/utils/protocol/kodeAgentStreamJsonSession.ts
|
|
13
14
|
async function runKodeAgentStreamJsonSession(args) {
|
|
@@ -47,6 +48,7 @@ async function runKodeAgentStreamJsonSession(args) {
|
|
|
47
48
|
let lastAssistant = null;
|
|
48
49
|
let queryError = null;
|
|
49
50
|
const toAppend = [];
|
|
51
|
+
const reasoningEvents = [];
|
|
50
52
|
try {
|
|
51
53
|
const inputForTurn = [...conversation];
|
|
52
54
|
for await (const m of args.query(
|
|
@@ -56,9 +58,14 @@ async function runKodeAgentStreamJsonSession(args) {
|
|
|
56
58
|
args.canUseTool,
|
|
57
59
|
{
|
|
58
60
|
...args.toolUseContextBase,
|
|
59
|
-
abortController: turnAbortController
|
|
61
|
+
abortController: turnAbortController,
|
|
62
|
+
reasoningEvents
|
|
60
63
|
}
|
|
61
64
|
)) {
|
|
65
|
+
while (reasoningEvents.length > 0) {
|
|
66
|
+
const event = reasoningEvents.shift();
|
|
67
|
+
args.writeSdkLine(makeSdkReasoningMessage(event, args.sessionId));
|
|
68
|
+
}
|
|
62
69
|
if (m.type === "assistant") lastAssistant = m;
|
|
63
70
|
if (m.type !== "progress") {
|
|
64
71
|
toAppend.push(m);
|
|
@@ -66,6 +73,10 @@ async function runKodeAgentStreamJsonSession(args) {
|
|
|
66
73
|
const sdk = kodeMessageToSdkMessage(m, args.sessionId);
|
|
67
74
|
if (sdk) args.writeSdkLine(sdk);
|
|
68
75
|
}
|
|
76
|
+
while (reasoningEvents.length > 0) {
|
|
77
|
+
const event = reasoningEvents.shift();
|
|
78
|
+
args.writeSdkLine(makeSdkReasoningMessage(event, args.sessionId));
|
|
79
|
+
}
|
|
69
80
|
} catch (e) {
|
|
70
81
|
queryError = e;
|
|
71
82
|
try {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/protocol/kodeAgentStreamJsonSession.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Message, ReasoningEvent } 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 makeSdkReasoningMessage,\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 const reasoningEvents: ReasoningEvent[] = []\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 reasoningEvents,\r\n } as any,\r\n )) {\r\n while (reasoningEvents.length > 0) {\r\n const event = reasoningEvents.shift()!\r\n args.writeSdkLine(makeSdkReasoningMessage(event, args.sessionId))\r\n }\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\r\n while (reasoningEvents.length > 0) {\r\n const event = reasoningEvents.shift()!\r\n args.writeSdkLine(makeSdkReasoningMessage(event, args.sessionId))\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
|
+
}
|
|
@@ -2,9 +2,9 @@ import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
KodeAgentStructuredStdio
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-QSRXXZO7.js";
|
|
6
|
+
import "./chunk-NT7RDVDA.js";
|
|
7
|
+
import "./chunk-D4OZACS2.js";
|
|
8
8
|
export {
|
|
9
9
|
KodeAgentStructuredStdio
|
|
10
10
|
};
|
|
@@ -13,13 +13,14 @@ import {
|
|
|
13
13
|
runStopHooks,
|
|
14
14
|
runUserPromptSubmitHooks,
|
|
15
15
|
updateHookTranscriptForMessages
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-KS646CDL.js";
|
|
17
17
|
import "./chunk-7ZFLZNOW.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-JI4HCLK7.js";
|
|
19
19
|
import "./chunk-2UO3BFZH.js";
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-XYQZLDRB.js";
|
|
21
|
+
import "./chunk-UYWZQVH5.js";
|
|
22
|
+
import "./chunk-EHQ2M5B4.js";
|
|
23
|
+
import "./chunk-D4OZACS2.js";
|
|
23
24
|
export {
|
|
24
25
|
__resetKodeHooksCacheForTests,
|
|
25
26
|
drainHookSystemPromptAdditions,
|