@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.
Files changed (184) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +336 -0
  3. package/cli-acp.js +82 -0
  4. package/cli.js +105 -0
  5. package/dist/REPL-EYUOXCEC.js +42 -0
  6. package/dist/REPL-EYUOXCEC.js.map +7 -0
  7. package/dist/acp-S5WNCLMD.js +1372 -0
  8. package/dist/acp-S5WNCLMD.js.map +7 -0
  9. package/dist/agentsValidate-RQ2QDGNY.js +373 -0
  10. package/dist/agentsValidate-RQ2QDGNY.js.map +7 -0
  11. package/dist/ask-TX526UBD.js +129 -0
  12. package/dist/ask-TX526UBD.js.map +7 -0
  13. package/dist/autoUpdater-63RAZ24N.js +17 -0
  14. package/dist/autoUpdater-63RAZ24N.js.map +7 -0
  15. package/dist/chunk-2VQWLLDU.js +16 -0
  16. package/dist/chunk-2VQWLLDU.js.map +7 -0
  17. package/dist/chunk-4CLHMO4I.js +656 -0
  18. package/dist/chunk-4CLHMO4I.js.map +7 -0
  19. package/dist/chunk-4ZNNWJZU.js +5696 -0
  20. package/dist/chunk-4ZNNWJZU.js.map +7 -0
  21. package/dist/chunk-66EZC7Y7.js +149 -0
  22. package/dist/chunk-66EZC7Y7.js.map +7 -0
  23. package/dist/chunk-6EPQRP3S.js +96 -0
  24. package/dist/chunk-6EPQRP3S.js.map +7 -0
  25. package/dist/chunk-77IRSDFR.js +195 -0
  26. package/dist/chunk-77IRSDFR.js.map +7 -0
  27. package/dist/chunk-7RZNLBEK.js +136 -0
  28. package/dist/chunk-7RZNLBEK.js.map +7 -0
  29. package/dist/chunk-BNBV2FXC.js +19 -0
  30. package/dist/chunk-BNBV2FXC.js.map +7 -0
  31. package/dist/chunk-CQCREBDO.js +248 -0
  32. package/dist/chunk-CQCREBDO.js.map +7 -0
  33. package/dist/chunk-D77XS6TB.js +74 -0
  34. package/dist/chunk-D77XS6TB.js.map +7 -0
  35. package/dist/chunk-DHYBJN3V.js +474 -0
  36. package/dist/chunk-DHYBJN3V.js.map +7 -0
  37. package/dist/chunk-DLSLSLTR.js +842 -0
  38. package/dist/chunk-DLSLSLTR.js.map +7 -0
  39. package/dist/chunk-ELAE6Z4H.js +514 -0
  40. package/dist/chunk-ELAE6Z4H.js.map +7 -0
  41. package/dist/chunk-ELZQD7ZR.js +531 -0
  42. package/dist/chunk-ELZQD7ZR.js.map +7 -0
  43. package/dist/chunk-F6DEGMX6.js +31269 -0
  44. package/dist/chunk-F6DEGMX6.js.map +7 -0
  45. package/dist/chunk-GDF2AON2.js +124 -0
  46. package/dist/chunk-GDF2AON2.js.map +7 -0
  47. package/dist/chunk-H7BGBV4P.js +498 -0
  48. package/dist/chunk-H7BGBV4P.js.map +7 -0
  49. package/dist/chunk-HIIHGKXP.js +24 -0
  50. package/dist/chunk-HIIHGKXP.js.map +7 -0
  51. package/dist/chunk-HJCCXED7.js +17 -0
  52. package/dist/chunk-HJCCXED7.js.map +7 -0
  53. package/dist/chunk-IQ6VZB2Y.js +139 -0
  54. package/dist/chunk-IQ6VZB2Y.js.map +7 -0
  55. package/dist/chunk-J4D7AELD.js +518 -0
  56. package/dist/chunk-J4D7AELD.js.map +7 -0
  57. package/dist/chunk-JVGG2YQR.js +23 -0
  58. package/dist/chunk-JVGG2YQR.js.map +7 -0
  59. package/dist/chunk-LGEK2NV7.js +939 -0
  60. package/dist/chunk-LGEK2NV7.js.map +7 -0
  61. package/dist/chunk-LWXT5RGE.js +95 -0
  62. package/dist/chunk-LWXT5RGE.js.map +7 -0
  63. package/dist/chunk-M3TKNAUR.js +35 -0
  64. package/dist/chunk-M3TKNAUR.js.map +7 -0
  65. package/dist/chunk-MRFO7QO5.js +170 -0
  66. package/dist/chunk-MRFO7QO5.js.map +7 -0
  67. package/dist/chunk-MVN3DHQF.js +95 -0
  68. package/dist/chunk-MVN3DHQF.js.map +7 -0
  69. package/dist/chunk-O25PXGOC.js +772 -0
  70. package/dist/chunk-O25PXGOC.js.map +7 -0
  71. package/dist/chunk-OBGVKM3N.js +1618 -0
  72. package/dist/chunk-OBGVKM3N.js.map +7 -0
  73. package/dist/chunk-OV5HJXXQ.js +198 -0
  74. package/dist/chunk-OV5HJXXQ.js.map +7 -0
  75. package/dist/chunk-P5VWDMRD.js +249 -0
  76. package/dist/chunk-P5VWDMRD.js.map +7 -0
  77. package/dist/chunk-PDSAJX7G.js +49 -0
  78. package/dist/chunk-PDSAJX7G.js.map +7 -0
  79. package/dist/chunk-RHNEZOPO.js +739 -0
  80. package/dist/chunk-RHNEZOPO.js.map +7 -0
  81. package/dist/chunk-SQGAHZPM.js +3004 -0
  82. package/dist/chunk-SQGAHZPM.js.map +7 -0
  83. package/dist/chunk-U7Z4MXY4.js +21 -0
  84. package/dist/chunk-U7Z4MXY4.js.map +7 -0
  85. package/dist/chunk-UNCTVIS7.js +146 -0
  86. package/dist/chunk-UNCTVIS7.js.map +7 -0
  87. package/dist/chunk-VMEOI6MH.js +1103 -0
  88. package/dist/chunk-VMEOI6MH.js.map +7 -0
  89. package/dist/chunk-WAY3DKFO.js +47 -0
  90. package/dist/chunk-WAY3DKFO.js.map +7 -0
  91. package/dist/chunk-XEYEKVFT.js +24 -0
  92. package/dist/chunk-XEYEKVFT.js.map +7 -0
  93. package/dist/chunk-Y4BQ36T4.js +796 -0
  94. package/dist/chunk-Y4BQ36T4.js.map +7 -0
  95. package/dist/chunk-Y5LQPJWK.js +12 -0
  96. package/dist/chunk-Y5LQPJWK.js.map +7 -0
  97. package/dist/chunk-YIJWUNWF.js +1260 -0
  98. package/dist/chunk-YIJWUNWF.js.map +7 -0
  99. package/dist/chunk-YMIWYEZ7.js +34 -0
  100. package/dist/chunk-YMIWYEZ7.js.map +7 -0
  101. package/dist/cli-PQNZWJX4.js +3952 -0
  102. package/dist/cli-PQNZWJX4.js.map +7 -0
  103. package/dist/commands-HOBCZ3VQ.js +46 -0
  104. package/dist/commands-HOBCZ3VQ.js.map +7 -0
  105. package/dist/config-MLH7ZTFA.js +81 -0
  106. package/dist/config-MLH7ZTFA.js.map +7 -0
  107. package/dist/context-FZ6G4J63.js +30 -0
  108. package/dist/context-FZ6G4J63.js.map +7 -0
  109. package/dist/costTracker-5WKZXN5S.js +19 -0
  110. package/dist/costTracker-5WKZXN5S.js.map +7 -0
  111. package/dist/customCommands-EB4MMZSS.js +25 -0
  112. package/dist/customCommands-EB4MMZSS.js.map +7 -0
  113. package/dist/env-VMEIP4EW.js +28 -0
  114. package/dist/env-VMEIP4EW.js.map +7 -0
  115. package/dist/index.js +36 -0
  116. package/dist/index.js.map +7 -0
  117. package/dist/kodeAgentSessionId-WUT74FSH.js +16 -0
  118. package/dist/kodeAgentSessionId-WUT74FSH.js.map +7 -0
  119. package/dist/kodeAgentSessionLoad-KR4JSD6D.js +21 -0
  120. package/dist/kodeAgentSessionLoad-KR4JSD6D.js.map +7 -0
  121. package/dist/kodeAgentSessionResume-BCD6UV74.js +18 -0
  122. package/dist/kodeAgentSessionResume-BCD6UV74.js.map +7 -0
  123. package/dist/kodeAgentStreamJson-EDHHWNNX.js +15 -0
  124. package/dist/kodeAgentStreamJson-EDHHWNNX.js.map +7 -0
  125. package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js +133 -0
  126. package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js.map +7 -0
  127. package/dist/kodeAgentStructuredStdio-UA5P5UNU.js +11 -0
  128. package/dist/kodeAgentStructuredStdio-UA5P5UNU.js.map +7 -0
  129. package/dist/kodeHooks-EHM6GSIQ.js +37 -0
  130. package/dist/kodeHooks-EHM6GSIQ.js.map +7 -0
  131. package/dist/llm-SJXCV7DA.js +3138 -0
  132. package/dist/llm-SJXCV7DA.js.map +7 -0
  133. package/dist/llmLazy-2QYJVD6K.js +15 -0
  134. package/dist/llmLazy-2QYJVD6K.js.map +7 -0
  135. package/dist/loader-LJX77EFL.js +28 -0
  136. package/dist/loader-LJX77EFL.js.map +7 -0
  137. package/dist/mcp-DOROSLPN.js +49 -0
  138. package/dist/mcp-DOROSLPN.js.map +7 -0
  139. package/dist/mentionProcessor-5UZRHCGH.js +215 -0
  140. package/dist/mentionProcessor-5UZRHCGH.js.map +7 -0
  141. package/dist/messages-N5KBI53P.js +65 -0
  142. package/dist/messages-N5KBI53P.js.map +7 -0
  143. package/dist/model-HPLBR53R.js +30 -0
  144. package/dist/model-HPLBR53R.js.map +7 -0
  145. package/dist/openai-YP4OJYKF.js +29 -0
  146. package/dist/openai-YP4OJYKF.js.map +7 -0
  147. package/dist/outputStyles-NNALI5D7.js +28 -0
  148. package/dist/outputStyles-NNALI5D7.js.map +7 -0
  149. package/dist/package.json +4 -0
  150. package/dist/pluginRuntime-JYYI5BSQ.js +220 -0
  151. package/dist/pluginRuntime-JYYI5BSQ.js.map +7 -0
  152. package/dist/pluginValidation-JWUFPZUE.js +17 -0
  153. package/dist/pluginValidation-JWUFPZUE.js.map +7 -0
  154. package/dist/prompts-B2SS7CWI.js +50 -0
  155. package/dist/prompts-B2SS7CWI.js.map +7 -0
  156. package/dist/query-HIK457UU.js +50 -0
  157. package/dist/query-HIK457UU.js.map +7 -0
  158. package/dist/responsesStreaming-L2BSN37C.js +10 -0
  159. package/dist/responsesStreaming-L2BSN37C.js.map +7 -0
  160. package/dist/ripgrep-GCKI4UTL.js +17 -0
  161. package/dist/ripgrep-GCKI4UTL.js.map +7 -0
  162. package/dist/skillMarketplace-PCTUUX46.js +37 -0
  163. package/dist/skillMarketplace-PCTUUX46.js.map +7 -0
  164. package/dist/state-XJICGOUA.js +18 -0
  165. package/dist/state-XJICGOUA.js.map +7 -0
  166. package/dist/theme-DP7O4SGH.js +14 -0
  167. package/dist/theme-DP7O4SGH.js.map +7 -0
  168. package/dist/toolPermissionContext-DHAGUPEW.js +17 -0
  169. package/dist/toolPermissionContext-DHAGUPEW.js.map +7 -0
  170. package/dist/toolPermissionSettings-PT65MQIQ.js +18 -0
  171. package/dist/toolPermissionSettings-PT65MQIQ.js.map +7 -0
  172. package/dist/tools-BHW37PCF.js +47 -0
  173. package/dist/tools-BHW37PCF.js.map +7 -0
  174. package/dist/userInput-XDRYT5TI.js +316 -0
  175. package/dist/userInput-XDRYT5TI.js.map +7 -0
  176. package/dist/uuid-QUYJMIUV.js +9 -0
  177. package/dist/uuid-QUYJMIUV.js.map +7 -0
  178. package/dist/yoga.wasm +0 -0
  179. package/package.json +115 -0
  180. package/scripts/binary-utils.cjs +62 -0
  181. package/scripts/cli-acp-wrapper.cjs +82 -0
  182. package/scripts/cli-wrapper.cjs +105 -0
  183. package/scripts/postinstall.js +144 -0
  184. package/yoga.wasm +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/services/ai/openai.ts"],
