@ai-zen/cli 0.1.0-alpha.2
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/README.md +319 -0
- package/README.zh.md +319 -0
- package/dist/agent-creator.d.ts +17 -0
- package/dist/agent-creator.d.ts.map +1 -0
- package/dist/agent-creator.js +112 -0
- package/dist/agent-creator.js.map +1 -0
- package/dist/config-wizard.d.ts +6 -0
- package/dist/config-wizard.d.ts.map +1 -0
- package/dist/config-wizard.js +46 -0
- package/dist/config-wizard.js.map +1 -0
- package/dist/config.d.ts +68 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +111 -0
- package/dist/config.js.map +1 -0
- package/dist/conversation-commands/back.d.ts +3 -0
- package/dist/conversation-commands/back.d.ts.map +1 -0
- package/dist/conversation-commands/back.js +144 -0
- package/dist/conversation-commands/back.js.map +1 -0
- package/dist/conversation-commands/clear.d.ts +3 -0
- package/dist/conversation-commands/clear.d.ts.map +1 -0
- package/dist/conversation-commands/clear.js +8 -0
- package/dist/conversation-commands/clear.js.map +1 -0
- package/dist/conversation-commands/editor.d.ts +3 -0
- package/dist/conversation-commands/editor.d.ts.map +1 -0
- package/dist/conversation-commands/editor.js +15 -0
- package/dist/conversation-commands/editor.js.map +1 -0
- package/dist/conversation-commands/exit.d.ts +3 -0
- package/dist/conversation-commands/exit.d.ts.map +1 -0
- package/dist/conversation-commands/exit.js +39 -0
- package/dist/conversation-commands/exit.js.map +1 -0
- package/dist/conversation-commands/help.d.ts +3 -0
- package/dist/conversation-commands/help.d.ts.map +1 -0
- package/dist/conversation-commands/help.js +12 -0
- package/dist/conversation-commands/help.js.map +1 -0
- package/dist/conversation-commands/index.d.ts +15 -0
- package/dist/conversation-commands/index.d.ts.map +1 -0
- package/dist/conversation-commands/index.js +63 -0
- package/dist/conversation-commands/index.js.map +1 -0
- package/dist/conversation-commands/new.d.ts +3 -0
- package/dist/conversation-commands/new.d.ts.map +1 -0
- package/dist/conversation-commands/new.js +47 -0
- package/dist/conversation-commands/new.js.map +1 -0
- package/dist/conversation-commands/save.d.ts +3 -0
- package/dist/conversation-commands/save.d.ts.map +1 -0
- package/dist/conversation-commands/save.js +34 -0
- package/dist/conversation-commands/save.js.map +1 -0
- package/dist/conversation-runner.d.ts +17 -0
- package/dist/conversation-runner.d.ts.map +1 -0
- package/dist/conversation-runner.js +212 -0
- package/dist/conversation-runner.js.map +1 -0
- package/dist/delta-renderer.d.ts +33 -0
- package/dist/delta-renderer.d.ts.map +1 -0
- package/dist/delta-renderer.js +117 -0
- package/dist/delta-renderer.js.map +1 -0
- package/dist/format-time.d.ts +38 -0
- package/dist/format-time.d.ts.map +1 -0
- package/dist/format-time.js +66 -0
- package/dist/format-time.js.map +1 -0
- package/dist/hook.d.ts +3 -0
- package/dist/hook.d.ts.map +1 -0
- package/dist/hook.js +83 -0
- package/dist/hook.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/menus/agents.d.ts +5 -0
- package/dist/menus/agents.d.ts.map +1 -0
- package/dist/menus/agents.js +219 -0
- package/dist/menus/agents.js.map +1 -0
- package/dist/menus/common.d.ts +41 -0
- package/dist/menus/common.d.ts.map +1 -0
- package/dist/menus/common.js +104 -0
- package/dist/menus/common.js.map +1 -0
- package/dist/menus/config-display.d.ts +2 -0
- package/dist/menus/config-display.d.ts.map +1 -0
- package/dist/menus/config-display.js +69 -0
- package/dist/menus/config-display.js.map +1 -0
- package/dist/menus/config.d.ts +8 -0
- package/dist/menus/config.d.ts.map +1 -0
- package/dist/menus/config.js +407 -0
- package/dist/menus/config.js.map +1 -0
- package/dist/menus/conversations.d.ts +20 -0
- package/dist/menus/conversations.d.ts.map +1 -0
- package/dist/menus/conversations.js +74 -0
- package/dist/menus/conversations.js.map +1 -0
- package/dist/menus/index.d.ts +5 -0
- package/dist/menus/index.d.ts.map +1 -0
- package/dist/menus/index.js +63 -0
- package/dist/menus/index.js.map +1 -0
- package/dist/menus/start-conversation.d.ts +16 -0
- package/dist/menus/start-conversation.d.ts.map +1 -0
- package/dist/menus/start-conversation.js +176 -0
- package/dist/menus/start-conversation.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent 创建 — CLI 层
|
|
3
|
+
*
|
|
4
|
+
* 委托给 @ai-zen/agents-sdk 的 Provider + Capabilities。
|
|
5
|
+
* CLI 层负责:组装路径、构建 Provider 单例、注册默认插件。
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
import { Provider, createAgent as sdkCreateAgent, SdkAgent, McpConnectionManager, TaskMigrationService, createModel, } from "@ai-zen/agents-sdk";
|
|
10
|
+
import { AGENTS_DIR, SUB_AGENTS_DIR, SKILLS_DIR, TOOLS_DIR, CONVERSATIONS_DIR, DRAFTS_DIR, AI_ZEN_DIR, PROJECT_SUB_AGENTS_DIR, PROJECT_SKILLS_DIR, PROJECT_TOOLS_DIR, } from "./config.js";
|
|
11
|
+
import { readConfig } from "./config.js";
|
|
12
|
+
// ==================== Provider 创建(单例)====================
|
|
13
|
+
let _provider = null;
|
|
14
|
+
let _mcpManager = null;
|
|
15
|
+
/** existsSync 的别名,用于数组 .filter() 场景 */
|
|
16
|
+
const exists = existsSync;
|
|
17
|
+
/**
|
|
18
|
+
* 从 mcpPaths 中读取 mcp.json,构建 McpServerConfig Map。
|
|
19
|
+
* 按优先级从高到低传入路径列表,同名 server 靠前的文件优先(先到先得)。
|
|
20
|
+
*/
|
|
21
|
+
function buildMcpConfigs(mcpPaths) {
|
|
22
|
+
const configs = new Map();
|
|
23
|
+
for (const mcpPath of mcpPaths) {
|
|
24
|
+
if (!existsSync(mcpPath))
|
|
25
|
+
continue;
|
|
26
|
+
try {
|
|
27
|
+
const raw = readFileSync(mcpPath, "utf-8");
|
|
28
|
+
const json = JSON.parse(raw);
|
|
29
|
+
const servers = json.servers ?? {};
|
|
30
|
+
for (const [name, cfg] of Object.entries(servers)) {
|
|
31
|
+
const raw = cfg;
|
|
32
|
+
if (!configs.has(name)) {
|
|
33
|
+
configs.set(name, {
|
|
34
|
+
name,
|
|
35
|
+
config: {
|
|
36
|
+
id: raw.id || name,
|
|
37
|
+
name: raw.name || name,
|
|
38
|
+
transport: raw.transport || "stdio",
|
|
39
|
+
enabled: raw.enabled !== false,
|
|
40
|
+
command: raw.command,
|
|
41
|
+
args: raw.args,
|
|
42
|
+
env: raw.env,
|
|
43
|
+
url: raw.url,
|
|
44
|
+
headers: raw.headers,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch { /* 跳过解析失败 */ }
|
|
51
|
+
}
|
|
52
|
+
return configs;
|
|
53
|
+
}
|
|
54
|
+
export function getProvider() {
|
|
55
|
+
if (_provider)
|
|
56
|
+
return _provider;
|
|
57
|
+
const config = readConfig();
|
|
58
|
+
_mcpManager = new McpConnectionManager();
|
|
59
|
+
const mcpPaths = [join(process.cwd(), ".mcp.json"), join(process.cwd(), ".ai-zen", "mcp.json"), join(AI_ZEN_DIR, "mcp.json")].filter(exists);
|
|
60
|
+
const mcpConfigs = buildMcpConfigs(mcpPaths);
|
|
61
|
+
_provider = new Provider({
|
|
62
|
+
config,
|
|
63
|
+
agentsDir: AGENTS_DIR,
|
|
64
|
+
subAgentsPaths: [PROJECT_SUB_AGENTS_DIR, SUB_AGENTS_DIR].filter(exists),
|
|
65
|
+
skillsPaths: [PROJECT_SKILLS_DIR, SKILLS_DIR].filter(exists),
|
|
66
|
+
toolsPaths: [PROJECT_TOOLS_DIR, TOOLS_DIR].filter(exists),
|
|
67
|
+
mcpPaths,
|
|
68
|
+
conversationsDir: CONVERSATIONS_DIR,
|
|
69
|
+
draftsDir: DRAFTS_DIR,
|
|
70
|
+
mcpManager: _mcpManager,
|
|
71
|
+
mcpConfigs,
|
|
72
|
+
});
|
|
73
|
+
return _provider;
|
|
74
|
+
}
|
|
75
|
+
export function resetProvider() {
|
|
76
|
+
if (_mcpManager) {
|
|
77
|
+
_mcpManager.disconnectAll().catch(() => { });
|
|
78
|
+
}
|
|
79
|
+
_provider = null;
|
|
80
|
+
_mcpManager = null;
|
|
81
|
+
}
|
|
82
|
+
export function createAgent(options) {
|
|
83
|
+
const { messages, agentId } = options;
|
|
84
|
+
const provider = getProvider();
|
|
85
|
+
// 始终从磁盘读取 Agent 定义(含 permissions、工具配置等)
|
|
86
|
+
const agent = sdkCreateAgent(provider, agentId || "default");
|
|
87
|
+
// 有历史消息时替换(恢复草稿/已保存对话)
|
|
88
|
+
if (messages && messages.length > 0) {
|
|
89
|
+
agent.messages = messages;
|
|
90
|
+
}
|
|
91
|
+
return agent;
|
|
92
|
+
}
|
|
93
|
+
// ==================== 迁移 Agent ====================
|
|
94
|
+
export function createMigrationAgent(modelId) {
|
|
95
|
+
const provider = getProvider();
|
|
96
|
+
const config = readConfig();
|
|
97
|
+
const model = createModel(config, modelId);
|
|
98
|
+
const definition = TaskMigrationService.createAgentDefinition({ modelId });
|
|
99
|
+
return new SdkAgent({
|
|
100
|
+
provider,
|
|
101
|
+
definition: {
|
|
102
|
+
...definition,
|
|
103
|
+
id: "__migration__",
|
|
104
|
+
createdAt: new Date().toISOString(),
|
|
105
|
+
updatedAt: new Date().toISOString(),
|
|
106
|
+
},
|
|
107
|
+
model,
|
|
108
|
+
messages: definition.messages,
|
|
109
|
+
tools: [],
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=agent-creator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-creator.js","sourceRoot":"","sources":["../src/agent-creator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-wizard.d.ts","sourceRoot":"","sources":["../src/config-wizard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,wBAAsB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAwC3E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key 交互式配置向导
|
|
3
|
+
*/
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import inquirer from "inquirer";
|
|
6
|
+
import { readConfig, saveConfig } from "./config.js";
|
|
7
|
+
export async function ensureEndpointConfig(modelId) {
|
|
8
|
+
const config = readConfig();
|
|
9
|
+
let model;
|
|
10
|
+
if (modelId) {
|
|
11
|
+
model = config.models.find((m) => m.id === modelId);
|
|
12
|
+
if (!model)
|
|
13
|
+
throw new Error(`模型 ${modelId} 不存在`);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
model = config.defaultModel
|
|
17
|
+
? config.models.find((m) => m.id === config.defaultModel)
|
|
18
|
+
: config.models[0];
|
|
19
|
+
if (!model)
|
|
20
|
+
throw new Error("没有可用的模型");
|
|
21
|
+
}
|
|
22
|
+
const endpoint = config.endpoints.find((e) => e.id === model.endpointId);
|
|
23
|
+
if (!endpoint)
|
|
24
|
+
throw new Error(`端点 ${model.endpointId} 不存在`);
|
|
25
|
+
if (!endpoint.apiKey) {
|
|
26
|
+
console.log(chalk.yellow.bold(`\n⚠️ 端点 "${endpoint.name}" 的 API Key 未设置\n`));
|
|
27
|
+
console.log(chalk.white(`💡 请前往对应平台获取 API Key:`));
|
|
28
|
+
console.log(chalk.white(` - OpenAI: https://platform.openai.com/api-keys`));
|
|
29
|
+
console.log(chalk.white(` - BigModelCN (智谱AI): https://open.bigmodel.cn/usercenter/apikeys`));
|
|
30
|
+
console.log(chalk.white(` - DeepSeek: https://platform.deepseek.com/api_keys\n`));
|
|
31
|
+
const { apiKey } = await inquirer.prompt([
|
|
32
|
+
{
|
|
33
|
+
type: "password",
|
|
34
|
+
name: "apiKey",
|
|
35
|
+
message: `请输入 ${endpoint.name} 的 API Key:`,
|
|
36
|
+
mask: "*",
|
|
37
|
+
validate: (input) => input.trim() !== "" || "API Key 不能为空",
|
|
38
|
+
},
|
|
39
|
+
]);
|
|
40
|
+
endpoint.apiKey = apiKey;
|
|
41
|
+
saveConfig(config);
|
|
42
|
+
console.log(chalk.green(`\n✅ API Key 已保存\n`));
|
|
43
|
+
}
|
|
44
|
+
return model;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=config-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-wizard.js","sourceRoot":"","sources":["../src/config-wizard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAgB;IACzD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,KAAwB,CAAC;IAE7B,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,MAAM,CAAC,YAAY;YACzB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,YAAY,CAAC;YACzD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,UAAU,MAAM,CAAC,CAAC;IAE7D,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC,CAAC;QAEpF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACvC;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,OAAO,QAAQ,CAAC,IAAI,aAAa;gBAC1C,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,cAAc;aACnE;SACF,CAAC,CAAC;QAEH,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置管理 — CLI 层
|
|
3
|
+
*
|
|
4
|
+
* 负责配置文件的路径管理和初始化。
|
|
5
|
+
* 默认配置、Agent、SubAgent 全部委托给 @ai-zen/agents-sdk。
|
|
6
|
+
*
|
|
7
|
+
* 目录结构:
|
|
8
|
+
* ~/.ai-zen/ ← 共享根(AI_ZEN_DIR)
|
|
9
|
+
* ├── config.json ← 全局配置(端点、模型等,CLI/Desktop 共享)
|
|
10
|
+
* ├── agents/ ← Agent 定义(共享)
|
|
11
|
+
* ├── sub-agents/ ← SubAgent 定义(共享)
|
|
12
|
+
* ├── skills/ ← Skill 目录(共享)
|
|
13
|
+
* ├── tools/ ← 用户工具(共享)
|
|
14
|
+
* ├── mcp.json ← MCP 配置(共享)
|
|
15
|
+
* ├── mcp-oauth/ ← MCP OAuth token(共享)
|
|
16
|
+
* └── cli/ ← CLI 运行时数据
|
|
17
|
+
* ├── conversations/ ← 对话记录
|
|
18
|
+
* └── drafts/ ← 草稿
|
|
19
|
+
*/
|
|
20
|
+
import type { AppConfig } from "@ai-zen/agents-sdk";
|
|
21
|
+
export declare const AI_ZEN_DIR: string;
|
|
22
|
+
export declare const CLI_DIR: string;
|
|
23
|
+
export declare const CONFIG_FILE: string;
|
|
24
|
+
export declare const CONVERSATIONS_DIR: string;
|
|
25
|
+
export declare const DRAFTS_DIR: string;
|
|
26
|
+
export declare const AGENTS_DIR: string;
|
|
27
|
+
export declare const SUB_AGENTS_DIR: string;
|
|
28
|
+
export declare const SKILLS_DIR: string;
|
|
29
|
+
export declare const TOOLS_DIR: string;
|
|
30
|
+
export declare const PROJECT_SUB_AGENTS_DIR: string;
|
|
31
|
+
export declare const PROJECT_SKILLS_DIR: string;
|
|
32
|
+
export declare const PROJECT_TOOLS_DIR: string;
|
|
33
|
+
export declare const MCP_CONFIG_FILE: string;
|
|
34
|
+
export declare const PROJECT_MCP_CONFIG_FILE: string;
|
|
35
|
+
export declare const SHARED_MCP_CONFIG_FILE: string;
|
|
36
|
+
/**
|
|
37
|
+
* 确保配置目录和默认文件存在。
|
|
38
|
+
*
|
|
39
|
+
* 共享实体(Agent、SubAgent、Skill 目录等)委托给 SDK 的 ConfigManager.bootstrap()。
|
|
40
|
+
* CLI 自身的运行时目录(conversations/、drafts/)由本函数额外创建。
|
|
41
|
+
* SDK 的出厂默认配置会自动写入 config.json(如果不存在)。
|
|
42
|
+
*/
|
|
43
|
+
export declare function ensureConfigDir(): void;
|
|
44
|
+
export declare function readConfig(): AppConfig;
|
|
45
|
+
export declare function saveConfig(config: AppConfig): void;
|
|
46
|
+
export interface McpServersMap {
|
|
47
|
+
[name: string]: {
|
|
48
|
+
transport: "stdio" | "http" | "sse";
|
|
49
|
+
command?: string;
|
|
50
|
+
args?: string[];
|
|
51
|
+
env?: Record<string, string>;
|
|
52
|
+
url?: string;
|
|
53
|
+
headers?: Record<string, string>;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export interface McpConfig {
|
|
57
|
+
servers: McpServersMap;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 读取全局 ~/.ai-zen/mcp.json,不存在时返回空结构。
|
|
61
|
+
*/
|
|
62
|
+
export declare function readMcpConfig(): McpConfig;
|
|
63
|
+
/**
|
|
64
|
+
* 原子写入全局 ~/.ai-zen/mcp.json。
|
|
65
|
+
*/
|
|
66
|
+
export declare function writeMcpConfig(mcpConfig: McpConfig): void;
|
|
67
|
+
export declare function readProjectMcpConfig(): McpConfig;
|
|
68
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAIpD,eAAO,MAAM,UAAU,QAGtB,CAAC;AAIF,eAAO,MAAM,OAAO,QAA0B,CAAC;AAC/C,eAAO,MAAM,WAAW,QAAkC,CAAC;AAC3D,eAAO,MAAM,iBAAiB,QAAiC,CAAC;AAChE,eAAO,MAAM,UAAU,QAA0B,CAAC;AAIlD,eAAO,MAAM,UAAU,QAA6B,CAAC;AACrD,eAAO,MAAM,cAAc,QAAiC,CAAC;AAC7D,eAAO,MAAM,UAAU,QAA6B,CAAC;AACrD,eAAO,MAAM,SAAS,QAA4B,CAAC;AAInD,eAAO,MAAM,sBAAsB,QAA+C,CAAC;AACnF,eAAO,MAAM,kBAAkB,QAA2C,CAAC;AAC3E,eAAO,MAAM,iBAAiB,QAA0C,CAAC;AAIzE,eAAO,MAAM,eAAe,QAA+B,CAAC;AAC5D,eAAO,MAAM,uBAAuB,QAA6C,CAAC;AAClF,eAAO,MAAM,sBAAsB,QAAmC,CAAC;AAQvE;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAYtC;AAID,wBAAgB,UAAU,IAAI,SAAS,CAGtC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGlD;AAID,MAAM,WAAW,aAAa;IAC5B,CAAC,IAAI,EAAE,MAAM,GAAG;QACd,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;QACpC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,SAAS,CAOzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAIzD;AAED,wBAAgB,oBAAoB,IAAI,SAAS,CAQhD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置管理 — CLI 层
|
|
3
|
+
*
|
|
4
|
+
* 负责配置文件的路径管理和初始化。
|
|
5
|
+
* 默认配置、Agent、SubAgent 全部委托给 @ai-zen/agents-sdk。
|
|
6
|
+
*
|
|
7
|
+
* 目录结构:
|
|
8
|
+
* ~/.ai-zen/ ← 共享根(AI_ZEN_DIR)
|
|
9
|
+
* ├── config.json ← 全局配置(端点、模型等,CLI/Desktop 共享)
|
|
10
|
+
* ├── agents/ ← Agent 定义(共享)
|
|
11
|
+
* ├── sub-agents/ ← SubAgent 定义(共享)
|
|
12
|
+
* ├── skills/ ← Skill 目录(共享)
|
|
13
|
+
* ├── tools/ ← 用户工具(共享)
|
|
14
|
+
* ├── mcp.json ← MCP 配置(共享)
|
|
15
|
+
* ├── mcp-oauth/ ← MCP OAuth token(共享)
|
|
16
|
+
* └── cli/ ← CLI 运行时数据
|
|
17
|
+
* ├── conversations/ ← 对话记录
|
|
18
|
+
* └── drafts/ ← 草稿
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync } from "fs";
|
|
21
|
+
import { join } from "path";
|
|
22
|
+
import chalk from "chalk";
|
|
23
|
+
import { ConfigManager as SdkConfigManager } from "@ai-zen/agents-sdk";
|
|
24
|
+
// ==================== 根目录 ====================
|
|
25
|
+
export const AI_ZEN_DIR = process.env.AI_ZEN_DIR || join(process.env.HOME || process.env.USERPROFILE || "", ".ai-zen");
|
|
26
|
+
// ==================== CLI 运行时目录 ====================
|
|
27
|
+
export const CLI_DIR = join(AI_ZEN_DIR, "cli");
|
|
28
|
+
export const CONFIG_FILE = join(AI_ZEN_DIR, "config.json");
|
|
29
|
+
export const CONVERSATIONS_DIR = join(CLI_DIR, "conversations");
|
|
30
|
+
export const DRAFTS_DIR = join(CLI_DIR, "drafts");
|
|
31
|
+
// ==================== 共享目录 ====================
|
|
32
|
+
export const AGENTS_DIR = join(AI_ZEN_DIR, "agents");
|
|
33
|
+
export const SUB_AGENTS_DIR = join(AI_ZEN_DIR, "sub-agents");
|
|
34
|
+
export const SKILLS_DIR = join(AI_ZEN_DIR, "skills");
|
|
35
|
+
export const TOOLS_DIR = join(AI_ZEN_DIR, "tools");
|
|
36
|
+
// ==================== 项目级目录(基于 CWD)====================
|
|
37
|
+
export const PROJECT_SUB_AGENTS_DIR = join(process.cwd(), ".ai-zen", "sub-agents");
|
|
38
|
+
export const PROJECT_SKILLS_DIR = join(process.cwd(), ".ai-zen", "skills");
|
|
39
|
+
export const PROJECT_TOOLS_DIR = join(process.cwd(), ".ai-zen", "tools");
|
|
40
|
+
// ==================== MCP 配置 ====================
|
|
41
|
+
export const MCP_CONFIG_FILE = join(AI_ZEN_DIR, "mcp.json");
|
|
42
|
+
export const PROJECT_MCP_CONFIG_FILE = join(process.cwd(), ".ai-zen", "mcp.json");
|
|
43
|
+
export const SHARED_MCP_CONFIG_FILE = join(process.cwd(), ".mcp.json");
|
|
44
|
+
// ==================== SDK ConfigManager ====================
|
|
45
|
+
const sdkConfigMgr = new SdkConfigManager(CONFIG_FILE);
|
|
46
|
+
// ==================== 目录初始化 ====================
|
|
47
|
+
/**
|
|
48
|
+
* 确保配置目录和默认文件存在。
|
|
49
|
+
*
|
|
50
|
+
* 共享实体(Agent、SubAgent、Skill 目录等)委托给 SDK 的 ConfigManager.bootstrap()。
|
|
51
|
+
* CLI 自身的运行时目录(conversations/、drafts/)由本函数额外创建。
|
|
52
|
+
* SDK 的出厂默认配置会自动写入 config.json(如果不存在)。
|
|
53
|
+
*/
|
|
54
|
+
export function ensureConfigDir() {
|
|
55
|
+
// SDK bootstrap:目录 + config.json + default Agent + default SubAgent
|
|
56
|
+
sdkConfigMgr.bootstrap();
|
|
57
|
+
// CLI 运行时目录
|
|
58
|
+
const cliDirs = [CLI_DIR, CONVERSATIONS_DIR, DRAFTS_DIR];
|
|
59
|
+
for (const dir of cliDirs) {
|
|
60
|
+
if (!existsSync(dir)) {
|
|
61
|
+
try {
|
|
62
|
+
mkdirSync(dir, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
console.warn(chalk.yellow(`⚠️ 无法创建目录: ${dir}`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ==================== 配置读写 ====================
|
|
71
|
+
export function readConfig() {
|
|
72
|
+
ensureConfigDir();
|
|
73
|
+
return sdkConfigMgr.read();
|
|
74
|
+
}
|
|
75
|
+
export function saveConfig(config) {
|
|
76
|
+
ensureConfigDir();
|
|
77
|
+
sdkConfigMgr.write(config);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 读取全局 ~/.ai-zen/mcp.json,不存在时返回空结构。
|
|
81
|
+
*/
|
|
82
|
+
export function readMcpConfig() {
|
|
83
|
+
if (!existsSync(MCP_CONFIG_FILE))
|
|
84
|
+
return { servers: {} };
|
|
85
|
+
try {
|
|
86
|
+
return JSON.parse(readFileSync(MCP_CONFIG_FILE, "utf-8"));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return { servers: {} };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 原子写入全局 ~/.ai-zen/mcp.json。
|
|
94
|
+
*/
|
|
95
|
+
export function writeMcpConfig(mcpConfig) {
|
|
96
|
+
const tmp = MCP_CONFIG_FILE + ".tmp";
|
|
97
|
+
writeFileSync(tmp, JSON.stringify(mcpConfig, null, 2), "utf-8");
|
|
98
|
+
renameSync(tmp, MCP_CONFIG_FILE);
|
|
99
|
+
}
|
|
100
|
+
export function readProjectMcpConfig() {
|
|
101
|
+
const path = PROJECT_MCP_CONFIG_FILE;
|
|
102
|
+
if (!existsSync(path))
|
|
103
|
+
return { servers: {} };
|
|
104
|
+
try {
|
|
105
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return { servers: {} };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"back.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/back.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAsBlD,wBAAsB,UAAU,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoJxE"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
import { AgentNS } from "@ai-zen/agents-core";
|
|
4
|
+
function getMessageText(msg) {
|
|
5
|
+
const c = msg.content;
|
|
6
|
+
if (typeof c === "string")
|
|
7
|
+
return c;
|
|
8
|
+
if (Array.isArray(c)) {
|
|
9
|
+
return c
|
|
10
|
+
.filter((s) => s.type === "text")
|
|
11
|
+
.map((s) => s.text)
|
|
12
|
+
.join("");
|
|
13
|
+
}
|
|
14
|
+
return "";
|
|
15
|
+
}
|
|
16
|
+
export async function handleBack(ctx) {
|
|
17
|
+
const agent = ctx.agent;
|
|
18
|
+
// 收集可撤回的目标消息:用户消息 和 工具/函数调用结果消息
|
|
19
|
+
//
|
|
20
|
+
// - 用户消息:选中后可修改内容重新发送
|
|
21
|
+
// - 工具/函数结果:选中后保留该结果,在其后追加新消息继续追问
|
|
22
|
+
const targets = [];
|
|
23
|
+
for (let i = 0; i < agent.messages.length; i++) {
|
|
24
|
+
const msg = agent.messages[i];
|
|
25
|
+
if (msg.role === AgentNS.Role.User) {
|
|
26
|
+
const text = getMessageText(msg);
|
|
27
|
+
targets.push({
|
|
28
|
+
index: i,
|
|
29
|
+
role: msg.role,
|
|
30
|
+
label: chalk.green("👤 用户"),
|
|
31
|
+
preview: text.substring(0, 60) + (text.length > 60 ? "..." : ""),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else if (msg.role === AgentNS.Role.Tool || msg.role === AgentNS.Role.Function) {
|
|
35
|
+
const text = getMessageText(msg);
|
|
36
|
+
const toolName = msg.name ? ` [${msg.name}]` : "";
|
|
37
|
+
targets.push({
|
|
38
|
+
index: i,
|
|
39
|
+
role: msg.role,
|
|
40
|
+
label: chalk.cyan(`🔧 工具${toolName}`),
|
|
41
|
+
preview: text.substring(0, 60) + (text.length > 60 ? "..." : ""),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (targets.length === 0) {
|
|
46
|
+
console.log(chalk.red("\n❌ 还没有消息可以撤回\n"));
|
|
47
|
+
ctx.input = "";
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
console.log(chalk.yellow.bold("\n📋 选择要撤回到哪条消息:"));
|
|
51
|
+
console.log(chalk.gray("选中用户消息可修改重发,选中工具结果可继续追问\n"));
|
|
52
|
+
const choices = [...targets].reverse().map((target) => ({
|
|
53
|
+
name: `${target.label} ${chalk.gray(target.preview)}`,
|
|
54
|
+
value: target.index,
|
|
55
|
+
}));
|
|
56
|
+
const { selectedIndex } = await inquirer.prompt([
|
|
57
|
+
{
|
|
58
|
+
type: "list",
|
|
59
|
+
name: "selectedIndex",
|
|
60
|
+
message: "撤回到:",
|
|
61
|
+
pageSize: 15,
|
|
62
|
+
choices: [{ name: "↩️ 取消操作", value: -1 }, ...choices],
|
|
63
|
+
},
|
|
64
|
+
]);
|
|
65
|
+
if (selectedIndex === -1) {
|
|
66
|
+
console.log(chalk.gray("已取消操作\n"));
|
|
67
|
+
ctx.input = "";
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const selectedMsg = agent.messages[selectedIndex];
|
|
71
|
+
const isUserMsg = selectedMsg.role === AgentNS.Role.User;
|
|
72
|
+
const originalText = getMessageText(selectedMsg);
|
|
73
|
+
// 截断消息:
|
|
74
|
+
// - 用户消息:删掉该消息(sliceEnd = selectedIndex),让用户修改重发
|
|
75
|
+
// - 工具/函数结果:保留该结果(sliceEnd = selectedIndex + 1),让用户继续追问
|
|
76
|
+
const sliceEnd = isUserMsg ? selectedIndex : selectedIndex + 1;
|
|
77
|
+
agent.messages = agent.messages.slice(0, sliceEnd);
|
|
78
|
+
if (isUserMsg) {
|
|
79
|
+
console.log(chalk.gray(`原内容: ${originalText.substring(0, 200)}${originalText.length > 200 ? "..." : ""}`));
|
|
80
|
+
console.log();
|
|
81
|
+
const { editChoice } = await inquirer.prompt([
|
|
82
|
+
{
|
|
83
|
+
type: "list",
|
|
84
|
+
name: "editChoice",
|
|
85
|
+
message: "请选择:",
|
|
86
|
+
choices: [
|
|
87
|
+
{ name: "✏️ 修改后重新发送", value: "edit" },
|
|
88
|
+
{ name: "🔄 直接重新发送(不修改内容)", value: "resend" },
|
|
89
|
+
{ name: "↩️ 取消操作", value: "cancel" },
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
]);
|
|
93
|
+
if (editChoice === "cancel") {
|
|
94
|
+
console.log(chalk.gray("已取消操作\n"));
|
|
95
|
+
ctx.input = "";
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (editChoice === "edit") {
|
|
99
|
+
const { editedContent } = await inquirer.prompt([
|
|
100
|
+
{
|
|
101
|
+
type: "input",
|
|
102
|
+
name: "editedContent",
|
|
103
|
+
message: chalk.cyan("修改消息:"),
|
|
104
|
+
prefix: "✏️",
|
|
105
|
+
default: originalText,
|
|
106
|
+
},
|
|
107
|
+
]);
|
|
108
|
+
const trimmed = editedContent.trim();
|
|
109
|
+
if (!trimmed) {
|
|
110
|
+
console.log(chalk.red("\n❌ 消息内容不能为空\n"));
|
|
111
|
+
ctx.input = "";
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
ctx.input = trimmed;
|
|
115
|
+
ctx.shouldSend = true;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
ctx.input = originalText;
|
|
119
|
+
ctx.shouldSend = true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.log(chalk.gray(`原工具结果: ${originalText.substring(0, 200)}${originalText.length > 200 ? "..." : ""}`));
|
|
124
|
+
console.log(chalk.yellow("💡 请输入一条新消息,将插入到工具调用结果之后继续对话"));
|
|
125
|
+
console.log();
|
|
126
|
+
const { newMessage } = await inquirer.prompt([
|
|
127
|
+
{
|
|
128
|
+
type: "input",
|
|
129
|
+
name: "newMessage",
|
|
130
|
+
message: chalk.cyan("新消息:"),
|
|
131
|
+
prefix: "💬",
|
|
132
|
+
},
|
|
133
|
+
]);
|
|
134
|
+
const trimmed = newMessage.trim();
|
|
135
|
+
if (!trimmed) {
|
|
136
|
+
console.log(chalk.red("\n❌ 消息内容不能为空\n"));
|
|
137
|
+
ctx.input = "";
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
ctx.input = trimmed;
|
|
141
|
+
ctx.shouldSend = true;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=back.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"back.js","sourceRoot":"","sources":["../../src/conversation-commands/back.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/clear.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAsB,WAAW,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export async function handleClear(ctx) {
|
|
3
|
+
console.clear();
|
|
4
|
+
console.log(chalk.blue.bold("\n" + "=".repeat(60)));
|
|
5
|
+
console.log(chalk.blue.bold(" 屏幕已清空"));
|
|
6
|
+
console.log(chalk.blue.bold("=".repeat(60) + "\n"));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=clear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../src/conversation-commands/clear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAwB;IACxD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/editor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAsB,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa1E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
export async function handleEditor(ctx) {
|
|
4
|
+
const { content } = await inquirer.prompt([
|
|
5
|
+
{ type: "editor", name: "content", message: "编辑消息:" },
|
|
6
|
+
]);
|
|
7
|
+
if (!content.trim()) {
|
|
8
|
+
console.log(chalk.gray("已取消\n"));
|
|
9
|
+
ctx.input = "";
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
ctx.input = content.trim();
|
|
13
|
+
ctx.shouldSend = true;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/conversation-commands/editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAwB;IACzD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;KACtD,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC3B,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit.d.ts","sourceRoot":"","sources":["../../src/conversation-commands/exit.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKvD,wBAAsB,UAAU,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BxE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
import { ConversationRepository, DraftRepository } from "@ai-zen/agents-sdk";
|
|
4
|
+
import { CONVERSATIONS_DIR, DRAFTS_DIR } from "../config.js";
|
|
5
|
+
const conversationRepo = new ConversationRepository(CONVERSATIONS_DIR);
|
|
6
|
+
const draftRepo = new DraftRepository(DRAFTS_DIR);
|
|
7
|
+
export async function handleExit(ctx) {
|
|
8
|
+
const agent = ctx.agent;
|
|
9
|
+
if (agent.messages.length > 1) {
|
|
10
|
+
const { saveBeforeExit } = await inquirer.prompt([
|
|
11
|
+
{
|
|
12
|
+
type: "confirm",
|
|
13
|
+
name: "saveBeforeExit",
|
|
14
|
+
message: "退出前是否保存当前对话?",
|
|
15
|
+
default: true,
|
|
16
|
+
},
|
|
17
|
+
]);
|
|
18
|
+
if (saveBeforeExit) {
|
|
19
|
+
try {
|
|
20
|
+
const id = ctx.currentId || ctx.currentName.replace(/[\\/:*?"<>|]/g, "_");
|
|
21
|
+
conversationRepo.write({
|
|
22
|
+
id,
|
|
23
|
+
agentId: ctx.agentId || "default",
|
|
24
|
+
modelId: ctx.modelId,
|
|
25
|
+
messages: agent.messages,
|
|
26
|
+
createdAt: new Date().toISOString(),
|
|
27
|
+
updatedAt: new Date().toISOString(),
|
|
28
|
+
});
|
|
29
|
+
console.log(chalk.green(`\n✅ 对话已保存: ${ctx.currentName} (ID: ${id})\n`));
|
|
30
|
+
draftRepo.delete();
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error(chalk.red(`\n❌ 保存失败: ${error}\n`));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
ctx.running = false;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=exit.js.map
|