@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,290 @@
1
+ import { ChatMessage, CompressionConfig } from './types.js';
2
+ import { AIClient, Message } from './ai-client.js';
3
+ import { AuthConfig } from './types.js';
4
+
5
+ export interface CompressionResult {
6
+ compressedMessages: ChatMessage[];
7
+ wasCompressed: boolean;
8
+ originalMessageCount: number;
9
+ compressedMessageCount: number;
10
+ originalSize: number;
11
+ compressedSize: number;
12
+ compressionMethod: 'summary' | 'truncate' | 'none';
13
+ }
14
+
15
+ export class ContextCompressor {
16
+ private aiClient: AIClient | null = null;
17
+ private defaultConfig: CompressionConfig = {
18
+ enabled: true,
19
+ maxMessages: 50,
20
+ maxContextSize: 150000,
21
+ preserveRecentMessages: 0,
22
+ enableSummary: true
23
+ };
24
+
25
+ constructor(authConfig?: AuthConfig) {
26
+ if (authConfig) {
27
+ this.aiClient = new AIClient(authConfig);
28
+ }
29
+ }
30
+
31
+ setAIClient(aiClient: AIClient): void {
32
+ this.aiClient = aiClient;
33
+ }
34
+
35
+ /**
36
+ * 检查是否需要进行压缩
37
+ */
38
+ needsCompression(
39
+ messages: ChatMessage[],
40
+ config?: Partial<CompressionConfig>
41
+ ): { needsCompression: boolean; reason: string } {
42
+ const cfg = { ...this.defaultConfig, ...config };
43
+ const userMessageCount = messages.filter(m => m.role === 'user').length;
44
+ const contextSize = this.calculateContextSize(messages);
45
+
46
+ if (userMessageCount > cfg.maxMessages) {
47
+ return {
48
+ needsCompression: true,
49
+ reason: `User message count (${userMessageCount}) exceeds maximum (${cfg.maxMessages})`
50
+ };
51
+ }
52
+
53
+ if (contextSize > cfg.maxContextSize) {
54
+ return {
55
+ needsCompression: true,
56
+ reason: `Context size (${contextSize} chars) exceeds maximum (${cfg.maxContextSize} chars)`
57
+ };
58
+ }
59
+
60
+ return { needsCompression: false, reason: '' };
61
+ }
62
+
63
+ /**
64
+ * 计算上下文大小(字符数)
65
+ */
66
+ calculateContextSize(messages: ChatMessage[]): number {
67
+ return messages.reduce((total, msg) => {
68
+ return total + msg.content.length + (msg.role.length + 10);
69
+ }, 0);
70
+ }
71
+
72
+ /**
73
+ * 压缩对话历史
74
+ */
75
+ async compressContext(
76
+ messages: ChatMessage[],
77
+ systemPrompt: string,
78
+ config?: Partial<CompressionConfig>
79
+ ): Promise<CompressionResult> {
80
+ const cfg = { ...this.defaultConfig, ...config };
81
+ const originalMessageCount = messages.length;
82
+ const originalSize = this.calculateContextSize(messages);
83
+
84
+ // 分离系统消息、用户消息和助手消息
85
+ const systemMessages = messages.filter(m => m.role === 'system');
86
+ const nonSystemMessages = messages.filter(m => m.role !== 'system');
87
+
88
+ // 如果消息数量和大小都在限制内,不需要压缩
89
+ const { needsCompression } = this.needsCompression(nonSystemMessages, config);
90
+ if (!needsCompression) {
91
+ return {
92
+ compressedMessages: messages,
93
+ wasCompressed: false,
94
+ originalMessageCount,
95
+ compressedMessageCount: messages.length,
96
+ originalSize,
97
+ compressedSize: originalSize,
98
+ compressionMethod: 'none'
99
+ };
100
+ }
101
+
102
+ // 使用 AI 生成摘要压缩全部历史对话
103
+ const compressedMessages = await this.summarizeAllMessages(
104
+ nonSystemMessages,
105
+ systemPrompt,
106
+ cfg
107
+ );
108
+
109
+ // 注意:不再保留原始的 systemMessages,因为 generateResponse 会自动添加系统提示
110
+ // 压缩后的消息只包含摘要(role: assistant),避免重复的 system 消息导致 API 报错
111
+ const finalMessages = [...compressedMessages];
112
+
113
+ return {
114
+ compressedMessages: finalMessages,
115
+ wasCompressed: true,
116
+ originalMessageCount,
117
+ compressedMessageCount: finalMessages.length,
118
+ originalSize,
119
+ compressedSize: this.calculateContextSize(finalMessages),
120
+ compressionMethod: 'summary'
121
+ };
122
+ }
123
+
124
+ /**
125
+ * 使用 AI 生成摘要来压缩全部对话历史
126
+ */
127
+ private async summarizeAllMessages(
128
+ messages: ChatMessage[],
129
+ systemPrompt: string,
130
+ config: CompressionConfig
131
+ ): Promise<ChatMessage[]> {
132
+ // 生成完整对话的摘要
133
+ const summary = await this.generateSummary(messages, systemPrompt);
134
+
135
+ // 构建压缩后的对话:只有摘要作为 system 消息
136
+ const compressed: ChatMessage[] = [];
137
+
138
+ // 添加摘要作为 assistant 消息,避免与系统提示重复导致 API 报错
139
+ compressed.push({
140
+ role: 'assistant',
141
+ content: `[Conversation Summary - ${messages.length} messages compressed]\n\n${summary}`,
142
+ timestamp: Date.now()
143
+ });
144
+
145
+ return compressed;
146
+ }
147
+
148
+ /**
149
+ * Generate conversation summary
150
+ */
151
+ private async generateSummary(
152
+ messages: ChatMessage[],
153
+ systemPrompt: string
154
+ ): Promise<string> {
155
+ if (!this.aiClient) {
156
+ throw new Error('AI client not initialized for summarization');
157
+ }
158
+
159
+ // Extract all conversation content
160
+ const conversationText = messages
161
+ .map((m, idx) => {
162
+ const role = m.role === 'user' ? 'User' :
163
+ m.role === 'assistant' ? 'Assistant' :
164
+ m.role === 'tool' ? 'Tool' : m.role;
165
+ return `[${idx + 1}] ${role}:\n${m.content}`;
166
+ })
167
+ .join('\n\n' + '='.repeat(50) + '\n\n');
168
+
169
+ const summaryPrompt = `You are an expert at summarizing conversations. Please create a comprehensive summary of the following conversation.
170
+
171
+ ## Instructions
172
+ 1. Analyze ALL messages in the conversation
173
+ 2. Create a detailed summary that captures:
174
+ - Complete context and background
175
+ - All topics discussed
176
+ - All decisions made
177
+ - All files created, modified, or analyzed
178
+ - All code changes and implementations
179
+ - All problems solved
180
+ - Current state and progress
181
+ - Any pending or ongoing tasks
182
+ 3. Be extremely thorough - this summary will replace the entire conversation history
183
+ 4. Include specific details like file paths, code snippets, command outputs, etc.
184
+
185
+ ## Conversation to summarize
186
+ ${conversationText}
187
+
188
+ ## Output Format
189
+ Provide a detailed, comprehensive summary in the following format:
190
+
191
+ ### Conversation Summary
192
+
193
+ #### Overview
194
+ [Brief description of what this conversation was about]
195
+
196
+ #### Background & Context
197
+ [Complete background information]
198
+
199
+ #### Topics Discussed
200
+ - [Topic 1: detailed description]
201
+ - [Topic 2: detailed description]
202
+ - [All topics with full details]
203
+
204
+ #### Key Decisions
205
+ - [Decision 1: details and rationale]
206
+ - [All decisions made during the conversation]
207
+
208
+ #### File Operations
209
+ - Created: [file paths]
210
+ - Modified: [file paths]
211
+ - Analyzed: [file paths]
212
+ - Deleted: [file paths]
213
+
214
+ #### Code Changes
215
+ - [Specific code changes with details]
216
+ - [All implementations]
217
+
218
+ #### Problems & Solutions
219
+ - Problem: [description]
220
+ Solution: [how it was solved]
221
+ - [All problems and solutions]
222
+
223
+ #### Current State
224
+ [What is the current status of the project/work]
225
+
226
+ #### Pending Tasks
227
+ - [Any ongoing or pending work]
228
+
229
+ #### Important Details
230
+ [Any other crucial information]
231
+
232
+ Please provide the comprehensive summary possible. Do not omit any important information.`;
233
+
234
+ try {
235
+ const summaryMessage: Message = {
236
+ role: 'user',
237
+ content: summaryPrompt
238
+ };
239
+
240
+ const response = await this.aiClient.chatCompletion([summaryMessage], {
241
+ maxTokens: 8192,
242
+ temperature: 0.3
243
+ });
244
+
245
+ const summary = response.choices[0]?.message?.content || '';
246
+ return typeof summary === 'string' ? summary : JSON.stringify(summary);
247
+ } catch (error) {
248
+ console.error('Failed to generate summary:', error);
249
+ const userCount = messages.filter(m => m.role === 'user').length;
250
+ const toolCount = messages.filter(m => m.role === 'tool').length;
251
+ return `[Summary of ${messages.length} messages: ${userCount} user exchanges, ${toolCount} tool calls. Key topics discussed but details unavailable due to summarization error.]`;
252
+ }
253
+ }
254
+
255
+ /**
256
+ * 创建压缩后的消息副本(用于保存)
257
+ */
258
+ createCompressedSnapshot(
259
+ messages: ChatMessage[],
260
+ compressionResult: CompressionResult
261
+ ): object {
262
+ return {
263
+ timestamp: Date.now(),
264
+ originalMessageCount: compressionResult.originalMessageCount,
265
+ compressedMessageCount: compressionResult.compressedMessageCount,
266
+ originalSize: compressionResult.originalSize,
267
+ compressedSize: compressionResult.compressedSize,
268
+ compressionMethod: compressionResult.compressionMethod,
269
+ messages: compressionResult.compressedMessages
270
+ };
271
+ }
272
+
273
+ /**
274
+ * Estimate token count (rough estimate)
275
+ */
276
+ estimateTokens(text: string): number {
277
+ const chineseChars = (text.match(/[\u4e00-\u9fa5]/g) || []).length;
278
+ const otherChars = text.length - chineseChars;
279
+ return Math.ceil(chineseChars / 2 + otherChars / 4);
280
+ }
281
+ }
282
+
283
+ let compressorInstance: ContextCompressor | null = null;
284
+
285
+ export function getContextCompressor(authConfig?: AuthConfig): ContextCompressor {
286
+ if (!compressorInstance) {
287
+ compressorInstance = new ContextCompressor(authConfig);
288
+ }
289
+ return compressorInstance;
290
+ }
@@ -0,0 +1,288 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ import { ChatMessage, Conversation } from './types.js';
5
+
6
+ export class ConversationManager {
7
+ private conversationsDir: string;
8
+ private conversations: Map<string, Conversation> = new Map();
9
+ private currentConversationId: string | null = null;
10
+
11
+ constructor() {
12
+ this.conversationsDir = path.join(os.homedir(), '.xagent', 'conversations');
13
+ }
14
+
15
+ async initialize(): Promise<void> {
16
+ try {
17
+ await fs.mkdir(this.conversationsDir, { recursive: true });
18
+ await this.loadConversations();
19
+ } catch (error) {
20
+ console.error('Failed to initialize conversation manager:', error);
21
+ }
22
+ }
23
+
24
+ private async loadConversations(): Promise<void> {
25
+ try {
26
+ const files = await fs.readdir(this.conversationsDir);
27
+
28
+ for (const file of files) {
29
+ if (file.endsWith('.json')) {
30
+ const filePath = path.join(this.conversationsDir, file);
31
+ const content = await fs.readFile(filePath, 'utf-8');
32
+ const conversation: Conversation = JSON.parse(content);
33
+ this.conversations.set(conversation.id, conversation);
34
+ }
35
+ }
36
+ } catch (error) {
37
+ console.error('Failed to load conversations:', error);
38
+ }
39
+ }
40
+
41
+ async createConversation(title?: string): Promise<Conversation> {
42
+ const conversationId = `conv_${Date.now()}`;
43
+ const now = Date.now();
44
+
45
+ const conversation: Conversation = {
46
+ id: conversationId,
47
+ messages: [],
48
+ createdAt: now,
49
+ updatedAt: now
50
+ };
51
+
52
+ this.conversations.set(conversationId, conversation);
53
+ await this.saveConversation(conversation);
54
+
55
+ this.currentConversationId = conversationId;
56
+
57
+ return conversation;
58
+ }
59
+
60
+ async saveConversation(conversation: Conversation): Promise<void> {
61
+ const filePath = path.join(this.conversationsDir, `${conversation.id}.json`);
62
+ await fs.writeFile(filePath, JSON.stringify(conversation, null, 2), 'utf-8');
63
+ }
64
+
65
+ async addMessage(message: ChatMessage, conversationId?: string): Promise<void> {
66
+ const convId = conversationId || this.currentConversationId;
67
+
68
+ if (!convId) {
69
+ await this.createConversation();
70
+ return this.addMessage(message, this.currentConversationId || undefined);
71
+ }
72
+
73
+ const conversation = this.conversations.get(convId);
74
+
75
+ if (!conversation) {
76
+ throw new Error(`Conversation not found: ${convId}`);
77
+ }
78
+
79
+ conversation.messages.push(message);
80
+ conversation.updatedAt = Date.now();
81
+
82
+ await this.saveConversation(conversation);
83
+ }
84
+
85
+ async updateLastMessage(content: string, conversationId?: string): Promise<void> {
86
+ const convId = conversationId || this.currentConversationId;
87
+
88
+ if (!convId) {
89
+ throw new Error('No active conversation');
90
+ }
91
+
92
+ const conversation = this.conversations.get(convId);
93
+
94
+ if (!conversation || conversation.messages.length === 0) {
95
+ throw new Error('Conversation has no messages');
96
+ }
97
+
98
+ const lastMessage = conversation.messages[conversation.messages.length - 1];
99
+ lastMessage.content = content;
100
+
101
+ conversation.updatedAt = Date.now();
102
+
103
+ await this.saveConversation(conversation);
104
+ }
105
+
106
+ getConversation(conversationId: string): Conversation | undefined {
107
+ return this.conversations.get(conversationId);
108
+ }
109
+
110
+ getCurrentConversation(): Conversation | undefined {
111
+ if (!this.currentConversationId) {
112
+ return undefined;
113
+ }
114
+ return this.conversations.get(this.currentConversationId);
115
+ }
116
+
117
+ async setCurrentConversation(conversationId: string): Promise<void> {
118
+ const conversation = this.conversations.get(conversationId);
119
+
120
+ if (!conversation) {
121
+ throw new Error(`Conversation not found: ${conversationId}`);
122
+ }
123
+
124
+ this.currentConversationId = conversationId;
125
+ console.log(`✅ Switched to conversation: ${conversationId}`);
126
+ }
127
+
128
+ listConversations(): Conversation[] {
129
+ return Array.from(this.conversations.values())
130
+ .sort((a, b) => b.updatedAt - a.updatedAt);
131
+ }
132
+
133
+ async deleteConversation(conversationId: string): Promise<void> {
134
+ const conversation = this.conversations.get(conversationId);
135
+
136
+ if (!conversation) {
137
+ throw new Error(`Conversation not found: ${conversationId}`);
138
+ }
139
+
140
+ const filePath = path.join(this.conversationsDir, `${conversationId}.json`);
141
+ await fs.unlink(filePath);
142
+
143
+ this.conversations.delete(conversationId);
144
+
145
+ if (this.currentConversationId === conversationId) {
146
+ this.currentConversationId = null;
147
+ }
148
+
149
+ console.log(`✅ Deleted conversation: ${conversationId}`);
150
+ }
151
+
152
+ async clearCurrentConversation(): Promise<void> {
153
+ if (!this.currentConversationId) {
154
+ await this.createConversation();
155
+ return;
156
+ }
157
+
158
+ const conversation = this.conversations.get(this.currentConversationId);
159
+
160
+ if (!conversation) {
161
+ throw new Error(`Conversation not found: ${this.currentConversationId}`);
162
+ }
163
+
164
+ conversation.messages = [];
165
+ conversation.updatedAt = Date.now();
166
+
167
+ await this.saveConversation(conversation);
168
+ }
169
+
170
+ async exportConversation(conversationId: string, outputPath: string): Promise<void> {
171
+ const conversation = this.conversations.get(conversationId);
172
+
173
+ if (!conversation) {
174
+ throw new Error(`Conversation not found: ${conversationId}`);
175
+ }
176
+
177
+ const markdown = this.conversationToMarkdown(conversation);
178
+ await fs.writeFile(outputPath, markdown, 'utf-8');
179
+
180
+ console.log(`✅ Exported conversation to: ${outputPath}`);
181
+ }
182
+
183
+ private conversationToMarkdown(conversation: Conversation): string {
184
+ let markdown = `# Conversation Export\n\n`;
185
+ markdown += `**ID:** ${conversation.id}\n`;
186
+ markdown += `**Created:** ${new Date(conversation.createdAt).toLocaleString()}\n`;
187
+ markdown += `**Updated:** ${new Date(conversation.updatedAt).toLocaleString()}\n`;
188
+ markdown += `**Messages:** ${conversation.messages.length}\n\n`;
189
+ markdown += `---\n\n`;
190
+
191
+ for (const message of conversation.messages) {
192
+ const role = message.role === 'user' ? '👤 User' :
193
+ message.role === 'assistant' ? '🤖 Assistant' :
194
+ message.role === 'system' ? '⚙️ System' : '🔧 Tool';
195
+
196
+ markdown += `### ${role}\n\n`;
197
+ markdown += `**Time:** ${new Date(message.timestamp).toLocaleString()}\n\n`;
198
+
199
+ if (message.images && message.images.length > 0) {
200
+ markdown += `**Images:** ${message.images.length}\n\n`;
201
+ }
202
+
203
+ markdown += `${message.content}\n\n`;
204
+ markdown += `---\n\n`;
205
+ }
206
+
207
+ return markdown;
208
+ }
209
+
210
+ async importConversation(filePath: string): Promise<Conversation> {
211
+ const content = await fs.readFile(filePath, 'utf-8');
212
+ const data = JSON.parse(content);
213
+
214
+ const conversation: Conversation = {
215
+ id: data.id || `imported_${Date.now()}`,
216
+ messages: data.messages || [],
217
+ createdAt: data.createdAt || Date.now(),
218
+ updatedAt: data.updatedAt || Date.now()
219
+ };
220
+
221
+ this.conversations.set(conversation.id, conversation);
222
+ await this.saveConversation(conversation);
223
+
224
+ console.log(`✅ Imported conversation: ${conversation.id}`);
225
+
226
+ return conversation;
227
+ }
228
+
229
+ async searchConversations(query: string): Promise<Conversation[]> {
230
+ const lowerQuery = query.toLowerCase();
231
+
232
+ return this.listConversations().filter(conv => {
233
+ const text = conv.messages.map(msg => msg.content).join(' ').toLowerCase();
234
+ return text.includes(lowerQuery);
235
+ });
236
+ }
237
+
238
+ getConversationStats(): { total: number; totalMessages: number; oldest: Date; newest: Date } {
239
+ const conversations = this.listConversations();
240
+ const totalMessages = conversations.reduce((sum, conv) => sum + conv.messages.length, 0);
241
+
242
+ const timestamps = conversations.map(conv => conv.createdAt);
243
+ const oldest = timestamps.length > 0 ? new Date(Math.min(...timestamps)) : new Date();
244
+ const newest = timestamps.length > 0 ? new Date(Math.max(...timestamps)) : new Date();
245
+
246
+ return {
247
+ total: conversations.length,
248
+ totalMessages,
249
+ oldest,
250
+ newest
251
+ };
252
+ }
253
+
254
+ async cleanupOldConversations(days: number = 30): Promise<number> {
255
+ const cutoffDate = Date.now() - (days * 24 * 60 * 60 * 1000);
256
+ const toDelete: string[] = [];
257
+
258
+ for (const [id, conv] of this.conversations) {
259
+ if (conv.updatedAt < cutoffDate) {
260
+ toDelete.push(id);
261
+ }
262
+ }
263
+
264
+ for (const id of toDelete) {
265
+ await this.deleteConversation(id);
266
+ }
267
+
268
+ return toDelete.length;
269
+ }
270
+
271
+ getCurrentConversationId(): string | null {
272
+ return this.currentConversationId;
273
+ }
274
+
275
+ async setCurrentConversationId(id: string): Promise<void> {
276
+ this.currentConversationId = id;
277
+ }
278
+ }
279
+
280
+ let conversationManagerInstance: ConversationManager | null = null;
281
+
282
+ export function getConversationManager(): ConversationManager {
283
+ if (!conversationManagerInstance) {
284
+ conversationManagerInstance = new ConversationManager();
285
+ conversationManagerInstance.initialize();
286
+ }
287
+ return conversationManagerInstance;
288
+ }