4
+ "sourcesContent": ["import { OpenAI } from 'openai'\r\nimport { getGlobalConfig, GlobalConfig } from '@utils/config'\r\n// undici removed \u2014 use native fetch. ProxyAgent stubbed for now.\r\nconst ProxyAgent = class { constructor(_url: string) {} } as any\r\nimport { setSessionState, getSessionState } from '@utils/session/sessionState'\r\nimport {\r\n debug as debugLogger,\r\n getCurrentRequest,\r\n logAPIError,\r\n} from '@utils/log/debugLogger'\r\n\r\nconst RETRY_CONFIG = {\r\n BASE_DELAY_MS: 1000,\r\n MAX_DELAY_MS: 32000,\r\n MAX_SERVER_DELAY_MS: 60000,\r\n JITTER_FACTOR: 0.1,\r\n} as const\r\n\r\nfunction getRetryDelay(attempt: number, retryAfter?: string | null): number {\r\n if (retryAfter) {\r\n const retryAfterMs = parseInt(retryAfter) * 1000\r\n if (!isNaN(retryAfterMs) && retryAfterMs > 0) {\r\n return Math.min(retryAfterMs, RETRY_CONFIG.MAX_SERVER_DELAY_MS)\r\n }\r\n }\r\n\r\n const delay = RETRY_CONFIG.BASE_DELAY_MS * Math.pow(2, attempt - 1)\r\n const jitter = Math.random() * RETRY_CONFIG.JITTER_FACTOR * delay\r\n\r\n return Math.min(delay + jitter, RETRY_CONFIG.MAX_DELAY_MS)\r\n}\r\n\r\nfunction abortableDelay(delayMs: number, signal?: AbortSignal): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (signal?.aborted) {\r\n reject(new Error('Request was aborted'))\r\n return\r\n }\r\n\r\n const timeoutId = setTimeout(() => {\r\n resolve()\r\n }, delayMs)\r\n\r\n if (signal) {\r\n const abortHandler = () => {\r\n clearTimeout(timeoutId)\r\n reject(new Error('Request was aborted'))\r\n }\r\n signal.addEventListener('abort', abortHandler, { once: true })\r\n }\r\n })\r\n}\r\n\r\nenum ModelErrorType {\r\n MaxLength = '1024',\r\n MaxCompletionTokens = 'max_completion_tokens',\r\n TemperatureRestriction = 'temperature_restriction',\r\n StreamOptions = 'stream_options',\r\n Citations = 'citations',\r\n RateLimit = 'rate_limit',\r\n}\r\n\r\nfunction getModelErrorKey(\r\n baseURL: string,\r\n model: string,\r\n type: ModelErrorType,\r\n): string {\r\n return `${baseURL}:${model}:${type}`\r\n}\r\n\r\nfunction hasModelError(\r\n baseURL: string,\r\n model: string,\r\n type: ModelErrorType,\r\n): boolean {\r\n return !!getSessionState('modelErrors')[\r\n getModelErrorKey(baseURL, model, type)\r\n ]\r\n}\r\n\r\nfunction setModelError(\r\n baseURL: string,\r\n model: string,\r\n type: ModelErrorType,\r\n error: string,\r\n) {\r\n setSessionState('modelErrors', {\r\n [getModelErrorKey(baseURL, model, type)]: error,\r\n })\r\n}\r\n\r\ntype ErrorDetector = (errMsg: string) => boolean\r\ntype ErrorFixer = (\r\n opts: OpenAI.ChatCompletionCreateParams,\r\n) => Promise<void> | void\r\ninterface ErrorHandler {\r\n type: ModelErrorType\r\n detect: ErrorDetector\r\n fix: ErrorFixer\r\n}\r\n\r\nconst GPT5_ERROR_HANDLERS: ErrorHandler[] = [\r\n {\r\n type: ModelErrorType.MaxCompletionTokens,\r\n detect: errMsg => {\r\n const lowerMsg = errMsg.toLowerCase()\r\n return (\r\n (lowerMsg.includes(\"unsupported parameter: 'max_tokens'\") &&\r\n lowerMsg.includes(\"'max_completion_tokens'\")) ||\r\n (lowerMsg.includes('max_tokens') &&\r\n lowerMsg.includes('max_completion_tokens')) ||\r\n (lowerMsg.includes('max_tokens') &&\r\n lowerMsg.includes('not supported')) ||\r\n (lowerMsg.includes('max_tokens') &&\r\n lowerMsg.includes('use max_completion_tokens')) ||\r\n (lowerMsg.includes('invalid parameter') &&\r\n lowerMsg.includes('max_tokens')) ||\r\n (lowerMsg.includes('parameter error') &&\r\n lowerMsg.includes('max_tokens'))\r\n )\r\n },\r\n fix: async opts => {\r\n debugLogger.api('GPT5_FIX_MAX_TOKENS', {\r\n from: opts.max_tokens,\r\n to: opts.max_tokens,\r\n })\r\n if ('max_tokens' in opts) {\r\n opts.max_completion_tokens = opts.max_tokens\r\n delete opts.max_tokens\r\n }\r\n },\r\n },\r\n {\r\n type: ModelErrorType.TemperatureRestriction,\r\n detect: errMsg => {\r\n const lowerMsg = errMsg.toLowerCase()\r\n return (\r\n lowerMsg.includes('temperature') &&\r\n (lowerMsg.includes('only supports') ||\r\n lowerMsg.includes('must be 1') ||\r\n lowerMsg.includes('invalid temperature'))\r\n )\r\n },\r\n fix: async opts => {\r\n debugLogger.api('GPT5_FIX_TEMPERATURE', {\r\n from: opts.temperature,\r\n to: 1,\r\n })\r\n opts.temperature = 1\r\n },\r\n },\r\n]\r\n\r\nconst ERROR_HANDLERS: ErrorHandler[] = [\r\n {\r\n type: ModelErrorType.MaxLength,\r\n detect: errMsg =>\r\n errMsg.includes('Expected a string with maximum length 1024'),\r\n fix: async opts => {\r\n const toolDescriptions = {}\r\n for (const tool of opts.tools || []) {\r\n if (tool.function.description.length <= 1024) continue\r\n let str = ''\r\n let remainder = ''\r\n for (let line of tool.function.description.split('\\n')) {\r\n if (str.length + line.length < 1024) {\r\n str += line + '\\n'\r\n } else {\r\n remainder += line + '\\n'\r\n }\r\n }\r\n\r\n tool.function.description = str\r\n toolDescriptions[tool.function.name] = remainder\r\n }\r\n if (Object.keys(toolDescriptions).length > 0) {\r\n let content = '<additional-tool-usage-instructions>\\n\\n'\r\n for (const [name, description] of Object.entries(toolDescriptions)) {\r\n content += `<${name}>\\n${description}\\n</${name}>\\n\\n`\r\n }\r\n content += '</additional-tool-usage-instructions>'\r\n\r\n for (let i = opts.messages.length - 1; i >= 0; i--) {\r\n if (opts.messages[i].role === 'system') {\r\n opts.messages.splice(i + 1, 0, {\r\n role: 'system',\r\n content,\r\n })\r\n break\r\n }\r\n }\r\n }\r\n },\r\n },\r\n {\r\n type: ModelErrorType.MaxCompletionTokens,\r\n detect: errMsg => errMsg.includes(\"Use 'max_completion_tokens'\"),\r\n fix: async opts => {\r\n opts.max_completion_tokens = opts.max_tokens\r\n delete opts.max_tokens\r\n },\r\n },\r\n {\r\n type: ModelErrorType.StreamOptions,\r\n detect: errMsg => errMsg.includes('stream_options'),\r\n fix: async opts => {\r\n delete opts.stream_options\r\n },\r\n },\r\n {\r\n type: ModelErrorType.Citations,\r\n detect: errMsg =>\r\n errMsg.includes('Extra inputs are not permitted') &&\r\n errMsg.includes('citations'),\r\n fix: async opts => {\r\n if (!opts.messages) return\r\n\r\n for (const message of opts.messages) {\r\n if (!message) continue\r\n\r\n if (Array.isArray(message.content)) {\r\n for (const item of message.content) {\r\n if (item && typeof item === 'object') {\r\n const itemObj = item as unknown as Record<string, unknown>\r\n if ('citations' in itemObj) {\r\n delete itemObj.citations\r\n }\r\n }\r\n }\r\n } else if (message.content && typeof message.content === 'object') {\r\n const contentObj = message.content as unknown as Record<\r\n string,\r\n unknown\r\n >\r\n if ('citations' in contentObj) {\r\n delete contentObj.citations\r\n }\r\n }\r\n }\r\n },\r\n },\r\n]\r\n\r\nfunction isRateLimitError(errMsg: string): boolean {\r\n if (!errMsg) return false\r\n const lowerMsg = errMsg.toLowerCase()\r\n return (\r\n lowerMsg.includes('rate limit') ||\r\n lowerMsg.includes('too many requests') ||\r\n lowerMsg.includes('429')\r\n )\r\n}\r\n\r\ninterface ModelFeatures {\r\n usesMaxCompletionTokens: boolean\r\n supportsResponsesAPI?: boolean\r\n requiresTemperatureOne?: boolean\r\n supportsVerbosityControl?: boolean\r\n supportsCustomTools?: boolean\r\n supportsAllowedTools?: boolean\r\n}\r\n\r\nconst MODEL_FEATURES: Record<string, ModelFeatures> = {\r\n o1: { usesMaxCompletionTokens: true },\r\n 'o1-preview': { usesMaxCompletionTokens: true },\r\n 'o1-mini': { usesMaxCompletionTokens: true },\r\n 'o1-pro': { usesMaxCompletionTokens: true },\r\n 'o3-mini': { usesMaxCompletionTokens: true },\r\n 'gpt-5': {\r\n usesMaxCompletionTokens: true,\r\n supportsResponsesAPI: true,\r\n requiresTemperatureOne: true,\r\n supportsVerbosityControl: true,\r\n supportsCustomTools: true,\r\n supportsAllowedTools: true,\r\n },\r\n 'gpt-5-mini': {\r\n usesMaxCompletionTokens: true,\r\n supportsResponsesAPI: true,\r\n requiresTemperatureOne: true,\r\n supportsVerbosityControl: true,\r\n supportsCustomTools: true,\r\n supportsAllowedTools: true,\r\n },\r\n 'gpt-5-nano': {\r\n usesMaxCompletionTokens: true,\r\n supportsResponsesAPI: true,\r\n requiresTemperatureOne: true,\r\n supportsVerbosityControl: true,\r\n supportsCustomTools: true,\r\n supportsAllowedTools: true,\r\n },\r\n 'gpt-5-chat-latest': {\r\n usesMaxCompletionTokens: true,\r\n supportsResponsesAPI: false,\r\n requiresTemperatureOne: true,\r\n supportsVerbosityControl: true,\r\n },\r\n}\r\n\r\nfunction getModelFeatures(modelName: string): ModelFeatures {\r\n if (!modelName || typeof modelName !== 'string') {\r\n return { usesMaxCompletionTokens: false }\r\n }\r\n\r\n if (MODEL_FEATURES[modelName]) {\r\n return MODEL_FEATURES[modelName]\r\n }\r\n\r\n if (modelName.toLowerCase().includes('gpt-5')) {\r\n return {\r\n usesMaxCompletionTokens: true,\r\n supportsResponsesAPI: true,\r\n requiresTemperatureOne: true,\r\n supportsVerbosityControl: true,\r\n supportsCustomTools: true,\r\n supportsAllowedTools: true,\r\n }\r\n }\r\n\r\n for (const [key, features] of Object.entries(MODEL_FEATURES)) {\r\n if (modelName.includes(key)) {\r\n return features\r\n }\r\n }\r\n\r\n return { usesMaxCompletionTokens: false }\r\n}\r\n\r\nfunction applyModelSpecificTransformations(\r\n opts: OpenAI.ChatCompletionCreateParams,\r\n): void {\r\n if (!opts.model || typeof opts.model !== 'string') {\r\n return\r\n }\r\n\r\n const features = getModelFeatures(opts.model)\r\n const isGPT5 = opts.model.toLowerCase().includes('gpt-5')\r\n\r\n if (isGPT5 || features.usesMaxCompletionTokens) {\r\n if ('max_tokens' in opts && !('max_completion_tokens' in opts)) {\r\n debugLogger.api('OPENAI_TRANSFORM_MAX_TOKENS', {\r\n model: opts.model,\r\n from: opts.max_tokens,\r\n })\r\n opts.max_completion_tokens = opts.max_tokens\r\n delete opts.max_tokens\r\n }\r\n\r\n if (features.requiresTemperatureOne && 'temperature' in opts) {\r\n if (opts.temperature !== 1 && opts.temperature !== undefined) {\r\n debugLogger.api('OPENAI_TRANSFORM_TEMPERATURE', {\r\n model: opts.model,\r\n from: opts.temperature,\r\n to: 1,\r\n })\r\n opts.temperature = 1\r\n }\r\n }\r\n\r\n if (isGPT5) {\r\n delete opts.frequency_penalty\r\n delete opts.presence_penalty\r\n delete opts.logit_bias\r\n delete opts.user\r\n\r\n if (!opts.reasoning_effort && features.supportsVerbosityControl) {\r\n opts.reasoning_effort = 'medium'\r\n }\r\n }\r\n }\r\n\r\n else {\r\n if (\r\n features.usesMaxCompletionTokens &&\r\n 'max_tokens' in opts &&\r\n !('max_completion_tokens' in opts)\r\n ) {\r\n opts.max_completion_tokens = opts.max_tokens\r\n delete opts.max_tokens\r\n }\r\n }\r\n\r\n}\r\n\r\nasync function applyModelErrorFixes(\r\n opts: OpenAI.ChatCompletionCreateParams,\r\n baseURL: string,\r\n) {\r\n const isGPT5 = opts.model.startsWith('gpt-5')\r\n const handlers = isGPT5\r\n ? [...GPT5_ERROR_HANDLERS, ...ERROR_HANDLERS]\r\n : ERROR_HANDLERS\r\n\r\n for (const handler of handlers) {\r\n if (hasModelError(baseURL, opts.model, handler.type)) {\r\n await handler.fix(opts)\r\n return\r\n }\r\n }\r\n}\r\n\r\nasync function tryWithEndpointFallback(\r\n baseURL: string,\r\n opts: OpenAI.ChatCompletionCreateParams,\r\n headers: Record<string, string>,\r\n provider: string,\r\n proxy: any,\r\n signal?: AbortSignal,\r\n): Promise<{ response: Response; endpoint: string }> {\r\n const endpointsToTry = []\r\n\r\n if (provider === 'minimax') {\r\n endpointsToTry.push('/text/chatcompletion_v2', '/chat/completions')\r\n } else {\r\n endpointsToTry.push('/chat/completions')\r\n }\r\n\r\n let lastError = null\r\n\r\n for (const endpoint of endpointsToTry) {\r\n try {\r\n const response = await fetch(`${baseURL}${endpoint}`, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(opts.stream ? { ...opts, stream: true } : opts),\r\n ...(proxy ? { dispatcher: proxy } : {}),\r\n signal: signal,\r\n })\r\n\r\n if (response.ok) {\r\n return { response, endpoint }\r\n }\r\n\r\n if (response.status === 404 && endpointsToTry.length > 1) {\r\n debugLogger.api('OPENAI_ENDPOINT_FALLBACK', {\r\n endpoint,\r\n status: 404,\r\n reason: 'not_found',\r\n })\r\n continue\r\n }\r\n\r\n return { response, endpoint }\r\n } catch (error) {\r\n lastError = error\r\n if (endpointsToTry.indexOf(endpoint) < endpointsToTry.length - 1) {\r\n debugLogger.api('OPENAI_ENDPOINT_FALLBACK', {\r\n endpoint,\r\n reason: 'network_error',\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n continue\r\n }\r\n }\r\n }\r\n\r\n throw lastError || new Error('All endpoints failed')\r\n}\r\n\r\nexport {\r\n getGPT5CompletionWithProfile,\r\n getModelFeatures,\r\n applyModelSpecificTransformations,\r\n}\r\n\r\nexport async function getCompletionWithProfile(\r\n modelProfile: any,\r\n opts: OpenAI.ChatCompletionCreateParams,\r\n attempt: number = 0,\r\n maxAttempts: number = 10,\r\n signal?: AbortSignal,\r\n): Promise<OpenAI.ChatCompletion | AsyncIterable<OpenAI.ChatCompletionChunk>> {\r\n if (attempt >= maxAttempts) {\r\n throw new Error('Max attempts reached')\r\n }\r\n\r\n const provider = modelProfile?.provider || 'anthropic'\r\n const baseURL = modelProfile?.baseURL\r\n const apiKey = modelProfile?.apiKey\r\n const proxy = getGlobalConfig().proxy\r\n ? new ProxyAgent(getGlobalConfig().proxy)\r\n : undefined\r\n\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n }\r\n\r\n if (apiKey) {\r\n if (provider === 'azure') {\r\n headers['api-key'] = apiKey\r\n } else {\r\n headers['Authorization'] = `Bearer ${apiKey}`\r\n }\r\n }\r\n\r\n applyModelSpecificTransformations(opts)\r\n await applyModelErrorFixes(opts, baseURL || '')\r\n\r\n debugLogger.api('OPENAI_API_CALL_START', {\r\n endpoint: baseURL || 'DEFAULT_OPENAI',\r\n model: opts.model,\r\n provider,\r\n apiKeyConfigured: !!apiKey,\r\n apiKeyPrefix: apiKey ? apiKey.substring(0, 8) : null,\r\n maxTokens: opts.max_tokens,\r\n temperature: opts.temperature,\r\n messageCount: opts.messages?.length || 0,\r\n streamMode: opts.stream,\r\n timestamp: new Date().toISOString(),\r\n modelProfileModelName: modelProfile?.modelName,\r\n modelProfileName: modelProfile?.name,\r\n })\r\n\r\n opts.messages = opts.messages.map(msg => {\r\n if (msg.role === 'tool') {\r\n if (Array.isArray(msg.content)) {\r\n return {\r\n ...msg,\r\n content:\r\n msg.content\r\n .map(c => c.text || '')\r\n .filter(Boolean)\r\n .join('\\n\\n') || '(empty content)',\r\n }\r\n } else if (typeof msg.content !== 'string') {\r\n return {\r\n ...msg,\r\n content:\r\n typeof msg.content === 'undefined'\r\n ? '(empty content)'\r\n : JSON.stringify(msg.content),\r\n }\r\n }\r\n }\r\n return msg\r\n })\r\n\r\n const azureApiVersion = '2024-06-01'\r\n let endpoint = '/chat/completions'\r\n\r\n if (provider === 'azure') {\r\n endpoint = `/chat/completions?api-version=${azureApiVersion}`\r\n } else if (provider === 'minimax') {\r\n endpoint = '/text/chatcompletion_v2'\r\n }\r\n\r\n try {\r\n if (opts.stream) {\r\n const isOpenAICompatible = [\r\n 'minimax',\r\n 'kimi',\r\n 'deepseek',\r\n 'siliconflow',\r\n 'qwen',\r\n 'glm',\r\n 'glm-coding',\r\n 'baidu-qianfan',\r\n 'openai',\r\n 'mistral',\r\n 'xai',\r\n 'groq',\r\n 'custom-openai',\r\n ].includes(provider)\r\n\r\n let response: Response\r\n let usedEndpoint: string\r\n\r\n if (isOpenAICompatible && provider !== 'azure') {\r\n const result = await tryWithEndpointFallback(\r\n baseURL,\r\n opts,\r\n headers,\r\n provider,\r\n proxy,\r\n signal,\r\n )\r\n response = result.response\r\n usedEndpoint = result.endpoint\r\n } else {\r\n response = await fetch(`${baseURL}${endpoint}`, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify({ ...opts, stream: true }),\r\n ...(proxy ? { dispatcher: proxy } : {}),\r\n signal: signal,\r\n })\r\n usedEndpoint = endpoint\r\n }\r\n\r\n if (!response.ok) {\r\n if (signal?.aborted) {\r\n throw new Error('Request cancelled by user')\r\n }\r\n\r\n try {\r\n const errorData = await response.json()\r\n const hasError = (\r\n data: unknown,\r\n ): data is { error?: { message?: string }; message?: string } => {\r\n return typeof data === 'object' && data !== null\r\n }\r\n const errorMessage = hasError(errorData)\r\n ? errorData.error?.message ||\r\n errorData.message ||\r\n `HTTP ${response.status}`\r\n : `HTTP ${response.status}`\r\n\r\n const isGPT5 = opts.model.startsWith('gpt-5')\r\n const handlers = isGPT5\r\n ? [...GPT5_ERROR_HANDLERS, ...ERROR_HANDLERS]\r\n : ERROR_HANDLERS\r\n\r\n for (const handler of handlers) {\r\n if (handler.detect(errorMessage)) {\r\n debugLogger.api('OPENAI_MODEL_ERROR_DETECTED', {\r\n model: opts.model,\r\n type: handler.type,\r\n errorMessage,\r\n status: response.status,\r\n })\r\n\r\n setModelError(\r\n baseURL || '',\r\n opts.model,\r\n handler.type,\r\n errorMessage,\r\n )\r\n\r\n await handler.fix(opts)\r\n debugLogger.api('OPENAI_MODEL_ERROR_FIXED', {\r\n model: opts.model,\r\n type: handler.type,\r\n })\r\n\r\n return getCompletionWithProfile(\r\n modelProfile,\r\n opts,\r\n attempt + 1,\r\n maxAttempts,\r\n signal,\r\n )\r\n }\r\n }\r\n\r\n debugLogger.warn('OPENAI_API_ERROR_UNHANDLED', {\r\n model: opts.model,\r\n status: response.status,\r\n errorMessage,\r\n })\r\n\r\n logAPIError({\r\n model: opts.model,\r\n endpoint: `${baseURL}${endpoint}`,\r\n status: response.status,\r\n error: errorMessage,\r\n request: opts,\r\n response: errorData,\r\n provider: provider,\r\n })\r\n } catch (parseError) {\r\n debugLogger.warn('OPENAI_API_ERROR_PARSE_FAILED', {\r\n model: opts.model,\r\n status: response.status,\r\n error: parseError instanceof Error ? parseError.message : String(parseError),\r\n })\r\n\r\n logAPIError({\r\n model: opts.model,\r\n endpoint: `${baseURL}${endpoint}`,\r\n status: response.status,\r\n error: `Could not parse error response: ${parseError.message}`,\r\n request: opts,\r\n response: { parseError: parseError.message },\r\n provider: provider,\r\n })\r\n }\r\n\r\n const delayMs = getRetryDelay(attempt)\r\n debugLogger.warn('OPENAI_API_RETRY', {\r\n model: opts.model,\r\n status: response.status,\r\n attempt: attempt + 1,\r\n maxAttempts,\r\n delayMs,\r\n })\r\n try {\r\n await abortableDelay(delayMs, signal)\r\n } catch (error) {\r\n if (error.message === 'Request was aborted') {\r\n throw new Error('Request cancelled by user')\r\n }\r\n throw error\r\n }\r\n return getCompletionWithProfile(\r\n modelProfile,\r\n opts,\r\n attempt + 1,\r\n maxAttempts,\r\n signal,\r\n )\r\n }\r\n\r\n const stream = createStreamProcessor(response.body as any, signal)\r\n return stream\r\n }\r\n\r\n const isOpenAICompatible = [\r\n 'minimax',\r\n 'kimi',\r\n 'deepseek',\r\n 'siliconflow',\r\n 'qwen',\r\n 'glm',\r\n 'baidu-qianfan',\r\n 'openai',\r\n 'mistral',\r\n 'xai',\r\n 'groq',\r\n 'custom-openai',\r\n ].includes(provider)\r\n\r\n let response: Response\r\n let usedEndpoint: string\r\n\r\n if (isOpenAICompatible && provider !== 'azure') {\r\n const result = await tryWithEndpointFallback(\r\n baseURL,\r\n opts,\r\n headers,\r\n provider,\r\n proxy,\r\n signal,\r\n )\r\n response = result.response\r\n usedEndpoint = result.endpoint\r\n } else {\r\n response = await fetch(`${baseURL}${endpoint}`, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(opts),\r\n ...(proxy ? { dispatcher: proxy } : {}),\r\n signal: signal,\r\n })\r\n usedEndpoint = endpoint\r\n }\r\n\r\n if (!response.ok) {\r\n if (signal?.aborted) {\r\n throw new Error('Request cancelled by user')\r\n }\r\n\r\n try {\r\n const errorData = await response.json()\r\n const hasError = (\r\n data: unknown,\r\n ): data is { error?: { message?: string }; message?: string } => {\r\n return typeof data === 'object' && data !== null\r\n }\r\n const errorMessage = hasError(errorData)\r\n ? errorData.error?.message ||\r\n errorData.message ||\r\n `HTTP ${response.status}`\r\n : `HTTP ${response.status}`\r\n\r\n const isGPT5 = opts.model.startsWith('gpt-5')\r\n const handlers = isGPT5\r\n ? [...GPT5_ERROR_HANDLERS, ...ERROR_HANDLERS]\r\n : ERROR_HANDLERS\r\n\r\n for (const handler of handlers) {\r\n if (handler.detect(errorMessage)) {\r\n debugLogger.api('OPENAI_MODEL_ERROR_DETECTED', {\r\n model: opts.model,\r\n type: handler.type,\r\n errorMessage,\r\n status: response.status,\r\n })\r\n\r\n setModelError(baseURL || '', opts.model, handler.type, errorMessage)\r\n\r\n await handler.fix(opts)\r\n debugLogger.api('OPENAI_MODEL_ERROR_FIXED', {\r\n model: opts.model,\r\n type: handler.type,\r\n })\r\n\r\n return getCompletionWithProfile(\r\n modelProfile,\r\n opts,\r\n attempt + 1,\r\n maxAttempts,\r\n signal,\r\n )\r\n }\r\n }\r\n\r\n debugLogger.warn('OPENAI_API_ERROR_UNHANDLED', {\r\n model: opts.model,\r\n status: response.status,\r\n errorMessage,\r\n })\r\n } catch (parseError) {\r\n debugLogger.warn('OPENAI_API_ERROR_PARSE_FAILED', {\r\n model: opts.model,\r\n status: response.status,\r\n error: parseError instanceof Error ? parseError.message : String(parseError),\r\n })\r\n }\r\n\r\n const delayMs = getRetryDelay(attempt)\r\n debugLogger.warn('OPENAI_API_RETRY', {\r\n model: opts.model,\r\n status: response.status,\r\n attempt: attempt + 1,\r\n maxAttempts,\r\n delayMs,\r\n })\r\n try {\r\n await abortableDelay(delayMs, signal)\r\n } catch (error) {\r\n if (error.message === 'Request was aborted') {\r\n throw new Error('Request cancelled by user')\r\n }\r\n throw error\r\n }\r\n return getCompletionWithProfile(\r\n modelProfile,\r\n opts,\r\n attempt + 1,\r\n maxAttempts,\r\n signal,\r\n )\r\n }\r\n\r\n const responseData = (await response.json()) as OpenAI.ChatCompletion\r\n return responseData\r\n } catch (error) {\r\n if (signal?.aborted) {\r\n throw new Error('Request cancelled by user')\r\n }\r\n\r\n if (attempt < maxAttempts) {\r\n if (signal?.aborted) {\r\n throw new Error('Request cancelled by user')\r\n }\r\n\r\n const delayMs = getRetryDelay(attempt)\r\n debugLogger.warn('OPENAI_NETWORK_RETRY', {\r\n model: opts.model,\r\n attempt: attempt + 1,\r\n maxAttempts,\r\n delayMs,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n try {\r\n await abortableDelay(delayMs, signal)\r\n } catch (error) {\r\n if (error.message === 'Request was aborted') {\r\n throw new Error('Request cancelled by user')\r\n }\r\n throw error\r\n }\r\n return getCompletionWithProfile(\r\n modelProfile,\r\n opts,\r\n attempt + 1,\r\n maxAttempts,\r\n signal,\r\n )\r\n }\r\n throw error\r\n }\r\n}\r\n\r\nexport function createStreamProcessor(\r\n stream: any,\r\n signal?: AbortSignal,\r\n): AsyncGenerator<OpenAI.ChatCompletionChunk, void, unknown> {\r\n if (!stream) {\r\n throw new Error('Stream is null or undefined')\r\n }\r\n\r\n return (async function* () {\r\n const reader = stream.getReader()\r\n const decoder = new TextDecoder('utf-8')\r\n let buffer = ''\r\n\r\n try {\r\n while (true) {\r\n if (signal?.aborted) {\r\n break\r\n }\r\n\r\n let readResult\r\n try {\r\n readResult = await reader.read()\r\n } catch (e) {\r\n if (signal?.aborted) {\r\n break\r\n }\r\n debugLogger.warn('OPENAI_STREAM_READ_ERROR', {\r\n error: e instanceof Error ? e.message : String(e),\r\n })\r\n break\r\n }\r\n\r\n const { done, value } = readResult\r\n if (done) {\r\n break\r\n }\r\n\r\n const chunk = decoder.decode(value, { stream: true })\r\n buffer += chunk\r\n\r\n let lineEnd = buffer.indexOf('\\n')\r\n while (lineEnd !== -1) {\r\n const line = buffer.substring(0, lineEnd).trim()\r\n buffer = buffer.substring(lineEnd + 1)\r\n\r\n if (line === 'data: [DONE]') {\r\n continue\r\n }\r\n\r\n if (line.startsWith('data: ')) {\r\n const data = line.slice(6).trim()\r\n if (!data) continue\r\n\r\n try {\r\n const parsed = JSON.parse(data) as OpenAI.ChatCompletionChunk\r\n yield parsed\r\n } catch (e) {\r\n debugLogger.warn('OPENAI_STREAM_JSON_PARSE_ERROR', {\r\n data,\r\n error: e instanceof Error ? e.message : String(e),\r\n })\r\n }\r\n }\r\n\r\n lineEnd = buffer.indexOf('\\n')\r\n }\r\n }\r\n\r\n if (buffer.trim()) {\r\n const lines = buffer.trim().split('\\n')\r\n for (const line of lines) {\r\n if (line.startsWith('data: ') && line !== 'data: [DONE]') {\r\n const data = line.slice(6).trim()\r\n if (!data) continue\r\n\r\n try {\r\n const parsed = JSON.parse(data) as OpenAI.ChatCompletionChunk\r\n yield parsed\r\n } catch (e) {\r\n debugLogger.warn('OPENAI_STREAM_FINAL_JSON_PARSE_ERROR', {\r\n data,\r\n error: e instanceof Error ? e.message : String(e),\r\n })\r\n }\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n debugLogger.warn('OPENAI_STREAM_UNEXPECTED_ERROR', {\r\n error: e instanceof Error ? e.message : String(e),\r\n })\r\n } finally {\r\n try {\r\n reader.releaseLock()\r\n } catch (e) {\r\n debugLogger.warn('OPENAI_STREAM_RELEASE_LOCK_ERROR', {\r\n error: e instanceof Error ? e.message : String(e),\r\n })\r\n }\r\n }\r\n })()\r\n}\r\n\r\nexport function streamCompletion(\r\n stream: any,\r\n signal?: AbortSignal,\r\n): AsyncGenerator<OpenAI.ChatCompletionChunk, void, unknown> {\r\n return createStreamProcessor(stream, signal)\r\n}\r\n\r\nexport async function callGPT5ResponsesAPI(\r\n modelProfile: any,\r\n request: any,\r\n signal?: AbortSignal,\r\n): Promise<any> {\r\n const baseURL = modelProfile?.baseURL || 'https://api.openai.com/v1'\r\n const apiKey = modelProfile?.apiKey\r\n const proxy = getGlobalConfig().proxy\r\n ? new ProxyAgent(getGlobalConfig().proxy)\r\n : undefined\r\n\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${apiKey}`,\r\n }\r\n\r\n const responsesParams = request\r\n\r\n try {\r\n const response = await fetch(`${baseURL}/responses`, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify(responsesParams),\r\n ...(proxy ? { dispatcher: proxy } : {}),\r\n signal: signal,\r\n })\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text()\r\n throw new Error(\r\n `GPT-5 Responses API error: ${response.status} ${response.statusText} - ${errorText}`,\r\n )\r\n }\r\n\r\n return response\r\n } catch (error) {\r\n if (signal?.aborted) {\r\n throw new Error('Request cancelled by user')\r\n }\r\n throw error\r\n }\r\n}\r\n\r\nfunction convertResponsesAPIToChatCompletion(responsesData: any): any {\r\n let outputText = responsesData.output_text || ''\r\n const usage = responsesData.usage || {}\r\n\r\n if (responsesData.output && Array.isArray(responsesData.output)) {\r\n const reasoningItems = responsesData.output.filter(\r\n item => item.type === 'reasoning' && item.summary,\r\n )\r\n const messageItems = responsesData.output.filter(\r\n item => item.type === 'message',\r\n )\r\n\r\n if (reasoningItems.length > 0 && messageItems.length > 0) {\r\n const reasoningSummary = reasoningItems\r\n .map(item => item.summary?.map(s => s.text).join('\\n'))\r\n .filter(Boolean)\r\n .join('\\n\\n')\r\n\r\n const mainContent = messageItems\r\n .map(item => item.content?.map(c => c.text).join('\\n'))\r\n .filter(Boolean)\r\n .join('\\n\\n')\r\n\r\n if (reasoningSummary) {\r\n outputText = `**\uD83E\uDDE0 Reasoning Process:**\\n${reasoningSummary}\\n\\n**\uD83D\uDCDD Response:**\\n${mainContent}`\r\n } else {\r\n outputText = mainContent\r\n }\r\n }\r\n }\r\n\r\n return {\r\n id: responsesData.id || `chatcmpl-${Date.now()}`,\r\n object: 'chat.completion',\r\n created: Math.floor(Date.now() / 1000),\r\n model: responsesData.model || '',\r\n choices: [\r\n {\r\n index: 0,\r\n message: {\r\n role: 'assistant',\r\n content: outputText,\r\n ...(responsesData.reasoning && {\r\n reasoning: {\r\n effort: responsesData.reasoning.effort,\r\n summary: responsesData.reasoning.summary,\r\n },\r\n }),\r\n },\r\n finish_reason: responsesData.status === 'completed' ? 'stop' : 'length',\r\n },\r\n ],\r\n usage: {\r\n prompt_tokens: usage.input_tokens || 0,\r\n completion_tokens: usage.output_tokens || 0,\r\n total_tokens: (usage.input_tokens || 0) + (usage.output_tokens || 0),\r\n prompt_tokens_details: {\r\n cached_tokens: usage.input_tokens_details?.cached_tokens || 0,\r\n },\r\n completion_tokens_details: {\r\n reasoning_tokens: usage.output_tokens_details?.reasoning_tokens || 0,\r\n },\r\n },\r\n }\r\n}\r\n\r\nasync function getGPT5CompletionWithProfile(\r\n modelProfile: any,\r\n opts: OpenAI.ChatCompletionCreateParams,\r\n attempt: number = 0,\r\n maxAttempts: number = 10,\r\n signal?: AbortSignal,\r\n): Promise<OpenAI.ChatCompletion | AsyncIterable<OpenAI.ChatCompletionChunk>> {\r\n const features = getModelFeatures(opts.model)\r\n const isOfficialOpenAI =\r\n !modelProfile.baseURL || modelProfile.baseURL.includes('api.openai.com')\r\n\r\n if (!isOfficialOpenAI) {\r\n debugLogger.api('GPT5_THIRD_PARTY_PROVIDER', {\r\n model: opts.model,\r\n baseURL: modelProfile.baseURL,\r\n provider: modelProfile.provider,\r\n supportsResponsesAPI: features.supportsResponsesAPI,\r\n requestId: getCurrentRequest()?.id,\r\n })\r\n\r\n debugLogger.api('GPT5_PROVIDER_THIRD_PARTY_NOTICE', {\r\n model: opts.model,\r\n provider: modelProfile.provider,\r\n baseURL: modelProfile.baseURL,\r\n })\r\n\r\n if (modelProfile.provider === 'azure') {\r\n delete opts.reasoning_effort\r\n } else if (modelProfile.provider === 'custom-openai') {\r\n debugLogger.api('GPT5_CUSTOM_PROVIDER_OPTIMIZATIONS', {\r\n model: opts.model,\r\n provider: modelProfile.provider,\r\n })\r\n }\r\n }\r\n\r\n else if (opts.stream) {\r\n debugLogger.api('GPT5_STREAMING_MODE', {\r\n model: opts.model,\r\n baseURL: modelProfile.baseURL || 'official',\r\n reason: 'responses_api_no_streaming',\r\n requestId: getCurrentRequest()?.id,\r\n })\r\n\r\n debugLogger.api('GPT5_STREAMING_FALLBACK_TO_CHAT_COMPLETIONS', {\r\n model: opts.model,\r\n reason: 'responses_api_no_streaming',\r\n })\r\n }\r\n\r\n debugLogger.api('USING_CHAT_COMPLETIONS_FOR_GPT5', {\r\n model: opts.model,\r\n baseURL: modelProfile.baseURL || 'official',\r\n provider: modelProfile.provider,\r\n reason: isOfficialOpenAI ? 'streaming_or_fallback' : 'third_party_provider',\r\n requestId: getCurrentRequest()?.id,\r\n })\r\n\r\n return await getCompletionWithProfile(\r\n modelProfile,\r\n opts,\r\n attempt,\r\n maxAttempts,\r\n signal,\r\n )\r\n}\r\n\r\nexport async function fetchCustomModels(\r\n baseURL: string,\r\n apiKey: string,\r\n): Promise<any[]> {\r\n try {\r\n const hasVersionNumber = /\\/v\\d+/.test(baseURL)\r\n const cleanBaseURL = baseURL.replace(/\\/+$/, '')\r\n const modelsURL = hasVersionNumber\r\n ? `${cleanBaseURL}/models`\r\n : `${cleanBaseURL}/v1/models`\r\n\r\n const response = await fetch(modelsURL, {\r\n method: 'GET',\r\n headers: {\r\n Authorization: `Bearer ${apiKey}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n })\r\n\r\n if (!response.ok) {\r\n if (response.status === 401) {\r\n throw new Error(\r\n 'Invalid API key. Please check your API key and try again.',\r\n )\r\n } else if (response.status === 403) {\r\n throw new Error(\r\n 'API key does not have permission to access models. Please check your API key permissions.',\r\n )\r\n } else if (response.status === 404) {\r\n throw new Error(\r\n 'API endpoint not found. Please check if the base URL is correct and supports the /models endpoint.',\r\n )\r\n } else if (response.status === 429) {\r\n throw new Error(\r\n 'Too many requests. Please wait a moment and try again.',\r\n )\r\n } else if (response.status >= 500) {\r\n throw new Error(\r\n 'API service is temporarily unavailable. Please try again later.',\r\n )\r\n } else {\r\n throw new Error(\r\n `Unable to connect to API (${response.status}). Please check your base URL, API key, and internet connection.`,\r\n )\r\n }\r\n }\r\n\r\n const data = await response.json()\r\n\r\n const hasDataArray = (obj: unknown): obj is { data: unknown[] } => {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'data' in obj &&\r\n Array.isArray((obj as any).data)\r\n )\r\n }\r\n\r\n const hasModelsArray = (obj: unknown): obj is { models: unknown[] } => {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'models' in obj &&\r\n Array.isArray((obj as any).models)\r\n )\r\n }\r\n\r\n let models = []\r\n\r\n if (hasDataArray(data)) {\r\n models = data.data\r\n } else if (Array.isArray(data)) {\r\n models = data\r\n } else if (hasModelsArray(data)) {\r\n models = data.models\r\n } else {\r\n throw new Error(\r\n 'API returned unexpected response format. Expected an array of models or an object with a \"data\" or \"models\" array.',\r\n )\r\n }\r\n\r\n if (!Array.isArray(models)) {\r\n throw new Error('API response format error: models data is not an array.')\r\n }\r\n\r\n return models\r\n } catch (error) {\r\n if (\r\n error instanceof Error &&\r\n (error.message.includes('API key') ||\r\n error.message.includes('API endpoint') ||\r\n error.message.includes('API service') ||\r\n error.message.includes('response format'))\r\n ) {\r\n throw error\r\n }\r\n\r\n debugLogger.warn('CUSTOM_API_MODELS_FETCH_FAILED', {\r\n baseURL,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n\r\n if (error instanceof Error && error.message.includes('fetch')) {\r\n throw new Error(\r\n 'Unable to connect to the API. Please check the base URL and your internet connection.',\r\n )\r\n }\r\n\r\n throw new Error(\r\n 'Failed to fetch models from custom API. Please check your configuration and try again.',\r\n )\r\n }\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["isOpenAICompatible", "response", "usedEndpoint", "error"]
7
+ }
@@ -0,0 +1,95 @@
1
+ import { createRequire as __kodeCreateRequire } from "node:module";
2
+ const require = __kodeCreateRequire(import.meta.url);
3
+
4
+ // src/core/costTracker.ts
5
+ import chalk from "chalk";
6
+
7
+ // src/utils/terminal/format.ts
8
+ function wrapText(text, width) {
9
+ const lines = [];
10
+ let currentLine = "";
11
+ for (const char of text) {
12
+ if ([...currentLine].length < width) {
13
+ currentLine += char;
14
+ } else {
15
+ lines.push(currentLine);
16
+ currentLine = char;
17
+ }
18
+ }
19
+ if (currentLine) lines.push(currentLine);
20
+ return lines;
21
+ }
22
+ function formatDuration(ms) {
23
+ if (ms < 6e4) {
24
+ return `${(ms / 1e3).toFixed(1)}s`;
25
+ }
26
+ const hours = Math.floor(ms / 36e5);
27
+ const minutes = Math.floor(ms % 36e5 / 6e4);
28
+ const seconds = (ms % 6e4 / 1e3).toFixed(1);
29
+ if (hours > 0) {
30
+ return `${hours}h ${minutes}m ${seconds}s`;
31
+ }
32
+ if (minutes > 0) {
33
+ return `${minutes}m ${seconds}s`;
34
+ }
35
+ return `${seconds}s`;
36
+ }
37
+ function formatNumber(number) {
38
+ return new Intl.NumberFormat("en", {
39
+ notation: "compact",
40
+ maximumFractionDigits: 1
41
+ }).format(number).toLowerCase();
42
+ }
43
+
44
+ // src/core/costTracker.ts
45
+ var STATE = {
46
+ totalCost: 0,
47
+ totalAPIDuration: 0,
48
+ startTime: Date.now()
49
+ };
50
+ function addToTotalCost(cost, duration) {
51
+ STATE.totalCost += cost;
52
+ STATE.totalAPIDuration += duration;
53
+ }
54
+ function getTotalCost() {
55
+ return STATE.totalCost;
56
+ }
57
+ function getTotalDuration() {
58
+ return Date.now() - STATE.startTime;
59
+ }
60
+ function getTotalAPIDuration() {
61
+ return STATE.totalAPIDuration;
62
+ }
63
+ function formatCost(cost) {
64
+ return `$${cost > 0.5 ? round(cost, 100).toFixed(2) : cost.toFixed(4)}`;
65
+ }
66
+ function formatTotalCost() {
67
+ return chalk.grey(
68
+ `Total cost: ${formatCost(STATE.totalCost)}
69
+ Total duration (API): ${formatDuration(STATE.totalAPIDuration)}
70
+ Total duration (wall): ${formatDuration(getTotalDuration())}`
71
+ );
72
+ }
73
+ function round(number, precision) {
74
+ return Math.round(number * precision) / precision;
75
+ }
76
+ function resetStateForTests() {
77
+ if (process.env.NODE_ENV !== "test") {
78
+ throw new Error("resetStateForTests can only be called in tests");
79
+ }
80
+ STATE.startTime = Date.now();
81
+ STATE.totalCost = 0;
82
+ STATE.totalAPIDuration = 0;
83
+ }
84
+
85
+ export {
86
+ wrapText,
87
+ formatDuration,
88
+ formatNumber,
89
+ addToTotalCost,
90
+ getTotalCost,
91
+ getTotalDuration,
92
+ getTotalAPIDuration,
93
+ formatTotalCost,
94
+ resetStateForTests
95
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/costTracker.ts", "../src/utils/terminal/format.ts"],
4
+ "sourcesContent": ["import chalk from 'chalk'\r\nimport { formatDuration } from '@utils/terminal/format'\r\n\r\nconst STATE: {\r\n totalCost: number\r\n totalAPIDuration: number\r\n startTime: number\r\n} = {\r\n totalCost: 0,\r\n totalAPIDuration: 0,\r\n startTime: Date.now(),\r\n}\r\n\r\nexport function addToTotalCost(cost: number, duration: number): void {\r\n STATE.totalCost += cost\r\n STATE.totalAPIDuration += duration\r\n}\r\n\r\nexport function getTotalCost(): number {\r\n return STATE.totalCost\r\n}\r\n\r\nexport function getTotalDuration(): number {\r\n return Date.now() - STATE.startTime\r\n}\r\n\r\nexport function getTotalAPIDuration(): number {\r\n return STATE.totalAPIDuration\r\n}\r\n\r\nfunction formatCost(cost: number): string {\r\n return `$${cost > 0.5 ? round(cost, 100).toFixed(2) : cost.toFixed(4)}`\r\n}\r\n\r\nexport function formatTotalCost(): string {\r\n return chalk.grey(\r\n `Total cost: ${formatCost(STATE.totalCost)}\r\nTotal duration (API): ${formatDuration(STATE.totalAPIDuration)}\r\nTotal duration (wall): ${formatDuration(getTotalDuration())}`,\r\n )\r\n}\r\n\r\nfunction round(number: number, precision: number): number {\r\n return Math.round(number * precision) / precision\r\n}\r\n\r\nexport function resetStateForTests(): void {\r\n if (process.env.NODE_ENV !== 'test') {\r\n throw new Error('resetStateForTests can only be called in tests')\r\n }\r\n STATE.startTime = Date.now()\r\n STATE.totalCost = 0\r\n STATE.totalAPIDuration = 0\r\n}\r\n", "export function wrapText(text: string, width: number): string[] {\r\n const lines: string[] = []\r\n let currentLine = ''\r\n\r\n for (const char of text) {\r\n if ([...currentLine].length < width) {\r\n currentLine += char\r\n } else {\r\n lines.push(currentLine)\r\n currentLine = char\r\n }\r\n }\r\n\r\n if (currentLine) lines.push(currentLine)\r\n return lines\r\n}\r\n\r\nexport function formatDuration(ms: number): string {\r\n if (ms < 60000) {\r\n return `${(ms / 1000).toFixed(1)}s`\r\n }\r\n\r\n const hours = Math.floor(ms / 3600000)\r\n const minutes = Math.floor((ms % 3600000) / 60000)\r\n const seconds = ((ms % 60000) / 1000).toFixed(1)\r\n\r\n if (hours > 0) {\r\n return `${hours}h ${minutes}m ${seconds}s`\r\n }\r\n if (minutes > 0) {\r\n return `${minutes}m ${seconds}s`\r\n }\r\n return `${seconds}s`\r\n}\r\n\r\nexport function formatNumber(number: number): string {\r\n return new Intl.NumberFormat('en', {\r\n notation: 'compact',\r\n maximumFractionDigits: 1,\r\n })\r\n .format(number)\r\n .toLowerCase()\r\n}\r\n"],
5
+ "mappings": ";;;;AAAA,OAAO,WAAW;;;ACAX,SAAS,SAAS,MAAc,OAAyB;AAC9D,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAElB,aAAW,QAAQ,MAAM;AACvB,QAAI,CAAC,GAAG,WAAW,EAAE,SAAS,OAAO;AACnC,qBAAe;AAAA,IACjB,OAAO;AACL,YAAM,KAAK,WAAW;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAa,OAAM,KAAK,WAAW;AACvC,SAAO;AACT;AAEO,SAAS,eAAe,IAAoB;AACjD,MAAI,KAAK,KAAO;AACd,WAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAAA,EAClC;AAEA,QAAM,QAAQ,KAAK,MAAM,KAAK,IAAO;AACrC,QAAM,UAAU,KAAK,MAAO,KAAK,OAAW,GAAK;AACjD,QAAM,WAAY,KAAK,MAAS,KAAM,QAAQ,CAAC;AAE/C,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,EACzC;AACA,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,OAAO,KAAK,OAAO;AAAA,EAC/B;AACA,SAAO,GAAG,OAAO;AACnB;AAEO,SAAS,aAAa,QAAwB;AACnD,SAAO,IAAI,KAAK,aAAa,MAAM;AAAA,IACjC,UAAU;AAAA,IACV,uBAAuB;AAAA,EACzB,CAAC,EACE,OAAO,MAAM,EACb,YAAY;AACjB;;;ADvCA,IAAM,QAIF;AAAA,EACF,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,WAAW,KAAK,IAAI;AACtB;AAEO,SAAS,eAAe,MAAc,UAAwB;AACnE,QAAM,aAAa;AACnB,QAAM,oBAAoB;AAC5B;AAEO,SAAS,eAAuB;AACrC,SAAO,MAAM;AACf;AAEO,SAAS,mBAA2B;AACzC,SAAO,KAAK,IAAI,IAAI,MAAM;AAC5B;AAEO,SAAS,sBAA8B;AAC5C,SAAO,MAAM;AACf;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,IAAI,OAAO,MAAM,MAAM,MAAM,GAAG,EAAE,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AACvE;AAEO,SAAS,kBAA0B;AACxC,SAAO,MAAM;AAAA,IACX,eAAe,WAAW,MAAM,SAAS,CAAC;AAAA,wBACtB,eAAe,MAAM,gBAAgB,CAAC;AAAA,yBACrC,eAAe,iBAAiB,CAAC,CAAC;AAAA,EACzD;AACF;AAEA,SAAS,MAAM,QAAgB,WAA2B;AACxD,SAAO,KAAK,MAAM,SAAS,SAAS,IAAI;AAC1C;AAEO,SAAS,qBAA2B;AACzC,MAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,YAAY;AAClB,QAAM,mBAAmB;AAC3B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,35 @@
1
+ import { createRequire as __kodeCreateRequire } from "node:module";
2
+ const require = __kodeCreateRequire(import.meta.url);
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
8
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
9
+ }) : x)(function(x) {
10
+ if (typeof require !== "undefined") return require.apply(this, arguments);
11
+ throw Error('Dynamic require of "' + x + '" is not supported');
12
+ });
13
+ var __esm = (fn, res) => function __init() {
14
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
15
+ };
16
+ var __export = (target, all) => {
17
+ for (var name in all)
18
+ __defProp(target, name, { get: all[name], enumerable: true });
19
+ };
20
+ var __copyProps = (to, from, except, desc) => {
21
+ if (from && typeof from === "object" || typeof from === "function") {
22
+ for (let key of __getOwnPropNames(from))
23
+ if (!__hasOwnProp.call(to, key) && key !== except)
24
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
25
+ }
26
+ return to;
27
+ };
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ export {
31
+ __require,
32
+ __esm,
33
+ __export,
34
+ __toCommonJS
35
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,170 @@
1
+ import { createRequire as __kodeCreateRequire } from "node:module";
2
+ const require = __kodeCreateRequire(import.meta.url);
3
+ import {
4
+ BunShell,
5
+ execFileNoThrow,
6
+ init_execFileNoThrow,
7
+ init_log,
8
+ init_shell,
9
+ logError
10
+ } from "./chunk-SQGAHZPM.js";
11
+
12
+ // src/utils/system/ripgrep.ts
13
+ init_log();
14
+ init_execFileNoThrow();
15
+ init_shell();
16
+ import { rgPath } from "@vscode/ripgrep";
17
+ import { findActualExecutable } from "spawn-rx";
18
+ import { memoize } from "lodash-es";
19
+ import { existsSync } from "node:fs";
20
+ import { execFile } from "child_process";
21
+ import debug from "debug";
22
+ import { quote } from "shell-quote";
23
+ var d = debug("danya:ripgrep");
24
+ function isTruthyEnv(value) {
25
+ if (!value) return false;
26
+ return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase());
27
+ }
28
+ function resolveRipgrepPathOrThrow() {
29
+ const explicit = process.env.DANYA_RIPGREP_PATH ?? process.env.KODE_RIPGREP_PATH;
30
+ if (explicit) {
31
+ if (!existsSync(explicit)) {
32
+ throw new Error(`DANYA_RIPGREP_PATH points to a missing file: ${explicit}`);
33
+ }
34
+ return explicit;
35
+ }
36
+ const preferBundled = isTruthyEnv(process.env.USE_BUILTIN_RIPGREP);
37
+ if (!preferBundled) {
38
+ const { cmd } = findActualExecutable("rg", []);
39
+ d(`ripgrep initially resolved as: ${cmd}`);
40
+ if (cmd !== "rg") {
41
+ return cmd;
42
+ }
43
+ }
44
+ if (!rgPath || !existsSync(rgPath)) {
45
+ throw new Error(
46
+ [
47
+ "ripgrep (rg) was not found on PATH, and @vscode/ripgrep is missing.",
48
+ "Fix:",
49
+ "- Install ripgrep: https://github.com/BurntSushi/ripgrep",
50
+ "- Or reinstall @danya-ai/cli (ensure dependencies are present)"
51
+ ].join("\n")
52
+ );
53
+ }
54
+ d("Using @vscode/ripgrep fallback: %s", rgPath);
55
+ return rgPath;
56
+ }
57
+ var getRipgrepPath = memoize(() => resolveRipgrepPathOrThrow());
58
+ async function ripGrep(args, target, abortSignal, options) {
59
+ await codesignRipgrepIfNecessary();
60
+ const rg = getRipgrepPath();
61
+ d("ripgrep called: %s %o", rg, target, args);
62
+ if (options?.sandbox?.enabled === true) {
63
+ const cmd = quote([rg, ...args, target]);
64
+ const result = await BunShell.getInstance().exec(cmd, abortSignal, 1e4, {
65
+ sandbox: options.sandbox
66
+ });
67
+ if (result.code === 1) return [];
68
+ if (result.code !== 0) {
69
+ logError(`ripgrep failed with exit code ${result.code}: ${result.stderr}`);
70
+ return [];
71
+ }
72
+ return result.stdout.trim().split("\n").filter(Boolean);
73
+ }
74
+ return new Promise((resolve) => {
75
+ execFile(
76
+ rg,
77
+ [...args, target],
78
+ {
79
+ maxBuffer: 1e6,
80
+ signal: abortSignal,
81
+ timeout: 1e4
82
+ },
83
+ (error, stdout) => {
84
+ if (error) {
85
+ if (error.code !== 1) {
86
+ d("ripgrep error: %o", error);
87
+ logError(error);
88
+ }
89
+ resolve([]);
90
+ } else {
91
+ d("ripgrep succeeded with %s", stdout);
92
+ resolve(stdout.trim().split("\n").filter(Boolean));
93
+ }
94
+ }
95
+ );
96
+ });
97
+ }
98
+ async function listAllContentFiles(path, abortSignal, limit) {
99
+ try {
100
+ d("listAllContentFiles called: %s", path);
101
+ return (await ripGrep(["-l", ".", path], path, abortSignal)).slice(0, limit);
102
+ } catch (e) {
103
+ d("listAllContentFiles failed: %o", e);
104
+ logError(e);
105
+ return [];
106
+ }
107
+ }
108
+ var alreadyDoneSignCheck = false;
109
+ async function codesignRipgrepIfNecessary() {
110
+ if (process.platform !== "darwin" || alreadyDoneSignCheck) {
111
+ return;
112
+ }
113
+ alreadyDoneSignCheck = true;
114
+ d("checking if ripgrep is already signed");
115
+ const lines = (await execFileNoThrow(
116
+ "codesign",
117
+ ["-vv", "-d", getRipgrepPath()],
118
+ void 0,
119
+ void 0,
120
+ false
121
+ )).stdout.split("\n");
122
+ const needsSigned = lines.find((line) => line.includes("linker-signed"));
123
+ if (!needsSigned) {
124
+ d("seems to be already signed");
125
+ return;
126
+ }
127
+ try {
128
+ d("signing ripgrep");
129
+ const signResult = await execFileNoThrow("codesign", [
130
+ "--sign",
131
+ "-",
132
+ "--force",
133
+ "--preserve-metadata=entitlements,requirements,flags,runtime",
134
+ getRipgrepPath()
135
+ ]);
136
+ if (signResult.code !== 0) {
137
+ d("failed to sign ripgrep: %o", signResult);
138
+ logError(
139
+ `Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`
140
+ );
141
+ }
142
+ d("removing quarantine");
143
+ const quarantineResult = await execFileNoThrow("xattr", [
144
+ "-d",
145
+ "com.apple.quarantine",
146
+ getRipgrepPath()
147
+ ]);
148
+ if (quarantineResult.code !== 0) {
149
+ d("failed to remove quarantine: %o", quarantineResult);
150
+ logError(
151
+ `Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`
152
+ );
153
+ }
154
+ } catch (e) {
155
+ d("failed during sign: %o", e);
156
+ logError(e);
157
+ }
158
+ }
159
+ function resetRipgrepPathCacheForTests() {
160
+ ;
161
+ getRipgrepPath.cache?.clear?.();
162
+ alreadyDoneSignCheck = false;
163
+ }
164
+
165
+ export {
166
+ getRipgrepPath,
167
+ ripGrep,
168
+ listAllContentFiles,
169
+ resetRipgrepPathCacheForTests
170
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/system/ripgrep.ts"],
4
+ "sourcesContent": ["import { rgPath } from '@vscode/ripgrep'\r\nimport { findActualExecutable } from 'spawn-rx'\r\nimport { memoize } from 'lodash-es'\r\nimport { existsSync } from 'node:fs'\r\nimport { execFile } from 'child_process'\r\nimport debug from 'debug'\r\nimport { quote } from 'shell-quote'\r\nimport { logError } from '@utils/log'\r\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\r\nimport type { BunShellSandboxOptions } from '@utils/bun/shell'\r\nimport { BunShell } from '@utils/bun/shell'\r\n\r\nconst d = debug('danya:ripgrep')\r\n\r\nfunction isTruthyEnv(value: string | undefined): boolean {\r\n if (!value) return false\r\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\r\n}\r\n\r\nfunction resolveRipgrepPathOrThrow(): string {\r\n const explicit = process.env.DANYA_RIPGREP_PATH ?? process.env.KODE_RIPGREP_PATH\r\n if (explicit) {\r\n if (!existsSync(explicit)) {\r\n throw new Error(`DANYA_RIPGREP_PATH points to a missing file: ${explicit}`)\r\n }\r\n return explicit\r\n }\r\n\r\n const preferBundled = isTruthyEnv(process.env.USE_BUILTIN_RIPGREP)\r\n if (!preferBundled) {\r\n const { cmd } = findActualExecutable('rg', [])\r\n d(`ripgrep initially resolved as: ${cmd}`)\r\n if (cmd !== 'rg') {\r\n return cmd\r\n }\r\n }\r\n\r\n if (!rgPath || !existsSync(rgPath)) {\r\n throw new Error(\r\n [\r\n 'ripgrep (rg) was not found on PATH, and @vscode/ripgrep is missing.',\r\n 'Fix:',\r\n '- Install ripgrep: https://github.com/BurntSushi/ripgrep',\r\n '- Or reinstall @danya-ai/cli (ensure dependencies are present)',\r\n ].join('\\n'),\r\n )\r\n }\r\n\r\n d('Using @vscode/ripgrep fallback: %s', rgPath)\r\n return rgPath\r\n}\r\n\r\nexport const getRipgrepPath = memoize((): string => resolveRipgrepPathOrThrow())\r\n\r\nexport async function ripGrep(\r\n args: string[],\r\n target: string,\r\n abortSignal: AbortSignal,\r\n options?: { sandbox?: BunShellSandboxOptions },\r\n): Promise<string[]> {\r\n await codesignRipgrepIfNecessary()\r\n const rg = getRipgrepPath()\r\n d('ripgrep called: %s %o', rg, target, args)\r\n\r\n if (options?.sandbox?.enabled === true) {\r\n const cmd = quote([rg, ...args, target])\r\n const result = await BunShell.getInstance().exec(cmd, abortSignal, 10_000, {\r\n sandbox: options.sandbox,\r\n })\r\n if (result.code === 1) return []\r\n if (result.code !== 0) {\r\n logError(`ripgrep failed with exit code ${result.code}: ${result.stderr}`)\r\n return []\r\n }\r\n return result.stdout.trim().split('\\n').filter(Boolean)\r\n }\r\n\r\n return new Promise(resolve => {\r\n execFile(\r\n rg,\r\n [...args, target],\r\n {\r\n maxBuffer: 1_000_000,\r\n signal: abortSignal,\r\n timeout: 10_000,\r\n },\r\n (error, stdout) => {\r\n if (error) {\r\n if (error.code !== 1) {\r\n d('ripgrep error: %o', error)\r\n logError(error)\r\n }\r\n resolve([])\r\n } else {\r\n d('ripgrep succeeded with %s', stdout)\r\n resolve(stdout.trim().split('\\n').filter(Boolean))\r\n }\r\n },\r\n )\r\n })\r\n}\r\n\r\nexport async function listAllContentFiles(\r\n path: string,\r\n abortSignal: AbortSignal,\r\n limit: number,\r\n): Promise<string[]> {\r\n try {\r\n d('listAllContentFiles called: %s', path)\r\n return (await ripGrep(['-l', '.', path], path, abortSignal)).slice(0, limit)\r\n } catch (e) {\r\n d('listAllContentFiles failed: %o', e)\r\n\r\n logError(e)\r\n return []\r\n }\r\n}\r\n\r\nlet alreadyDoneSignCheck = false\r\nasync function codesignRipgrepIfNecessary(): Promise<void> {\r\n if (process.platform !== 'darwin' || alreadyDoneSignCheck) {\r\n return\r\n }\r\n\r\n alreadyDoneSignCheck = true\r\n\r\n d('checking if ripgrep is already signed')\r\n const lines = (\r\n await execFileNoThrow(\r\n 'codesign',\r\n ['-vv', '-d', getRipgrepPath()],\r\n undefined,\r\n undefined,\r\n false,\r\n )\r\n ).stdout.split('\\n')\r\n\r\n const needsSigned = lines.find(line => line.includes('linker-signed'))\r\n if (!needsSigned) {\r\n d('seems to be already signed')\r\n return\r\n }\r\n\r\n try {\r\n d('signing ripgrep')\r\n const signResult = await execFileNoThrow('codesign', [\r\n '--sign',\r\n '-',\r\n '--force',\r\n '--preserve-metadata=entitlements,requirements,flags,runtime',\r\n getRipgrepPath(),\r\n ])\r\n\r\n if (signResult.code !== 0) {\r\n d('failed to sign ripgrep: %o', signResult)\r\n logError(\r\n `Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`,\r\n )\r\n }\r\n\r\n d('removing quarantine')\r\n const quarantineResult = await execFileNoThrow('xattr', [\r\n '-d',\r\n 'com.apple.quarantine',\r\n getRipgrepPath(),\r\n ])\r\n\r\n if (quarantineResult.code !== 0) {\r\n d('failed to remove quarantine: %o', quarantineResult)\r\n logError(\r\n `Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`,\r\n )\r\n }\r\n } catch (e) {\r\n d('failed during sign: %o', e)\r\n logError(e)\r\n }\r\n}\r\n\r\nexport function resetRipgrepPathCacheForTests(): void {\r\n ;(getRipgrepPath as any).cache?.clear?.()\r\n alreadyDoneSignCheck = false\r\n}\r\n\r\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,95 @@
1
+ import { createRequire as __kodeCreateRequire } from "node:module";
2
+ const require = __kodeCreateRequire(import.meta.url);
3
+
4
+ // src/types/toolPermissionContext.ts
5
+ function createDefaultToolPermissionContext(options) {
6
+ return {
7
+ mode: "default",
8
+ additionalWorkingDirectories: /* @__PURE__ */ new Map(),
9
+ alwaysAllowRules: {},
10
+ alwaysDenyRules: {},
11
+ alwaysAskRules: {},
12
+ isBypassPermissionsModeAvailable: options?.isBypassPermissionsModeAvailable ?? false
13
+ };
14
+ }
15
+ function applyToolPermissionContextUpdate(context, update) {
16
+ switch (update.type) {
17
+ case "setMode":
18
+ return { ...context, mode: update.mode };
19
+ case "addRules": {
20
+ const key = update.behavior === "allow" ? "alwaysAllowRules" : update.behavior === "deny" ? "alwaysDenyRules" : "alwaysAskRules";
21
+ const existing = context[key][update.destination] ?? [];
22
+ return {
23
+ ...context,
24
+ [key]: {
25
+ ...context[key],
26
+ [update.destination]: [...existing, ...update.rules]
27
+ }
28
+ };
29
+ }
30
+ case "replaceRules": {
31
+ const key = update.behavior === "allow" ? "alwaysAllowRules" : update.behavior === "deny" ? "alwaysDenyRules" : "alwaysAskRules";
32
+ return {
33
+ ...context,
34
+ [key]: {
35
+ ...context[key],
36
+ [update.destination]: [...update.rules]
37
+ }
38
+ };
39
+ }
40
+ case "removeRules": {
41
+ const key = update.behavior === "allow" ? "alwaysAllowRules" : update.behavior === "deny" ? "alwaysDenyRules" : "alwaysAskRules";
42
+ const current = context[key][update.destination] ?? [];
43
+ const toRemove = new Set(update.rules);
44
+ const next = current.filter((rule) => !toRemove.has(rule));
45
+ return {
46
+ ...context,
47
+ [key]: {
48
+ ...context[key],
49
+ [update.destination]: next
50
+ }
51
+ };
52
+ }
53
+ case "addDirectories": {
54
+ const nextDirs = new Map(context.additionalWorkingDirectories);
55
+ for (const dir of update.directories) {
56
+ nextDirs.set(dir, { path: dir, source: update.destination });
57
+ }
58
+ return { ...context, additionalWorkingDirectories: nextDirs };
59
+ }
60
+ case "removeDirectories": {
61
+ const nextDirs = new Map(context.additionalWorkingDirectories);
62
+ for (const dir of update.directories) {
63
+ nextDirs.delete(dir);
64
+ }
65
+ return { ...context, additionalWorkingDirectories: nextDirs };
66
+ }
67
+ default:
68
+ return context;
69
+ }
70
+ }
71
+ function applyToolPermissionContextUpdates(context, updates) {
72
+ let next = context;
73
+ for (const update of updates) {
74
+ next = applyToolPermissionContextUpdate(next, update);
75
+ }
76
+ return next;
77
+ }
78
+ function isPersistableToolPermissionDestination(destination) {
79
+ return destination === "localSettings" || destination === "userSettings" || destination === "projectSettings";
80
+ }
81
+ function canUserModifyToolPermissionUpdate(update) {
82
+ if (update.destination !== "policySettings") return true;
83
+ if (update.type === "removeRules") return false;
84
+ if (update.type === "replaceRules") return false;
85
+ if (update.type === "removeDirectories") return false;
86
+ return true;
87
+ }
88
+
89
+ export {
90
+ createDefaultToolPermissionContext,
91
+ applyToolPermissionContextUpdate,
92
+ applyToolPermissionContextUpdates,
93
+ isPersistableToolPermissionDestination,
94
+ canUserModifyToolPermissionUpdate
95
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/types/toolPermissionContext.ts"],
4
+ "sourcesContent": ["import type { PermissionMode } from './permissionMode'\r\n\r\n\r\nexport type ToolPermissionUpdateDestination =\r\n | 'session'\r\n | 'localSettings'\r\n | 'userSettings'\r\n | 'projectSettings'\r\n | 'flagSettings'\r\n | 'policySettings'\r\n | 'cliArg'\r\n | 'command'\r\n\r\nexport type ToolPermissionRuleBehavior = 'allow' | 'deny' | 'ask'\r\n\r\nexport type AdditionalWorkingDirectoryEntry = {\r\n path: string\r\n source: ToolPermissionUpdateDestination\r\n}\r\n\r\nexport type ToolPermissionContext = {\r\n mode: PermissionMode\r\n additionalWorkingDirectories: Map<string, AdditionalWorkingDirectoryEntry>\r\n alwaysAllowRules: Partial<Record<ToolPermissionUpdateDestination, string[]>>\r\n alwaysDenyRules: Partial<Record<ToolPermissionUpdateDestination, string[]>>\r\n alwaysAskRules: Partial<Record<ToolPermissionUpdateDestination, string[]>>\r\n isBypassPermissionsModeAvailable: boolean\r\n}\r\n\r\nexport type ToolPermissionContextUpdate =\r\n | {\r\n type: 'setMode'\r\n mode: PermissionMode\r\n destination: ToolPermissionUpdateDestination\r\n }\r\n | {\r\n type: 'addRules'\r\n destination: ToolPermissionUpdateDestination\r\n behavior: ToolPermissionRuleBehavior\r\n rules: string[]\r\n }\r\n | {\r\n type: 'replaceRules'\r\n destination: ToolPermissionUpdateDestination\r\n behavior: ToolPermissionRuleBehavior\r\n rules: string[]\r\n }\r\n | {\r\n type: 'removeRules'\r\n destination: ToolPermissionUpdateDestination\r\n behavior: ToolPermissionRuleBehavior\r\n rules: string[]\r\n }\r\n | {\r\n type: 'addDirectories'\r\n destination: ToolPermissionUpdateDestination\r\n directories: string[]\r\n }\r\n | {\r\n type: 'removeDirectories'\r\n destination: ToolPermissionUpdateDestination\r\n directories: string[]\r\n }\r\n\r\nexport function createDefaultToolPermissionContext(options?: {\r\n isBypassPermissionsModeAvailable?: boolean\r\n}): ToolPermissionContext {\r\n return {\r\n mode: 'default',\r\n additionalWorkingDirectories: new Map(),\r\n alwaysAllowRules: {},\r\n alwaysDenyRules: {},\r\n alwaysAskRules: {},\r\n isBypassPermissionsModeAvailable:\r\n options?.isBypassPermissionsModeAvailable ?? false,\r\n }\r\n}\r\n\r\nexport function applyToolPermissionContextUpdate(\r\n context: ToolPermissionContext,\r\n update: ToolPermissionContextUpdate,\r\n): ToolPermissionContext {\r\n switch (update.type) {\r\n case 'setMode':\r\n return { ...context, mode: update.mode }\r\n case 'addRules': {\r\n const key =\r\n update.behavior === 'allow'\r\n ? 'alwaysAllowRules'\r\n : update.behavior === 'deny'\r\n ? 'alwaysDenyRules'\r\n : 'alwaysAskRules'\r\n const existing = context[key][update.destination] ?? []\r\n return {\r\n ...context,\r\n [key]: {\r\n ...context[key],\r\n [update.destination]: [...existing, ...update.rules],\r\n },\r\n }\r\n }\r\n case 'replaceRules': {\r\n const key =\r\n update.behavior === 'allow'\r\n ? 'alwaysAllowRules'\r\n : update.behavior === 'deny'\r\n ? 'alwaysDenyRules'\r\n : 'alwaysAskRules'\r\n return {\r\n ...context,\r\n [key]: {\r\n ...context[key],\r\n [update.destination]: [...update.rules],\r\n },\r\n }\r\n }\r\n case 'removeRules': {\r\n const key =\r\n update.behavior === 'allow'\r\n ? 'alwaysAllowRules'\r\n : update.behavior === 'deny'\r\n ? 'alwaysDenyRules'\r\n : 'alwaysAskRules'\r\n const current = context[key][update.destination] ?? []\r\n const toRemove = new Set(update.rules)\r\n const next = current.filter(rule => !toRemove.has(rule))\r\n return {\r\n ...context,\r\n [key]: {\r\n ...context[key],\r\n [update.destination]: next,\r\n },\r\n }\r\n }\r\n case 'addDirectories': {\r\n const nextDirs = new Map(context.additionalWorkingDirectories)\r\n for (const dir of update.directories) {\r\n nextDirs.set(dir, { path: dir, source: update.destination })\r\n }\r\n return { ...context, additionalWorkingDirectories: nextDirs }\r\n }\r\n case 'removeDirectories': {\r\n const nextDirs = new Map(context.additionalWorkingDirectories)\r\n for (const dir of update.directories) {\r\n nextDirs.delete(dir)\r\n }\r\n return { ...context, additionalWorkingDirectories: nextDirs }\r\n }\r\n default:\r\n return context\r\n }\r\n}\r\n\r\nexport function applyToolPermissionContextUpdates(\r\n context: ToolPermissionContext,\r\n updates: ToolPermissionContextUpdate[],\r\n): ToolPermissionContext {\r\n let next = context\r\n for (const update of updates) {\r\n next = applyToolPermissionContextUpdate(next, update)\r\n }\r\n return next\r\n}\r\n\r\nexport function isPersistableToolPermissionDestination(\r\n destination: ToolPermissionUpdateDestination,\r\n): destination is 'localSettings' | 'userSettings' | 'projectSettings' {\r\n return (\r\n destination === 'localSettings' ||\r\n destination === 'userSettings' ||\r\n destination === 'projectSettings'\r\n )\r\n}\r\n\r\nexport function canUserModifyToolPermissionUpdate(\r\n update: ToolPermissionContextUpdate,\r\n): boolean {\r\n if (update.destination !== 'policySettings') return true\r\n if (update.type === 'removeRules') return false\r\n if (update.type === 'replaceRules') return false\r\n if (update.type === 'removeDirectories') return false\r\n return true\r\n}\r\n"],
5
+ "mappings": ";;;;AAgEO,SAAS,mCAAmC,SAEzB;AACxB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,8BAA8B,oBAAI,IAAI;AAAA,IACtC,kBAAkB,CAAC;AAAA,IACnB,iBAAiB,CAAC;AAAA,IAClB,gBAAgB,CAAC;AAAA,IACjB,kCACE,SAAS,oCAAoC;AAAA,EACjD;AACF;AAEO,SAAS,iCACd,SACA,QACuB;AACvB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,MAAM,OAAO,KAAK;AAAA,IACzC,KAAK,YAAY;AACf,YAAM,MACJ,OAAO,aAAa,UAChB,qBACA,OAAO,aAAa,SAClB,oBACA;AACR,YAAM,WAAW,QAAQ,GAAG,EAAE,OAAO,WAAW,KAAK,CAAC;AACtD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,UACL,GAAG,QAAQ,GAAG;AAAA,UACd,CAAC,OAAO,WAAW,GAAG,CAAC,GAAG,UAAU,GAAG,OAAO,KAAK;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,MACJ,OAAO,aAAa,UAChB,qBACA,OAAO,aAAa,SAClB,oBACA;AACR,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,UACL,GAAG,QAAQ,GAAG;AAAA,UACd,CAAC,OAAO,WAAW,GAAG,CAAC,GAAG,OAAO,KAAK;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,MACJ,OAAO,aAAa,UAChB,qBACA,OAAO,aAAa,SAClB,oBACA;AACR,YAAM,UAAU,QAAQ,GAAG,EAAE,OAAO,WAAW,KAAK,CAAC;AACrD,YAAM,WAAW,IAAI,IAAI,OAAO,KAAK;AACrC,YAAM,OAAO,QAAQ,OAAO,UAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;AACvD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,UACL,GAAG,QAAQ,GAAG;AAAA,UACd,CAAC,OAAO,WAAW,GAAG;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAM,WAAW,IAAI,IAAI,QAAQ,4BAA4B;AAC7D,iBAAW,OAAO,OAAO,aAAa;AACpC,iBAAS,IAAI,KAAK,EAAE,MAAM,KAAK,QAAQ,OAAO,YAAY,CAAC;AAAA,MAC7D;AACA,aAAO,EAAE,GAAG,SAAS,8BAA8B,SAAS;AAAA,IAC9D;AAAA,IACA,KAAK,qBAAqB;AACxB,YAAM,WAAW,IAAI,IAAI,QAAQ,4BAA4B;AAC7D,iBAAW,OAAO,OAAO,aAAa;AACpC,iBAAS,OAAO,GAAG;AAAA,MACrB;AACA,aAAO,EAAE,GAAG,SAAS,8BAA8B,SAAS;AAAA,IAC9D;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,kCACd,SACA,SACuB;AACvB,MAAI,OAAO;AACX,aAAW,UAAU,SAAS;AAC5B,WAAO,iCAAiC,MAAM,MAAM;AAAA,EACtD;AACA,SAAO;AACT;AAEO,SAAS,uCACd,aACqE;AACrE,SACE,gBAAgB,mBAChB,gBAAgB,kBAChB,gBAAgB;AAEpB;AAEO,SAAS,kCACd,QACS;AACT,MAAI,OAAO,gBAAgB,iBAAkB,QAAO;AACpD,MAAI,OAAO,SAAS,cAAe,QAAO;AAC1C,MAAI,OAAO,SAAS,eAAgB,QAAO;AAC3C,MAAI,OAAO,SAAS,oBAAqB,QAAO;AAChD,SAAO;AACT;",
6
+ "names": []
7
+ }