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

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 (181) hide show
  1. package/CHANGELOG.md +356 -0
  2. package/README.md +99 -28
  3. package/README.zh.md +99 -28
  4. package/dist/agent-creator.d.ts +11 -0
  5. package/dist/agent-creator.d.ts.map +1 -1
  6. package/dist/agent-creator.js +20 -11
  7. package/dist/agent-creator.js.map +1 -1
  8. package/dist/agents-store.d.ts.map +1 -1
  9. package/dist/agents-store.js +40 -3
  10. package/dist/agents-store.js.map +1 -1
  11. package/dist/auto-migrate-confirm.d.ts +43 -0
  12. package/dist/auto-migrate-confirm.d.ts.map +1 -0
  13. package/dist/auto-migrate-confirm.js +46 -0
  14. package/dist/auto-migrate-confirm.js.map +1 -0
  15. package/dist/config-editor.d.ts +4 -4
  16. package/dist/config-editor.d.ts.map +1 -1
  17. package/dist/config-editor.js +6 -8
  18. package/dist/config-editor.js.map +1 -1
  19. package/dist/config.d.ts +23 -2
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +26 -2
  22. package/dist/config.js.map +1 -1
  23. package/dist/conversation-commands/registry.d.ts.map +1 -1
  24. package/dist/conversation-commands/registry.js +4 -1
  25. package/dist/conversation-commands/registry.js.map +1 -1
  26. package/dist/conversation-persist-plugin.d.ts +0 -1
  27. package/dist/conversation-persist-plugin.d.ts.map +1 -1
  28. package/dist/conversation-persist-plugin.js +2 -3
  29. package/dist/conversation-persist-plugin.js.map +1 -1
  30. package/dist/conversation-repository.d.ts +5 -1
  31. package/dist/conversation-repository.d.ts.map +1 -1
  32. package/dist/conversation-repository.js +1 -2
  33. package/dist/conversation-repository.js.map +1 -1
  34. package/dist/handoff-service.d.ts +19 -0
  35. package/dist/handoff-service.d.ts.map +1 -0
  36. package/dist/handoff-service.js +86 -0
  37. package/dist/handoff-service.js.map +1 -0
  38. package/dist/index.js +21 -3
  39. package/dist/index.js.map +1 -1
  40. package/dist/model-switch.d.ts +58 -0
  41. package/dist/model-switch.d.ts.map +1 -0
  42. package/dist/model-switch.js +61 -0
  43. package/dist/model-switch.js.map +1 -0
  44. package/dist/reasoning-effort.d.ts +77 -0
  45. package/dist/reasoning-effort.d.ts.map +1 -0
  46. package/dist/reasoning-effort.js +137 -0
  47. package/dist/reasoning-effort.js.map +1 -0
  48. package/dist/reasoning-presets.d.ts +34 -0
  49. package/dist/reasoning-presets.d.ts.map +1 -0
  50. package/dist/reasoning-presets.js +85 -0
  51. package/dist/reasoning-presets.js.map +1 -0
  52. package/dist/sdk-log.d.ts +48 -0
  53. package/dist/sdk-log.d.ts.map +1 -0
  54. package/dist/sdk-log.js +67 -0
  55. package/dist/sdk-log.js.map +1 -0
  56. package/dist/session-pointer.d.ts +22 -9
  57. package/dist/session-pointer.d.ts.map +1 -1
  58. package/dist/session-pointer.js +55 -23
  59. package/dist/session-pointer.js.map +1 -1
  60. package/dist/stdio-runner.d.ts.map +1 -1
  61. package/dist/stdio-runner.js +15 -13
  62. package/dist/stdio-runner.js.map +1 -1
  63. package/dist/sub-agent-guard-plugin.d.ts +5 -5
  64. package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
  65. package/dist/sub-agent-guard-plugin.js +7 -7
  66. package/dist/sub-agent-guard-plugin.js.map +1 -1
  67. package/dist/tui/chat-session.d.ts +83 -59
  68. package/dist/tui/chat-session.d.ts.map +1 -1
  69. package/dist/tui/chat-session.js +161 -105
  70. package/dist/tui/chat-session.js.map +1 -1
  71. package/dist/tui/components.d.ts +7 -2
  72. package/dist/tui/components.d.ts.map +1 -1
  73. package/dist/tui/components.js +3 -3
  74. package/dist/tui/components.js.map +1 -1
  75. package/dist/tui/config-wizard/engine.js +1 -1
  76. package/dist/tui/config-wizard/engine.js.map +1 -1
  77. package/dist/tui/config-wizard/fields.d.ts +3 -1
  78. package/dist/tui/config-wizard/fields.d.ts.map +1 -1
  79. package/dist/tui/config-wizard/fields.js +58 -6
  80. package/dist/tui/config-wizard/fields.js.map +1 -1
  81. package/dist/tui/config-wizard/menu.d.ts.map +1 -1
  82. package/dist/tui/config-wizard/menu.js +2 -3
  83. package/dist/tui/config-wizard/menu.js.map +1 -1
  84. package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
  85. package/dist/tui/config-wizard/step-defaults.js +4 -11
  86. package/dist/tui/config-wizard/step-defaults.js.map +1 -1
  87. package/dist/tui/config-wizard/types.d.ts +18 -3
  88. package/dist/tui/config-wizard/types.d.ts.map +1 -1
  89. package/dist/tui/config-wizard/wizard.d.ts.map +1 -1
  90. package/dist/tui/config-wizard/wizard.js +4 -3
  91. package/dist/tui/config-wizard/wizard.js.map +1 -1
  92. package/dist/tui/highlight.d.ts +3 -2
  93. package/dist/tui/highlight.d.ts.map +1 -1
  94. package/dist/tui/highlight.js +3 -2
  95. package/dist/tui/highlight.js.map +1 -1
  96. package/dist/tui/index.d.ts +1 -0
  97. package/dist/tui/index.d.ts.map +1 -1
  98. package/dist/tui/index.js +87 -40
  99. package/dist/tui/index.js.map +1 -1
  100. package/dist/tui/input-editing.d.ts +49 -0
  101. package/dist/tui/input-editing.d.ts.map +1 -0
  102. package/dist/tui/input-editing.js +87 -0
  103. package/dist/tui/input-editing.js.map +1 -0
  104. package/dist/tui/key-debug.d.ts +62 -0
  105. package/dist/tui/key-debug.d.ts.map +1 -0
  106. package/dist/tui/key-debug.js +92 -0
  107. package/dist/tui/key-debug.js.map +1 -0
  108. package/dist/tui/mouse.d.ts +55 -0
  109. package/dist/tui/mouse.d.ts.map +1 -0
  110. package/dist/tui/mouse.js +74 -0
  111. package/dist/tui/mouse.js.map +1 -0
  112. package/dist/tui/screens/chat-commands.d.ts +12 -2
  113. package/dist/tui/screens/chat-commands.d.ts.map +1 -1
  114. package/dist/tui/screens/chat-commands.js +204 -17
  115. package/dist/tui/screens/chat-commands.js.map +1 -1
  116. package/dist/tui/screens/chat.d.ts +2 -5
  117. package/dist/tui/screens/chat.d.ts.map +1 -1
  118. package/dist/tui/screens/chat.js +460 -98
  119. package/dist/tui/screens/chat.js.map +1 -1
  120. package/dist/tui/screens/frame-buffer.d.ts +47 -0
  121. package/dist/tui/screens/frame-buffer.d.ts.map +1 -0
  122. package/dist/tui/screens/frame-buffer.js +78 -0
  123. package/dist/tui/screens/frame-buffer.js.map +1 -0
  124. package/dist/tui/screens/handoff-choice.d.ts +37 -0
  125. package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
  126. package/dist/tui/screens/handoff-choice.js +41 -0
  127. package/dist/tui/screens/handoff-choice.js.map +1 -0
  128. package/dist/tui/screens/index.d.ts +8 -8
  129. package/dist/tui/screens/index.d.ts.map +1 -1
  130. package/dist/tui/screens/index.js +7 -7
  131. package/dist/tui/screens/index.js.map +1 -1
  132. package/dist/tui/screens/input.d.ts +35 -0
  133. package/dist/tui/screens/input.d.ts.map +1 -1
  134. package/dist/tui/screens/input.js +66 -0
  135. package/dist/tui/screens/input.js.map +1 -1
  136. package/dist/tui/screens/layout.d.ts +13 -3
  137. package/dist/tui/screens/layout.d.ts.map +1 -1
  138. package/dist/tui/screens/layout.js +15 -8
  139. package/dist/tui/screens/layout.js.map +1 -1
  140. package/dist/tui/screens/lines.d.ts +12 -41
  141. package/dist/tui/screens/lines.d.ts.map +1 -1
  142. package/dist/tui/screens/lines.js +87 -95
  143. package/dist/tui/screens/lines.js.map +1 -1
  144. package/dist/tui/screens/messages-view.d.ts +10 -0
  145. package/dist/tui/screens/messages-view.d.ts.map +1 -0
  146. package/dist/tui/screens/messages-view.js +115 -0
  147. package/dist/tui/screens/messages-view.js.map +1 -0
  148. package/dist/tui/screens/notice.d.ts +32 -0
  149. package/dist/tui/screens/notice.d.ts.map +1 -0
  150. package/dist/tui/screens/notice.js +46 -0
  151. package/dist/tui/screens/notice.js.map +1 -0
  152. package/dist/tui/screens/render.d.ts +2 -4
  153. package/dist/tui/screens/render.d.ts.map +1 -1
  154. package/dist/tui/screens/render.js +7 -43
  155. package/dist/tui/screens/render.js.map +1 -1
  156. package/dist/tui/screens/splash.d.ts.map +1 -1
  157. package/dist/tui/screens/splash.js +7 -1
  158. package/dist/tui/screens/splash.js.map +1 -1
  159. package/dist/tui/text.d.ts +12 -2
  160. package/dist/tui/text.d.ts.map +1 -1
  161. package/dist/tui/text.js +17 -3
  162. package/dist/tui/text.js.map +1 -1
  163. package/dist/tui/theme.d.ts +7 -1
  164. package/dist/tui/theme.d.ts.map +1 -1
  165. package/dist/tui/theme.js +15 -3
  166. package/dist/tui/theme.js.map +1 -1
  167. package/dist/types.d.ts +7 -5
  168. package/dist/types.d.ts.map +1 -1
  169. package/package.json +3 -3
  170. package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
  171. package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
  172. package/dist/auto-migrate-confirm-plugin.js +0 -61
  173. package/dist/auto-migrate-confirm-plugin.js.map +0 -1
  174. package/dist/migration-service.d.ts +0 -15
  175. package/dist/migration-service.d.ts.map +0 -1
  176. package/dist/migration-service.js +0 -59
  177. package/dist/migration-service.js.map +0 -1
  178. package/dist/tui/screens/state.d.ts +0 -13
  179. package/dist/tui/screens/state.d.ts.map +0 -1
  180. package/dist/tui/screens/state.js +0 -75
  181. package/dist/tui/screens/state.js.map +0 -1
