@ai-zen/cli 1.0.0-alpha.3 → 1.0.0-alpha.30

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 (338) hide show
  1. package/CHANGELOG.md +885 -0
  2. package/LICENSE +21 -0
  3. package/README.md +135 -30
  4. package/README.zh.md +135 -30
  5. package/dist/agent-creator.d.ts +11 -0
  6. package/dist/agent-creator.d.ts.map +1 -1
  7. package/dist/agent-creator.js +50 -20
  8. package/dist/agent-creator.js.map +1 -1
  9. package/dist/agent-switch.d.ts +61 -0
  10. package/dist/agent-switch.d.ts.map +1 -0
  11. package/dist/agent-switch.js +83 -0
  12. package/dist/agent-switch.js.map +1 -0
  13. package/dist/agents-store.d.ts +6 -1
  14. package/dist/agents-store.d.ts.map +1 -1
  15. package/dist/agents-store.js +46 -4
  16. package/dist/agents-store.js.map +1 -1
  17. package/dist/auto-migrate-confirm.d.ts +43 -0
  18. package/dist/auto-migrate-confirm.d.ts.map +1 -0
  19. package/dist/auto-migrate-confirm.js +47 -0
  20. package/dist/auto-migrate-confirm.js.map +1 -0
  21. package/dist/clipboard.d.ts +68 -0
  22. package/dist/clipboard.d.ts.map +1 -0
  23. package/dist/clipboard.js +177 -0
  24. package/dist/clipboard.js.map +1 -0
  25. package/dist/config-editor.d.ts +42 -5
  26. package/dist/config-editor.d.ts.map +1 -1
  27. package/dist/config-editor.js +80 -27
  28. package/dist/config-editor.js.map +1 -1
  29. package/dist/config.d.ts +76 -17
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +143 -39
  32. package/dist/config.js.map +1 -1
  33. package/dist/conversation-commands/registry.d.ts +127 -4
  34. package/dist/conversation-commands/registry.d.ts.map +1 -1
  35. package/dist/conversation-commands/registry.js +93 -14
  36. package/dist/conversation-commands/registry.js.map +1 -1
  37. package/dist/conversation-persist-plugin.d.ts +0 -1
  38. package/dist/conversation-persist-plugin.d.ts.map +1 -1
  39. package/dist/conversation-persist-plugin.js +7 -16
  40. package/dist/conversation-persist-plugin.js.map +1 -1
  41. package/dist/conversation-repository.d.ts +79 -18
  42. package/dist/conversation-repository.d.ts.map +1 -1
  43. package/dist/conversation-repository.js +96 -30
  44. package/dist/conversation-repository.js.map +1 -1
  45. package/dist/cwd-tracker-plugin.d.ts.map +1 -1
  46. package/dist/cwd-tracker-plugin.js +22 -7
  47. package/dist/cwd-tracker-plugin.js.map +1 -1
  48. package/dist/format-time.d.ts +17 -6
  49. package/dist/format-time.d.ts.map +1 -1
  50. package/dist/format-time.js +32 -14
  51. package/dist/format-time.js.map +1 -1
  52. package/dist/handoff-service.d.ts +19 -0
  53. package/dist/handoff-service.d.ts.map +1 -0
  54. package/dist/handoff-service.js +89 -0
  55. package/dist/handoff-service.js.map +1 -0
  56. package/dist/hook.d.ts.map +1 -1
  57. package/dist/hook.js +69 -15
  58. package/dist/hook.js.map +1 -1
  59. package/dist/i18n/en-wizard.d.ts +8 -0
  60. package/dist/i18n/en-wizard.d.ts.map +1 -0
  61. package/dist/i18n/en-wizard.js +303 -0
  62. package/dist/i18n/en-wizard.js.map +1 -0
  63. package/dist/i18n/en.d.ts +7 -0
  64. package/dist/i18n/en.d.ts.map +1 -0
  65. package/dist/i18n/en.js +247 -0
  66. package/dist/i18n/en.js.map +1 -0
  67. package/dist/i18n/index.d.ts +57 -0
  68. package/dist/i18n/index.d.ts.map +1 -0
  69. package/dist/i18n/index.js +109 -0
  70. package/dist/i18n/index.js.map +1 -0
  71. package/dist/i18n/preferences.d.ts +37 -0
  72. package/dist/i18n/preferences.d.ts.map +1 -0
  73. package/dist/i18n/preferences.js +73 -0
  74. package/dist/i18n/preferences.js.map +1 -0
  75. package/dist/i18n/zh-wizard.d.ts +11 -0
  76. package/dist/i18n/zh-wizard.d.ts.map +1 -0
  77. package/dist/i18n/zh-wizard.js +306 -0
  78. package/dist/i18n/zh-wizard.js.map +1 -0
  79. package/dist/i18n/zh.d.ts +10 -0
  80. package/dist/i18n/zh.d.ts.map +1 -0
  81. package/dist/i18n/zh.js +251 -0
  82. package/dist/i18n/zh.js.map +1 -0
  83. package/dist/index.js +72 -25
  84. package/dist/index.js.map +1 -1
  85. package/dist/mcp-command.d.ts +32 -0
  86. package/dist/mcp-command.d.ts.map +1 -0
  87. package/dist/mcp-command.js +37 -0
  88. package/dist/mcp-command.js.map +1 -0
  89. package/dist/mode.d.ts +31 -4
  90. package/dist/mode.d.ts.map +1 -1
  91. package/dist/mode.js +42 -7
  92. package/dist/mode.js.map +1 -1
  93. package/dist/model-switch.d.ts +58 -0
  94. package/dist/model-switch.d.ts.map +1 -0
  95. package/dist/model-switch.js +62 -0
  96. package/dist/model-switch.js.map +1 -0
  97. package/dist/reasoning-effort.d.ts +96 -0
  98. package/dist/reasoning-effort.d.ts.map +1 -0
  99. package/dist/reasoning-effort.js +164 -0
  100. package/dist/reasoning-effort.js.map +1 -0
  101. package/dist/reasoning-presets.d.ts +34 -0
  102. package/dist/reasoning-presets.d.ts.map +1 -0
  103. package/dist/reasoning-presets.js +85 -0
  104. package/dist/reasoning-presets.js.map +1 -0
  105. package/dist/sdk-log.d.ts +84 -0
  106. package/dist/sdk-log.d.ts.map +1 -0
  107. package/dist/sdk-log.js +167 -0
  108. package/dist/sdk-log.js.map +1 -0
  109. package/dist/session-pointer.d.ts.map +1 -1
  110. package/dist/session-pointer.js +10 -4
  111. package/dist/session-pointer.js.map +1 -1
  112. package/dist/stdio-runner.d.ts.map +1 -1
  113. package/dist/stdio-runner.js +32 -30
  114. package/dist/stdio-runner.js.map +1 -1
  115. package/dist/sub-agent-guard-plugin.d.ts +10 -7
  116. package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
  117. package/dist/sub-agent-guard-plugin.js +12 -9
  118. package/dist/sub-agent-guard-plugin.js.map +1 -1
  119. package/dist/tui/chat-history.d.ts +29 -0
  120. package/dist/tui/chat-history.d.ts.map +1 -0
  121. package/dist/tui/chat-history.js +55 -0
  122. package/dist/tui/chat-history.js.map +1 -0
  123. package/dist/tui/chat-session.d.ts +177 -57
  124. package/dist/tui/chat-session.d.ts.map +1 -1
  125. package/dist/tui/chat-session.js +362 -126
  126. package/dist/tui/chat-session.js.map +1 -1
  127. package/dist/tui/components.d.ts +113 -7
  128. package/dist/tui/components.d.ts.map +1 -1
  129. package/dist/tui/components.js +177 -12
  130. package/dist/tui/components.js.map +1 -1
  131. package/dist/tui/config-wizard/detail.d.ts +18 -10
  132. package/dist/tui/config-wizard/detail.d.ts.map +1 -1
  133. package/dist/tui/config-wizard/detail.js +53 -46
  134. package/dist/tui/config-wizard/detail.js.map +1 -1
  135. package/dist/tui/config-wizard/engine.d.ts +2 -2
  136. package/dist/tui/config-wizard/engine.d.ts.map +1 -1
  137. package/dist/tui/config-wizard/engine.js +48 -26
  138. package/dist/tui/config-wizard/engine.js.map +1 -1
  139. package/dist/tui/config-wizard/fields.d.ts +3 -1
  140. package/dist/tui/config-wizard/fields.d.ts.map +1 -1
  141. package/dist/tui/config-wizard/fields.js +202 -167
  142. package/dist/tui/config-wizard/fields.js.map +1 -1
  143. package/dist/tui/config-wizard/frame.js +1 -1
  144. package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
  145. package/dist/tui/config-wizard/kv-editor.js +13 -5
  146. package/dist/tui/config-wizard/kv-editor.js.map +1 -1
  147. package/dist/tui/config-wizard/list.d.ts +3 -1
  148. package/dist/tui/config-wizard/list.d.ts.map +1 -1
  149. package/dist/tui/config-wizard/list.js +4 -4
  150. package/dist/tui/config-wizard/list.js.map +1 -1
  151. package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
  152. package/dist/tui/config-wizard/mcp-helpers.js +4 -3
  153. package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
  154. package/dist/tui/config-wizard/menu.d.ts.map +1 -1
  155. package/dist/tui/config-wizard/menu.js +33 -21
  156. package/dist/tui/config-wizard/menu.js.map +1 -1
  157. package/dist/tui/config-wizard/prompt-editor.d.ts +8 -1
  158. package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
  159. package/dist/tui/config-wizard/prompt-editor.js +11 -7
  160. package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
  161. package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
  162. package/dist/tui/config-wizard/prompt.js +8 -7
  163. package/dist/tui/config-wizard/prompt.js.map +1 -1
  164. package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
  165. package/dist/tui/config-wizard/step-agents.js +50 -29
  166. package/dist/tui/config-wizard/step-agents.js.map +1 -1
  167. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
  168. package/dist/tui/config-wizard/step-defaults.js +77 -27
  169. package/dist/tui/config-wizard/step-defaults.js.map +1 -1
  170. package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
  171. package/dist/tui/config-wizard/step-endpoints.js +27 -14
  172. package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
  173. package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
  174. package/dist/tui/config-wizard/step-mcp.js +29 -25
  175. package/dist/tui/config-wizard/step-mcp.js.map +1 -1
  176. package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
  177. package/dist/tui/config-wizard/step-models.js +98 -43
  178. package/dist/tui/config-wizard/step-models.js.map +1 -1
  179. package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
  180. package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
  181. package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
  182. package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
  183. package/dist/tui/config-wizard/step-simple.js +18 -17
  184. package/dist/tui/config-wizard/step-simple.js.map +1 -1
  185. package/dist/tui/config-wizard/types.d.ts +31 -3
  186. package/dist/tui/config-wizard/types.d.ts.map +1 -1
  187. package/dist/tui/config-wizard/types.js.map +1 -1
  188. package/dist/tui/file-index.d.ts +38 -0
  189. package/dist/tui/file-index.d.ts.map +1 -0
  190. package/dist/tui/file-index.js +117 -0
  191. package/dist/tui/file-index.js.map +1 -0
  192. package/dist/tui/index.d.ts +18 -1
  193. package/dist/tui/index.d.ts.map +1 -1
  194. package/dist/tui/index.js +107 -49
  195. package/dist/tui/index.js.map +1 -1
  196. package/dist/tui/input-editing.d.ts +52 -0
  197. package/dist/tui/input-editing.d.ts.map +1 -0
  198. package/dist/tui/input-editing.js +91 -0
  199. package/dist/tui/input-editing.js.map +1 -0
  200. package/dist/tui/key-debug.d.ts +62 -0
  201. package/dist/tui/key-debug.d.ts.map +1 -0
  202. package/dist/tui/key-debug.js +92 -0
  203. package/dist/tui/key-debug.js.map +1 -0
  204. package/dist/tui/mention.d.ts +47 -0
  205. package/dist/tui/mention.d.ts.map +1 -0
  206. package/dist/tui/mention.js +152 -0
  207. package/dist/tui/mention.js.map +1 -0
  208. package/dist/tui/mouse.d.ts +55 -0
  209. package/dist/tui/mouse.d.ts.map +1 -0
  210. package/dist/tui/mouse.js +74 -0
  211. package/dist/tui/mouse.js.map +1 -0
  212. package/dist/tui/phase.d.ts +64 -0
  213. package/dist/tui/phase.d.ts.map +1 -0
  214. package/dist/tui/phase.js +112 -0
  215. package/dist/tui/phase.js.map +1 -0
  216. package/dist/tui/screens/agent-tabs.d.ts +53 -0
  217. package/dist/tui/screens/agent-tabs.d.ts.map +1 -0
  218. package/dist/tui/screens/agent-tabs.js +81 -0
  219. package/dist/tui/screens/agent-tabs.js.map +1 -0
  220. package/dist/tui/screens/chat-commands.d.ts +82 -3
  221. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  222. package/dist/tui/screens/chat-commands.js +688 -160
  223. package/dist/tui/screens/chat-commands.js.map +1 -1
  224. package/dist/tui/screens/chat.d.ts +57 -5
  225. package/dist/tui/screens/chat.d.ts.map +1 -1
  226. package/dist/tui/screens/chat.js +799 -304
  227. package/dist/tui/screens/chat.js.map +1 -1
  228. package/dist/tui/screens/common-keys.d.ts +36 -0
  229. package/dist/tui/screens/common-keys.d.ts.map +1 -0
  230. package/dist/tui/screens/common-keys.js +67 -0
  231. package/dist/tui/screens/common-keys.js.map +1 -0
  232. package/dist/tui/screens/frame-buffer.d.ts +47 -0
  233. package/dist/tui/screens/frame-buffer.d.ts.map +1 -0
  234. package/dist/tui/screens/frame-buffer.js +78 -0
  235. package/dist/tui/screens/frame-buffer.js.map +1 -0
  236. package/dist/tui/screens/handoff-choice.d.ts +37 -0
  237. package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
  238. package/dist/tui/screens/handoff-choice.js +42 -0
  239. package/dist/tui/screens/handoff-choice.js.map +1 -0
  240. package/dist/tui/screens/index.d.ts +11 -9
  241. package/dist/tui/screens/index.d.ts.map +1 -1
  242. package/dist/tui/screens/index.js +9 -8
  243. package/dist/tui/screens/index.js.map +1 -1
  244. package/dist/tui/screens/input-row.d.ts +64 -0
  245. package/dist/tui/screens/input-row.d.ts.map +1 -0
  246. package/dist/tui/screens/input-row.js +67 -0
  247. package/dist/tui/screens/input-row.js.map +1 -0
  248. package/dist/tui/screens/input.d.ts +77 -1
  249. package/dist/tui/screens/input.d.ts.map +1 -1
  250. package/dist/tui/screens/input.js +125 -8
  251. package/dist/tui/screens/input.js.map +1 -1
  252. package/dist/tui/screens/layout.d.ts +42 -3
  253. package/dist/tui/screens/layout.d.ts.map +1 -1
  254. package/dist/tui/screens/layout.js +43 -13
  255. package/dist/tui/screens/layout.js.map +1 -1
  256. package/dist/tui/screens/lines.d.ts +6 -36
  257. package/dist/tui/screens/lines.d.ts.map +1 -1
  258. package/dist/tui/screens/lines.js +8 -71
  259. package/dist/tui/screens/lines.js.map +1 -1
  260. package/dist/tui/screens/messages-view.d.ts +29 -0
  261. package/dist/tui/screens/messages-view.d.ts.map +1 -0
  262. package/dist/tui/screens/messages-view.js +162 -0
  263. package/dist/tui/screens/messages-view.js.map +1 -0
  264. package/dist/tui/screens/notice-bar.d.ts +5 -0
  265. package/dist/tui/screens/notice-bar.d.ts.map +1 -0
  266. package/dist/tui/screens/notice-bar.js +21 -0
  267. package/dist/tui/screens/notice-bar.js.map +1 -0
  268. package/dist/tui/screens/notice.d.ts +66 -0
  269. package/dist/tui/screens/notice.d.ts.map +1 -0
  270. package/dist/tui/screens/notice.js +106 -0
  271. package/dist/tui/screens/notice.js.map +1 -0
  272. package/dist/tui/screens/overlays.d.ts.map +1 -1
  273. package/dist/tui/screens/overlays.js +4 -3
  274. package/dist/tui/screens/overlays.js.map +1 -1
  275. package/dist/tui/screens/render.d.ts +2 -4
  276. package/dist/tui/screens/render.d.ts.map +1 -1
  277. package/dist/tui/screens/render.js +19 -50
  278. package/dist/tui/screens/render.js.map +1 -1
  279. package/dist/tui/screens/splash.d.ts +1 -1
  280. package/dist/tui/screens/splash.d.ts.map +1 -1
  281. package/dist/tui/screens/splash.js +12 -3
  282. package/dist/tui/screens/splash.js.map +1 -1
  283. package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
  284. package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
  285. package/dist/tui/screens/use-chat-viewport.js +50 -0
  286. package/dist/tui/screens/use-chat-viewport.js.map +1 -0
  287. package/dist/tui/screens/use-input-editing.d.ts +69 -0
  288. package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
  289. package/dist/tui/screens/use-input-editing.js +220 -0
  290. package/dist/tui/screens/use-input-editing.js.map +1 -0
  291. package/dist/tui/screens/use-overlays.d.ts +25 -0
  292. package/dist/tui/screens/use-overlays.d.ts.map +1 -0
  293. package/dist/tui/screens/use-overlays.js +32 -0
  294. package/dist/tui/screens/use-overlays.js.map +1 -0
  295. package/dist/tui/screens/use-wizard-host.d.ts +46 -0
  296. package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
  297. package/dist/tui/screens/use-wizard-host.js +123 -0
  298. package/dist/tui/screens/use-wizard-host.js.map +1 -0
  299. package/dist/tui/status-segments.d.ts +37 -0
  300. package/dist/tui/status-segments.d.ts.map +1 -0
  301. package/dist/tui/status-segments.js +166 -0
  302. package/dist/tui/status-segments.js.map +1 -0
  303. package/dist/tui/text.d.ts +27 -7
  304. package/dist/tui/text.d.ts.map +1 -1
  305. package/dist/tui/text.js +116 -38
  306. package/dist/tui/text.js.map +1 -1
  307. package/dist/tui/theme.d.ts +2 -0
  308. package/dist/tui/theme.d.ts.map +1 -1
  309. package/dist/tui/theme.js +2 -0
  310. package/dist/tui/theme.js.map +1 -1
  311. package/dist/tui/token-rate.d.ts +83 -0
  312. package/dist/tui/token-rate.d.ts.map +1 -0
  313. package/dist/tui/token-rate.js +195 -0
  314. package/dist/tui/token-rate.js.map +1 -0
  315. package/dist/types.d.ts +7 -8
  316. package/dist/types.d.ts.map +1 -1
  317. package/dist/user-content.d.ts +41 -0
  318. package/dist/user-content.d.ts.map +1 -0
  319. package/dist/user-content.js +37 -0
  320. package/dist/user-content.js.map +1 -0
  321. package/dist/version-compare.d.ts +37 -0
  322. package/dist/version-compare.d.ts.map +1 -0
  323. package/dist/version-compare.js +105 -0
  324. package/dist/version-compare.js.map +1 -0
  325. package/dist/version.js.map +1 -1
  326. package/package.json +5 -4
  327. package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
  328. package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
  329. package/dist/auto-migrate-confirm-plugin.js +0 -61
  330. package/dist/auto-migrate-confirm-plugin.js.map +0 -1
  331. package/dist/migration-service.d.ts +0 -15
  332. package/dist/migration-service.d.ts.map +0 -1
  333. package/dist/migration-service.js +0 -59
  334. package/dist/migration-service.js.map +0 -1
  335. package/dist/tui/screens/state.d.ts +0 -30
  336. package/dist/tui/screens/state.d.ts.map +0 -1
  337. package/dist/tui/screens/state.js +0 -100
  338. package/dist/tui/screens/state.js.map +0 -1
