@ai-zen/cli 1.0.0-alpha.20 → 1.0.0-alpha.23

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 (261) hide show
  1. package/CHANGELOG.md +205 -0
  2. package/README.md +45 -17
  3. package/README.zh.md +45 -17
  4. package/dist/agent-creator.d.ts.map +1 -1
  5. package/dist/agent-creator.js +32 -10
  6. package/dist/agent-creator.js.map +1 -1
  7. package/dist/agent-switch.d.ts +61 -0
  8. package/dist/agent-switch.d.ts.map +1 -0
  9. package/dist/agent-switch.js +83 -0
  10. package/dist/agent-switch.js.map +1 -0
  11. package/dist/agents-store.d.ts +6 -1
  12. package/dist/agents-store.d.ts.map +1 -1
  13. package/dist/agents-store.js +6 -1
  14. package/dist/agents-store.js.map +1 -1
  15. package/dist/auto-migrate-confirm.d.ts.map +1 -1
  16. package/dist/auto-migrate-confirm.js +2 -1
  17. package/dist/auto-migrate-confirm.js.map +1 -1
  18. package/dist/config-editor.d.ts +9 -1
  19. package/dist/config-editor.d.ts.map +1 -1
  20. package/dist/config-editor.js +30 -19
  21. package/dist/config-editor.js.map +1 -1
  22. package/dist/config.d.ts +1 -1
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +29 -13
  25. package/dist/config.js.map +1 -1
  26. package/dist/conversation-commands/registry.d.ts +123 -4
  27. package/dist/conversation-commands/registry.d.ts.map +1 -1
  28. package/dist/conversation-commands/registry.js +92 -17
  29. package/dist/conversation-commands/registry.js.map +1 -1
  30. package/dist/conversation-persist-plugin.d.ts.map +1 -1
  31. package/dist/conversation-persist-plugin.js +6 -14
  32. package/dist/conversation-persist-plugin.js.map +1 -1
  33. package/dist/conversation-repository.d.ts +68 -14
  34. package/dist/conversation-repository.d.ts.map +1 -1
  35. package/dist/conversation-repository.js +81 -23
  36. package/dist/conversation-repository.js.map +1 -1
  37. package/dist/cwd-tracker-plugin.d.ts.map +1 -1
  38. package/dist/cwd-tracker-plugin.js +6 -2
  39. package/dist/cwd-tracker-plugin.js.map +1 -1
  40. package/dist/format-time.d.ts +17 -6
  41. package/dist/format-time.d.ts.map +1 -1
  42. package/dist/format-time.js +32 -14
  43. package/dist/format-time.js.map +1 -1
  44. package/dist/handoff-service.d.ts.map +1 -1
  45. package/dist/handoff-service.js +22 -19
  46. package/dist/handoff-service.js.map +1 -1
  47. package/dist/hook.d.ts.map +1 -1
  48. package/dist/hook.js +69 -15
  49. package/dist/hook.js.map +1 -1
  50. package/dist/i18n/en-wizard.d.ts +8 -0
  51. package/dist/i18n/en-wizard.d.ts.map +1 -0
  52. package/dist/i18n/en-wizard.js +290 -0
  53. package/dist/i18n/en-wizard.js.map +1 -0
  54. package/dist/i18n/en.d.ts +7 -0
  55. package/dist/i18n/en.d.ts.map +1 -0
  56. package/dist/i18n/en.js +223 -0
  57. package/dist/i18n/en.js.map +1 -0
  58. package/dist/i18n/index.d.ts +57 -0
  59. package/dist/i18n/index.d.ts.map +1 -0
  60. package/dist/i18n/index.js +109 -0
  61. package/dist/i18n/index.js.map +1 -0
  62. package/dist/i18n/preferences.d.ts +34 -0
  63. package/dist/i18n/preferences.d.ts.map +1 -0
  64. package/dist/i18n/preferences.js +69 -0
  65. package/dist/i18n/preferences.js.map +1 -0
  66. package/dist/i18n/zh-wizard.d.ts +11 -0
  67. package/dist/i18n/zh-wizard.d.ts.map +1 -0
  68. package/dist/i18n/zh-wizard.js +293 -0
  69. package/dist/i18n/zh-wizard.js.map +1 -0
  70. package/dist/i18n/zh.d.ts +10 -0
  71. package/dist/i18n/zh.d.ts.map +1 -0
  72. package/dist/i18n/zh.js +227 -0
  73. package/dist/i18n/zh.js.map +1 -0
  74. package/dist/index.js +41 -23
  75. package/dist/index.js.map +1 -1
  76. package/dist/mcp-command.d.ts +32 -0
  77. package/dist/mcp-command.d.ts.map +1 -0
  78. package/dist/mcp-command.js +37 -0
  79. package/dist/mcp-command.js.map +1 -0
  80. package/dist/mode.d.ts +31 -4
  81. package/dist/mode.d.ts.map +1 -1
  82. package/dist/mode.js +42 -7
  83. package/dist/mode.js.map +1 -1
  84. package/dist/model-switch.d.ts.map +1 -1
  85. package/dist/model-switch.js +5 -4
  86. package/dist/model-switch.js.map +1 -1
  87. package/dist/reasoning-effort.d.ts +23 -4
  88. package/dist/reasoning-effort.d.ts.map +1 -1
  89. package/dist/reasoning-effort.js +51 -24
  90. package/dist/reasoning-effort.js.map +1 -1
  91. package/dist/sdk-log.d.ts +23 -16
  92. package/dist/sdk-log.d.ts.map +1 -1
  93. package/dist/sdk-log.js +43 -19
  94. package/dist/sdk-log.js.map +1 -1
  95. package/dist/stdio-runner.d.ts.map +1 -1
  96. package/dist/stdio-runner.js +19 -19
  97. package/dist/stdio-runner.js.map +1 -1
  98. package/dist/sub-agent-guard-plugin.d.ts +5 -2
  99. package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
  100. package/dist/sub-agent-guard-plugin.js +5 -2
  101. package/dist/sub-agent-guard-plugin.js.map +1 -1
  102. package/dist/tui/chat-session.d.ts +73 -0
  103. package/dist/tui/chat-session.d.ts.map +1 -1
  104. package/dist/tui/chat-session.js +167 -33
  105. package/dist/tui/chat-session.js.map +1 -1
  106. package/dist/tui/components.d.ts +43 -2
  107. package/dist/tui/components.d.ts.map +1 -1
  108. package/dist/tui/components.js +97 -4
  109. package/dist/tui/components.js.map +1 -1
  110. package/dist/tui/config-wizard/detail.d.ts +12 -6
  111. package/dist/tui/config-wizard/detail.d.ts.map +1 -1
  112. package/dist/tui/config-wizard/detail.js +33 -32
  113. package/dist/tui/config-wizard/detail.js.map +1 -1
  114. package/dist/tui/config-wizard/engine.d.ts.map +1 -1
  115. package/dist/tui/config-wizard/engine.js +26 -20
  116. package/dist/tui/config-wizard/engine.js.map +1 -1
  117. package/dist/tui/config-wizard/fields.d.ts.map +1 -1
  118. package/dist/tui/config-wizard/fields.js +176 -164
  119. package/dist/tui/config-wizard/fields.js.map +1 -1
  120. package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
  121. package/dist/tui/config-wizard/kv-editor.js +9 -5
  122. package/dist/tui/config-wizard/kv-editor.js.map +1 -1
  123. package/dist/tui/config-wizard/list.d.ts.map +1 -1
  124. package/dist/tui/config-wizard/list.js +2 -1
  125. package/dist/tui/config-wizard/list.js.map +1 -1
  126. package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
  127. package/dist/tui/config-wizard/mcp-helpers.js +4 -3
  128. package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
  129. package/dist/tui/config-wizard/menu.d.ts.map +1 -1
  130. package/dist/tui/config-wizard/menu.js +32 -19
  131. package/dist/tui/config-wizard/menu.js.map +1 -1
  132. package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
  133. package/dist/tui/config-wizard/prompt-editor.js +4 -3
  134. package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
  135. package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
  136. package/dist/tui/config-wizard/prompt.js +8 -7
  137. package/dist/tui/config-wizard/prompt.js.map +1 -1
  138. package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
  139. package/dist/tui/config-wizard/step-agents.js +29 -20
  140. package/dist/tui/config-wizard/step-agents.js.map +1 -1
  141. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
  142. package/dist/tui/config-wizard/step-defaults.js +21 -17
  143. package/dist/tui/config-wizard/step-defaults.js.map +1 -1
  144. package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
  145. package/dist/tui/config-wizard/step-endpoints.js +16 -6
  146. package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
  147. package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
  148. package/dist/tui/config-wizard/step-mcp.js +17 -19
  149. package/dist/tui/config-wizard/step-mcp.js.map +1 -1
  150. package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
  151. package/dist/tui/config-wizard/step-models.js +41 -26
  152. package/dist/tui/config-wizard/step-models.js.map +1 -1
  153. package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
  154. package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
  155. package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
  156. package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
  157. package/dist/tui/config-wizard/step-simple.js +18 -17
  158. package/dist/tui/config-wizard/step-simple.js.map +1 -1
  159. package/dist/tui/index.d.ts +17 -1
  160. package/dist/tui/index.d.ts.map +1 -1
  161. package/dist/tui/index.js +25 -14
  162. package/dist/tui/index.js.map +1 -1
  163. package/dist/tui/input-editing.d.ts +4 -1
  164. package/dist/tui/input-editing.d.ts.map +1 -1
  165. package/dist/tui/input-editing.js +7 -3
  166. package/dist/tui/input-editing.js.map +1 -1
  167. package/dist/tui/phase.d.ts +64 -0
  168. package/dist/tui/phase.d.ts.map +1 -0
  169. package/dist/tui/phase.js +112 -0
  170. package/dist/tui/phase.js.map +1 -0
  171. package/dist/tui/screens/agent-tabs.d.ts +53 -0
  172. package/dist/tui/screens/agent-tabs.d.ts.map +1 -0
  173. package/dist/tui/screens/agent-tabs.js +81 -0
  174. package/dist/tui/screens/agent-tabs.js.map +1 -0
  175. package/dist/tui/screens/chat-commands.d.ts +54 -3
  176. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  177. package/dist/tui/screens/chat-commands.js +469 -330
  178. package/dist/tui/screens/chat-commands.js.map +1 -1
  179. package/dist/tui/screens/chat.d.ts +8 -0
  180. package/dist/tui/screens/chat.d.ts.map +1 -1
  181. package/dist/tui/screens/chat.js +263 -406
  182. package/dist/tui/screens/chat.js.map +1 -1
  183. package/dist/tui/screens/common-keys.d.ts +36 -0
  184. package/dist/tui/screens/common-keys.d.ts.map +1 -0
  185. package/dist/tui/screens/common-keys.js +67 -0
  186. package/dist/tui/screens/common-keys.js.map +1 -0
  187. package/dist/tui/screens/handoff-choice.d.ts.map +1 -1
  188. package/dist/tui/screens/handoff-choice.js +4 -3
  189. package/dist/tui/screens/handoff-choice.js.map +1 -1
  190. package/dist/tui/screens/index.d.ts +3 -1
  191. package/dist/tui/screens/index.d.ts.map +1 -1
  192. package/dist/tui/screens/index.js +2 -1
  193. package/dist/tui/screens/index.js.map +1 -1
  194. package/dist/tui/screens/input-row.d.ts +64 -0
  195. package/dist/tui/screens/input-row.d.ts.map +1 -0
  196. package/dist/tui/screens/input-row.js +67 -0
  197. package/dist/tui/screens/input-row.js.map +1 -0
  198. package/dist/tui/screens/input.d.ts +13 -1
  199. package/dist/tui/screens/input.d.ts.map +1 -1
  200. package/dist/tui/screens/input.js +26 -12
  201. package/dist/tui/screens/input.js.map +1 -1
  202. package/dist/tui/screens/layout.d.ts +15 -0
  203. package/dist/tui/screens/layout.d.ts.map +1 -1
  204. package/dist/tui/screens/layout.js +14 -2
  205. package/dist/tui/screens/layout.js.map +1 -1
  206. package/dist/tui/screens/lines.d.ts.map +1 -1
  207. package/dist/tui/screens/lines.js +6 -6
  208. package/dist/tui/screens/lines.js.map +1 -1
  209. package/dist/tui/screens/messages-view.d.ts.map +1 -1
  210. package/dist/tui/screens/messages-view.js +5 -4
  211. package/dist/tui/screens/messages-view.js.map +1 -1
  212. package/dist/tui/screens/notice-bar.d.ts +5 -0
  213. package/dist/tui/screens/notice-bar.d.ts.map +1 -0
  214. package/dist/tui/screens/notice-bar.js +15 -0
  215. package/dist/tui/screens/notice-bar.js.map +1 -0
  216. package/dist/tui/screens/notice.d.ts +40 -8
  217. package/dist/tui/screens/notice.d.ts.map +1 -1
  218. package/dist/tui/screens/notice.js +75 -15
  219. package/dist/tui/screens/notice.js.map +1 -1
  220. package/dist/tui/screens/overlays.d.ts.map +1 -1
  221. package/dist/tui/screens/overlays.js +3 -2
  222. package/dist/tui/screens/overlays.js.map +1 -1
  223. package/dist/tui/screens/splash.d.ts +1 -1
  224. package/dist/tui/screens/splash.d.ts.map +1 -1
  225. package/dist/tui/screens/splash.js +5 -2
  226. package/dist/tui/screens/splash.js.map +1 -1
  227. package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
  228. package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
  229. package/dist/tui/screens/use-chat-viewport.js +50 -0
  230. package/dist/tui/screens/use-chat-viewport.js.map +1 -0
  231. package/dist/tui/screens/use-input-editing.d.ts +44 -0
  232. package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
  233. package/dist/tui/screens/use-input-editing.js +192 -0
  234. package/dist/tui/screens/use-input-editing.js.map +1 -0
  235. package/dist/tui/screens/use-overlays.d.ts +25 -0
  236. package/dist/tui/screens/use-overlays.d.ts.map +1 -0
  237. package/dist/tui/screens/use-overlays.js +32 -0
  238. package/dist/tui/screens/use-overlays.js.map +1 -0
  239. package/dist/tui/screens/use-wizard-host.d.ts +35 -0
  240. package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
  241. package/dist/tui/screens/use-wizard-host.js +103 -0
  242. package/dist/tui/screens/use-wizard-host.js.map +1 -0
  243. package/dist/tui/status-segments.d.ts +37 -0
  244. package/dist/tui/status-segments.d.ts.map +1 -0
  245. package/dist/tui/status-segments.js +166 -0
  246. package/dist/tui/status-segments.js.map +1 -0
  247. package/dist/tui/text.d.ts +8 -5
  248. package/dist/tui/text.d.ts.map +1 -1
  249. package/dist/tui/text.js +95 -35
  250. package/dist/tui/text.js.map +1 -1
  251. package/dist/tui/theme.d.ts +2 -0
  252. package/dist/tui/theme.d.ts.map +1 -1
  253. package/dist/tui/theme.js +2 -0
  254. package/dist/tui/theme.js.map +1 -1
  255. package/dist/tui/token-rate.d.ts +83 -0
  256. package/dist/tui/token-rate.d.ts.map +1 -0
  257. package/dist/tui/token-rate.js +195 -0
  258. package/dist/tui/token-rate.js.map +1 -0
  259. package/dist/types.d.ts +0 -3
  260. package/dist/types.d.ts.map +1 -1
  261. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"file":"input-editing.d.ts","sourceRoot":"","sources":["../../src/tui/input-editing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAU9E;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhE;AAGD,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAiB,GAAG,MAAM,EAAE,CAIzF;AAED,mDAAmD;AACnD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAID,qCAAqC;AACrC,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,8BAA8B;AAC9B,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,SAAa,GAAG,SAAS,EAAE,CAI9F;AAED,0BAA0B;AAC1B,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,EAAE,CAAA;CAAE,GAAG,IAAI,CAG1F"}