@@ -1,49 +1,81 @@
1
1
  /**
2
- * CLI 会话指针 — 记录「上一轮会话 id」。
2
+ * CLI 会话指针 — 按「工作目录(cwd)」记录各自的「上一轮会话 id」。
3
3
  *
4
4
  * 取代原草稿机制:不再维护单独的单文件草稿(`drafts/_current.json`),
5
5
  * 而是让每个会话直接落盘为 `conversations/<id>.json`,再用本指针记住
6
- * 「最近活动的会话 id」,供下次启动自动续接。
6
+ * 「每个目录最近活动的会话 id」,供下次在该目录启动时自动续接。
7
7
  *
8
- * 存储位置:`$AI_ZEN_DIR/cli/last-session.json`。
8
+ * 存储位置:`$AI_ZEN_DIR/cli/last-session.json`,结构为 cwd → 续接记录的 map:
9
+ *
10
+ * {
11
+ * "version": 1,
12
+ * "sessions": {
13
+ * "/abs/path/to/proj-a": { "id": "对话_...", "updatedAt": "..." },
14
+ * "/abs/path/to/proj-b": { "id": "对话_...", "updatedAt": "..." }
15
+ * }
16
+ * }
17
+ *
18
+ * 以 `process.cwd()` 的**精确字符串**为键:不同目录各记各的,互不干扰。
19
+ * 旧版单指针文件(顶层 `{ id, updatedAt }`)无法归属到具体目录,一律视为
20
+ * 「无记录」——宁可丢一次续接,也不把别的目录的历史错认到当前目录。
9
21
  */
