@ai-zen/cli 0.9.0 → 1.0.0-alpha.2

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 (298) hide show
  1. package/CHANGELOG.md +59 -1
  2. package/README.md +94 -40
  3. package/README.zh.md +94 -40
  4. package/dist/agent-creator.d.ts +7 -1
  5. package/dist/agent-creator.d.ts.map +1 -1
  6. package/dist/agent-creator.js +16 -1
  7. package/dist/agent-creator.js.map +1 -1
  8. package/dist/agents-store.d.ts +33 -0
  9. package/dist/agents-store.d.ts.map +1 -0
  10. package/dist/agents-store.js +50 -0
  11. package/dist/agents-store.js.map +1 -0
  12. package/dist/auto-migrate-confirm-plugin.d.ts +7 -7
  13. package/dist/auto-migrate-confirm-plugin.d.ts.map +1 -1
  14. package/dist/auto-migrate-confirm-plugin.js +3 -21
  15. package/dist/auto-migrate-confirm-plugin.js.map +1 -1
  16. package/dist/config-editor.d.ts +201 -0
  17. package/dist/config-editor.d.ts.map +1 -0
  18. package/dist/config-editor.js +511 -0
  19. package/dist/config-editor.js.map +1 -0
  20. package/dist/config.d.ts +41 -16
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +32 -29
  23. package/dist/config.js.map +1 -1
  24. package/dist/conversation-commands/registry.d.ts +4 -5
  25. package/dist/conversation-commands/registry.d.ts.map +1 -1
  26. package/dist/conversation-commands/registry.js +9 -6
  27. package/dist/conversation-commands/registry.js.map +1 -1
  28. package/dist/conversation-persist-plugin.d.ts +25 -0
  29. package/dist/conversation-persist-plugin.d.ts.map +1 -0
  30. package/dist/conversation-persist-plugin.js +44 -0
  31. package/dist/conversation-persist-plugin.js.map +1 -0
  32. package/dist/conversation-repository.d.ts +19 -2
  33. package/dist/conversation-repository.d.ts.map +1 -1
  34. package/dist/conversation-repository.js +48 -5
  35. package/dist/conversation-repository.js.map +1 -1
  36. package/dist/format-time.d.ts +2 -2
  37. package/dist/format-time.js +2 -2
  38. package/dist/hook.d.ts.map +1 -1
  39. package/dist/hook.js +58 -46
  40. package/dist/hook.js.map +1 -1
  41. package/dist/index.js +65 -36
  42. package/dist/index.js.map +1 -1
  43. package/dist/migration-service.d.ts +3 -1
  44. package/dist/migration-service.d.ts.map +1 -1
  45. package/dist/migration-service.js +26 -23
  46. package/dist/migration-service.js.map +1 -1
  47. package/dist/mode.d.ts +56 -0
  48. package/dist/mode.d.ts.map +1 -0
  49. package/dist/mode.js +83 -0
  50. package/dist/mode.js.map +1 -0
  51. package/dist/session-pointer.d.ts +22 -0
  52. package/dist/session-pointer.d.ts.map +1 -0
  53. package/dist/session-pointer.js +49 -0
  54. package/dist/session-pointer.js.map +1 -0
  55. package/dist/stdio-runner.d.ts +34 -0
  56. package/dist/stdio-runner.d.ts.map +1 -0
  57. package/dist/stdio-runner.js +161 -0
  58. package/dist/stdio-runner.js.map +1 -0
  59. package/dist/tui/chat-session.d.ts +100 -0
  60. package/dist/tui/chat-session.d.ts.map +1 -0
  61. package/dist/tui/chat-session.js +263 -0
  62. package/dist/tui/chat-session.js.map +1 -0
  63. package/dist/tui/components.d.ts +44 -0
  64. package/dist/tui/components.d.ts.map +1 -0
  65. package/dist/tui/components.js +62 -0
  66. package/dist/tui/components.js.map +1 -0
  67. package/dist/tui/config-wizard/detail.d.ts +51 -0
  68. package/dist/tui/config-wizard/detail.d.ts.map +1 -0
  69. package/dist/tui/config-wizard/detail.js +273 -0
  70. package/dist/tui/config-wizard/detail.js.map +1 -0
  71. package/dist/tui/config-wizard/engine.d.ts +36 -0
  72. package/dist/tui/config-wizard/engine.d.ts.map +1 -0
  73. package/dist/tui/config-wizard/engine.js +187 -0
  74. package/dist/tui/config-wizard/engine.js.map +1 -0
  75. package/dist/tui/config-wizard/fields.d.ts +24 -0
  76. package/dist/tui/config-wizard/fields.d.ts.map +1 -0
  77. package/dist/tui/config-wizard/fields.js +411 -0
  78. package/dist/tui/config-wizard/fields.js.map +1 -0
  79. package/dist/tui/config-wizard/frame.d.ts +27 -0
  80. package/dist/tui/config-wizard/frame.d.ts.map +1 -0
  81. package/dist/tui/config-wizard/frame.js +28 -0
  82. package/dist/tui/config-wizard/frame.js.map +1 -0
  83. package/dist/tui/config-wizard/index.d.ts +6 -0
  84. package/dist/tui/config-wizard/index.d.ts.map +1 -0
  85. package/dist/tui/config-wizard/index.js +7 -0
  86. package/dist/tui/config-wizard/index.js.map +1 -0
  87. package/dist/tui/config-wizard/kv-editor.d.ts +18 -0
  88. package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -0
  89. package/dist/tui/config-wizard/kv-editor.js +116 -0
  90. package/dist/tui/config-wizard/kv-editor.js.map +1 -0
  91. package/dist/tui/config-wizard/list.d.ts +13 -0
  92. package/dist/tui/config-wizard/list.d.ts.map +1 -0
  93. package/dist/tui/config-wizard/list.js +29 -0
  94. package/dist/tui/config-wizard/list.js.map +1 -0
  95. package/dist/tui/config-wizard/mcp-helpers.d.ts +9 -0
  96. package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -0
  97. package/dist/tui/config-wizard/mcp-helpers.js +19 -0
  98. package/dist/tui/config-wizard/mcp-helpers.js.map +1 -0
  99. package/dist/tui/config-wizard/menu.d.ts +18 -0
  100. package/dist/tui/config-wizard/menu.d.ts.map +1 -0
  101. package/dist/tui/config-wizard/menu.js +70 -0
  102. package/dist/tui/config-wizard/menu.js.map +1 -0
  103. package/dist/tui/config-wizard/prompt-editor.d.ts +24 -0
  104. package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -0
  105. package/dist/tui/config-wizard/prompt-editor.js +83 -0
  106. package/dist/tui/config-wizard/prompt-editor.js.map +1 -0
  107. package/dist/tui/config-wizard/prompt.d.ts +57 -0
  108. package/dist/tui/config-wizard/prompt.d.ts.map +1 -0
  109. package/dist/tui/config-wizard/prompt.js +130 -0
  110. package/dist/tui/config-wizard/prompt.js.map +1 -0
  111. package/dist/tui/config-wizard/step-agents.d.ts +4 -0
  112. package/dist/tui/config-wizard/step-agents.d.ts.map +1 -0
  113. package/dist/tui/config-wizard/step-agents.js +110 -0
  114. package/dist/tui/config-wizard/step-agents.js.map +1 -0
  115. package/dist/tui/config-wizard/step-defaults.d.ts +4 -0
  116. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -0
  117. package/dist/tui/config-wizard/step-defaults.js +76 -0
  118. package/dist/tui/config-wizard/step-defaults.js.map +1 -0
  119. package/dist/tui/config-wizard/step-endpoints.d.ts +4 -0
  120. package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -0
  121. package/dist/tui/config-wizard/step-endpoints.js +43 -0
  122. package/dist/tui/config-wizard/step-endpoints.js.map +1 -0
  123. package/dist/tui/config-wizard/step-mcp.d.ts +4 -0
  124. package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -0
  125. package/dist/tui/config-wizard/step-mcp.js +97 -0
  126. package/dist/tui/config-wizard/step-mcp.js.map +1 -0
  127. package/dist/tui/config-wizard/step-menu.d.ts +4 -0
  128. package/dist/tui/config-wizard/step-menu.d.ts.map +1 -0
  129. package/dist/tui/config-wizard/step-menu.js +28 -0
  130. package/dist/tui/config-wizard/step-menu.js.map +1 -0
  131. package/dist/tui/config-wizard/step-models.d.ts +4 -0
  132. package/dist/tui/config-wizard/step-models.d.ts.map +1 -0
  133. package/dist/tui/config-wizard/step-models.js +114 -0
  134. package/dist/tui/config-wizard/step-models.js.map +1 -0
  135. package/dist/tui/config-wizard/step-new-endpoint.d.ts +4 -0
  136. package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -0
  137. package/dist/tui/config-wizard/step-new-endpoint.js +54 -0
  138. package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -0
  139. package/dist/tui/config-wizard/step-simple.d.ts +4 -0
  140. package/dist/tui/config-wizard/step-simple.d.ts.map +1 -0
  141. package/dist/tui/config-wizard/step-simple.js +55 -0
  142. package/dist/tui/config-wizard/step-simple.js.map +1 -0
  143. package/dist/tui/config-wizard/types.d.ts +138 -0
  144. package/dist/tui/config-wizard/types.d.ts.map +1 -0
  145. package/dist/tui/config-wizard/types.js +12 -0
  146. package/dist/tui/config-wizard/types.js.map +1 -0
  147. package/dist/tui/config-wizard/wizard.d.ts +9 -0
  148. package/dist/tui/config-wizard/wizard.d.ts.map +1 -0
  149. package/dist/tui/config-wizard/wizard.js +33 -0
  150. package/dist/tui/config-wizard/wizard.js.map +1 -0
  151. package/dist/tui/highlight.d.ts +34 -0
  152. package/dist/tui/highlight.d.ts.map +1 -0
  153. package/dist/tui/highlight.js +116 -0
  154. package/dist/tui/highlight.js.map +1 -0
  155. package/dist/tui/index.d.ts +33 -0
  156. package/dist/tui/index.d.ts.map +1 -0
  157. package/dist/tui/index.js +265 -0
  158. package/dist/tui/index.js.map +1 -0
  159. package/dist/tui/screens/chat-commands.d.ts +27 -0
  160. package/dist/tui/screens/chat-commands.d.ts.map +1 -0
  161. package/dist/tui/screens/chat-commands.js +176 -0
  162. package/dist/tui/screens/chat-commands.js.map +1 -0
  163. package/dist/tui/screens/chat.d.ts +25 -0
  164. package/dist/tui/screens/chat.d.ts.map +1 -0
  165. package/dist/tui/screens/chat.js +494 -0
  166. package/dist/tui/screens/chat.js.map +1 -0
  167. package/dist/tui/screens/index.d.ts +13 -0
  168. package/dist/tui/screens/index.d.ts.map +1 -0
  169. package/dist/tui/screens/index.js +14 -0
  170. package/dist/tui/screens/index.js.map +1 -0
  171. package/dist/tui/screens/input.d.ts +29 -0
  172. package/dist/tui/screens/input.d.ts.map +1 -0
  173. package/dist/tui/screens/input.js +54 -0
  174. package/dist/tui/screens/input.js.map +1 -0
  175. package/dist/tui/screens/layout.d.ts +42 -0
  176. package/dist/tui/screens/layout.d.ts.map +1 -0
  177. package/dist/tui/screens/layout.js +45 -0
  178. package/dist/tui/screens/layout.js.map +1 -0
  179. package/dist/tui/screens/lines.d.ts +71 -0
  180. package/dist/tui/screens/lines.d.ts.map +1 -0
  181. package/dist/tui/screens/lines.js +198 -0
  182. package/dist/tui/screens/lines.js.map +1 -0
  183. package/dist/tui/screens/overlays.d.ts +12 -0
  184. package/dist/tui/screens/overlays.d.ts.map +1 -0
  185. package/dist/tui/screens/overlays.js +34 -0
  186. package/dist/tui/screens/overlays.js.map +1 -0
  187. package/dist/tui/screens/render.d.ts +9 -0
  188. package/dist/tui/screens/render.d.ts.map +1 -0
  189. package/dist/tui/screens/render.js +97 -0
  190. package/dist/tui/screens/render.js.map +1 -0
  191. package/dist/tui/screens/splash.d.ts +5 -0
  192. package/dist/tui/screens/splash.d.ts.map +1 -0
  193. package/dist/tui/screens/splash.js +51 -0
  194. package/dist/tui/screens/splash.js.map +1 -0
  195. package/dist/tui/screens/state.d.ts +13 -0
  196. package/dist/tui/screens/state.d.ts.map +1 -0
  197. package/dist/tui/screens/state.js +75 -0
  198. package/dist/tui/screens/state.js.map +1 -0
  199. package/dist/tui/text.d.ts +71 -0
  200. package/dist/tui/text.d.ts.map +1 -0
  201. package/dist/tui/text.js +191 -0
  202. package/dist/tui/text.js.map +1 -0
  203. package/dist/tui/theme.d.ts +62 -0
  204. package/dist/tui/theme.d.ts.map +1 -0
  205. package/dist/tui/theme.js +120 -0
  206. package/dist/tui/theme.js.map +1 -0
  207. package/dist/types.d.ts +1 -2
  208. package/dist/types.d.ts.map +1 -1
  209. package/dist/types.js +1 -1
  210. package/package.json +11 -6
  211. package/dist/config-wizard.d.ts +0 -6
  212. package/dist/config-wizard.d.ts.map +0 -1
  213. package/dist/config-wizard.js +0 -46
  214. package/dist/config-wizard.js.map +0 -1
  215. package/dist/conversation-commands/back.d.ts +0 -3
  216. package/dist/conversation-commands/back.d.ts.map +0 -1
  217. package/dist/conversation-commands/back.js +0 -144
  218. package/dist/conversation-commands/back.js.map +0 -1
  219. package/dist/conversation-commands/clear.d.ts +0 -3
  220. package/dist/conversation-commands/clear.d.ts.map +0 -1
  221. package/dist/conversation-commands/clear.js +0 -8
  222. package/dist/conversation-commands/clear.js.map +0 -1
  223. package/dist/conversation-commands/editor.d.ts +0 -3
  224. package/dist/conversation-commands/editor.d.ts.map +0 -1
  225. package/dist/conversation-commands/editor.js +0 -15
  226. package/dist/conversation-commands/editor.js.map +0 -1
  227. package/dist/conversation-commands/exit.d.ts +0 -3
  228. package/dist/conversation-commands/exit.d.ts.map +0 -1
  229. package/dist/conversation-commands/exit.js +0 -37
  230. package/dist/conversation-commands/exit.js.map +0 -1
  231. package/dist/conversation-commands/help.d.ts +0 -3
  232. package/dist/conversation-commands/help.d.ts.map +0 -1
  233. package/dist/conversation-commands/help.js +0 -10
  234. package/dist/conversation-commands/help.js.map +0 -1
  235. package/dist/conversation-commands/index.d.ts +0 -13
  236. package/dist/conversation-commands/index.d.ts.map +0 -1
  237. package/dist/conversation-commands/index.js +0 -66
  238. package/dist/conversation-commands/index.js.map +0 -1
  239. package/dist/conversation-commands/migrate.d.ts +0 -12
  240. package/dist/conversation-commands/migrate.d.ts.map +0 -1
  241. package/dist/conversation-commands/migrate.js +0 -56
  242. package/dist/conversation-commands/migrate.js.map +0 -1
  243. package/dist/conversation-commands/new.d.ts +0 -3
  244. package/dist/conversation-commands/new.d.ts.map +0 -1
  245. package/dist/conversation-commands/new.js +0 -45
  246. package/dist/conversation-commands/new.js.map +0 -1
  247. package/dist/conversation-commands/save.d.ts +0 -3
  248. package/dist/conversation-commands/save.d.ts.map +0 -1
  249. package/dist/conversation-commands/save.js +0 -32
  250. package/dist/conversation-commands/save.js.map +0 -1
  251. package/dist/conversation-runner.d.ts +0 -17
  252. package/dist/conversation-runner.d.ts.map +0 -1
  253. package/dist/conversation-runner.js +0 -176
  254. package/dist/conversation-runner.js.map +0 -1
  255. package/dist/delta-renderer.d.ts +0 -33
  256. package/dist/delta-renderer.d.ts.map +0 -1
  257. package/dist/delta-renderer.js +0 -120
  258. package/dist/delta-renderer.js.map +0 -1
  259. package/dist/draft-plugin.d.ts +0 -19
  260. package/dist/draft-plugin.d.ts.map +0 -1
  261. package/dist/draft-plugin.js +0 -30
  262. package/dist/draft-plugin.js.map +0 -1
  263. package/dist/draft-repository.d.ts +0 -34
  264. package/dist/draft-repository.d.ts.map +0 -1
  265. package/dist/draft-repository.js +0 -64
  266. package/dist/draft-repository.js.map +0 -1
  267. package/dist/menus/agents.d.ts +0 -5
  268. package/dist/menus/agents.d.ts.map +0 -1
  269. package/dist/menus/agents.js +0 -219
  270. package/dist/menus/agents.js.map +0 -1
  271. package/dist/menus/common.d.ts +0 -41
  272. package/dist/menus/common.d.ts.map +0 -1
  273. package/dist/menus/common.js +0 -104
  274. package/dist/menus/common.js.map +0 -1
  275. package/dist/menus/config-display.d.ts +0 -2
  276. package/dist/menus/config-display.d.ts.map +0 -1
  277. package/dist/menus/config-display.js +0 -82
  278. package/dist/menus/config-display.js.map +0 -1
  279. package/dist/menus/config.d.ts +0 -8
  280. package/dist/menus/config.d.ts.map +0 -1
  281. package/dist/menus/config.js +0 -407
  282. package/dist/menus/config.js.map +0 -1
  283. package/dist/menus/conversations.d.ts +0 -20
  284. package/dist/menus/conversations.d.ts.map +0 -1
  285. package/dist/menus/conversations.js +0 -83
  286. package/dist/menus/conversations.js.map +0 -1
  287. package/dist/menus/index.d.ts +0 -5
  288. package/dist/menus/index.d.ts.map +0 -1
  289. package/dist/menus/index.js +0 -59
  290. package/dist/menus/index.js.map +0 -1
  291. package/dist/menus/start-conversation.d.ts +0 -16
  292. package/dist/menus/start-conversation.d.ts.map +0 -1
  293. package/dist/menus/start-conversation.js +0 -176
  294. package/dist/menus/start-conversation.js.map +0 -1
  295. package/dist/slash-hint-prompt.d.ts +0 -41
  296. package/dist/slash-hint-prompt.d.ts.map +0 -1
  297. package/dist/slash-hint-prompt.js +0 -92
  298. package/dist/slash-hint-prompt.js.map +0 -1
