@xagent-ai/cli 1.0.1

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 (537) hide show
  1. package/.eslintrc.js +25 -0
  2. package/.gitmodules +3 -0
  3. package/.prettierrc.json +8 -0
  4. package/CONTRIBUTING.md +167 -0
  5. package/LICENSE +21 -0
  6. package/README.md +280 -0
  7. package/README_CN.md +280 -0
  8. package/dist/agents.d.ts +21 -0
  9. package/dist/agents.d.ts.map +1 -0
  10. package/dist/agents.js +463 -0
  11. package/dist/agents.js.map +1 -0
  12. package/dist/ai-client.d.ts +83 -0
  13. package/dist/ai-client.d.ts.map +1 -0
  14. package/dist/ai-client.js +1280 -0
  15. package/dist/ai-client.js.map +1 -0
  16. package/dist/auth.d.ts +25 -0
  17. package/dist/auth.d.ts.map +1 -0
  18. package/dist/auth.js +573 -0
  19. package/dist/auth.js.map +1 -0
  20. package/dist/cancellation.d.ts +46 -0
  21. package/dist/cancellation.d.ts.map +1 -0
  22. package/dist/cancellation.js +154 -0
  23. package/dist/cancellation.js.map +1 -0
  24. package/dist/checkpoint.d.ts +28 -0
  25. package/dist/checkpoint.d.ts.map +1 -0
  26. package/dist/checkpoint.js +186 -0
  27. package/dist/checkpoint.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +364 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/config.d.ts +49 -0
  33. package/dist/config.d.ts.map +1 -0
  34. package/dist/config.js +205 -0
  35. package/dist/config.js.map +1 -0
  36. package/dist/context-compressor.d.ts +51 -0
  37. package/dist/context-compressor.d.ts.map +1 -0
  38. package/dist/context-compressor.js +231 -0
  39. package/dist/context-compressor.js.map +1 -0
  40. package/dist/conversation.d.ts +34 -0
  41. package/dist/conversation.d.ts.map +1 -0
  42. package/dist/conversation.js +221 -0
  43. package/dist/conversation.js.map +1 -0
  44. package/dist/gui-subagent/action-parser/actionParser.d.ts +19 -0
  45. package/dist/gui-subagent/action-parser/actionParser.d.ts.map +1 -0
  46. package/dist/gui-subagent/action-parser/actionParser.js +203 -0
  47. package/dist/gui-subagent/action-parser/actionParser.js.map +1 -0
  48. package/dist/gui-subagent/action-parser/constants.d.ts +8 -0
  49. package/dist/gui-subagent/action-parser/constants.d.ts.map +1 -0
  50. package/dist/gui-subagent/action-parser/constants.js +12 -0
  51. package/dist/gui-subagent/action-parser/constants.js.map +1 -0
  52. package/dist/gui-subagent/action-parser/index.d.ts +3 -0
  53. package/dist/gui-subagent/action-parser/index.d.ts.map +1 -0
  54. package/dist/gui-subagent/action-parser/index.js +6 -0
  55. package/dist/gui-subagent/action-parser/index.js.map +1 -0
  56. package/dist/gui-subagent/action-parser/types.d.ts +24 -0
  57. package/dist/gui-subagent/action-parser/types.d.ts.map +1 -0
  58. package/dist/gui-subagent/action-parser/types.js +12 -0
  59. package/dist/gui-subagent/action-parser/types.js.map +1 -0
  60. package/dist/gui-subagent/agent/gui-agent.d.ts +126 -0
  61. package/dist/gui-subagent/agent/gui-agent.d.ts.map +1 -0
  62. package/dist/gui-subagent/agent/gui-agent.js +820 -0
  63. package/dist/gui-subagent/agent/gui-agent.js.map +1 -0
  64. package/dist/gui-subagent/agent/index.d.ts +5 -0
  65. package/dist/gui-subagent/agent/index.d.ts.map +1 -0
  66. package/dist/gui-subagent/agent/index.js +5 -0
  67. package/dist/gui-subagent/agent/index.js.map +1 -0
  68. package/dist/gui-subagent/index.d.ts +43 -0
  69. package/dist/gui-subagent/index.d.ts.map +1 -0
  70. package/dist/gui-subagent/index.js +96 -0
  71. package/dist/gui-subagent/index.js.map +1 -0
  72. package/dist/gui-subagent/operator/base-operator.d.ts +108 -0
  73. package/dist/gui-subagent/operator/base-operator.d.ts.map +1 -0
  74. package/dist/gui-subagent/operator/base-operator.js +172 -0
  75. package/dist/gui-subagent/operator/base-operator.js.map +1 -0
  76. package/dist/gui-subagent/operator/browser-operator.d.ts +36 -0
  77. package/dist/gui-subagent/operator/browser-operator.d.ts.map +1 -0
  78. package/dist/gui-subagent/operator/browser-operator.js +306 -0
  79. package/dist/gui-subagent/operator/browser-operator.js.map +1 -0
  80. package/dist/gui-subagent/operator/computer-operator.d.ts +31 -0
  81. package/dist/gui-subagent/operator/computer-operator.d.ts.map +1 -0
  82. package/dist/gui-subagent/operator/computer-operator.js +441 -0
  83. package/dist/gui-subagent/operator/computer-operator.js.map +1 -0
  84. package/dist/gui-subagent/operator/desktop-operator.d.ts +55 -0
  85. package/dist/gui-subagent/operator/desktop-operator.d.ts.map +1 -0
  86. package/dist/gui-subagent/operator/desktop-operator.js +527 -0
  87. package/dist/gui-subagent/operator/desktop-operator.js.map +1 -0
  88. package/dist/gui-subagent/operator/index.d.ts +7 -0
  89. package/dist/gui-subagent/operator/index.d.ts.map +1 -0
  90. package/dist/gui-subagent/operator/index.js +6 -0
  91. package/dist/gui-subagent/operator/index.js.map +1 -0
  92. package/dist/gui-subagent/types/actions.d.ts +108 -0
  93. package/dist/gui-subagent/types/actions.d.ts.map +1 -0
  94. package/dist/gui-subagent/types/actions.js +39 -0
  95. package/dist/gui-subagent/types/actions.js.map +1 -0
  96. package/dist/gui-subagent/types/index.d.ts +6 -0
  97. package/dist/gui-subagent/types/index.d.ts.map +1 -0
  98. package/dist/gui-subagent/types/index.js +6 -0
  99. package/dist/gui-subagent/types/index.js.map +1 -0
  100. package/dist/gui-subagent/types/operator.d.ts +95 -0
  101. package/dist/gui-subagent/types/operator.d.ts.map +1 -0
  102. package/dist/gui-subagent/types/operator.js +16 -0
  103. package/dist/gui-subagent/types/operator.js.map +1 -0
  104. package/dist/gui-subagent/utils.d.ts +19 -0
  105. package/dist/gui-subagent/utils.d.ts.map +1 -0
  106. package/dist/gui-subagent/utils.js +42 -0
  107. package/dist/gui-subagent/utils.js.map +1 -0
  108. package/dist/hook.d.ts +73 -0
  109. package/dist/hook.d.ts.map +1 -0
  110. package/dist/hook.js +156 -0
  111. package/dist/hook.js.map +1 -0
  112. package/dist/index.d.ts +19 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +19 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/input-history.d.ts +24 -0
  117. package/dist/input-history.d.ts.map +1 -0
  118. package/dist/input-history.js +94 -0
  119. package/dist/input-history.js.map +1 -0
  120. package/dist/input-processor.d.ts +31 -0
  121. package/dist/input-processor.d.ts.map +1 -0
  122. package/dist/input-processor.js +233 -0
  123. package/dist/input-processor.js.map +1 -0
  124. package/dist/keyboard-manager.d.ts +151 -0
  125. package/dist/keyboard-manager.d.ts.map +1 -0
  126. package/dist/keyboard-manager.js +396 -0
  127. package/dist/keyboard-manager.js.map +1 -0
  128. package/dist/logger.d.ts +75 -0
  129. package/dist/logger.d.ts.map +1 -0
  130. package/dist/logger.js +339 -0
  131. package/dist/logger.js.map +1 -0
  132. package/dist/mcp.d.ts +57 -0
  133. package/dist/mcp.d.ts.map +1 -0
  134. package/dist/mcp.js +483 -0
  135. package/dist/mcp.js.map +1 -0
  136. package/dist/memory.d.ts +25 -0
  137. package/dist/memory.d.ts.map +1 -0
  138. package/dist/memory.js +250 -0
  139. package/dist/memory.js.map +1 -0
  140. package/dist/print-system-prompt.d.ts +2 -0
  141. package/dist/print-system-prompt.d.ts.map +1 -0
  142. package/dist/print-system-prompt.js +40 -0
  143. package/dist/print-system-prompt.js.map +1 -0
  144. package/dist/session-manager.d.ts +41 -0
  145. package/dist/session-manager.d.ts.map +1 -0
  146. package/dist/session-manager.js +234 -0
  147. package/dist/session-manager.js.map +1 -0
  148. package/dist/session.d.ts +77 -0
  149. package/dist/session.d.ts.map +1 -0
  150. package/dist/session.js +1081 -0
  151. package/dist/session.js.map +1 -0
  152. package/dist/skill-invoker.d.ts +177 -0
  153. package/dist/skill-invoker.d.ts.map +1 -0
  154. package/dist/skill-invoker.js +1643 -0
  155. package/dist/skill-invoker.js.map +1 -0
  156. package/dist/skill-loader.d.ts +76 -0
  157. package/dist/skill-loader.d.ts.map +1 -0
  158. package/dist/skill-loader.js +407 -0
  159. package/dist/skill-loader.js.map +1 -0
  160. package/dist/slash-commands.d.ts +60 -0
  161. package/dist/slash-commands.d.ts.map +1 -0
  162. package/dist/slash-commands.js +1021 -0
  163. package/dist/slash-commands.js.map +1 -0
  164. package/dist/smart-approval.d.ts +137 -0
  165. package/dist/smart-approval.d.ts.map +1 -0
  166. package/dist/smart-approval.js +512 -0
  167. package/dist/smart-approval.js.map +1 -0
  168. package/dist/system-prompt-generator.d.ts +35 -0
  169. package/dist/system-prompt-generator.d.ts.map +1 -0
  170. package/dist/system-prompt-generator.js +729 -0
  171. package/dist/system-prompt-generator.js.map +1 -0
  172. package/dist/test-boundary-conditions.d.ts.map +1 -0
  173. package/dist/test-boundary-conditions.js.map +1 -0
  174. package/dist/test-cancellation-fix.d.ts.map +1 -0
  175. package/dist/test-cancellation-fix.js.map +1 -0
  176. package/dist/test-input-history.d.ts.map +1 -0
  177. package/dist/test-input-history.js.map +1 -0
  178. package/dist/test-interaction-flow.d.ts.map +1 -0
  179. package/dist/test-interaction-flow.js.map +1 -0
  180. package/dist/test-quick.d.ts.map +1 -0
  181. package/dist/test-quick.js.map +1 -0
  182. package/dist/test-user-interaction.d.ts.map +1 -0
  183. package/dist/test-user-interaction.js.map +1 -0
  184. package/dist/theme.d.ts +353 -0
  185. package/dist/theme.d.ts.map +1 -0
  186. package/dist/theme.js +383 -0
  187. package/dist/theme.js.map +1 -0
  188. package/dist/tools.d.ts +373 -0
  189. package/dist/tools.d.ts.map +1 -0
  190. package/dist/tools.js +2906 -0
  191. package/dist/tools.js.map +1 -0
  192. package/dist/types.d.ts +180 -0
  193. package/dist/types.d.ts.map +1 -0
  194. package/dist/types.js +23 -0
  195. package/dist/types.js.map +1 -0
  196. package/dist/unified-session.d.ts +42 -0
  197. package/dist/unified-session.d.ts.map +1 -0
  198. package/dist/unified-session.js +271 -0
  199. package/dist/unified-session.js.map +1 -0
  200. package/dist/update.d.ts +30 -0
  201. package/dist/update.d.ts.map +1 -0
  202. package/dist/update.js +211 -0
  203. package/dist/update.js.map +1 -0
  204. package/dist/workflow.d.ts +53 -0
  205. package/dist/workflow.d.ts.map +1 -0
  206. package/dist/workflow.js +405 -0
  207. package/dist/workflow.js.map +1 -0
  208. package/docs/architecture/mcp-integration-guide.md +131 -0
  209. package/docs/architecture/overview.md +93 -0
  210. package/docs/architecture/tool-system-design.md +89 -0
  211. package/docs/cli/commands.md +189 -0
  212. package/docs/smart-mode.md +257 -0
  213. package/docs/third-party-models.md +449 -0
  214. package/package.json +85 -0
  215. package/scripts/init-skills-path.js +58 -0
  216. package/skills/.claude-plugin/marketplace.json +45 -0
  217. package/skills/README.md +94 -0
  218. package/skills/THIRD_PARTY_NOTICES.md +405 -0
  219. package/skills/skills/algorithmic-art/LICENSE.txt +202 -0
  220. package/skills/skills/algorithmic-art/SKILL.md +405 -0
  221. package/skills/skills/algorithmic-art/templates/generator_template.js +223 -0
  222. package/skills/skills/algorithmic-art/templates/viewer.html +599 -0
  223. package/skills/skills/brand-guidelines/LICENSE.txt +202 -0
  224. package/skills/skills/brand-guidelines/SKILL.md +73 -0
  225. package/skills/skills/canvas-design/LICENSE.txt +202 -0
  226. package/skills/skills/canvas-design/SKILL.md +130 -0
  227. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  228. package/skills/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  229. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  230. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  231. package/skills/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  232. package/skills/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  233. package/skills/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  234. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  235. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  236. package/skills/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  237. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  238. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  239. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  240. package/skills/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  241. package/skills/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  242. package/skills/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  243. package/skills/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  244. package/skills/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  245. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  246. package/skills/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  247. package/skills/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  248. package/skills/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  249. package/skills/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  250. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  251. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  252. package/skills/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  253. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  254. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  255. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  256. package/skills/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  257. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  258. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  259. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  260. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  261. package/skills/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  262. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  263. package/skills/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  264. package/skills/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  265. package/skills/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  266. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  267. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  268. package/skills/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  269. package/skills/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  270. package/skills/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  271. package/skills/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  272. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  273. package/skills/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  274. package/skills/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  275. package/skills/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  276. package/skills/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  277. package/skills/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  278. package/skills/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  279. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  280. package/skills/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  281. package/skills/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  282. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  283. package/skills/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  284. package/skills/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  285. package/skills/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  286. package/skills/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  287. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  288. package/skills/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  289. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  290. package/skills/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  291. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  292. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  293. package/skills/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  294. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  295. package/skills/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  296. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  297. package/skills/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  298. package/skills/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  299. package/skills/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  300. package/skills/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  301. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  302. package/skills/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  303. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  304. package/skills/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  305. package/skills/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  306. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  307. package/skills/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  308. package/skills/skills/doc-coauthoring/SKILL.md +375 -0
  309. package/skills/skills/docx/LICENSE.txt +30 -0
  310. package/skills/skills/docx/SKILL.md +197 -0
  311. package/skills/skills/docx/docx-js.md +350 -0
  312. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  313. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  314. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  315. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  316. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  317. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  318. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  319. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  320. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  321. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  322. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  323. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  324. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  325. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  326. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  327. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  328. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  329. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  330. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  331. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  332. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  333. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  334. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  335. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  336. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  337. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  338. package/skills/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  339. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  340. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  341. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  342. package/skills/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  343. package/skills/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  344. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  345. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  346. package/skills/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  347. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  348. package/skills/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  349. package/skills/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  350. package/skills/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  351. package/skills/skills/docx/ooxml/scripts/pack.py +159 -0
  352. package/skills/skills/docx/ooxml/scripts/unpack.py +29 -0
  353. package/skills/skills/docx/ooxml/scripts/validate.py +69 -0
  354. package/skills/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  355. package/skills/skills/docx/ooxml/scripts/validation/base.py +951 -0
  356. package/skills/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  357. package/skills/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  358. package/skills/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  359. package/skills/skills/docx/ooxml.md +610 -0
  360. package/skills/skills/docx/scripts/__init__.py +1 -0
  361. package/skills/skills/docx/scripts/document.py +1276 -0
  362. package/skills/skills/docx/scripts/templates/comments.xml +3 -0
  363. package/skills/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  364. package/skills/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  365. package/skills/skills/docx/scripts/templates/commentsIds.xml +3 -0
  366. package/skills/skills/docx/scripts/templates/people.xml +3 -0
  367. package/skills/skills/docx/scripts/utilities.py +374 -0
  368. package/skills/skills/frontend-design/LICENSE.txt +177 -0
  369. package/skills/skills/frontend-design/SKILL.md +42 -0
  370. package/skills/skills/internal-comms/LICENSE.txt +202 -0
  371. package/skills/skills/internal-comms/SKILL.md +32 -0
  372. package/skills/skills/internal-comms/examples/3p-updates.md +47 -0
  373. package/skills/skills/internal-comms/examples/company-newsletter.md +65 -0
  374. package/skills/skills/internal-comms/examples/faq-answers.md +30 -0
  375. package/skills/skills/internal-comms/examples/general-comms.md +16 -0
  376. package/skills/skills/mcp-builder/LICENSE.txt +202 -0
  377. package/skills/skills/mcp-builder/SKILL.md +236 -0
  378. package/skills/skills/mcp-builder/reference/evaluation.md +602 -0
  379. package/skills/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  380. package/skills/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  381. package/skills/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  382. package/skills/skills/mcp-builder/scripts/connections.py +151 -0
  383. package/skills/skills/mcp-builder/scripts/evaluation.py +373 -0
  384. package/skills/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  385. package/skills/skills/mcp-builder/scripts/requirements.txt +2 -0
  386. package/skills/skills/pdf/LICENSE.txt +30 -0
  387. package/skills/skills/pdf/SKILL.md +294 -0
  388. package/skills/skills/pdf/forms.md +205 -0
  389. package/skills/skills/pdf/reference.md +612 -0
  390. package/skills/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  391. package/skills/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  392. package/skills/skills/pdf/scripts/check_fillable_fields.py +12 -0
  393. package/skills/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  394. package/skills/skills/pdf/scripts/create_validation_image.py +41 -0
  395. package/skills/skills/pdf/scripts/extract_form_field_info.py +152 -0
  396. package/skills/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  397. package/skills/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  398. package/skills/skills/pptx/LICENSE.txt +30 -0
  399. package/skills/skills/pptx/SKILL.md +484 -0
  400. package/skills/skills/pptx/html2pptx.md +625 -0
  401. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  402. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  403. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  404. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  405. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  406. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  407. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  408. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  409. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  410. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  411. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  412. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  413. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  414. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  415. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  416. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  417. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  418. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  419. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  420. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  421. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  422. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  423. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  424. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  425. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  426. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  427. package/skills/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  428. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  429. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  430. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  431. package/skills/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  432. package/skills/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  433. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  434. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  435. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  436. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  437. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  438. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  439. package/skills/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  440. package/skills/skills/pptx/ooxml/scripts/pack.py +159 -0
  441. package/skills/skills/pptx/ooxml/scripts/unpack.py +29 -0
  442. package/skills/skills/pptx/ooxml/scripts/validate.py +69 -0
  443. package/skills/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  444. package/skills/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  445. package/skills/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  446. package/skills/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  447. package/skills/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  448. package/skills/skills/pptx/ooxml.md +427 -0
  449. package/skills/skills/pptx/scripts/html2pptx.js +979 -0
  450. package/skills/skills/pptx/scripts/inventory.py +1020 -0
  451. package/skills/skills/pptx/scripts/rearrange.py +231 -0
  452. package/skills/skills/pptx/scripts/replace.py +385 -0
  453. package/skills/skills/pptx/scripts/thumbnail.py +450 -0
  454. package/skills/skills/skill-creator/LICENSE.txt +202 -0
  455. package/skills/skills/skill-creator/SKILL.md +356 -0
  456. package/skills/skills/skill-creator/references/output-patterns.md +82 -0
  457. package/skills/skills/skill-creator/references/workflows.md +28 -0
  458. package/skills/skills/skill-creator/scripts/init_skill.py +303 -0
  459. package/skills/skills/skill-creator/scripts/package_skill.py +110 -0
  460. package/skills/skills/skill-creator/scripts/quick_validate.py +95 -0
  461. package/skills/skills/slack-gif-creator/LICENSE.txt +202 -0
  462. package/skills/skills/slack-gif-creator/SKILL.md +254 -0
  463. package/skills/skills/slack-gif-creator/core/easing.py +234 -0
  464. package/skills/skills/slack-gif-creator/core/frame_composer.py +176 -0
  465. package/skills/skills/slack-gif-creator/core/gif_builder.py +269 -0
  466. package/skills/skills/slack-gif-creator/core/validators.py +136 -0
  467. package/skills/skills/slack-gif-creator/requirements.txt +4 -0
  468. package/skills/skills/theme-factory/LICENSE.txt +202 -0
  469. package/skills/skills/theme-factory/SKILL.md +59 -0
  470. package/skills/skills/theme-factory/theme-showcase.pdf +0 -0
  471. package/skills/skills/theme-factory/themes/arctic-frost.md +19 -0
  472. package/skills/skills/theme-factory/themes/botanical-garden.md +19 -0
  473. package/skills/skills/theme-factory/themes/desert-rose.md +19 -0
  474. package/skills/skills/theme-factory/themes/forest-canopy.md +19 -0
  475. package/skills/skills/theme-factory/themes/golden-hour.md +19 -0
  476. package/skills/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  477. package/skills/skills/theme-factory/themes/modern-minimalist.md +19 -0
  478. package/skills/skills/theme-factory/themes/ocean-depths.md +19 -0
  479. package/skills/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  480. package/skills/skills/theme-factory/themes/tech-innovation.md +19 -0
  481. package/skills/skills/web-artifacts-builder/LICENSE.txt +202 -0
  482. package/skills/skills/web-artifacts-builder/SKILL.md +74 -0
  483. package/skills/skills/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  484. package/skills/skills/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  485. package/skills/skills/webapp-testing/LICENSE.txt +202 -0
  486. package/skills/skills/webapp-testing/SKILL.md +96 -0
  487. package/skills/skills/webapp-testing/examples/console_logging.py +35 -0
  488. package/skills/skills/webapp-testing/examples/element_discovery.py +40 -0
  489. package/skills/skills/webapp-testing/examples/static_html_automation.py +33 -0
  490. package/skills/skills/webapp-testing/scripts/with_server.py +106 -0
  491. package/skills/skills/xlsx/LICENSE.txt +30 -0
  492. package/skills/skills/xlsx/SKILL.md +289 -0
  493. package/skills/skills/xlsx/recalc.py +178 -0
  494. package/skills/spec/agent-skills-spec.md +3 -0
  495. package/skills/template/SKILL.md +6 -0
  496. package/src/agents.ts +504 -0
  497. package/src/ai-client.ts +1456 -0
  498. package/src/auth.ts +648 -0
  499. package/src/cancellation.ts +176 -0
  500. package/src/checkpoint.ts +219 -0
  501. package/src/cli.ts +384 -0
  502. package/src/config.ts +248 -0
  503. package/src/context-compressor.ts +290 -0
  504. package/src/conversation.ts +288 -0
  505. package/src/gui-subagent/action-parser/actionParser.ts +312 -0
  506. package/src/gui-subagent/action-parser/constants.ts +12 -0
  507. package/src/gui-subagent/action-parser/index.ts +6 -0
  508. package/src/gui-subagent/action-parser/types.ts +31 -0
  509. package/src/gui-subagent/agent/gui-agent.ts +982 -0
  510. package/src/gui-subagent/agent/index.ts +5 -0
  511. package/src/gui-subagent/index.ts +139 -0
  512. package/src/gui-subagent/operator/base-operator.ts +246 -0
  513. package/src/gui-subagent/operator/computer-operator.ts +520 -0
  514. package/src/gui-subagent/operator/index.ts +7 -0
  515. package/src/gui-subagent/types/actions.ts +263 -0
  516. package/src/gui-subagent/types/index.ts +6 -0
  517. package/src/gui-subagent/types/operator.ts +106 -0
  518. package/src/gui-subagent/utils.ts +51 -0
  519. package/src/index.ts +18 -0
  520. package/src/input-processor.ts +282 -0
  521. package/src/logger.ts +438 -0
  522. package/src/mcp.ts +563 -0
  523. package/src/memory.ts +303 -0
  524. package/src/session-manager.ts +308 -0
  525. package/src/session.ts +1280 -0
  526. package/src/skill-invoker.ts +1888 -0
  527. package/src/skill-loader.ts +476 -0
  528. package/src/slash-commands.ts +1150 -0
  529. package/src/smart-approval.ts +595 -0
  530. package/src/system-prompt-generator.ts +786 -0
  531. package/src/theme.ts +455 -0
  532. package/src/tools.ts +3398 -0
  533. package/src/types.ts +198 -0
  534. package/src/update.ts +270 -0
  535. package/src/workflow.ts +508 -0
  536. package/tsconfig.json +22 -0
  537. package/vitest.config.ts +19 -0
