@roll-agent/core 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/roll.js +2 -0
- package/dist/cli/commands/agent-add.d.ts +9 -0
- package/dist/cli/commands/agent-add.d.ts.map +1 -0
- package/dist/cli/commands/agent-add.js +123 -0
- package/dist/cli/commands/agent-add.js.map +1 -0
- package/dist/cli/commands/agent-health.d.ts +14 -0
- package/dist/cli/commands/agent-health.d.ts.map +1 -0
- package/dist/cli/commands/agent-health.js +85 -0
- package/dist/cli/commands/agent-health.js.map +1 -0
- package/dist/cli/commands/agent-info.d.ts +9 -0
- package/dist/cli/commands/agent-info.d.ts.map +1 -0
- package/dist/cli/commands/agent-info.js +32 -0
- package/dist/cli/commands/agent-info.js.map +1 -0
- package/dist/cli/commands/agent-list.d.ts +9 -0
- package/dist/cli/commands/agent-list.d.ts.map +1 -0
- package/dist/cli/commands/agent-list.js +37 -0
- package/dist/cli/commands/agent-list.js.map +1 -0
- package/dist/cli/commands/agent-remove.d.ts +9 -0
- package/dist/cli/commands/agent-remove.d.ts.map +1 -0
- package/dist/cli/commands/agent-remove.js +22 -0
- package/dist/cli/commands/agent-remove.js.map +1 -0
- package/dist/cli/commands/agent-start.d.ts +9 -0
- package/dist/cli/commands/agent-start.d.ts.map +1 -0
- package/dist/cli/commands/agent-start.js +44 -0
- package/dist/cli/commands/agent-start.js.map +1 -0
- package/dist/cli/commands/agent-stop.d.ts +9 -0
- package/dist/cli/commands/agent-stop.d.ts.map +1 -0
- package/dist/cli/commands/agent-stop.js +29 -0
- package/dist/cli/commands/agent-stop.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +3 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +14 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/ask.d.ts +14 -0
- package/dist/cli/commands/ask.d.ts.map +1 -0
- package/dist/cli/commands/ask.js +103 -0
- package/dist/cli/commands/ask.js.map +1 -0
- package/dist/cli/commands/config.d.ts +19 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +142 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +10 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +123 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/run.d.ts +24 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +124 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/update.d.ts +12 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +237 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/smoke.e2e.d.ts +2 -0
- package/dist/cli/smoke.e2e.d.ts.map +1 -0
- package/dist/cli/smoke.e2e.js +57 -0
- package/dist/cli/smoke.e2e.js.map +1 -0
- package/dist/cli/utils/output.d.ts +24 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +52 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/prompt.d.ts +2 -0
- package/dist/cli/utils/prompt.d.ts.map +1 -0
- package/dist/cli/utils/prompt.js +4 -0
- package/dist/cli/utils/prompt.js.map +1 -0
- package/dist/cli/utils/update-checker.d.ts +24 -0
- package/dist/cli/utils/update-checker.d.ts.map +1 -0
- package/dist/cli/utils/update-checker.js +146 -0
- package/dist/cli/utils/update-checker.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +20 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +24 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +142 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +145 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +24 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/llm/engine.d.ts +22 -0
- package/dist/llm/engine.d.ts.map +1 -0
- package/dist/llm/engine.js +31 -0
- package/dist/llm/engine.js.map +1 -0
- package/dist/llm/index.d.ts +4 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +3 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/providers.d.ts +8 -0
- package/dist/llm/providers.d.ts.map +1 -0
- package/dist/llm/providers.js +38 -0
- package/dist/llm/providers.js.map +1 -0
- package/dist/mcp/client-manager.d.ts +34 -0
- package/dist/mcp/client-manager.d.ts.map +1 -0
- package/dist/mcp/client-manager.js +79 -0
- package/dist/mcp/client-manager.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/sampling-handler.d.ts +12 -0
- package/dist/mcp/sampling-handler.d.ts.map +1 -0
- package/dist/mcp/sampling-handler.js +56 -0
- package/dist/mcp/sampling-handler.js.map +1 -0
- package/dist/registry/discovery.d.ts +16 -0
- package/dist/registry/discovery.d.ts.map +1 -0
- package/dist/registry/discovery.js +72 -0
- package/dist/registry/discovery.js.map +1 -0
- package/dist/registry/health-check.d.ts +18 -0
- package/dist/registry/health-check.d.ts.map +1 -0
- package/dist/registry/health-check.js +65 -0
- package/dist/registry/health-check.js.map +1 -0
- package/dist/registry/index.d.ts +5 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +4 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/process-manager.d.ts +13 -0
- package/dist/registry/process-manager.d.ts.map +1 -0
- package/dist/registry/process-manager.js +82 -0
- package/dist/registry/process-manager.js.map +1 -0
- package/dist/registry/store.d.ts +21 -0
- package/dist/registry/store.d.ts.map +1 -0
- package/dist/registry/store.js +81 -0
- package/dist/registry/store.js.map +1 -0
- package/dist/router/declarative.d.ts +8 -0
- package/dist/router/declarative.d.ts.map +1 -0
- package/dist/router/declarative.js +9 -0
- package/dist/router/declarative.js.map +1 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +3 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/llm-router.d.ts +12 -0
- package/dist/router/llm-router.d.ts.map +1 -0
- package/dist/router/llm-router.js +60 -0
- package/dist/router/llm-router.js.map +1 -0
- package/dist/types/agent.d.ts +57 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +3 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/mcp.d.ts +7 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +2 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/router.d.ts +21 -0
- package/dist/types/router.d.ts.map +1 -0
- package/dist/types/router.js +8 -0
- package/dist/types/router.js.map +1 -0
- package/package.json +47 -0
package/bin/roll.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-add.ts"],"names":[],"mappings":";;;;;;;AA6BA,wBAoGG"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
4
|
+
import { execFile } from "node:child_process";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { loadConfig } from "../../config/loader.js";
|
|
7
|
+
import { discoverAgent } from "../../registry/discovery.js";
|
|
8
|
+
import { AgentStore } from "../../registry/store.js";
|
|
9
|
+
import { log } from "../utils/output.js";
|
|
10
|
+
const execFileAsync = promisify(execFile);
|
|
11
|
+
/** 判断输入是否为 Git URL */
|
|
12
|
+
function isGitUrl(input) {
|
|
13
|
+
return (input.startsWith("https://") ||
|
|
14
|
+
input.startsWith("http://") ||
|
|
15
|
+
input.startsWith("git@") ||
|
|
16
|
+
input.endsWith(".git"));
|
|
17
|
+
}
|
|
18
|
+
/** 从 Git URL 中提取仓库名作为目录名 */
|
|
19
|
+
function repoNameFromUrl(url) {
|
|
20
|
+
const last = url.split("/").pop() ?? url;
|
|
21
|
+
return last.replace(/\.git$/, "");
|
|
22
|
+
}
|
|
23
|
+
export default defineCommand({
|
|
24
|
+
meta: { description: "注册一个 Agent(本地路径或 Git URL)" },
|
|
25
|
+
args: {
|
|
26
|
+
path: { type: "positional", description: "Agent 本地路径或 Git URL", required: true },
|
|
27
|
+
},
|
|
28
|
+
async run({ args }) {
|
|
29
|
+
const { config } = loadConfig();
|
|
30
|
+
let agentDir;
|
|
31
|
+
if (isGitUrl(args.path)) {
|
|
32
|
+
// Git URL 模式:克隆到 dataDir 下
|
|
33
|
+
const repoName = repoNameFromUrl(args.path);
|
|
34
|
+
const cloneTarget = resolve(config.agents.dataDir, "repos", repoName);
|
|
35
|
+
if (existsSync(cloneTarget)) {
|
|
36
|
+
log.info(`仓库目录已存在,拉取最新代码: ${cloneTarget}`);
|
|
37
|
+
try {
|
|
38
|
+
await execFileAsync("git", ["pull"], { cwd: cloneTarget });
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
log.error(`git pull 失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
42
|
+
process.exitCode = 1;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
log.info(`克隆 ${args.path}...`);
|
|
48
|
+
const parentDir = resolve(config.agents.dataDir, "repos");
|
|
49
|
+
if (!existsSync(parentDir)) {
|
|
50
|
+
mkdirSync(parentDir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
await execFileAsync("git", ["clone", args.path, cloneTarget]);
|
|
54
|
+
log.success("克隆完成");
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
log.error(`git clone 失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
58
|
+
process.exitCode = 1;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
agentDir = cloneTarget;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
agentDir = resolve(args.path);
|
|
66
|
+
if (!existsSync(agentDir)) {
|
|
67
|
+
log.error(`路径不存在: ${agentDir}`);
|
|
68
|
+
process.exitCode = 1;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// 1. 解析 SKILL.md
|
|
73
|
+
log.info("解析 SKILL.md...");
|
|
74
|
+
const discovered = discoverAgent(agentDir);
|
|
75
|
+
log.debug(`名称: ${discovered.skill.name}`);
|
|
76
|
+
log.debug(`描述: ${discovered.skill.description}`);
|
|
77
|
+
log.debug(`传输: ${discovered.transport.type}`);
|
|
78
|
+
// 2. 安装依赖(如果存在 package.json)
|
|
79
|
+
const packageJsonPath = resolve(agentDir, "package.json");
|
|
80
|
+
const skipInstall = process.env["ROLL_SKIP_INSTALL"] === "1";
|
|
81
|
+
if (existsSync(packageJsonPath) && !skipInstall) {
|
|
82
|
+
log.info("安装依赖...");
|
|
83
|
+
try {
|
|
84
|
+
await execFileAsync("pnpm", ["install"], { cwd: agentDir });
|
|
85
|
+
log.success("依赖安装完成");
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
log.error(`依赖安装失败: ${err instanceof Error ? err.message : ""}`);
|
|
89
|
+
process.exitCode = 1;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else if (existsSync(packageJsonPath) && skipInstall) {
|
|
94
|
+
log.warn("检测到 ROLL_SKIP_INSTALL=1,跳过依赖安装。");
|
|
95
|
+
}
|
|
96
|
+
// 3. 确定 Agent 来源
|
|
97
|
+
const source = isGitUrl(args.path)
|
|
98
|
+
? { type: "git", url: args.path }
|
|
99
|
+
: discovered.transport.type === "streamable-http"
|
|
100
|
+
? { type: "remote" }
|
|
101
|
+
: { type: "local", path: agentDir };
|
|
102
|
+
// 4. 注册到 store
|
|
103
|
+
const store = new AgentStore(config.agents.dataDir);
|
|
104
|
+
const agent = {
|
|
105
|
+
skill: discovered.skill,
|
|
106
|
+
transport: discovered.transport,
|
|
107
|
+
installPath: agentDir,
|
|
108
|
+
registeredAt: new Date().toISOString(),
|
|
109
|
+
status: "idle",
|
|
110
|
+
source,
|
|
111
|
+
...(discovered.skillBody.length > 0 ? { skillBody: discovered.skillBody } : {}),
|
|
112
|
+
};
|
|
113
|
+
try {
|
|
114
|
+
store.add(agent);
|
|
115
|
+
log.success(`Agent "${discovered.skill.name}" 注册成功`);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
119
|
+
process.exitCode = 1;
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=agent-add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-add.js","sourceRoot":"","sources":["../../../src/cli/commands/agent-add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAGzC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,sBAAsB;AACtB,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,CACL,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;QAC5B,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;QAC3B,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CACvB,CAAC;AACJ,CAAC;AAED,4BAA4B;AAC5B,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE;IAClD,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,IAAI,EAAE;KACjF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,IAAI,QAAgB,CAAC;QAErB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEtE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5B,GAAG,CAAC,IAAI,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;gBAC3C,IAAI,CAAC;oBACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC7D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,KAAK,CAAC,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC9E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;gBAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC1D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC9D,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,KAAK,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;YACH,CAAC;YACD,QAAQ,GAAG,WAAW,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,KAAK,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC;gBAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC3C,GAAG,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,GAAG,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACjD,GAAG,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9C,6BAA6B;QAC7B,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC;QAC7D,IAAI,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAChD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC5D,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,CAAC,eAAe,CAAC,IAAI,WAAW,EAAE,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9C,CAAC;QAED,iBAAiB;QACjB,MAAM,MAAM,GAAgB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7C,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE;YACjC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,iBAAiB;gBAC/C,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACpB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAExC,eAAe;QACf,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEpD,MAAM,KAAK,GAAoB;YAC7B,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,WAAW,EAAE,QAAQ;YACrB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,MAAM;YACN,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF,CAAC;QAEF,IAAI,CAAC;YACH,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACjB,GAAG,CAAC,OAAO,CAAC,UAAU,UAAU,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
declare const _default: import("citty").CommandDef<{
|
|
2
|
+
restart: {
|
|
3
|
+
type: "boolean";
|
|
4
|
+
description: string;
|
|
5
|
+
default: false;
|
|
6
|
+
};
|
|
7
|
+
json: {
|
|
8
|
+
type: "boolean";
|
|
9
|
+
description: string;
|
|
10
|
+
default: false;
|
|
11
|
+
};
|
|
12
|
+
}>;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=agent-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-health.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-health.ts"],"names":[],"mappings":";;;;;;;;;;;;AAsBA,wBAyDG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { loadConfig } from "../../config/loader.js";
|
|
3
|
+
import { AgentStore } from "../../registry/store.js";
|
|
4
|
+
import { McpClientManager } from "../../mcp/client-manager.js";
|
|
5
|
+
import { log } from "../utils/output.js";
|
|
6
|
+
function isStreamableHttpAgent(agent) {
|
|
7
|
+
return agent.transport.type === "streamable-http";
|
|
8
|
+
}
|
|
9
|
+
export default defineCommand({
|
|
10
|
+
meta: { description: "检查 Agent 健康状态(stdio 为按需模式)" },
|
|
11
|
+
args: {
|
|
12
|
+
restart: {
|
|
13
|
+
type: "boolean",
|
|
14
|
+
description: "兼容旧参数,stdio 按需模式下不生效",
|
|
15
|
+
default: false,
|
|
16
|
+
},
|
|
17
|
+
json: { type: "boolean", description: "JSON 格式输出", default: false },
|
|
18
|
+
},
|
|
19
|
+
async run({ args }) {
|
|
20
|
+
const { config } = loadConfig();
|
|
21
|
+
const store = new AgentStore(config.agents.dataDir);
|
|
22
|
+
const agents = store.list();
|
|
23
|
+
if (args.restart) {
|
|
24
|
+
log.warn("`--restart` 仅为兼容保留参数;stdio Agent 为按需启动,不执行重启逻辑。");
|
|
25
|
+
}
|
|
26
|
+
if (agents.length === 0) {
|
|
27
|
+
log.info("暂无已注册 Agent。");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const results = [];
|
|
31
|
+
for (const agent of agents) {
|
|
32
|
+
if (!isStreamableHttpAgent(agent)) {
|
|
33
|
+
results.push({
|
|
34
|
+
agentName: agent.skill.name,
|
|
35
|
+
transport: "stdio",
|
|
36
|
+
healthy: true,
|
|
37
|
+
message: "按需模式:由 run/ask 自动启动并在调用后释放",
|
|
38
|
+
});
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
results.push(await checkStreamableHttpHealth(agent));
|
|
42
|
+
}
|
|
43
|
+
if (args.json) {
|
|
44
|
+
console.log(JSON.stringify(results, null, 2));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
for (const result of results) {
|
|
48
|
+
if (result.healthy) {
|
|
49
|
+
log.success(`${result.agentName} [${result.transport}]: ${result.message}`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
log.error(`${result.agentName} [${result.transport}]: ${result.message}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const unhealthy = results.filter((r) => !r.healthy);
|
|
56
|
+
if (unhealthy.length > 0) {
|
|
57
|
+
process.exitCode = 1;
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
async function checkStreamableHttpHealth(agent) {
|
|
62
|
+
const clientManager = new McpClientManager();
|
|
63
|
+
try {
|
|
64
|
+
const client = await clientManager.connect(agent.skill.name, agent.transport, agent.installPath, { timeoutMs: 5000 });
|
|
65
|
+
await client.listTools();
|
|
66
|
+
return {
|
|
67
|
+
agentName: agent.skill.name,
|
|
68
|
+
transport: "streamable-http",
|
|
69
|
+
healthy: true,
|
|
70
|
+
message: `可连接 (${agent.transport.endpoint})`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
return {
|
|
75
|
+
agentName: agent.skill.name,
|
|
76
|
+
transport: "streamable-http",
|
|
77
|
+
healthy: false,
|
|
78
|
+
message: `不可连接 (${agent.transport.endpoint}): ${err instanceof Error ? err.message : String(err)}`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
await clientManager.disconnectAll();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=agent-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-health.js","sourceRoot":"","sources":["../../../src/cli/commands/agent-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-info.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-info.ts"],"names":[],"mappings":";;;;;;;AAIA,wBA8BG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { loadConfig } from "../../config/loader.js";
|
|
3
|
+
import { AgentStore } from "../../registry/store.js";
|
|
4
|
+
export default defineCommand({
|
|
5
|
+
meta: { description: "查看 Agent 详情" },
|
|
6
|
+
args: {
|
|
7
|
+
name: { type: "positional", description: "Agent 名称", required: true },
|
|
8
|
+
},
|
|
9
|
+
run({ args }) {
|
|
10
|
+
const { config } = loadConfig();
|
|
11
|
+
const store = new AgentStore(config.agents.dataDir);
|
|
12
|
+
const agent = store.findByName(args.name);
|
|
13
|
+
if (!agent) {
|
|
14
|
+
console.error(`✗ Agent "${args.name}" 未找到`);
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
console.log(`名称: ${agent.skill.name}`);
|
|
19
|
+
console.log(`描述: ${agent.skill.description}`);
|
|
20
|
+
console.log(`状态: ${agent.status}`);
|
|
21
|
+
console.log(`传输: ${agent.transport.type}`);
|
|
22
|
+
console.log(`路径: ${agent.installPath}`);
|
|
23
|
+
console.log(`注册时间: ${agent.registeredAt}`);
|
|
24
|
+
if (Object.keys(agent.skill.metadata).length > 0) {
|
|
25
|
+
console.log(`元数据:`);
|
|
26
|
+
for (const [key, value] of Object.entries(agent.skill.metadata)) {
|
|
27
|
+
console.log(` ${key}: ${value}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=agent-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-info.js","sourceRoot":"","sources":["../../../src/cli/commands/agent-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE;IACpC,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;KACtE;IACD,GAAG,CAAC,EAAE,IAAI,EAAE;QACV,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QAE3C,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-list.ts"],"names":[],"mappings":";;;;;;;AAKA,wBAoCG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import Table from "cli-table3";
|
|
3
|
+
import { loadConfig } from "../../config/loader.js";
|
|
4
|
+
import { AgentStore } from "../../registry/store.js";
|
|
5
|
+
export default defineCommand({
|
|
6
|
+
meta: { description: "列出所有已注册 Agent" },
|
|
7
|
+
args: {
|
|
8
|
+
json: { type: "boolean", description: "JSON 格式输出", default: false },
|
|
9
|
+
},
|
|
10
|
+
run({ args }) {
|
|
11
|
+
const { config } = loadConfig();
|
|
12
|
+
const store = new AgentStore(config.agents.dataDir);
|
|
13
|
+
const agents = store.list();
|
|
14
|
+
if (agents.length === 0) {
|
|
15
|
+
console.log("暂无已注册的 Agent。使用 `roll agent add <path>` 注册。");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (args.json) {
|
|
19
|
+
console.log(JSON.stringify(agents, null, 2));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const table = new Table({
|
|
23
|
+
head: ["Name", "Status", "Transport", "Path"],
|
|
24
|
+
style: { head: ["cyan"] },
|
|
25
|
+
});
|
|
26
|
+
for (const agent of agents) {
|
|
27
|
+
table.push([
|
|
28
|
+
agent.skill.name,
|
|
29
|
+
agent.status,
|
|
30
|
+
agent.transport.type,
|
|
31
|
+
agent.installPath,
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
console.log(table.toString());
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=agent-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-list.js","sourceRoot":"","sources":["../../../src/cli/commands/agent-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE;IACtC,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;KACpE;IACD,GAAG,CAAC,EAAE,IAAI,EAAE;QACV,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC;YAC7C,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;SAC1B,CAAC,CAAC;QAEH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,CAAC,KAAK,CAAC,IAAI;gBAChB,KAAK,CAAC,MAAM;gBACZ,KAAK,CAAC,SAAS,CAAC,IAAI;gBACpB,KAAK,CAAC,WAAW;aAClB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChC,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-remove.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-remove.ts"],"names":[],"mappings":";;;;;;;AAIA,wBAiBG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { loadConfig } from "../../config/loader.js";
|
|
3
|
+
import { AgentStore } from "../../registry/store.js";
|
|
4
|
+
export default defineCommand({
|
|
5
|
+
meta: { description: "移除一个 Agent" },
|
|
6
|
+
args: {
|
|
7
|
+
name: { type: "positional", description: "Agent 名称", required: true },
|
|
8
|
+
},
|
|
9
|
+
run({ args }) {
|
|
10
|
+
const { config } = loadConfig();
|
|
11
|
+
const store = new AgentStore(config.agents.dataDir);
|
|
12
|
+
const removed = store.remove(args.name);
|
|
13
|
+
if (removed) {
|
|
14
|
+
console.log(`✓ Agent "${args.name}" 已移除`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.error(`✗ Agent "${args.name}" 未找到`);
|
|
18
|
+
process.exitCode = 1;
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=agent-remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-remove.js","sourceRoot":"","sources":["../../../src/cli/commands/agent-remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;IACnC,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;KACtE;IACD,GAAG,CAAC,EAAE,IAAI,EAAE;QACV,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-start.ts"],"names":[],"mappings":";;;;;;;AAKA,wBAkDG"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { loadConfig } from "../../config/loader.js";
|
|
3
|
+
import { AgentStore } from "../../registry/store.js";
|
|
4
|
+
import { McpClientManager } from "../../mcp/client-manager.js";
|
|
5
|
+
export default defineCommand({
|
|
6
|
+
meta: { description: "检查 Agent 是否可连接(stdio 无需手动启动)" },
|
|
7
|
+
args: {
|
|
8
|
+
name: { type: "positional", description: "Agent 名称", required: true },
|
|
9
|
+
},
|
|
10
|
+
async run({ args }) {
|
|
11
|
+
const { config } = loadConfig();
|
|
12
|
+
const store = new AgentStore(config.agents.dataDir);
|
|
13
|
+
const agent = store.findByName(args.name);
|
|
14
|
+
if (!agent) {
|
|
15
|
+
console.error(`✗ Agent "${args.name}" 未找到`);
|
|
16
|
+
process.exitCode = 1;
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (agent.transport.type === "stdio") {
|
|
20
|
+
console.error(`✗ Agent "${args.name}" 使用 stdio 传输,生命周期由 run/ask 按需管理,` +
|
|
21
|
+
"不支持手动 start。");
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// streamable-http 由外部服务管理;start 命令仅做可达性探测
|
|
26
|
+
const clientManager = new McpClientManager();
|
|
27
|
+
try {
|
|
28
|
+
const client = await clientManager.connect(agent.skill.name, agent.transport, agent.installPath, { timeoutMs: 5000 });
|
|
29
|
+
await client.listTools();
|
|
30
|
+
console.log(`✓ Agent "${args.name}" 可连接 (${agent.transport.endpoint})。` +
|
|
31
|
+
"该 Agent 需由外部进程管理启动。");
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
console.error(`✗ Agent "${args.name}" 不可连接 (${agent.transport.endpoint})。` +
|
|
35
|
+
"请先在外部启动服务。");
|
|
36
|
+
console.error(` ${err instanceof Error ? err.message : String(err)}`);
|
|
37
|
+
process.exitCode = 1;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await clientManager.disconnectAll();
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=agent-start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-start.js","sourceRoot":"","sources":["../../../src/cli/commands/agent-start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE;IACrD,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;KACtE;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CACX,YAAY,IAAI,CAAC,IAAI,mCAAmC;gBACtD,cAAc,CACjB,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,MAAM,aAAa,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CACxC,KAAK,CAAC,KAAK,CAAC,IAAI,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,WAAW,EACjB,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;YACF,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CACT,YAAY,IAAI,CAAC,IAAI,UAAU,KAAK,CAAC,SAAS,CAAC,QAAQ,IAAI;gBACzD,qBAAqB,CACxB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,YAAY,IAAI,CAAC,IAAI,WAAW,KAAK,CAAC,SAAS,CAAC,QAAQ,IAAI;gBAC1D,YAAY,CACf,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,MAAM,aAAa,CAAC,aAAa,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent-stop.ts"],"names":[],"mappings":";;;;;;;AAIA,wBA+BG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { loadConfig } from "../../config/loader.js";
|
|
3
|
+
import { AgentStore } from "../../registry/store.js";
|
|
4
|
+
export default defineCommand({
|
|
5
|
+
meta: { description: "停止 Agent(stdio 无需手动停止)" },
|
|
6
|
+
args: {
|
|
7
|
+
name: { type: "positional", description: "Agent 名称", required: true },
|
|
8
|
+
},
|
|
9
|
+
run({ args }) {
|
|
10
|
+
const { config } = loadConfig();
|
|
11
|
+
const store = new AgentStore(config.agents.dataDir);
|
|
12
|
+
const agent = store.findByName(args.name);
|
|
13
|
+
if (!agent) {
|
|
14
|
+
console.error(`✗ Agent "${args.name}" 未找到`);
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (agent.transport.type === "stdio") {
|
|
19
|
+
console.error(`✗ Agent "${args.name}" 使用 stdio 传输,生命周期由 run/ask 按需管理,` +
|
|
20
|
+
"不支持手动 stop。");
|
|
21
|
+
process.exitCode = 1;
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.error(`✗ Agent "${args.name}" 使用 streamable-http 传输,需在外部服务中停止。` +
|
|
25
|
+
`\n 端点: ${agent.transport.endpoint}`);
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=agent-stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-stop.js","sourceRoot":"","sources":["../../../src/cli/commands/agent-stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC/C,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;KACtE;IACD,GAAG,CAAC,EAAE,IAAI,EAAE;QACV,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CACX,YAAY,IAAI,CAAC,IAAI,mCAAmC;gBACtD,aAAa,CAChB,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CACX,YAAY,IAAI,CAAC,IAAI,oCAAoC;YACvD,WAAW,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,CACxC,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent.ts"],"names":[],"mappings":";AAEA,wBAWG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
export default defineCommand({
|
|
3
|
+
meta: { description: "管理 Agent(stdio 按需生命周期)" },
|
|
4
|
+
subCommands: {
|
|
5
|
+
add: () => import("./agent-add.ts").then((m) => m.default),
|
|
6
|
+
remove: () => import("./agent-remove.ts").then((m) => m.default),
|
|
7
|
+
list: () => import("./agent-list.ts").then((m) => m.default),
|
|
8
|
+
start: () => import("./agent-start.ts").then((m) => m.default),
|
|
9
|
+
stop: () => import("./agent-stop.ts").then((m) => m.default),
|
|
10
|
+
info: () => import("./agent-info.ts").then((m) => m.default),
|
|
11
|
+
health: () => import("./agent-health.ts").then((m) => m.default),
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/cli/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,eAAe,aAAa,CAAC;IAC3B,IAAI,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC/C,WAAW,EAAE;QACX,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1D,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAChE,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9D,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;KACjE;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
declare const _default: import("citty").CommandDef<{
|
|
2
|
+
message: {
|
|
3
|
+
type: "positional";
|
|
4
|
+
description: string;
|
|
5
|
+
required: true;
|
|
6
|
+
};
|
|
7
|
+
json: {
|
|
8
|
+
type: "boolean";
|
|
9
|
+
description: string;
|
|
10
|
+
default: false;
|
|
11
|
+
};
|
|
12
|
+
}>;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=ask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ask.ts"],"names":[],"mappings":";;;;;;;;;;;;AAWA,wBAwHG"}
|