@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.
Files changed (162) hide show
  1. package/bin/roll.js +2 -0
  2. package/dist/cli/commands/agent-add.d.ts +9 -0
  3. package/dist/cli/commands/agent-add.d.ts.map +1 -0
  4. package/dist/cli/commands/agent-add.js +123 -0
  5. package/dist/cli/commands/agent-add.js.map +1 -0
  6. package/dist/cli/commands/agent-health.d.ts +14 -0
  7. package/dist/cli/commands/agent-health.d.ts.map +1 -0
  8. package/dist/cli/commands/agent-health.js +85 -0
  9. package/dist/cli/commands/agent-health.js.map +1 -0
  10. package/dist/cli/commands/agent-info.d.ts +9 -0
  11. package/dist/cli/commands/agent-info.d.ts.map +1 -0
  12. package/dist/cli/commands/agent-info.js +32 -0
  13. package/dist/cli/commands/agent-info.js.map +1 -0
  14. package/dist/cli/commands/agent-list.d.ts +9 -0
  15. package/dist/cli/commands/agent-list.d.ts.map +1 -0
  16. package/dist/cli/commands/agent-list.js +37 -0
  17. package/dist/cli/commands/agent-list.js.map +1 -0
  18. package/dist/cli/commands/agent-remove.d.ts +9 -0
  19. package/dist/cli/commands/agent-remove.d.ts.map +1 -0
  20. package/dist/cli/commands/agent-remove.js +22 -0
  21. package/dist/cli/commands/agent-remove.js.map +1 -0
  22. package/dist/cli/commands/agent-start.d.ts +9 -0
  23. package/dist/cli/commands/agent-start.d.ts.map +1 -0
  24. package/dist/cli/commands/agent-start.js +44 -0
  25. package/dist/cli/commands/agent-start.js.map +1 -0
  26. package/dist/cli/commands/agent-stop.d.ts +9 -0
  27. package/dist/cli/commands/agent-stop.d.ts.map +1 -0
  28. package/dist/cli/commands/agent-stop.js +29 -0
  29. package/dist/cli/commands/agent-stop.js.map +1 -0
  30. package/dist/cli/commands/agent.d.ts +3 -0
  31. package/dist/cli/commands/agent.d.ts.map +1 -0
  32. package/dist/cli/commands/agent.js +14 -0
  33. package/dist/cli/commands/agent.js.map +1 -0
  34. package/dist/cli/commands/ask.d.ts +14 -0
  35. package/dist/cli/commands/ask.d.ts.map +1 -0
  36. package/dist/cli/commands/ask.js +103 -0
  37. package/dist/cli/commands/ask.js.map +1 -0
  38. package/dist/cli/commands/config.d.ts +19 -0
  39. package/dist/cli/commands/config.d.ts.map +1 -0
  40. package/dist/cli/commands/config.js +142 -0
  41. package/dist/cli/commands/config.js.map +1 -0
  42. package/dist/cli/commands/doctor.d.ts +10 -0
  43. package/dist/cli/commands/doctor.d.ts.map +1 -0
  44. package/dist/cli/commands/doctor.js +123 -0
  45. package/dist/cli/commands/doctor.js.map +1 -0
  46. package/dist/cli/commands/run.d.ts +24 -0
  47. package/dist/cli/commands/run.d.ts.map +1 -0
  48. package/dist/cli/commands/run.js +124 -0
  49. package/dist/cli/commands/run.js.map +1 -0
  50. package/dist/cli/commands/update.d.ts +12 -0
  51. package/dist/cli/commands/update.d.ts.map +1 -0
  52. package/dist/cli/commands/update.js +237 -0
  53. package/dist/cli/commands/update.js.map +1 -0
  54. package/dist/cli/index.d.ts +2 -0
  55. package/dist/cli/index.d.ts.map +1 -0
  56. package/dist/cli/index.js +31 -0
  57. package/dist/cli/index.js.map +1 -0
  58. package/dist/cli/smoke.e2e.d.ts +2 -0
  59. package/dist/cli/smoke.e2e.d.ts.map +1 -0
  60. package/dist/cli/smoke.e2e.js +57 -0
  61. package/dist/cli/smoke.e2e.js.map +1 -0
  62. package/dist/cli/utils/output.d.ts +24 -0
  63. package/dist/cli/utils/output.d.ts.map +1 -0
  64. package/dist/cli/utils/output.js +52 -0
  65. package/dist/cli/utils/output.js.map +1 -0
  66. package/dist/cli/utils/prompt.d.ts +2 -0
  67. package/dist/cli/utils/prompt.d.ts.map +1 -0
  68. package/dist/cli/utils/prompt.js +4 -0
  69. package/dist/cli/utils/prompt.js.map +1 -0
  70. package/dist/cli/utils/update-checker.d.ts +24 -0
  71. package/dist/cli/utils/update-checker.d.ts.map +1 -0
  72. package/dist/cli/utils/update-checker.js +146 -0
  73. package/dist/cli/utils/update-checker.js.map +1 -0
  74. package/dist/config/defaults.d.ts +6 -0
  75. package/dist/config/defaults.d.ts.map +1 -0
  76. package/dist/config/defaults.js +20 -0
  77. package/dist/config/defaults.js.map +1 -0
  78. package/dist/config/index.d.ts +6 -0
  79. package/dist/config/index.d.ts.map +1 -0
  80. package/dist/config/index.js +4 -0
  81. package/dist/config/index.js.map +1 -0
  82. package/dist/config/loader.d.ts +24 -0
  83. package/dist/config/loader.d.ts.map +1 -0
  84. package/dist/config/loader.js +142 -0
  85. package/dist/config/loader.js.map +1 -0
  86. package/dist/config/schema.d.ts +145 -0
  87. package/dist/config/schema.d.ts.map +1 -0
  88. package/dist/config/schema.js +24 -0
  89. package/dist/config/schema.js.map +1 -0
  90. package/dist/llm/engine.d.ts +22 -0
  91. package/dist/llm/engine.d.ts.map +1 -0
  92. package/dist/llm/engine.js +31 -0
  93. package/dist/llm/engine.js.map +1 -0
  94. package/dist/llm/index.d.ts +4 -0
  95. package/dist/llm/index.d.ts.map +1 -0
  96. package/dist/llm/index.js +3 -0
  97. package/dist/llm/index.js.map +1 -0
  98. package/dist/llm/providers.d.ts +8 -0
  99. package/dist/llm/providers.d.ts.map +1 -0
  100. package/dist/llm/providers.js +38 -0
  101. package/dist/llm/providers.js.map +1 -0
  102. package/dist/mcp/client-manager.d.ts +34 -0
  103. package/dist/mcp/client-manager.d.ts.map +1 -0
  104. package/dist/mcp/client-manager.js +79 -0
  105. package/dist/mcp/client-manager.js.map +1 -0
  106. package/dist/mcp/index.d.ts +2 -0
  107. package/dist/mcp/index.d.ts.map +1 -0
  108. package/dist/mcp/index.js +2 -0
  109. package/dist/mcp/index.js.map +1 -0
  110. package/dist/mcp/sampling-handler.d.ts +12 -0
  111. package/dist/mcp/sampling-handler.d.ts.map +1 -0
  112. package/dist/mcp/sampling-handler.js +56 -0
  113. package/dist/mcp/sampling-handler.js.map +1 -0
  114. package/dist/registry/discovery.d.ts +16 -0
  115. package/dist/registry/discovery.d.ts.map +1 -0
  116. package/dist/registry/discovery.js +72 -0
  117. package/dist/registry/discovery.js.map +1 -0
  118. package/dist/registry/health-check.d.ts +18 -0
  119. package/dist/registry/health-check.d.ts.map +1 -0
  120. package/dist/registry/health-check.js +65 -0
  121. package/dist/registry/health-check.js.map +1 -0
  122. package/dist/registry/index.d.ts +5 -0
  123. package/dist/registry/index.d.ts.map +1 -0
  124. package/dist/registry/index.js +4 -0
  125. package/dist/registry/index.js.map +1 -0
  126. package/dist/registry/process-manager.d.ts +13 -0
  127. package/dist/registry/process-manager.d.ts.map +1 -0
  128. package/dist/registry/process-manager.js +82 -0
  129. package/dist/registry/process-manager.js.map +1 -0
  130. package/dist/registry/store.d.ts +21 -0
  131. package/dist/registry/store.d.ts.map +1 -0
  132. package/dist/registry/store.js +81 -0
  133. package/dist/registry/store.js.map +1 -0
  134. package/dist/router/declarative.d.ts +8 -0
  135. package/dist/router/declarative.d.ts.map +1 -0
  136. package/dist/router/declarative.js +9 -0
  137. package/dist/router/declarative.js.map +1 -0
  138. package/dist/router/index.d.ts +3 -0
  139. package/dist/router/index.d.ts.map +1 -0
  140. package/dist/router/index.js +3 -0
  141. package/dist/router/index.js.map +1 -0
  142. package/dist/router/llm-router.d.ts +12 -0
  143. package/dist/router/llm-router.d.ts.map +1 -0
  144. package/dist/router/llm-router.js +60 -0
  145. package/dist/router/llm-router.js.map +1 -0
  146. package/dist/types/agent.d.ts +57 -0
  147. package/dist/types/agent.d.ts.map +1 -0
  148. package/dist/types/agent.js +3 -0
  149. package/dist/types/agent.js.map +1 -0
  150. package/dist/types/config.d.ts +2 -0
  151. package/dist/types/config.d.ts.map +1 -0
  152. package/dist/types/config.js +2 -0
  153. package/dist/types/config.js.map +1 -0
  154. package/dist/types/mcp.d.ts +7 -0
  155. package/dist/types/mcp.d.ts.map +1 -0
  156. package/dist/types/mcp.js +2 -0
  157. package/dist/types/mcp.js.map +1 -0
  158. package/dist/types/router.d.ts +21 -0
  159. package/dist/types/router.d.ts.map +1 -0
  160. package/dist/types/router.js +8 -0
  161. package/dist/types/router.js.map +1 -0
  162. package/package.json +47 -0
