@ai-zen/cli 0.4.0 → 0.6.0

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,48 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.6.0] - 2026-08-24
4
+
5
+ ### 💥 破坏性变更
6
+
7
+ - **升级 `@ai-zen/agents-sdk` 到 0.8.0** — 任务迁移能力在 SDK 内完成重构(详见 SDK CHANGELOG):
8
+ - **`TaskMigrationService` 变为实例化、自包含迁移服务** —— 构造仅接收 `{ onBeforeMigrate?, onMigrated?, logger? }`(钩子平铺,无 `hooks` 包装),`migrate({ agent })` 直接复用传入 `agent` 的 `client`/`model`/`modelConfig` 生成交接文档,无需 Provider、无需独立迁移 Agent;暴露结构化 `MigrationContext`
9
+ - **`AutoMigratePlugin` 收敛为仅触发角色** —— 构造注入 `{ service, maxTokens }`,只检测 token 超限并委托 `service.migrate`
10
+ - **CLI 移除 `createMigrationAgent`** —— 删除 `src/agent-creator.ts` 中依赖已删除 `TaskMigrationService.createAgentDefinition` 的迁移 Agent 构建;手动迁移命令与自动迁移回调统一改为使用 SDK 迁移服务实例,钩子平铺在服务构造上
11
+
12
+ ### 🚀 新功能
13
+
14
+ - **手动任务迁移命令 `/migrate`** — 对话中随时输入 `/migrate` 即可主动触发任务迁移,无需等待 token 超限:
15
+ - 迁移动作:保存当前对话 → 生成交接文档 → 开启新会话(注入交接文档为上下文)→ 新对话落盘为草稿(`_current.json`)
16
+ - 与自动迁移联动复用 SDK 的 `TaskMigrationService.migrate`,通过 `onMigrated` 钩子处理后保存
17
+ - 非破坏性:旧对话已保存到 `conversations/`,生成失败时可重试或继续当前对话
18
+
19
+ ### 🎯 优化
20
+
21
+ - **迁移服务单实例收敛** — 将 `TaskMigrationService` 实例挂载到 `ConversationContext.migrationService`,自动迁移(`AutoMigratePlugin` 触发)与手动迁移(`/migrate` 命令)共用**同一个实例**;迁移前后处理(保存旧对话 / 开启新会话 / 落盘草稿)统一收敛到该服务钩子,消除自动与手动两侧各自 `new TaskMigrationService` 及重复的后处理实现
22
+ - **迁移服务抽离为独立模块** — 新增 `src/migration-service.ts`,由 `createMigrationService(ctx)` 统一构建迁移服务实例(含迁移前后钩子);`saveCurrentConversation` 提升为 `conversation-repository.ts` 的共享 `saveConversation`,供迁移钩子与错误保存共用
23
+
24
+ ### ✅ 测试
25
+
26
+ - SDK 侧:`TaskMigrationService`(含 `migrate` / 序列化 / 钩子上下文)、`AutoMigratePlugin`(触发委托断言)全量通过(447 passed / 2 skipped)
27
+ - CLI 侧:`pretest` 类型检查与全量单测通过(37 passed),`npm run build` 成功
28
+
29
+ ## [0.5.0] - 2026-08-23
30
+
31
+ ### 💥 破坏性变更
32
+
33
+ - **升级 `@ai-zen/agents-core` 到 4.0.0、`@ai-zen/agents-sdk` 到 0.7.0** — 随底层核心重构(官方 OpenAI SDK + 插件化 Agent 驱动层):
34
+ - **`createModel()` 返回结构变化** — 从返回旧 `ChatCompletionModel` 实例改为 `{ client, model, modelConfig }`(openai SDK client + 模型名 + 模型参数);`createMigrationAgent` 相应解构后传入 `SdkAgent` 新构造签名
35
+ - **`SdkAgent` 构造签名变化** — 由 `{ ..., model }`(模型对象)改为 `{ client, model, modelConfig }`
36
+ - **CLI 其余部分完全兼容** — 流式事件(`open`/`chunk`/`error`/`sub-agent`/`sub-agent-end`)、插件(`AutoMigratePlugin`/`AutoRefreshToolsPlugin`/`ContextGuardPlugin`)、`AgentNS` 类型(`Delta`/`StreamResponseData`/`Message`)在 core 4.0.0 / sdk 0.7.0 中原样保留,`AgentPlugin`/`SendContext` 由 sdk 重新导出,无破坏
37
+
38
+ ### ✅ 测试
39
+
40
+ - 依赖升级后单测全量通过(37 passed / 0 failed),`tsc --noEmit` 零错误
41
+
42
+ ### 🎯 优化
43
+
44
+ - **`test:all` / `test:e2e` 前置构建** — e2e 测试运行 `dist/index.js`,此前若 `dist` 缺失或为旧构建会导致 e2e 失败(升级后曾因旧 `dist` 报 `AgentContext must have a client`)。现于 e2e 前自动 `npm run build`,干净环境(CI clone 后)可开箱运行
45
+
3
46
  ## [0.4.0] - 2026-08-05