package/dist/types.d.ts CHANGED
@@ -6,18 +6,17 @@
6
6
  */
7
7
  export type { AppConfig, Endpoint, Model, ImageModel, AgentDefinition, AgentPermissions, McpServerConfig, McpServerManifest, } from "@ai-zen/agents-sdk";
8
8
  export type { Conversation } from "./conversation-repository.js";
9
- import type { SdkAgent, TaskMigrationService } from "@ai-zen/agents-sdk";
9
+ import type { SdkAgent, HandoffService } from "@ai-zen/agents-sdk";
10
10
  export interface ConversationContext {
11
11
  agent: SdkAgent;
12
- input: string;
13
12
  currentName: string;
14
- modelId: string;
15
- currentId: string | undefined;
13
+ currentId: string;
16
14
  agentId: string | undefined;
17
- running: boolean;
18
- shouldSend?: boolean;
19
- /** 迁移服务实例:自动迁移(AutoMigratePlugin)与手动迁移(/migrate 命令)共用同一实例。先建 ctx 再回填(migrate 前必已赋值) */
20
- migrationService?: TaskMigrationService;
15
+ /**
16
+ * 交接服务实例:自动迁移、`/migrate`、`/handoff` 共用同一实例。
17
+ * 先建 ctx 再回填(交接前必已赋值)。
18
+ */
19
+ handoffService?: HandoffService;
21
20
  }