package/bin/roll.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/cli/index.js";
@@ -0,0 +1,9 @@
1
+ declare const _default: import("citty").CommandDef<{
2
+ path: {
3
+ type: "positional";
4
+ description: string;
5
+ required: true;
6
+ };
7
+ }>;
8
+ export default _default;
9
+ //# sourceMappingURL=agent-add.d.ts.map
@@ -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,9 @@
1
+ declare const _default: import("citty").CommandDef<{
2
+ name: {
3
+ type: "positional";
4
+ description: string;
5
+ required: true;
6
+ };
7
+ }>;
8
+ export default _default;
9
+ //# sourceMappingURL=agent-info.d.ts.map
@@ -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,9 @@
1
+ declare const _default: import("citty").CommandDef<{
2
+ json: {
3
+ type: "boolean";
4
+ description: string;
5
+ default: false;
6
+ };
7
+ }>;
8
+ export default _default;
9
+ //# sourceMappingURL=agent-list.d.ts.map
@@ -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,9 @@
1
+ declare const _default: import("citty").CommandDef<{
2
+ name: {
3
+ type: "positional";
4
+ description: string;
5
+ required: true;
6
+ };
7
+ }>;
8
+ export default _default;
9
+ //# sourceMappingURL=agent-remove.d.ts.map
@@ -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,9 @@
1
+ declare const _default: import("citty").CommandDef<{
2
+ name: {
3
+ type: "positional";
4
+ description: string;
5
+ required: true;
6
+ };
7
+ }>;
8
+ export default _default;
9
+ //# sourceMappingURL=agent-start.d.ts.map
@@ -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,9 @@
1
+ declare const _default: import("citty").CommandDef<{
2
+ name: {
3
+ type: "positional";
4
+ description: string;
5
+ required: true;
6
+ };
7
+ }>;
8
+ export default _default;
9
+ //# sourceMappingURL=agent-stop.d.ts.map
@@ -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,3 @@
1
+ declare const _default: import("citty").CommandDef<import("citty").ArgsDef>;
2
+ export default _default;
3
+ //# sourceMappingURL=agent.d.ts.map
@@ -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"}