@ai-zen/cli 0.5.0 → 0.6.1

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.6.1] - 2026-08-28
4
+
5
+ ### 🎯 优化
6
+
7
+ - **升级 `@ai-zen/agents-sdk` 到 0.9.0** — 迁移服务新增 `strategy` 开关:
8
+ - **`omit`(默认)**:历史消息标记 `omit: true` 保留可审计,追加「对话断点」消息为新上下文起点
9
+ - **`prune`(CLI 采用)**:物理剔除历史,仅保留系统提示 + 交接断点(即先前替换行为)
10
+ - CLI `migration-service.ts` 显式启用 `strategy: "prune"`,与端侧「迁移后开启新会话」的产品语义一致,**对外使用无差异**
11
+
12
+ ### ✅ 测试
13
+
14
+ - 依赖升级后单测全量通过(37 passed),`tsc --noEmit` 零错误
15
+
16
+ ## [0.6.0] - 2026-08-24
17
+
18
+ ### 💥 破坏性变更
19
+
20
+ - **升级 `@ai-zen/agents-sdk` 到 0.8.0** — 任务迁移能力在 SDK 内完成重构(详见 SDK CHANGELOG):
21
+ - **`TaskMigrationService` 变为实例化、自包含迁移服务** —— 构造仅接收 `{ onBeforeMigrate?, onMigrated?, logger? }`(钩子平铺,无 `hooks` 包装),`migrate({ agent })` 直接复用传入 `agent` 的 `client`/`model`/`modelConfig` 生成交接文档,无需 Provider、无需独立迁移 Agent;暴露结构化 `MigrationContext`
22
+ - **`AutoMigratePlugin` 收敛为仅触发角色** —— 构造注入 `{ service, maxTokens }`,只检测 token 超限并委托 `service.migrate`
23
+ - **CLI 移除 `createMigrationAgent`** —— 删除 `src/agent-creator.ts` 中依赖已删除 `TaskMigrationService.createAgentDefinition` 的迁移 Agent 构建;手动迁移命令与自动迁移回调统一改为使用 SDK 迁移服务实例,钩子平铺在服务构造上
24
+
25
+ ### 🚀 新功能
26
+
27
+ - **手动任务迁移命令 `/migrate`** — 对话中随时输入 `/migrate` 即可主动触发任务迁移,无需等待 token 超限:
28
+ - 迁移动作:保存当前对话 → 生成交接文档 → 开启新会话(注入交接文档为上下文)→ 新对话落盘为草稿(`_current.json`)
29
+ - 与自动迁移联动复用 SDK 的 `TaskMigrationService.migrate`,通过 `onMigrated` 钩子处理后保存
30
+ - 非破坏性:旧对话已保存到 `conversations/`,生成失败时可重试或继续当前对话
31
+
32
+ ### 🎯 优化
33
+
34
+ - **迁移服务单实例收敛** — 将 `TaskMigrationService` 实例挂载到 `ConversationContext.migrationService`,自动迁移(`AutoMigratePlugin` 触发)与手动迁移(`/migrate` 命令)共用**同一个实例**;迁移前后处理(保存旧对话 / 开启新会话 / 落盘草稿)统一收敛到该服务钩子,消除自动与手动两侧各自 `new TaskMigrationService` 及重复的后处理实现
35
+ - **迁移服务抽离为独立模块** — 新增 `src/migration-service.ts`,由 `createMigrationService(ctx)` 统一构建迁移服务实例(含迁移前后钩子);`saveCurrentConversation` 提升为 `conversation-repository.ts` 的共享 `saveConversation`,供迁移钩子与错误保存共用
36
+
37
+ ### ✅ 测试
38
+
39
+ - SDK 侧:`TaskMigrationService`(含 `migrate` / 序列化 / 钩子上下文)、`AutoMigratePlugin`(触发委托断言)全量通过(447 passed / 2 skipped)
40
+ - CLI 侧:`pretest` 类型检查与全量单测通过(37 passed),`npm run build` 成功
41
+
3
42
  ## [0.5.0] - 2026-08-23
4
43
 
5
44
  ### 💥 破坏性变更
package/README.md CHANGED
@@ -68,12 +68,15 @@ While in a conversation, all commands start with `/`:
68
68
  | `/back` | Undo messages (roll back to a specific point and resend) |
69
69
  | `/editor` | Open system editor for long-form input |
70
70
  | `/clear` | Clear the screen |
71
+ | `/migrate` | Manually trigger task migration (generate handoff doc & start a new session) |
71
72
  | `/help` | Show available commands |
72
73
 