4
47
 
5
48
  ### 🚀 新功能
@@ -14,6 +57,23 @@
14
57
 
15
58
  - 依赖升级后单测全量通过(37 passed / 0 failed)
16
59
 
60
+ ## [0.3.5] - 2026-08-13
61
+
62
+ ### 🎯 优化
63
+
64
+ - **升级 `@ai-zen/agents-core` 到 3.3.1、`@ai-zen/agents-sdk` 到 0.5.7** — 跟随上游内部重构,开箱即用,CLI 无代码改动:
65
+ - **`innerLoopTasks` 拆分为双集合语义** — Core 3.3.1 新增 `innerLoopsTasks`(整组任务记录)与 `innerLoopTasks`(当前轮活跃任务);`abort()` 只中止当前轮活跃任务,不再误标已完成的轮次
66
+ - **内循环开头统一追加 Assistant 占位** — `send()` / `AgentTool` 不再手动追加 Assistant,由 `run()` 每次内循环开头统一处理,多轮工具调用同样收敛到该处
67
+ - **SDK 0.5.7 同步升级** — 依赖 core 3.3.1,全部 426 个测试(含真实 DeepSeek e2e)通过,完全兼容
68
+
69
+ ## [0.3.4] - 2026-08-14
70
+
71
+ ### 🎯 优化
72
+
73
+ - **升级 `@ai-zen/agents-core` 到 3.3.0、`@ai-zen/agents-sdk` 到 0.5.6** — 跟随上游统一重构,开箱即用,CLI 无代码改动:
74
+ - **`ToolCallContext` 统一贯穿「拦截决策 → 执行」** — Core 3.3.0 将 `FunctionCallContext` 统一为 `ToolCallContext`:`onToolCall` 钩子与 `Tool.exec(ctx)` 收同一个实例;新增 `tool_call`(统一形状)、`tool`(匹配到的工具)、`signal`(中止信号)字段,`toolCall` 改名为 `tool_call`。保留 `@deprecated FunctionCallContext` 兼容别名,旧代码无需改动
75
+ - **新增 `onToolCall` 拦截钩子** — Core 3.3.0 与 SDK 0.5.6 同时提供:每个工具调用执行前可**拒绝**(返回字符串 = 拒绝原因作为工具结果回给 LLM、工具不执行、继续下一轮);SDK 侧 `AgentPlugin` 支持该钩子(多插件按注册顺序调用,任一返回字符串即拒绝)
76
+
17
77
  ## [0.3.3] - 2026-08-05
18
78
 
19
79
  ### 🎯 优化
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
@@ -190,7 +193,7 @@ Same-named servers in higher priority override lower ones.
190
193
 
191
194
  ## Built-in Tools
192
195
 
193
- The CLI provides 17 built-in file system tools, implemented by `@ai-zen/agents-sdk`:
196
+ The CLI provides 19 built-in tools, implemented by `@ai-zen/agents-sdk`. Tool availability is self-declared by each tool via `isAvailable(config, definition)` at build time (when the model is already known):
194
197
 
195
198
  | Tool | Description |
196
199
  |------|-------------|
