@danya-ai/cli 0.1.0
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/LICENSE +201 -0
- package/README.md +336 -0
- package/cli-acp.js +82 -0
- package/cli.js +105 -0
- package/dist/REPL-EYUOXCEC.js +42 -0
- package/dist/REPL-EYUOXCEC.js.map +7 -0
- package/dist/acp-S5WNCLMD.js +1372 -0
- package/dist/acp-S5WNCLMD.js.map +7 -0
- package/dist/agentsValidate-RQ2QDGNY.js +373 -0
- package/dist/agentsValidate-RQ2QDGNY.js.map +7 -0
- package/dist/ask-TX526UBD.js +129 -0
- package/dist/ask-TX526UBD.js.map +7 -0
- package/dist/autoUpdater-63RAZ24N.js +17 -0
- package/dist/autoUpdater-63RAZ24N.js.map +7 -0
- package/dist/chunk-2VQWLLDU.js +16 -0
- package/dist/chunk-2VQWLLDU.js.map +7 -0
- package/dist/chunk-4CLHMO4I.js +656 -0
- package/dist/chunk-4CLHMO4I.js.map +7 -0
- package/dist/chunk-4ZNNWJZU.js +5696 -0
- package/dist/chunk-4ZNNWJZU.js.map +7 -0
- package/dist/chunk-66EZC7Y7.js +149 -0
- package/dist/chunk-66EZC7Y7.js.map +7 -0
- package/dist/chunk-6EPQRP3S.js +96 -0
- package/dist/chunk-6EPQRP3S.js.map +7 -0
- package/dist/chunk-77IRSDFR.js +195 -0
- package/dist/chunk-77IRSDFR.js.map +7 -0
- package/dist/chunk-7RZNLBEK.js +136 -0
- package/dist/chunk-7RZNLBEK.js.map +7 -0
- package/dist/chunk-BNBV2FXC.js +19 -0
- package/dist/chunk-BNBV2FXC.js.map +7 -0
- package/dist/chunk-CQCREBDO.js +248 -0
- package/dist/chunk-CQCREBDO.js.map +7 -0
- package/dist/chunk-D77XS6TB.js +74 -0
- package/dist/chunk-D77XS6TB.js.map +7 -0
- package/dist/chunk-DHYBJN3V.js +474 -0
- package/dist/chunk-DHYBJN3V.js.map +7 -0
- package/dist/chunk-DLSLSLTR.js +842 -0
- package/dist/chunk-DLSLSLTR.js.map +7 -0
- package/dist/chunk-ELAE6Z4H.js +514 -0
- package/dist/chunk-ELAE6Z4H.js.map +7 -0
- package/dist/chunk-ELZQD7ZR.js +531 -0
- package/dist/chunk-ELZQD7ZR.js.map +7 -0
- package/dist/chunk-F6DEGMX6.js +31269 -0
- package/dist/chunk-F6DEGMX6.js.map +7 -0
- package/dist/chunk-GDF2AON2.js +124 -0
- package/dist/chunk-GDF2AON2.js.map +7 -0
- package/dist/chunk-H7BGBV4P.js +498 -0
- package/dist/chunk-H7BGBV4P.js.map +7 -0
- package/dist/chunk-HIIHGKXP.js +24 -0
- package/dist/chunk-HIIHGKXP.js.map +7 -0
- package/dist/chunk-HJCCXED7.js +17 -0
- package/dist/chunk-HJCCXED7.js.map +7 -0
- package/dist/chunk-IQ6VZB2Y.js +139 -0
- package/dist/chunk-IQ6VZB2Y.js.map +7 -0
- package/dist/chunk-J4D7AELD.js +518 -0
- package/dist/chunk-J4D7AELD.js.map +7 -0
- package/dist/chunk-JVGG2YQR.js +23 -0
- package/dist/chunk-JVGG2YQR.js.map +7 -0
- package/dist/chunk-LGEK2NV7.js +939 -0
- package/dist/chunk-LGEK2NV7.js.map +7 -0
- package/dist/chunk-LWXT5RGE.js +95 -0
- package/dist/chunk-LWXT5RGE.js.map +7 -0
- package/dist/chunk-M3TKNAUR.js +35 -0
- package/dist/chunk-M3TKNAUR.js.map +7 -0
- package/dist/chunk-MRFO7QO5.js +170 -0
- package/dist/chunk-MRFO7QO5.js.map +7 -0
- package/dist/chunk-MVN3DHQF.js +95 -0
- package/dist/chunk-MVN3DHQF.js.map +7 -0
- package/dist/chunk-O25PXGOC.js +772 -0
- package/dist/chunk-O25PXGOC.js.map +7 -0
- package/dist/chunk-OBGVKM3N.js +1618 -0
- package/dist/chunk-OBGVKM3N.js.map +7 -0
- package/dist/chunk-OV5HJXXQ.js +198 -0
- package/dist/chunk-OV5HJXXQ.js.map +7 -0
- package/dist/chunk-P5VWDMRD.js +249 -0
- package/dist/chunk-P5VWDMRD.js.map +7 -0
- package/dist/chunk-PDSAJX7G.js +49 -0
- package/dist/chunk-PDSAJX7G.js.map +7 -0
- package/dist/chunk-RHNEZOPO.js +739 -0
- package/dist/chunk-RHNEZOPO.js.map +7 -0
- package/dist/chunk-SQGAHZPM.js +3004 -0
- package/dist/chunk-SQGAHZPM.js.map +7 -0
- package/dist/chunk-U7Z4MXY4.js +21 -0
- package/dist/chunk-U7Z4MXY4.js.map +7 -0
- package/dist/chunk-UNCTVIS7.js +146 -0
- package/dist/chunk-UNCTVIS7.js.map +7 -0
- package/dist/chunk-VMEOI6MH.js +1103 -0
- package/dist/chunk-VMEOI6MH.js.map +7 -0
- package/dist/chunk-WAY3DKFO.js +47 -0
- package/dist/chunk-WAY3DKFO.js.map +7 -0
- package/dist/chunk-XEYEKVFT.js +24 -0
- package/dist/chunk-XEYEKVFT.js.map +7 -0
- package/dist/chunk-Y4BQ36T4.js +796 -0
- package/dist/chunk-Y4BQ36T4.js.map +7 -0
- package/dist/chunk-Y5LQPJWK.js +12 -0
- package/dist/chunk-Y5LQPJWK.js.map +7 -0
- package/dist/chunk-YIJWUNWF.js +1260 -0
- package/dist/chunk-YIJWUNWF.js.map +7 -0
- package/dist/chunk-YMIWYEZ7.js +34 -0
- package/dist/chunk-YMIWYEZ7.js.map +7 -0
- package/dist/cli-PQNZWJX4.js +3952 -0
- package/dist/cli-PQNZWJX4.js.map +7 -0
- package/dist/commands-HOBCZ3VQ.js +46 -0
- package/dist/commands-HOBCZ3VQ.js.map +7 -0
- package/dist/config-MLH7ZTFA.js +81 -0
- package/dist/config-MLH7ZTFA.js.map +7 -0
- package/dist/context-FZ6G4J63.js +30 -0
- package/dist/context-FZ6G4J63.js.map +7 -0
- package/dist/costTracker-5WKZXN5S.js +19 -0
- package/dist/costTracker-5WKZXN5S.js.map +7 -0
- package/dist/customCommands-EB4MMZSS.js +25 -0
- package/dist/customCommands-EB4MMZSS.js.map +7 -0
- package/dist/env-VMEIP4EW.js +28 -0
- package/dist/env-VMEIP4EW.js.map +7 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +7 -0
- package/dist/kodeAgentSessionId-WUT74FSH.js +16 -0
- package/dist/kodeAgentSessionId-WUT74FSH.js.map +7 -0
- package/dist/kodeAgentSessionLoad-KR4JSD6D.js +21 -0
- package/dist/kodeAgentSessionLoad-KR4JSD6D.js.map +7 -0
- package/dist/kodeAgentSessionResume-BCD6UV74.js +18 -0
- package/dist/kodeAgentSessionResume-BCD6UV74.js.map +7 -0
- package/dist/kodeAgentStreamJson-EDHHWNNX.js +15 -0
- package/dist/kodeAgentStreamJson-EDHHWNNX.js.map +7 -0
- package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js +133 -0
- package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js.map +7 -0
- package/dist/kodeAgentStructuredStdio-UA5P5UNU.js +11 -0
- package/dist/kodeAgentStructuredStdio-UA5P5UNU.js.map +7 -0
- package/dist/kodeHooks-EHM6GSIQ.js +37 -0
- package/dist/kodeHooks-EHM6GSIQ.js.map +7 -0
- package/dist/llm-SJXCV7DA.js +3138 -0
- package/dist/llm-SJXCV7DA.js.map +7 -0
- package/dist/llmLazy-2QYJVD6K.js +15 -0
- package/dist/llmLazy-2QYJVD6K.js.map +7 -0
- package/dist/loader-LJX77EFL.js +28 -0
- package/dist/loader-LJX77EFL.js.map +7 -0
- package/dist/mcp-DOROSLPN.js +49 -0
- package/dist/mcp-DOROSLPN.js.map +7 -0
- package/dist/mentionProcessor-5UZRHCGH.js +215 -0
- package/dist/mentionProcessor-5UZRHCGH.js.map +7 -0
- package/dist/messages-N5KBI53P.js +65 -0
- package/dist/messages-N5KBI53P.js.map +7 -0
- package/dist/model-HPLBR53R.js +30 -0
- package/dist/model-HPLBR53R.js.map +7 -0
- package/dist/openai-YP4OJYKF.js +29 -0
- package/dist/openai-YP4OJYKF.js.map +7 -0
- package/dist/outputStyles-NNALI5D7.js +28 -0
- package/dist/outputStyles-NNALI5D7.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/pluginRuntime-JYYI5BSQ.js +220 -0
- package/dist/pluginRuntime-JYYI5BSQ.js.map +7 -0
- package/dist/pluginValidation-JWUFPZUE.js +17 -0
- package/dist/pluginValidation-JWUFPZUE.js.map +7 -0
- package/dist/prompts-B2SS7CWI.js +50 -0
- package/dist/prompts-B2SS7CWI.js.map +7 -0
- package/dist/query-HIK457UU.js +50 -0
- package/dist/query-HIK457UU.js.map +7 -0
- package/dist/responsesStreaming-L2BSN37C.js +10 -0
- package/dist/responsesStreaming-L2BSN37C.js.map +7 -0
- package/dist/ripgrep-GCKI4UTL.js +17 -0
- package/dist/ripgrep-GCKI4UTL.js.map +7 -0
- package/dist/skillMarketplace-PCTUUX46.js +37 -0
- package/dist/skillMarketplace-PCTUUX46.js.map +7 -0
- package/dist/state-XJICGOUA.js +18 -0
- package/dist/state-XJICGOUA.js.map +7 -0
- package/dist/theme-DP7O4SGH.js +14 -0
- package/dist/theme-DP7O4SGH.js.map +7 -0
- package/dist/toolPermissionContext-DHAGUPEW.js +17 -0
- package/dist/toolPermissionContext-DHAGUPEW.js.map +7 -0
- package/dist/toolPermissionSettings-PT65MQIQ.js +18 -0
- package/dist/toolPermissionSettings-PT65MQIQ.js.map +7 -0
- package/dist/tools-BHW37PCF.js +47 -0
- package/dist/tools-BHW37PCF.js.map +7 -0
- package/dist/userInput-XDRYT5TI.js +316 -0
- package/dist/userInput-XDRYT5TI.js.map +7 -0
- package/dist/uuid-QUYJMIUV.js +9 -0
- package/dist/uuid-QUYJMIUV.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +115 -0
- package/scripts/binary-utils.cjs +62 -0
- package/scripts/cli-acp-wrapper.cjs +82 -0
- package/scripts/cli-wrapper.cjs +105 -0
- package/scripts/postinstall.js +144 -0
- package/yoga.wasm +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/messages/core.ts", "../src/services/ai/llmConstants.ts", "../src/utils/messages/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash, randomUUID, UUID } from 'crypto'\r\nimport { AssistantMessage, Message, ProgressMessage, UserMessage } from '@query'\r\nimport { last, memoize } from 'lodash-es'\r\nimport type { Tool } from '@tool'\r\nimport { NO_CONTENT_MESSAGE } from '@services/llmConstants'\r\nimport {\r\n ImageBlockParam,\r\n TextBlockParam,\r\n ToolResultBlockParam,\r\n ToolUseBlockParam,\r\n Message as APIMessage,\r\n ContentBlockParam,\r\n ContentBlock,\r\n} from '@anthropic-ai/sdk/resources/index.mjs'\r\n\r\nexport const INTERRUPT_MESSAGE = '[Request interrupted by user]'\r\nexport const INTERRUPT_MESSAGE_FOR_TOOL_USE =\r\n '[Request interrupted by user for tool use]'\r\nexport const CANCEL_MESSAGE =\r\n \"The user doesn't want to take this action right now. STOP what you are doing and wait for the user to tell you how to proceed.\"\r\nexport const REJECT_MESSAGE =\r\n \"The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.\"\r\nexport const REJECT_MESSAGE_WITH_FEEDBACK_PREFIX = `The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). To tell you how to proceed, the user said:\\n`\r\nexport const REJECTED_PLAN_PREFIX = `The agent proposed a plan that was rejected by the user. The user chose to stay in plan mode rather than proceed with implementation.\\n\\nRejected plan:\\n`\r\nexport const NO_RESPONSE_REQUESTED = 'No response requested.'\r\n\r\nexport const SYNTHETIC_ASSISTANT_MESSAGES = new Set([\r\n INTERRUPT_MESSAGE,\r\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\r\n CANCEL_MESSAGE,\r\n REJECT_MESSAGE,\r\n NO_RESPONSE_REQUESTED,\r\n])\r\n\r\nfunction stableUuidFromSeed(seed: string): UUID {\r\n const hex = createHash('sha256').update(seed).digest('hex').slice(0, 32)\r\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}` as UUID\r\n}\r\n\r\nfunction baseCreateAssistantMessage(\r\n content: ContentBlock[],\r\n extra?: Partial<AssistantMessage>,\r\n): AssistantMessage {\r\n return {\r\n type: 'assistant',\r\n costUSD: 0,\r\n durationMs: 0,\r\n uuid: randomUUID(),\r\n message: {\r\n id: randomUUID(),\r\n model: '<synthetic>',\r\n role: 'assistant',\r\n stop_reason: 'stop_sequence',\r\n stop_sequence: '',\r\n type: 'message',\r\n usage: {\r\n input_tokens: 0,\r\n output_tokens: 0,\r\n cache_creation_input_tokens: 0,\r\n cache_read_input_tokens: 0,\r\n },\r\n content,\r\n },\r\n ...extra,\r\n }\r\n}\r\n\r\nexport function createAssistantMessage(content: string): AssistantMessage {\r\n return baseCreateAssistantMessage([\r\n {\r\n type: 'text' as const,\r\n text: content === '' ? NO_CONTENT_MESSAGE : content,\r\n citations: [],\r\n },\r\n ])\r\n}\r\n\r\nexport function createAssistantAPIErrorMessage(\r\n content: string,\r\n): AssistantMessage {\r\n return baseCreateAssistantMessage(\r\n [\r\n {\r\n type: 'text' as const,\r\n text: content === '' ? NO_CONTENT_MESSAGE : content,\r\n citations: [],\r\n },\r\n ],\r\n { isApiErrorMessage: true },\r\n )\r\n}\r\n\r\nexport type FullToolUseResult = {\r\n data: unknown\r\n resultForAssistant: ToolResultBlockParam['content']\r\n newMessages?: Message[]\r\n contextModifier?: { modifyContext: (ctx: any) => any }\r\n}\r\n\r\nexport function createUserMessage(\r\n content: string | ContentBlockParam[],\r\n toolUseResult?: FullToolUseResult,\r\n): UserMessage {\r\n const m: UserMessage = {\r\n type: 'user',\r\n message: {\r\n role: 'user',\r\n content,\r\n },\r\n uuid: randomUUID(),\r\n toolUseResult,\r\n }\r\n return m\r\n}\r\n\r\nexport function createProgressMessage(\r\n toolUseID: string,\r\n siblingToolUseIDs: Set<string>,\r\n content: AssistantMessage,\r\n normalizedMessages: NormalizedMessage[],\r\n tools: Tool[],\r\n): ProgressMessage {\r\n return {\r\n type: 'progress',\r\n content,\r\n normalizedMessages,\r\n siblingToolUseIDs,\r\n tools,\r\n toolUseID,\r\n uuid: randomUUID(),\r\n }\r\n}\r\n\r\nexport function createToolResultStopMessage(\r\n toolUseID: string,\r\n): ToolResultBlockParam {\r\n return {\r\n type: 'tool_result',\r\n content: CANCEL_MESSAGE,\r\n is_error: true,\r\n tool_use_id: toolUseID,\r\n }\r\n}\r\n\r\nexport function extractTagFromMessage(\r\n message: Message,\r\n tagName: string,\r\n): string | null {\r\n if (message.type === 'progress') {\r\n return null\r\n }\r\n if (typeof message.message.content !== 'string') {\r\n return null\r\n }\r\n return extractTag(message.message.content, tagName)\r\n}\r\n\r\nexport function extractTag(html: string, tagName: string): string | null {\r\n if (!html.trim() || !tagName.trim()) {\r\n return null\r\n }\r\n\r\n const escapedTag = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n\r\n const pattern = new RegExp(\r\n `<${escapedTag}(?:\\\\s+[^>]*)?>` + '([\\\\s\\\\S]*?)' + `<\\\\/${escapedTag}>`,\r\n 'gi',\r\n )\r\n\r\n let match\r\n let depth = 0\r\n let lastIndex = 0\r\n const openingTag = new RegExp(`<${escapedTag}(?:\\\\s+[^>]*?)?>`, 'gi')\r\n const closingTag = new RegExp(`<\\\\/${escapedTag}>`, 'gi')\r\n\r\n while ((match = pattern.exec(html)) !== null) {\r\n const content = match[1]\r\n const beforeMatch = html.slice(lastIndex, match.index)\r\n\r\n depth = 0\r\n\r\n openingTag.lastIndex = 0\r\n while (openingTag.exec(beforeMatch) !== null) {\r\n depth++\r\n }\r\n\r\n closingTag.lastIndex = 0\r\n while (closingTag.exec(beforeMatch) !== null) {\r\n depth--\r\n }\r\n\r\n if (depth === 0 && content) {\r\n return content\r\n }\r\n\r\n lastIndex = match.index + match[0].length\r\n }\r\n\r\n return null\r\n}\r\n\r\nexport function isNotEmptyMessage(message: Message): boolean {\r\n if (message.type === 'progress') {\r\n return true\r\n }\r\n\r\n if (typeof message.message.content === 'string') {\r\n return message.message.content.trim().length > 0\r\n }\r\n\r\n if (message.message.content.length === 0) {\r\n return false\r\n }\r\n\r\n if (message.message.content.length > 1) {\r\n return true\r\n }\r\n\r\n if (message.message.content[0]!.type !== 'text') {\r\n return true\r\n }\r\n\r\n return (\r\n message.message.content[0]!.text.trim().length > 0 &&\r\n message.message.content[0]!.text !== NO_CONTENT_MESSAGE &&\r\n message.message.content[0]!.text !== INTERRUPT_MESSAGE_FOR_TOOL_USE\r\n )\r\n}\r\n\r\ntype NormalizedUserMessage = {\r\n message: {\r\n content: [\r\n | TextBlockParam\r\n | ImageBlockParam\r\n | ToolUseBlockParam\r\n | ToolResultBlockParam,\r\n ]\r\n role: 'user'\r\n }\r\n type: 'user'\r\n uuid: UUID\r\n}\r\n\r\nexport type NormalizedMessage =\r\n | NormalizedUserMessage\r\n | AssistantMessage\r\n | ProgressMessage\r\n\r\nexport function normalizeMessages(messages: Message[]): NormalizedMessage[] {\r\n return messages.flatMap(message => {\r\n if (message.type === 'progress') {\r\n return [message] as NormalizedMessage[]\r\n }\r\n if (typeof message.message.content === 'string') {\r\n return [message] as NormalizedMessage[]\r\n }\r\n const contentBlocks = message.message.content.filter(\r\n block =>\r\n !(\r\n block.type === 'thinking' &&\r\n (typeof (block as any).thinking !== 'string' ||\r\n (block as any).thinking.trim().length === 0)\r\n ),\r\n )\r\n\r\n return contentBlocks.map((block, blockIndex) => {\r\n switch (message.type) {\r\n case 'assistant':\r\n const baseSeed = String(\r\n (message as any).uuid ??\r\n (message as any).message?.id ??\r\n randomUUID(),\r\n )\r\n return {\r\n type: 'assistant',\r\n uuid: stableUuidFromSeed(`${baseSeed}:${blockIndex}`),\r\n message: {\r\n ...message.message,\r\n content: [block],\r\n },\r\n costUSD:\r\n (message as AssistantMessage).costUSD / contentBlocks.length,\r\n durationMs: (message as AssistantMessage).durationMs,\r\n } as NormalizedMessage\r\n case 'user':\r\n return message as NormalizedUserMessage\r\n }\r\n })\r\n })\r\n}\r\n\r\ntype ToolUseRequestMessage = AssistantMessage & {\r\n message: { content: any[] }\r\n}\r\n\r\ntype ToolUseLikeBlockParam = ToolUseBlockParam & {\r\n type: 'tool_use' | 'server_tool_use' | 'mcp_tool_use'\r\n}\r\n\r\nfunction isToolUseLikeBlockParam(block: any): block is ToolUseLikeBlockParam {\r\n return (\r\n block &&\r\n typeof block === 'object' &&\r\n (block.type === 'tool_use' ||\r\n block.type === 'server_tool_use' ||\r\n block.type === 'mcp_tool_use') &&\r\n typeof block.id === 'string'\r\n )\r\n}\r\n\r\nfunction isToolUseRequestMessage(\r\n message: Message,\r\n): message is ToolUseRequestMessage {\r\n return (\r\n message.type === 'assistant' &&\r\n 'costUSD' in message &&\r\n message.message.content.some(isToolUseLikeBlockParam)\r\n )\r\n}\r\n\r\nexport function reorderMessages(\r\n messages: NormalizedMessage[],\r\n): NormalizedMessage[] {\r\n const ms: NormalizedMessage[] = []\r\n const toolUseMessages: ToolUseRequestMessage[] = []\r\n\r\n for (const message of messages) {\r\n if (isToolUseRequestMessage(message)) {\r\n toolUseMessages.push(message)\r\n }\r\n\r\n if (message.type === 'progress') {\r\n const existingProgressMessage = ms.find(\r\n _ => _.type === 'progress' && _.toolUseID === message.toolUseID,\r\n )\r\n if (existingProgressMessage) {\r\n ms[ms.indexOf(existingProgressMessage)] = message\r\n continue\r\n }\r\n const toolUseMessage = toolUseMessages.find(\r\n _ => _.message.content[0]?.id === message.toolUseID,\r\n )\r\n if (toolUseMessage) {\r\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\r\n continue\r\n }\r\n }\r\n\r\n if (\r\n message.type === 'user' &&\r\n Array.isArray(message.message.content) &&\r\n message.message.content[0]?.type === 'tool_result'\r\n ) {\r\n const toolUseID = (message.message.content[0] as ToolResultBlockParam)\r\n ?.tool_use_id\r\n\r\n const lastProgressMessage = ms.find(\r\n _ => _.type === 'progress' && _.toolUseID === toolUseID,\r\n )\r\n if (lastProgressMessage) {\r\n ms.splice(ms.indexOf(lastProgressMessage) + 1, 0, message)\r\n continue\r\n }\r\n\r\n const toolUseMessage = toolUseMessages.find(\r\n _ => _.message.content[0]?.id === toolUseID,\r\n )\r\n if (toolUseMessage) {\r\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\r\n continue\r\n }\r\n }\r\n\r\n else {\r\n ms.push(message)\r\n }\r\n }\r\n\r\n return ms\r\n}\r\n\r\nconst getToolResultIDs = memoize(\r\n (normalizedMessages: NormalizedMessage[]): { [toolUseID: string]: boolean } =>\r\n Object.fromEntries(\r\n normalizedMessages.flatMap(_ =>\r\n _.type === 'user' && _.message.content[0]?.type === 'tool_result'\r\n ? [\r\n [\r\n _.message.content[0]!.tool_use_id,\r\n _.message.content[0]!.is_error ?? false,\r\n ],\r\n ]\r\n : ([] as [string, boolean][]),\r\n ),\r\n ),\r\n)\r\n\r\nexport function getUnresolvedToolUseIDs(\r\n normalizedMessages: NormalizedMessage[],\r\n): Set<string> {\r\n const toolResults = getToolResultIDs(normalizedMessages)\r\n return new Set(\r\n normalizedMessages\r\n .filter(\r\n (\r\n _,\r\n ): _ is AssistantMessage & {\r\n message: { content: [ToolUseLikeBlockParam] }\r\n } =>\r\n _.type === 'assistant' &&\r\n Array.isArray(_.message.content) &&\r\n isToolUseLikeBlockParam(_.message.content[0]) &&\r\n !(_.message.content[0].id in toolResults),\r\n )\r\n .map(_ => _.message.content[0].id),\r\n )\r\n}\r\n\r\nexport function getInProgressToolUseIDs(\r\n normalizedMessages: NormalizedMessage[],\r\n): Set<string> {\r\n const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalizedMessages)\r\n\r\n function isQueuedWaitingProgressMessage(message: NormalizedMessage): boolean {\r\n if (message.type !== 'progress') return false\r\n const firstBlock = message.content.message.content[0]\r\n if (!firstBlock || firstBlock.type !== 'text') return false\r\n const rawText = String(firstBlock.text ?? '')\r\n const text = rawText.startsWith('<tool-progress>')\r\n ? (extractTag(rawText, 'tool-progress') ?? rawText)\r\n : rawText\r\n return text.trim() === 'Waiting\u2026'\r\n }\r\n\r\n const toolUseIDsThatHaveProgressMessages = new Set(\r\n normalizedMessages\r\n .filter(\r\n (_): _ is ProgressMessage =>\r\n _.type === 'progress' && !isQueuedWaitingProgressMessage(_),\r\n )\r\n .map(_ => _.toolUseID),\r\n )\r\n return new Set(\r\n (\r\n normalizedMessages.filter(_ => {\r\n if (_.type !== 'assistant') {\r\n return false\r\n }\r\n const firstBlock = _.message.content[0]\r\n if (!isToolUseLikeBlockParam(firstBlock)) return false\r\n const toolUseID = firstBlock.id\r\n if (toolUseID === unresolvedToolUseIDs.values().next().value) {\r\n return true\r\n }\r\n\r\n if (\r\n toolUseIDsThatHaveProgressMessages.has(toolUseID) &&\r\n unresolvedToolUseIDs.has(toolUseID)\r\n ) {\r\n return true\r\n }\r\n\r\n return false\r\n }) as AssistantMessage[]\r\n ).map(_ => (_.message.content[0]! as ToolUseBlockParam).id),\r\n )\r\n}\r\n\r\nexport function getErroredToolUseMessages(\r\n normalizedMessages: NormalizedMessage[],\r\n): AssistantMessage[] {\r\n const toolResults = getToolResultIDs(normalizedMessages)\r\n return normalizedMessages.filter(\r\n _ =>\r\n _.type === 'assistant' &&\r\n Array.isArray(_.message.content) &&\r\n isToolUseLikeBlockParam(_.message.content[0]) &&\r\n _.message.content[0].id in toolResults &&\r\n toolResults[_.message.content[0].id],\r\n ) as AssistantMessage[]\r\n}\r\n\r\nexport function normalizeMessagesForAPI(\r\n messages: Message[],\r\n): (UserMessage | AssistantMessage)[] {\r\n function isSyntheticApiErrorMessage(message: Message): boolean {\r\n return (\r\n message.type === 'assistant' &&\r\n message.isApiErrorMessage === true &&\r\n message.message.model === '<synthetic>'\r\n )\r\n }\r\n\r\n function normalizeUserContent(\r\n content: UserMessage['message']['content'],\r\n ): ContentBlockParam[] {\r\n if (typeof content === 'string') {\r\n return [{ type: 'text', text: content }]\r\n }\r\n return content\r\n }\r\n\r\n function toolResultsFirst(content: ContentBlockParam[]): ContentBlockParam[] {\r\n const toolResults: ContentBlockParam[] = []\r\n const rest: ContentBlockParam[] = []\r\n for (const block of content) {\r\n if (block.type === 'tool_result') {\r\n toolResults.push(block)\r\n } else {\r\n rest.push(block)\r\n }\r\n }\r\n return [...toolResults, ...rest]\r\n }\r\n\r\n function mergeUserMessages(\r\n base: UserMessage,\r\n next: UserMessage,\r\n ): UserMessage {\r\n const baseBlocks = normalizeUserContent(base.message.content)\r\n const nextBlocks = normalizeUserContent(next.message.content)\r\n return {\r\n ...base,\r\n message: {\r\n ...base.message,\r\n content: toolResultsFirst([...baseBlocks, ...nextBlocks]),\r\n },\r\n }\r\n }\r\n\r\n function isUserToolResultMessage(message: Message): message is UserMessage {\r\n if (message.type !== 'user') return false\r\n if (!Array.isArray(message.message.content)) return false\r\n return message.message.content.some(block => block.type === 'tool_result')\r\n }\r\n\r\n const result: (UserMessage | AssistantMessage)[] = []\r\n for (const message of messages) {\r\n if (message.type === 'progress') continue\r\n if (isSyntheticApiErrorMessage(message)) continue\r\n\r\n switch (message.type) {\r\n case 'user': {\r\n const prev = last(result)\r\n if (prev?.type === 'user') {\r\n result[result.indexOf(prev)] = mergeUserMessages(prev, message)\r\n } else {\r\n result.push(message)\r\n }\r\n break\r\n }\r\n case 'assistant': {\r\n let merged = false\r\n for (let i = result.length - 1; i >= 0; i--) {\r\n const prev = result[i]\r\n if (prev.type !== 'assistant' && !isUserToolResultMessage(prev)) {\r\n break\r\n }\r\n if (prev.type === 'assistant') {\r\n if (prev.message.id === message.message.id) {\r\n result[i] = {\r\n ...prev,\r\n message: {\r\n ...prev.message,\r\n content: [\r\n ...(Array.isArray(prev.message.content)\r\n ? prev.message.content\r\n : []),\r\n ...(Array.isArray(message.message.content)\r\n ? message.message.content\r\n : []),\r\n ],\r\n },\r\n }\r\n merged = true\r\n }\r\n break\r\n }\r\n }\r\n if (!merged) {\r\n result.push(message)\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function normalizeContentFromAPI(\r\n content: APIMessage['content'],\r\n): APIMessage['content'] {\r\n const filteredContent = content.filter(\r\n _ => _.type !== 'text' || _.text.trim().length > 0,\r\n )\r\n\r\n if (filteredContent.length === 0) {\r\n return [{ type: 'text', text: NO_CONTENT_MESSAGE, citations: [] }]\r\n }\r\n\r\n return filteredContent\r\n}\r\n\r\nexport function isEmptyMessageText(text: string): boolean {\r\n return (\r\n stripSystemMessages(text).trim() === '' ||\r\n text.trim() === NO_CONTENT_MESSAGE\r\n )\r\n}\r\n\r\n/**\r\n * Filter messages to get user text messages for the undo menu (2xESC).\r\n * Excludes:\r\n * - Assistant messages\r\n * - User messages that only contain tool_result blocks\r\n */\r\nexport function filterUserTextMessagesForUndo(\r\n messages: (UserMessage | AssistantMessage)[],\r\n): UserMessage[] {\r\n return messages.filter((msg): msg is UserMessage => {\r\n if (msg.type !== 'user') return false\r\n if (!Array.isArray(msg.message.content)) return true\r\n return !msg.message.content.every(block => block.type === 'tool_result')\r\n })\r\n}\r\nconst STRIPPED_TAGS = [\r\n 'commit_analysis',\r\n 'context',\r\n 'function_analysis',\r\n 'pr_analysis',\r\n]\r\n\r\nexport function stripSystemMessages(content: string): string {\r\n const regex = new RegExp(`<(${STRIPPED_TAGS.join('|')})>.*?</\\\\1>\\n?`, 'gs')\r\n return content.replace(regex, '').trim()\r\n}\r\n\r\nexport function getToolUseID(message: NormalizedMessage): string | null {\r\n switch (message.type) {\r\n case 'assistant':\r\n return isToolUseLikeBlockParam(message.message.content[0])\r\n ? message.message.content[0].id\r\n : null\r\n case 'user':\r\n if (message.message.content[0]?.type !== 'tool_result') {\r\n return null\r\n }\r\n return message.message.content[0].tool_use_id\r\n case 'progress':\r\n return message.toolUseID\r\n }\r\n}\r\n\r\nexport function getLastAssistantMessageId(\r\n messages: Message[],\r\n): string | undefined {\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n const message = messages[i]\r\n if (message && message.type === 'assistant') {\r\n return message.message.id\r\n }\r\n }\r\n return undefined\r\n}\r\n", "export const API_ERROR_MESSAGE_PREFIX = 'API Error'\r\nexport const PROMPT_TOO_LONG_ERROR_MESSAGE = 'Prompt is too long'\r\nexport const CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE = 'Credit balance is too low'\r\nexport const INVALID_API_KEY_ERROR_MESSAGE =\r\n 'Invalid API key \u00B7 Please run /login'\r\nexport const NO_CONTENT_MESSAGE = '(no content)'\r\n\r\nexport const MAIN_QUERY_TEMPERATURE = 1\r\n", "export * from './core'\r\n\r\nimport type { SetToolJSXFn, ToolUseContext } from '@tool'\r\nimport type { Message } from '@query'\r\n\r\nexport async function processUserInput(\r\n input: string,\r\n mode: 'bash' | 'prompt' | 'koding',\r\n setToolJSX: SetToolJSXFn,\r\n context: ToolUseContext & {\r\n setForkConvoWithMessagesOnTheNextRender: (\r\n forkConvoWithMessages: Message[],\r\n ) => void\r\n options?: {\r\n isKodingRequest?: boolean\r\n kodingContext?: string\r\n }\r\n },\r\n pastedImages: Array<{\r\n placeholder: string\r\n data: string\r\n mediaType: string\r\n }> | null,\r\n): Promise<Message[]> {\r\n const impl = await import('./userInput')\r\n return impl.processUserInput(input, mode, setToolJSX, context, pastedImages)\r\n}\r\n\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createRequire as __kodeCreateRequire } from "node:module";
|
|
2
|
+
const require = __kodeCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/utils/text/errors.ts
|
|
5
|
+
var MalformedCommandError = class extends TypeError {
|
|
6
|
+
};
|
|
7
|
+
var AbortError = class extends Error {
|
|
8
|
+
};
|
|
9
|
+
var ConfigParseError = class extends Error {
|
|
10
|
+
filePath;
|
|
11
|
+
defaultConfig;
|
|
12
|
+
constructor(message, filePath, defaultConfig) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "ConfigParseError";
|
|
15
|
+
this.filePath = filePath;
|
|
16
|
+
this.defaultConfig = defaultConfig;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
MalformedCommandError,
|
|
22
|
+
AbortError,
|
|
23
|
+
ConfigParseError
|
|
24
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/text/errors.ts"],
|
|
4
|
+
"sourcesContent": ["export class MalformedCommandError extends TypeError {}\r\n\r\nexport class DeprecatedCommandError extends Error {}\r\n\r\nexport class AbortError extends Error {}\r\n\r\nexport class ConfigParseError extends Error {\r\n filePath: string\r\n defaultConfig: unknown\r\n\r\n constructor(message: string, filePath: string, defaultConfig: unknown) {\r\n super(message)\r\n this.name = 'ConfigParseError'\r\n this.filePath = filePath\r\n this.defaultConfig = defaultConfig\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": ";;;;AAAO,IAAM,wBAAN,cAAoC,UAAU;AAAC;AAI/C,IAAM,aAAN,cAAyB,MAAM;AAAC;AAEhC,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,UAAkB,eAAwB;AACrE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,gBAAgB;AAAA,EACvB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createRequire as __kodeCreateRequire } from "node:module";
|
|
2
|
+
const require = __kodeCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/core/tools/tool.ts
|
|
5
|
+
function getToolDescription(tool) {
|
|
6
|
+
if (tool.cachedDescription) {
|
|
7
|
+
return tool.cachedDescription;
|
|
8
|
+
}
|
|
9
|
+
if (typeof tool.description === "string") {
|
|
10
|
+
return tool.description;
|
|
11
|
+
}
|
|
12
|
+
return `Tool: ${tool.name}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
getToolDescription
|
|
17
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/tools/tool.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport type * as React from 'react'\nimport type { PermissionMode } from '@kode-types/permissionMode'\nimport type { ToolPermissionContext } from '@kode-types/toolPermissionContext'\nimport type {\n PermissionResult,\n PermissionDecision,\n} from '../../types/permissions-codex'\n\nexport type SetToolJSXFn = (\n jsx: {\n jsx: React.ReactNode | null\n shouldHidePromptInput: boolean\n } | null,\n) => void\n\nexport interface ToolUseContext {\n messageId: string | undefined\n toolUseId?: string\n agentId?: string\n safeMode?: boolean\n abortController: AbortController\n readFileTimestamps: { [filePath: string]: number }\n options?: {\n commands?: any[]\n tools?: any[]\n verbose?: boolean\n slowAndCapableModel?: string\n safeMode?: boolean\n permissionMode?: PermissionMode\n toolPermissionContext?: ToolPermissionContext\n lastUserPrompt?: string\n forkNumber?: number\n messageLogName?: string\n maxThinkingTokens?: any\n model?: string\n commandAllowedTools?: string[]\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n mcpClients?: any[]\n disableSlashCommands?: boolean\n persistSession?: boolean\n shouldAvoidPermissionPrompts?: boolean\n }\n responseState?: {\n previousResponseId?: string\n conversationId?: string\n }\n}\n\nexport interface ExtendedToolUseContext extends ToolUseContext {\n setToolJSX: SetToolJSXFn\n}\n\nexport interface ValidationResult {\n result: boolean\n message?: string\n errorCode?: number\n meta?: any\n}\n\n// ============================================================================\n// Tool Progress (ported from Codex)\n// ============================================================================\n\nexport type ToolProgressData = Record<string, unknown>\n\nexport type ToolProgress<P extends ToolProgressData = ToolProgressData> = {\n toolUseID: string\n data: P\n}\n\nexport type ToolCallProgress<P extends ToolProgressData = ToolProgressData> = (\n progress: ToolProgress<P>,\n) => void\n\n// ============================================================================\n// Tool Result (ported from Codex)\n// ============================================================================\n\nexport type ToolResult<T = unknown> = {\n data: T\n newMessages?: unknown[]\n contextModifier?: {\n modifyContext: (ctx: ToolUseContext) => ToolUseContext\n }\n}\n\n// ============================================================================\n// Tool Interface\n// ============================================================================\n\nexport interface Tool<\n TInput extends z.ZodTypeAny = z.ZodTypeAny,\n TOutput = any,\n> {\n // \u2500\u2500 Identity \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n name: string\n description?: string | ((input?: z.infer<TInput>) => Promise<string>)\n inputSchema: TInput\n inputJSONSchema?: Record<string, unknown>\n prompt: (options?: { safeMode?: boolean }) => Promise<string>\n userFacingName?: (input?: z.infer<TInput>) => string\n cachedDescription?: string\n\n /** 3-10 word hint for tool discovery (Codex: ToolSearchTool) */\n searchHint?: string\n\n // \u2500\u2500 State Queries \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n isEnabled: () => Promise<boolean>\n isReadOnly: (input?: z.infer<TInput>) => boolean\n isConcurrencySafe: (input?: z.infer<TInput>) => boolean\n needsPermissions: (input?: z.infer<TInput>) => boolean\n requiresUserInteraction?: (input?: z.infer<TInput>) => boolean\n\n /**\n * Whether the tool performs an irreversible action (delete, send, overwrite).\n * Used for risk assessment in gate chain and destructive command detection.\n * Ported from Codex.\n */\n isDestructive?: (input?: z.infer<TInput>) => boolean\n\n /**\n * Extract the primary file path from tool input (for file-based tools).\n * Used by permission system for path-based rule matching.\n * Ported from Codex.\n */\n getPath?: (input: z.infer<TInput>) => string\n\n /**\n * Maximum result size in characters before persisting to disk.\n * Large results are saved to file and the model gets a preview + path.\n * Ported from Codex.\n */\n maxResultSizeChars?: number\n\n // \u2500\u2500 Validation & Permissions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n validateInput?: (\n input: z.infer<TInput>,\n context?: ToolUseContext,\n ) => Promise<ValidationResult>\n\n /**\n * Rich permission checking that returns allow/ask/deny with reasons.\n * Ported from Codex \u2014 provides richer feedback than needsPermissions().\n * If both checkPermissions and needsPermissions exist, checkPermissions takes precedence.\n */\n checkPermissions?: (\n input: z.infer<TInput>,\n context: ToolUseContext,\n ) => Promise<PermissionResult>\n\n /**\n * Prepare a matcher function for checking this tool's input against permission rules.\n * Returns a function that takes a rule pattern and returns whether it matches.\n * Ported from Codex.\n */\n preparePermissionMatcher?: (\n input: z.infer<TInput>,\n ) => Promise<(rulePattern: string) => boolean>\n\n // \u2500\u2500 Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n renderResultForAssistant: (output: TOutput) => string | any[]\n renderToolUseMessage: (\n input: z.infer<TInput>,\n options: { verbose: boolean },\n ) => string | React.ReactElement | null\n renderToolUseRejectedMessage?: (...args: any[]) => React.ReactElement\n renderToolResultMessage?: (\n output: TOutput,\n options: { verbose: boolean },\n ) => React.ReactNode\n\n /**\n * Description for the status spinner during tool execution.\n * Returns something like \"Reading src/foo.ts\" or \"Searching codebase\".\n * Ported from Codex.\n */\n getActivityDescription?: (input: z.infer<TInput>) => string | null\n\n // \u2500\u2500 Execution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /**\n * Async generator-based execution (Kode's pattern).\n * Yields progress events and a final result.\n */\n call: (\n input: z.infer<TInput>,\n context: ToolUseContext,\n ) => AsyncGenerator<\n | {\n type: 'result'\n data: TOutput\n resultForAssistant?: string | any[]\n newMessages?: unknown[]\n contextModifier?: {\n modifyContext: (ctx: ToolUseContext) => ToolUseContext\n }\n }\n | {\n type: 'progress'\n content: any\n normalizedMessages?: any[]\n tools?: any[]\n },\n void,\n unknown\n >\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nexport function getToolDescription(tool: Tool): string {\n if (tool.cachedDescription) {\n return tool.cachedDescription\n }\n\n if (typeof tool.description === 'string') {\n return tool.description\n }\n\n return `Tool: ${tool.name}`\n}\n\n/**\n * Find a tool by name from a tool array.\n * Ported from Codex.\n */\nexport function findToolByName(tools: Tool[], name: string): Tool | undefined {\n return tools.find((t) => t.name === name)\n}\n\n/**\n * Check if a tool is safe to run in parallel based on its input.\n * Read-only tools are always safe. Non-read-only tools check isConcurrencySafe.\n */\nexport function isToolParallelSafe(tool: Tool, input?: unknown): boolean {\n if (tool.isReadOnly(input)) return true\n return tool.isConcurrencySafe(input)\n}\n\n/**\n * Partition tool calls into parallel-safe and serial batches.\n * Ported from Codex's toolOrchestration pattern.\n */\nexport function partitionToolCalls<T extends { tool: Tool; input: unknown }>(\n calls: T[],\n): { parallel: T[]; serial: T[] } {\n const parallel: T[] = []\n const serial: T[] = []\n\n for (const call of calls) {\n if (isToolParallelSafe(call.tool, call.input)) {\n parallel.push(call)\n } else {\n serial.push(call)\n }\n }\n\n return { parallel, serial }\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAsNO,SAAS,mBAAmB,MAAoB;AACrD,MAAI,KAAK,mBAAmB;AAC1B,WAAO,KAAK;AAAA,EACd;AAEA,MAAI,OAAO,KAAK,gBAAgB,UAAU;AACxC,WAAO,KAAK;AAAA,EACd;AAEA,SAAO,SAAS,KAAK,IAAI;AAC3B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { createRequire as __kodeCreateRequire } from "node:module";
|
|
2
|
+
const require = __kodeCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
getSessionProjectDir
|
|
5
|
+
} from "./chunk-CQCREBDO.js";
|
|
6
|
+
import {
|
|
7
|
+
isUuid
|
|
8
|
+
} from "./chunk-Y5LQPJWK.js";
|
|
9
|
+
|
|
10
|
+
// src/utils/protocol/kodeAgentSessionLoad.ts
|
|
11
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "fs";
|
|
12
|
+
import { basename, join } from "path";
|
|
13
|
+
function safeParseJson(line) {
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(line);
|
|
16
|
+
} catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function isUserEntry(entry) {
|
|
21
|
+
return typeof entry?.type === "string" && entry.type === "user";
|
|
22
|
+
}
|
|
23
|
+
function isAssistantEntry(entry) {
|
|
24
|
+
return typeof entry?.type === "string" && entry.type === "assistant";
|
|
25
|
+
}
|
|
26
|
+
function isSummaryEntry(entry) {
|
|
27
|
+
return typeof entry?.type === "string" && entry.type === "summary";
|
|
28
|
+
}
|
|
29
|
+
function isCustomTitleEntry(entry) {
|
|
30
|
+
return typeof entry?.type === "string" && entry.type === "custom-title";
|
|
31
|
+
}
|
|
32
|
+
function isTagEntry(entry) {
|
|
33
|
+
return typeof entry?.type === "string" && entry.type === "tag";
|
|
34
|
+
}
|
|
35
|
+
function isFileHistorySnapshotEntry(entry) {
|
|
36
|
+
return typeof entry?.type === "string" && entry.type === "file-history-snapshot";
|
|
37
|
+
}
|
|
38
|
+
function normalizeLoadedUser(entry) {
|
|
39
|
+
if (!entry.uuid || !entry.message) return null;
|
|
40
|
+
return {
|
|
41
|
+
type: "user",
|
|
42
|
+
uuid: entry.uuid,
|
|
43
|
+
message: entry.message,
|
|
44
|
+
...entry.toolUseResult !== void 0 ? { toolUseResult: { data: entry.toolUseResult, resultForAssistant: "" } } : {}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function normalizeLoadedAssistant(entry) {
|
|
48
|
+
if (!entry.uuid || !entry.message) return null;
|
|
49
|
+
return {
|
|
50
|
+
type: "assistant",
|
|
51
|
+
uuid: entry.uuid,
|
|
52
|
+
costUSD: 0,
|
|
53
|
+
durationMs: 0,
|
|
54
|
+
message: entry.message,
|
|
55
|
+
...entry.isApiErrorMessage ? { isApiErrorMessage: true } : {},
|
|
56
|
+
...typeof entry.requestId === "string" ? { requestId: entry.requestId } : {}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function loadDanyaAgentSessionLogData(args) {
|
|
60
|
+
const { cwd, sessionId } = args;
|
|
61
|
+
const projectDir = getSessionProjectDir(cwd);
|
|
62
|
+
const filePath = join(projectDir, `${sessionId}.jsonl`);
|
|
63
|
+
if (!existsSync(filePath)) {
|
|
64
|
+
throw new Error(`No conversation found with session ID: ${sessionId}`);
|
|
65
|
+
}
|
|
66
|
+
const lines = readFileSync(filePath, "utf8").split("\n");
|
|
67
|
+
const messages = [];
|
|
68
|
+
const summaries = /* @__PURE__ */ new Map();
|
|
69
|
+
const customTitles = /* @__PURE__ */ new Map();
|
|
70
|
+
const tags = /* @__PURE__ */ new Map();
|
|
71
|
+
const fileHistorySnapshots = /* @__PURE__ */ new Map();
|
|
72
|
+
for (const line of lines) {
|
|
73
|
+
const raw = safeParseJson(line.trim());
|
|
74
|
+
if (!raw || typeof raw !== "object") continue;
|
|
75
|
+
const entry = raw;
|
|
76
|
+
if (isUserEntry(entry)) {
|
|
77
|
+
if (entry.sessionId && entry.sessionId !== sessionId) continue;
|
|
78
|
+
const msg = normalizeLoadedUser(entry);
|
|
79
|
+
if (msg) messages.push(msg);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (isAssistantEntry(entry)) {
|
|
83
|
+
if (entry.sessionId && entry.sessionId !== sessionId) continue;
|
|
84
|
+
const msg = normalizeLoadedAssistant(entry);
|
|
85
|
+
if (msg) messages.push(msg);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (isSummaryEntry(entry)) {
|
|
89
|
+
const leafUuid = typeof entry.leafUuid === "string" ? entry.leafUuid : "";
|
|
90
|
+
const summary = typeof entry.summary === "string" ? entry.summary : "";
|
|
91
|
+
if (leafUuid && summary) summaries.set(leafUuid, summary);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (isCustomTitleEntry(entry)) {
|
|
95
|
+
const id = typeof entry.sessionId === "string" ? entry.sessionId : "";
|
|
96
|
+
const title = typeof entry.customTitle === "string" ? entry.customTitle : "";
|
|
97
|
+
if (id && title) customTitles.set(id, title);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (isTagEntry(entry)) {
|
|
101
|
+
const id = typeof entry.sessionId === "string" ? entry.sessionId : "";
|
|
102
|
+
const tag = typeof entry.tag === "string" ? entry.tag : "";
|
|
103
|
+
if (id && tag) tags.set(id, tag);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (isFileHistorySnapshotEntry(entry)) {
|
|
107
|
+
const messageId = typeof entry.messageId === "string" ? entry.messageId : "";
|
|
108
|
+
if (messageId) fileHistorySnapshots.set(messageId, entry);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { messages, summaries, customTitles, tags, fileHistorySnapshots };
|
|
113
|
+
}
|
|
114
|
+
function loadDanyaAgentSessionMessages(args) {
|
|
115
|
+
return loadDanyaAgentSessionLogData(args).messages;
|
|
116
|
+
}
|
|
117
|
+
function findMostRecentDanyaAgentSessionId(cwd) {
|
|
118
|
+
const projectDir = getSessionProjectDir(cwd);
|
|
119
|
+
if (!existsSync(projectDir)) return null;
|
|
120
|
+
const candidates = readdirSync(projectDir).filter((name) => name.endsWith(".jsonl")).filter((name) => !name.startsWith("agent-")).map((name) => ({
|
|
121
|
+
sessionId: basename(name, ".jsonl"),
|
|
122
|
+
path: join(projectDir, name)
|
|
123
|
+
})).filter((c) => isUuid(c.sessionId));
|
|
124
|
+
if (candidates.length === 0) return null;
|
|
125
|
+
candidates.sort((a, b) => {
|
|
126
|
+
try {
|
|
127
|
+
return statSync(b.path).mtimeMs - statSync(a.path).mtimeMs;
|
|
128
|
+
} catch {
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return candidates[0]?.sessionId ?? null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export {
|
|
136
|
+
loadDanyaAgentSessionLogData,
|
|
137
|
+
loadDanyaAgentSessionMessages,
|
|
138
|
+
findMostRecentDanyaAgentSessionId
|
|
139
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/protocol/kodeAgentSessionLoad.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync, readdirSync, readFileSync, statSync } from 'fs'\r\nimport { basename, join } from 'path'\r\nimport type { Message } from '@query'\r\nimport type {\r\n Message as APIMessage,\r\n MessageParam,\r\n} from '@anthropic-ai/sdk/resources/index.mjs'\r\nimport { getSessionProjectDir } from './kodeAgentSessionLog'\r\nimport { isUuid } from '@utils/text/uuid'\r\n\r\ntype JsonlUserEntry = {\r\n type: 'user'\r\n sessionId?: string\r\n uuid?: string\r\n message?: MessageParam\r\n isApiErrorMessage?: boolean\r\n toolUseResult?: unknown\r\n}\r\n\r\ntype JsonlAssistantEntry = {\r\n type: 'assistant'\r\n sessionId?: string\r\n uuid?: string\r\n message?: APIMessage\r\n isApiErrorMessage?: boolean\r\n requestId?: string\r\n}\r\n\r\ntype JsonlSummaryEntry = {\r\n type: 'summary'\r\n summary?: string\r\n leafUuid?: string\r\n}\r\n\r\ntype JsonlCustomTitleEntry = {\r\n type: 'custom-title'\r\n sessionId?: string\r\n customTitle?: string\r\n}\r\n\r\ntype JsonlTagEntry = {\r\n type: 'tag'\r\n sessionId?: string\r\n tag?: string\r\n}\r\n\r\ntype JsonlFileHistorySnapshotEntry = {\r\n type: 'file-history-snapshot'\r\n messageId?: string\r\n snapshot?: unknown\r\n isSnapshotUpdate?: boolean\r\n}\r\n\r\ntype JsonlEntry =\r\n | JsonlUserEntry\r\n | JsonlAssistantEntry\r\n | JsonlSummaryEntry\r\n | JsonlCustomTitleEntry\r\n | JsonlTagEntry\r\n | JsonlFileHistorySnapshotEntry\r\n | Record<string, unknown>\r\n\r\nfunction safeParseJson(line: string): unknown | null {\r\n try {\r\n return JSON.parse(line)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction isUserEntry(entry: JsonlEntry): entry is JsonlUserEntry {\r\n return (\r\n typeof (entry as any)?.type === 'string' && (entry as any).type === 'user'\r\n )\r\n}\r\n\r\nfunction isAssistantEntry(entry: JsonlEntry): entry is JsonlAssistantEntry {\r\n return (\r\n typeof (entry as any)?.type === 'string' &&\r\n (entry as any).type === 'assistant'\r\n )\r\n}\r\n\r\nfunction isSummaryEntry(entry: JsonlEntry): entry is JsonlSummaryEntry {\r\n return (\r\n typeof (entry as any)?.type === 'string' &&\r\n (entry as any).type === 'summary'\r\n )\r\n}\r\n\r\nfunction isCustomTitleEntry(entry: JsonlEntry): entry is JsonlCustomTitleEntry {\r\n return (\r\n typeof (entry as any)?.type === 'string' &&\r\n (entry as any).type === 'custom-title'\r\n )\r\n}\r\n\r\nfunction isTagEntry(entry: JsonlEntry): entry is JsonlTagEntry {\r\n return (\r\n typeof (entry as any)?.type === 'string' && (entry as any).type === 'tag'\r\n )\r\n}\r\n\r\nfunction isFileHistorySnapshotEntry(\r\n entry: JsonlEntry,\r\n): entry is JsonlFileHistorySnapshotEntry {\r\n return (\r\n typeof (entry as any)?.type === 'string' &&\r\n (entry as any).type === 'file-history-snapshot'\r\n )\r\n}\r\n\r\nfunction normalizeLoadedUser(entry: JsonlUserEntry): Message | null {\r\n if (!entry.uuid || !entry.message) return null\r\n return {\r\n type: 'user',\r\n uuid: entry.uuid as any,\r\n message: entry.message as any,\r\n ...(entry.toolUseResult !== undefined\r\n ? { toolUseResult: { data: entry.toolUseResult, resultForAssistant: '' } }\r\n : {}),\r\n }\r\n}\r\n\r\nfunction normalizeLoadedAssistant(entry: JsonlAssistantEntry): Message | null {\r\n if (!entry.uuid || !entry.message) return null\r\n return {\r\n type: 'assistant',\r\n uuid: entry.uuid as any,\r\n costUSD: 0,\r\n durationMs: 0,\r\n message: entry.message as any,\r\n ...(entry.isApiErrorMessage ? { isApiErrorMessage: true } : {}),\r\n ...(typeof entry.requestId === 'string'\r\n ? { requestId: entry.requestId }\r\n : {}),\r\n } as any\r\n}\r\n\r\nexport type DanyaAgentSessionLogData = {\r\n messages: Message[]\r\n summaries: Map<string, string>\r\n customTitles: Map<string, string>\r\n tags: Map<string, string>\r\n fileHistorySnapshots: Map<string, JsonlFileHistorySnapshotEntry>\r\n}\r\n\r\nexport function loadDanyaAgentSessionLogData(args: {\r\n cwd: string\r\n sessionId: string\r\n}): DanyaAgentSessionLogData {\r\n const { cwd, sessionId } = args\r\n const projectDir = getSessionProjectDir(cwd)\r\n const filePath = join(projectDir, `${sessionId}.jsonl`)\r\n if (!existsSync(filePath)) {\r\n throw new Error(`No conversation found with session ID: ${sessionId}`)\r\n }\r\n\r\n const lines = readFileSync(filePath, 'utf8').split('\\n')\r\n const messages: Message[] = []\r\n const summaries = new Map<string, string>()\r\n const customTitles = new Map<string, string>()\r\n const tags = new Map<string, string>()\r\n const fileHistorySnapshots = new Map<string, JsonlFileHistorySnapshotEntry>()\r\n\r\n for (const line of lines) {\r\n const raw = safeParseJson(line.trim())\r\n if (!raw || typeof raw !== 'object') continue\r\n const entry = raw as JsonlEntry\r\n\r\n if (isUserEntry(entry)) {\r\n if (entry.sessionId && entry.sessionId !== sessionId) continue\r\n const msg = normalizeLoadedUser(entry)\r\n if (msg) messages.push(msg)\r\n continue\r\n }\r\n\r\n if (isAssistantEntry(entry)) {\r\n if (entry.sessionId && entry.sessionId !== sessionId) continue\r\n const msg = normalizeLoadedAssistant(entry)\r\n if (msg) messages.push(msg)\r\n continue\r\n }\r\n\r\n if (isSummaryEntry(entry)) {\r\n const leafUuid = typeof entry.leafUuid === 'string' ? entry.leafUuid : ''\r\n const summary = typeof entry.summary === 'string' ? entry.summary : ''\r\n if (leafUuid && summary) summaries.set(leafUuid, summary)\r\n continue\r\n }\r\n\r\n if (isCustomTitleEntry(entry)) {\r\n const id = typeof entry.sessionId === 'string' ? entry.sessionId : ''\r\n const title =\r\n typeof entry.customTitle === 'string' ? entry.customTitle : ''\r\n if (id && title) customTitles.set(id, title)\r\n continue\r\n }\r\n\r\n if (isTagEntry(entry)) {\r\n const id = typeof entry.sessionId === 'string' ? entry.sessionId : ''\r\n const tag = typeof entry.tag === 'string' ? entry.tag : ''\r\n if (id && tag) tags.set(id, tag)\r\n continue\r\n }\r\n\r\n if (isFileHistorySnapshotEntry(entry)) {\r\n const messageId =\r\n typeof entry.messageId === 'string' ? entry.messageId : ''\r\n if (messageId) fileHistorySnapshots.set(messageId, entry)\r\n continue\r\n }\r\n }\r\n\r\n return { messages, summaries, customTitles, tags, fileHistorySnapshots }\r\n}\r\n\r\nexport function loadDanyaAgentSessionMessages(args: {\r\n cwd: string\r\n sessionId: string\r\n}): Message[] {\r\n return loadDanyaAgentSessionLogData(args).messages\r\n}\r\n\r\nexport function findMostRecentDanyaAgentSessionId(cwd: string): string | null {\r\n const projectDir = getSessionProjectDir(cwd)\r\n if (!existsSync(projectDir)) return null\r\n\r\n const candidates = readdirSync(projectDir)\r\n .filter(name => name.endsWith('.jsonl'))\r\n .filter(name => !name.startsWith('agent-'))\r\n .map(name => ({\r\n sessionId: basename(name, '.jsonl'),\r\n path: join(projectDir, name),\r\n }))\r\n .filter(c => isUuid(c.sessionId))\r\n\r\n if (candidates.length === 0) return null\r\n\r\n candidates.sort((a, b) => {\r\n try {\r\n return statSync(b.path).mtimeMs - statSync(a.path).mtimeMs\r\n } catch {\r\n return 0\r\n }\r\n })\r\n\r\n return candidates[0]?.sessionId ?? null\r\n}\r\n\r\nexport type { DanyaAgentSessionLogData as KodeAgentSessionLogData }\r\nexport { loadDanyaAgentSessionLogData as loadKodeAgentSessionLogData, loadDanyaAgentSessionMessages as loadKodeAgentSessionMessages, findMostRecentDanyaAgentSessionId as findMostRecentKodeAgentSessionId }\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|