73
74
  ### Conversation Migration
74
75
 
75
76
  When the API response's `usage.prompt_tokens` exceeds the model's `maxContextTokens`, the system automatically generates a **handover document** summarizing completed tasks, pending items, and key decisions. A new conversation session is created with this document as context, ensuring seamless continuation.
76
77
 
78
+ You can also manually trigger a migration at any time by typing `/migrate` in the conversation — no need to wait for the token limit. Both automatic and manual migration delegate to the SDK's `TaskMigrationService`, so the handoff document is always produced consistently.
79
+
77
80
  The migration prompt template includes:
78
81
  - **Conversation Breakpoint** — Last user/AI exchange verbatim
79
82
  - **Completed Tasks** — Task titles and output paths
package/README.zh.md CHANGED
@@ -68,12 +68,15 @@ zen 你好,请介绍一下你自己。
68
68
  | `/back` | 撤回消息(回退到指定位置并可编辑后重发) |
69
69
  | `/editor` | 使用系统编辑器(vim/nano)输入长消息 |
70
70
  | `/clear` | 清屏 |
71
+ | `/migrate` | 手动任务迁移(生成交接文档并开启新会话) |
71
72
  | `/help` | 显示可用命令 |
72
73
 
73
74
  ### 任务迁移
74
75
 
75
76
  当 API 响应中的 `usage.prompt_tokens` 超过模型的 `maxContextTokens` 时,系统会自动生成**交接文档**,汇总已完成任务、待办事项和关键决策,然后创建新会话并将交接文档注入为上下文,实现无缝衔接。
76
77
 
78
+ 你也可以在对话中随时输入 `/migrate` 手动触发迁移,而无需等待 token 超限。手动与自动迁移均委托给 SDK 的 `TaskMigrationService`,交接文档生成始终一致。
79
+
77
80
  迁移提示词模板包含:
78
81
  - **对话断点** — 最后一段对话原文引用
79
82
  - **已完成的任务** — 任务标题和产出路径
@@ -13,5 +13,4 @@ export interface CreateAgentOptions {
13
13
  agentId?: string;
14
14
  }
15
15
  export declare function createAgent(options: CreateAgentOptions): Promise<SdkAgent>;
16
- export declare function createMigrationAgent(modelId: string): Promise<SdkAgent>;
17
16
  //# sourceMappingURL=agent-creator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-creator.d.ts","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,QAAQ,EAER,QAAQ,EAGT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAiBnD,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAyCrD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAahF;AAID,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmB7E"}
1
+ {"version":3,"file":"agent-creator.d.ts","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,QAAQ,EAER,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAiBnD,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAyCrD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAahF"}
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { existsSync } from "fs";
8
8
  import { join } from "path";
9
- import { Provider, createAgent as sdkCreateAgent, SdkAgent, TaskMigrationService, createModel, } from "@ai-zen/agents-sdk";
9
+ import { Provider, createAgent as sdkCreateAgent, } from "@ai-zen/agents-sdk";
10
10
  import { AGENTS_DIR, SUB_AGENTS_DIR, SKILLS_DIR, TOOLS_DIR, AI_ZEN_DIR, PROJECT_SUB_AGENTS_DIR, PROJECT_SKILLS_DIR, PROJECT_TOOLS_DIR, USER_AGENTS_SKILLS_DIR, USER_AGENTS_MCP_CONFIG_FILE, PROJECT_AGENTS_SKILLS_DIR, PROJECT_AGENTS_MCP_CONFIG_FILE, } from "./config.js";
11
11
  import { readConfig } from "./config.js";
12
12
  // ==================== Provider 创建(单例)====================
@@ -65,24 +65,4 @@ export async function createAgent(options) {
65
65
  }
66
66
  return agent;
67
67
  }
