@ai-zen/cli 1.0.0-alpha.2 → 1.0.0-alpha.22
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 +514 -0
- package/README.md +136 -39
- package/README.zh.md +136 -39
- package/dist/agent-creator.d.ts +11 -0
- package/dist/agent-creator.d.ts.map +1 -1
- package/dist/agent-creator.js +52 -21
- package/dist/agent-creator.js.map +1 -1
- package/dist/agent-switch.d.ts +61 -0
- package/dist/agent-switch.d.ts.map +1 -0
- package/dist/agent-switch.js +83 -0
- package/dist/agent-switch.js.map +1 -0
- package/dist/agents-store.d.ts +6 -1
- package/dist/agents-store.d.ts.map +1 -1
- package/dist/agents-store.js +46 -4
- package/dist/agents-store.js.map +1 -1
- package/dist/auto-migrate-confirm.d.ts +43 -0
- package/dist/auto-migrate-confirm.d.ts.map +1 -0
- package/dist/auto-migrate-confirm.js +47 -0
- package/dist/auto-migrate-confirm.js.map +1 -0
- package/dist/config-editor.d.ts +13 -5
- package/dist/config-editor.d.ts.map +1 -1
- package/dist/config-editor.js +36 -27
- package/dist/config-editor.js.map +1 -1
- package/dist/config.d.ts +24 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +55 -15
- package/dist/config.js.map +1 -1
- package/dist/conversation-commands/registry.d.ts +123 -4
- package/dist/conversation-commands/registry.d.ts.map +1 -1
- package/dist/conversation-commands/registry.js +92 -14
- package/dist/conversation-commands/registry.js.map +1 -1
- package/dist/conversation-persist-plugin.d.ts +0 -1
- package/dist/conversation-persist-plugin.d.ts.map +1 -1
- package/dist/conversation-persist-plugin.js +7 -16
- package/dist/conversation-persist-plugin.js.map +1 -1
- package/dist/conversation-repository.d.ts +71 -13
- package/dist/conversation-repository.d.ts.map +1 -1
- package/dist/conversation-repository.js +81 -24
- package/dist/conversation-repository.js.map +1 -1
- package/dist/cwd-tracker-plugin.d.ts.map +1 -1
- package/dist/cwd-tracker-plugin.js +6 -2
- package/dist/cwd-tracker-plugin.js.map +1 -1
- package/dist/format-time.d.ts +17 -6
- package/dist/format-time.d.ts.map +1 -1
- package/dist/format-time.js +32 -14
- package/dist/format-time.js.map +1 -1
- package/dist/handoff-service.d.ts +19 -0
- package/dist/handoff-service.d.ts.map +1 -0
- package/dist/handoff-service.js +89 -0
- package/dist/handoff-service.js.map +1 -0
- package/dist/hook.d.ts.map +1 -1
- package/dist/hook.js +69 -15
- package/dist/hook.js.map +1 -1
- package/dist/i18n/en-wizard.d.ts +8 -0
- package/dist/i18n/en-wizard.d.ts.map +1 -0
- package/dist/i18n/en-wizard.js +290 -0
- package/dist/i18n/en-wizard.js.map +1 -0
- package/dist/i18n/en.d.ts +7 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +224 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +57 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/preferences.d.ts +34 -0
- package/dist/i18n/preferences.d.ts.map +1 -0
- package/dist/i18n/preferences.js +69 -0
- package/dist/i18n/preferences.js.map +1 -0
- package/dist/i18n/zh-wizard.d.ts +11 -0
- package/dist/i18n/zh-wizard.d.ts.map +1 -0
- package/dist/i18n/zh-wizard.js +293 -0
- package/dist/i18n/zh-wizard.js.map +1 -0
- package/dist/i18n/zh.d.ts +10 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +228 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/index.js +61 -25
- package/dist/index.js.map +1 -1
- package/dist/mcp-command.d.ts +32 -0
- package/dist/mcp-command.d.ts.map +1 -0
- package/dist/mcp-command.js +37 -0
- package/dist/mcp-command.js.map +1 -0
- package/dist/mode.d.ts +31 -4
- package/dist/mode.d.ts.map +1 -1
- package/dist/mode.js +42 -7
- package/dist/mode.js.map +1 -1
- package/dist/model-switch.d.ts +58 -0
- package/dist/model-switch.d.ts.map +1 -0
- package/dist/model-switch.js +62 -0
- package/dist/model-switch.js.map +1 -0
- package/dist/reasoning-effort.d.ts +96 -0
- package/dist/reasoning-effort.d.ts.map +1 -0
- package/dist/reasoning-effort.js +164 -0
- package/dist/reasoning-effort.js.map +1 -0
- package/dist/reasoning-presets.d.ts +34 -0
- package/dist/reasoning-presets.d.ts.map +1 -0
- package/dist/reasoning-presets.js +85 -0
- package/dist/reasoning-presets.js.map +1 -0
- package/dist/sdk-log.d.ts +55 -0
- package/dist/sdk-log.d.ts.map +1 -0
- package/dist/sdk-log.js +91 -0
- package/dist/sdk-log.js.map +1 -0
- package/dist/session-pointer.d.ts +22 -9
- package/dist/session-pointer.d.ts.map +1 -1
- package/dist/session-pointer.js +55 -23
- package/dist/session-pointer.js.map +1 -1
- package/dist/stdio-runner.d.ts.map +1 -1
- package/dist/stdio-runner.js +32 -30
- package/dist/stdio-runner.js.map +1 -1
- package/dist/sub-agent-guard-plugin.d.ts +5 -5
- package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
- package/dist/sub-agent-guard-plugin.js +7 -7
- package/dist/sub-agent-guard-plugin.js.map +1 -1
- package/dist/tui/chat-session.d.ts +110 -59
- package/dist/tui/chat-session.d.ts.map +1 -1
- package/dist/tui/chat-session.js +268 -120
- package/dist/tui/chat-session.js.map +1 -1
- package/dist/tui/components.d.ts +48 -2
- package/dist/tui/components.d.ts.map +1 -1
- package/dist/tui/components.js +96 -3
- package/dist/tui/components.js.map +1 -1
- package/dist/tui/config-wizard/detail.d.ts +12 -6
- package/dist/tui/config-wizard/detail.d.ts.map +1 -1
- package/dist/tui/config-wizard/detail.js +33 -32
- package/dist/tui/config-wizard/detail.js.map +1 -1
- package/dist/tui/config-wizard/engine.d.ts.map +1 -1
- package/dist/tui/config-wizard/engine.js +27 -21
- package/dist/tui/config-wizard/engine.js.map +1 -1
- package/dist/tui/config-wizard/fields.d.ts +3 -1
- package/dist/tui/config-wizard/fields.d.ts.map +1 -1
- package/dist/tui/config-wizard/fields.js +216 -152
- package/dist/tui/config-wizard/fields.js.map +1 -1
- package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/kv-editor.js +9 -5
- package/dist/tui/config-wizard/kv-editor.js.map +1 -1
- package/dist/tui/config-wizard/list.d.ts.map +1 -1
- package/dist/tui/config-wizard/list.js +2 -1
- package/dist/tui/config-wizard/list.js.map +1 -1
- package/dist/tui/config-wizard/mcp-helpers.d.ts.map +1 -1
- package/dist/tui/config-wizard/mcp-helpers.js +4 -3
- package/dist/tui/config-wizard/mcp-helpers.js.map +1 -1
- package/dist/tui/config-wizard/menu.d.ts.map +1 -1
- package/dist/tui/config-wizard/menu.js +33 -21
- package/dist/tui/config-wizard/menu.js.map +1 -1
- package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/prompt-editor.js +4 -3
- package/dist/tui/config-wizard/prompt-editor.js.map +1 -1
- package/dist/tui/config-wizard/prompt.d.ts.map +1 -1
- package/dist/tui/config-wizard/prompt.js +8 -7
- package/dist/tui/config-wizard/prompt.js.map +1 -1
- package/dist/tui/config-wizard/step-agents.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-agents.js +29 -20
- package/dist/tui/config-wizard/step-agents.js.map +1 -1
- package/dist/tui/config-wizard/step-defaults.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-defaults.js +24 -27
- package/dist/tui/config-wizard/step-defaults.js.map +1 -1
- package/dist/tui/config-wizard/step-endpoints.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-endpoints.js +16 -6
- package/dist/tui/config-wizard/step-endpoints.js.map +1 -1
- package/dist/tui/config-wizard/step-mcp.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-mcp.js +17 -19
- package/dist/tui/config-wizard/step-mcp.js.map +1 -1
- package/dist/tui/config-wizard/step-models.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-models.js +41 -26
- package/dist/tui/config-wizard/step-models.js.map +1 -1
- package/dist/tui/config-wizard/step-new-endpoint.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-new-endpoint.js +16 -12
- package/dist/tui/config-wizard/step-new-endpoint.js.map +1 -1
- package/dist/tui/config-wizard/step-simple.d.ts.map +1 -1
- package/dist/tui/config-wizard/step-simple.js +18 -17
- package/dist/tui/config-wizard/step-simple.js.map +1 -1
- package/dist/tui/config-wizard/types.d.ts +18 -3
- package/dist/tui/config-wizard/types.d.ts.map +1 -1
- package/dist/tui/config-wizard/wizard.d.ts.map +1 -1
- package/dist/tui/config-wizard/wizard.js +4 -3
- package/dist/tui/config-wizard/wizard.js.map +1 -1
- package/dist/tui/highlight.d.ts +3 -2
- package/dist/tui/highlight.d.ts.map +1 -1
- package/dist/tui/highlight.js +3 -2
- package/dist/tui/highlight.js.map +1 -1
- package/dist/tui/index.d.ts +18 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +107 -49
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/input-editing.d.ts +52 -0
- package/dist/tui/input-editing.d.ts.map +1 -0
- package/dist/tui/input-editing.js +91 -0
- package/dist/tui/input-editing.js.map +1 -0
- package/dist/tui/key-debug.d.ts +62 -0
- package/dist/tui/key-debug.d.ts.map +1 -0
- package/dist/tui/key-debug.js +92 -0
- package/dist/tui/key-debug.js.map +1 -0
- package/dist/tui/mouse.d.ts +55 -0
- package/dist/tui/mouse.d.ts.map +1 -0
- package/dist/tui/mouse.js +74 -0
- package/dist/tui/mouse.js.map +1 -0
- package/dist/tui/phase.d.ts +64 -0
- package/dist/tui/phase.d.ts.map +1 -0
- package/dist/tui/phase.js +112 -0
- package/dist/tui/phase.js.map +1 -0
- package/dist/tui/screens/chat-commands.d.ts +64 -3
- package/dist/tui/screens/chat-commands.d.ts.map +1 -1
- package/dist/tui/screens/chat-commands.js +483 -157
- package/dist/tui/screens/chat-commands.js.map +1 -1
- package/dist/tui/screens/chat.d.ts +10 -5
- package/dist/tui/screens/chat.d.ts.map +1 -1
- package/dist/tui/screens/chat.js +464 -301
- package/dist/tui/screens/chat.js.map +1 -1
- package/dist/tui/screens/common-keys.d.ts +36 -0
- package/dist/tui/screens/common-keys.d.ts.map +1 -0
- package/dist/tui/screens/common-keys.js +67 -0
- package/dist/tui/screens/common-keys.js.map +1 -0
- package/dist/tui/screens/frame-buffer.d.ts +47 -0
- package/dist/tui/screens/frame-buffer.d.ts.map +1 -0
- package/dist/tui/screens/frame-buffer.js +78 -0
- package/dist/tui/screens/frame-buffer.js.map +1 -0
- package/dist/tui/screens/handoff-choice.d.ts +37 -0
- package/dist/tui/screens/handoff-choice.d.ts.map +1 -0
- package/dist/tui/screens/handoff-choice.js +42 -0
- package/dist/tui/screens/handoff-choice.js.map +1 -0
- package/dist/tui/screens/index.d.ts +8 -8
- package/dist/tui/screens/index.d.ts.map +1 -1
- package/dist/tui/screens/index.js +7 -7
- package/dist/tui/screens/index.js.map +1 -1
- package/dist/tui/screens/input-row.d.ts +64 -0
- package/dist/tui/screens/input-row.d.ts.map +1 -0
- package/dist/tui/screens/input-row.js +67 -0
- package/dist/tui/screens/input-row.js.map +1 -0
- package/dist/tui/screens/input.d.ts +46 -1
- package/dist/tui/screens/input.d.ts.map +1 -1
- package/dist/tui/screens/input.js +83 -8
- package/dist/tui/screens/input.js.map +1 -1
- package/dist/tui/screens/layout.d.ts +21 -3
- package/dist/tui/screens/layout.d.ts.map +1 -1
- package/dist/tui/screens/layout.js +20 -9
- package/dist/tui/screens/layout.js.map +1 -1
- package/dist/tui/screens/lines.d.ts +12 -41
- package/dist/tui/screens/lines.d.ts.map +1 -1
- package/dist/tui/screens/lines.js +90 -98
- package/dist/tui/screens/lines.js.map +1 -1
- package/dist/tui/screens/messages-view.d.ts +10 -0
- package/dist/tui/screens/messages-view.d.ts.map +1 -0
- package/dist/tui/screens/messages-view.js +116 -0
- package/dist/tui/screens/messages-view.js.map +1 -0
- package/dist/tui/screens/notice-bar.d.ts +5 -0
- package/dist/tui/screens/notice-bar.d.ts.map +1 -0
- package/dist/tui/screens/notice-bar.js +15 -0
- package/dist/tui/screens/notice-bar.js.map +1 -0
- package/dist/tui/screens/notice.d.ts +64 -0
- package/dist/tui/screens/notice.d.ts.map +1 -0
- package/dist/tui/screens/notice.js +106 -0
- package/dist/tui/screens/notice.js.map +1 -0
- package/dist/tui/screens/overlays.d.ts.map +1 -1
- package/dist/tui/screens/overlays.js +3 -2
- package/dist/tui/screens/overlays.js.map +1 -1
- package/dist/tui/screens/render.d.ts +2 -4
- package/dist/tui/screens/render.d.ts.map +1 -1
- package/dist/tui/screens/render.js +7 -43
- package/dist/tui/screens/render.js.map +1 -1
- package/dist/tui/screens/splash.d.ts +1 -1
- package/dist/tui/screens/splash.d.ts.map +1 -1
- package/dist/tui/screens/splash.js +12 -3
- package/dist/tui/screens/splash.js.map +1 -1
- package/dist/tui/screens/use-chat-viewport.d.ts +22 -0
- package/dist/tui/screens/use-chat-viewport.d.ts.map +1 -0
- package/dist/tui/screens/use-chat-viewport.js +50 -0
- package/dist/tui/screens/use-chat-viewport.js.map +1 -0
- package/dist/tui/screens/use-input-editing.d.ts +44 -0
- package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
- package/dist/tui/screens/use-input-editing.js +192 -0
- package/dist/tui/screens/use-input-editing.js.map +1 -0
- package/dist/tui/screens/use-overlays.d.ts +25 -0
- package/dist/tui/screens/use-overlays.d.ts.map +1 -0
- package/dist/tui/screens/use-overlays.js +32 -0
- package/dist/tui/screens/use-overlays.js.map +1 -0
- package/dist/tui/screens/use-wizard-host.d.ts +35 -0
- package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
- package/dist/tui/screens/use-wizard-host.js +103 -0
- package/dist/tui/screens/use-wizard-host.js.map +1 -0
- package/dist/tui/status-segments.d.ts +37 -0
- package/dist/tui/status-segments.d.ts.map +1 -0
- package/dist/tui/status-segments.js +166 -0
- package/dist/tui/status-segments.js.map +1 -0
- package/dist/tui/text.d.ts +20 -7
- package/dist/tui/text.d.ts.map +1 -1
- package/dist/tui/text.js +111 -37
- package/dist/tui/text.js.map +1 -1
- package/dist/tui/theme.d.ts +7 -1
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +15 -3
- package/dist/tui/theme.js.map +1 -1
- package/dist/tui/token-rate.d.ts +83 -0
- package/dist/tui/token-rate.d.ts.map +1 -0
- package/dist/tui/token-rate.js +195 -0
- package/dist/tui/token-rate.js.map +1 -0
- package/dist/types.d.ts +7 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -3
- package/dist/auto-migrate-confirm-plugin.d.ts +0 -58
- package/dist/auto-migrate-confirm-plugin.d.ts.map +0 -1
- package/dist/auto-migrate-confirm-plugin.js +0 -61
- package/dist/auto-migrate-confirm-plugin.js.map +0 -1
- package/dist/migration-service.d.ts +0 -15
- package/dist/migration-service.d.ts.map +0 -1
- package/dist/migration-service.js +0 -59
- package/dist/migration-service.js.map +0 -1
- package/dist/tui/screens/state.d.ts +0 -13
- package/dist/tui/screens/state.d.ts.map +0 -1
- package/dist/tui/screens/state.js +0 -75
- package/dist/tui/screens/state.js.map +0 -1
package/dist/agent-creator.js
CHANGED
|
@@ -10,12 +10,45 @@ import { Scope, allInOne, createAgent as sdkCreateAgent, } from "@ai-zen/agents-
|
|
|
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
|
// ==================== Scope 创建(单例)====================
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Scope 单例缓存的是 **Promise** 而非实例。
|
|
15
|
+
*
|
|
16
|
+
* 缓存实例时,`if (_scope) return _scope` 之后到赋值之间有一段 `await`(读配置、初始化),
|
|
17
|
+
* 并发调用会一起穿透 → 建出两个 Scope(MCP 双连接、双份工具发现、双份子进程)。
|
|
18
|
+
* 缓存 Promise 让并发调用共享同一次初始化。
|
|
19
|
+
*/
|
|
20
|
+
let _scopePromise = null;
|
|
14
21
|
/** existsSync 的别名,用于数组 .filter() 场景 */
|
|
15
22
|
const exists = existsSync;
|
|
23
|
+
/**
|
|
24
|
+
* Skill 目录列表(优先级从高到低):
|
|
25
|
+
* 1. 项目/.ai-zen/skills/
|
|
26
|
+
* 2. 项目/.agents/skills/ ← 业界通用规范
|
|
27
|
+
* 3. ~/.ai-zen/skills/
|
|
28
|
+
* 4. ~/.agents/skills/ ← 业界通用规范
|
|
29
|
+
*
|
|
30
|
+
* 同时供 Scope 装配与交接服务(读取 `handoff` Skill 正文)使用,避免两处各算一遍。
|
|
31
|
+
* 只返回**当前真实存在**的目录,不存在的不参与发现。
|
|
32
|
+
*/
|
|
33
|
+
export function listSkillDirs() {
|
|
34
|
+
return [
|
|
35
|
+
PROJECT_SKILLS_DIR,
|
|
36
|
+
PROJECT_AGENTS_SKILLS_DIR,
|
|
37
|
+
SKILLS_DIR,
|
|
38
|
+
USER_AGENTS_SKILLS_DIR,
|
|
39
|
+
].filter(exists);
|
|
40
|
+
}
|
|
16
41
|
export async function getScope() {
|
|
17
|
-
if (
|
|
18
|
-
|
|
42
|
+
if (!_scopePromise) {
|
|
43
|
+
_scopePromise = createScopeOnce().catch((error) => {
|
|
44
|
+
// 初始化失败不缓存:否则一次瞬时故障会让后续所有发送都拿到同一个已 reject 的 Promise
|
|
45
|
+
_scopePromise = null;
|
|
46
|
+
throw error;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return _scopePromise;
|
|
50
|
+
}
|
|
51
|
+
async function createScopeOnce() {
|
|
19
52
|
const config = await readConfig();
|
|
20
53
|
// MCP 配置合并优先级(从高到低):
|
|
21
54
|
// 1. 项目/.mcp.json
|
|
@@ -30,18 +63,9 @@ export async function getScope() {
|
|
|
30
63
|
join(AI_ZEN_DIR, "mcp.json"),
|
|
31
64
|
USER_AGENTS_MCP_CONFIG_FILE,
|
|
32
65
|
].filter(exists);
|
|
33
|
-
// Skills
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// 3. ~/.ai-zen/skills/
|
|
37
|
-
// 4. ~/.agents/skills/ ← 业界通用规范
|
|
38
|
-
const skillsPaths = [
|
|
39
|
-
PROJECT_SKILLS_DIR,
|
|
40
|
-
PROJECT_AGENTS_SKILLS_DIR,
|
|
41
|
-
SKILLS_DIR,
|
|
42
|
-
USER_AGENTS_SKILLS_DIR,
|
|
43
|
-
].filter(exists);
|
|
44
|
-
_scope = new Scope({
|
|
66
|
+
// Skills 目录优先级(从高到低):见 listSkillDirs()
|
|
67
|
+
const skillsPaths = listSkillDirs();
|
|
68
|
+
const scope = new Scope({
|
|
45
69
|
config,
|
|
46
70
|
agentsDir: AGENTS_DIR,
|
|
47
71
|
}).use(...allInOne({
|
|
@@ -50,8 +74,8 @@ export async function getScope() {
|
|
|
50
74
|
toolsPaths: [PROJECT_TOOLS_DIR, TOOLS_DIR].filter(exists),
|
|
51
75
|
mcpPaths,
|
|
52
76
|
}));
|
|
53
|
-
await
|
|
54
|
-
return
|
|
77
|
+
await scope.init();
|
|
78
|
+
return scope;
|
|
55
79
|
}
|
|
56
80
|
/**
|
|
57
81
|
* 重置 Scope 单例:释放当前 Scope(断开 MCP 连接等),下次 `getScope()` 按磁盘配置重建。
|
|
@@ -60,11 +84,13 @@ export async function getScope() {
|
|
|
60
84
|
* 读取一次,不重建则新配置不生效。`_scope` 是同步置空的,便于并发调用方立刻拿到新实例。
|
|
61
85
|
*/
|
|
62
86
|
export async function resetScope() {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
87
|
+
// 同步置空,便于并发调用方立刻拿到新实例;若初始化仍在进行,等它落地后再释放
|
|
88
|
+
const pending = _scopePromise;
|
|
89
|
+
_scopePromise = null;
|
|
90
|
+
if (!pending)
|
|
66
91
|
return;
|
|
67
92
|
try {
|
|
93
|
+
const scope = await pending;
|
|
68
94
|
await scope.dispose();
|
|
69
95
|
}
|
|
70
96
|
catch {
|
|
@@ -75,7 +101,12 @@ export async function createAgent(options) {
|
|
|
75
101
|
const { messages, agentId } = options;
|
|
76
102
|
const scope = await getScope();
|
|
77
103
|
// 始终从磁盘读取 Agent 定义(含 permissions、工具配置等)
|
|
78
|
-
const agent = await sdkCreateAgent(scope, agentId || "default"
|
|
104
|
+
const agent = await sdkCreateAgent(scope, agentId || "default", {
|
|
105
|
+
// 中断时保留模型已经输出的思考与内容:用户按下中断键后,屏幕上那半句话仍然
|
|
106
|
+
// 留在上下文里,模型下一轮能接着往下说,而不是「失忆重来」。
|
|
107
|
+
// (core 默认是 drop;工具轮次不受影响,仍按 abortedToolRoundStrategy 归一)
|
|
108
|
+
abortedMessageStrategy: "keep",
|
|
109
|
+
});
|
|
79
110
|
// 有历史消息时替换(恢复草稿/已保存对话)。
|
|
80
111
|
// 拷贝而非直接引用:恢复的数组来自草稿/对话存档,直接引用会让后续 append 改写传入数组。
|
|
81
112
|
if (messages && messages.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
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,KAAK,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,wDAAwD;AAExD,IAAI,
|
|
1
|
+
{"version":3,"file":"agent-creator.js","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 主 Agent 切换 —— `/agent` 的校验与写配置策略(纯逻辑,可单测)
|
|
3
|
+
*
|
|
4
|
+
* ## 「主 Agent」是哪一个
|
|
5
|
+
*
|
|
6
|
+
* 配置里只有一个主 Agent 概念:**`AppConfig.defaultAgent`**(缺省时 SDK 取
|
|
7
|
+
* `~/.ai-zen/agents/` 下的第一个)。`/agent` 就是把用户选中的那个写回这里,
|
|
8
|
+
* 与 `/config` →「默认 Agent」写的是同一个字段,不存在第二套状态。
|
|
9
|
+
*
|
|
10
|
+
* ## 切换前必须能跑起来
|
|
11
|
+
*
|
|
12
|
+
* Agent 定义里的 `modelId` 是运行期唯一真相源(`createAgent` 只认它)。所以切换
|
|
13
|
+
* 前先做完整链路校验:Agent 存在 → 绑定了模型 → 模型还在配置里 → 端点在 → 端点有 Key。
|
|
14
|
+
* 少任何一环都直接抛错并把原因说清楚,绝不「先切过去再看它崩不崩」——切完是要
|
|
15
|
+
* 重挂载对话屏的,崩了用户连 `/model` 都敲不进去。
|
|
16
|
+
*
|
|
17
|
+
* ## 不动 Agent 定义本身
|
|
18
|
+
*
|
|
19
|
+
* 切 Agent 只改「用哪个」,不改「那个 Agent 长什么样」:不写 `modelParams`、
|
|
20
|
+
* 不碰提示词、不碰权限。要改这些走 `/model`、`/think`、`/config`。
|
|
21
|
+
*/
|
|
22
|
+
import type { AgentDefinition, AppConfig } from "@ai-zen/agents-sdk";
|
|
23
|
+
/** 选择器里的一行:一个可选的主 Agent */
|
|
24
|
+
export interface AgentChoice {
|
|
25
|
+
id: string;
|
|
26
|
+
/** 展示名(`name` 缺失时回落 id) */
|
|
27
|
+
name: string;
|
|
28
|
+
/** 绑定的模型名(未绑定 / 模型已删时为 undefined) */
|
|
29
|
+
modelName?: string;
|
|
30
|
+
/** 是否可切换(模型与端点凭据齐备) */
|
|
31
|
+
selectable: boolean;
|
|
32
|
+
/** 不可切换的原因(可切换时为 undefined) */
|
|
33
|
+
reason?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 列出全部主 Agent 及其可用性,供 `/agent` 选择器渲染。
|
|
37
|
+
*
|
|
38
|
+
* 不可用的也列出来(而不是隐藏):用户能看到「那个 Agent 为什么切不过去」,
|
|
39
|
+
* 比列表里凭空少一个更容易排查。
|
|
40
|
+
*/
|
|
41
|
+
export declare function listAgentChoices(config: AppConfig, agents: readonly AgentDefinition[]): AgentChoice[];
|
|
42
|
+
export interface SwitchAgentOptions {
|
|
43
|
+
config: AppConfig;
|
|
44
|
+
/** 可选的主 Agent 列表(`~/.ai-zen/agents/*.json` 快照) */
|
|
45
|
+
agents: readonly AgentDefinition[];
|
|
46
|
+
/** 目标 Agent id */
|
|
47
|
+
targetAgentId: string;
|
|
48
|
+
}
|
|
49
|
+
export interface SwitchAgentResult {
|
|
50
|
+
/** 已写入 `defaultAgent` 的新配置(调用方负责落盘) */
|
|
51
|
+
config: AppConfig;
|
|
52
|
+
/** 面向用户的一句话结果 */
|
|
53
|
+
summary: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 校验目标 Agent 能否切换,并返回「写好 `defaultAgent` 的新配置」。
|
|
57
|
+
*
|
|
58
|
+
* 抛错场景:Agent 不存在、未绑定模型、模型不在配置里、端点不存在、端点缺 Key。
|
|
59
|
+
*/
|
|
60
|
+
export declare function switchAgent(options: SwitchAgentOptions): SwitchAgentResult;
|
|
61
|
+
//# sourceMappingURL=agent-switch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-switch.d.ts","sourceRoot":"","sources":["../src/agent-switch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAIrE,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,WAAW,EAAE,CAqBf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,kDAAkD;IAClD,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC,kBAAkB;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,MAAM,EAAE,SAAS,CAAC;IAClB,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CA4B1E"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 主 Agent 切换 —— `/agent` 的校验与写配置策略(纯逻辑,可单测)
|
|
3
|
+
*
|
|
4
|
+
* ## 「主 Agent」是哪一个
|
|
5
|
+
*
|
|
6
|
+
* 配置里只有一个主 Agent 概念:**`AppConfig.defaultAgent`**(缺省时 SDK 取
|
|
7
|
+
* `~/.ai-zen/agents/` 下的第一个)。`/agent` 就是把用户选中的那个写回这里,
|
|
8
|
+
* 与 `/config` →「默认 Agent」写的是同一个字段,不存在第二套状态。
|
|
9
|
+
*
|
|
10
|
+
* ## 切换前必须能跑起来
|
|
11
|
+
*
|
|
12
|
+
* Agent 定义里的 `modelId` 是运行期唯一真相源(`createAgent` 只认它)。所以切换
|
|
13
|
+
* 前先做完整链路校验:Agent 存在 → 绑定了模型 → 模型还在配置里 → 端点在 → 端点有 Key。
|
|
14
|
+
* 少任何一环都直接抛错并把原因说清楚,绝不「先切过去再看它崩不崩」——切完是要
|
|
15
|
+
* 重挂载对话屏的,崩了用户连 `/model` 都敲不进去。
|
|
16
|
+
*
|
|
17
|
+
* ## 不动 Agent 定义本身
|
|
18
|
+
*
|
|
19
|
+
* 切 Agent 只改「用哪个」,不改「那个 Agent 长什么样」:不写 `modelParams`、
|
|
20
|
+
* 不碰提示词、不碰权限。要改这些走 `/model`、`/think`、`/config`。
|
|
21
|
+
*/
|
|
22
|
+
import { resolveCredential } from "./config-editor.js";
|
|
23
|
+
import { t } from "./i18n/index.js";
|
|
24
|
+
/**
|
|
25
|
+
* 列出全部主 Agent 及其可用性,供 `/agent` 选择器渲染。
|
|
26
|
+
*
|
|
27
|
+
* 不可用的也列出来(而不是隐藏):用户能看到「那个 Agent 为什么切不过去」,
|
|
28
|
+
* 比列表里凭空少一个更容易排查。
|
|
29
|
+
*/
|
|
30
|
+
export function listAgentChoices(config, agents) {
|
|
31
|
+
return agents.map((agent) => {
|
|
32
|
+
const name = agent.name || agent.id;
|
|
33
|
+
if (!agent.modelId) {
|
|
34
|
+
return { id: agent.id, name, selectable: false, reason: t("agentSwitch.err.noModel") };
|
|
35
|
+
}
|
|
36
|
+
const credential = resolveCredential(config, agent.modelId);
|
|
37
|
+
if (!credential) {
|
|
38
|
+
return { id: agent.id, name, selectable: false, reason: t("agentSwitch.err.modelMissing", { id: agent.modelId }) };
|
|
39
|
+
}
|
|
40
|
+
if (!credential.configured) {
|
|
41
|
+
return {
|
|
42
|
+
id: agent.id,
|
|
43
|
+
name,
|
|
44
|
+
modelName: credential.modelName,
|
|
45
|
+
selectable: false,
|
|
46
|
+
reason: t("agentSwitch.err.missingKey", { endpoint: credential.endpointName }),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return { id: agent.id, name, modelName: credential.modelName, selectable: true };
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 校验目标 Agent 能否切换,并返回「写好 `defaultAgent` 的新配置」。
|
|
54
|
+
*
|
|
55
|
+
* 抛错场景:Agent 不存在、未绑定模型、模型不在配置里、端点不存在、端点缺 Key。
|
|
56
|
+
*/
|
|
57
|
+
export function switchAgent(options) {
|
|
58
|
+
const { config, agents, targetAgentId } = options;
|
|
59
|
+
const agent = agents.find((item) => item.id === targetAgentId);
|
|
60
|
+
if (!agent)
|
|
61
|
+
throw new Error(t("agentSwitch.err.agentMissing", { id: targetAgentId }));
|
|
62
|
+
const name = agent.name || agent.id;
|
|
63
|
+
if (!agent.modelId) {
|
|
64
|
+
throw new Error(t("agentSwitch.err.agentNoModel", { name }));
|
|
65
|
+
}
|
|
66
|
+
const credential = resolveCredential(config, agent.modelId);
|
|
67
|
+
if (!credential) {
|
|
68
|
+
throw new Error(t("agentSwitch.err.modelGone", { name, id: agent.modelId }));
|
|
69
|
+
}
|
|
70
|
+
if (!credential.configured) {
|
|
71
|
+
throw new Error(t("agentSwitch.err.noKey", { endpoint: credential.endpointName }));
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
config: { ...config, defaultAgent: agent.id },
|
|
75
|
+
summary: t("agentSwitch.summary", {
|
|
76
|
+
name,
|
|
77
|
+
id: agent.id,
|
|
78
|
+
model: credential.modelName,
|
|
79
|
+
modelId: credential.modelId,
|
|
80
|
+
}),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=agent-switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-switch.js","sourceRoot":"","sources":["../src/agent-switch.ts"],"names":[],"mappings":"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"}
|
package/dist/agents-store.d.ts
CHANGED
|
@@ -13,7 +13,12 @@ import type { AgentDefinition } from "@ai-zen/agents-sdk";
|
|
|
13
13
|
export type AgentKind = "agent" | "subagent";
|
|
14
14
|
/** 某个 kind 对应的定义目录 */
|
|
15
15
|
export declare function agentDir(kind: AgentKind): string;
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* kind 的显示名(`Agent` / `Sub-agent`)。
|
|
18
|
+
*
|
|
19
|
+
* 刻意**不本地化**:这两个词在配置中心的英文界面与中文界面里是同一个行业惯用写法,
|
|
20
|
+
* 翻译成「代理 / 子代理」反而难认。真要本地化,应该走 `t()` 而不是在这里硬编码。
|
|
21
|
+
*/
|
|
17
22
|
export declare function agentKindLabel(kind: AgentKind): string;
|
|
18
23
|
/** 「Agent 定义」管理用的仓储:快照 + 写 / 删操作 */
|
|
19
24
|
export interface AgentStore {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-store.d.ts","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"agents-store.d.ts","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAA+B,MAAM,oBAAoB,CAAC;AAIvF,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAE7C,sBAAsB;AACtB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEhD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEtD;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,oBAAoB;AACpB,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,eAAe,EAAE,CAE/E;AAED,wBAAwB;AACxB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,GAAG,SAAS,GACrB,eAAe,GAAG,SAAS,CAG7B;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,UAAU,CAWpG;AAED,2CAA2C;AAC3C,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAiC1D"}
|
package/dist/agents-store.js
CHANGED
|
@@ -9,12 +9,18 @@
|
|
|
9
9
|
* 与「快照 + 写操作」的组装,便于 TUI 与单测共用。
|
|
10
10
|
*/
|
|
11
11
|
import { AgentRepository } from "@ai-zen/agents-sdk";
|
|
12
|
-
import { AGENTS_DIR, SUB_AGENTS_DIR } from "./config.js";
|
|
12
|
+
import { AGENTS_DIR, SUB_AGENTS_DIR, readConfig, readReasoningPresets } from "./config.js";
|
|
13
|
+
import { patchOf, presetFor } from "./reasoning-presets.js";
|
|
13
14
|
/** 某个 kind 对应的定义目录 */
|
|
14
15
|
export function agentDir(kind) {
|
|
15
16
|
return kind === "agent" ? AGENTS_DIR : SUB_AGENTS_DIR;
|
|
16
17
|
}
|
|
17
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* kind 的显示名(`Agent` / `Sub-agent`)。
|
|
20
|
+
*
|
|
21
|
+
* 刻意**不本地化**:这两个词在配置中心的英文界面与中文界面里是同一个行业惯用写法,
|
|
22
|
+
* 翻译成「代理 / 子代理」反而难认。真要本地化,应该走 `t()` 而不是在这里硬编码。
|
|
23
|
+
*/
|
|
18
24
|
export function agentKindLabel(kind) {
|
|
19
25
|
return kind === "agent" ? "Agent" : "Sub-agent";
|
|
20
26
|
}
|
|
@@ -43,8 +49,44 @@ export function createAgentStore(agents, subAgents) {
|
|
|
43
49
|
}
|
|
44
50
|
/** 从磁盘读取 Agent / Sub-agent 快照,并附带真实读写能力 */
|
|
45
51
|
export async function readAgentStore() {
|
|
46
|
-
const
|
|
47
|
-
const
|
|
52
|
+
const repoAgents = new AgentRepository(AGENTS_DIR);
|
|
53
|
+
const repoSubAgents = new AgentRepository(SUB_AGENTS_DIR);
|
|
54
|
+
const [rawAgents, rawSubAgents] = await Promise.all([repoAgents.list(), repoSubAgents.list()]);
|
|
55
|
+
// 旧版 `/think` 把档位名写在 `reasoningEffort` 上;现在档位在写入时就展开成参数。
|
|
56
|
+
// 这里做一次性迁移:能查到策略就展开进 `modelParams`,查不到就只删旧字段。
|
|
57
|
+
const isLegacy = (def) => "reasoningEffort" in def;
|
|
58
|
+
const legacy = (defs) => defs.filter(isLegacy);
|
|
59
|
+
const needsMigration = legacy(rawAgents).length + legacy(rawSubAgents).length > 0;
|
|
60
|
+
if (!needsMigration)
|
|
61
|
+
return createAgentStore(rawAgents, rawSubAgents);
|
|
62
|
+
const [config, presets] = await Promise.all([readConfig(), readReasoningPresets()]);
|
|
63
|
+
const migrate = async (repo, defs) => {
|
|
64
|
+
const out = [];
|
|
65
|
+
for (const def of defs) {
|
|
66
|
+
if (!isLegacy(def)) {
|
|
67
|
+
out.push(def);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
out.push(await migrateDefinition(repo, def, config, presets));
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
};
|
|
74
|
+
const agents = await migrate(repoAgents, rawAgents);
|
|
75
|
+
const subAgents = await migrate(repoSubAgents, rawSubAgents);
|
|
48
76
|
return createAgentStore(agents, subAgents);
|
|
49
77
|
}
|
|
78
|
+
/** 把旧 `reasoningEffort` 展开成 `modelParams` 并写回(只跑一次:写完旧字段就没了) */
|
|
79
|
+
async function migrateDefinition(repo, def, config, presets) {
|
|
80
|
+
const { reasoningEffort, ...rest } = def;
|
|
81
|
+
// 模型只认 Agent 定义自身的 modelId(配置层已无 defaultModel)
|
|
82
|
+
const modelId = rest.modelId;
|
|
83
|
+
const model = (config.models ?? []).find((item) => item.id === modelId);
|
|
84
|
+
const preset = model ? presetFor(model.id, model.reasoningPreset, presets) : undefined;
|
|
85
|
+
const patch = reasoningEffort ? patchOf(preset, reasoningEffort) : undefined;
|
|
86
|
+
const next = patch
|
|
87
|
+
? { ...rest, modelParams: { ...(rest.modelParams ?? {}), ...patch } }
|
|
88
|
+
: rest;
|
|
89
|
+
await repo.write(next);
|
|
90
|
+
return next;
|
|
91
|
+
}
|
|
50
92
|
//# sourceMappingURL=agents-store.js.map
|
package/dist/agents-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-store.js","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"agents-store.js","sourceRoot":"","sources":["../src/agents-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自动迁移的「执行者选择」入口(CLI 层)。
|
|
3
|
+
*
|
|
4
|
+
* 背景:SDK 的 `AutoMigratePlugin` 在 `usage.prompt_tokens` 超过阈值时触发迁移,
|
|
5
|
+
* 但「谁来写交接文档」是产品决策——保真度高的**原 agent 自交接**,还是便宜的**独立摘要**。
|
|
6
|
+
* SDK 已把该决策抽象为 `resolveMode` 回调,CLI 在这里把它接到「用户三选一」上:
|
|
7
|
+
* 原 agent 自交接 / 独立摘要 / 跳过本次迁移。
|
|
8
|
+
*
|
|
9
|
+
* 边界(保持 SDK 的分工,不重复实现「何时迁移」的语义):
|
|
10
|
+
* - **何时迁移**:`AutoMigratePlugin`(阈值判断 + busy 让行);
|
|
11
|
+
* - **用什么执行者**:本模块的 `resolveMode`;
|
|
12
|
+
* - **实际怎么交接**:共享的 `HandoffService`(与 `/migrate`、`/handoff` 同一条链路)。
|
|
13
|
+
*
|
|
14
|
+
* 交互约定:
|
|
15
|
+
* - 仅在 stdin 与 stdout **均为 TTY**(人类交互终端)时询问;
|
|
16
|
+
* - 非交互环境(管道、重定向、e2e 脚本)没有选择通道,直接按 `defaultMode` 迁移,
|
|
17
|
+
* 不阻塞等待输入、不额外输出,管道语义不变;
|
|
18
|
+
* - 选择器默认高亮 `self`(保真),Esc/取消 = 跳过本次迁移,不影响当前对话
|
|
19
|
+
* (历史未被剔除);只要仍处于超限状态,下次发送后还会再问。
|
|
20
|
+
*/
|
|
21
|
+
import { AutoMigratePlugin, type AutoMigrateTriggerInfo, type HandoffMode, type HandoffService } from "@ai-zen/agents-sdk";
|
|
22
|
+
export interface AutoMigrateModeOptions {
|
|
23
|
+
/** 交接服务实例(与 `/migrate`、`/handoff` 共用同一实例) */
|
|
24
|
+
service: HandoffService;
|
|
25
|
+
/** 交接阈值(`tokenThresholds.handoff`):prompt_tokens 超过它即触发迁移 */
|
|
26
|
+
handoffTokens: number;
|
|
27
|
+
/**
|
|
28
|
+
* 用户的执行者选择(由调用方注入:TUI 用选择器浮层)。
|
|
29
|
+
* 返回 `null` 表示跳过本次迁移。
|
|
30
|
+
*/
|
|
31
|
+
choose: (info: AutoMigrateTriggerInfo) => Promise<HandoffMode | null>;
|
|
32
|
+
/** 非交互环境下的执行者,默认 `self` */
|
|
33
|
+
defaultMode?: HandoffMode;
|
|
34
|
+
/** 是否需要向用户确认;默认「stdin 与 stdout 均为 TTY」。可注入,便于单测 */
|
|
35
|
+
shouldConfirm?: () => boolean;
|
|
36
|
+
/** 输出信息(如「已跳过本次迁移」);由调用方注入(TUI 走 Ink notice),默认丢弃 */
|
|
37
|
+
log?: (text: string) => void;
|
|
38
|
+
}
|
|
39
|
+
/** 默认交互判定:仅当 stdin 与 stdout 均为 TTY 时才具备选择通道 */
|
|
40
|
+
export declare function canPromptUser(): boolean;
|
|
41
|
+
/** 构造带「执行者选择」的自动迁移插件 */
|
|
42
|
+
export declare function createAutoMigratePlugin(options: AutoMigrateModeOptions): AutoMigratePlugin;
|
|
43
|
+
//# sourceMappingURL=auto-migrate-confirm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-migrate-confirm.d.ts","sourceRoot":"","sources":["../src/auto-migrate-confirm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,OAAO,EAAE,cAAc,CAAC;IACxB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtE,2BAA2B;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B,qDAAqD;IACrD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAwB;AACxB,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,GAAG,iBAAiB,CA0B1F"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自动迁移的「执行者选择」入口(CLI 层)。
|
|
3
|
+
*
|
|
4
|
+
* 背景:SDK 的 `AutoMigratePlugin` 在 `usage.prompt_tokens` 超过阈值时触发迁移,
|
|
5
|
+
* 但「谁来写交接文档」是产品决策——保真度高的**原 agent 自交接**,还是便宜的**独立摘要**。
|
|
6
|
+
* SDK 已把该决策抽象为 `resolveMode` 回调,CLI 在这里把它接到「用户三选一」上:
|
|
7
|
+
* 原 agent 自交接 / 独立摘要 / 跳过本次迁移。
|
|
8
|
+
*
|
|
9
|
+
* 边界(保持 SDK 的分工,不重复实现「何时迁移」的语义):
|
|
10
|
+
* - **何时迁移**:`AutoMigratePlugin`(阈值判断 + busy 让行);
|
|
11
|
+
* - **用什么执行者**:本模块的 `resolveMode`;
|
|
12
|
+
* - **实际怎么交接**:共享的 `HandoffService`(与 `/migrate`、`/handoff` 同一条链路)。
|
|
13
|
+
*
|
|
14
|
+
* 交互约定:
|
|
15
|
+
* - 仅在 stdin 与 stdout **均为 TTY**(人类交互终端)时询问;
|
|
16
|
+
* - 非交互环境(管道、重定向、e2e 脚本)没有选择通道,直接按 `defaultMode` 迁移,
|
|
17
|
+
* 不阻塞等待输入、不额外输出,管道语义不变;
|
|
18
|
+
* - 选择器默认高亮 `self`(保真),Esc/取消 = 跳过本次迁移,不影响当前对话
|
|
19
|
+
* (历史未被剔除);只要仍处于超限状态,下次发送后还会再问。
|
|
20
|
+
*/
|
|
21
|
+
import { AutoMigratePlugin, } from "@ai-zen/agents-sdk";
|
|
22
|
+
import { t } from "./i18n/index.js";
|
|
23
|
+
/** 默认交互判定:仅当 stdin 与 stdout 均为 TTY 时才具备选择通道 */
|
|
24
|
+
export function canPromptUser() {
|
|
25
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
26
|
+
}
|
|
27
|
+
/** 构造带「执行者选择」的自动迁移插件 */
|
|
28
|
+
export function createAutoMigratePlugin(options) {
|
|
29
|
+
const { service, handoffTokens, choose, defaultMode = "self", shouldConfirm = canPromptUser, log = () => { }, } = options;
|
|
30
|
+
return new AutoMigratePlugin({
|
|
31
|
+
service,
|
|
32
|
+
handoffTokens,
|
|
33
|
+
resolveMode: async (info) => {
|
|
34
|
+
// 非交互环境:没有选择通道,按默认执行者迁移(不阻塞、不额外输出)
|
|
35
|
+
if (!shouldConfirm())
|
|
36
|
+
return defaultMode;
|
|
37
|
+
const mode = await choose(info);
|
|
38
|
+
if (mode == null) {
|
|
39
|
+
// 合并为单条:notice 通道只保留最新一条,拆成两行会被后者覆盖
|
|
40
|
+
log(t("migrate.skipped"));
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return mode;
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=auto-migrate-confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-migrate-confirm.js","sourceRoot":"","sources":["../src/auto-migrate-confirm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,iBAAiB,GAIlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAoBpC,+CAA+C;AAC/C,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,uBAAuB,CAAC,OAA+B;IACrE,MAAM,EACJ,OAAO,EACP,aAAa,EACb,MAAM,EACN,WAAW,GAAG,MAAM,EACpB,aAAa,GAAG,aAAa,EAC7B,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,GACf,GAAG,OAAO,CAAC;IAEZ,OAAO,IAAI,iBAAiB,CAAC;QAC3B,OAAO;QACP,aAAa;QACb,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1B,mCAAmC;YACnC,IAAI,CAAC,aAAa,EAAE;gBAAE,OAAO,WAAW,CAAC;YAEzC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,oCAAoC;gBACpC,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/config-editor.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* - 每个改写函数都返回**新对象**,调用方负责持久化(`saveConfig()`);
|
|
9
9
|
* - 不抛异常、不写盘、不读盘,纯输入 → 输出。
|
|
10
10
|
*/
|
|
11
|
-
import type { AgentDefinition, AgentPermissions, AppConfig, Endpoint, ImageModel, Model, PermissionPolicy } from "@ai-zen/agents-sdk";
|
|
11
|
+
import type { AgentDefinition, AgentPermissions, AppConfig, Endpoint, ImageModel, Model, PermissionPolicy, TokenThresholds } from "@ai-zen/agents-sdk";
|
|
12
12
|
import type { AgentNS } from "@ai-zen/agents-core";
|
|
13
13
|
import type { McpConfig, McpServerEntry } from "./config.js";
|
|
14
14
|
/** 按 id 查找模型 */
|
|
@@ -55,8 +55,6 @@ export declare function apiKeyGuide(baseUrl: string | undefined): ApiKeyGuide;
|
|
|
55
55
|
export declare function setEndpointApiKey(config: AppConfig, endpointId: string, apiKey: string): AppConfig;
|
|
56
56
|
/** 写入某端点的 Base URL(去除首尾空白) */
|
|
57
57
|
export declare function setEndpointBaseUrl(config: AppConfig, endpointId: string, baseUrl: string): AppConfig;
|
|
58
|
-
/** 设置默认模型(传 `undefined` 表示清空,交由 SDK 回退出厂默认) */
|
|
59
|
-
export declare function setDefaultModel(config: AppConfig, modelId: string | undefined): AppConfig;
|
|
60
58
|
/** 由端点名派生唯一的端点 id */
|
|
61
59
|
export declare function uniqueEndpointId(config: AppConfig, name: string): string;
|
|
62
60
|
/** 由模型名派生唯一的模型 id */
|
|
@@ -79,8 +77,18 @@ export declare function removeEndpoint(config: AppConfig, endpointId: string): A
|
|
|
79
77
|
/** 通用模型字段改写(不可变) */
|
|
80
78
|
export declare function updateModel(config: AppConfig, modelId: string, patch: Partial<Model>): AppConfig;
|
|
81
79
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
80
|
+
* 合并写入模型的上下文阈值 —— **不做整对象替换**。
|
|
81
|
+
*
|
|
82
|
+
* `updateModel` 是浅合并,所以调用方若直接构造 `{ handoff, guard }`,会把
|
|
83
|
+
* `tokenThresholds` 里其它字段(SDK 后续新增的压缩阈值 / 额外档位等)一并清空:
|
|
84
|
+
* 用户在配置中心改一次阈值,那些字段就被静默丢掉。所有阈值写入都必须走这里。
|
|
85
|
+
*/
|
|
86
|
+
export declare function mergeTokenThresholds(current: TokenThresholds | undefined, patch: Partial<TokenThresholds>): TokenThresholds;
|
|
87
|
+
/**
|
|
88
|
+
* 删除模型;若 `defaultMigrationModel` 指向它,则改指剩余的第一个模型(无剩余则清空)。
|
|
89
|
+
*
|
|
90
|
+
* 模型真相源是 `AgentDefinition.modelId`(不在配置里),所以这里无需处理任何
|
|
91
|
+
* 「默认模型」——删除后由 `createAgent` 报错引导用户重选,而不是静默回退。
|
|
84
92
|
*/
|
|
85
93
|
export declare function removeModel(config: AppConfig, modelId: string): AppConfig;
|
|
86
94
|
/** 新增模型(id 由名称派生;默认 `custom: true`,避免被 SDK 出厂清单托管覆盖) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-editor.d.ts","sourceRoot":"","sources":["../src/config-editor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,UAAU,EACV,KAAK,EACL,gBAAgB,
|
|
1
|
+
{"version":3,"file":"config-editor.d.ts","sourceRoot":"","sources":["../src/config-editor.ts"],"names":[],"mappings":"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"}
|