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

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 +930 -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 +85 -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 +364 -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
@@ -1 +1 @@
1
- {"version":3,"file":"step-simple.js","sourceRoot":"","sources":["../../../src/tui/config-wizard/step-simple.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"step-simple.js","sourceRoot":"","sources":["../../../src/tui/config-wizard/step-simple.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +1,15 @@
1
- import { AppConfig } from "@ai-zen/agents-sdk";
1
+ import { AppConfig, ReasoningPresets } from "@ai-zen/agents-sdk";
2
2
  import { McpConfig, McpScope } from "../../config.js";
3
3
  import { AgentKind, AgentStore } from "../../agents-store.js";
4
4
  /** 可编辑的端点字段(首启引导 / `/key` 的直达编辑步骤用) */
5
5
  export type EndpointField = "apiKey" | "baseUrl";
6
- /** 「默认项」的四类目标 */
7
- export type DefaultTarget = "defaultModel" | "defaultImageModel" | "defaultAgent" | "defaultMigrationModel";
6
+ /**
7
+ * 「默认项」的可选目标。
8
+ *
9
+ * 前三个是 id 型默认值(从列表里挑一个);后两个是**中断策略**(固定两档),
10
+ * 改完需要重建会话才生效(宿主按 `sessionOptionsChanged` 判)。
11
+ */
12
+ export type DefaultTarget = "defaultImageModel" | "defaultAgent" | "defaultMigrationModel" | "abortedMessageStrategy" | "abortedToolRoundStrategy";
8
13
  /** 向导步骤(判别联合,逐步收敛) */
9
14
  export type WizardStep = {
10
15
  kind: "menu";
@@ -104,15 +109,33 @@ export interface WizardCloseResult {
104
109
  mcpChanged?: boolean;
105
110
  /** 是否有 Agent 定义改动(宿主据此重建会话,让新定义生效) */
106
111
  agentsChanged?: boolean;
112
+ /**
113
+ * 是否有「建 Agent 时才读的配置」改动(目前是中断策略)——宿主据此重建会话,
114
+ * 否则用户改完策略得自己再敲一次 `/reload` 才生效。
115
+ */
116
+ sessionOptionsChanged?: boolean;
107
117
  }
108
118
  /** MCP 配置快照:全局 + 项目两个作用域 */
109
119
  export interface McpSnapshot {
110
120
  global: McpConfig;
111
121
  project: McpConfig;
122
+ /**
123
+ * 各作用域 mcp.json 读 / 解析失败的原因。
124
+ *
125
+ * 有值 = 该文件已损坏:屏上要写明「无法解析」,但仍让用户继续编辑 ——
126
+ * 保存产出的是一份格式正确的新文件,那就是修复。
127
+ */
128
+ errors?: Partial<Record<McpScope, string>>;
112
129
  }
113
130
  export interface ConfigWizardProps {
114
131
  /** 打开向导时的配置快照 */
115
132
  config: AppConfig;
133
+ /**
134
+ * 思考策略表(`readReasoningPresets()`)。
135
+ *
136
+ * 只用于给模型的「思考策略」字段做合法性校验与提示;不传则不做校验。
137
+ */
138
+ reasoningPresets?: ReasoningPresets;
116
139
  /** 起始步骤(默认配置中心菜单) */
117
140
  initialStep?: WizardStep;
118
141
  /**
@@ -124,6 +147,11 @@ export interface ConfigWizardProps {
124
147
  columns: number;
125
148
  rows: number;
126
149
  };
150
+ /**
151
+ * 打开系统编辑器的实现(默认 `spawnSync`)。测试注入假实现即可,
152
+ * 不必 `vi.mock("child_process")` —— 模块级 mock 全局注册,多文件会互相覆盖。
153
+ */
154
+ openEditor?: (editor: string, file: string) => void;
127
155
  /** 首启引导模式:文案更完整,Esc 语义为「放弃」 */
128
156
  onboarding?: boolean;
129
157
  /** 保存成功后直接关闭(首启引导 / `/key`),否则回到配置中心菜单 */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tui/config-wizard/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tui/config-wizard/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tui/config-wizard/types.ts"],"names":[],"mappings":"AAuCA,2CAA2C;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,CAAC;AACrD,uBAAuB;AACvB,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAC;AACnD,uBAAuB;AACvB,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAAC;AACnD,wCAAwC;AACxC,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tui/config-wizard/types.ts"],"names":[],"mappings":"AAiDA,2CAA2C;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,CAAC;AACrD,uBAAuB;AACvB,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAC;AACnD,uBAAuB;AACvB,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAAC;AACnD,wCAAwC;AACxC,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { PathEntry } from "./mention.js";
2
+ /** 索引有效期:过期后下一次 `@` 重新扫 */
3
+ export declare const INDEX_TTL_MS = 15000;
4
+ /** 扫描超时:到点就用手上已有的部分(git 子进程超时即失败 → 落回 fs.glob) */
5
+ export declare const SCAN_TIMEOUT_MS = 5000;
6
+ /** 索引条数上限 */
7
+ export declare const MAX_ENTRIES = 20000;
8
+ /**
9
+ * `fs.glob` 兜底时的排除项。
10
+ *
11
+ * `node_modules` / `.git` 不是「代码」;`dist` 是本仓的构建产物(已在 .gitignore 里,
12
+ * 走 git 时天然被排除,兜底路径要自己排除)。
13
+ */
14
+ export declare const DEFAULT_EXCLUDES: string[];
15
+ /** 可注入的依赖:扫描是 IO,测试要能不起子进程、不碰真磁盘 */
16
+ export interface FileIndexDeps {
17
+ /** git 清单(相对 cwd)。返回 `null` 表示 git 不可用(不是仓库 / 没装 git) */
18
+ gitPaths?: (cwd: string) => Promise<string[] | null>;
19
+ /** `fs.glob` 兜底 */
20
+ globPaths?: (cwd: string) => Promise<PathEntry[]>;
21
+ now?: () => number;
22
+ }
23
+ /** 清空缓存(测试 / 用户切目录后想强制重扫时用) */
24
+ export declare function invalidateFileIndex(): void;
25
+ /**
26
+ * 把 git 的文件清单补全成「文件 + 祖先目录」条目。
27
+ *
28
+ * git 只列文件,但补全也要能「钻目录」(`@src/tui/` → 继续列其下内容),
29
+ * 所以从每个文件的路径里反推出所有祖先目录。`Set` 去重,顺序上目录在前更好读。
30
+ */
31
+ export declare function fromGitList(names: readonly string[]): PathEntry[];
32
+ /**
33
+ * 取当前项目(cwd)的候选路径,带 15s 缓存。
34
+ *
35
+ * 任何异常都收敛成空数组:补全挂了不该影响用户发消息。
36
+ */
37
+ export declare function listProjectPaths(cwd: string, deps?: FileIndexDeps): Promise<PathEntry[]>;
38
+ //# sourceMappingURL=file-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-index.d.ts","sourceRoot":"","sources":["../../src/tui/file-index.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,2BAA2B;AAC3B,eAAO,MAAM,YAAY,QAAS,CAAC;AACnC,kDAAkD;AAClD,eAAO,MAAM,eAAe,OAAQ,CAAC;AACrC,aAAa;AACb,eAAO,MAAM,WAAW,QAAS,CAAC;AAClC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,UAAqD,CAAC;AAEnF,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,mBAAmB;IACnB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAID,+BAA+B;AAC/B,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE,CAmBjE;AA8BD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAgBlG"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * 项目文件索引 —— 给 `@` 补全提供一份「候选路径清单」,带缓存。
3
+ *
4
+ * ## 为什么 git 优先、`fs.glob` 兜底
5
+ *
6
+ * `git ls-files -co --exclude-standard` 一次同时拿到**已跟踪 + 未跟踪**,且**尊重 .gitignore**
7
+ * (本仓实测 166 条 / 约 30ms)。`fs.promises.glob` 更快(178 条 / 4ms)且不依赖外部进程,
8
+ * 但它不认 .gitignore、也不返回隐藏文件(实测 `.gitignore`、`.ai-zen/` 全丢),所以只当
9
+ * 「不在 git 仓库里」时的兜底。两者都不需要新增依赖:`fs.glob` 是 Node 22+ 内置的。
10
+ *
11
+ * ## 为什么缓存
12
+ *
13
+ * 索引只跟 cwd 有关:一次 `@` 补全里每敲一个键都要重新过滤一遍,不能每键都扫盘。
14
+ * 缓存 15s 后过期(新建的文件能被看到),`invalidateFileIndex()` 供测试与显式刷新。
15
+ *
16
+ * ## 上限
17
+ *
18
+ * 大仓 / `$HOME` 下扫描可能上万条:`MAX_ENTRIES` 封顶、`SCAN_TIMEOUT_MS` 超时即放弃,
19
+ * 拿到多少算多少 —— 补全失败远好过让输入框卡住。
20
+ */
21
+ import { execFile } from "node:child_process";
22
+ import * as fsp from "node:fs/promises";
23
+ import path from "node:path";
24
+ /** 索引有效期:过期后下一次 `@` 重新扫 */
25
+ export const INDEX_TTL_MS = 15_000;
26
+ /** 扫描超时:到点就用手上已有的部分(git 子进程超时即失败 → 落回 fs.glob) */
27
+ export const SCAN_TIMEOUT_MS = 5_000;
28
+ /** 索引条数上限 */
29
+ export const MAX_ENTRIES = 20_000;
30
+ /**
31
+ * `fs.glob` 兜底时的排除项。
32
+ *
33
+ * `node_modules` / `.git` 不是「代码」;`dist` 是本仓的构建产物(已在 .gitignore 里,
34
+ * 走 git 时天然被排除,兜底路径要自己排除)。
35
+ */
36
+ export const DEFAULT_EXCLUDES = ["**/node_modules/**", "**/.git/**", "**/dist/**"];
37
+ let cache = null;
38
+ /** 清空缓存(测试 / 用户切目录后想强制重扫时用) */
39
+ export function invalidateFileIndex() {
40
+ cache = null;
41
+ }
42
+ /**
43
+ * 把 git 的文件清单补全成「文件 + 祖先目录」条目。
44
+ *
45
+ * git 只列文件,但补全也要能「钻目录」(`@src/tui/` → 继续列其下内容),
46
+ * 所以从每个文件的路径里反推出所有祖先目录。`Set` 去重,顺序上目录在前更好读。
47
+ */
48
+ export function fromGitList(names) {
49
+ const dirs = new Set();
50
+ const files = [];
51
+ for (const raw of names) {
52
+ // git 在 Windows 上可能给反斜杠(core.autocrlf 场景),统一成 `/`:候选与插入都用 `/`
53
+ const file = raw.trim().replace(/\\/g, "/");
54
+ if (!file)
55
+ continue;
56
+ files.push(file);
57
+ let idx = file.lastIndexOf("/");
58
+ while (idx > 0) {
59
+ dirs.add(file.slice(0, idx));
60
+ idx = file.lastIndexOf("/", idx - 1);
61
+ }
62
+ if (files.length + dirs.size >= MAX_ENTRIES)
63
+ break;
64
+ }
65
+ const entries = [];
66
+ for (const dir of dirs)
67
+ entries.push({ path: dir, dir: true });
68
+ for (const file of files)
69
+ entries.push({ path: file, dir: false });
70
+ return entries.slice(0, MAX_ENTRIES);
71
+ }
72
+ /** `git ls-files -co --exclude-standard`(路径相对 cwd);失败返回 `null` */
73
+ function gitList(cwd) {
74
+ return new Promise((resolve) => {
75
+ execFile("git", ["ls-files", "-co", "--exclude-standard"], { cwd, timeout: SCAN_TIMEOUT_MS, maxBuffer: 64 * 1024 * 1024 }, (error, stdout) => resolve(error ? null : stdout.split("\n").filter(Boolean)));
76
+ });
77
+ }
78
+ /** 非 git 目录的兜底:`fs.glob` 递归 + 排除表 */
79
+ async function globList(cwd) {
80
+ const entries = [];
81
+ for await (const dirent of fsp.glob("**/*", {
82
+ cwd,
83
+ exclude: DEFAULT_EXCLUDES,
84
+ withFileTypes: true,
85
+ })) {
86
+ const rel = path.relative(cwd, path.join(dirent.parentPath, dirent.name)).replace(/\\/g, "/");
87
+ if (!rel)
88
+ continue;
89
+ entries.push({ path: rel, dir: dirent.isDirectory() });
90
+ if (entries.length >= MAX_ENTRIES)
91
+ break;
92
+ }
93
+ return entries;
94
+ }
95
+ /**
96
+ * 取当前项目(cwd)的候选路径,带 15s 缓存。
97
+ *
98
+ * 任何异常都收敛成空数组:补全挂了不该影响用户发消息。
99
+ */
100
+ export async function listProjectPaths(cwd, deps = {}) {
101
+ const now = deps.now ?? Date.now;
102
+ if (cache && cache.cwd === cwd && now() - cache.at < INDEX_TTL_MS)
103
+ return cache.paths;
104
+ const readGit = deps.gitPaths ?? gitList;
105
+ const readGlob = deps.globPaths ?? globList;
106
+ let paths = [];
107
+ try {
108
+ const tracked = await readGit(cwd);
109
+ paths = tracked ? fromGitList(tracked) : await readGlob(cwd);
110
+ }
111
+ catch {
112
+ paths = [];
113
+ }
114
+ cache = { cwd, paths, at: now() };
115
+ return paths;
116
+ }
117
+ //# sourceMappingURL=file-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-index.js","sourceRoot":"","sources":["../../src/tui/file-index.ts"],"names":[],"mappings":"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"}
@@ -25,9 +25,26 @@
25
25
  export declare const RENDER_OPTIONS: {
26
26
  readonly exitOnCtrlC: false;
27
27
  readonly alternateScreen: false;
28
+ readonly incrementalRendering: true;
28
29
  readonly kittyKeyboard: {
29
30
  readonly mode: "disabled";
30
31
  };
31
32
  };
32
- export declare function runTui(): Promise<void>;
33
+ /** `runTui()` 的可选参数 */
34
+ export interface RunTuiOptions {
35
+ /**
36
+ * 进入对话屏后**自动作为首条消息发送**的内容。
37
+ *
38
+ * 来源只有一处:shell 兜底钩子 `ai --tui --new "$@"`(命令不存在时把原命令带进来)。
39
+ * 不预填到输入框——钩子的语义就是「这条命令跑不了,你帮我处理」,等用户再敲一次回车没有意义。
40
+ */
41
+ initialPrompt?: string;
42
+ /**
43
+ * `--new`:**开一条新会话**,跳过「续接该目录上一轮对话」(`last-session.json` 指针)。
44
+ *
45
+ * 默认(不带 `--new`)保持续接行为:`ai` 回到上次的对话是常用预期。
46
+ */
47
+ newSession?: boolean;
48
+ }
49
+ export declare function runTui(options?: RunTuiOptions): Promise<void>;
33
50
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAqDH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc;aACzB,WAAW;aACX,eAAe;aAGf,oBAAoB;aACpB,aAAa;iBAAI,IAAI,EAAE,UAAU;;CACzB,CAAC;AA8MX,uBAAuB;AACvB,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DvE"}
package/dist/tui/index.js CHANGED
@@ -11,12 +11,17 @@ import { jsx as _jsx } from "react/jsx-runtime";
11
11
  */
12
12
  import { render, useApp } from "ink";
13
13
  import { AgentRepository } from "@ai-zen/agents-sdk";
14
- import { AGENTS_DIR, readConfig, saveConfig } from "../config.js";
14
+ import { AGENTS_DIR, ensureConfigDir, readConfig, saveConfig } from "../config.js";
15
15
  import { resolveCredential } from "../config-editor.js";
16
16
  import { ConfigWizard } from "./config-wizard/index.js";
17
17
  import { conversationRepository } from "../conversation-repository.js";
18
18
  import { readLastSession } from "../session-pointer.js";
19
19
  import { Splash, Chat } from "./screens/index.js";
20
+ import { keyDebugStart } from "./key-debug.js";
21
+ import { disableMouseTracking, enableMouseTracking } from "./mouse.js";
22
+ import { installSdkLogger } from "../sdk-log.js";
23
+ import { initLocale } from "../i18n/preferences.js";
24
+ import { t } from "../i18n/index.js";
20
25
  /** ANSI:清屏 + 光标归位 + 显示光标(屏幕间切换时从头绘制,避免行偏移) */
21
26
  const CLEAR_SCREEN = "\x1b[2J\x1b[H\x1b[?25h";
22
27
  /**
@@ -27,6 +32,13 @@ const CLEAR_SCREEN = "\x1b[2J\x1b[H\x1b[?25h";
27
32
  * 保证退出即干净交还 shell(Windows 下 TTY 写为异步,用回调 + 兜底定时器双保险)。
28
33
  */
29
34
  function farewell() {
35
+ // 先关鼠标上报:不关的话,回到 shell 后每次滚轮都会在提示符前吐一串 `^[[<64;…M`
36
+ try {
37
+ disableMouseTracking();
38
+ }
39
+ catch {
40
+ /* ignore */
41
+ }
30
42
  try {
31
43
  process.stdin.setRawMode?.(false);
32
44
  }
@@ -40,7 +52,7 @@ function farewell() {
40
52
  /* ignore */
41
53
  }
42
54
  const finish = () => process.exit(0);
43
- process.stdout.write("\x1b[?25h\n再见 👋\n", finish);
55
+ process.stdout.write(`\x1b[?25h${t("app.goodbye")}`, finish);
44
56
  setTimeout(finish, 250);
45
57
  }
46
58
  /** 当前活动的 Ink 实例(用于信号处理时兜底卸载) */
@@ -62,13 +74,20 @@ let activeInstance = null;
62
74
  export const RENDER_OPTIONS = {
63
75
  exitOnCtrlC: false,
64
76
  alternateScreen: false,
77
+ // 只重绘「变化的行」,而不是每帧擦除 + 重写整屏(Ink 默认 false,走 createStandard)。
78
+ // 流式高频下把每帧输出量从 O(屏幕大小) 降到 O(变化量),显著减轻 SSH 带宽 / 背压压力。
79
+ incrementalRendering: true,
65
80
  kittyKeyboard: { mode: "disabled" },
66
81
  };
67
82
  function mount(node) {
68
83
  process.stdout.write(CLEAR_SCREEN);
84
+ // 鼠标上报随实例生命周期开关:本 TUI 会反复挂载(启动屏 → 对话 → 配置向导),
85
+ // 每个实例结束时都关掉,避免「已卸载却仍在收鼠标事件」。
86
+ enableMouseTracking();
69
87
  const instance = render(node, RENDER_OPTIONS);
70
88
  activeInstance = instance;
71
89
  return instance.waitUntilExit().finally(() => {
90
+ disableMouseTracking();
72
91
  if (activeInstance === instance)
73
92
  activeInstance = null;
74
93
  });
@@ -97,37 +116,48 @@ async function ensureCredential(modelId) {
97
116
  const result = (await mount(_jsx(CredentialGate, { config: config, endpointId: credential.endpointId })));
98
117
  return Boolean(result?.dirty);
99
118
  }
100
- async function resolveTarget() {
119
+ /**
120
+ * 解析某个 Agent 绑定模型(**唯一真相源**)。
121
+ *
122
+ * 配置层已无 `defaultModel`、会话存档也不再记模型,所以这里缺失就直接报错,
123
+ * 绝不做任何隐式回退——回退正是「状态栏显示 A、实发请求 B」的根源。
124
+ */
125
+ async function modelOf(agentId) {
126
+ const id = agentId || "default";
127
+ // 先跑一次配置初始化:bootstrap 会为缺 modelId 的历史 Agent 补上并落盘。
128
+ // 不做这一步就会读到“未绑定模型”的旧定义,把一次正常的升级变成启动错误。
101
129
  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;
130
+ const agent = await new AgentRepository(AGENTS_DIR).read(id);
131
+ const modelId = agent?.modelId;
111
132
  if (!modelId) {
112
- throw new Error("没有可用的模型,请先在配置中添加端点与模型(配置文件 config.json)");
133
+ throw new Error(t("app.agentNoModel", { id }));
134
+ }
135
+ if (!config.models.some((model) => model.id === modelId)) {
136
+ throw new Error(t("app.agentModelGone", { id, model: modelId }));
113
137
  }
114
- return { modelId, agentId };
138
+ return modelId;
115
139
  }
116
- /** 目标模型是否仍在配置中(续接的会话可能引用了已删除的模型) */
117
- async function modelExists(modelId) {
140
+ async function resolveTarget() {
118
141
  const config = await readConfig();
119
- return config.models.some((model) => model.id === modelId);
142
+ const repository = new AgentRepository(AGENTS_DIR);
143
+ const agents = await repository.list();
144
+ const agentId = config.defaultAgent ?? agents[0]?.id;
145
+ if (!agentId)
146
+ throw new Error(t("app.noAgents"));
147
+ // 校验模型可用(缺失时抛出可读错误,交给启动屏展示)
148
+ await modelOf(agentId);
149
+ return { agentId };
120
150
  }
121
151
  /** 读取「上一轮会话 id」指针,续接该会话(指针缺失或会话不存在时返回 null) */
122
152
  async function resumeLastSession() {
123
153
  const pointer = await readLastSession(process.cwd());
124
154
  if (!pointer)
125
155
  return null;
126
- const conversation = await conversationRepository.read(pointer.id);
156
+ const conversation = await conversationRepository().read(pointer.id);
127
157
  if (!conversation)
128
158
  return null;
159
+ // 模型由 Agent 定义决定(旧存档里的 modelId 一律忽略)
129
160
  return targetFromMessages({
130
- modelId: conversation.modelId,
131
161
  agentId: conversation.agentId,
132
162
  messages: conversation.messages,
133
163
  conversationId: conversation.id,
@@ -137,7 +167,6 @@ async function resumeLastSession() {
137
167
  /** 从已保存对话构造对话目标 */
138
168
  function targetFromMessages(input) {
139
169
  return {
140
- modelId: input.modelId,
141
170
  agentId: input.agentId,
142
171
  messages: input.messages,
143
172
  conversationId: input.conversationId,
@@ -149,65 +178,77 @@ function targetFromMessages(input) {
149
178
  * 运行对话屏;`/clear`、`/back`、`/load` 通过重挂载(新 Ink 实例 + 原生清屏)实现,
150
179
  * 其余退出(退出)直接结束。
151
180
  */
152
- async function runChat(target) {
181
+ async function runChat(target, options = {}) {
153
182
  let current = target;
154
183
  let messages = target.messages;
155
184
  let initialInput;
156
- let clearTranscript = false;
185
+ /** 重挂载后要展示一次的系统提示(如 `/model` 的写入结果,旧实例已卸载,只能传给新屏) */
186
+ let initialNotice;
187
+ /**
188
+ * shell 钩子(`ai --tui --new "$@"`)带来的首条消息。
189
+ * **只发一次**:挂载后置空,否则重挂载(切模型 / `/lang` 等)会反复重发。
190
+ */
191
+ let initialPrompt = options.initialPrompt;
157
192
  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 }));
193
+ const result = await mount(_jsx(Chat, { agentId: current.agentId, messages: messages, conversationId: current.conversationId, conversationName: current.conversationName, initialInput: initialInput, initialNotice: initialNotice, initialPrompt: initialPrompt }));
194
+ initialPrompt = undefined;
159
195
  if (result && typeof result === "object") {
160
196
  const value = result;
161
197
  if (value.load) {
162
- // /load:整体切换到另一段已保存对话(含模型 / Agent),重挂载对话屏
198
+ // /load:整体切换到另一段已保存对话(含 Agent),重挂载对话屏
163
199
  current = {
164
- modelId: value.load.modelId,
165
200
  agentId: value.load.agentId,
166
201
  conversationId: value.load.conversationId,
167
202
  conversationName: value.load.conversationName,
168
203
  };
169
204
  messages = value.load.messages;
170
205
  initialInput = undefined;
171
- clearTranscript = false;
206
+ initialNotice = undefined;
172
207
  continue;
173
208
  }
174
209
  if (value.restart) {
175
210
  messages = value.messages ?? messages;
176
211
  initialInput = value.initialInput;
177
- clearTranscript = Boolean(value.clearTranscript);
212
+ initialNotice = value.notice;
213
+ // `/model` 换模型:Agent 定义里的 modelId 已变,需重建会话(阈值、工具集跟着变)
214
+ if (value.agentId) {
215
+ current = { ...current, agentId: value.agentId };
216
+ }
178
217
  continue;
179
218
  }
180
219
  }
181
220
  return;
182
221
  }
183
222
  }
184
- // ==================== 入口 ====================
185
- export async function runTui() {
223
+ export async function runTui(options = {}) {
186
224
  const uninstallSignals = installSignalSafety();
225
+ // 接管 SDK 全局日志:关掉库自带的 console 兜底。必须在任何 Ink 渲染之前——
226
+ // SDK 的 logger 默认是 console.log,直写 stdout 会把界面撕坏
227
+ // (`load_mcp` 甚至会把整份 manifest 打出来)。AIZ_DEBUG_SDK=1 可改为落盘。
228
+ installSdkLogger();
229
+ // 界面语言必须在任何渲染之前定下来:首次启动按系统语言识别并落盘,
230
+ // 之后以 preferences.json 为准(`/lang` 可随时改)。
231
+ await initLocale();
232
+ // 按键诊断:AIZ_DEBUG_KEYS=1 时把终端环境 + 每次按键写进日志(默认关闭,零开销)
233
+ keyDebugStart();
187
234
  try {
235
+ // 配置初始化必须早于任何 Agent 读取:
236
+ // - 目录 / config.json / 默认 Agent / 出厂策略表都在这里释放;
237
+ // - 历史 Agent 缺 `modelId` 的补齐也在这里(`ensureDefaultAgent`)。
238
+ // 而「续接上一轮会话」这条路径不会经过 `resolveTarget()`,少了这一步,
239
+ // 升级后第一次启动会直接报「Agent 未绑定模型」。
240
+ await ensureConfigDir();
188
241
  // 启动界面(一次性)
189
242
  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) {
243
+ // 直达对话:优先续接「上一轮会话」,否则新建对话。
244
+ // `--new` 跳过续接(不读 last-session.json 指针),直接走新建路径
245
+ let target = options.newSession ? null : await resumeLastSession();
246
+ if (!target) {
206
247
  try {
207
248
  target = await resolveTarget();
208
249
  }
209
250
  catch (error) {
210
- process.stderr.write(`\n✖ 无法启动对话:${error?.message ?? error}\n`);
251
+ process.stderr.write(`\n${t("app.bootFailed", { error: error?.message ?? error })}\n`);
211
252
  }
212
253
  }
213
254
  if (!target) {
@@ -215,11 +256,21 @@ export async function runTui() {
215
256
  return;
216
257
  }
217
258
  // 端点凭据预检:未配置 API Key 时先弹出输入屏,而不是「报错即退出」
218
- if (!(await ensureCredential(target.modelId))) {
259
+ // 模型从 Agent 定义读 —— 与 SDK 实发请求用的是同一个值
260
+ let modelId = null;
261
+ try {
262
+ modelId = await modelOf(target.agentId);
263
+ }
264
+ catch (error) {
265
+ process.stderr.write(`\n${t("app.bootFailed", { error: error?.message ?? error })}\n`);
219
266
  farewell();
220
267
  return;
221
268
  }
222
- await runChat(target);
269
+ if (!(await ensureCredential(modelId))) {
270
+ farewell();
271
+ return;
272
+ }
273
+ await runChat(target, options);
223
274
  farewell();
224
275
  }
225
276
  finally {
@@ -236,6 +287,13 @@ function installSignalSafety() {
236
287
  catch {
237
288
  /* 忽略 */
238
289
  }
290
+ // 任何异常退出路径都要把终端鼠标上报关掉,否则终端会持续把滚轮写成转义序列
291
+ try {
292
+ disableMouseTracking();
293
+ }
294
+ catch {
295
+ /* 忽略 */
296
+ }
239
297
  activeInstance = null;
240
298
  };
241
299
  const onSigint = () => {
@@ -248,7 +306,7 @@ function installSignalSafety() {
248
306
  };
249
307
  const onFatal = (error) => {
250
308
  restore();
251
- process.stderr.write(`\n✖ 意外错误: ${error?.message ?? error}\n`);
309
+ process.stderr.write(`\n${t("app.unexpected", { error: error?.message ?? error })}\n`);
252
310
  process.exit(1);
253
311
  };
254
312
  process.on("SIGINT", onSigint);