@@ -0,0 +1,1280 @@
1
+ import axios from 'axios';
2
+ // Markdown渲染辅助函数
3
+ function renderMarkdown(text) {
4
+ // 代码块渲染
5
+ text = text.replace(/```(\w*)\n([\s\S]*?)```/g, (_, lang, code) => {
6
+ return `\n┌─[${lang || 'code'}]\n${code.trim().split('\n').map((l) => '│ ' + l).join('\n')}\n└─\n`;
7
+ });
8
+ // 行内代码渲染
9
+ text = text.replace(/`([^`]+)`/g, '`$1`');
10
+ // 粗体渲染
11
+ text = text.replace(/\*\*([^*]+)\*\*/g, '●$1○');
12
+ // 斜体渲染
13
+ text = text.replace(/\*([^*]+)\*/g, '/$1/');
14
+ // 列表渲染
15
+ text = text.replace(/^- (.*$)/gm, '○ $1');
16
+ text = text.replace(/^\d+\. (.*$)/gm, '• $1');
17
+ // 标题渲染
18
+ text = text.replace(/^### (.*$)/gm, '\n━━━ $1 ━━━\n');
19
+ text = text.replace(/^## (.*$)/gm, '\n━━━━━ $1 ━━━━━\n');
20
+ text = text.replace(/^# (.*$)/gm, '\n━━━━━━━ $1 ━━━━━━━\n');
21
+ // 引用渲染
22
+ text = text.replace(/^> (.*$)/gm, '│ │ $1');
23
+ // 链接渲染
24
+ text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '[$1]($2)');
25
+ return text;
26
+ }
27
+ // 格式化消息内容
28
+ function formatMessageContent(content) {
29
+ if (typeof content === 'string') {
30
+ return renderMarkdown(content);
31
+ }
32
+ const parts = [];
33
+ let hasToolUse = false;
34
+ for (const block of content) {
35
+ if (block.type === 'text') {
36
+ parts.push(renderMarkdown(block.text || ''));
37
+ }
38
+ else if (block.type === 'tool_use') {
39
+ hasToolUse = true;
40
+ parts.push(`[🔧 TOOL CALL PENDING: ${block.name}]`);
41
+ }
42
+ else if (block.type === 'tool_result') {
43
+ const result = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);
44
+ parts.push(`[✅ TOOL RESULT]\n${result}`);
45
+ }
46
+ else if (block.type === 'thinking') {
47
+ parts.push(`[🧠 THINKING]\n${block.thinking || ''}`);
48
+ }
49
+ }
50
+ if (hasToolUse) {
51
+ parts.push('\n[⚠️ Note: Tool calls are executed by the framework, not displayed here]');
52
+ }
53
+ return parts.join('\n');
54
+ }
55
+ // 分类展示消息
56
+ function displayMessages(messages, systemPrompt) {
57
+ const roleColors = {
58
+ system: '🟫 SYSTEM',
59
+ user: '👤 USER',
60
+ assistant: '🤖 ASSISTANT',
61
+ tool: '🔧 TOOL'
62
+ };
63
+ // 先显示system消息(如果有单独的systemPrompt参数)
64
+ if (systemPrompt) {
65
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
66
+ console.log('│ 🟫 SYSTEM │');
67
+ console.log('├─────────────────────────────────────────────────────────────┤');
68
+ console.log(renderMarkdown(systemPrompt).split('\n').map((l) => '│ ' + l).join('\n'));
69
+ console.log('└─────────────────────────────────────────────────────────────┘');
70
+ }
71
+ // 遍历所有消息
72
+ for (let i = 0; i < messages.length; i++) {
73
+ const msg = messages[i];
74
+ const role = msg.role;
75
+ const roleLabel = roleColors[role] || `● ${role.toUpperCase()}`;
76
+ console.log(`\n┌─────────────────────────────────────────────────────────────┐`);
77
+ console.log(`│ ${roleLabel} (${i + 1}/${messages.length}) │`);
78
+ console.log('├─────────────────────────────────────────────────────────────┤');
79
+ // 显示reasoning_content(如果有)
80
+ if (msg.reasoning_content) {
81
+ console.log('│ 🧠 REASONING:');
82
+ console.log('│ ───────────────────────────────────────────────────────────');
83
+ const reasoningLines = renderMarkdown(msg.reasoning_content).split('\n');
84
+ for (const line of reasoningLines.slice(0, 20)) {
85
+ console.log('│ ' + line.slice(0, 62));
86
+ }
87
+ if (msg.reasoning_content.length > 1000)
88
+ console.log('│ ... (truncated)');
89
+ console.log('│ ───────────────────────────────────────────────────────────');
90
+ }
91
+ // 显示主要内容
92
+ const content = formatMessageContent(msg.content);
93
+ const lines = content.split('\n');
94
+ for (const line of lines.slice(0, 50)) {
95
+ console.log('│ ' + line.slice(0, 62));
96
+ }
97
+ if (lines.length > 50) {
98
+ console.log('│ ... (' + (lines.length - 50) + ' more lines)');
99
+ }
100
+ console.log('└─────────────────────────────────────────────────────────────┘');
101
+ }
102
+ }
103
+ // 格式化响应内容
104
+ function formatResponseContent(content) {
105
+ if (typeof content === 'string') {
106
+ return renderMarkdown(content);
107
+ }
108
+ const parts = [];
109
+ let hasToolUse = false;
110
+ for (const block of content) {
111
+ if (block.type === 'text') {
112
+ parts.push(renderMarkdown(block.text || ''));
113
+ }
114
+ else if (block.type === 'tool_use') {
115
+ hasToolUse = true;
116
+ // 工具调用通过 tool_calls 字段处理,不在此显示
117
+ }
118
+ else if (block.type === 'tool_result') {
119
+ const result = typeof block.content === 'string' ? block.content : JSON.stringify(block.content);
120
+ parts.push(`[✅ TOOL RESULT]\n${result}`);
121
+ }
122
+ else if (block.type === 'thinking') {
123
+ parts.push(`[🧠 THINKING]\n${block.thinking || ''}`);
124
+ }
125
+ else if (block.type === 'image') {
126
+ parts.push('[IMAGE]');
127
+ }
128
+ }
129
+ if (hasToolUse) {
130
+ parts.push('\n[⚠️ Note: Tool calls are executed via tool_calls field, not shown here]');
131
+ }
132
+ return parts.join('\n');
133
+ }
134
+ // 检测是否为 Anthropic 兼容 API(使用 x-api-key 认证头)
135
+ function isAnthropicCompatible(baseUrl) {
136
+ return baseUrl.includes('anthropic') ||
137
+ baseUrl.includes('minimaxi.com') ||
138
+ baseUrl.includes('minimax.chat');
139
+ }
140
+ // MiniMax API 路径检测
141
+ function detectMiniMaxAPI(baseUrl) {
142
+ return baseUrl.includes('minimax.chat') ||
143
+ baseUrl.includes('minimaxi.com');
144
+ }
145
+ // 获取 MiniMax 的正确端点路径
146
+ function getMiniMaxEndpoint(baseUrl) {
147
+ // MiniMax Anthropic 格式: https://api.minimax.chat/anthropic + /v1/messages
148
+ if (baseUrl.includes('/anthropic')) {
149
+ return { endpoint: '/v1/messages', format: 'anthropic' };
150
+ }
151
+ // MiniMax OpenAI 格式: https://api.minimaxi.com/v1 + /chat/completions
152
+ if (baseUrl.includes('/v1') && !baseUrl.includes('/anthropic')) {
153
+ return { endpoint: '/chat/completions', format: 'openai' };
154
+ }
155
+ // 默认使用 Anthropic 格式
156
+ return { endpoint: '/v1/messages', format: 'anthropic' };
157
+ }
158
+ export class AIClient {
159
+ client;
160
+ authConfig;
161
+ constructor(authConfig) {
162
+ this.authConfig = authConfig;
163
+ const isMiniMax = detectMiniMaxAPI(authConfig.baseUrl || '');
164
+ const isAnthropicOfficial = !isMiniMax && isAnthropicCompatible(authConfig.baseUrl || '');
165
+ const headers = {
166
+ 'Content-Type': 'application/json'
167
+ };
168
+ if (isMiniMax) {
169
+ // MiniMax: 使用 x-api-key 认证头
170
+ headers['x-api-key'] = authConfig.apiKey || '';
171
+ headers['anthropic-version'] = '2023-06-01';
172
+ }
173
+ else if (isAnthropicOfficial) {
174
+ // Anthropic 官方: 使用 x-api-key 认证头
175
+ headers['x-api-key'] = authConfig.apiKey || '';
176
+ headers['anthropic-version'] = '2023-06-01';
177
+ headers['anthropic-dangerous-direct-browser-access'] = 'true';
178
+ }
179
+ else {
180
+ // 其他 OpenAI 兼容: 使用 Bearer token
181
+ headers['Authorization'] = `Bearer ${authConfig.apiKey}`;
182
+ }
183
+ this.client = axios.create({
184
+ baseURL: authConfig.baseUrl,
185
+ headers,
186
+ timeout: 240000
187
+ });
188
+ }
189
+ // 将 OpenAI 格式消息转换为 Anthropic 格式
190
+ convertToAnthropicFormat(messages, systemPrompt) {
191
+ const systemMessages = messages.filter(m => m.role === 'system');
192
+ const otherMessages = messages.filter(m => m.role !== 'system');
193
+ const systemContent = systemMessages[0]?.content;
194
+ const system = systemPrompt || (typeof systemContent === 'string' ? systemContent : '');
195
+ const anthropicMessages = [];
196
+ for (const msg of otherMessages) {
197
+ const blocks = [];
198
+ if (typeof msg.content === 'string') {
199
+ blocks.push({ type: 'text', text: msg.content });
200
+ }
201
+ else if (Array.isArray(msg.content)) {
202
+ for (const block of msg.content) {
203
+ if (block.type === 'text' && 'text' in block) {
204
+ blocks.push({ type: 'text', text: block.text });
205
+ }
206
+ else if (block.type === 'tool_use') {
207
+ blocks.push({
208
+ type: 'tool_use',
209
+ id: block.id,
210
+ name: block.function?.name || block.name,
211
+ input: block.function?.arguments || block.input
212
+ });
213
+ }
214
+ else if (block.type === 'tool_result') {
215
+ blocks.push({
216
+ type: 'tool_result',
217
+ tool_use_id: block.tool_call_id || block.tool_use_id,
218
+ content: typeof block.content === 'string'
219
+ ? block.content
220
+ : JSON.stringify(block.content)
221
+ });
222
+ }
223
+ else if (block.type === 'thinking') {
224
+ blocks.push({ type: 'thinking', thinking: block.thinking });
225
+ }
226
+ }
227
+ }
228
+ // 处理 tool_calls (OpenAI 格式)
229
+ if (msg.tool_calls) {
230
+ for (const tc of msg.tool_calls) {
231
+ blocks.push({
232
+ type: 'tool_use',
233
+ id: tc.id,
234
+ name: tc.function?.name,
235
+ input: tc.function?.arguments ? (typeof tc.function.arguments === 'string' ? JSON.parse(tc.function.arguments) : tc.function.arguments) : {}
236
+ });
237
+ }
238
+ }
239
+ if (blocks.length > 0) {
240
+ anthropicMessages.push({
241
+ role: msg.role === 'tool' ? 'user' : msg.role,
242
+ content: blocks
243
+ });
244
+ }
245
+ }
246
+ return { system, messages: anthropicMessages };
247
+ }
248
+ async chatCompletion(messages, options = {}) {
249
+ const model = options.model || this.authConfig.modelName || 'gpt-4';
250
+ const isMiniMax = detectMiniMaxAPI(this.authConfig.baseUrl || '');
251
+ if (isMiniMax) {
252
+ return this.minimaxChatCompletion(messages, options);
253
+ }
254
+ const isAnthropic = isAnthropicCompatible(this.authConfig.baseUrl || '');
255
+ if (isAnthropic) {
256
+ return this.anthropicNativeChatCompletion(messages, options);
257
+ }
258
+ // OpenAI 格式请求
259
+ const requestBody = {
260
+ model,
261
+ messages,
262
+ temperature: options.temperature ?? 0.7,
263
+ stream: options.stream ?? false
264
+ };
265
+ if (options.maxTokens && options.maxTokens > 0) {
266
+ requestBody.max_tokens = options.maxTokens;
267
+ }
268
+ if (options.tools && options.tools.length > 0) {
269
+ requestBody.tools = options.tools;
270
+ requestBody.tool_choice = options.toolChoice || 'auto';
271
+ }
272
+ if (options.thinkingTokens && options.thinkingTokens > 0) {
273
+ requestBody.max_completion_tokens = options.thinkingTokens;
274
+ }
275
+ // 调试输出(受showAIDebugInfo配置控制)
276
+ const showDebug = this.authConfig.showAIDebugInfo ?? false;
277
+ if (showDebug) {
278
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
279
+ console.log('║ AI REQUEST DEBUG ║');
280
+ console.log('╚══════════════════════════════════════════════════════════╝');
281
+ console.log(`📦 Model: ${model}`);
282
+ console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
283
+ console.log(`💬 Total Messages: ${messages.length} 条`);
284
+ if (options.temperature !== undefined)
285
+ console.log(`🌡️ Temperature: ${options.temperature}`);
286
+ if (options.maxTokens)
287
+ console.log(`📏 Max Tokens: ${options.maxTokens}`);
288
+ if (options.tools?.length)
289
+ console.log(`🔧 Tools: ${options.tools.length} 个`);
290
+ if (options.thinkingTokens)
291
+ console.log(`🧠 Thinking Tokens: ${options.thinkingTokens}`);
292
+ console.log('─'.repeat(60));
293
+ // 分离system消息
294
+ const systemMsgs = messages.filter(m => m.role === 'system');
295
+ const otherMsgs = messages.filter(m => m.role !== 'system');
296
+ if (systemMsgs.length > 0) {
297
+ const systemContent = typeof systemMsgs[0].content === 'string'
298
+ ? systemMsgs[0].content
299
+ : formatMessageContent(systemMsgs[0].content);
300
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
301
+ console.log('│ 🟫 SYSTEM │');
302
+ console.log('├─────────────────────────────────────────────────────────────┤');
303
+ console.log(renderMarkdown(systemContent).split('\n').map(l => '│ ' + l).join('\n'));
304
+ console.log('└─────────────────────────────────────────────────────────────┘');
305
+ }
306
+ displayMessages(otherMsgs);
307
+ console.log('\n📤 Sending request to API...\n');
308
+ }
309
+ try {
310
+ const response = await this.client.post('/chat/completions', requestBody);
311
+ if (showDebug) {
312
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
313
+ console.log('║ AI RESPONSE DEBUG ║');
314
+ console.log('╚══════════════════════════════════════════════════════════╝');
315
+ console.log(`🆔 ID: ${response.data.id}`);
316
+ console.log(`🤖 Model: ${response.data.model}`);
317
+ const usage = response.data.usage;
318
+ if (usage) {
319
+ console.log(`📊 Tokens: ${usage.prompt_tokens} (prompt) + ${usage.completion_tokens} (completion) = ${usage.total_tokens} (total)`);
320
+ }
321
+ const choice = response.data.choices?.[0];
322
+ if (choice) {
323
+ console.log(`🏁 Finish Reason: ${choice.finish_reason}`);
324
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
325
+ console.log('│ 🤖 ASSISTANT │');
326
+ console.log('├─────────────────────────────────────────────────────────────┤');
327
+ // 显示reasoning_content(如果有)
328
+ if (choice.message.reasoning_content) {
329
+ console.log('│ 🧠 REASONING:');
330
+ console.log('│ ───────────────────────────────────────────────────────────');
331
+ const reasoningLines = renderMarkdown(choice.message.reasoning_content).split('\n');
332
+ for (const line of reasoningLines.slice(0, 15)) {
333
+ console.log('│ ' + line.slice(0, 62));
334
+ }
335
+ if (choice.message.reasoning_content.length > 800)
336
+ console.log('│ ... (truncated)');
337
+ console.log('│ ───────────────────────────────────────────────────────────');
338
+ }
339
+ // 显示主要内容
340
+ const content = formatResponseContent(choice.message.content);
341
+ const lines = content.split('\n');
342
+ console.log('│ 💬 CONTENT:');
343
+ console.log('│ ───────────────────────────────────────────────────────────');
344
+ for (const line of lines.slice(0, 40)) {
345
+ console.log('│ ' + line.slice(0, 62));
346
+ }
347
+ if (lines.length > 40) {
348
+ console.log(`│ ... (${lines.length - 40} more lines)`);
349
+ }
350
+ console.log('└─────────────────────────────────────────────────────────────┘');
351
+ }
352
+ console.log('╔══════════════════════════════════════════════════════════╗');
353
+ console.log('║ RESPONSE ENDED ║');
354
+ console.log('╚══════════════════════════════════════════════════════════╝\n');
355
+ }
356
+ return response.data;
357
+ }
358
+ catch (error) {
359
+ if (error.response) {
360
+ throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
361
+ }
362
+ else if (error.request) {
363
+ throw new Error('Network error: No response received from server');
364
+ }
365
+ else {
366
+ throw new Error(`Request error: ${error.message}`);
367
+ }
368
+ }
369
+ }
370
+ // Anthropic 官方原生 API(使用 /v1/messages 端点)
371
+ async anthropicNativeChatCompletion(messages, options = {}) {
372
+ const { system, messages: anthropicMessages } = this.convertToAnthropicFormat(messages);
373
+ const requestBody = {
374
+ model: options.model || this.authConfig.modelName || 'claude-sonnet-4-20250514',
375
+ messages: anthropicMessages,
376
+ temperature: options.temperature ?? 1.0,
377
+ stream: false,
378
+ max_tokens: options.maxTokens || 4096
379
+ };
380
+ if (system) {
381
+ requestBody.system = system;
382
+ }
383
+ // Anthropic 原生工具格式
384
+ if (options.tools && options.tools.length > 0) {
385
+ requestBody.tools = options.tools.map(tool => ({
386
+ name: tool.function.name,
387
+ description: tool.function.description,
388
+ input_schema: tool.function.parameters || { type: 'object', properties: {} }
389
+ }));
390
+ // 转换 tool_choice 从 OpenAI 格式到 Anthropic 格式
391
+ const toolChoice = options.toolChoice;
392
+ if (toolChoice === 'none') {
393
+ requestBody.tool_choice = { type: 'auto' };
394
+ }
395
+ else if (toolChoice && typeof toolChoice === 'object') {
396
+ if (toolChoice.type === 'function' && toolChoice.function) {
397
+ requestBody.tool_choice = { type: 'tool', tool: { name: toolChoice.function.name } };
398
+ }
399
+ else {
400
+ requestBody.tool_choice = { type: 'auto' };
401
+ }
402
+ }
403
+ else {
404
+ requestBody.tool_choice = { type: 'auto' };
405
+ }
406
+ }
407
+ // Anthropic thinking 模式
408
+ if (options.thinkingTokens && options.thinkingTokens > 0) {
409
+ requestBody.thinking = { type: 'enabled', budget_tokens: options.thinkingTokens };
410
+ }
411
+ // 调试输出(受showAIDebugInfo配置控制)
412
+ const showDebug = this.authConfig.showAIDebugInfo ?? false;
413
+ if (showDebug) {
414
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
415
+ console.log('║ AI REQUEST DEBUG (ANTHROPIC) ║');
416
+ console.log('╚══════════════════════════════════════════════════════════╝');
417
+ console.log(`📦 Model: ${requestBody.model}`);
418
+ console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
419
+ console.log(`💬 Total Messages: ${anthropicMessages.length} 条`);
420
+ if (requestBody.temperature)
421
+ console.log(`🌡️ Temperature: ${requestBody.temperature}`);
422
+ if (requestBody.max_tokens)
423
+ console.log(`📏 Max Tokens: ${requestBody.max_tokens}`);
424
+ if (requestBody.tools)
425
+ console.log(`🔧 Tools: ${requestBody.tools.length} 个`);
426
+ if (requestBody.thinking)
427
+ console.log(`🧠 Thinking Budget: ${requestBody.thinking.budget_tokens}`);
428
+ console.log('─'.repeat(60));
429
+ // 显示system消息
430
+ if (system) {
431
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
432
+ console.log('│ 🟫 SYSTEM │');
433
+ console.log('├─────────────────────────────────────────────────────────────┤');
434
+ console.log(renderMarkdown(system).split('\n').map(l => '│ ' + l).join('\n'));
435
+ console.log('└─────────────────────────────────────────────────────────────┘');
436
+ }
437
+ // 显示用户和助手消息
438
+ displayMessages(anthropicMessages);
439
+ console.log('\n📤 Sending to Anthropic API (v1/messages)...\n');
440
+ }
441
+ try {
442
+ // 使用 Anthropic 原生端点 /v1/messages
443
+ const response = await this.client.post('/v1/messages', requestBody);
444
+ if (showDebug) {
445
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
446
+ console.log('║ AI RESPONSE DEBUG (ANTHROPIC) ║');
447
+ console.log('╚══════════════════════════════════════════════════════════╝');
448
+ console.log(`🆔 ID: ${response.data.id}`);
449
+ console.log(`🤖 Model: ${response.data.model}`);
450
+ const usage = response.data.usage;
451
+ if (usage) {
452
+ console.log(`📊 Tokens: ${usage.input_tokens} (input) + ${usage.output_tokens} (output) = ${usage.input_tokens + usage.output_tokens} (total)`);
453
+ }
454
+ console.log(`🏁 Stop Reason: ${response.data.stop_reason}`);
455
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
456
+ console.log('│ 🤖 ASSISTANT │');
457
+ console.log('├─────────────────────────────────────────────────────────────┤');
458
+ const content = response.data.content || [];
459
+ const reasoning = content.filter((c) => c.type === 'thinking').map((c) => c.thinking).join('');
460
+ const textContent = content.filter((c) => c.type === 'text').map((c) => c.text).join('');
461
+ // 显示thinking
462
+ if (reasoning) {
463
+ console.log('│ 🧠 REASONING:');
464
+ console.log('│ ───────────────────────────────────────────────────────────');
465
+ const reasoningLines = renderMarkdown(reasoning).split('\n');
466
+ for (const line of reasoningLines.slice(0, 15)) {
467
+ console.log('│ ' + line.slice(0, 62));
468
+ }
469
+ if (reasoning.length > 800)
470
+ console.log('│ ... (truncated)');
471
+ console.log('│ ───────────────────────────────────────────────────────────');
472
+ }
473
+ // 显示内容
474
+ console.log('│ 💬 CONTENT:');
475
+ console.log('│ ───────────────────────────────────────────────────────────');
476
+ const lines = renderMarkdown(textContent).split('\n');
477
+ for (const line of lines.slice(0, 40)) {
478
+ console.log('│ ' + line.slice(0, 62));
479
+ }
480
+ if (lines.length > 40) {
481
+ console.log(`│ ... (${lines.length - 40} more lines)`);
482
+ }
483
+ console.log('└─────────────────────────────────────────────────────────────┘');
484
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
485
+ console.log('║ RESPONSE ENDED ║');
486
+ console.log('╚══════════════════════════════════════════════════════════╝\n');
487
+ }
488
+ return this.convertFromAnthropicNativeResponse(response.data);
489
+ }
490
+ catch (error) {
491
+ if (error.response) {
492
+ throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
493
+ }
494
+ else if (error.request) {
495
+ throw new Error('Network error: No response received from server');
496
+ }
497
+ else {
498
+ throw new Error(`Request error: ${error.message}`);
499
+ }
500
+ }
501
+ }
502
+ // MiniMax API(根据 baseUrl 自动选择 Anthropic 或 OpenAI 格式)
503
+ async minimaxChatCompletion(messages, options = {}) {
504
+ const { system, messages: anthropicMessages } = this.convertToAnthropicFormat(messages);
505
+ const { endpoint, format } = getMiniMaxEndpoint(this.authConfig.baseUrl || '');
506
+ const requestBody = {
507
+ model: options.model || this.authConfig.modelName || 'MiniMax-M2',
508
+ messages: format === 'anthropic' ? anthropicMessages : messages,
509
+ temperature: options.temperature ?? 1.0,
510
+ stream: false,
511
+ max_tokens: options.maxTokens || 4096
512
+ };
513
+ if (system && format === 'anthropic') {
514
+ requestBody.system = system;
515
+ }
516
+ if (format === 'anthropic') {
517
+ // Anthropic format tools
518
+ if (options.tools && options.tools.length > 0) {
519
+ requestBody.tools = options.tools.map(tool => ({
520
+ name: tool.function.name,
521
+ description: tool.function.description,
522
+ input_schema: tool.function.parameters || { type: 'object', properties: {} }
523
+ }));
524
+ const toolChoice = options.toolChoice;
525
+ if (toolChoice === 'none') {
526
+ requestBody.tool_choice = { type: 'auto' };
527
+ }
528
+ else if (toolChoice && typeof toolChoice === 'object') {
529
+ if (toolChoice.type === 'function' && toolChoice.function) {
530
+ requestBody.tool_choice = { type: 'tool', tool: { name: toolChoice.function.name } };
531
+ }
532
+ else {
533
+ requestBody.tool_choice = { type: 'auto' };
534
+ }
535
+ }
536
+ else {
537
+ requestBody.tool_choice = { type: 'auto' };
538
+ }
539
+ }
540
+ }
541
+ else {
542
+ // OpenAI 格式的工具
543
+ if (options.tools && options.tools.length > 0) {
544
+ requestBody.tools = options.tools;
545
+ requestBody.tool_choice = options.toolChoice || 'auto';
546
+ }
547
+ }
548
+ // 调试输出(受showAIDebugInfo配置控制)
549
+ const showDebug = this.authConfig.showAIDebugInfo ?? false;
550
+ if (showDebug) {
551
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
552
+ console.log('║ AI REQUEST DEBUG (MINIMAX) ║');
553
+ console.log('╚══════════════════════════════════════════════════════════╝');
554
+ console.log(`📦 Model: ${requestBody.model}`);
555
+ console.log(`🔗 Format: ${format.toUpperCase()} | Endpoint: ${endpoint}`);
556
+ console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
557
+ console.log(`💬 Total Messages: ${requestBody.messages.length} 条`);
558
+ if (requestBody.temperature)
559
+ console.log(`🌡️ Temperature: ${requestBody.temperature}`);
560
+ if (requestBody.max_tokens)
561
+ console.log(`📏 Max Tokens: ${requestBody.max_tokens}`);
562
+ if (requestBody.tools)
563
+ console.log(`🔧 Tools: ${requestBody.tools.length} 个`);
564
+ console.log('─'.repeat(60));
565
+ // 显示system消息
566
+ if (system && format === 'anthropic') {
567
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
568
+ console.log('│ 🟫 SYSTEM │');
569
+ console.log('├─────────────────────────────────────────────────────────────┤');
570
+ console.log(renderMarkdown(system).split('\n').map(l => '│ ' + l).join('\n'));
571
+ console.log('└─────────────────────────────────────────────────────────────┘');
572
+ }
573
+ // 显示其他消息
574
+ displayMessages(requestBody.messages);
575
+ console.log('\n📤 Sending to MiniMax API...\n');
576
+ }
577
+ try {
578
+ // MiniMax 使用正确的端点
579
+ const response = await this.client.post(endpoint, requestBody);
580
+ if (showDebug) {
581
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
582
+ console.log('║ AI RESPONSE DEBUG (MINIMAX) ║');
583
+ console.log('╚══════════════════════════════════════════════════════════╝');
584
+ console.log(`🆔 ID: ${response.data.id}`);
585
+ console.log(`🤖 Model: ${response.data.model}`);
586
+ const usage = response.data.usage;
587
+ if (usage) {
588
+ console.log(`📊 Tokens: ${usage.prompt_tokens} (prompt) + ${usage.completion_tokens} (completion) = ${usage.total_tokens} (total)`);
589
+ }
590
+ console.log(`🏁 Stop Reason: ${response.data.stop_reason}`);
591
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
592
+ console.log('│ 🤖 ASSISTANT │');
593
+ console.log('├─────────────────────────────────────────────────────────────┤');
594
+ const message = response.data.choices?.[0]?.message;
595
+ const content = typeof message?.content === 'string' ? message.content : JSON.stringify(message?.content);
596
+ console.log('│ 💬 CONTENT:');
597
+ console.log('│ ───────────────────────────────────────────────────────────');
598
+ const lines = renderMarkdown(content).split('\n');
599
+ for (const line of lines.slice(0, 40)) {
600
+ console.log('│ ' + line.slice(0, 62));
601
+ }
602
+ if (lines.length > 40) {
603
+ console.log(`│ ... (${lines.length - 40} more lines)`);
604
+ }
605
+ console.log('└─────────────────────────────────────────────────────────────┘');
606
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
607
+ console.log('║ RESPONSE ENDED ║');
608
+ console.log('╚══════════════════════════════════════════════════════════╝\n');
609
+ }
610
+ if (format === 'anthropic') {
611
+ return this.convertFromAnthropicNativeResponse(response.data);
612
+ }
613
+ else {
614
+ return this.convertFromMiniMaxResponse(response.data);
615
+ }
616
+ }
617
+ catch (error) {
618
+ if (error.response) {
619
+ throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
620
+ }
621
+ else if (error.request) {
622
+ throw new Error('Network error: No response received from server');
623
+ }
624
+ else {
625
+ throw new Error(`Request error: ${error.message}`);
626
+ }
627
+ }
628
+ }
629
+ // 将 Anthropic 原生响应转换为统一格式
630
+ convertFromAnthropicNativeResponse(anthropicResponse) {
631
+ const content = anthropicResponse.content || [];
632
+ let textContent = '';
633
+ let reasoningContent = '';
634
+ const toolCalls = [];
635
+ for (const block of content) {
636
+ if (block.type === 'text') {
637
+ textContent += block.text || '';
638
+ }
639
+ else if (block.type === 'thinking') {
640
+ reasoningContent += block.thinking || '';
641
+ }
642
+ else if (block.type === 'tool_use') {
643
+ toolCalls.push({
644
+ id: block.id,
645
+ type: 'function',
646
+ function: {
647
+ name: block.name,
648
+ arguments: JSON.stringify(block.input || {})
649
+ }
650
+ });
651
+ }
652
+ }
653
+ return {
654
+ id: anthropicResponse.id || `anthropic-${Date.now()}`,
655
+ object: 'chat.completion',
656
+ created: Math.floor(Date.now() / 1000),
657
+ model: anthropicResponse.model || this.authConfig.modelName || 'claude-sonnet-4-20250514',
658
+ choices: [{
659
+ index: 0,
660
+ message: {
661
+ role: 'assistant',
662
+ content: textContent,
663
+ reasoning_content: reasoningContent || undefined,
664
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined
665
+ },
666
+ finish_reason: anthropicResponse.stop_reason === 'end_turn' ? 'stop' :
667
+ anthropicResponse.stop_reason === 'max_tokens' ? 'length' : 'stop'
668
+ }],
669
+ usage: anthropicResponse.usage ? {
670
+ prompt_tokens: anthropicResponse.usage.input_tokens || 0,
671
+ completion_tokens: anthropicResponse.usage.output_tokens || 0,
672
+ total_tokens: (anthropicResponse.usage.input_tokens || 0) + (anthropicResponse.usage.output_tokens || 0)
673
+ } : undefined
674
+ };
675
+ }
676
+ // 将 MiniMax 响应转换为统一格式
677
+ convertFromMiniMaxResponse(minimaxResponse) {
678
+ const message = minimaxResponse.choices?.[0]?.message;
679
+ const content = message?.content;
680
+ let textContent = '';
681
+ let reasoningContent = '';
682
+ const toolCalls = [];
683
+ if (typeof content === 'string') {
684
+ textContent = content.trim();
685
+ }
686
+ else if (Array.isArray(content)) {
687
+ for (const block of content) {
688
+ if (block.type === 'text') {
689
+ textContent += block.text || '';
690
+ }
691
+ else if (block.type === 'thinking') {
692
+ reasoningContent += block.thinking || '';
693
+ }
694
+ else if (block.type === 'tool_use') {
695
+ toolCalls.push({
696
+ id: block.id,
697
+ type: 'function',
698
+ function: {
699
+ name: block.name,
700
+ arguments: JSON.stringify(block.input || {})
701
+ }
702
+ });
703
+ }
704
+ }
705
+ }
706
+ return {
707
+ id: minimaxResponse.id || `minimax-${Date.now()}`,
708
+ object: 'chat.completion',
709
+ created: Math.floor(Date.now() / 1000),
710
+ model: minimaxResponse.model || this.authConfig.modelName || 'MiniMax-M2',
711
+ choices: [{
712
+ index: 0,
713
+ message: {
714
+ role: 'assistant',
715
+ content: textContent,
716
+ reasoning_content: reasoningContent || undefined,
717
+ tool_calls: toolCalls.length > 0 ? toolCalls : undefined
718
+ },
719
+ finish_reason: minimaxResponse.stop_reason === 'end_turn' ? 'stop' :
720
+ minimaxResponse.stop_reason === 'max_tokens' ? 'length' : 'stop'
721
+ }],
722
+ usage: minimaxResponse.usage
723
+ };
724
+ }
725
+ async *streamChatCompletion(messages, options = {}) {
726
+ const isMiniMax = detectMiniMaxAPI(this.authConfig.baseUrl || '');
727
+ if (isMiniMax) {
728
+ yield* this.minimaxStreamChatCompletion(messages, options);
729
+ return;
730
+ }
731
+ const isAnthropic = isAnthropicCompatible(this.authConfig.baseUrl || '');
732
+ if (isAnthropic) {
733
+ yield* this.anthropicNativeStreamChatCompletion(messages, options);
734
+ return;
735
+ }
736
+ // OpenAI 流式响应
737
+ const model = options.model || this.authConfig.modelName || 'gpt-4';
738
+ const requestBody = {
739
+ model,
740
+ messages,
741
+ temperature: options.temperature ?? 0.7,
742
+ stream: true
743
+ };
744
+ if (options.maxTokens && options.maxTokens > 0) {
745
+ requestBody.max_tokens = options.maxTokens;
746
+ }
747
+ if (options.tools && options.tools.length > 0) {
748
+ requestBody.tools = options.tools;
749
+ requestBody.tool_choice = options.toolChoice || 'auto';
750
+ }
751
+ if (options.thinkingTokens && options.thinkingTokens > 0) {
752
+ requestBody.max_completion_tokens = options.thinkingTokens;
753
+ }
754
+ // 调试输出(受showAIDebugInfo配置控制)
755
+ const showDebug = this.authConfig.showAIDebugInfo ?? false;
756
+ if (showDebug) {
757
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
758
+ console.log('║ AI REQUEST DEBUG (STREAM) ║');
759
+ console.log('╚══════════════════════════════════════════════════════════╝');
760
+ console.log(`📦 Model: ${model}`);
761
+ console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
762
+ console.log(`💬 Total Messages: ${messages.length} 条`);
763
+ if (options.temperature)
764
+ console.log(`🌡️ Temperature: ${options.temperature}`);
765
+ if (options.maxTokens)
766
+ console.log(`📏 Max Tokens: ${options.maxTokens}`);
767
+ if (options.tools?.length)
768
+ console.log(`🔧 Tools: ${options.tools.length} 个`);
769
+ console.log('─'.repeat(60));
770
+ // 分离并显示消息
771
+ const systemMsgs = messages.filter(m => m.role === 'system');
772
+ const otherMsgs = messages.filter(m => m.role !== 'system');
773
+ if (systemMsgs.length > 0) {
774
+ const systemContent = typeof systemMsgs[0].content === 'string'
775
+ ? systemMsgs[0].content
776
+ : formatMessageContent(systemMsgs[0].content);
777
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
778
+ console.log('│ 🟫 SYSTEM │');
779
+ console.log('├─────────────────────────────────────────────────────────────┤');
780
+ console.log(renderMarkdown(systemContent).split('\n').map(l => '│ ' + l).join('\n'));
781
+ console.log('└─────────────────────────────────────────────────────────────┘');
782
+ }
783
+ displayMessages(otherMsgs);
784
+ console.log('\n📤 Starting stream...\n');
785
+ }
786
+ try {
787
+ const response = await this.client.post('/chat/completions', requestBody, {
788
+ responseType: 'stream'
789
+ });
790
+ console.log('📥 Receiving stream chunks...\n');
791
+ let buffer = '';
792
+ let chunkCount = 0;
793
+ let outputBuffer = '';
794
+ for await (const chunk of response.data) {
795
+ buffer += chunk.toString();
796
+ const lines = buffer.split('\n');
797
+ buffer = lines.pop() || '';
798
+ for (const line of lines) {
799
+ const trimmedLine = line.trim();
800
+ if (!trimmedLine)
801
+ continue;
802
+ if (trimmedLine.startsWith('data: ')) {
803
+ const data = trimmedLine.slice(6);
804
+ if (data === '[DONE]') {
805
+ if (showDebug) {
806
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
807
+ console.log('║ STREAM COMPLETED ║');
808
+ console.log('╚══════════════════════════════════════════════════════════╝');
809
+ console.log(`📦 Total chunks: ${chunkCount}`);
810
+ console.log(`📏 Total output: ${outputBuffer.length} chars`);
811
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
812
+ console.log('│ 🤖 ASSISTANT OUTPUT │');
813
+ console.log('├─────────────────────────────────────────────────────────────┤');
814
+ console.log('│ 💬 CONTENT:');
815
+ console.log('│ ───────────────────────────────────────────────────────────');
816
+ const lines = renderMarkdown(outputBuffer).split('\n');
817
+ for (const line of lines.slice(0, 30)) {
818
+ console.log('│ ' + line.slice(0, 62));
819
+ }
820
+ if (lines.length > 30) {
821
+ console.log(`│ ... (${lines.length - 30} more lines)`);
822
+ }
823
+ console.log('└─────────────────────────────────────────────────────────────┘');
824
+ console.log('');
825
+ }
826
+ return;
827
+ }
828
+ try {
829
+ const parsed = JSON.parse(data);
830
+ const delta = parsed.choices?.[0]?.delta;
831
+ if (delta?.content) {
832
+ chunkCount++;
833
+ outputBuffer += delta.content;
834
+ yield delta.content;
835
+ }
836
+ else if (delta?.reasoning_content) {
837
+ chunkCount++;
838
+ outputBuffer += delta.reasoning_content;
839
+ yield delta.reasoning_content;
840
+ }
841
+ }
842
+ catch (e) {
843
+ // Silently ignore parsing errors
844
+ }
845
+ }
846
+ }
847
+ }
848
+ if (buffer.trim()) {
849
+ const trimmedLine = buffer.trim();
850
+ if (trimmedLine.startsWith('data: ')) {
851
+ const data = trimmedLine.slice(6);
852
+ if (data !== '[DONE]') {
853
+ try {
854
+ const parsed = JSON.parse(data);
855
+ const delta = parsed.choices?.[0]?.delta;
856
+ if (delta?.content) {
857
+ yield delta.content;
858
+ }
859
+ else if (delta?.reasoning_content) {
860
+ yield delta.reasoning_content;
861
+ }
862
+ }
863
+ catch (e) {
864
+ // Ignore final parsing errors
865
+ }
866
+ }
867
+ }
868
+ }
869
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
870
+ console.log('║ STREAM COMPLETED ║');
871
+ console.log('╚══════════════════════════════════════════════════════════╝\n');
872
+ }
873
+ catch (error) {
874
+ if (error.response) {
875
+ throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
876
+ }
877
+ else if (error.request) {
878
+ throw new Error('Network error: No response received from server');
879
+ }
880
+ else {
881
+ throw new Error(`Request error: ${error.message}`);
882
+ }
883
+ }
884
+ }
885
+ // Anthropic 原生流式响应(/v1/messages 端点)
886
+ async *anthropicNativeStreamChatCompletion(messages, options = {}) {
887
+ const { system, messages: anthropicMessages } = this.convertToAnthropicFormat(messages);
888
+ const requestBody = {
889
+ model: options.model || this.authConfig.modelName || 'claude-sonnet-4-20250514',
890
+ messages: anthropicMessages,
891
+ temperature: options.temperature ?? 1.0,
892
+ stream: true,
893
+ max_tokens: options.maxTokens || 4096
894
+ };
895
+ if (system) {
896
+ requestBody.system = system;
897
+ }
898
+ // Anthropic 原生工具格式
899
+ if (options.tools && options.tools.length > 0) {
900
+ requestBody.tools = options.tools.map(tool => ({
901
+ name: tool.function.name,
902
+ description: tool.function.description,
903
+ input_schema: tool.function.parameters || { type: 'object', properties: {} }
904
+ }));
905
+ const toolChoice = options.toolChoice;
906
+ if (toolChoice === 'none') {
907
+ requestBody.tool_choice = { type: 'auto' };
908
+ }
909
+ else if (toolChoice && typeof toolChoice === 'object') {
910
+ if (toolChoice.type === 'function' && toolChoice.function) {
911
+ requestBody.tool_choice = { type: 'tool', tool: { name: toolChoice.function.name } };
912
+ }
913
+ else {
914
+ requestBody.tool_choice = { type: 'auto' };
915
+ }
916
+ }
917
+ else {
918
+ requestBody.tool_choice = { type: 'auto' };
919
+ }
920
+ }
921
+ if (options.thinkingTokens && options.thinkingTokens > 0) {
922
+ requestBody.thinking = { type: 'enabled', budget_tokens: options.thinkingTokens };
923
+ }
924
+ // 调试输出(受showAIDebugInfo配置控制)
925
+ const showDebug = this.authConfig.showAIDebugInfo ?? false;
926
+ if (showDebug) {
927
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
928
+ console.log('║ AI REQUEST DEBUG (ANTHROPIC STREAM) ║');
929
+ console.log('╚══════════════════════════════════════════════════════════╝');
930
+ console.log(`📦 Model: ${requestBody.model}`);
931
+ console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
932
+ console.log(`💬 Total Messages: ${anthropicMessages.length} 条`);
933
+ if (requestBody.temperature)
934
+ console.log(`🌡️ Temperature: ${requestBody.temperature}`);
935
+ if (requestBody.max_tokens)
936
+ console.log(`📏 Max Tokens: ${requestBody.max_tokens}`);
937
+ if (requestBody.thinking)
938
+ console.log(`🧠 Thinking Budget: ${requestBody.thinking.budget_tokens}`);
939
+ console.log('─'.repeat(60));
940
+ // 显示system消息
941
+ if (system) {
942
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
943
+ console.log('│ 🟫 SYSTEM │');
944
+ console.log('├─────────────────────────────────────────────────────────────┤');
945
+ console.log(renderMarkdown(system).split('\n').map(l => '│ ' + l).join('\n'));
946
+ console.log('└─────────────────────────────────────────────────────────────┘');
947
+ }
948
+ displayMessages(anthropicMessages);
949
+ console.log('\n📤 Starting Anthropic stream...\n');
950
+ }
951
+ try {
952
+ // Anthropic 原生流式端点 /v1/messages
953
+ const response = await this.client.post('/v1/messages', requestBody, {
954
+ responseType: 'stream'
955
+ });
956
+ console.log('📥 Receiving Anthropic stream chunks...\n');
957
+ let buffer = '';
958
+ let outputBuffer = '';
959
+ for await (const chunk of response.data) {
960
+ buffer += chunk.toString();
961
+ const lines = buffer.split('\n');
962
+ buffer = lines.pop() || '';
963
+ for (const line of lines) {
964
+ const trimmedLine = line.trim();
965
+ if (!trimmedLine)
966
+ continue;
967
+ // Anthropic 流式格式: data: {"type":"content_block_delta",...}
968
+ if (trimmedLine.startsWith('data: ')) {
969
+ const data = trimmedLine.slice(6);
970
+ try {
971
+ const parsed = JSON.parse(data);
972
+ // Anthropic 事件类型
973
+ if (parsed.type === 'content_block_delta') {
974
+ if (parsed.delta?.type === 'text_delta' && parsed.delta.text) {
975
+ outputBuffer += parsed.delta.text;
976
+ yield parsed.delta.text;
977
+ }
978
+ else if (parsed.delta?.type === 'thinking_delta' && parsed.delta.thinking) {
979
+ outputBuffer += parsed.delta.thinking;
980
+ yield parsed.delta.thinking;
981
+ }
982
+ }
983
+ else if (parsed.type === 'message_delta') {
984
+ if (parsed.delta?.stop_reason) {
985
+ // 消息结束
986
+ if (showDebug) {
987
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
988
+ console.log('║ STREAM COMPLETED ║');
989
+ console.log('╚══════════════════════════════════════════════════════════╝');
990
+ console.log(`📏 Total output: ${outputBuffer.length} chars`);
991
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
992
+ console.log('│ 🤖 ASSISTANT OUTPUT │');
993
+ console.log('├─────────────────────────────────────────────────────────────┤');
994
+ console.log('│ 💬 CONTENT:');
995
+ console.log('│ ───────────────────────────────────────────────────────────');
996
+ const lines = renderMarkdown(outputBuffer).split('\n');
997
+ for (const line of lines.slice(0, 30)) {
998
+ console.log('│ ' + line.slice(0, 62));
999
+ }
1000
+ if (lines.length > 30) {
1001
+ console.log(`│ ... (${lines.length - 30} more lines)`);
1002
+ }
1003
+ console.log('└─────────────────────────────────────────────────────────────┘');
1004
+ console.log('');
1005
+ }
1006
+ return;
1007
+ }
1008
+ }
1009
+ }
1010
+ catch (e) {
1011
+ // 忽略解析错误
1012
+ }
1013
+ }
1014
+ }
1015
+ }
1016
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
1017
+ console.log('║ STREAM COMPLETED ║');
1018
+ console.log('╚══════════════════════════════════════════════════════════╝\n');
1019
+ }
1020
+ catch (error) {
1021
+ if (error.response) {
1022
+ throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
1023
+ }
1024
+ else if (error.request) {
1025
+ throw new Error('Network error: No response received from server');
1026
+ }
1027
+ else {
1028
+ throw new Error(`Request error: ${error.message}`);
1029
+ }
1030
+ }
1031
+ }
1032
+ // MiniMax 流式响应(根据 baseUrl 自动选择格式)
1033
+ async *minimaxStreamChatCompletion(messages, options = {}) {
1034
+ const { system, messages: anthropicMessages } = this.convertToAnthropicFormat(messages);
1035
+ const { endpoint, format } = getMiniMaxEndpoint(this.authConfig.baseUrl || '');
1036
+ const requestBody = {
1037
+ model: options.model || this.authConfig.modelName || 'MiniMax-M2',
1038
+ messages: format === 'anthropic' ? anthropicMessages : messages,
1039
+ temperature: options.temperature ?? 1.0,
1040
+ stream: true,
1041
+ max_tokens: options.maxTokens || 4096
1042
+ };
1043
+ if (system && format === 'anthropic') {
1044
+ requestBody.system = system;
1045
+ }
1046
+ if (format === 'anthropic') {
1047
+ // Anthropic 格式的工具
1048
+ if (options.tools && options.tools.length > 0) {
1049
+ requestBody.tools = options.tools.map(tool => ({
1050
+ name: tool.function.name,
1051
+ description: tool.function.description,
1052
+ input_schema: tool.function.parameters || { type: 'object', properties: {} }
1053
+ }));
1054
+ const toolChoice = options.toolChoice;
1055
+ if (toolChoice === 'none') {
1056
+ requestBody.tool_choice = { type: 'auto' };
1057
+ }
1058
+ else if (toolChoice && typeof toolChoice === 'object') {
1059
+ if (toolChoice.type === 'function' && toolChoice.function) {
1060
+ requestBody.tool_choice = { type: 'tool', tool: { name: toolChoice.function.name } };
1061
+ }
1062
+ else {
1063
+ requestBody.tool_choice = { type: 'auto' };
1064
+ }
1065
+ }
1066
+ else {
1067
+ requestBody.tool_choice = { type: 'auto' };
1068
+ }
1069
+ }
1070
+ }
1071
+ else {
1072
+ // OpenAI 格式的工具
1073
+ if (options.tools && options.tools.length > 0) {
1074
+ requestBody.tools = options.tools;
1075
+ requestBody.tool_choice = options.toolChoice || 'auto';
1076
+ }
1077
+ }
1078
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
1079
+ console.log('║ AI REQUEST DEBUG (MINIMAX STREAM) ║');
1080
+ console.log('╚══════════════════════════════════════════════════════════╝');
1081
+ console.log(`📦 Model: ${requestBody.model}`);
1082
+ console.log(`🔗 Format: ${format.toUpperCase()} | Endpoint: ${endpoint}`);
1083
+ console.log(`🌐 Base URL: ${this.authConfig.baseUrl}`);
1084
+ console.log(`💬 Total Messages: ${requestBody.messages.length} 条`);
1085
+ if (requestBody.temperature)
1086
+ console.log(`🌡️ Temperature: ${requestBody.temperature}`);
1087
+ if (requestBody.max_tokens)
1088
+ console.log(`📏 Max Tokens: ${requestBody.max_tokens}`);
1089
+ console.log('─'.repeat(60));
1090
+ // 显示system消息
1091
+ if (system && format === 'anthropic') {
1092
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
1093
+ console.log('│ 🟫 SYSTEM │');
1094
+ console.log('├─────────────────────────────────────────────────────────────┤');
1095
+ console.log(renderMarkdown(system).split('\n').map(l => '│ ' + l).join('\n'));
1096
+ console.log('└─────────────────────────────────────────────────────────────┘');
1097
+ }
1098
+ displayMessages(requestBody.messages);
1099
+ console.log('\n📤 Starting MiniMax stream...\n');
1100
+ try {
1101
+ // MiniMax uses correct endpoint
1102
+ const response = await this.client.post(endpoint, requestBody, {
1103
+ responseType: 'stream'
1104
+ });
1105
+ console.log('📥 Receiving MiniMax stream chunks...\n');
1106
+ let buffer = '';
1107
+ let outputBuffer = '';
1108
+ for await (const chunk of response.data) {
1109
+ buffer += chunk.toString();
1110
+ const lines = buffer.split('\n');
1111
+ buffer = lines.pop() || '';
1112
+ for (const line of lines) {
1113
+ const trimmedLine = line.trim();
1114
+ if (!trimmedLine)
1115
+ continue;
1116
+ // 根据格式解析不同的流式响应
1117
+ if (format === 'anthropic') {
1118
+ // Anthropic SSE 格式: data: {"type":"content_block_delta",...}
1119
+ if (trimmedLine.startsWith('data: ')) {
1120
+ const data = trimmedLine.slice(6);
1121
+ try {
1122
+ const parsed = JSON.parse(data);
1123
+ if (parsed.type === 'content_block_delta') {
1124
+ if (parsed.delta?.type === 'text_delta' && parsed.delta.text) {
1125
+ yield parsed.delta.text;
1126
+ }
1127
+ else if (parsed.delta?.type === 'thinking_delta' && parsed.delta.thinking) {
1128
+ yield parsed.delta.thinking;
1129
+ }
1130
+ }
1131
+ else if (parsed.type === 'message_delta') {
1132
+ if (parsed.delta?.stop_reason) {
1133
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
1134
+ console.log('║ STREAM COMPLETED ║');
1135
+ console.log('╚══════════════════════════════════════════════════════════╝');
1136
+ console.log(`📏 Total output: ${outputBuffer.length} chars`);
1137
+ console.log('\n┌─────────────────────────────────────────────────────────────┐');
1138
+ console.log('│ 🤖 ASSISTANT OUTPUT │');
1139
+ console.log('├─────────────────────────────────────────────────────────────┤');
1140
+ console.log('│ 💬 CONTENT:');
1141
+ console.log('│ ───────────────────────────────────────────────────────────');
1142
+ const lines = renderMarkdown(outputBuffer).split('\n');
1143
+ for (const line of lines.slice(0, 30)) {
1144
+ console.log('│ ' + line.slice(0, 62));
1145
+ }
1146
+ if (lines.length > 30) {
1147
+ console.log(`│ ... (${lines.length - 30} more lines)`);
1148
+ }
1149
+ console.log('└─────────────────────────────────────────────────────────────┘');
1150
+ console.log('');
1151
+ return;
1152
+ }
1153
+ }
1154
+ }
1155
+ catch (e) {
1156
+ // 忽略解析错误
1157
+ }
1158
+ }
1159
+ }
1160
+ else {
1161
+ // OpenAI SSE 格式: data: {...}
1162
+ if (trimmedLine.startsWith('data: ')) {
1163
+ const data = trimmedLine.slice(6);
1164
+ if (data === '[DONE]')
1165
+ continue;
1166
+ try {
1167
+ const parsed = JSON.parse(data);
1168
+ const delta = parsed.choices?.[0]?.delta;
1169
+ if (delta?.content) {
1170
+ outputBuffer += delta.content;
1171
+ yield delta.content;
1172
+ }
1173
+ else if (delta?.reasoning_content) {
1174
+ outputBuffer += delta.reasoning_content;
1175
+ yield delta.reasoning_content;
1176
+ }
1177
+ }
1178
+ catch (e) {
1179
+ // 忽略解析错误
1180
+ }
1181
+ }
1182
+ }
1183
+ }
1184
+ }
1185
+ console.log('\n╔══════════════════════════════════════════════════════════╗');
1186
+ console.log('║ STREAM COMPLETED ║');
1187
+ console.log('╚══════════════════════════════════════════════════════════╝\n');
1188
+ }
1189
+ catch (error) {
1190
+ if (error.response) {
1191
+ throw new Error(`API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);
1192
+ }
1193
+ else if (error.request) {
1194
+ throw new Error('Network error: No response received from server');
1195
+ }
1196
+ else {
1197
+ throw new Error(`Request error: ${error.message}`);
1198
+ }
1199
+ }
1200
+ }
1201
+ async listModels() {
1202
+ try {
1203
+ const response = await this.client.get('/models');
1204
+ return response.data.data || [];
1205
+ }
1206
+ catch (error) {
1207
+ console.error('Failed to list models:', error);
1208
+ return [];
1209
+ }
1210
+ }
1211
+ updateAuthConfig(authConfig) {
1212
+ this.authConfig = authConfig;
1213
+ this.client.defaults.baseURL = authConfig.baseUrl;
1214
+ const isMiniMax = detectMiniMaxAPI(authConfig.baseUrl || '');
1215
+ const isAnthropic = !isMiniMax && isAnthropicCompatible(authConfig.baseUrl || '');
1216
+ if (isMiniMax || isAnthropic) {
1217
+ // MiniMax/Anthropic: Use x-api-key auth header
1218
+ this.client.defaults.headers['x-api-key'] = authConfig.apiKey || '';
1219
+ this.client.defaults.headers['anthropic-version'] = '2023-06-01';
1220
+ // Clear Bearer header
1221
+ delete this.client.defaults.headers['Authorization'];
1222
+ }
1223
+ else {
1224
+ // OpenAI compatible: Use Bearer token
1225
+ this.client.defaults.headers['Authorization'] = `Bearer ${authConfig.apiKey}`;
1226
+ // Clear x-api-key header
1227
+ delete this.client.defaults.headers['x-api-key'];
1228
+ delete this.client.defaults.headers['anthropic-version'];
1229
+ }
1230
+ }
1231
+ getAuthConfig() {
1232
+ return { ...this.authConfig };
1233
+ }
1234
+ // Check if messages contain tool calls
1235
+ hasToolCalls(messages) {
1236
+ return messages.some(msg => {
1237
+ if (msg.tool_calls && msg.tool_calls.length > 0)
1238
+ return true;
1239
+ if (Array.isArray(msg.content)) {
1240
+ return msg.content.some(block => block.type === 'tool_use' ||
1241
+ block.type === 'tool_result');
1242
+ }
1243
+ return false;
1244
+ });
1245
+ }
1246
+ }
1247
+ export function detectThinkingKeywords(text) {
1248
+ const ultraKeywords = ['super think', 'extreme think', 'deep think', 'full think', 'ultra think', 'careful think',
1249
+ 'ultrathink', 'think really super hard', 'think intensely'];
1250
+ const megaKeywords = ['strong think', 'powerful think', 'think hard', 'try hard to think', 'think well', 'think carefully',
1251
+ 'megathink', 'think really hard', 'think a lot'];
1252
+ const hardKeywords = ['think again', 'think more', 'think clearly', 'think thoroughly', 'consider carefully',
1253
+ 'think about it', 'think more', 'think harder'];
1254
+ const normalKeywords = ['think', 'think', 'consider', 'think'];
1255
+ const lowerText = text.toLowerCase();
1256
+ if (ultraKeywords.some(keyword => lowerText.includes(keyword.toLowerCase()))) {
1257
+ return 'ultra';
1258
+ }
1259
+ else if (megaKeywords.some(keyword => lowerText.includes(keyword.toLowerCase()))) {
1260
+ return 'mega';
1261
+ }
1262
+ else if (hardKeywords.some(keyword => lowerText.includes(keyword.toLowerCase()))) {
1263
+ return 'hard';
1264
+ }
1265
+ else if (normalKeywords.some(keyword => lowerText.includes(keyword.toLowerCase()))) {
1266
+ return 'normal';
1267
+ }
1268
+ return 'none';
1269
+ }
1270
+ export function getThinkingTokens(mode) {
1271
+ const tokensMap = {
1272
+ none: 0,
1273
+ normal: 2000,
1274
+ hard: 4000,
1275
+ mega: 10000,
1276
+ ultra: 32000
1277
+ };
1278
+ return tokensMap[mode];
1279
+ }
1280
+ //# sourceMappingURL=ai-client.js.map