@ai-zen/cli 1.0.0-alpha.3 → 1.0.0-alpha.31
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 +930 -0
- package/LICENSE +21 -0
- package/README.md +135 -30
- package/README.zh.md +135 -30
- package/dist/agent-creator.d.ts +11 -0
- package/dist/agent-creator.d.ts.map +1 -1
- package/dist/agent-creator.js +50 -20
- 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/clipboard.d.ts +68 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +177 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/config-editor.d.ts +42 -5
- package/dist/config-editor.d.ts.map +1 -1
- package/dist/config-editor.js +80 -27
- package/dist/config-editor.js.map +1 -1
- package/dist/config.d.ts +76 -17
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +143 -39
- package/dist/config.js.map +1 -1
- package/dist/conversation-commands/registry.d.ts +127 -4
- package/dist/conversation-commands/registry.d.ts.map +1 -1
- package/dist/conversation-commands/registry.js +93 -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 +79 -18
- package/dist/conversation-repository.d.ts.map +1 -1
- package/dist/conversation-repository.js +96 -30
- package/dist/conversation-repository.js.map +1 -1
- package/dist/cwd-tracker-plugin.d.ts.map +1 -1
- package/dist/cwd-tracker-plugin.js +22 -7
- 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 +85 -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 +303 -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 +247 -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 +37 -0
- package/dist/i18n/preferences.d.ts.map +1 -0
- package/dist/i18n/preferences.js +73 -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 +306 -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 +251 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/index.js +72 -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 +84 -0
- package/dist/sdk-log.d.ts.map +1 -0
- package/dist/sdk-log.js +167 -0
- package/dist/sdk-log.js.map +1 -0
- package/dist/session-pointer.d.ts.map +1 -1
- package/dist/session-pointer.js +10 -4
- 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 +10 -7
- package/dist/sub-agent-guard-plugin.d.ts.map +1 -1
- package/dist/sub-agent-guard-plugin.js +12 -9
- package/dist/sub-agent-guard-plugin.js.map +1 -1
- package/dist/tui/chat-history.d.ts +29 -0
- package/dist/tui/chat-history.d.ts.map +1 -0
- package/dist/tui/chat-history.js +55 -0
- package/dist/tui/chat-history.js.map +1 -0
- package/dist/tui/chat-session.d.ts +177 -57
- package/dist/tui/chat-session.d.ts.map +1 -1
- package/dist/tui/chat-session.js +364 -126
- package/dist/tui/chat-session.js.map +1 -1
- package/dist/tui/components.d.ts +113 -7
- package/dist/tui/components.d.ts.map +1 -1
- package/dist/tui/components.js +177 -12
- package/dist/tui/components.js.map +1 -1
- package/dist/tui/config-wizard/detail.d.ts +18 -10
- package/dist/tui/config-wizard/detail.d.ts.map +1 -1
- package/dist/tui/config-wizard/detail.js +53 -46
- package/dist/tui/config-wizard/detail.js.map +1 -1
- package/dist/tui/config-wizard/engine.d.ts +2 -2
- package/dist/tui/config-wizard/engine.d.ts.map +1 -1
- package/dist/tui/config-wizard/engine.js +48 -26
- 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 +202 -167
- package/dist/tui/config-wizard/fields.js.map +1 -1
- package/dist/tui/config-wizard/frame.js +1 -1
- package/dist/tui/config-wizard/kv-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/kv-editor.js +13 -5
- package/dist/tui/config-wizard/kv-editor.js.map +1 -1
- package/dist/tui/config-wizard/list.d.ts +3 -1
- package/dist/tui/config-wizard/list.d.ts.map +1 -1
- package/dist/tui/config-wizard/list.js +4 -4
- 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 +8 -1
- package/dist/tui/config-wizard/prompt-editor.d.ts.map +1 -1
- package/dist/tui/config-wizard/prompt-editor.js +11 -7
- 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 +50 -29
- 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 +77 -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 +27 -14
- 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 +29 -25
- 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 +98 -43
- 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 +31 -3
- package/dist/tui/config-wizard/types.d.ts.map +1 -1
- package/dist/tui/config-wizard/types.js.map +1 -1
- package/dist/tui/file-index.d.ts +38 -0
- package/dist/tui/file-index.d.ts.map +1 -0
- package/dist/tui/file-index.js +117 -0
- package/dist/tui/file-index.js.map +1 -0
- 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/mention.d.ts +47 -0
- package/dist/tui/mention.d.ts.map +1 -0
- package/dist/tui/mention.js +152 -0
- package/dist/tui/mention.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/agent-tabs.d.ts +53 -0
- package/dist/tui/screens/agent-tabs.d.ts.map +1 -0
- package/dist/tui/screens/agent-tabs.js +81 -0
- package/dist/tui/screens/agent-tabs.js.map +1 -0
- package/dist/tui/screens/chat-commands.d.ts +82 -3
- package/dist/tui/screens/chat-commands.d.ts.map +1 -1
- package/dist/tui/screens/chat-commands.js +688 -160
- package/dist/tui/screens/chat-commands.js.map +1 -1
- package/dist/tui/screens/chat.d.ts +57 -5
- package/dist/tui/screens/chat.d.ts.map +1 -1
- package/dist/tui/screens/chat.js +799 -304
- 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 +11 -9
- package/dist/tui/screens/index.d.ts.map +1 -1
- package/dist/tui/screens/index.js +9 -8
- 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 +77 -1
- package/dist/tui/screens/input.d.ts.map +1 -1
- package/dist/tui/screens/input.js +125 -8
- package/dist/tui/screens/input.js.map +1 -1
- package/dist/tui/screens/layout.d.ts +42 -3
- package/dist/tui/screens/layout.d.ts.map +1 -1
- package/dist/tui/screens/layout.js +43 -13
- package/dist/tui/screens/layout.js.map +1 -1
- package/dist/tui/screens/lines.d.ts +6 -36
- package/dist/tui/screens/lines.d.ts.map +1 -1
- package/dist/tui/screens/lines.js +8 -71
- package/dist/tui/screens/lines.js.map +1 -1
- package/dist/tui/screens/messages-view.d.ts +29 -0
- package/dist/tui/screens/messages-view.d.ts.map +1 -0
- package/dist/tui/screens/messages-view.js +162 -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 +21 -0
- package/dist/tui/screens/notice-bar.js.map +1 -0
- package/dist/tui/screens/notice.d.ts +66 -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 +4 -3
- 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 +19 -50
- 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 +69 -0
- package/dist/tui/screens/use-input-editing.d.ts.map +1 -0
- package/dist/tui/screens/use-input-editing.js +220 -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 +46 -0
- package/dist/tui/screens/use-wizard-host.d.ts.map +1 -0
- package/dist/tui/screens/use-wizard-host.js +123 -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 +27 -7
- package/dist/tui/text.d.ts.map +1 -1
- package/dist/tui/text.js +116 -38
- package/dist/tui/text.js.map +1 -1
- package/dist/tui/theme.d.ts +2 -0
- package/dist/tui/theme.d.ts.map +1 -1
- package/dist/tui/theme.js +2 -0
- 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/dist/user-content.d.ts +41 -0
- package/dist/user-content.d.ts.map +1 -0
- package/dist/user-content.js +37 -0
- package/dist/user-content.js.map +1 -0
- package/dist/version-compare.d.ts +37 -0
- package/dist/version-compare.d.ts.map +1 -0
- package/dist/version-compare.js +105 -0
- package/dist/version-compare.js.map +1 -0
- package/dist/version.js.map +1 -1
- package/package.json +5 -4
- 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 -30
- package/dist/tui/screens/state.d.ts.map +0 -1
- package/dist/tui/screens/state.js +0 -100
- 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,6 +101,10 @@ export async function createAgent(options) {
|
|
|
75
101
|
const { messages, agentId } = options;
|
|
76
102
|
const scope = await getScope();
|
|
77
103
|
// 始终从磁盘读取 Agent 定义(含 permissions、工具配置等)
|
|
104
|
+
//
|
|
105
|
+
// 中断策略(`abortedMessageStrategy` / `abortedToolRoundStrategy`)**故意不传**:
|
|
106
|
+
// SDK 的 `createAgent()` 在不传时取 `scope.config`(即 `config.json`),于是配置中心
|
|
107
|
+
// 改完 `/reload` 一下就是新策略。在这里写死值会盖掉用户的选择。
|
|
78
108
|
const agent = await sdkCreateAgent(scope, agentId || "default");
|
|
79
109
|
// 有历史消息时替换(恢复草稿/已保存对话)。
|
|
80
110
|
// 拷贝而非直接引用:恢复的数组来自草稿/对话存档,直接引用会让后续 append 改写传入数组。
|
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAepC;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAiB,EACjB,MAAkC;IAElC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,yBAAyB,CAAC,EAAE,CAAC;QACzF,CAAC;QACD,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,8BAA8B,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACrH,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC3B,OAAO;gBACL,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI;gBACJ,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,CAAC,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC;aAC/E,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC;AAiBD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAElD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,aAAa,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,8BAA8B,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;IAEtF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,8BAA8B,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,OAAO;QACL,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,EAAE;QAC7C,OAAO,EAAE,CAAC,CAAC,qBAAqB,EAAE;YAChC,IAAI;YACJ,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,KAAK,EAAE,UAAU,CAAC,SAAS;YAC3B,OAAO,EAAE,UAAU,CAAC,OAAO;SAC5B,CAAC;KACH,CAAC;AACJ,CAAC"}
|
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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** 一张剪贴板图片(已是 base64,未落盘) */
|
|
2
|
+
export interface ClipboardImage {
|
|
3
|
+
base64: string;
|
|
4
|
+
mime: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 读取结果三态。
|
|
8
|
+
*
|
|
9
|
+
* 为什么要区分「没有」和「太大」:两者都要回退到粘贴文本,但提示不一样 ——
|
|
10
|
+
* 「剪贴板里没有图片」是正常情况(用户就是想贴文本),「图片太大」是真问题
|
|
11
|
+
* (用户以为贴上了,其实没有),不提示会让人莫名其妙。
|
|
12
|
+
*/
|
|
13
|
+
export type ClipboardImageResult = {
|
|
14
|
+
kind: "image";
|
|
15
|
+
image: ClipboardImage;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "too-large";
|
|
18
|
+
bytes: number;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "none";
|
|
21
|
+
};
|
|
22
|
+
/** 单张粘贴图片上限:与 SDK 默认内联上限(8MB)同量级,留出 base64 膨胀余量 */
|
|
23
|
+
export declare const MAX_CLIPBOARD_IMAGE_BYTES: number;
|
|
24
|
+
/**
|
|
25
|
+
* 单次粘贴文本上限 256KB。
|
|
26
|
+
*
|
|
27
|
+
* 超了**报错而不是截断**:半截代码 / 半截 JSON 粘进对话比不粘更坑(用户会以
|
|
28
|
+
* 为粘全了,基于残缺内容提问)。需要大段内容时让他存成文件用 `@` 引用。
|
|
29
|
+
*/
|
|
30
|
+
export declare const MAX_CLIPBOARD_TEXT_BYTES: number;
|
|
31
|
+
export interface ClipboardDeps {
|
|
32
|
+
platform?: NodeJS.Platform;
|
|
33
|
+
env?: NodeJS.ProcessEnv;
|
|
34
|
+
/** 执行命令;不可用(不存在 / 非零退出 / 超时)返回 null,成功返回 stdout 原始字节 */
|
|
35
|
+
run?: (cmd: string, args: string[]) => Promise<Buffer | null>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 解析 osascript 的输出 `«data PNGf89504E47…»`(PNGf 后面全是十六进制)。
|
|
39
|
+
*
|
|
40
|
+
* 格式不符(或没有图片时 osascript 直接非零退出)一律返回 null:
|
|
41
|
+
* 这条路径上「猜」比「放弃」危险得多 —— 猜错就会把半截字节当成图片发出去。
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseAppleScriptPng(stdout: string): Buffer | null;
|
|
44
|
+
/** 读剪贴板里的图片;没有图片时返回 `{ kind: "none" }`(调用方据此回退到文本) */
|
|
45
|
+
export declare function readClipboardImage(deps?: ClipboardDeps): Promise<ClipboardImageResult>;
|
|
46
|
+
/**
|
|
47
|
+
* 读剪贴板文本的结果。
|
|
48
|
+
*
|
|
49
|
+
* 三态分开是因为提示文案各不相同:`unavailable` = 环境缺剪贴板工具,
|
|
50
|
+
* `too-large` = 真问题(用户以为粘上了其实没有),空文本 = 剪贴板确实空着。
|
|
51
|
+
*/
|
|
52
|
+
export type ClipboardTextResult = {
|
|
53
|
+
kind: "text";
|
|
54
|
+
text: string;
|
|
55
|
+
} | {
|
|
56
|
+
kind: "too-large";
|
|
57
|
+
bytes: number;
|
|
58
|
+
} | {
|
|
59
|
+
kind: "unavailable";
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 读剪贴板里的文本。
|
|
63
|
+
*
|
|
64
|
+
* 返回 `unavailable` = 压根没有可用的剪贴板工具(区别于「剪贴板是空的」= 空文本),
|
|
65
|
+
* 两者在提示上要分开:一个是环境缺依赖,一个是用户剪贴板确实空着。
|
|
66
|
+
*/
|
|
67
|
+
export declare function readClipboardText(deps?: ClipboardDeps): Promise<ClipboardTextResult>;
|
|
68
|
+
//# sourceMappingURL=clipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../src/clipboard.ts"],"names":[],"mappings":"AA0BA,6BAA6B;AAC7B,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,mDAAmD;AACnD,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAa,CAAC;AAMnD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,wDAAwD;IACxD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/D;AAaD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMjE;AA6FD,sDAAsD;AACtD,wBAAsB,kBAAkB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAchG;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAE5B;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAe9F"}
|