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

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 (314) hide show
  1. package/CHANGELOG.md +199 -1
  2. package/README.md +115 -62
  3. package/README.zh.md +115 -62
  4. package/dist/agent-creator.d.ts +18 -1
  5. package/dist/agent-creator.d.ts.map +1 -1
  6. package/dist/agent-creator.js +36 -12
  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.d.ts +43 -0
  13. package/dist/auto-migrate-confirm.d.ts.map +1 -0
  14. package/dist/auto-migrate-confirm.js +46 -0
  15. package/dist/auto-migrate-confirm.js.map +1 -0
  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 +55 -16
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +46 -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 +11 -7
  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/handoff-service.d.ts +19 -0
  39. package/dist/handoff-service.d.ts.map +1 -0
  40. package/dist/handoff-service.js +87 -0
  41. package/dist/handoff-service.js.map +1 -0
  42. package/dist/hook.d.ts.map +1 -1
  43. package/dist/hook.js +58 -46
  44. package/dist/hook.js.map +1 -1
  45. package/dist/index.js +82 -35
  46. package/dist/index.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 +35 -0
  52. package/dist/session-pointer.d.ts.map +1 -0
  53. package/dist/session-pointer.js +81 -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 +106 -0
  60. package/dist/tui/chat-session.d.ts.map +1 -0
  61. package/dist/tui/chat-session.js +299 -0
  62. package/dist/tui/chat-session.js.map +1 -0
  63. package/dist/tui/components.d.ts +47 -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 +147 -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 +34 -0
  150. package/dist/tui/config-wizard/wizard.js.map +1 -0
  151. package/dist/tui/highlight.d.ts +35 -0
  152. package/dist/tui/highlight.d.ts.map +1 -0
  153. package/dist/tui/highlight.js +117 -0
  154. package/dist/tui/highlight.js.map +1 -0
  155. package/dist/tui/index.d.ts +34 -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 +35 -0
  160. package/dist/tui/screens/chat-commands.d.ts.map +1 -0
  161. package/dist/tui/screens/chat-commands.js +214 -0
  162. package/dist/tui/screens/chat-commands.js.map +1 -0
  163. package/dist/tui/screens/chat.d.ts +21 -0
  164. package/dist/tui/screens/chat.d.ts.map +1 -0
  165. package/dist/tui/screens/chat.js +563 -0
  166. package/dist/tui/screens/chat.js.map +1 -0
  167. package/dist/tui/screens/frame-buffer.d.ts +47 -0
  168. package/dist/tui/screens/frame-buffer.d.ts.map +1 -0
  169. package/dist/tui/screens/frame-buffer.js +78 -0
  170. package/dist/tui/screens/frame-buffer.js.map +1 -0
  171. package/dist/tui/screens/index.d.ts +13 -0
  172. package/dist/tui/screens/index.d.ts.map +1 -0
  173. package/dist/tui/screens/index.js +14 -0
  174. package/dist/tui/screens/index.js.map +1 -0
  175. package/dist/tui/screens/input.d.ts +29 -0
  176. package/dist/tui/screens/input.d.ts.map +1 -0
  177. package/dist/tui/screens/input.js +54 -0
  178. package/dist/tui/screens/input.js.map +1 -0
  179. package/dist/tui/screens/layout.d.ts +44 -0
  180. package/dist/tui/screens/layout.d.ts.map +1 -0
  181. package/dist/tui/screens/layout.js +40 -0
  182. package/dist/tui/screens/layout.js.map +1 -0
  183. package/dist/tui/screens/lines.d.ts +42 -0
  184. package/dist/tui/screens/lines.d.ts.map +1 -0
  185. package/dist/tui/screens/lines.js +190 -0
  186. package/dist/tui/screens/lines.js.map +1 -0
  187. package/dist/tui/screens/messages-view.d.ts +10 -0
  188. package/dist/tui/screens/messages-view.d.ts.map +1 -0
  189. package/dist/tui/screens/messages-view.js +115 -0
  190. package/dist/tui/screens/messages-view.js.map +1 -0
  191. package/dist/tui/screens/notice.d.ts +32 -0
  192. package/dist/tui/screens/notice.d.ts.map +1 -0
  193. package/dist/tui/screens/notice.js +46 -0
  194. package/dist/tui/screens/notice.js.map +1 -0
  195. package/dist/tui/screens/overlays.d.ts +12 -0
  196. package/dist/tui/screens/overlays.d.ts.map +1 -0
  197. package/dist/tui/screens/overlays.js +34 -0
  198. package/dist/tui/screens/overlays.js.map +1 -0
  199. package/dist/tui/screens/render.d.ts +7 -0
  200. package/dist/tui/screens/render.d.ts.map +1 -0
  201. package/dist/tui/screens/render.js +61 -0
  202. package/dist/tui/screens/render.js.map +1 -0
  203. package/dist/tui/screens/splash.d.ts +5 -0
  204. package/dist/tui/screens/splash.d.ts.map +1 -0
  205. package/dist/tui/screens/splash.js +51 -0
  206. package/dist/tui/screens/splash.js.map +1 -0
  207. package/dist/tui/text.d.ts +76 -0
  208. package/dist/tui/text.d.ts.map +1 -0
  209. package/dist/tui/text.js +198 -0
  210. package/dist/tui/text.js.map +1 -0
  211. package/dist/tui/theme.d.ts +68 -0
  212. package/dist/tui/theme.d.ts.map +1 -0
  213. package/dist/tui/theme.js +132 -0
  214. package/dist/tui/theme.js.map +1 -0
  215. package/dist/types.d.ts +7 -5
  216. package/dist/types.d.ts.map +1 -1
  217. package/dist/types.js +1 -1
  218. package/package.json +12 -7
  219. package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
  220. package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
  221. package/dist/auto-migrate-confirm-plugin.js +0 -79
  222. package/dist/auto-migrate-confirm-plugin.js.map +0 -1
  223. package/dist/config-wizard.d.ts +0 -6
  224. package/dist/config-wizard.d.ts.map +0 -1
  225. package/dist/config-wizard.js +0 -46
  226. package/dist/config-wizard.js.map +0 -1
  227. package/dist/conversation-commands/back.d.ts +0 -3
  228. package/dist/conversation-commands/back.d.ts.map +0 -1
  229. package/dist/conversation-commands/back.js +0 -144
  230. package/dist/conversation-commands/back.js.map +0 -1
  231. package/dist/conversation-commands/clear.d.ts +0 -3
  232. package/dist/conversation-commands/clear.d.ts.map +0 -1
  233. package/dist/conversation-commands/clear.js +0 -8
  234. package/dist/conversation-commands/clear.js.map +0 -1
  235. package/dist/conversation-commands/editor.d.ts +0 -3
  236. package/dist/conversation-commands/editor.d.ts.map +0 -1
  237. package/dist/conversation-commands/editor.js +0 -15
  238. package/dist/conversation-commands/editor.js.map +0 -1
  239. package/dist/conversation-commands/exit.d.ts +0 -3
  240. package/dist/conversation-commands/exit.d.ts.map +0 -1
  241. package/dist/conversation-commands/exit.js +0 -37
  242. package/dist/conversation-commands/exit.js.map +0 -1
  243. package/dist/conversation-commands/help.d.ts +0 -3
  244. package/dist/conversation-commands/help.d.ts.map +0 -1
  245. package/dist/conversation-commands/help.js +0 -10
  246. package/dist/conversation-commands/help.js.map +0 -1
  247. package/dist/conversation-commands/index.d.ts +0 -13
  248. package/dist/conversation-commands/index.d.ts.map +0 -1
  249. package/dist/conversation-commands/index.js +0 -66
  250. package/dist/conversation-commands/index.js.map +0 -1
  251. package/dist/conversation-commands/migrate.d.ts +0 -12
  252. package/dist/conversation-commands/migrate.d.ts.map +0 -1
  253. package/dist/conversation-commands/migrate.js +0 -56
  254. package/dist/conversation-commands/migrate.js.map +0 -1
  255. package/dist/conversation-commands/new.d.ts +0 -3
  256. package/dist/conversation-commands/new.d.ts.map +0 -1
  257. package/dist/conversation-commands/new.js +0 -45
  258. package/dist/conversation-commands/new.js.map +0 -1
  259. package/dist/conversation-commands/save.d.ts +0 -3
  260. package/dist/conversation-commands/save.d.ts.map +0 -1
  261. package/dist/conversation-commands/save.js +0 -32
  262. package/dist/conversation-commands/save.js.map +0 -1
  263. package/dist/conversation-runner.d.ts +0 -17
  264. package/dist/conversation-runner.d.ts.map +0 -1
  265. package/dist/conversation-runner.js +0 -176
  266. package/dist/conversation-runner.js.map +0 -1
  267. package/dist/delta-renderer.d.ts +0 -33
  268. package/dist/delta-renderer.d.ts.map +0 -1
  269. package/dist/delta-renderer.js +0 -120
  270. package/dist/delta-renderer.js.map +0 -1
  271. package/dist/draft-plugin.d.ts +0 -19
  272. package/dist/draft-plugin.d.ts.map +0 -1
  273. package/dist/draft-plugin.js +0 -30
  274. package/dist/draft-plugin.js.map +0 -1
  275. package/dist/draft-repository.d.ts +0 -34
  276. package/dist/draft-repository.d.ts.map +0 -1
  277. package/dist/draft-repository.js +0 -64
  278. package/dist/draft-repository.js.map +0 -1
  279. package/dist/menus/agents.d.ts +0 -5
  280. package/dist/menus/agents.d.ts.map +0 -1
  281. package/dist/menus/agents.js +0 -219
  282. package/dist/menus/agents.js.map +0 -1
  283. package/dist/menus/common.d.ts +0 -41
  284. package/dist/menus/common.d.ts.map +0 -1
  285. package/dist/menus/common.js +0 -104
  286. package/dist/menus/common.js.map +0 -1
  287. package/dist/menus/config-display.d.ts +0 -2
  288. package/dist/menus/config-display.d.ts.map +0 -1
  289. package/dist/menus/config-display.js +0 -82
  290. package/dist/menus/config-display.js.map +0 -1
  291. package/dist/menus/config.d.ts +0 -8
  292. package/dist/menus/config.d.ts.map +0 -1
  293. package/dist/menus/config.js +0 -407
  294. package/dist/menus/config.js.map +0 -1
  295. package/dist/menus/conversations.d.ts +0 -20
  296. package/dist/menus/conversations.d.ts.map +0 -1
  297. package/dist/menus/conversations.js +0 -83
  298. package/dist/menus/conversations.js.map +0 -1
  299. package/dist/menus/index.d.ts +0 -5
  300. package/dist/menus/index.d.ts.map +0 -1
  301. package/dist/menus/index.js +0 -59
  302. package/dist/menus/index.js.map +0 -1
  303. package/dist/menus/start-conversation.d.ts +0 -16
  304. package/dist/menus/start-conversation.d.ts.map +0 -1
  305. package/dist/menus/start-conversation.js +0 -176
  306. package/dist/menus/start-conversation.js.map +0 -1
  307. package/dist/migration-service.d.ts +0 -13
  308. package/dist/migration-service.d.ts.map +0 -1
  309. package/dist/migration-service.js +0 -56
  310. package/dist/migration-service.js.map +0 -1
  311. package/dist/slash-hint-prompt.d.ts +0 -41
  312. package/dist/slash-hint-prompt.d.ts.map +0 -1
  313. package/dist/slash-hint-prompt.js +0 -92
  314. package/dist/slash-hint-prompt.js.map +0 -1