@@ -211,12 +214,8 @@ The CLI provides 17 built-in file system tools, implemented by `@ai-zen/agents-s
211
214
  | `rename` | Rename or move files |
212
215
  | `copy` | Copy files or directories |
213
216
  | `sleep` | Wait for a specified number of milliseconds |
214
-
215
- Conditionally injected (requires `defaultImageModel` in config):
216
-
217
- | Tool | Description |
218
- |------|-------------|
219
- | `generateImage` | Generate images from text |
217
+ | `viewImage` | View/analyze an image — vision models only (`Model.vision`). A network URL is returned as an `image_url` content block; a local path is auto-uploaded via the Files API and returned as a `file` content block |
218
+ | `generateImage` | Generate images from text — requires `defaultImageModel`; always returns a plain string (JSON with the image URLs plus `viewImage` / `downloadFile` hints) instead of forcing image content blocks |
220
219
 
221
220
  ### Dynamic Tools
222
221
 
@@ -234,8 +233,8 @@ In addition to built-in tools, the SDK provides 5 dynamic loading tools that are
234
233
 
235
234
  Tools are assembled in three phases by the SDK's `Provider` capability pipeline:
236
235
 
237
- 1. **Discovery** — Scan filesystem for built-in tools, user tools, SubAgents, Skills, and MCP servers
238
- 2. **Filtering** — Apply permissions (`allow`/`deny`) and security exclusions (recursion protection)
236
+ 1. **Discovery** — Scan filesystem for built-in tools, user tools, SubAgents, Skills, and MCP servers. All 19 built-in tools are discovered unconditionally (no filtering at this stage)
237
+ 2. **Filtering** — Apply permissions (`allow`/`deny`), security exclusions (recursion protection), and each tool's self-declared `isAvailable(config, definition)` (availability is decided at build time when the model is known; e.g. `viewImage` only for vision models, `generateImage` requires `defaultImageModel`)
239
238
  3. **Instantiation** — Map filtered names to `Tool` instances and register dynamic loaders
240
239
 
241
240
  Each Agent has independent permissions — no inheritance between parent Agent and SubAgent. The only exception is the temporary Skill sub-agent (created by `call_skill_sub_agent`), which inherits the caller's permissions as a transient conversation proxy rather than an independent entity.
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
  - **已完成的任务** — 任务标题和产出路径
@@ -190,7 +193,7 @@ MCP 服务器配置从多个来源合并(优先级从高到低):
190
193
 
191
194
  ## 内置工具
192
195
 
193
- CLI 提供 17 个内置文件系统工具,由 `@ai-zen/agents-sdk` 实现:
196
+ CLI 提供 19 个内置工具,由 `@ai-zen/agents-sdk` 实现。工具可用性由各工具在构建阶段(模型已知时)通过 `isAvailable(config, definition)` 自声明:
194
197
 
195
198
  | 工具 | 说明 |
196
199
  |------|------|
@@ -211,12 +214,8 @@ CLI 提供 17 个内置文件系统工具,由 `@ai-zen/agents-sdk` 实现:
211
214
  | `rename` | 重命名或移动文件 |
212
215
  | `copy` | 复制文件或目录 |
213
216
  | `sleep` | 等待指定毫秒数 |
214
-
215
- 条件注入(需配置 `defaultImageModel`):
216
-
217
- | 工具 | 说明 |
218
- |------|------|
219
- | `generateImage` | 根据描述生成图片 |
217
+ | `viewImage` | 查看/分析图片 — 仅视觉模型可用(`Model.vision`)。网络图片直接以 `image_url` 内容块返回;本地图片经 Files API 自动上传后以 `file` 内容块返回 |
218
+ | `generateImage` | 根据描述生成图片 — 需配置 `defaultImageModel`;统一返回字符串(含图片 URL 列表与 `viewImage` / `downloadFile` 提示的 JSON),不再强制返回图片内容块 |
220
219
 
221
220
  ### 动态工具
222
221
 
@@ -234,8 +233,8 @@ CLI 提供 17 个内置文件系统工具,由 `@ai-zen/agents-sdk` 实现:
234
233
 
235
234
  工具装配由 SDK 的 `Provider` 能力管线管理,分为三个阶段:
236
235
 
237
- 1. **发现** — 扫描文件系统获取内置工具、用户工具、SubAgent、Skill 和 MCP 服务器
238
- 2. **过滤** — 应用权限(`allow`/`deny`)和安全排除(递归保护)
236
+ 1. **发现** — 扫描文件系统获取内置工具、用户工具、SubAgent、Skill 和 MCP 服务器。19 个内置工具全部无条件发现(此阶段不做过滤)
237
+ 2. **过滤** — 应用权限(`allow`/`deny`)、安全排除(递归保护),以及各工具自声明的 `isAvailable(config, definition)`(在模型已知的构建阶段判断可用性;如 `viewImage` 仅视觉模型、`generateImage` 需配置 `defaultImageModel`)
239
238
  3. **实例化** — 将过滤后的名称映射为 `Tool` 实例,注册动态加载器
240
239
 
241
240
  每个 Agent 拥有独立的权限配置,父 Agent 与 SubAgent 之间不继承权限。唯一的例外是 `call_skill_sub_agent` 创建的临时 Skill 子 Agent——它是临时的对话分身而非独立实体,因此继承调用者的权限。
@@ -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,CAiB7E"}
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,22 +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 model = 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
- model,
82
- messages: definition.messages,
83
- tools: [],
84
- });
85
- }
86
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,CAgDtB"}
@@ -0,0 +1,54 @@
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
+ onBeforeMigrate: async (mctx) => {
18
+ // 自动迁移由 AutoMigratePlugin 传入 promptTokens/maxTokens;手动迁移为 undefined。
19
+ const isAuto = mctx.promptTokens != null && mctx.maxTokens != null;
20
+ if (isAuto) {
21
+ console.log(chalk.yellow.bold(`\n📋 检测到上下文即将超限(${mctx.promptTokens}/${mctx.maxTokens} tokens),正在自动生成交接文档以延续对话...\n`));
22
+ }
23
+ else {
24
+ console.log(chalk.yellow.bold(`\n📋 正在生成任务交接文档...\n`));
25
+ }
26
+ // 迁移前 agent.messages 仍是完整旧历史,先保存旧对话
27
+ await saveConversation(ctx);
28
+ console.log(chalk.gray(` ✅ 原对话已保存: ${ctx.currentName}`));
29
+ },
30
+ onMigrated: async (mctx) => {
31
+ ctx.currentName = `对话_${formatShortTime(new Date().toISOString())}`;
32
+ ctx.currentId = undefined;
33
+ console.log(chalk.green.bold(`\n🚀 任务迁移完成!已开启新会话,共 ${mctx.agent.messages.length} 条消息。\n`));
34
+ console.log(chalk.gray("💡 你可以继续提问,新助手已通过交接文档了解之前的全部工作。\n"));
35
+ // 迁移后立即把新开场白保存为草稿(_current.json),
36
+ // 避免迁移发生在 onAfterSend(DraftPlugin 的 onInnerLoopEnd 已不再触发)
37
+ // 导致迁移后的新对话未被及时落盘,用户中途退出时丢失迁移后的开场白。
38
+ try {
39
+ await draftRepository.write({
40
+ conversationId: ctx.currentId, // undefined → 写入 _current.json
41
+ agentId: ctx.agentId || "default",
42
+ modelId: ctx.modelId,
43
+ messages: mctx.agent.messages,
44
+ cwd: process.cwd(),
45
+ updatedAt: new Date().toISOString(),
46
+ });
47
+ }
48
+ catch (err) {
49
+ console.warn(`[draft] 迁移后保存草稿失败: ${err?.message ?? err}`);
50
+ }
51
+ },
52
+ });
53
+ }
54
+ //# 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,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.4.0",
3
+ "version": "0.6.0",
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",
@@ -20,8 +20,8 @@
20
20
  "author": "LZQCN",
21
21
  "license": "MIT",
22
22
  "dependencies": {
23
- "@ai-zen/agents-core": "^3.4.0",
24
- "@ai-zen/agents-sdk": "^0.6.0",
23
+ "@ai-zen/agents-core": "^4.0.0",
24
+ "@ai-zen/agents-sdk": "^0.8.0",
25
25
  "@modelcontextprotocol/sdk": "^1.29.0",
26
26
  "chalk": "^5.3.0",
27
27
  "dayjs": "^1.11.21",
@@ -47,7 +47,7 @@
47
47
  "start": "npm run build && node ./dist/index.js",
48
48
  "pretest": "tsc --noEmit -p tsconfig.test.json",
49
49
  "test": "vitest run",
50
- "test:e2e": "npm run pretest && vitest run --config vitest.e2e.config.ts",
51
- "test:all": "npm run pretest && vitest run && vitest run --config vitest.e2e.config.ts"
50
+ "test:e2e": "npm run pretest && npm run build && vitest run --config vitest.e2e.config.ts",
51
+ "test:all": "npm run pretest && vitest run && npm run build && vitest run --config vitest.e2e.config.ts"
52
52
  }
53
53
  }