10
22
  import { promises as fs } from "node:fs";
11
23
  import { join } from "node:path";
12
24
  import { CLI_DIR } from "./config.js";
13
25
  const POINTER_FILE = join(CLI_DIR, "last-session.json");
14
- /** 读取「上一轮会话 id」;文件不存在或内容损坏时返回 null */
15
- export async function readLastSession() {
26
+ const FILE_VERSION = 1;
27
+ /** 读取整份指针文件;不存在 / 损坏 / 旧版格式时返回空结构 */
28
+ async function readPointerFile() {
29
+ const empty = { version: FILE_VERSION, sessions: {} };
30
+ let parsed;
16
31
  try {
17
- const raw = await fs.readFile(POINTER_FILE, "utf-8");
18
- const parsed = JSON.parse(raw);
19
- if (typeof parsed?.id !== "string" || !parsed.id)
20
- return null;
21
- return { id: parsed.id, updatedAt: parsed.updatedAt ?? "" };
32
+ parsed = JSON.parse(await fs.readFile(POINTER_FILE, "utf-8"));
22
33
  }
23
34
  catch {
24
- return null;
35
+ return empty;
36
+ }
37
+ // 仅接受新版 map 结构;旧版单指针(顶层 id)或其它形状一律视为空。
38
+ if (!parsed || typeof parsed !== "object" || typeof parsed.sessions !== "object" || parsed.sessions === null) {
39
+ return empty;
25
40
  }
41
+ const sessions = {};
42
+ for (const [cwd, entry] of Object.entries(parsed.sessions)) {
43
+ const e = entry;
44
+ if (e && typeof e === "object" && typeof e.id === "string" && e.id) {
45
+ sessions[cwd] = { id: e.id, updatedAt: typeof e.updatedAt === "string" ? e.updatedAt : "" };
46
+ }
47
+ }
48
+ return { version: FILE_VERSION, sessions };
26
49
  }
27
- /** 更新「上一轮会话 id」(原子写,避免中断产生半截文件) */
28
- export async function writeLastSession(id) {
50
+ /** 原子写入整份指针文件(必要时创建目录,tmp + rename 避免半截文件) */
51
+ async function writePointerFile(file) {
29
52
  try {
30
53
  await fs.access(CLI_DIR);
31
54
  }
32
55
  catch {
33
56
  await fs.mkdir(CLI_DIR, { recursive: true });
34
57
  }
35
- const pointer = { id, updatedAt: new Date().toISOString() };
36
58
  const tmp = `${POINTER_FILE}.tmp`;
37
- await fs.writeFile(tmp, JSON.stringify(pointer, null, 2), "utf-8");
59
+ await fs.writeFile(tmp, JSON.stringify(file, null, 2), "utf-8");
38
60
  await fs.rename(tmp, POINTER_FILE);
39
61
  }
40
- /** 清除指针(会话被删除等场景使用) */
41
- export async function clearLastSession() {
42
- try {
43
- await fs.unlink(POINTER_FILE);
44
- }
45
- catch {
46
- /* 不存在则忽略 */
47
- }
62
+ /** 读取指定工作目录的「上一轮会话 id」;无记录时返回 null */
63
+ export async function readLastSession(cwd) {
64
+ const file = await readPointerFile();
65
+ return file.sessions[cwd] ?? null;
66
+ }
67
+ /** 更新指定工作目录的「上一轮会话 id」(保留其它目录的记录,原子写) */
68
+ export async function writeLastSession(cwd, id) {
69
+ const file = await readPointerFile();
70
+ file.sessions[cwd] = { id, updatedAt: new Date().toISOString() };
71
+ await writePointerFile(file);
72
+ }
73
+ /** 清除指定工作目录的指针(会话被删除等场景使用) */
74
+ export async function clearLastSession(cwd) {
75
+ const file = await readPointerFile();
76
+ if (!(cwd in file.sessions))
77
+ return;
78
+ delete file.sessions[cwd];
79
+ await writePointerFile(file);
48
80
  }
49
81
  //# sourceMappingURL=session-pointer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-pointer.js","sourceRoot":"","sources":["../src/session-pointer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;AASxD,sCAAsC;AACtC,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,IAAI,OAAO,MAAM,EAAE,EAAE,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAU;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,OAAO,GAAmB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC5E,MAAM,GAAG,GAAG,GAAG,YAAY,MAAM,CAAC;IAClC,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACrC,CAAC;AAED,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"session-pointer.js","sourceRoot":"","sources":["../src/session-pointer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stdio-runner.d.ts","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAa9C,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAC;CACf;AAOD;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAWjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,SAAS,GAAG,MAAM,CAY/E;AAoCD,6BAA6B;AAC7B,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAuExE"}
1
+ {"version":3,"file":"stdio-runner.d.ts","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAe9C,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,IAAI,EAAE,OAAO,CAAC;CACf;AAOD;;;GAGG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAWjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,GAAG,SAAS,GAAG,MAAM,CAY/E;AAwCD,6BAA6B;AAC7B,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAuExE"}
@@ -10,9 +10,9 @@
10
10
  * 该模式不落盘(不写草稿 / 对话存档),仅当显式 `--save` 时保存对话存档。
11
11
  */
12
12
  import { AgentNS } from "@ai-zen/agents-core";
13
- import { AutoRefreshToolsPlugin, ContextGuardPlugin, setLogger, } from "@ai-zen/agents-sdk";
13
+ import { AgentRepository, AutoRefreshToolsPlugin, ContextGuardPlugin, setLogger, } from "@ai-zen/agents-sdk";
14
14
  import { createAgent } from "./agent-creator.js";
15
- import { readConfig } from "./config.js";
15
+ import { AGENTS_DIR, readConfig } from "./config.js";
16
16
  import { CwdTrackerPlugin } from "./cwd-tracker-plugin.js";
17
17
  import { SubAgentGuardInstallerPlugin } from "./sub-agent-guard-plugin.js";
18
18
  import { conversationRepository } from "./conversation-repository.js";
@@ -76,21 +76,23 @@ export function extractText(content) {
76
76
  */
77
77
  async function resolveTarget() {
78
78
  const config = await readConfig();
79
- const modelId = config.defaultModel ?? config.models[0]?.id;
80
- if (!modelId)
81
- throw new Error("没有可用的模型,请先运行 `ai` 完成配置");
79
+ const agentId = config.defaultAgent ?? "default";
80
+ const definition = await new AgentRepository(AGENTS_DIR).read(agentId);
81
+ const modelId = definition?.modelId;
82
+ if (!modelId) {
83
+ throw new Error(`Agent "${agentId}" 未绑定模型,请先运行 \`ai\` 在 /config 里为它选择模型`);
84
+ }
82
85
  const model = config.models.find((m) => m.id === modelId);
83
86
  if (!model)
84
- throw new Error(`默认模型 ${modelId} 不存在`);
87
+ throw new Error(`Agent 绑定的模型 ${modelId} 不存在`);
85
88
  const endpoint = config.endpoints.find((e) => e.id === model.endpointId);
86
89
  if (!endpoint)
87
90
  throw new Error(`模型 ${modelId} 引用的端点 ${model.endpointId} 不存在`);
88
91
  if (!endpoint.apiKey) {
89
92
  throw new Error(`端点 "${endpoint.name}" 的 API Key 未设置,请先运行 \`ai\` 进入交互界面配置`);
90
93
  }
91
- const maxTokens = model.maxContextTokens ??
92
- (model.maxContextChars ? Math.floor(model.maxContextChars / 4) : undefined);
93
- return { modelId, agentId: config.defaultAgent ?? "default", maxTokens };
94
+ // 阈值由配置直接给出(旧字段已在 SDK 的 ConfigManager.read() 里迁移过)
95
+ return { modelId, agentId, tokenThresholds: model.tokenThresholds };
94
96
  }
95
97
  /** 运行一次纯 stdio 对话,返回进程退出码 */
96
98
  export async function runStdio(options) {
@@ -107,13 +109,13 @@ export async function runStdio(options) {
107
109
  const originalLog = console.log;
108
110
  console.log = (...args) => logStderr(args.map((a) => String(a)).join(" "));
109
111
  try {
110
- const { modelId, agentId, maxTokens } = await resolveTarget();
112
+ const { modelId, agentId, tokenThresholds } = await resolveTarget();
111
113
  const agent = await createAgent({ agentId });
112
114
  agent.use(new CwdTrackerPlugin());
113
115
  agent.use(new AutoRefreshToolsPlugin());
114
- if (maxTokens && maxTokens > 0) {
115
- agent.use(new ContextGuardPlugin({ maxTokens }));
116
- agent.use(new SubAgentGuardInstallerPlugin({ maxTokens }));
116
+ if (tokenThresholds) {
117
+ agent.use(new ContextGuardPlugin({ guardTokens: tokenThresholds.guard }));
118
+ agent.use(new SubAgentGuardInstallerPlugin({ guardTokens: tokenThresholds.guard }));
117
119
  }
118
120
  await agent.init();
119
121
  const messages = await agent.send(prompt);
@@ -1 +1 @@
1
- {"version":3,"file":"stdio-runner.js","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stdio-runner.js","sourceRoot":"","sources":["../src/stdio-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,SAAS,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAE3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AASnD,kCAAkC;AAClC,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,KAAa;IAC5D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,IAAI,EAAE,CAAC;IACrD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,WAAW,CAAC,OAA2C;IACrE,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAEhD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aACjD,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;aAC/E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAC9B,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AASD;;;GAGG;AACH,KAAK,UAAU,aAAa;IAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,UAAU,EAAE,OAAO,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,UAAU,OAAO,uCAAuC,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,MAAM,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,OAAO,UAAU,KAAK,CAAC,UAAU,MAAM,CAAC,CAAC;IAC9E,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,OAAO,QAAQ,CAAC,IAAI,sCAAsC,CAC3D,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;AACtE,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB;IACrD,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEtC,MAAM,SAAS,GAAG,MAAM,SAAS,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAEnD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,iDAAiD;IACjD,MAAM,YAAY,GAAG,CAAC,OAAe,EAAQ,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnE,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAChC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAEtF,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,aAAa,EAAE,CAAC;QAEpE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,GAAG,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,GAAG,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;QACxC,IAAI,eAAe,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1E,KAAK,CAAC,GAAG,CAAC,IAAI,4BAA4B,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAEnB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC;aAChC,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAElD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YAC3E,SAAS,CAAC,YAAY,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC/D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,sBAAsB,CAAC,KAAK,CAAC;gBACjC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;gBACtC,OAAO;gBACP,OAAO;gBACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;gBAClB,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;YACH,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC;QAED,mBAAmB;QACnB,MAAM,IAAI,GAAG,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACzE,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,SAAS,CAAC,OAAO,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,oCAAoC;QACpC,SAAS,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -12,8 +12,8 @@
12
12
  * init)。
13
13
  *
14
14
  * 约束口径(与主 Agent 一致,仅此一项):把主 Agent 同款的 `ContextGuardPlugin` 装到子 Agent 上
15
- * —— 同一 `maxTokens`(当前模型 `maxContextTokens`)、同样不传 ratio(沿用 SDK 默认 1.5),
16
- * 使「上下文 token 超过 maxTokens × 1.5 即中断」对子 Agent 同样成立。
15
+ * —— 同一个 `guardTokens`(当前模型的 `tokenThresholds.guard`),使「请求前用量超过硬线即中断」
16
+ * 对子 Agent 同样成立。
17
17
  * **不设**轮次上限,**不设**工具调用次数上限。
18
18
  *
19
19
  * 中断语义:抛错即结束子 Agent 的 run;异常经 `AgentTool` 的 finally(分发 onSubAgentEnd)
@@ -27,8 +27,8 @@
27
27
  import type { AgentPlugin } from "@ai-zen/agents-sdk";
28
28
  import type { SubAgentContext } from "@ai-zen/agents-core";
29
29
  export interface SubAgentGuardOptions {
30
- /** 子 Agent 的上下文 token 阈值;与主 Agent 同源(当前模型的 `maxContextTokens`) */
31
- maxTokens: number;
30
+ /** 强行阻断阈值;与主 Agent 同源(当前模型的 `tokenThresholds.guard`) */
31
+ guardTokens: number;
32
32
  }
33
33
  /**
34
34
  * 子 Agent 护栏安装器(装在**宿主 Agent** 上)。
@@ -38,7 +38,7 @@ export interface SubAgentGuardOptions {
38
38
  * 由 `ContextGuardPlugin` 按阈值决定。
39
39
  */
40
40
  export declare class SubAgentGuardInstallerPlugin implements AgentPlugin {
41
- private readonly maxTokens;
41
+ private readonly guardTokens;
42
42
  constructor(options: SubAgentGuardOptions);
43
43
  onSubAgentStart({ subAgent }: SubAgentContext): void;
44
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-guard-plugin.d.ts","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,YAAW,WAAW;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,oBAAoB;IAIzC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,IAAI;CASrD"}
1
+ {"version":3,"file":"sub-agent-guard-plugin.d.ts","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA6B,YAAW,WAAW;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,oBAAoB;IAIzC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,GAAG,IAAI;CASrD"}
@@ -12,8 +12,8 @@
12
12
  * init)。
13
13
  *
14
14
  * 约束口径(与主 Agent 一致,仅此一项):把主 Agent 同款的 `ContextGuardPlugin` 装到子 Agent 上
15
- * —— 同一 `maxTokens`(当前模型 `maxContextTokens`)、同样不传 ratio(沿用 SDK 默认 1.5),
16
- * 使「上下文 token 超过 maxTokens × 1.5 即中断」对子 Agent 同样成立。
15
+ * —— 同一个 `guardTokens`(当前模型的 `tokenThresholds.guard`),使「请求前用量超过硬线即中断」
16
+ * 对子 Agent 同样成立。
17
17
  * **不设**轮次上限,**不设**工具调用次数上限。
18
18
  *
19
19
  * 中断语义:抛错即结束子 Agent 的 run;异常经 `AgentTool` 的 finally(分发 onSubAgentEnd)
@@ -33,15 +33,15 @@ import { ContextGuardPlugin } from "@ai-zen/agents-sdk";
33
33
  * 由 `ContextGuardPlugin` 按阈值决定。
34
34
  */
35
35
  export class SubAgentGuardInstallerPlugin {
36
- maxTokens;
36
+ guardTokens;
37
37
  constructor(options) {
38
- this.maxTokens = options.maxTokens;
38
+ this.guardTokens = options.guardTokens;
39
39
  }
40
40
  onSubAgentStart({ subAgent }) {
41
- // 与主 Agent 完全同款:同一 maxTokens,不传 ratio(沿用 ContextGuardPlugin 默认 1.5)
42
- subAgent.use(new ContextGuardPlugin({ maxTokens: this.maxTokens }));
41
+ // 与主 Agent 完全同款:同一个 guardTokens 绝对阈值
42
+ subAgent.use(new ContextGuardPlugin({ guardTokens: this.guardTokens }));
43
43
  // 传染到孙级:子 Agent 若再委派,其子 Agent 同样被安插
44
- subAgent.use(new SubAgentGuardInstallerPlugin({ maxTokens: this.maxTokens }));
44
+ subAgent.use(new SubAgentGuardInstallerPlugin({ guardTokens: this.guardTokens }));
45
45
  }
46
46
  }
47
47
  //# sourceMappingURL=sub-agent-guard-plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-guard-plugin.js","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AASxD;;;;;;GAMG;AACH,MAAM,OAAO,4BAA4B;IACtB,SAAS,CAAS;IAEnC,YAAY,OAA6B;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;IAED,eAAe,CAAC,EAAE,QAAQ,EAAmB;QAC3C,oEAAoE;QACpE,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAEpE,oCAAoC;QACpC,QAAQ,CAAC,GAAG,CACV,IAAI,4BAA4B,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAChE,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"sub-agent-guard-plugin.js","sourceRoot":"","sources":["../src/sub-agent-guard-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AASxD;;;;;;GAMG;AACH,MAAM,OAAO,4BAA4B;IACtB,WAAW,CAAS;IAErC,YAAY,OAA6B;QACvC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,EAAE,QAAQ,EAAmB;QAC3C,qCAAqC;QACrC,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAExE,oCAAoC;QACpC,QAAQ,CAAC,GAAG,CACV,IAAI,4BAA4B,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CACpE,CAAC;IACJ,CAAC;CACF"}
@@ -1,81 +1,94 @@
1
1
  /**
2
- * TUI 对话会话 —— Agent 装配与结构化流式事件
2
+ * TUI 对话会话 —— Agent 装配 + 「内容变更」信号
3
3
  *
4
- * 与旧的行式渲染器(`src/conversation-runner.ts`)不同,这里把流式 delta
5
- * 翻译成**结构化事件**交给 React 层渲染,而非直接写 stdout,从而支持 Ink 的
6
- * 可控重绘(增量、无撕裂)。
4
+ * 渲染以 SDK 的 `agent.messages` 为**唯一数据源**:本模块不再把流式 delta 翻译成
5
+ * 自定义事件 / 中间模型(Block / LiveAssistant),只做两件事:
6
+ * 1. SDK 事件到达时通知上层「messages 变了,该重渲染了」;
7
+ * 2. 把系统级提示(notice / error)转发到独立通道(绝不写进 messages)。
7
8
  *
8
9
  * 本模块不依赖 React / Ink,可独立单测。
9
10
  */
10
11
  import { AgentNS } from "@ai-zen/agents-core";
11
- /** 流式事件:由 React 层消费并拼接成消息块 */
12
- export type ChatEvent = {
13
- type: "user";
14
- text: string;
15
- } | {
16
- type: "assistant-start";
17
- } | {
18
- type: "reasoning";
19
- text: string;
20
- } | {
21
- type: "content";
22
- text: string;
23
- } | {
24
- type: "tool";
25
- index: number;
26
- name?: string;
27
- args?: string;
28
- } | {
29
- type: "subagent-start";
30
- name: string;
31
- } | {
32
- type: "subagent-end";
33
- name: string;
34
- } | {
35
- type: "notice";
36
- text: string;
37
- } | {
38
- type: "error";
39
- text: string;
40
- } | {
41
- type: "done";
42
- };
43
- export type ChatEventHandler = (e: ChatEvent) => void;
12
+ import { type AutoMigrateTriggerInfo, type HandoffMode } from "@ai-zen/agents-sdk";
13
+ import type { TokenThresholds } from "@ai-zen/agents-sdk";
14
+ import { stripCwdNote } from "./text.js";
15
+ /** 会话 → UI 的对外信号 */
16
+ export interface ChatSessionNotifier {
17
+ /** 转录可能已变化(内容以 `agent.messages` 为准);`immediate=true` 表示应立即上屏 */
18
+ onChange(immediate: boolean): void;
19
+ /** 系统级提示(notice / error),走独立栏位,绝不进 messages */
20
+ onNotice(text: string, tone: "info" | "error"): void;
21
+ }
44
22
  export interface ChatSessionOptions {
45
- modelId: string;
46
23
  agentId?: string;
47
24
  messages?: AgentNS.Message[];
48
25
  conversationId?: string;
49
26
  conversationName?: string;
50
- /** 自动迁移二次确认(由 Ink 层弹出确认框实现) */
51
- requestConfirm?: (question: string) => Promise<boolean>;
27
+ /**
28
+ * 自动迁移时的执行者选择(由 Ink 层弹出选择器实现)。
29
+ * 返回 `null` 表示跳过本次迁移;未提供时按默认执行者(原 agent 自交接)直接迁移。
30
+ */
31
+ requestMode?: (info: AutoMigrateTriggerInfo) => Promise<HandoffMode | null>;
52
32
  }
53
- /** 去掉 CwdTrackerPlugin 追加在用户消息末尾的工作目录提示 */
54
- export declare function stripCwdNote(text: string): string;
33
+ /** 去掉 CwdTrackerPlugin 追加在用户消息末尾的工作目录提示(转发自 ./text.js) */
34
+ export { stripCwdNote };
55
35
  export declare class ChatSession {
56
- readonly modelId: string;
36
+ /**
37
+ * 当前模型 id —— 从 Agent 定义读,**不再单独存一份**。
38
+ *
39
+ * 模型的唯一真相源是 `AgentDefinition.modelId`:会话不记模型,配置也没有
40
+ * `defaultModel`。这样状态栏、落盘与 SDK 实发请求用的永远是同一个值。
41
+ */
42
+ get modelId(): string;
57
43
  readonly agentId: string;
58
- readonly maxTokens?: number;
59
- currentName: string;
60
- currentId: string;
44
+ /** 当前模型的上下文阈值(交接软线 + 阻断硬线),缺省时不装护栏插件 */
45
+ readonly tokenThresholds?: TokenThresholds;
46
+ /**
47
+ * 会话 id / 名称的**唯一真相源是 `ctx`**(`ConversationContext`)。
48
+ *
49
+ * 为什么必须代理而不是各存一份:自动迁移由 SDK 的 `AutoMigratePlugin` 直接驱动
50
+ * `HandoffService.migrate()`,**不经过本类任何方法**,新 id 只会写进 `ctx.currentId`
51
+ * (`onMigrated` 钩子)。若本类另持一份 `currentId`,自动迁移后它就停在旧值上,
52
+ * 而 `ConversationPersistPlugin.getId()` 读的正是这份旧值——于是 prune 之后的
53
+ * 「系统提示 + 交接断点」会被写进**旧会话文件**,把已保存的完整历史覆盖掉。
54
+ */
55
+ get currentId(): string;
56
+ set currentId(id: string);
57
+ get currentName(): string;
58
+ set currentName(name: string);
61
59
  private agent;
62
60
  private readonly ctx;
63
- private readonly migrationService;
64
- private readonly onEvent;
65
- private readonly requestConfirm?;
61
+ private readonly handoffService;
62
+ private readonly notifier;
63
+ private readonly requestMode?;
66
64
  private readonly disposers;
67
65
  private constructor();
68
- /** 创建会话:装配 Agent、插件与流式事件 */
69
- static create(options: ChatSessionOptions, onEvent: ChatEventHandler): Promise<ChatSession>;
66
+ /** 创建会话:装配 Agent、插件与「变更信号」 */
67
+ static create(options: ChatSessionOptions, notifier: ChatSessionNotifier): Promise<ChatSession>;
68
+ /** 对话消息(唯一真相源) */
70
69
  get messages(): AgentNS.Message[];
71
- /** 最近一次响应的 token 用量 */
70
+ /** 最近一次响应的 token 用量(供「本轮 / 当前上下文占用」展示与阈值判定) */
72
71
  get lastUsage(): AgentNS.Usage | undefined;
73
- /** 发送一条消息;事件通过 `onEvent` 持续回传;resolve 表示本轮结束 */
72
+ /**
73
+ * 本会话累计 token 用量。
74
+ *
75
+ * 逐消息求和(`sumUsage`):含各 assistant 消息的 `usage`(自身响应)与工具消息的
76
+ * `subAgentUsage`(内部委派——含所有层级子 Agent)。每轮请求都会重发完整历史,
77
+ * 故求和即计费口径的累计消耗;且随消息持久化,续接 / `/load` 亦不丢。
78
+ */
79
+ get totalUsage(): AgentNS.Usage;
80
+ /** 发送一条消息;内容变化经 `notifier.onChange` 通知,`resolve` 表示本轮结束 */
74
81
  send(input: string): Promise<void>;
75
82
  /** 中止当前请求(Ctrl+C 语义:仅取消本轮,不退出) */
76
83
  abort(): void;
77
- /** 重置会话(/new):清空历史并重建 Agent */
78
- reset(): Promise<void>;
84
+ /**
85
+ * 重置会话(/new):先把当前对话归档(有内容才存),再清空历史并重建 Agent。
86
+ *
87
+ * 归档必须先于 `currentId` 切换:`save()` 按 `this.currentId` 落盘,若先换 id
88
+ * 会把旧内容写到新会话文件上(等于旧对话丢失)。返回被归档的会话 id,
89
+ * 无内容可存时返回 null。
90
+ */
91
+ reset(): Promise<string | null>;
79
92
  /**
80
93
  * 应用外部配置变更(如 `/config` 改了当前端点的 API Key / Base URL):
81
94
  * **保留消息与上下文**,按磁盘上的新配置重建 Agent。
@@ -84,8 +97,15 @@ export declare class ChatSession {
84
97
  * 否则端点凭据仍是旧的(这也是 `resetScope()` 要 `dispose` 旧实例的原因)。
85
98
  */
86
99
  reload(): Promise<void>;
87
- /** 手动任务迁移(/migrate):与自动迁移共用同一服务实例 */
88
- migrate(): Promise<void>;
100
+ /** 手动任务迁移(`/migrate`):交接 + 开新会话;与自动迁移共用同一服务实例 */
101
+ migrate(mode?: HandoffMode): Promise<string>;
102
+ /**
103
+ * 只产出交接文档(`/handoff`):不切换会话、不改动历史。
104
+ *
105
+ * 交接回合(指令 + 工具调用 + 回执)会留在 `agent.messages` 里,
106
+ * 用户可继续要求细化同一份文档(重写同一路径即可)。
107
+ */
108
+ handoff(mode?: HandoffMode): Promise<string>;
89
109
  /** 撤回:删除索引 index 起的消息,返回被撤回的首条用户消息文本(用于预填输入) */
90
110
  rollbackTo(index: number): string;
91
111
  /** 保存当前对话到存档 */
@@ -93,8 +113,12 @@ export declare class ChatSession {
93
113
  /** 释放事件监听(重建 Agent 时调用,避免监听器泄漏) */
94
114
  dispose(): void;
95
115
  private attach;
116
+ /**
117
+ * 订阅 SDK 事件,仅把它们当作「messages 可能已变化」的信号:
118
+ * - `chunk-parsed`(每片 delta 应用后):高频 → 走合帧(`immediate=false`);
119
+ * - `open` / `parsed` / `finally`:轮次边界 → 立即上屏;
120
+ * - `error`:转发到通知通道。
121
+ */
96
122
  private wire;
97
- /** 把流式 delta 翻译为结构化事件 */
98
- private emitDelta;
99
123
  }
100
124
  //# sourceMappingURL=chat-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/tui/chat-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/tui/chat-session.ts"],"names":[],"mappings":"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"}