22
21
  export type CommandHandler = (ctx: ConversationContext) => Promise<void>;
23
22
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,SAAS,EACT,QAAQ,EACR,KAAK,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,SAAS,EACT,QAAQ,EACR,KAAK,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,QAAQ,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 「用户输入 + 粘贴的图片」→ 发给 core 的消息内容(`MessageContent`)。
3
+ *
4
+ * ## 为什么单独一个文件
5
+ *
6
+ * 这里是 `Ctrl+V` 粘贴图片链路的**唯一决策点**:几张图、走 Files API 还是内联、
7
+ * 模型不支持视觉时怎么办、转换失败要不要放弃 —— 全是纯逻辑(IO 由 SDK 的
8
+ * `fileToContentSection()` 负责,且可注入),因此可以脱离终端与网络单测。
9
+ *
10
+ * ## 三态输出,绝不「假成功」
11
+ *
12
+ * · 一张图都没转成功 → **退回纯文本**(用户至少把话说出去了,不会静默丢消息);
13
+ * · 部分成功 → 发成功的那几张,失败原因进 `warnings`;
14
+ * · 传输降级(上传失败转内联、模型不支持视觉转文本提示)→ 照发,SDK 的
15
+ * `warning` 透传给通知栏。
16
+ *
17
+ * 文本段永远排在**第一个**:`formatHistory()` 原样把内容块发给 API,而多数端点
18
+ * 对「图在文前」的处理是把提示词放到图片之后,指令容易被图片切断。
19
+ */
20
+ import type { AgentNS } from "@ai-zen/agents-core";
21
+ import { fileToContentSection } from "@ai-zen/agents-sdk";
22
+ import type { AppConfig } from "@ai-zen/agents-sdk";
23
+ import type { ClipboardImage } from "./clipboard.js";
24
+ export interface BuildUserContentInput {
25
+ text: string;
26
+ images?: readonly ClipboardImage[];
27
+ /** 当前配置(用于按模型反查端点与视觉能力) */
28
+ config: AppConfig;
29
+ /** 发给 API 的模型名(core 的 `agent.model`)——`file_id` 是端点维度资源,必须按实发模型定位 */
30
+ apiModelName?: string;
31
+ /** 依赖注入(测试用);默认走 SDK 的统一转换入口 */
32
+ convert?: typeof fileToContentSection;
33
+ }
34
+ export interface BuildUserContentResult {
35
+ content: AgentNS.MessageContent;
36
+ /** 降级 / 失败说明(供通知栏),无问题时为空数组 */
37
+ warnings: string[];
38
+ }
39
+ /** 粘贴的图片 → 内容块;失败的那张跳过并记一条说明 */
40
+ export declare function buildUserContent(input: BuildUserContentInput): Promise<BuildUserContentResult>;
41
+ //# sourceMappingURL=user-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-content.d.ts","sourceRoot":"","sources":["../src/user-content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAA2B,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC,2BAA2B;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,OAAO,CAAC,EAAE,OAAO,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC;IAChC,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAQD,gCAAgC;AAChC,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA2BpG"}
@@ -0,0 +1,37 @@
1
+ import { fileToContentSection, resolveModelAndEndpoint } from "@ai-zen/agents-sdk";
2
+ /** `image/png` → `png`(文件名后缀,部分端点按扩展名判类型) */
3
+ function extOf(mime) {
4
+ const slash = mime.indexOf("/");
5
+ return slash < 0 ? "png" : mime.slice(slash + 1);
6
+ }
7
+ /** 粘贴的图片 → 内容块;失败的那张跳过并记一条说明 */
8
+ export async function buildUserContent(input) {
9
+ const images = input.images ?? [];
10
+ if (images.length === 0)
11
+ return { content: input.text, warnings: [] };
12
+ const convert = input.convert ?? fileToContentSection;
13
+ const { model, endpoint } = resolveModelAndEndpoint(input.config, input.apiModelName);
14
+ const sections = [];
15
+ const warnings = [];
16
+ for (const [index, image] of images.entries()) {
17
+ const source = {
18
+ base64: image.base64,
19
+ mime: image.mime,
20
+ filename: `pasted-${index + 1}.${extOf(image.mime)}`,
21
+ };
22
+ try {
23
+ const result = await convert({ source, endpoint, model });
24
+ sections.push(result.section);
25
+ if (result.warning)
26
+ warnings.push(result.warning);
27
+ }
28
+ catch (error) {
29
+ // 单张失败不影响其他张:体积超内联上限、端点拒绝上传等都在这里收敛
30
+ warnings.push(error?.message ? String(error.message) : String(error));
31
+ }
32
+ }
33
+ if (sections.length === 0)
34
+ return { content: input.text, warnings };
35
+ return { content: [{ type: "text", text: input.text }, ...sections], warnings };
36
+ }
37
+ //# sourceMappingURL=user-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-content.js","sourceRoot":"","sources":["../src/user-content.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAqBnF,6CAA6C;AAC7C,SAAS,KAAK,CAAC,IAAY;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAA4B;IACjE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAEtE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,oBAAoB,CAAC;IACtD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAEtF,MAAM,QAAQ,GAAoC,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAe;YACzB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,UAAU,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;SACrD,CAAC;QACF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,mCAAmC;YACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IACpE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;AAClF,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 版本号比较 —— 只回答「谁更新」这一个问题。
3
+ *
4
+ * 语义照 semver 2.0 的比较规则(`X.Y.Z[-pre][+build]`):
5
+ * - 核心段按数字比,缺省补 0;
6
+ * - **有预发布标识的更小**(`1.0.0-alpha.23 < 1.0.0`);
7
+ * - 预发布标识逐个比:纯数字比数值、数字**小于**非数字、非数字按 ASCII 比;
8
+ * 前缀全相同则标识少的更小(`1.0.0-alpha < 1.0.0-alpha.1`);
9
+ * - 构建元数据(`+xxx`)不参与比较。
10
+ *
11
+ * 为什么不引 `semver` 包:CLI 只在这一处比版本号(`/update` 从 registry 的多个
12
+ * dist-tag 里挑最新的那个),为它多挂一份依赖不划算;而这段规则稳定、可穷举测试。
13
+ *
14
+ * 无法解析的版本号一律返回 `null`(调用方跳过),绝不抛错——版本号来自网络,
15
+ * 不该因为 registry 上有个畸形 tag 就让命令崩掉。
16
+ */
17
+ export interface ParsedVersion {
18
+ /** 核心段(数字数组,通常是 3 段) */
19
+ core: number[];
20
+ /** 预发布标识(`alpha.23` → `["alpha", "23"]`);无预发布为空数组 */
21
+ pre: string[];
22
+ }
23
+ /** 解析版本号;畸形返回 `null` */
24
+ export declare function parseVersion(version: string): ParsedVersion | null;
25
+ /**
26
+ * 比较两个版本号:`a` 更新返回正数、`b` 更新返回负数、相同返回 0。
27
+ * 任一方无法解析时返回 `null`。
28
+ */
29
+ export declare function compareVersions(a: string, b: string): number | null;
30
+ /**
31
+ * 从一组版本号里挑最新的(忽略无法解析的条目);全都不合法时返回 `undefined`。
32
+ *
33
+ * `/update` 用它把 registry 上**所有** dist-tag 折叠成一个目标版本:只认 `latest`
34
+ * 会漏掉「alpha 比正式版更新」的实际发布状态,只认 `alpha` 又会在正式版追上后装旧版。
35
+ */
36
+ export declare function pickNewest(versions: Iterable<string>): string | undefined;
37
+ //# sourceMappingURL=version-compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-compare.d.ts","sourceRoot":"","sources":["../src/version-compare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qDAAqD;IACrD,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AAID,wBAAwB;AACxB,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAgBlE;AAaD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2BnE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS,CAOzE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * 版本号比较 —— 只回答「谁更新」这一个问题。
3
+ *
4
+ * 语义照 semver 2.0 的比较规则(`X.Y.Z[-pre][+build]`):
5
+ * - 核心段按数字比,缺省补 0;
6
+ * - **有预发布标识的更小**(`1.0.0-alpha.23 < 1.0.0`);
7
+ * - 预发布标识逐个比:纯数字比数值、数字**小于**非数字、非数字按 ASCII 比;
8
+ * 前缀全相同则标识少的更小(`1.0.0-alpha < 1.0.0-alpha.1`);
9
+ * - 构建元数据(`+xxx`)不参与比较。
10
+ *
11
+ * 为什么不引 `semver` 包:CLI 只在这一处比版本号(`/update` 从 registry 的多个
12
+ * dist-tag 里挑最新的那个),为它多挂一份依赖不划算;而这段规则稳定、可穷举测试。
13
+ *
14
+ * 无法解析的版本号一律返回 `null`(调用方跳过),绝不抛错——版本号来自网络,
15
+ * 不该因为 registry 上有个畸形 tag 就让命令崩掉。
16
+ */
17
+ const NUMERIC = /^\d+$/;
18
+ /** 解析版本号;畸形返回 `null` */
19
+ export function parseVersion(version) {
20
+ if (typeof version !== "string")
21
+ return null;
22
+ // 容忍 `v1.2.3` 写法与首尾空白
23
+ const trimmed = version.trim().replace(/^v/i, "");
24
+ if (!trimmed)
25
+ return null;
26
+ // 构建元数据不参与比较
27
+ const plus = trimmed.indexOf("+");
28
+ const noBuild = plus >= 0 ? trimmed.slice(0, plus) : trimmed;
29
+ // 预发布段从**第一个** `-` 开始(`1.0.0-alpha-beta` 的预发布标识是 `alpha-beta`)
30
+ const dash = noBuild.indexOf("-");
31
+ const coreText = dash >= 0 ? noBuild.slice(0, dash) : noBuild;
32
+ const preText = dash >= 0 ? noBuild.slice(dash + 1) : "";
33
+ const parts = coreText.split(".");
34
+ if (!parts.every((part) => NUMERIC.test(part)))
35
+ return null;
36
+ return { core: parts.map(Number), pre: preText ? preText.split(".") : [] };
37
+ }
38
+ /** 单个预发布标识比较:数字按数值,数字 < 非数字,非数字按 ASCII */
39
+ function compareIdentifier(a, b) {
40
+ const aNumeric = NUMERIC.test(a);
41
+ const bNumeric = NUMERIC.test(b);
42
+ if (aNumeric && bNumeric)
43
+ return Number(a) - Number(b);
44
+ if (aNumeric)
45
+ return -1;
46
+ if (bNumeric)
47
+ return 1;
48
+ if (a === b)
49
+ return 0;
50
+ return a < b ? -1 : 1;
51
+ }
52
+ /**
53
+ * 比较两个版本号:`a` 更新返回正数、`b` 更新返回负数、相同返回 0。
54
+ * 任一方无法解析时返回 `null`。
55
+ */
56
+ export function compareVersions(a, b) {
57
+ const pa = parseVersion(a);
58
+ const pb = parseVersion(b);
59
+ if (!pa || !pb)
60
+ return null;
61
+ const coreLength = Math.max(pa.core.length, pb.core.length);
62
+ for (let i = 0; i < coreLength; i += 1) {
63
+ const diff = (pa.core[i] ?? 0) - (pb.core[i] ?? 0);
64
+ if (diff !== 0)
65
+ return diff > 0 ? 1 : -1;
66
+ }
67
+ // 核心段相同:有预发布标识的更小(1.0.0-alpha < 1.0.0)
68
+ if (pa.pre.length === 0 && pb.pre.length === 0)
69
+ return 0;
70
+ if (pa.pre.length === 0)
71
+ return 1;
72
+ if (pb.pre.length === 0)
73
+ return -1;
74
+ const preLength = Math.max(pa.pre.length, pb.pre.length);
75
+ for (let i = 0; i < preLength; i += 1) {
76
+ const left = pa.pre[i];
77
+ const right = pb.pre[i];
78
+ // 前缀相同 → 标识少的更小(1.0.0-alpha < 1.0.0-alpha.1)
79
+ if (left === undefined)
80
+ return -1;
81
+ if (right === undefined)
82
+ return 1;
83
+ const diff = compareIdentifier(left, right);
84
+ if (diff !== 0)
85
+ return diff > 0 ? 1 : -1;
86
+ }
87
+ return 0;
88
+ }
89
+ /**
90
+ * 从一组版本号里挑最新的(忽略无法解析的条目);全都不合法时返回 `undefined`。
91
+ *
92
+ * `/update` 用它把 registry 上**所有** dist-tag 折叠成一个目标版本:只认 `latest`
93
+ * 会漏掉「alpha 比正式版更新」的实际发布状态,只认 `alpha` 又会在正式版追上后装旧版。
94
+ */
95
+ export function pickNewest(versions) {
96
+ let newest;
97
+ for (const version of versions) {
98
+ if (!parseVersion(version))
99
+ continue;
100
+ if (newest === undefined || (compareVersions(version, newest) ?? 0) > 0)
101
+ newest = version;
102
+ }
103
+ return newest;
104
+ }
105
+ //# sourceMappingURL=version-compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-compare.js","sourceRoot":"","sources":["../src/version-compare.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAM/C,mCAAmC;AACnC,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAY,CAAC;QACrC,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAE7D,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC,iCAAiC,CAAC,CAAC;AAE7E,iCAAiC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC,kCAAkC,CAAC,CAAC;AAQ/E,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAM/C,mCAAmC;AACnC,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAY,CAAC;QACrC,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAE7D,gCAAgC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC,iCAAiC,CAAC,CAAC;AAE7E,iCAAiC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC,kCAAkC,CAAC,CAAC;AAQ/E,MAAM,UAAU,WAAW;IACzB,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACpE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-zen/cli",
3
- "version": "1.0.0-alpha.3",
3
+ "version": "1.0.0-alpha.30",
4
4
  "description": "AI-ZEN CLI - dual-mode AI terminal: pure stdio pipelines and an interactive TUI",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,14 +21,15 @@