@@ -0,0 +1,116 @@
1
+ /**
2
+ * 语法高亮**数据层** —— 只负责产出「带 scope 的 token」,不关心颜色(颜色与 Ink 渲染
3
+ * 由 UI 层负责)。这样把「高亮数据(190+ 语言)」这件事交给专业库,
4
+ * 我们只写渲染,避免自造轮子在语言覆盖上以卵击石。
5
+ *
6
+ * 数据来源:**highlight.js**(经 **lowlight** 产出 **hast** 树)。
7
+ * 这与业界同类 Ink/React TUI(如 Google Gemini CLI 依赖 `highlight.js` + `lowlight`)
8
+ * 的做法一致:库给结构化的 `hljs-*` scope,我们逐段映射成 Ink `<Text>` 颜色。
9
+ */
10
+ import { createLowlight, common } from "lowlight";
11
+ /** 单例:注册 highlight.js 的 ~37 种常用语言(json / bash / ts / py / go / rust …) */
12
+ const lowlight = createLowlight(common);
13
+ function shortScope(className) {
14
+ return className.replace(/^hljs-/, "");
15
+ }
16
+ /** 深度优先展平 hast:文本节点继承「最内层」元素的 scope(更具体者优先) */
17
+ function walk(nodes, scope, out) {
18
+ for (const node of nodes) {
19
+ if (node.type === "text") {
20
+ if (node.value)
21
+ out.push({ text: node.value, scope });
22
+ }
23
+ else if (node.type === "element") {
24
+ const classNames = node.properties?.className ?? [];
25
+ const next = classNames.length ? shortScope(classNames[classNames.length - 1]) : scope;
26
+ walk(node.children, next, out);
27
+ }
28
+ }
29
+ }
30
+ /** 结果缓存:完成态内容在一次会话里反复渲染(滚动 / 每次按键),命中缓存避免重复高亮 */
31
+ const cache = new Map();
32
+ const CACHE_LIMIT = 512;
33
+ function memo(key, produce) {
34
+ const hit = cache.get(key);
35
+ if (hit)
36
+ return hit;
37
+ const value = produce();
38
+ if (cache.size >= CACHE_LIMIT)
39
+ cache.clear();
40
+ cache.set(key, value);
41
+ return value;
42
+ }
43
+ /**
44
+ * 按语言把代码切成带 scope 的 token。
45
+ *
46
+ * - 语言已注册:走 highlight.js 词法;
47
+ * - 语言缺失 / 未注册(含 ` ``` ` 无标注):**原样返回**为单段 `plain`,不做猜测
48
+ * (`highlightAuto` 在短片段上容易误判,宁可不着色也不误导)。
49
+ */
50
+ export function highlightCode(code, lang) {
51
+ const language = (lang ?? "").trim().toLowerCase();
52
+ if (!language || !code)
53
+ return code ? [{ text: code, scope: "" }] : [];
54
+ return memo(`${language}\u0000${code}`, () => {
55
+ try {
56
+ const root = lowlight.highlight(language, code);
57
+ const out = [];
58
+ walk(root.children, "", out);
59
+ return out.length ? out : [{ text: code, scope: "" }];
60
+ }
61
+ catch {
62
+ // 未注册语言:不高亮
63
+ return [{ text: code, scope: "" }];
64
+ }
65
+ });
66
+ }
67
+ /** JSON 高亮(工具调用参数):等价于 `highlightCode(code, "json")` */
68
+ export function highlightJson(code) {
69
+ return highlightCode(code, "json");
70
+ }
71
+ /** 已注册语言列表(供文档 / 调试) */
72
+ export function supportedLanguages() {
73
+ return lowlight.listLanguages().sort();
74
+ }
75
+ // ==================== 围栏切分 ====================
76
+ const FENCE_RE = /^\s*```(.*)$/;
77
+ /**
78
+ * 把正文切成「普通文本 / 围栏代码块」两类片段。
79
+ *
80
+ * 围栏行(``` 与 ```lang)本身作为分隔符**丢弃**,不进入任何片段 —— 渲染时代码块以
81
+ * 高亮行呈现,无需再显示裸围栏。
82
+ */
83
+ export function splitFences(text) {
84
+ const segments = [];
85
+ let buf = [];
86
+ let mode = "text";
87
+ let lang;
88
+ const flush = () => {
89
+ if (buf.length) {
90
+ segments.push(mode === "code"
91
+ ? { type: "code", lang, text: buf.join("\n") }
92
+ : { type: "text", text: buf.join("\n") });
93
+ }
94
+ buf = [];
95
+ };
96
+ for (const line of text.split("\n")) {
97
+ const m = FENCE_RE.exec(line);
98
+ if (m) {
99
+ flush();
100
+ if (mode === "text") {
101
+ mode = "code";
102
+ lang = m[1].trim() || undefined;
103
+ }
104
+ else {
105
+ mode = "text";
106
+ lang = undefined;
107
+ }
108
+ }
109
+ else {
110
+ buf.push(line);
111
+ }
112
+ }
113
+ flush();
114
+ return segments;
115
+ }
116
+ //# sourceMappingURL=highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.js","sourceRoot":"","sources":["../../src/tui/highlight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * TUI 入口 —— 屏幕循环与终端状态安全
3
+ *
4
+ * 流程:启动界面 → 端点凭据预检(缺 API Key 时先引导输入)→ 对话屏
5
+ * (优先续接「上一轮会话」,否则新建对话)。
6
+ * 对话屏内 `/clear`、`/back`、`/load` 通过重挂载(新 Ink 实例 + 原生清屏)实现;
7
+ * 对话屏退出即结束进程。
8
+ *
9
+ * 终端安全:SIGINT / SIGTERM / 未捕获异常均卸载 Ink,恢复 raw mode 与光标。
10
+ */
11
+ /**
12
+ * Ink 渲染选项(集中声明,便于单测锁定关键决策)。
13
+ *
14
+ * `kittyKeyboard` 刻意取 `disabled`,关闭 Kitty 键盘协议的「自动查询」:
15
+ *
16
+ * - Ink 的 `auto` 模式会在**每个实例创建时**发送一次 `CSI ? u` 查询,终端则回
17
+ * `CSI ? 0 u`(flags=0,不支持)。本 TUI 会反复挂载(启动界面 → 对话 →
18
+ * 配置向导 …),于是应答源源不断;
19
+ * - 应答一旦被**拆包**(前导 ESC 被 Ink 的「待定转义刷新定时器」当作一次独立的
20
+ * Escape 键消费),残留在后一个 chunk 里的 `[?0u` 会退化成普通文本被当作输入
21
+ * 插入输入框(已实测重现);
22
+ * - 而该协议的收益(Ctrl / Alt / Shift + Enter 换行)在本环境本就不生效——
23
+ * 换行由不依赖终端协议的 `Ctrl+N` / `Ctrl+J` 承担。
24
+ */
25
+ export declare const RENDER_OPTIONS: {
26
+ readonly exitOnCtrlC: false;
27
+ readonly alternateScreen: false;
28
+ readonly kittyKeyboard: {
29
+ readonly mode: "disabled";
30
+ };
31
+ };
32
+ export declare function runTui(): Promise<void>;
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0CH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc;;;;;;CAIjB,CAAC;AAuLX,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA6C5C"}
@@ -0,0 +1,265 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * TUI 入口 —— 屏幕循环与终端状态安全
4
+ *
5
+ * 流程:启动界面 → 端点凭据预检(缺 API Key 时先引导输入)→ 对话屏
6
+ * (优先续接「上一轮会话」,否则新建对话)。
7
+ * 对话屏内 `/clear`、`/back`、`/load` 通过重挂载(新 Ink 实例 + 原生清屏)实现;
8
+ * 对话屏退出即结束进程。
9
+ *
10
+ * 终端安全:SIGINT / SIGTERM / 未捕获异常均卸载 Ink,恢复 raw mode 与光标。
11
+ */
12
+ import { render, useApp } from "ink";
13
+ import { AgentRepository } from "@ai-zen/agents-sdk";
14
+ import { AGENTS_DIR, readConfig, saveConfig } from "../config.js";
15
+ import { resolveCredential } from "../config-editor.js";
16
+ import { ConfigWizard } from "./config-wizard/index.js";
17
+ import { conversationRepository } from "../conversation-repository.js";
18
+ import { readLastSession } from "../session-pointer.js";
19
+ import { Splash, Chat } from "./screens/index.js";
20
+ /** ANSI:清屏 + 光标归位 + 显示光标(屏幕间切换时从头绘制,避免行偏移) */
21
+ const CLEAR_SCREEN = "\x1b[2J\x1b[H\x1b[?25h";
22
+ /**
23
+ * 告别并终止进程。
24
+ *
25
+ * Ink 卸载后,进程仍可能被残留句柄(TTY stdin 处于 flowing、SDK 的 Timeout/Immediate 等)
26
+ * 挂住,导致「返回 shell 却不退出、终端不归还」。这里显式恢复终端、暂停 stdin 并 exit,
27
+ * 保证退出即干净交还 shell(Windows 下 TTY 写为异步,用回调 + 兜底定时器双保险)。
28
+ */
29
+ function farewell() {
30
+ try {
31
+ process.stdin.setRawMode?.(false);
32
+ }
33
+ catch {
34
+ /* ignore */
35
+ }
36
+ try {
37
+ process.stdin.pause();
38
+ }
39
+ catch {
40
+ /* ignore */
41
+ }
42
+ const finish = () => process.exit(0);
43
+ process.stdout.write("\x1b[?25h\n再见 👋\n", finish);
44
+ setTimeout(finish, 250);
45
+ }
46
+ /** 当前活动的 Ink 实例(用于信号处理时兜底卸载) */
47
+ let activeInstance = null;
48
+ /**
49
+ * Ink 渲染选项(集中声明,便于单测锁定关键决策)。
50
+ *
51
+ * `kittyKeyboard` 刻意取 `disabled`,关闭 Kitty 键盘协议的「自动查询」:
52
+ *
53
+ * - Ink 的 `auto` 模式会在**每个实例创建时**发送一次 `CSI ? u` 查询,终端则回
54
+ * `CSI ? 0 u`(flags=0,不支持)。本 TUI 会反复挂载(启动界面 → 对话 →
55
+ * 配置向导 …),于是应答源源不断;
56
+ * - 应答一旦被**拆包**(前导 ESC 被 Ink 的「待定转义刷新定时器」当作一次独立的
57
+ * Escape 键消费),残留在后一个 chunk 里的 `[?0u` 会退化成普通文本被当作输入
58
+ * 插入输入框(已实测重现);
59
+ * - 而该协议的收益(Ctrl / Alt / Shift + Enter 换行)在本环境本就不生效——
60
+ * 换行由不依赖终端协议的 `Ctrl+N` / `Ctrl+J` 承担。
61
+ */
62
+ export const RENDER_OPTIONS = {
63
+ exitOnCtrlC: false,
64
+ alternateScreen: false,
65
+ kittyKeyboard: { mode: "disabled" },
66
+ };
67
+ function mount(node) {
68
+ process.stdout.write(CLEAR_SCREEN);
69
+ const instance = render(node, RENDER_OPTIONS);
70
+ activeInstance = instance;
71
+ return instance.waitUntilExit().finally(() => {
72
+ if (activeInstance === instance)
73
+ activeInstance = null;
74
+ });
75
+ }
76
+ // ==================== 端点凭据预检 ====================
77
+ /**
78
+ * 首启凭据门 —— 所选模型绑定的端点缺 API Key 时,先弹出 Ink 原生输入屏。
79
+ *
80
+ * 输入完成(或放弃)后退出该屏,把结果回传给 `mount()` 的返回值。
81
+ */
82
+ function CredentialGate({ config, endpointId }) {
83
+ const { exit } = useApp();
84
+ return (_jsx(ConfigWizard, { config: config, onboarding: true, closeOnSave: true, initialStep: { kind: "edit", field: "apiKey", endpointId }, onSave: saveConfig, onClose: (result) => exit(result) }));
85
+ }
86
+ /**
87
+ * 端点凭据预检:返回 `false` 表示用户放弃配置(调用方应退出)。
88
+ *
89
+ * 配置本身残缺(模型 / 端点不存在)时不在此拦截 —— 交给对话屏报错,
90
+ * 那里可按 `k` 打开配置中心自行修配置。
91
+ */
92
+ async function ensureCredential(modelId) {
93
+ const config = await readConfig();
94
+ const credential = resolveCredential(config, modelId);
95
+ if (!credential || credential.configured)
96
+ return true;
97
+ const result = (await mount(_jsx(CredentialGate, { config: config, endpointId: credential.endpointId })));
98
+ return Boolean(result?.dirty);
99
+ }
100
+ async function resolveTarget() {
101
+ const config = await readConfig();
102
+ const repository = new AgentRepository(AGENTS_DIR);
103
+ const agents = await repository.list();
104
+ const agentId = config.defaultAgent ?? agents[0]?.id;
105
+ let modelId;
106
+ if (agentId) {
107
+ const agent = await repository.read(agentId);
108
+ modelId = agent?.modelId;
109
+ }
110
+ modelId = modelId ?? config.defaultModel ?? config.models[0]?.id;
111
+ if (!modelId) {
112
+ throw new Error("没有可用的模型,请先在配置中添加端点与模型(配置文件 config.json)");
113
+ }
114
+ return { modelId, agentId };
115
+ }
116
+ /** 目标模型是否仍在配置中(续接的会话可能引用了已删除的模型) */
117
+ async function modelExists(modelId) {
118
+ const config = await readConfig();
119
+ return config.models.some((model) => model.id === modelId);
120
+ }
121
+ /** 读取「上一轮会话 id」指针,续接该会话(指针缺失或会话不存在时返回 null) */
122
+ async function resumeLastSession() {
123
+ const pointer = await readLastSession();
124
+ if (!pointer)
125
+ return null;
126
+ const conversation = await conversationRepository.read(pointer.id);
127
+ if (!conversation)
128
+ return null;
129
+ return targetFromMessages({
130
+ modelId: conversation.modelId,
131
+ agentId: conversation.agentId,
132
+ messages: conversation.messages,
133
+ conversationId: conversation.id,
134
+ conversationName: conversation.id,
135
+ });
136
+ }
137
+ /** 从已保存对话构造对话目标 */
138
+ function targetFromMessages(input) {
139
+ return {
140
+ modelId: input.modelId,
141
+ agentId: input.agentId,
142
+ messages: input.messages,
143
+ conversationId: input.conversationId,
144
+ conversationName: input.conversationName,
145
+ };
146
+ }
147
+ // ==================== 对话屏 ====================
148
+ /**
149
+ * 运行对话屏;`/clear`、`/back`、`/load` 通过重挂载(新 Ink 实例 + 原生清屏)实现,
150
+ * 其余退出(退出)直接结束。
151
+ */
152
+ async function runChat(target) {
153
+ let current = target;
154
+ let messages = target.messages;
155
+ let initialInput;
156
+ let clearTranscript = false;
157
+ while (true) {
158
+ const result = await mount(_jsx(Chat, { modelId: current.modelId, agentId: current.agentId, messages: messages, conversationId: current.conversationId, conversationName: current.conversationName, initialInput: initialInput, clearTranscript: clearTranscript }));
159
+ if (result && typeof result === "object") {
160
+ const value = result;
161
+ if (value.load) {
162
+ // /load:整体切换到另一段已保存对话(含模型 / Agent),重挂载对话屏
163
+ current = {
164
+ modelId: value.load.modelId,
165
+ agentId: value.load.agentId,
166
+ conversationId: value.load.conversationId,
167
+ conversationName: value.load.conversationName,
168
+ };
169
+ messages = value.load.messages;
170
+ initialInput = undefined;
171
+ clearTranscript = false;
172
+ continue;
173
+ }
174
+ if (value.restart) {
175
+ messages = value.messages ?? messages;
176
+ initialInput = value.initialInput;
177
+ clearTranscript = Boolean(value.clearTranscript);
178
+ continue;
179
+ }
180
+ }
181
+ return;
182
+ }
183
+ }
184
+ // ==================== 入口 ====================
185
+ export async function runTui() {
186
+ const uninstallSignals = installSignalSafety();
187
+ try {
188
+ // 启动界面(一次性)
189
+ await mount(_jsx(Splash, {}));
190
+ // 直达对话:优先续接「上一轮会话」,否则新建对话
191
+ let target = await resumeLastSession();
192
+ if (target && !(await modelExists(target.modelId))) {
193
+ // 续接目标引用了已从配置中删除的模型:退回默认模型但保留历史,
194
+ // 避免卡在「模型不存在」的报错屏而无处可走
195
+ const fallback = await resolveTarget().catch(() => null);
196
+ target = fallback
197
+ ? {
198
+ ...fallback,
199
+ messages: target.messages,
200
+ conversationId: target.conversationId,
201
+ conversationName: target.conversationName,
202
+ }
203
+ : null;
204
+ }
205
+ else if (!target) {
206
+ try {
207
+ target = await resolveTarget();
208
+ }
209
+ catch (error) {
210
+ process.stderr.write(`\n✖ 无法启动对话:${error?.message ?? error}\n`);
211
+ }
212
+ }
213
+ if (!target) {
214
+ farewell();
215
+ return;
216
+ }
217
+ // 端点凭据预检:未配置 API Key 时先弹出输入屏,而不是「报错即退出」
218
+ if (!(await ensureCredential(target.modelId))) {
219
+ farewell();
220
+ return;
221
+ }
222
+ await runChat(target);
223
+ farewell();
224
+ }
225
+ finally {
226
+ uninstallSignals();
227
+ activeInstance = null;
228
+ }
229
+ }
230
+ /** 安装信号与异常兜底:任何异常退出路径都先卸载 Ink,避免「花屏终端」 */
231
+ function installSignalSafety() {
232
+ const restore = () => {
233
+ try {
234
+ activeInstance?.unmount();
235
+ }
236
+ catch {
237
+ /* 忽略 */
238
+ }
239
+ activeInstance = null;
240
+ };
241
+ const onSigint = () => {
242
+ restore();
243
+ process.exit(130);
244
+ };
245
+ const onSigterm = () => {
246
+ restore();
247
+ process.exit(143);
248
+ };
249
+ const onFatal = (error) => {
250
+ restore();
251
+ process.stderr.write(`\n✖ 意外错误: ${error?.message ?? error}\n`);
252
+ process.exit(1);
253
+ };
254
+ process.on("SIGINT", onSigint);
255
+ process.on("SIGTERM", onSigterm);
256
+ process.on("uncaughtException", onFatal);
257
+ process.on("unhandledRejection", onFatal);
258
+ return () => {
259
+ process.off("SIGINT", onSigint);
260
+ process.off("SIGTERM", onSigterm);
261
+ process.off("uncaughtException", onFatal);
262
+ process.off("unhandledRejection", onFatal);
263
+ };
264
+ }
265
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Dispatch, SetStateAction } from "react";
2
+ import { SelectItem } from "../components.js";
3
+ import { ChatSession } from "../chat-session.js";
4
+ import { WizardStep } from "../config-wizard/index.js";
5
+ import { ChatAction } from "./state.js";
6
+ export interface ChatCommandHost {
7
+ session: ChatSession;
8
+ dispatch: Dispatch<ChatAction>;
9
+ rows: number;
10
+ exit: (arg?: any) => void;
11
+ suspendTerminal: (fn: () => void | Promise<void>) => Promise<void>;
12
+ openWizard: (step: WizardStep) => Promise<void>;
13
+ openKeyEditor: () => Promise<void>;
14
+ doExit: () => void;
15
+ setPickerState: Dispatch<SetStateAction<{
16
+ title: string;
17
+ items: SelectItem<string>[];
18
+ resolve: (value: string | null) => void;
19
+ } | null>>;
20
+ setConfirmState: Dispatch<SetStateAction<{
21
+ question: string;
22
+ resolve: (value: boolean) => void;
23
+ } | null>>;
24
+ setInputText: (text: string) => void;
25
+ }
26
+ export declare function runCommand(name: string, raw: string, host: ChatCommandHost): Promise<void>;
27
+ //# sourceMappingURL=chat-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-commands.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/chat-commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAMjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAgB,MAAM,oBAAoB,CAAC;AAI/D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAC1B,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,UAAU,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,cAAc,EAAE,QAAQ,CACtB,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAC/G,CAAC;IACF,eAAe,EAAE,QAAQ,CAAC,cAAc,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1G,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+KhG"}
@@ -0,0 +1,176 @@
1
+ import { AgentNS } from "@ai-zen/agents-core";
2
+ import { spawnSync } from "node:child_process";
3
+ import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { stripCwdNote } from "../chat-session.js";
7
+ import { matchCommandHints } from "../../conversation-commands/registry.js";
8
+ import { conversationRepository, listConversations } from "../../conversation-repository.js";
9
+ import { formatShortTime } from "../../format-time.js";
10
+ import { truncate } from "./render.js";
11
+ export async function runCommand(name, raw, host) {
12
+ const { session, dispatch, rows, exit, suspendTerminal, openWizard, openKeyEditor, doExit, setPickerState, setConfirmState, setInputText, } = host;
13
+ const push = (text, tone = "info") => {
14
+ if (tone === "error")
15
+ dispatch({ type: "error", text });
16
+ else
17
+ dispatch({ type: "notice", text });
18
+ };
19
+ switch (name) {
20
+ case "config":
21
+ await openWizard({ kind: "menu" });
22
+ break;
23
+ case "key":
24
+ await openKeyEditor();
25
+ break;
26
+ case "help": {
27
+ const lines = ["可用命令:"];
28
+ for (const hint of matchCommandHints("")) {
29
+ lines.push(` ${hint.label} ${hint.description}`);
30
+ }
31
+ push(lines.join("\n"));
32
+ break;
33
+ }
34
+ case "clear":
35
+ // 清屏但保留上下文:重挂载对话屏且不重建历史
36
+ exit({ restart: true, messages: session.messages, clearTranscript: true });
37
+ break;
38
+ case "new":
39
+ await session.reset();
40
+ dispatch({ type: "clear" });
41
+ push("已开始新对话");
42
+ break;
43
+ case "save": {
44
+ try {
45
+ const id = await session.save();
46
+ push(`对话已保存:${id}`);
47
+ }
48
+ catch (error) {
49
+ push(`保存失败:${error?.message ?? error}`, "error");
50
+ }
51
+ break;
52
+ }
53
+ case "load": {
54
+ const list = await listConversations();
55
+ if (list.length === 0) {
56
+ push("还没有已保存的对话", "error");
57
+ break;
58
+ }
59
+ const allItems = list.map((c) => ({
60
+ label: c.name,
61
+ value: c.id,
62
+ hint: formatShortTime(c.updatedAt),
63
+ }));
64
+ // 覆盖层不能高于终端:仅展示最近的有限条
65
+ const maxItems = Math.max(1, (rows ?? 24) - 8);
66
+ const items = allItems.slice(0, maxItems);
67
+ const title = allItems.length > maxItems
68
+ ? `选择要加载的对话(仅显示最近 ${maxItems} 条)`
69
+ : "选择要加载的对话(当前会话将被替换)";
70
+ const choice = await new Promise((resolve) => setPickerState({ title, items, resolve }));
71
+ if (choice == null) {
72
+ push("已取消加载");
73
+ break;
74
+ }
75
+ const conversation = await conversationRepository.read(choice);
76
+ if (!conversation) {
77
+ push(`对话不存在或读取失败:${choice}`, "error");
78
+ break;
79
+ }
80
+ // 整体切换会话(含模型 / Agent)——交由上层重挂载对话屏
81
+ exit({
82
+ load: {
83
+ modelId: conversation.modelId,
84
+ agentId: conversation.agentId,
85
+ messages: conversation.messages,
86
+ conversationId: conversation.id,
87
+ conversationName: conversation.id,
88
+ },
89
+ });
90
+ break;
91
+ }
92
+ case "migrate": {
93
+ if (!session.messages.some((m) => m.role === AgentNS.Role.User)) {
94
+ push("当前对话还没有可迁移的内容", "error");
95
+ break;
96
+ }
97
+ const ok = await new Promise((resolve) => setConfirmState({ question: "确定对当前对话进行任务迁移吗?", resolve }));
98
+ if (!ok) {
99
+ push("已取消迁移");
100
+ break;
101
+ }
102
+ try {
103
+ await session.migrate();
104
+ push("任务迁移完成,已开启新会话");
105
+ }
106
+ catch (error) {
107
+ push(`任务迁移失败:${error?.message ?? error}`, "error");
108
+ }
109
+ break;
110
+ }
111
+ case "back": {
112
+ const allItems = [];
113
+ session.messages.forEach((message, index) => {
114
+ if (message.role !== AgentNS.Role.User)
115
+ return;
116
+ const content = typeof message.content === "string" ? message.content : "";
117
+ allItems.push({ label: truncate(stripCwdNote(content), 60), value: String(index) });
118
+ });
119
+ if (allItems.length === 0) {
120
+ push("还没有可撤回的消息", "error");
121
+ break;
122
+ }
123
+ // 最近的在最前;仅展示最近的有限条,避免覆盖层高于终端
124
+ const maxItems = Math.max(1, (rows ?? 24) - 8);
125
+ const items = allItems.reverse().slice(0, maxItems);
126
+ const title = allItems.length > maxItems
127
+ ? `选择要撤回到的消息(仅显示最近 ${maxItems} 条)`
128
+ : "选择要撤回到的消息(其后内容将被移除)";
129
+ const choice = await new Promise((resolve) => setPickerState({ title, items, resolve }));
130
+ if (choice == null) {
131
+ push("已取消撤回");
132
+ break;
133
+ }
134
+ const text = session.rollbackTo(Number(choice));
135
+ exit({ restart: true, messages: session.messages, initialInput: text });
136
+ break;
137
+ }
138
+ case "editor": {
139
+ const file = join(tmpdir(), `aizen-input-${Date.now()}.md`);
140
+ try {
141
+ writeFileSync(file, "", "utf-8");
142
+ await suspendTerminal(() => {
143
+ const editor = process.env.EDITOR ||
144
+ process.env.VISUAL ||
145
+ (process.platform === "win32" ? "notepad" : "vi");
146
+ const result = spawnSync(editor, [file], { stdio: "inherit" });
147
+ if (result.error)
148
+ throw result.error;
149
+ });
150
+ const text = readFileSync(file, "utf-8").trim();
151
+ if (text)
152
+ setInputText(text);
153
+ }
154
+ catch (error) {
155
+ push(`编辑器打开失败:${error?.message ?? error}`, "error");
156
+ }
157
+ finally {
158
+ try {
159
+ unlinkSync(file);
160
+ }
161
+ catch {
162
+ /* 忽略 */
163
+ }
164
+ }
165
+ break;
166
+ }
167
+ case "exit":
168
+ case "quit": {
169
+ await doExit();
170
+ break;
171
+ }
172
+ default:
173
+ push(`未知命令:${raw}(输入 /help 查看可用命令)`, "error");
174
+ }
175
+ }
176
+ //# sourceMappingURL=chat-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-commands.js","sourceRoot":"","sources":["../../../src/tui/screens/chat-commands.ts"],"names":[],"mappings":"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"}