@@ -0,0 +1,117 @@
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)本身作为分隔符**不进入片段**,只解析出语言存进 `lang`;
81
+ * 渲染时由 `contentLines` 依据 `lang` 重新画出围栏行(`​```lang` / `​```),
82
+ * 从而既能按语言高亮代码、又能保留围栏边界。
83
+ */
84
+ export function splitFences(text) {
85
+ const segments = [];
86
+ let buf = [];
87
+ let mode = "text";
88
+ let lang;
89
+ const flush = () => {
90
+ if (buf.length) {
91
+ segments.push(mode === "code"
92
+ ? { type: "code", lang, text: buf.join("\n") }
93
+ : { type: "text", text: buf.join("\n") });
94
+ }
95
+ buf = [];
96
+ };
97
+ for (const line of text.split("\n")) {
98
+ const m = FENCE_RE.exec(line);
99
+ if (m) {
100
+ flush();
101
+ if (mode === "text") {
102
+ mode = "code";
103
+ lang = m[1].trim() || undefined;
104
+ }
105
+ else {
106
+ mode = "text";
107
+ lang = undefined;
108
+ }
109
+ }
110
+ else {
111
+ buf.push(line);
112
+ }
113
+ }
114
+ flush();
115
+ return segments;
116
+ }
117
+ //# 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,34 @@
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 incrementalRendering: true;
29
+ readonly kittyKeyboard: {
30
+ readonly mode: "disabled";
31
+ };
32
+ };
33
+ export declare function runTui(): Promise<void>;
34
+ //# 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;;;;;;;CAOjB,CAAC;AAkLX,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
+ // 只重绘「变化的行」,而不是每帧擦除 + 重写整屏(Ink 默认 false,走 createStandard)。
66
+ // 流式高频下把每帧输出量从 O(屏幕大小) 降到 O(变化量),显著减轻 SSH 带宽 / 背压压力。
67
+ incrementalRendering: true,
68
+ kittyKeyboard: { mode: "disabled" },
69
+ };
70
+ function mount(node) {
71
+ process.stdout.write(CLEAR_SCREEN);
72
+ const instance = render(node, RENDER_OPTIONS);
73
+ activeInstance = instance;
74
+ return instance.waitUntilExit().finally(() => {
75
+ if (activeInstance === instance)
76
+ activeInstance = null;
77
+ });
78
+ }
79
+ // ==================== 端点凭据预检 ====================
80
+ /**
81
+ * 首启凭据门 —— 所选模型绑定的端点缺 API Key 时,先弹出 Ink 原生输入屏。
82
+ *
83
+ * 输入完成(或放弃)后退出该屏,把结果回传给 `mount()` 的返回值。
84
+ */
85
+ function CredentialGate({ config, endpointId }) {
86
+ const { exit } = useApp();
87
+ return (_jsx(ConfigWizard, { config: config, onboarding: true, closeOnSave: true, initialStep: { kind: "edit", field: "apiKey", endpointId }, onSave: saveConfig, onClose: (result) => exit(result) }));
88
+ }
89
+ /**
90
+ * 端点凭据预检:返回 `false` 表示用户放弃配置(调用方应退出)。
91
+ *
92
+ * 配置本身残缺(模型 / 端点不存在)时不在此拦截 —— 交给对话屏报错,
93
+ * 那里可按 `k` 打开配置中心自行修配置。
94
+ */
95
+ async function ensureCredential(modelId) {
96
+ const config = await readConfig();
97
+ const credential = resolveCredential(config, modelId);
98
+ if (!credential || credential.configured)
99
+ return true;
100
+ const result = (await mount(_jsx(CredentialGate, { config: config, endpointId: credential.endpointId })));
101
+ return Boolean(result?.dirty);
102
+ }
103
+ async function resolveTarget() {
104
+ const config = await readConfig();
105
+ const repository = new AgentRepository(AGENTS_DIR);
106
+ const agents = await repository.list();
107
+ const agentId = config.defaultAgent ?? agents[0]?.id;
108
+ let modelId;
109
+ if (agentId) {
110
+ const agent = await repository.read(agentId);
111
+ modelId = agent?.modelId;
112
+ }
113
+ modelId = modelId ?? config.defaultModel ?? config.models[0]?.id;
114
+ if (!modelId) {
115
+ throw new Error("没有可用的模型,请先在配置中添加端点与模型(配置文件 config.json)");
116
+ }
117
+ return { modelId, agentId };
118
+ }
119
+ /** 目标模型是否仍在配置中(续接的会话可能引用了已删除的模型) */
120
+ async function modelExists(modelId) {
121
+ const config = await readConfig();
122
+ return config.models.some((model) => model.id === modelId);
123
+ }
124
+ /** 读取「上一轮会话 id」指针,续接该会话(指针缺失或会话不存在时返回 null) */
125
+ async function resumeLastSession() {
126
+ const pointer = await readLastSession(process.cwd());
127
+ if (!pointer)
128
+ return null;
129
+ const conversation = await conversationRepository.read(pointer.id);
130
+ if (!conversation)
131
+ return null;
132
+ return targetFromMessages({
133
+ modelId: conversation.modelId,
134
+ agentId: conversation.agentId,
135
+ messages: conversation.messages,
136
+ conversationId: conversation.id,
137
+ conversationName: conversation.id,
138
+ });
139
+ }
140
+ /** 从已保存对话构造对话目标 */
141
+ function targetFromMessages(input) {
142
+ return {
143
+ modelId: input.modelId,
144
+ agentId: input.agentId,
145
+ messages: input.messages,
146
+ conversationId: input.conversationId,
147
+ conversationName: input.conversationName,
148
+ };
149
+ }
150
+ // ==================== 对话屏 ====================
151
+ /**
152
+ * 运行对话屏;`/clear`、`/back`、`/load` 通过重挂载(新 Ink 实例 + 原生清屏)实现,
153
+ * 其余退出(退出)直接结束。
154
+ */
155
+ async function runChat(target) {
156
+ let current = target;
157
+ let messages = target.messages;
158
+ let initialInput;
159
+ while (true) {
160
+ const result = await mount(_jsx(Chat, { modelId: current.modelId, agentId: current.agentId, messages: messages, conversationId: current.conversationId, conversationName: current.conversationName, initialInput: initialInput }));
161
+ if (result && typeof result === "object") {
162
+ const value = result;
163
+ if (value.load) {
164
+ // /load:整体切换到另一段已保存对话(含模型 / Agent),重挂载对话屏
165
+ current = {
166
+ modelId: value.load.modelId,
167
+ agentId: value.load.agentId,
168
+ conversationId: value.load.conversationId,
169
+ conversationName: value.load.conversationName,
170
+ };
171
+ messages = value.load.messages;
172
+ initialInput = undefined;
173
+ continue;
174
+ }
175
+ if (value.restart) {
176
+ messages = value.messages ?? messages;
177
+ initialInput = value.initialInput;
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,35 @@
1
+ import { Dispatch, SetStateAction } from "react";
2
+ import type { HandoffMode } from "@ai-zen/agents-sdk";
3
+ import { SelectItem } from "../components.js";
4
+ import { ChatSession } from "../chat-session.js";
5
+ import { WizardStep } from "../config-wizard/index.js";
6
+ export interface ChatCommandHost {
7
+ session: ChatSession;
8
+ /** 通知通道:命令反馈(保存 / 清除 / 迁移结果 …)走独立栏位,不进 messages */
9
+ notice: (text: string, tone?: "info" | "error") => void;
10
+ /** 清屏(保留上下文):把转录显示起点推到最新 */
11
+ clearTranscript: () => void;
12
+ rows: number;
13
+ exit: (arg?: any) => void;
14
+ suspendTerminal: (fn: () => void | Promise<void>) => Promise<void>;
15
+ openWizard: (step: WizardStep) => Promise<void>;
16
+ openKeyEditor: () => Promise<void>;
17
+ doExit: () => void;
18
+ setPickerState: Dispatch<SetStateAction<{
19
+ title: string;
20
+ items: SelectItem<string>[];
21
+ resolve: (value: string | null) => void;
22
+ } | null>>;
23
+ setConfirmState: Dispatch<SetStateAction<{
24
+ question: string;
25
+ resolve: (value: boolean) => void;
26
+ } | null>>;
27
+ setInputText: (text: string) => void;
28
+ }
29
+ /**
30
+ * 解析命令后的执行者参数(`/migrate self`、`/handoff summary`)。
31
+ * 缺省返回 undefined(走服务默认值);非法值也返回 undefined,由调用方报错。
32
+ */
33
+ export declare function parseHandoffMode(raw?: string): HandoffMode | undefined;
34
+ export declare function runCommand(name: string, raw: string, host: ChatCommandHost): Promise<void>;
35
+ //# 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;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAgB,MAAM,oBAAoB,CAAC;AAI/D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAGvD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,mDAAmD;IACnD,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;IACxD,4BAA4B;IAC5B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,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;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAGtE;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkNhG"}