21
21
  "author": "LZQCN",
22
22
  "license": "MIT",
23
23
  "dependencies": {
24
- "@ai-zen/agents-core": "^4.3.2",
25
- "@ai-zen/agents-sdk": "1.0.0-alpha.6",
24
+ "@ai-zen/agents-core": "^4.5.3",
25
+ "@ai-zen/agents-sdk": "1.0.0-alpha.25",
26
26
  "@modelcontextprotocol/sdk": "^1.29.0",
27
27
  "dayjs": "^1.11.21",
28
28
  "highlight.js": "^11.12.0",
29
29
  "ink": "^7.1.1",
30
30
  "lowlight": "^3.3.0",
31
31
  "react": "^19.3.0",
32
+ "string-width": "^8.3.0",
32
33
  "zod": "^4.4.3"
33
34
  },
34
35
  "devDependencies": {
@@ -38,7 +39,7 @@
38
39
  "dotenv": "^17.4.2",
39
40
  "ink-testing-library": "^4.0.0",
40
41
  "rimraf": "^6.0.0",
41
- "typescript": "^5.3.3",
42
+ "typescript": "^7.0.2",
42
43
  "vitest": "^4.1.9"
43
44
  },
44
45
  "files": [
@@ -1,58 +0,0 @@
1
- /**
2
- * AutoMigrateConfirmPlugin — 自动迁移「二次确认」插件(CLI 层)。
3
- *
4
- * 背景:SDK 的 `AutoMigratePlugin` 在 `usage.prompt_tokens` 超过阈值时**静默**触发迁移,
5
- * 而迁移会保存当前对话并以交接文档开启新会话。为让用户对这次「上下文切换」有知情权与
6
- * 否决权,CLI 在自动迁移前补一道二次确认。
7
- *
8
- * 职责边界(沿用 SDK 的分工,不重复实现「何时迁移」的语义):
9
- * - 是否触发:本插件先向用户确认,得到许可后委托基类的 `onAfterSend` 完成阈值判断与迁移调用;
10
- * - 实际迁移:仍由共享的 `TaskMigrationService` 实例执行(与 /migrate 手动迁移同一条链路)。
11
- * 因此本插件的增量仅有一处:在超阈值与调用迁移之间插入一次确认。
12
- *
13
- * 交互约定:
14
- * - 仅在 stdin 与 stdout **均为 TTY**(人类交互终端)时询问;
15
- * - 非交互环境(管道、重定向、e2e 脚本)没有确认通道,保持既有行为——直接自动迁移,
16
- * 不阻塞等待输入、不额外输出,管道语义不变;
17
- * - 确认框默认「是」(回车即迁移),与 /migrate 手动迁移的默认值保持一致;
18
- * - 用户拒绝时仅跳过**本次**迁移,不记录任何隐式状态:只要仍处于超限状态,下次发送后
19
- * 会再次询问;跳过不影响当前对话(历史未被剔除,语义与迁移前一致)。
20
- */
21
- import { AutoMigratePlugin } from "@ai-zen/agents-sdk";
22
- import type { SendContext, TaskMigrationService } from "@ai-zen/agents-sdk";
23
- /** 触发自动迁移时的用量信息(供确认文案与自定义询问实现使用) */
24
- export interface AutoMigrateTriggerInfo {
25
- /** 当前 prompt token 用量 */
26
- promptTokens: number;
27
- /** 上下文阈值(当前模型的 maxContextTokens) */
28
- maxTokens: number;
29
- }
30
- export interface AutoMigrateConfirmOptions {
31
- /** 迁移服务实例(与手动迁移 /migrate 共用同一实例) */
32
- service: TaskMigrationService;
33
- /** 触发迁移的上下文阈值 */
34
- maxTokens: number;
35
- /** 是否需要向用户确认;默认「stdin 与 stdout 均为 TTY」。可注入,便于单测 */
36
- shouldConfirm?: () => boolean;
37
- /**
38
- * 确认实现,由调用方注入(例如 TUI 的 Ink 确认框)。本模块不再内置任何交互 UI;
39
- * 仅当 `shouldConfirm()` 为真时才会被调用。
40
- */
41
- confirm: (info: AutoMigrateTriggerInfo) => Promise<boolean>;
42
- /** 输出信息(如「已跳过本次迁移」);由调用方注入(TUI 走 Ink notice),默认丢弃 */
43
- log?: (text: string) => void;
44
- }
45
- /** 默认交互判定:仅当 stdin 与 stdout 均为 TTY 时才具备确认通道 */
46
- export declare function canPromptUser(): boolean;
47
- /**
48
- * 自动迁移二次确认插件。
49
- *
50
- * 继承 SDK 的 `AutoMigratePlugin` 以复用其触发语义(阈值判断 + 委托共享迁移服务),
51
- * 仅在「超阈值」与「调用迁移」之间插入一次用户确认。
52
- */
53
- export declare class AutoMigrateConfirmPlugin extends AutoMigratePlugin {
54
- private readonly confirmOptions;
55
- constructor(options: AutoMigrateConfirmOptions);
56
- onAfterSend(ctx: SendContext): Promise<void>;
57
- }
58
- //# sourceMappingURL=auto-migrate-confirm-plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-migrate-confirm-plugin.d.ts","sourceRoot":"","sources":["../src/auto-migrate-confirm-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,oCAAoC;AACpC,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,oCAAoC;IACpC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B;;;OAGG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,qDAAqD;IACrD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;gBAE/C,OAAO,EAAE,yBAAyB;IAKxC,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BnD"}
@@ -1,61 +0,0 @@
1
- /**
2
- * AutoMigrateConfirmPlugin — 自动迁移「二次确认」插件(CLI 层)。
3
- *
4
- * 背景:SDK 的 `AutoMigratePlugin` 在 `usage.prompt_tokens` 超过阈值时**静默**触发迁移,
5
- * 而迁移会保存当前对话并以交接文档开启新会话。为让用户对这次「上下文切换」有知情权与
6
- * 否决权,CLI 在自动迁移前补一道二次确认。
7
- *
8
- * 职责边界(沿用 SDK 的分工,不重复实现「何时迁移」的语义):
9
- * - 是否触发:本插件先向用户确认,得到许可后委托基类的 `onAfterSend` 完成阈值判断与迁移调用;
10
- * - 实际迁移:仍由共享的 `TaskMigrationService` 实例执行(与 /migrate 手动迁移同一条链路)。
11
- * 因此本插件的增量仅有一处:在超阈值与调用迁移之间插入一次确认。
12
- *
13
- * 交互约定:
14
- * - 仅在 stdin 与 stdout **均为 TTY**(人类交互终端)时询问;
15
- * - 非交互环境(管道、重定向、e2e 脚本)没有确认通道,保持既有行为——直接自动迁移,
16
- * 不阻塞等待输入、不额外输出,管道语义不变;
17
- * - 确认框默认「是」(回车即迁移),与 /migrate 手动迁移的默认值保持一致;
18
- * - 用户拒绝时仅跳过**本次**迁移,不记录任何隐式状态:只要仍处于超限状态,下次发送后
19
- * 会再次询问;跳过不影响当前对话(历史未被剔除,语义与迁移前一致)。
20
- */
21
- import { AutoMigratePlugin } from "@ai-zen/agents-sdk";
22
- /** 默认交互判定:仅当 stdin 与 stdout 均为 TTY 时才具备确认通道 */
23
- export function canPromptUser() {
24
- return Boolean(process.stdin.isTTY && process.stdout.isTTY);
25
- }
26
- /**
27
- * 自动迁移二次确认插件。
28
- *
29
- * 继承 SDK 的 `AutoMigratePlugin` 以复用其触发语义(阈值判断 + 委托共享迁移服务),
30
- * 仅在「超阈值」与「调用迁移」之间插入一次用户确认。
31
- */
32
- export class AutoMigrateConfirmPlugin extends AutoMigratePlugin {
33
- confirmOptions;
34
- constructor(options) {
35
- super({ service: options.service, maxTokens: options.maxTokens });
36
- this.confirmOptions = options;
37
- }
38
- async onAfterSend(ctx) {
39
- const { maxTokens, shouldConfirm = canPromptUser, confirm, log = () => { } } = this.confirmOptions;
40
- const promptTokens = ctx.agent.lastUsage?.prompt_tokens;
41
- // 未超阈值(或无用量信息):无需询问,交由基类按原语义处理
42
- if (promptTokens == null || promptTokens <= maxTokens) {
43
- await super.onAfterSend(ctx);
44
- return;
45
- }
46
- // 非交互环境:没有确认通道,保持既有「静默自动迁移」行为,不阻塞、不额外输出
47
- if (!shouldConfirm()) {
48
- await super.onAfterSend(ctx);
49
- return;
50
- }
51
- const confirmed = await confirm({ promptTokens, maxTokens });
52
- if (!confirmed) {
53
- log("⏭️ 已跳过本次任务迁移,继续当前对话。");
54
- log("💡 上下文仍接近上限:可随时输入 /migrate 手动迁移;若继续增长至严重超限,对话会被安全护栏中断。");
55
- return;
56
- }
57
- // 用户已确认:交由基类完成「触发 + 委托共享迁移服务」的原逻辑
58
- await super.onAfterSend(ctx);
59
- }
60
- }
61
- //# sourceMappingURL=auto-migrate-confirm-plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-migrate-confirm-plugin.js","sourceRoot":"","sources":["../src/auto-migrate-confirm-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA2BvD,+CAA+C;AAC/C,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,wBAAyB,SAAQ,iBAAiB;IAC5C,cAAc,CAA4B;IAE3D,YAAY,OAAkC;QAC5C,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAgB;QAChC,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,aAAa,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;QAElG,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC;QAExD,+BAA+B;QAC/B,IAAI,YAAY,IAAI,IAAI,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;YACtD,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAC5B,GAAG,CAAC,wDAAwD,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -1,15 +0,0 @@
1
- import { TaskMigrationService } from "@ai-zen/agents-sdk";
2
- import type { ConversationContext } from "./types.js";
3
- /**
4
- * 创建 CLI 迁移服务实例(自动迁移与手动迁移共用同一个实例)。
5
- *
6
- * 迁移前后处理统一收敛于此:保存旧对话 / 开启新会话 / 落盘草稿。
7
- * 自动迁移由 AutoMigratePlugin 触发,手动迁移由 /migrate 命令触发,
8
- * 两者都委托给本服务实例的 migrate(),从而保证行为一致、避免重复实现。
9
- *
10
- * @param ctx 当前会话上下文(先建后回填 migrationService;钩子直接引用该对象)
11
- */
12
- export declare function createMigrationService(ctx: ConversationContext, options?: {
13
- log?: (text: string) => void;
14
- }): TaskMigrationService;
15
- //# sourceMappingURL=migration-service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migration-service.d.ts","sourceRoot":"","sources":["../src/migration-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,oBAAoB,CAAC;AAOjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,mBAAmB,EACxB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAC7C,oBAAoB,CAgDtB"}
@@ -1,59 +0,0 @@
1
- import { TaskMigrationService } from "@ai-zen/agents-sdk";
2
- import { saveConversation, conversationRepository, generateConversationId, } from "./conversation-repository.js";
3
- import { writeLastSession } from "./session-pointer.js";
4
- /**
5
- * 创建 CLI 迁移服务实例(自动迁移与手动迁移共用同一个实例)。
6
- *
7
- * 迁移前后处理统一收敛于此:保存旧对话 / 开启新会话 / 落盘草稿。
8
- * 自动迁移由 AutoMigratePlugin 触发,手动迁移由 /migrate 命令触发,
9
- * 两者都委托给本服务实例的 migrate(),从而保证行为一致、避免重复实现。
10
- *
11
- * @param ctx 当前会话上下文(先建后回填 migrationService;钩子直接引用该对象)
12
- */
13
- export function createMigrationService(ctx, options = {}) {
14
- // 进度/结果一律经 `log` 上报(TUI 走 Ink notice 块),不再直接 console.log 污染画面
15
- const log = options.log ?? (() => { });
16
- return new TaskMigrationService({
17
- // CLI 采用物理剔除模式:迁移后不保留历史消息,仅保留系统提示 + 交接断点。
18
- strategy: "prune",
19
- onBeforeMigrate: async (mctx) => {
20
- // 自动迁移由 AutoMigratePlugin 传入 promptTokens/maxTokens;手动迁移为 undefined。
21
- const isAuto = mctx.promptTokens != null && mctx.maxTokens != null;
22
- log(isAuto
23
- ? `📋 检测到上下文即将超限(${mctx.promptTokens}/${mctx.maxTokens} tokens),正在自动生成交接文档以延续对话…`
24
- : "📋 正在生成任务交接文档…");
25
- // 迁移前 agent.messages 仍是完整旧历史,先保存旧对话
26
- await saveConversation(ctx);
27
- log(`✅ 原对话已保存:${ctx.currentName}`);
28
- },
29
- onMigrated: async (mctx) => {
30
- // 迁移开启新会话:分配新的会话 id 与名称
31
- const id = generateConversationId();
32
- ctx.currentId = id;
33
- ctx.currentName = id;
34
- log(`🚀 任务迁移完成,已开启新会话(共 ${mctx.agent.messages.length} 条消息)`);
35
- log("💡 新助手已通过交接文档了解此前的工作,可继续提问。");
36
- // 迁移后立即把新开场白落盘为独立会话文件,并更新「上一轮会话 id」指针,
37
- // 避免迁移发生在 onAfterSend(ConversationPersistPlugin 的 onInnerLoopEnd
38
- // 已不再触发)导致迁移后的新对话未被及时落盘、用户中途退出时丢失。
39
- try {
40
- const existing = await conversationRepository.read(id);
41
- const now = new Date().toISOString();
42
- await conversationRepository.write({
43
- id,
44
- agentId: ctx.agentId || "default",
45
- modelId: ctx.modelId,
46
- messages: mctx.agent.messages,
47
- cwd: process.cwd(),
48
- createdAt: existing?.createdAt ?? now,
49
- updatedAt: now,
50
- });
51
- await writeLastSession(process.cwd(), id);
52
- }
53
- catch (err) {
54
- log(`⚠️ 迁移后会话落盘失败:${err?.message ?? err}`);
55
- }
56
- },
57
- });
58
- }
59
- //# sourceMappingURL=migration-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migration-service.js","sourceRoot":"","sources":["../src/migration-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAwB,EACxB,UAA4C,EAAE;IAE9C,8DAA8D;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,OAAO,IAAI,oBAAoB,CAAC;QAC9B,0CAA0C;QAC1C,QAAQ,EAAE,OAAO;QACjB,eAAe,EAAE,KAAK,EAAE,IAAsB,EAAE,EAAE;YAChD,qEAAqE;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;YACnE,GAAG,CACD,MAAM;gBACJ,CAAC,CAAC,iBAAiB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,2BAA2B;gBACjF,CAAC,CAAC,gBAAgB,CACrB,CAAC;YACF,oCAAoC;YACpC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC5B,GAAG,CAAC,YAAY,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,IAAsB,EAAE,EAAE;YAC3C,wBAAwB;YACxB,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAC;YACpC,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC;YACnB,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC;YAErB,GAAG,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,CAAC;YAC7D,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAEnC,uCAAuC;YACvC,iEAAiE;YACjE,mCAAmC;YACnC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,sBAAsB,CAAC,KAAK,CAAC;oBACjC,EAAE;oBACF,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;oBACjC,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAC7B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;oBAClB,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;oBACrC,SAAS,EAAE,GAAG;iBACf,CAAC,CAAC;gBACH,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,GAAG,CAAC,gBAAgB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -1,30 +0,0 @@
1
- import { ChatEvent } from "../chat-session.js";
2
- import { Block, LiveAssistant } from "./lines.js";
3
- /**
4
- * 视图历史保留上限(块数)。
5
- *
6
- * 长对话里 `blocks` 会随每轮追加而单调增长:迁移(`strategy: "prune"`)虽会裁剪
7
- * `agent.messages`,**却不会清理 `blocks`**,于是内存里累积的是「跨迁移的全程历史」
8
- * —— 这正是长对话 OOM 的主要来源。
9
- *
10
- * 这里给内存中的视图封顶:超出即从**最旧的块**开始丢弃。更早的内容仍完整保存在
11
- * `conversations/<id>.json`,可用 `/load` 找回。
12
- *
13
- * 注意:**不能**改在迁移时清空视图 —— 迁移发生在 `agent.send()` 内部(`onAfterSend`),
14
- * 此时正在流式的 `live` 尚未被 `done` 定稿,清空会把刚生成的回答一并抹掉。封顶只丢最旧、
15
- * 不碰 `live`,故安全。
16
- */
17
- export declare const MAX_TRANSCRIPT_BLOCKS = 200;
18
- /** 追加块并封顶(丢弃最旧),保证内存有界;`live` 不在其中,不受影响 */
19
- export declare function trimTranscript(blocks: Block[]): Block[];
20
- export interface ChatState {
21
- blocks: Block[];
22
- live: LiveAssistant | null;
23
- }
24
- export type ChatAction = ChatEvent | {
25
- type: "clear";
26
- };
27
- export declare let blockSeq: number;
28
- export declare const nextId: () => number;
29
- export declare function chatReducer(state: ChatState, action: ChatAction): ChatState;
30
- //# sourceMappingURL=state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIlD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,2CAA2C;AAC3C,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAIvD;AAMD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvD,eAAO,IAAI,QAAQ,QAAI,CAAC;AACxB,eAAO,MAAM,MAAM,cAAmB,CAAC;AAEvC,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,CAmE3E"}