68
- // ==================== 迁移 Agent ====================
69
- export async function createMigrationAgent(modelId) {
70
- const provider = await getProvider();
71
- const { client, model, modelConfig } = createModel(provider, modelId);
72
- const definition = TaskMigrationService.createAgentDefinition({ modelId });
73
- return new SdkAgent({
74
- provider,
75
- definition: {
76
- ...definition,
77
- id: "__migration__",
78
- createdAt: new Date().toISOString(),
79
- updatedAt: new Date().toISOString(),
80
- },
81
- client,
82
- model,
83
- modelConfig,
84
- messages: definition.messages,
85
- tools: [],
86
- });
87
- }
88
68
  //# sourceMappingURL=agent-creator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-creator.js","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-creator.js","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,QAAQ,EACR,WAAW,IAAI,cAAc,GAE9B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EACjD,UAAU,EACV,sBAAsB,EAAE,kBAAkB,EAAE,iBAAiB,EAC7D,sBAAsB,EAAE,2BAA2B,EACnD,yBAAyB,EAAE,8BAA8B,GAC1D,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,2DAA2D;AAE3D,IAAI,SAAS,GAAoB,IAAI,CAAC;AAEtC,uCAAuC;AACvC,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,qBAAqB;IACrB,oBAAoB;IACpB,2BAA2B;IAC3B,8CAA8C;IAC9C,0BAA0B;IAC1B,gDAAgD;IAChD,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;QAC1C,8BAA8B;QAC9B,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;QAC5B,2BAA2B;KAC5B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEjB,sBAAsB;IACtB,0BAA0B;IAC1B,8CAA8C;IAC9C,yBAAyB;IACzB,gDAAgD;IAChD,MAAM,WAAW,GAAG;QAClB,kBAAkB;QAClB,yBAAyB;QACzB,UAAU;QACV,sBAAsB;KACvB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEjB,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAChC,MAAM;QACN,SAAS,EAAE,UAAU;QACrB,cAAc,EAAE,CAAC,sBAAsB,EAAE,cAAc,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACvE,WAAW;QACX,UAAU,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACzD,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IAErC,wCAAwC;IACxC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC;IAEnE,uBAAuB;IACvB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAsB,UAAU,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CASxE"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAsB,UAAU,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxE"}
@@ -7,6 +7,7 @@ export async function handleHelp(ctx) {
7
7
  console.log(` ${chalk.cyan("/back")} 撤回消息(可修改后重发)`);
8
8
  console.log(` ${chalk.cyan("/editor")} 使用系统编辑器输入长消息`);
9
9
  console.log(` ${chalk.cyan("/clear")} 清屏`);
10
+ console.log(` ${chalk.cyan("/migrate")} 手动任务迁移(生成交接文档并开启新会话)`);
10
11
  console.log(` ${chalk.cyan("/help")} 显示此帮助\n`);
11
12
  }
12
13
  //# sourceMappingURL=help.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/conversation-commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAwB;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/conversation-commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAwB;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC5D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAkB,MAAM,aAAa,CAAC;AAwBlE;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAY1C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAkB,MAAM,aAAa,CAAC;AA0BlE;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAa1C"}
@@ -5,6 +5,7 @@ import { handleBack } from "./back.js";
5
5
  import { handleEditor } from "./editor.js";
6
6
  import { handleClear } from "./clear.js";
7
7
  import { handleHelp } from "./help.js";