1
+ {"version":3,"file":"input-editing.d.ts","sourceRoot":"","sources":["../../src/tui/input-editing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,6BAA6B;AAC7B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAU9E;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhE;AAGD,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAiB,GAAG,MAAM,EAAE,CAIzF;AAED,mDAAmD;AACnD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAID,qCAAqC;AACrC,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,8BAA8B;AAC9B,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,SAAa,GAAG,SAAS,EAAE,CAI9F;AAED,0BAA0B;AAC1B,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,SAAS,EAAE,CAAA;CAAE,GAAG,IAAI,CAG1F"}
@@ -4,10 +4,14 @@
4
4
  * 全部函数都是「(文本, 光标) → (文本, 光标)」的纯变换,便于单测;
5
5
  * chat.tsx 只负责把按键映射过来、套用结果、维护 kill ring 与撤销栈。
6
6
  *
7
+ * 光标单位是**字素簇**(`graphemes`),不是 code point:`✌️` 是 2 个 code point
8
+ * 但只是 1 个簇,按 code point 删会只删掉半个 emoji、留下孤立的变体选择符。
9
+ *
7
10
  * 键位语义依据 Claude Code 官方文档(interactive-mode.md):
8
11
  * - `Ctrl+W` 删到**前一空白**(标点不切分:`src/utils/foo.ts` 一次删掉整条路径)
9
12
  * - `Alt+B/F/D` 按「词」处理(标点算分隔符:停在 `ts` / `foo` / `utils` / `src`)
10
13
  */
14
+ import { graphemes } from "./text.js";
11
15
  function clampCursor(chars, cursor) {
12
16
  return Math.max(0, Math.min(cursor, chars.length));
13
17
  }
@@ -18,7 +22,7 @@ function clampCursor(chars, cursor) {
18
22
  * 因此 `src/utils/foo.ts` 会被整段删除,而不是只删 `foo.ts`。
19
23
  */
20
24
  export function deleteToPrevWhitespace(text, cursor) {
21
- const chars = Array.from(text);
25
+ const chars = graphemes(text);
22
26
  const cp = clampCursor(chars, cursor);
23
27
  let from = cp;
24
28
  while (from > 0 && /\s/.test(chars[from - 1]))
@@ -37,8 +41,8 @@ export function deleteToPrevWhitespace(text, cursor) {
37
41
  * 免去每个删除函数各自返回「删了什么」。
38
42
  */
39
43
  export function killedText(before, after) {
40
- const a = Array.from(before);
41
- const b = Array.from(after);
44
+ const a = graphemes(before);
45
+ const b = graphemes(after);
42
46
  let prefix = 0;
43
47
  while (prefix < b.length && a[prefix] === b[prefix])
44
48
  prefix += 1;
@@ -1 +1 @@
1
- {"version":3,"file":"input-editing.js","sourceRoot":"","sources":["../../src/tui/input-editing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"input-editing.js","sourceRoot":"","sources":["../../src/tui/input-editing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 生成阶段 —— 消息栏那一行提示的六态判定(纯逻辑,不依赖 React / Ink / SDK)
3
+ *
4
+ * 原先那里只有一个「思考中…」,但一轮对话里模型实际会走过几个阶段,用同一个词概括
5
+ * 在多数时候是**说错话**:等首 token 时并没有在思考,工具执行时更是模型根本没在跑。
6
+ * 于是按数据来源把阶段拆细:
7
+ *
8
+ * | 阶段 | 判据 | 用户真正关心什么 |
9
+ * |------|------|------------------|
10
+ * | `connecting` | `onInnerLoopStart`(请求即将发出)→ `open`(响应头到达) | 是不是网络卡住了 |
11
+ * | `queued` | `open` 之后、首个内容 chunk 之前 | 服务端排队 / 冷启动,还没开始吐字 |
12
+ * | `thinking` | 收到 `reasoning_content` delta | 推理模型中 |
13
+ * | `tool-calling` | 收到 `tool_calls` / `function_call` delta | 模型正在决定调哪个工具、拼参数 |
14
+ * | `tool-waiting` | 流结束(`parsed`)且该轮带工具调用 | 工具在执行,等结果回来才能继续 |
15
+ * | `streaming` | 收到 `content` delta | 正在输出正文 |
16
+ *
17
+ * 判据只用**事件与 delta 的形状**,不读文案、不猜时序;多轮工具调用时阶段会自然
18
+ * 回到 `connecting`(下一轮请求前由插件钩子重置)。
19
+ */
20
+ /** 生成阶段(见文件头表格) */
21
+ export type PhaseKind = "connecting" | "queued" | "thinking" | "tool-calling" | "tool-waiting" | "streaming";
22
+ export interface PhaseInfo {
23
+ kind: PhaseKind;
24
+ /** 工具名(`tool-calling` / `tool-waiting` 时有值;流式早期可能还没吐到 name) */
25
+ tool?: string;
26
+ }
27
+ /**
28
+ * 阶段跟踪器。生命周期由 `ChatSession` 驱动:
29
+ * `connecting()` → `opened()` → 若干 `delta()` → `streamEnded()` →(下一轮)`connecting()` …
30
+ * 一轮结束调 `reset()`。
31
+ */
32
+ export declare class PhaseTracker {
33
+ private current;
34
+ /** 当前阶段;空闲(没有在生成的轮次)时为 null */
35
+ get phase(): PhaseInfo | null;
36
+ /** 清空(一轮结束 / 重建会话时调用) */
37
+ reset(): void;
38
+ /** 请求已发出、等响应头(DNS / TCP / TLS / 服务端受理都在这一段) */
39
+ connecting(): void;
40
+ /**
41
+ * 响应头已到(SDK 的 `open` 事件)——连接建立,进入「等首 token」。
42
+ *
43
+ * 注意不能在这里直接进 `thinking`:`open` 只说明服务端受理了请求,
44
+ * 推理模型冷启动排几十秒是常事,那段等待被叫成「思考中」就是在骗人。
45
+ */
46
+ opened(): void;
47
+ /**
48
+ * 收到一个流式 chunk:按 delta 的实际内容推进阶段。
49
+ *
50
+ * 优先级是 `tool_calls` > `content` > `reasoning_content`:一个 chunk 里同时出现
51
+ * 时,靠后的才代表「模型现在在干什么」(决定调工具 → 工具参数;已经出正文 →
52
+ * 思考阶段结束)。三者都没有(如只带 `usage` 的收尾 chunk)则保持原阶段不变。
53
+ */
54
+ delta(chunk: unknown): void;
55
+ /**
56
+ * 流结束(SDK 的 `parsed` 事件,参数是本轮 assistant 消息)。
57
+ *
58
+ * 本轮带工具调用 → 接下来是工具执行,模型不在跑;不带 → 由调用方 `reset()`。
59
+ */
60
+ streamEnded(receiver: unknown): void;
61
+ }
62
+ /** 阶段对应的提示文案(中英由词典决定,这里只做分发) */
63
+ export declare function phaseLabel(phase: PhaseInfo | null): string;
64
+ //# sourceMappingURL=phase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase.d.ts","sourceRoot":"","sources":["../../src/tui/phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,mBAAmB;AACnB,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,cAAc,GACd,cAAc,GACd,WAAW,CAAC;AAEhB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA0B;IAEzC,+BAA+B;IAC/B,IAAI,KAAK,IAAI,SAAS,GAAG,IAAI,CAE5B;IAED,yBAAyB;IACzB,KAAK,IAAI,IAAI;IAIb,+CAA+C;IAC/C,UAAU,IAAI,IAAI;IAIlB;;;;;OAKG;IACH,MAAM,IAAI,IAAI;IAId;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAqB3B;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;CAQrC;AAED,gCAAgC;AAChC,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,CAoB1D"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * 生成阶段 —— 消息栏那一行提示的六态判定(纯逻辑,不依赖 React / Ink / SDK)
3
+ *
4
+ * 原先那里只有一个「思考中…」,但一轮对话里模型实际会走过几个阶段,用同一个词概括
5
+ * 在多数时候是**说错话**:等首 token 时并没有在思考,工具执行时更是模型根本没在跑。
6
+ * 于是按数据来源把阶段拆细:
7
+ *
8
+ * | 阶段 | 判据 | 用户真正关心什么 |
9
+ * |------|------|------------------|
10
+ * | `connecting` | `onInnerLoopStart`(请求即将发出)→ `open`(响应头到达) | 是不是网络卡住了 |
11
+ * | `queued` | `open` 之后、首个内容 chunk 之前 | 服务端排队 / 冷启动,还没开始吐字 |
12
+ * | `thinking` | 收到 `reasoning_content` delta | 推理模型中 |
13
+ * | `tool-calling` | 收到 `tool_calls` / `function_call` delta | 模型正在决定调哪个工具、拼参数 |
14
+ * | `tool-waiting` | 流结束(`parsed`)且该轮带工具调用 | 工具在执行,等结果回来才能继续 |
15
+ * | `streaming` | 收到 `content` delta | 正在输出正文 |
16
+ *
17
+ * 判据只用**事件与 delta 的形状**,不读文案、不猜时序;多轮工具调用时阶段会自然
18
+ * 回到 `connecting`(下一轮请求前由插件钩子重置)。
19
+ */
20
+ import { t } from "../i18n/index.js";
21
+ /**
22
+ * 阶段跟踪器。生命周期由 `ChatSession` 驱动:
23
+ * `connecting()` → `opened()` → 若干 `delta()` → `streamEnded()` →(下一轮)`connecting()` …
24
+ * 一轮结束调 `reset()`。
25
+ */
26
+ export class PhaseTracker {
27
+ current = null;
28
+ /** 当前阶段;空闲(没有在生成的轮次)时为 null */
29
+ get phase() {
30
+ return this.current;
31
+ }
32
+ /** 清空(一轮结束 / 重建会话时调用) */
33
+ reset() {
34
+ this.current = null;
35
+ }
36
+ /** 请求已发出、等响应头(DNS / TCP / TLS / 服务端受理都在这一段) */
37
+ connecting() {
38
+ this.current = { kind: "connecting" };
39
+ }
40
+ /**
41
+ * 响应头已到(SDK 的 `open` 事件)——连接建立,进入「等首 token」。
42
+ *
43
+ * 注意不能在这里直接进 `thinking`:`open` 只说明服务端受理了请求,
44
+ * 推理模型冷启动排几十秒是常事,那段等待被叫成「思考中」就是在骗人。
45
+ */
46
+ opened() {
47
+ this.current = { kind: "queued" };
48
+ }
49
+ /**
50
+ * 收到一个流式 chunk:按 delta 的实际内容推进阶段。
51
+ *
52
+ * 优先级是 `tool_calls` > `content` > `reasoning_content`:一个 chunk 里同时出现
53
+ * 时,靠后的才代表「模型现在在干什么」(决定调工具 → 工具参数;已经出正文 →
54
+ * 思考阶段结束)。三者都没有(如只带 `usage` 的收尾 chunk)则保持原阶段不变。
55
+ */
56
+ delta(chunk) {
57
+ const delta = chunk?.choices?.[0]?.delta;
58
+ if (!delta || typeof delta !== "object")
59
+ return;
60
+ const toolCall = Array.isArray(delta.tool_calls) ? delta.tool_calls[0] : undefined;
61
+ if (toolCall || delta.function_call) {
62
+ // 工具名只在首个 delta 里给出,后续 delta 只带参数片段 → 沿用已知的名字
63
+ const name = toolCall?.function?.name || delta.function_call?.name || this.current?.tool;
64
+ this.current = { kind: "tool-calling", tool: name || undefined };
65
+ return;
66
+ }
67
+ if (delta.content) {
68
+ this.current = { kind: "streaming" };
69
+ return;
70
+ }
71
+ if (delta.reasoning_content) {
72
+ this.current = { kind: "thinking" };
73
+ }
74
+ }
75
+ /**
76
+ * 流结束(SDK 的 `parsed` 事件,参数是本轮 assistant 消息)。
77
+ *
78
+ * 本轮带工具调用 → 接下来是工具执行,模型不在跑;不带 → 由调用方 `reset()`。
79
+ */
80
+ streamEnded(receiver) {
81
+ const message = receiver;
82
+ const calls = Array.isArray(message?.tool_calls) ? message.tool_calls : [];
83
+ if (calls.length === 0 && !message?.function_call)
84
+ return;
85
+ const name = calls[0]?.function?.name || message?.function_call?.name || this.current?.tool;
86
+ this.current = { kind: "tool-waiting", tool: name || undefined };
87
+ }
88
+ }
89
+ /** 阶段对应的提示文案(中英由词典决定,这里只做分发) */
90
+ export function phaseLabel(phase) {
91
+ if (!phase)
92
+ return t("phase.working");
93
+ switch (phase.kind) {
94
+ case "connecting":
95
+ return t("phase.connecting");
96
+ case "queued":
97
+ return t("phase.queued");
98
+ case "thinking":
99
+ return t("phase.thinking");
100
+ case "streaming":
101
+ return t("phase.streaming");
102
+ case "tool-calling":
103
+ return phase.tool
104
+ ? t("phase.toolCallingWith", { name: phase.tool })
105
+ : t("phase.toolCalling");
106
+ case "tool-waiting":
107
+ return phase.tool
108
+ ? t("phase.toolWaitingWith", { name: phase.tool })
109
+ : t("phase.toolWaiting");
110
+ }
111
+ }
112
+ //# sourceMappingURL=phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase.js","sourceRoot":"","sources":["../../src/tui/phase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /** 一个可切换的 Agent 条目 */
2
+ export interface AgentTab {
3
+ /** 稳定 id:`"main"` 或子 Agent 视图 id */
4
+ id: string;
5
+ /** 展示名(主 Agent 用 `agentTabs.main`,子 Agent 用 `agentTabs.sub` 带序号) */
6
+ label: string;
7
+ /** 执行状态;undefined = 不画圆点(主 Agent 的忙碌由输入行的 Spinner 表示) */
8
+ status?: AgentTabStatus;
9
+ }
10
+ /** 子 Agent 的执行状态 */
11
+ export type AgentTabStatus = "running" | "done" | "failed";
12
+ /**
13
+ * 状态符号:三种状态**同形不同色**(蓝 / 绿 / 红)。
14
+ *
15
+ * 用 `◈`(U+25C8):比 `•` 更像个「状态指示符」,又不像 `●` 那样把一行密集文本撑得松散。
16
+ * 符号位于标签**之前**,使各标签的文字起始位置对齐。
17
+ */
18
+ export declare const AGENT_STATUS_DOT = "\u25C8";
19
+ /**
20
+ * 状态圆点的颜色 —— 状态的**唯一视觉真相**。
21
+ *
22
+ * 运行中在「亮蓝 ↔ 暗」之间交替(闪烁),其余状态恒定。抽成纯函数是因为颜色没法在
23
+ * 测试里断言(`ink-testing-library` 的 stdout 不是 TTY,Ink 不输出 ANSI)。
24
+ *
25
+ * @param blinkOn 仅对 `running` 有意义:false 时返回暗色,形成一亮一暗的闪烁
26
+ */
27
+ export declare function agentStatusColor(status: AgentTabStatus, blinkOn?: boolean): string;
28
+ /** 闪烁周期(毫秒):一亮一暗为一个完整周期 */
29
+ export declare const AGENT_BLINK_MS = 500;
30
+ /**
31
+ * 运行中时返回随时间翻转的开关(其余时候恒为 true,且不启定时器)。
32
+ *
33
+ * 定时器只在本组件内驱动自己的重渲染,不牵动上层:`AgentTabs` 的 state 变化只影响
34
+ * 它自己这一行。
35
+ */
36
+ export declare function useBlink(active: boolean, intervalMs?: number): boolean;
37
+ /**
38
+ * 单个栏目的样式 —— 高亮规则的**唯一真相源**(组件与测试共用)。
39
+ *
40
+ * 抽成纯函数是因为颜色没法在测试里断言,只能锁样式契约。
41
+ */
42
+ export declare function agentTabStyle(active: boolean): {
43
+ color: string;
44
+ bold: boolean;
45
+ backgroundColor?: string;
46
+ };
47
+ export interface AgentTabsProps {
48
+ tabs: readonly AgentTab[];
49
+ /** 当前选中的 id;不在 `tabs` 里时按「主 Agent」处理 */
50
+ activeId: string;
51
+ }
52
+ export declare function AgentTabs({ tabs, activeId }: AgentTabsProps): import("react").JSX.Element;
53
+ //# sourceMappingURL=agent-tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-tabs.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/agent-tabs.tsx"],"names":[],"mappings":"AAgBA,sBAAsB;AACtB,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,oBAAoB;AACpB,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,WAAM,CAAC;AAEpC;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,UAAO,GAAG,MAAM,CAG/E;AAED,2BAA2B;AAC3B,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,SAAiB,GAAG,OAAO,CAW9E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAOA;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,cAAc,+BA0B3D"}
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Agent 栏目 —— 主 Agent 与各子 Agent 之间的切换条。
3
+ //
4
+ // 位置固定在「消息列表下方、通知栏上方」:它切换的是消息列表的内容,所以要紧贴
5
+ // 被它控制的那块区域。行为(何时出现、左右键怎么分流)在 chat.tsx,这里只负责画。
6
+ //
7
+ // 宽度:整条栏目**恰好占一行**。它参与 `computeChatLayout` 的底部高度预算,一旦
8
+ // Ink 自己折出第二行,整帧就会比预算高一行、把输入框顶出屏幕。
9
+ // 所以外层 `<Text wrap="truncate">` 兜住宽度,内层嵌套 `<Text>` 保住逐项着色
10
+ // (Ink 里截断发生在带 `wrap` 的那一层,不会把内层样式丢掉)。
11
+ //
12
+ // 执行状态内联在标签**前**(一个圆点 + 颜色),不另推通知:通知栏凭空多一行会让整帧
13
+ // 高度跳一下。运行中的圆点会闪烁(亮蓝 ↔ 暗),完成后恒为绿色,失败恒为红色。
14
+ import { useEffect, useState } from "react";
15
+ import { Box, Text } from "ink";
16
+ import { theme } from "../theme.js";
17
+ /**
18
+ * 状态符号:三种状态**同形不同色**(蓝 / 绿 / 红)。
19
+ *
20
+ * 用 `◈`(U+25C8):比 `•` 更像个「状态指示符」,又不像 `●` 那样把一行密集文本撑得松散。
21
+ * 符号位于标签**之前**,使各标签的文字起始位置对齐。
22
+ */
23
+ export const AGENT_STATUS_DOT = "◈";
24
+ /**
25
+ * 状态圆点的颜色 —— 状态的**唯一视觉真相**。
26
+ *
27
+ * 运行中在「亮蓝 ↔ 暗」之间交替(闪烁),其余状态恒定。抽成纯函数是因为颜色没法在
28
+ * 测试里断言(`ink-testing-library` 的 stdout 不是 TTY,Ink 不输出 ANSI)。
29
+ *
30
+ * @param blinkOn 仅对 `running` 有意义:false 时返回暗色,形成一亮一暗的闪烁
31
+ */
32
+ export function agentStatusColor(status, blinkOn = true) {
33
+ if (status === "running")
34
+ return blinkOn ? theme.running : theme.faint;
35
+ return status === "done" ? theme.ok : theme.error;
36
+ }
37
+ /** 闪烁周期(毫秒):一亮一暗为一个完整周期 */
38
+ export const AGENT_BLINK_MS = 500;
39
+ /**
40
+ * 运行中时返回随时间翻转的开关(其余时候恒为 true,且不启定时器)。
41
+ *
42
+ * 定时器只在本组件内驱动自己的重渲染,不牵动上层:`AgentTabs` 的 state 变化只影响
43
+ * 它自己这一行。
44
+ */
45
+ export function useBlink(active, intervalMs = AGENT_BLINK_MS) {
46
+ const [on, setOn] = useState(true);
47
+ useEffect(() => {
48
+ if (!active) {
49
+ setOn(true);
50
+ return;
51
+ }
52
+ const timer = setInterval(() => setOn((value) => !value), intervalMs);
53
+ return () => clearInterval(timer);
54
+ }, [active, intervalMs]);
55
+ return on;
56
+ }
57
+ /**
58
+ * 单个栏目的样式 —— 高亮规则的**唯一真相源**(组件与测试共用)。
59
+ *
60
+ * 抽成纯函数是因为颜色没法在测试里断言,只能锁样式契约。
61
+ */
62
+ export function agentTabStyle(active) {
63
+ return {
64
+ color: active ? theme.assistant : theme.faint,
65
+ bold: active,
66
+ // 背景色块比改字色更能一眼看出「现在看的是谁」;非活动项必须没有背景,否则整条都是高亮
67
+ backgroundColor: active ? theme.border : undefined,
68
+ };
69
+ }
70
+ export function AgentTabs({ tabs, activeId }) {
71
+ // 只要有一个子 Agent 在跑就闪——整条栏目共用一个节奏,避免几个圆点各闪各的
72
+ const blinkOn = useBlink(tabs.some((tab) => tab.status === "running"));
73
+ return (_jsx(Box, { children: _jsx(Text, { wrap: "truncate", children: tabs.map((tab) => {
74
+ const active = tab.id === activeId;
75
+ // 左右各一个空格作为选项**自身**的 padding(落在高亮块内部),而不是把分隔空格
76
+ // 拼在下一个选项里——后者会让高亮底色贴住上一个选项的文案。
77
+ // 也不靠外层 Box 的 paddingX:那样首个选项的文字会整体右移一格,与 ❯ / 分隔线不齐。
78
+ return (_jsxs(Text, { ...agentTabStyle(active), children: [" ", tab.status ? (_jsx(Text, { color: agentStatusColor(tab.status, blinkOn), children: AGENT_STATUS_DOT })) : null, tab.label, " "] }, tab.id));
79
+ }) }) }));
80
+ }
81
+ //# sourceMappingURL=agent-tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-tabs.js","sourceRoot":"","sources":["../../../src/tui/screens/agent-tabs.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import { Dispatch, SetStateAction } from "react";
1
+ import type { Dispatch, SetStateAction } from "react";
2
2
  import type { HandoffMode } from "@ai-zen/agents-sdk";
3
3
  import { SelectItem } from "../components.js";
4
4
  import { ChatSession } from "../chat-session.js";
5
+ import { type CommandName } from "../../conversation-commands/registry.js";
5
6
  import { WizardStep } from "../config-wizard/index.js";
6
7
  export interface ChatCommandHost {
7
8
  session: ChatSession;
@@ -25,13 +26,63 @@ export interface ChatCommandHost {
25
26
  resolve: (value: boolean) => void;
26
27
  } | null>>;
27
28
  setInputText: (text: string) => void;
28
- /** 更新状态栏的思考强度展示(`/think` 写入后由上层重取) */
29
- setEffortText: (text: string) => void;
29
+ /** 更新状态栏的思考强度展示(`/think` 写入后由上层重取);文案与置灰一起给,避免漂移 */
30
+ setEffortView: (view: {
31
+ text: string;
32
+ dimmed: boolean;
33
+ } | null) => void;
34
+ /**
35
+ * 触发一次界面重渲染(`/lang` 切换语言后用)。
36
+ *
37
+ * `t()` 是模块级函数,语言一变,已渲染的文案不会自己更新 —— 必须让 React
38
+ * 重新执行一遍渲染函数才能取到新语言。这里只递增一个计数,不携带任何状态。
39
+ */
40
+ refreshLocale: () => void;
41
+ }
42
+ /**
43
+ * 执行者参数(`/migrate self`)的解析结果。
44
+ *
45
+ * 分成「合法值」与「非法原值」两个字段,而不是一个 boolean + 一个 `string | undefined`:
46
+ * 调用方一看到 `invalid` 有值就能直接回显,不需要靠类型收窄去猜。
47
+ */
48
+ export interface HandoffSelection {
49
+ /** 显式指定且合法的执行者(`self` / `summary`);未指定为 `undefined` */
50
+ mode: HandoffMode | undefined;
51
+ /** 显式指定但不合法的原值(报错回显用) */
52
+ invalid: string | undefined;
53
+ }
54
+ /** 单个命令的执行上下文:宿主能力 + 已解析的参数 */
55
+ export interface CommandContext extends ChatCommandHost {
56
+ /** 命中命令的**主名**(别名已归一:`/effort` → `think`、`/quit` → `exit`) */
57
+ name: CommandName;
58
+ /** 原始输入(含 `/`),用于「未知命令」等场景回显 */
59
+ raw: string;
60
+ /** 首个 token 之后的参数(`/migrate summary` → `["summary"]`) */
61
+ args: string[];
62
+ /** 通知(默认 info 语气) */
63
+ push: (text: string, tone?: "info" | "error") => void;
64
+ /**
65
+ * 弹选择器并等用户作答(取消为 `null`),由各命令自己决定取消后说什么。
66
+ */
67
+ pick: (title: string, items: SelectItem<string>[]) => Promise<string | null>;
30
68
  }
31
69
  /**
32
70
  * 解析命令后的执行者参数(`/migrate self`、`/handoff summary`)。
33
71
  * 缺省返回 undefined(走服务默认值);非法值也返回 undefined,由调用方报错。
34
72
  */
35
73
  export declare function parseHandoffMode(raw?: string): HandoffMode | undefined;
74
+ /**
75
+ * 解析 `/handoff` `/migrate` 的执行者参数。
76
+ *
77
+ * 单独成函数而不是挂在 `CommandContext` 上:16 个命令里只有这两个用得到,
78
+ * 挂在上下文中会让另外 14 个命令(`/save` `/help` `/clear` …)每次也白算一遍。
79
+ */
80
+ export declare function parseHandoffSelection(args: readonly string[]): HandoffSelection;
81
+ /**
82
+ * 执行一条斜杠命令。
83
+ *
84
+ * @param name 命令名(含别名,大小写不敏感;由 `parseCommandInput()` 从输入里取出)
85
+ * @param raw 原始输入(含 `/`),用于参数解析与错误回显
86
+ */
36
87
  export declare function runCommand(name: string, raw: string, host: ChatCommandHost): Promise<void>;
37
88
  //# sourceMappingURL=chat-commands.d.ts.map
@@ -1 +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;AAe/D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,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;IACrC,sCAAsC;IACtC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;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,CAmXhG"}
1
+ {"version":3,"file":"chat-commands.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/chat-commands.ts"],"names":[],"mappings":"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"}