8
+ import { handleMigrate } from "./migrate.js";
8
9
  /**
9
10
  * 命令注册表
10
11
  * key 为命令名称(不含 / 前缀),value 为处理函数
@@ -18,6 +19,7 @@ const commands = {
18
19
  editor: handleEditor,
19
20
  clear: handleClear,
20
21
  help: handleHelp,
22
+ migrate: handleMigrate,
21
23
  };
22
24
  /**
23
25
  * 判断输入是否为命令(以 / 开头)
@@ -58,6 +60,7 @@ export function getCommandNames() {
58
60
  names.add("editor");
59
61
  names.add("clear");
60
62
  names.add("help");
63
+ names.add("migrate");
61
64
  return Array.from(names).sort();
62
65
  }
63
66
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversation-commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;;GAGG;AACH,MAAM,QAAQ,GAAmC;IAC/C,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,UAAU;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAwB;IAExB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAExB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,eAAe;IACf,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,uBAAuB,CAAC,CAAC;QACvD,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,2BAA2B;IAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversation-commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C;;;GAGG;AACH,MAAM,QAAQ,GAAmC;IAC/C,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,aAAa;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAwB;IAExB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAExB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,eAAe;IACf,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,uBAAuB,CAAC,CAAC;QACvD,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,2BAA2B;IAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ConversationContext } from "../types.js";
2
+ /**
3
+ * 手动任务迁移命令(/migrate)
4
+ *
5
+ * 与自动迁移(token 超限触发)复用同一条迁移链路与**同一个迁移服务实例**(`ctx.migrationService`):
6
+ * 保存旧对话 / 生成交接文档 / 开启新会话 / 落盘草稿均由服务钩子统一处理。
7
+ *
8
+ * 命令本身只负责入口校验与用户确认,随后委托给 `ctx.migrationService.migrate`。
9
+ * 迁移非破坏性:旧对话在 onBeforeMigrate 中已保存到 conversations/,即使生成失败也可随时重试或继续当前对话。
10
+ */
11
+ export declare function handleMigrate(ctx: ConversationContext): Promise<void>;
12
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/migrate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD3E"}
@@ -0,0 +1,56 @@
1
+ import chalk from "chalk";
2
+ import inquirer from "inquirer";
3
+ import { AgentNS } from "@ai-zen/agents-core";
4
+ /**
5
+ * 手动任务迁移命令(/migrate)
6
+ *
7
+ * 与自动迁移(token 超限触发)复用同一条迁移链路与**同一个迁移服务实例**(`ctx.migrationService`):
8
+ * 保存旧对话 / 生成交接文档 / 开启新会话 / 落盘草稿均由服务钩子统一处理。
9
+ *
10
+ * 命令本身只负责入口校验与用户确认,随后委托给 `ctx.migrationService.migrate`。
11
+ * 迁移非破坏性:旧对话在 onBeforeMigrate 中已保存到 conversations/,即使生成失败也可随时重试或继续当前对话。
12
+ */
13
+ export async function handleMigrate(ctx) {
14
+ const agent = ctx.agent;
15
+ // 1. 检查是否有可迁移的内容(至少存在一条用户消息,迁移文档需要"对话断点")
16
+ const hasUserMessage = agent.messages.some((m) => m.role === AgentNS.Role.User);
17
+ if (!hasUserMessage) {
18
+ console.log(chalk.yellow("\n📭 当前对话还没有可迁移的内容,请先开始对话。\n"));
19
+ ctx.input = "";
20
+ return;
21
+ }
22
+ // 2. 用户确认(迁移会生成交接文档并开启新会话,提前告知影响)
23
+ const { confirmMigrate } = await inquirer.prompt([
24
+ {
25
+ type: "confirm",
26
+ name: "confirmMigrate",
27
+ message: "确定要对当前对话进行任务迁移吗?\n迁移将:生成交接文档 → 保存当前对话 → 开启新会话继续。",
28
+ default: true,
29
+ },
30
+ ]);
31
+ if (!confirmMigrate) {
32
+ console.log(chalk.gray("已取消迁移\n"));
33
+ ctx.input = "";
34
+ return;
35
+ }
36
+ // 3. 执行迁移。保存旧对话、生成交接文档、开启新会话、落盘草稿
37
+ // 均由共享的 migrationService 钩子统一处理(与自动迁移同一实例,行为一致)。
38
+ // 迁移非破坏性:保存旧对话发生在 onBeforeMigrate,即使生成失败也可重试或继续当前对话。
39
+ if (!ctx.migrationService) {
40
+ console.error(chalk.red("\n❌ 迁移服务未初始化,无法执行迁移。\n"));
41
+ ctx.input = "";
42
+ return;
43
+ }
44
+ try {
45
+ await ctx.migrationService.migrate({ agent });
46
+ }
47
+ catch (error) {
48
+ console.error(chalk.red(`\n❌ 任务迁移失败: ${error?.message ?? error}\n`));
49
+ console.log(chalk.yellow("💡 当前对话已保存,可稍后重试 /migrate,或继续当前对话。\n"));
50
+ ctx.input = "";
51
+ return;
52
+ }
53
+ // 4. 完成提示由 onMigrated 钩子统一输出(开启新会话 + 落盘草稿 + 打印完成文案)
54
+ ctx.input = "";
55
+ }
56
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/conversation-commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAwB;IAC1D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAExB,0CAA0C;IAC1C,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CACpC,CAAC;IACF,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAC7C,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,kCAAkC;IAClC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC/C;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,gBAAgB;YACtB,OAAO,EACL,kDAAkD;YACpD,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,kCAAkC;IAClC,oDAAoD;IACpD,wDAAwD;IACxD,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACnD,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,KAAK,EAAE,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,sCAAsC,CAAC,CACrD,CAAC;QACF,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,oDAAoD;IACpD,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;AACjB,CAAC"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { EntityRepository } from "@ai-zen/agents-sdk";
8
8
  import type { AgentNS } from "@ai-zen/agents-core";
9
+ import type { ConversationContext } from "./types.js";
9
10
  export interface Conversation {
10
11
  id: string;
11
12
  agentId: string;
@@ -18,4 +19,9 @@ export interface Conversation {
18
19
  }
19
20
  /** 会话仓储:每个会话一个 JSON 文件(${conversationsDir}/${id}.json) */
20
21
  export declare const conversationRepository: EntityRepository<Conversation>;
22
+ /**
23
+ * 保存当前对话到 conversations 目录。
24
+ * 迁移前落盘旧会话(onBeforeMigrate)、错误时自动保存等场景共同调用,保证 id 计算一致。
25
+ */
26
+ export declare function saveConversation(ctx: ConversationContext): Promise<string>;
21
27
  //# sourceMappingURL=conversation-repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-repository.d.ts","sourceRoot":"","sources":["../src/conversation-repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,gCAAwD,CAAC"}
1
+ {"version":3,"file":"conversation-repository.d.ts","sourceRoot":"","sources":["../src/conversation-repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,gCAAwD,CAAC;AAE5F;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhF"}
@@ -8,4 +8,20 @@ import { EntityRepository } from "@ai-zen/agents-sdk";
8
8
  import { CONVERSATIONS_DIR } from "./config.js";
9
9
  /** 会话仓储:每个会话一个 JSON 文件(${conversationsDir}/${id}.json) */
10
10
  export const conversationRepository = new EntityRepository(CONVERSATIONS_DIR);
11
+ /**
12
+ * 保存当前对话到 conversations 目录。
13
+ * 迁移前落盘旧会话(onBeforeMigrate)、错误时自动保存等场景共同调用,保证 id 计算一致。
14
+ */
15
+ export async function saveConversation(ctx) {
16
+ const id = ctx.currentId || ctx.currentName.replace(/[\\/:*?"<>|]/g, "_");
17
+ await conversationRepository.write({
18
+ id,
19
+ agentId: ctx.agentId || "default",
20
+ modelId: ctx.modelId,
21
+ messages: ctx.agent.messages,
22
+ createdAt: new Date().toISOString(),
23
+ updatedAt: new Date().toISOString(),
24
+ });
25
+ return id;
26
+ }
11
27
  //# sourceMappingURL=conversation-repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-repository.js","sourceRoot":"","sources":["../src/conversation-repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAahD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,gBAAgB,CAAe,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"conversation-repository.js","sourceRoot":"","sources":["../src/conversation-repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAchD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,gBAAgB,CAAe,iBAAiB,CAAC,CAAC;AAE5F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAwB;IAC7D,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAC1E,MAAM,sBAAsB,CAAC,KAAK,CAAC;QACjC,EAAE;QACF,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;QACjC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IACH,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-runner.d.ts","sourceRoot":"","sources":["../src/conversation-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AA+E9C,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiLpF"}
1
+ {"version":3,"file":"conversation-runner.d.ts","sourceRoot":"","sources":["../src/conversation-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AA0D9C,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuJpF"}
@@ -9,28 +9,15 @@ import inquirer from "inquirer";
9
9
  import { AgentNS } from "@ai-zen/agents-core";
10
10
  import { AutoMigratePlugin, AutoRefreshToolsPlugin, ContextGuardPlugin, } from "@ai-zen/agents-sdk";
11
11
  import { DeltaRenderer } from "./delta-renderer.js";
12
- import { createAgent, createMigrationAgent } from "./agent-creator.js";
12
+ import { createAgent } from "./agent-creator.js";
13
13
  import { readConfig } from "./config.js";
14
14
  import { CwdTrackerPlugin } from "./cwd-tracker-plugin.js";
15
15
  import { DraftPlugin } from "./draft-plugin.js";
16
- import { draftRepository } from "./draft-repository.js";
17
- import { conversationRepository } from "./conversation-repository.js";
16
+ import { saveConversation } from "./conversation-repository.js";
17
+ import { createMigrationService } from "./migration-service.js";
18
18
  import { ensureEndpointConfig } from "./config-wizard.js";
19
19
  import { formatShortTime } from "./format-time.js";
20
20
  import { dispatchCommand, getCommandNames } from "./conversation-commands/index.js";
21
- /** 保存当前对话到 conversations 目录 */
22
- async function saveCurrentConversation(name, messages, modelId, existingId, agentId) {
23
- const id = existingId || name.replace(/[\\/:*?"<>|]/g, "_");
24
- await conversationRepository.write({
25
- id,
26
- agentId: agentId || "default",
27
- modelId,
28
- messages,
29
- createdAt: new Date().toISOString(),
30
- updatedAt: new Date().toISOString(),
31
- });
32
- return id;
33
- }
34
21
  // ==================== 发送消息 ====================
35
22
  async function sendAndStream(ctx) {
36
23
  console.log(chalk.green.bold("\n🤖 AI:"));
@@ -41,7 +28,7 @@ async function sendAndStream(ctx) {
41
28
  if (lastMessage?.status === "error") {
42
29
  console.error(chalk.red(`\n❌ 发生错误: ${JSON.stringify(lastMessage)}\n`));
43
30
  try {
44
- await saveCurrentConversation(ctx.currentName, ctx.agent.messages, ctx.modelId, ctx.currentId, ctx.agentId);
31
+ await saveConversation(ctx);
45
32
  console.log(chalk.yellow(`💾 错误时对话已自动保存: ${ctx.currentName}\n`));
46
33
  }
47
34
  catch (saveError) {
@@ -70,6 +57,16 @@ export async function runConversation(options) {
70
57
  await ensureEndpointConfig(modelId);
71
58
  // 在 runConversation 内部创建 agent
72
59
  const agent = await createAgent({ messages, agentId });
60
+ // 会话上下文:先创建基础字段(迁移服务实例随后装配并回填 migrationService)
61
+ const ctx = {
62
+ agent,
63
+ input: "",
64
+ currentName: conversationName || `对话_${formatShortTime(new Date().toISOString())}`,
65
+ currentId: conversationId,
66
+ modelId,
67
+ agentId,
68
+ running: true,
69
+ };
73
70
  // ============ 插件注册 ============
74
71
  // 1. cwdTracker — 追踪工作目录变化,动态通知 Agent
75
72
  agent.use(new CwdTrackerPlugin());
@@ -82,61 +79,24 @@ export async function runConversation(options) {
82
79
  cwd: process.cwd(),
83
80
  }));
84
81
  // 4/5. contextGuard 与 autoMigrate 的前置准备(读取模型最大上下文 token)
85
- const migrationAgent = await createMigrationAgent(modelId);
86
82
  const config = await readConfig();
87
83
  const modelConfig = config.models.find((m) => m.id === modelId);
88
84
  const maxTokens = modelConfig?.maxContextTokens ?? (modelConfig?.maxContextChars ? Math.floor(modelConfig.maxContextChars / 4) : undefined);
85
+ // 迁移服务实例:自动迁移(AutoMigratePlugin)与手动迁移(/migrate 命令)共用同一实例。
86
+ // 迁移前后处理(保存旧对话 / 开启新会话 / 落盘草稿)统一收敛到 src/migration-service.ts。
87
+ const migrationService = createMigrationService(ctx);
88
+ ctx.migrationService = migrationService;
89
89
  if (maxTokens && maxTokens > 0) {
90
- // 4. contextGuard — 请求前检测用量,严重超限(> maxTokens×1.2)时抛 ContextOverflowError 中断对话。
90
+ // contextGuard — 请求前检测用量,严重超限(> maxTokens×1.5)时抛 ContextOverflowError 中断对话。
91
91
  // 作为安全护栏置于迁移插件之前:防止读入超大文件等突发超限在迁移生效前撑爆上下文。
92
92
  agent.use(new ContextGuardPlugin({ maxTokens }));
93
- // 5. autoMigrate — 检测 token 超限时自动迁移
94
- agent.use(new AutoMigratePlugin({
95
- maxTokens,
96
- migrationAgent,
97
- onBeforeMigrate: async (promptTokens, maxTokens, agent) => {
98
- console.log(chalk.yellow.bold(`\n📋 检测到上下文即将超限(${promptTokens}/${maxTokens} tokens),正在自动生成交接文档以延续对话...\n`));
99
- // 迁移前 agent.messages 还是完整旧历史,先保存旧对话
100
- await saveCurrentConversation(ctx.currentName, agent.messages, ctx.modelId, ctx.currentId, ctx.agentId);
101
- console.log(chalk.gray(` ✅ 原对话已保存: ${ctx.currentName}`));
102
- },
103
- onMigrated: async (handoffDoc, agent) => {
104
- ctx.currentName = `对话_${formatShortTime(new Date().toISOString())}`;
105
- ctx.currentId = undefined;
106
- console.log(chalk.green.bold(`\n🚀 任务迁移完成!已开启新会话,共 ${agent.messages.length} 条消息。\n`));
107
- console.log(chalk.gray("💡 你可以继续提问,新助手已通过交接文档了解之前的全部工作。\n"));
108
- // 迁移后立即把新开场白保存为草稿(_current.json),
109
- // 避免迁移发生在 onAfterSend(DraftPlugin 的 onInnerLoopEnd 已不再触发)
110
- // 导致迁移后的新对话未被及时落盘,用户中途退出时丢失迁移后的开场白。
111
- try {
112
- await draftRepository.write({
113
- conversationId: ctx.currentId, // undefined → 写入 _current.json
114
- agentId: ctx.agentId || "default",
115
- modelId: ctx.modelId,
116
- messages: agent.messages,
117
- cwd: process.cwd(),
118
- updatedAt: new Date().toISOString(),
119
- });
120
- }
121
- catch (err) {
122
- console.warn(`[draft] 迁移后保存草稿失败: ${err?.message ?? err}`);
123
- }
124
- },
125
- }));
93
+ // autoMigrate — 检测 token 超限时自动迁移。仅负责触发(何时迁移),实际迁移委托给共享的 migrationService。
94
+ agent.use(new AutoMigratePlugin({ service: migrationService, maxTokens }));
126
95
  }
127
96
  // 初始化所有插件
128
97
  await agent.init();
129
98
  const cmdList = getCommandNames().map((c) => `/${c}`).join(", ");
130
99
  console.log(chalk.blue.bold(`💬 对话已开始 (输入 ${cmdList} 查看和操作)\n`));
131
- const ctx = {
132
- agent,
133
- input: "",
134
- currentName: conversationName || `对话_${formatShortTime(new Date().toISOString())}`,
135
- currentId: conversationId,
136
- modelId,
137
- agentId,
138
- running: true,
139
- };
140
100
  // ============ 流式渲染器 ============
141
101
  const renderer = new DeltaRenderer({
142
102
  reasoningHeader: "\n\n💭 思考中...\n",
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-runner.js","sourceRoot":"","sources":["../src/conversation-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-runner.js","sourceRoot":"","sources":["../src/conversation-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { TaskMigrationService } from "@ai-zen/agents-sdk";
2
+ import type { ConversationContext } from "./types.js";
3
+ /**
4
+ * 创建 CLI 迁移服务实例(自动迁移与手动迁移共用同一个实例)。
5
+ *
6
+ * 迁移前后处理统一收敛于此:保存旧对话 / 开启新会话 / 落盘草稿。
7
+ * 自动迁移由 AutoMigratePlugin 触发,手动迁移由 /migrate 命令触发,
8
+ * 两者都委托给本服务实例的 migrate(),从而保证行为一致、避免重复实现。
9
+ *
10
+ * @param ctx 当前会话上下文(先建后回填 migrationService;钩子直接引用该对象)
11
+ */
12
+ export declare function createMigrationService(ctx: ConversationContext): TaskMigrationService;
13
+ //# sourceMappingURL=migration-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-service.d.ts","sourceRoot":"","sources":["../src/migration-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,oBAAoB,CAAC;AAIjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,mBAAmB,GACvB,oBAAoB,CAkDtB"}
@@ -0,0 +1,56 @@
1
+ import chalk from "chalk";
2
+ import { TaskMigrationService } from "@ai-zen/agents-sdk";
3
+ import { saveConversation } from "./conversation-repository.js";
4
+ import { draftRepository } from "./draft-repository.js";
5
+ import { formatShortTime } from "./format-time.js";
6
+ /**
7
+ * 创建 CLI 迁移服务实例(自动迁移与手动迁移共用同一个实例)。
8
+ *
9
+ * 迁移前后处理统一收敛于此:保存旧对话 / 开启新会话 / 落盘草稿。
10
+ * 自动迁移由 AutoMigratePlugin 触发,手动迁移由 /migrate 命令触发,
11
+ * 两者都委托给本服务实例的 migrate(),从而保证行为一致、避免重复实现。
12
+ *
13
+ * @param ctx 当前会话上下文(先建后回填 migrationService;钩子直接引用该对象)
14
+ */
15
+ export function createMigrationService(ctx) {
16
+ return new TaskMigrationService({
17
+ // CLI 采用物理剔除模式:迁移后不保留历史消息,仅保留系统提示 + 交接断点。
18
+ strategy: "prune",
19
+ onBeforeMigrate: async (mctx) => {
20
+ // 自动迁移由 AutoMigratePlugin 传入 promptTokens/maxTokens;手动迁移为 undefined。
21
+ const isAuto = mctx.promptTokens != null && mctx.maxTokens != null;
22
+ if (isAuto) {
23
+ console.log(chalk.yellow.bold(`\n📋 检测到上下文即将超限(${mctx.promptTokens}/${mctx.maxTokens} tokens),正在自动生成交接文档以延续对话...\n`));
24
+ }
25
+ else {
26
+ console.log(chalk.yellow.bold(`\n📋 正在生成任务交接文档...\n`));
27
+ }
28
+ // 迁移前 agent.messages 仍是完整旧历史,先保存旧对话
29
+ await saveConversation(ctx);
30
+ console.log(chalk.gray(` ✅ 原对话已保存: ${ctx.currentName}`));
31
+ },
32
+ onMigrated: async (mctx) => {
33
+ ctx.currentName = `对话_${formatShortTime(new Date().toISOString())}`;
34
+ ctx.currentId = undefined;
35
+ console.log(chalk.green.bold(`\n🚀 任务迁移完成!已开启新会话,共 ${mctx.agent.messages.length} 条消息。\n`));
36
+ console.log(chalk.gray("💡 你可以继续提问,新助手已通过交接文档了解之前的全部工作。\n"));
37
+ // 迁移后立即把新开场白保存为草稿(_current.json),
38
+ // 避免迁移发生在 onAfterSend(DraftPlugin 的 onInnerLoopEnd 已不再触发)
39
+ // 导致迁移后的新对话未被及时落盘,用户中途退出时丢失迁移后的开场白。
40
+ try {
41
+ await draftRepository.write({
42
+ conversationId: ctx.currentId, // undefined → 写入 _current.json
43
+ agentId: ctx.agentId || "default",
44
+ modelId: ctx.modelId,
45
+ messages: mctx.agent.messages,
46
+ cwd: process.cwd(),
47
+ updatedAt: new Date().toISOString(),
48
+ });
49
+ }
50
+ catch (err) {
51
+ console.warn(`[draft] 迁移后保存草稿失败: ${err?.message ?? err}`);
52
+ }
53
+ },
54
+ });
55
+ }
56
+ //# sourceMappingURL=migration-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-service.js","sourceRoot":"","sources":["../src/migration-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAyB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAwB;IAExB,OAAO,IAAI,oBAAoB,CAAC;QAC9B,0CAA0C;QAC1C,QAAQ,EAAE,OAAO;QACjB,eAAe,EAAE,KAAK,EAAE,IAAsB,EAAE,EAAE;YAChD,qEAAqE;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;YACnE,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,IAAI,CACf,mBAAmB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,+BAA+B,CACtF,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACzD,CAAC;YACD,oCAAoC;YACpC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,IAAsB,EAAE,EAAE;YAC3C,GAAG,CAAC,WAAW,GAAG,MAAM,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;YAE1B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,IAAI,CACd,wBAAwB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS,CAC5D,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAChD,CAAC;YAEF,kCAAkC;YAClC,0DAA0D;YAC1D,oCAAoC;YACpC,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,KAAK,CAAC;oBAC1B,cAAc,EAAE,GAAG,CAAC,SAAS,EAAE,+BAA+B;oBAC9D,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;oBACjC,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAC7B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;oBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,sBAAsB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
package/dist/types.d.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  export type { AppConfig, Endpoint, Model, ImageModel, AgentDefinition, AgentPermissions, McpServerConfig, McpServerManifest, } from "@ai-zen/agents-sdk";
8
8
  export type { Conversation } from "./conversation-repository.js";
9
9
  export type { Draft } from "./draft-repository.js";
10
- import type { SdkAgent } from "@ai-zen/agents-sdk";
10
+ import type { SdkAgent, TaskMigrationService } from "@ai-zen/agents-sdk";
11
11
  export interface ConversationContext {
12
12
  agent: SdkAgent;
13
13
  input: string;
@@ -17,6 +17,8 @@ export interface ConversationContext {
17
17
  agentId: string | undefined;
18
18
  running: boolean;
19
19
  shouldSend?: boolean;
20
+ /** 迁移服务实例:自动迁移(AutoMigratePlugin)与手动迁移(/migrate 命令)共用同一实例。先建 ctx 再回填(migrate 前必已赋值) */
21
+ migrationService?: TaskMigrationService;
20
22
  }
21
23
  export type CommandHandler = (ctx: ConversationContext) => Promise<void>;
22
24
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,SAAS,EACT,QAAQ,EACR,KAAK,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,YAAY,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,SAAS,EACT,QAAQ,EACR,KAAK,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,YAAY,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-zen/cli",
3
- "version": "0.5.0",
3
+ "version": "0.6.1",
4
4
  "description": "AI-ZEN CLI - interactive conversation terminal with file tools and draft recovery",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,7 +21,7 @@
21
21
  "license": "MIT",
22
22
  "dependencies": {
23
23
  "@ai-zen/agents-core": "^4.0.0",
24
- "@ai-zen/agents-sdk": "^0.7.0",
24
+ "@ai-zen/agents-sdk": "^0.9.0",
25
25
  "@modelcontextprotocol/sdk": "^1.29.0",
26
26
  "chalk": "^5.3.0",
27
27
  "dayjs": "^1.11.21",