agenticros 0.3.1 → 0.3.4
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 +13 -5
- package/dist/__tests__/claude-config.test.d.ts +2 -0
- package/dist/__tests__/claude-config.test.d.ts.map +1 -0
- package/dist/__tests__/claude-config.test.js +77 -0
- package/dist/__tests__/claude-config.test.js.map +1 -0
- package/dist/__tests__/hermes-config.test.d.ts +2 -0
- package/dist/__tests__/hermes-config.test.d.ts.map +1 -0
- package/dist/__tests__/hermes-config.test.js +88 -0
- package/dist/__tests__/hermes-config.test.js.map +1 -0
- package/dist/__tests__/mcp-setup.test.d.ts +2 -0
- package/dist/__tests__/mcp-setup.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-setup.test.js +23 -0
- package/dist/__tests__/mcp-setup.test.js.map +1 -0
- package/dist/commands/claude.d.ts +16 -0
- package/dist/commands/claude.d.ts.map +1 -0
- package/dist/commands/claude.js +30 -0
- package/dist/commands/claude.js.map +1 -0
- package/dist/commands/codex.d.ts +4 -4
- package/dist/commands/codex.d.ts.map +1 -1
- package/dist/commands/codex.js +21 -90
- package/dist/commands/codex.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +30 -22
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/hermes.d.ts +14 -0
- package/dist/commands/hermes.d.ts.map +1 -0
- package/dist/commands/hermes.js +21 -0
- package/dist/commands/hermes.js.map +1 -0
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +16 -18
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.d.ts +20 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +31 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -1
- package/dist/util/claude-config.d.ts +47 -0
- package/dist/util/claude-config.d.ts.map +1 -0
- package/dist/util/claude-config.js +227 -0
- package/dist/util/claude-config.js.map +1 -0
- package/dist/util/hermes-config.d.ts +51 -0
- package/dist/util/hermes-config.d.ts.map +1 -0
- package/dist/util/hermes-config.js +277 -0
- package/dist/util/hermes-config.js.map +1 -0
- package/dist/util/mcp-setup.d.ts +55 -0
- package/dist/util/mcp-setup.d.ts.map +1 -0
- package/dist/util/mcp-setup.js +235 -0
- package/dist/util/mcp-setup.js.map +1 -0
- package/package.json +2 -1
- package/runtime/BUNDLE.json +1 -1
- package/runtime/README.md +87 -10
- package/runtime/docs/cli.md +89 -2
- package/runtime/packages/agenticros-claude-code/README.md +35 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read/write helpers for Claude MCP config (`.mcp.json` and Claude Desktop JSON).
|
|
3
|
+
*
|
|
4
|
+
* Claude Code uses project `.mcp.json` (or user scope via `claude mcp add`).
|
|
5
|
+
* Claude Desktop uses `claude_desktop_config.json` under OS-specific paths.
|
|
6
|
+
* We only manage the `agenticros` entry — other servers are preserved.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { homedir, platform } from "node:os";
|
|
10
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
11
|
+
const AGENTICROS_SERVER_KEY = "agenticros";
|
|
12
|
+
/** Project-scoped MCP config: `<cwd>/.mcp.json`. */
|
|
13
|
+
export function projectMcpJsonPath(cwd = process.cwd()) {
|
|
14
|
+
return join(cwd, ".mcp.json");
|
|
15
|
+
}
|
|
16
|
+
/** Claude Desktop MCP config (macOS / Windows). */
|
|
17
|
+
export function claudeDesktopConfigPath() {
|
|
18
|
+
const home = homedir();
|
|
19
|
+
if (platform() === "win32") {
|
|
20
|
+
const appData = process.env["APPDATA"] ?? join(home, "AppData", "Roaming");
|
|
21
|
+
return join(appData, "Claude", "claude_desktop_config.json");
|
|
22
|
+
}
|
|
23
|
+
return join(home, "Library", "Application Support", "Claude", "claude_desktop_config.json");
|
|
24
|
+
}
|
|
25
|
+
export function resolveClaudeConfigPath(target, cwd = process.cwd()) {
|
|
26
|
+
return target === "project" ? projectMcpJsonPath(cwd) : claudeDesktopConfigPath();
|
|
27
|
+
}
|
|
28
|
+
/** Agenticros MCP server block (stdio + sh -c wrapper for log redirection). */
|
|
29
|
+
export function buildAgenticrosMcpServerEntry(mcpEntryAbs, namespace = "") {
|
|
30
|
+
const escaped = mcpEntryAbs.replace(/\\/g, "\\\\");
|
|
31
|
+
const shellCmd = `node ${escaped} 2>>/tmp/agenticros-mcp.log`;
|
|
32
|
+
return {
|
|
33
|
+
type: "stdio",
|
|
34
|
+
command: "sh",
|
|
35
|
+
args: ["-c", shellCmd],
|
|
36
|
+
env: {
|
|
37
|
+
AGENTICROS_ROBOT_NAMESPACE: namespace,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Merge agenticros into an MCP JSON document, preserving other keys and $comment. */
|
|
42
|
+
export function upsertAgenticrosMcpJson(existingContent, serverEntry) {
|
|
43
|
+
let root = {};
|
|
44
|
+
if (existingContent?.trim()) {
|
|
45
|
+
try {
|
|
46
|
+
const parsed = JSON.parse(existingContent);
|
|
47
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
48
|
+
root = { ...parsed };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
root = {};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const servers = root["mcpServers"] && typeof root["mcpServers"] === "object" && !Array.isArray(root["mcpServers"])
|
|
56
|
+
? { ...root["mcpServers"] }
|
|
57
|
+
: {};
|
|
58
|
+
servers[AGENTICROS_SERVER_KEY] = serverEntry;
|
|
59
|
+
root["mcpServers"] = servers;
|
|
60
|
+
return `${JSON.stringify(root, null, 2)}\n`;
|
|
61
|
+
}
|
|
62
|
+
export function writeClaudeAgenticrosConfig(configPath, mcpEntryAbs, options) {
|
|
63
|
+
const abs = resolve(mcpEntryAbs);
|
|
64
|
+
const entry = buildAgenticrosMcpServerEntry(abs, options?.namespace ?? "");
|
|
65
|
+
const existing = existsSync(configPath) ? readFileSync(configPath, "utf8") : null;
|
|
66
|
+
const merged = upsertAgenticrosMcpJson(existing, entry);
|
|
67
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
68
|
+
writeFileSync(configPath, merged, "utf8");
|
|
69
|
+
}
|
|
70
|
+
export function readClaudeAgenticrosConfig(configPath, target) {
|
|
71
|
+
const base = { configPath, exists: existsSync(configPath), target };
|
|
72
|
+
if (!base.exists)
|
|
73
|
+
return base;
|
|
74
|
+
let content;
|
|
75
|
+
try {
|
|
76
|
+
content = readFileSync(configPath, "utf8");
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return base;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const root = JSON.parse(content);
|
|
83
|
+
const servers = root["mcpServers"];
|
|
84
|
+
const entry = servers?.[AGENTICROS_SERVER_KEY];
|
|
85
|
+
if (!entry)
|
|
86
|
+
return base;
|
|
87
|
+
base.command = typeof entry["command"] === "string" ? entry["command"] : undefined;
|
|
88
|
+
base.args = Array.isArray(entry["args"])
|
|
89
|
+
? entry["args"].filter((a) => typeof a === "string")
|
|
90
|
+
: undefined;
|
|
91
|
+
base.env =
|
|
92
|
+
entry["env"] && typeof entry["env"] === "object" && !Array.isArray(entry["env"])
|
|
93
|
+
? Object.fromEntries(Object.entries(entry["env"]).filter((e) => typeof e[1] === "string"))
|
|
94
|
+
: undefined;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return base;
|
|
98
|
+
}
|
|
99
|
+
return base;
|
|
100
|
+
}
|
|
101
|
+
export function validateClaudeAgenticrosConfig(cfg, mcpEntryExpected) {
|
|
102
|
+
const issues = [];
|
|
103
|
+
const setupHint = cfg.target === "desktop"
|
|
104
|
+
? "Run `agenticros claude setup --desktop` or `agenticros mcp setup --claude --desktop`."
|
|
105
|
+
: "Run `agenticros claude setup` or `agenticros mcp setup --claude`.";
|
|
106
|
+
if (!cfg.exists) {
|
|
107
|
+
issues.push({
|
|
108
|
+
severity: "yellow",
|
|
109
|
+
message: `Claude MCP config missing (${cfg.configPath})`,
|
|
110
|
+
hint: setupHint,
|
|
111
|
+
});
|
|
112
|
+
return { ok: false, issues };
|
|
113
|
+
}
|
|
114
|
+
if (!cfg.command && (!cfg.args || cfg.args.length === 0)) {
|
|
115
|
+
issues.push({
|
|
116
|
+
severity: "red",
|
|
117
|
+
message: `Claude mcpServers.agenticros has no command or args (${cfg.target})`,
|
|
118
|
+
hint: setupHint,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
const mcpPath = extractMcpPathFromArgs(cfg.args ?? []);
|
|
122
|
+
if (mcpPath && !isAbsolute(mcpPath.split(/\s/)[0] ?? mcpPath)) {
|
|
123
|
+
issues.push({
|
|
124
|
+
severity: "red",
|
|
125
|
+
message: "Claude MCP path is relative — Claude cwd is not the repo root",
|
|
126
|
+
hint: setupHint,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (mcpEntryExpected && mcpPath) {
|
|
130
|
+
const expected = resolve(mcpEntryExpected);
|
|
131
|
+
const actual = resolve(mcpPath.split(/\s/)[0] ?? mcpPath);
|
|
132
|
+
if (actual !== expected && !existsSync(actual)) {
|
|
133
|
+
issues.push({
|
|
134
|
+
severity: "red",
|
|
135
|
+
message: "Claude MCP path does not point to a built server",
|
|
136
|
+
hint: `Expected ${expected}. ${setupHint}`,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
else if (actual !== expected) {
|
|
140
|
+
issues.push({
|
|
141
|
+
severity: "yellow",
|
|
142
|
+
message: "Claude MCP path differs from the CLI-resolved MCP entry",
|
|
143
|
+
hint: `CLI expects ${expected}. ${setupHint}`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else if (mcpEntryExpected && !mcpPath) {
|
|
148
|
+
issues.push({
|
|
149
|
+
severity: "yellow",
|
|
150
|
+
message: "Could not parse MCP server path from Claude config",
|
|
151
|
+
hint: setupHint,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
const ns = (cfg.env?.["AGENTICROS_ROBOT_NAMESPACE"] ?? "").trim();
|
|
155
|
+
if (ns.length > 0) {
|
|
156
|
+
issues.push({
|
|
157
|
+
severity: "yellow",
|
|
158
|
+
message: `Claude AGENTICROS_ROBOT_NAMESPACE is hardcoded ('${ns}')`,
|
|
159
|
+
hint: 'Leave it empty so `agenticros mode real|sim` drives the namespace (same as Codex/Hermes).',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
const hasRed = issues.some((i) => i.severity === "red");
|
|
163
|
+
return { ok: !hasRed && issues.length === 0, issues };
|
|
164
|
+
}
|
|
165
|
+
export function buildClaudeDoctorChecks(mcpEntryExpected, repoRoot) {
|
|
166
|
+
const checks = [];
|
|
167
|
+
const candidates = [
|
|
168
|
+
{ id: "claude-config-desktop", label: "Claude Desktop MCP", target: "desktop", path: claudeDesktopConfigPath() },
|
|
169
|
+
];
|
|
170
|
+
if (repoRoot) {
|
|
171
|
+
candidates.unshift({
|
|
172
|
+
id: "claude-config-project",
|
|
173
|
+
label: "Claude Code project MCP",
|
|
174
|
+
target: "project",
|
|
175
|
+
path: projectMcpJsonPath(repoRoot),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
for (const c of candidates) {
|
|
179
|
+
const cfg = readClaudeAgenticrosConfig(c.path, c.target);
|
|
180
|
+
if (!cfg.exists) {
|
|
181
|
+
if (c.target === "desktop") {
|
|
182
|
+
checks.push({
|
|
183
|
+
id: c.id,
|
|
184
|
+
label: "Claude Desktop MCP config missing",
|
|
185
|
+
severity: "yellow",
|
|
186
|
+
hint: "Run `agenticros mcp setup --claude` or `agenticros claude setup --desktop`.",
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
const v = validateClaudeAgenticrosConfig(cfg, mcpEntryExpected);
|
|
192
|
+
if (v.ok) {
|
|
193
|
+
checks.push({
|
|
194
|
+
id: c.id,
|
|
195
|
+
label: `${c.label} OK`,
|
|
196
|
+
severity: "green",
|
|
197
|
+
detail: c.path,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
const worst = v.issues.some((i) => i.severity === "red") ? "red" : "yellow";
|
|
202
|
+
const first = v.issues[0];
|
|
203
|
+
checks.push({
|
|
204
|
+
id: c.id,
|
|
205
|
+
label: `${c.label}: ${first.message}`,
|
|
206
|
+
severity: worst,
|
|
207
|
+
hint: first.hint ?? "Run `agenticros mcp doctor`.",
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return checks;
|
|
212
|
+
}
|
|
213
|
+
function extractMcpPathFromArgs(args) {
|
|
214
|
+
if (args.length === 0)
|
|
215
|
+
return undefined;
|
|
216
|
+
if (args[0] === "-c" && args[1]) {
|
|
217
|
+
const nodeMatch = args[1].match(/node\s+(\S+)/);
|
|
218
|
+
return nodeMatch?.[1];
|
|
219
|
+
}
|
|
220
|
+
if (args[0] === "node" || args[0]?.endsWith("/node")) {
|
|
221
|
+
return args[1];
|
|
222
|
+
}
|
|
223
|
+
const joined = args.join(" ");
|
|
224
|
+
const nodeMatch = joined.match(/node\s+(\S+)/);
|
|
225
|
+
return nodeMatch?.[1];
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=claude-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-config.js","sourceRoot":"","sources":["../../src/util/claude-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read/write helpers for Hermes Agent MCP config (`~/.hermes/config.yaml`).
|
|
3
|
+
*
|
|
4
|
+
* Hermes stores MCP servers under `mcp_servers.<name>` in YAML. We only
|
|
5
|
+
* manage the `agenticros` entry — other servers are preserved.
|
|
6
|
+
*/
|
|
7
|
+
export interface HermesAgenticrosConfig {
|
|
8
|
+
configPath: string;
|
|
9
|
+
exists: boolean;
|
|
10
|
+
command?: string;
|
|
11
|
+
args?: string[];
|
|
12
|
+
env?: Record<string, string>;
|
|
13
|
+
connectTimeout?: number;
|
|
14
|
+
timeout?: number;
|
|
15
|
+
enabled?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface HermesConfigIssue {
|
|
18
|
+
severity: "red" | "yellow";
|
|
19
|
+
message: string;
|
|
20
|
+
hint?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface HermesConfigValidation {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
issues: HermesConfigIssue[];
|
|
25
|
+
}
|
|
26
|
+
/** Global Hermes config: `~/.hermes/config.yaml`. */
|
|
27
|
+
export declare function globalHermesConfigPath(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Build the YAML block for the AgenticROS MCP server. Uses an absolute path
|
|
30
|
+
* to index.js (required by Hermes stdio transport) and leaves namespace empty
|
|
31
|
+
* so `~/.agenticros/config.json` / `agenticros mode` drives the active robot.
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildAgenticrosMcpYamlBlock(mcpEntryAbs: string, namespace?: string): string;
|
|
34
|
+
/** Insert or replace the agenticros MCP block, preserving other YAML content. */
|
|
35
|
+
export declare function upsertAgenticrosBlock(existingContent: string | null, block: string): string;
|
|
36
|
+
/** Parse the agenticros MCP section from a Hermes config.yaml file. */
|
|
37
|
+
export declare function readHermesAgenticrosConfig(configPath: string): HermesAgenticrosConfig;
|
|
38
|
+
export declare function writeHermesAgenticrosConfig(configPath: string, mcpEntryAbs: string, options?: {
|
|
39
|
+
namespace?: string;
|
|
40
|
+
}): void;
|
|
41
|
+
/** Validate Hermes agenticros MCP config against expected MCP binary path. */
|
|
42
|
+
export declare function validateHermesAgenticrosConfig(cfg: HermesAgenticrosConfig, mcpEntryExpected?: string): HermesConfigValidation;
|
|
43
|
+
/** Doctor check entries for Hermes MCP config (used by `agenticros doctor`). */
|
|
44
|
+
export declare function buildHermesDoctorChecks(mcpEntryExpected: string | undefined): Array<{
|
|
45
|
+
id: string;
|
|
46
|
+
label: string;
|
|
47
|
+
severity: "green" | "yellow" | "red";
|
|
48
|
+
hint?: string;
|
|
49
|
+
detail?: string;
|
|
50
|
+
}>;
|
|
51
|
+
//# sourceMappingURL=hermes-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes-config.d.ts","sourceRoot":"","sources":["../../src/util/hermes-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAKD,qDAAqD;AACrD,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAYvF;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA+B3F;AAED,uEAAuE;AACvE,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,CA4BrF;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,IAAI,CAON;AAED,8EAA8E;AAC9E,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,sBAAsB,EAC3B,gBAAgB,CAAC,EAAE,MAAM,GACxB,sBAAsB,CAyExB;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC5G"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read/write helpers for Hermes Agent MCP config (`~/.hermes/config.yaml`).
|
|
3
|
+
*
|
|
4
|
+
* Hermes stores MCP servers under `mcp_servers.<name>` in YAML. We only
|
|
5
|
+
* manage the `agenticros` entry — other servers are preserved.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { homedir } from "node:os";
|
|
9
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
10
|
+
const MCP_SERVERS_KEY = "mcp_servers:";
|
|
11
|
+
const AGENTICROS_KEY = "agenticros:";
|
|
12
|
+
/** Global Hermes config: `~/.hermes/config.yaml`. */
|
|
13
|
+
export function globalHermesConfigPath() {
|
|
14
|
+
return join(homedir(), ".hermes", "config.yaml");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build the YAML block for the AgenticROS MCP server. Uses an absolute path
|
|
18
|
+
* to index.js (required by Hermes stdio transport) and leaves namespace empty
|
|
19
|
+
* so `~/.agenticros/config.json` / `agenticros mode` drives the active robot.
|
|
20
|
+
*/
|
|
21
|
+
export function buildAgenticrosMcpYamlBlock(mcpEntryAbs, namespace = "") {
|
|
22
|
+
const escaped = mcpEntryAbs.replace(/\\/g, "\\\\");
|
|
23
|
+
const nsYaml = namespace.replace(/"/g, '\\"');
|
|
24
|
+
return `${MCP_SERVERS_KEY}
|
|
25
|
+
${AGENTICROS_KEY}
|
|
26
|
+
command: "node"
|
|
27
|
+
args: ["${escaped}"]
|
|
28
|
+
env:
|
|
29
|
+
AGENTICROS_ROBOT_NAMESPACE: "${nsYaml}"
|
|
30
|
+
connect_timeout: 60
|
|
31
|
+
timeout: 120
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
/** Insert or replace the agenticros MCP block, preserving other YAML content. */
|
|
35
|
+
export function upsertAgenticrosBlock(existingContent, block) {
|
|
36
|
+
const trimmedBlock = block.trimEnd() + "\n";
|
|
37
|
+
if (!existingContent?.trim()) {
|
|
38
|
+
return trimmedBlock;
|
|
39
|
+
}
|
|
40
|
+
const lines = existingContent.split("\n");
|
|
41
|
+
const mcpIdx = lines.findIndex((l) => l.trim() === MCP_SERVERS_KEY);
|
|
42
|
+
if (mcpIdx < 0) {
|
|
43
|
+
const sep = lines.length > 0 && lines[lines.length - 1]?.trim() !== "" ? "\n" : "";
|
|
44
|
+
return lines.join("\n") + sep + trimmedBlock;
|
|
45
|
+
}
|
|
46
|
+
const agentIdx = findAgenticrosLineIndex(lines, mcpIdx);
|
|
47
|
+
if (agentIdx < 0) {
|
|
48
|
+
const insertAt = findMcpServersInsertPoint(lines, mcpIdx);
|
|
49
|
+
const agentLines = trimmedBlock
|
|
50
|
+
.split("\n")
|
|
51
|
+
.slice(1)
|
|
52
|
+
.filter((l) => l.trim().length > 0);
|
|
53
|
+
const out = [...lines.slice(0, insertAt), ...agentLines, ...lines.slice(insertAt)];
|
|
54
|
+
return out.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
|
|
55
|
+
}
|
|
56
|
+
const endIdx = findAgenticrosEndIndex(lines, agentIdx);
|
|
57
|
+
const agentLines = trimmedBlock
|
|
58
|
+
.split("\n")
|
|
59
|
+
.slice(1)
|
|
60
|
+
.filter((l) => l.startsWith(" "));
|
|
61
|
+
const out = [...lines.slice(0, agentIdx), ...agentLines, ...lines.slice(endIdx)];
|
|
62
|
+
return out.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
|
|
63
|
+
}
|
|
64
|
+
/** Parse the agenticros MCP section from a Hermes config.yaml file. */
|
|
65
|
+
export function readHermesAgenticrosConfig(configPath) {
|
|
66
|
+
const base = { configPath, exists: existsSync(configPath) };
|
|
67
|
+
if (!base.exists)
|
|
68
|
+
return base;
|
|
69
|
+
let content;
|
|
70
|
+
try {
|
|
71
|
+
content = readFileSync(configPath, "utf8");
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return base;
|
|
75
|
+
}
|
|
76
|
+
const lines = content.split("\n");
|
|
77
|
+
const mcpIdx = lines.findIndex((l) => l.trim() === MCP_SERVERS_KEY);
|
|
78
|
+
if (mcpIdx < 0)
|
|
79
|
+
return base;
|
|
80
|
+
const agentIdx = findAgenticrosLineIndex(lines, mcpIdx);
|
|
81
|
+
if (agentIdx < 0)
|
|
82
|
+
return base;
|
|
83
|
+
const endIdx = findAgenticrosEndIndex(lines, agentIdx);
|
|
84
|
+
const section = lines.slice(agentIdx, endIdx).join("\n");
|
|
85
|
+
base.command = parseYamlString(section, "command");
|
|
86
|
+
base.args = parseYamlStringArray(section, "args");
|
|
87
|
+
base.env = parseYamlEnvBlock(section);
|
|
88
|
+
base.connectTimeout = parseYamlNumber(section, "connect_timeout");
|
|
89
|
+
base.timeout = parseYamlNumber(section, "timeout");
|
|
90
|
+
base.enabled = parseYamlBoolean(section, "enabled");
|
|
91
|
+
return base;
|
|
92
|
+
}
|
|
93
|
+
export function writeHermesAgenticrosConfig(configPath, mcpEntryAbs, options) {
|
|
94
|
+
const abs = resolve(mcpEntryAbs);
|
|
95
|
+
const block = buildAgenticrosMcpYamlBlock(abs, options?.namespace ?? "");
|
|
96
|
+
const existing = existsSync(configPath) ? readFileSync(configPath, "utf8") : null;
|
|
97
|
+
const merged = upsertAgenticrosBlock(existing, block);
|
|
98
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
99
|
+
writeFileSync(configPath, merged, "utf8");
|
|
100
|
+
}
|
|
101
|
+
/** Validate Hermes agenticros MCP config against expected MCP binary path. */
|
|
102
|
+
export function validateHermesAgenticrosConfig(cfg, mcpEntryExpected) {
|
|
103
|
+
const issues = [];
|
|
104
|
+
if (!cfg.exists) {
|
|
105
|
+
issues.push({
|
|
106
|
+
severity: "yellow",
|
|
107
|
+
message: `Hermes config missing (${cfg.configPath})`,
|
|
108
|
+
hint: "Run `agenticros hermes setup` to register the AgenticROS MCP server.",
|
|
109
|
+
});
|
|
110
|
+
return { ok: false, issues };
|
|
111
|
+
}
|
|
112
|
+
if (!cfg.command && (!cfg.args || cfg.args.length === 0)) {
|
|
113
|
+
issues.push({
|
|
114
|
+
severity: "red",
|
|
115
|
+
message: "Hermes mcp_servers.agenticros has no command or args",
|
|
116
|
+
hint: "Run `agenticros hermes setup` to repair the entry.",
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const mcpPath = cfg.args?.[0];
|
|
120
|
+
if (mcpPath && !isAbsolute(mcpPath)) {
|
|
121
|
+
issues.push({
|
|
122
|
+
severity: "red",
|
|
123
|
+
message: "Hermes MCP path is relative — Hermes cwd is not the repo root",
|
|
124
|
+
hint: "Run `agenticros hermes setup` to rewrite with an absolute path.",
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (mcpEntryExpected && mcpPath) {
|
|
128
|
+
const expected = resolve(mcpEntryExpected);
|
|
129
|
+
const actual = resolve(mcpPath);
|
|
130
|
+
if (actual !== expected && !existsSync(actual)) {
|
|
131
|
+
issues.push({
|
|
132
|
+
severity: "red",
|
|
133
|
+
message: "Hermes MCP path does not point to a built server",
|
|
134
|
+
hint: `Expected ${expected}. Run \`agenticros hermes setup\`.`,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else if (actual !== expected) {
|
|
138
|
+
issues.push({
|
|
139
|
+
severity: "yellow",
|
|
140
|
+
message: "Hermes MCP path differs from the CLI-resolved MCP entry",
|
|
141
|
+
hint: `CLI expects ${expected}. Run \`agenticros hermes setup\` to sync.`,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else if (mcpEntryExpected && !mcpPath) {
|
|
146
|
+
issues.push({
|
|
147
|
+
severity: "yellow",
|
|
148
|
+
message: "Could not parse MCP server path from Hermes config",
|
|
149
|
+
hint: "Run `agenticros hermes setup` to rewrite the entry.",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
const ns = (cfg.env?.["AGENTICROS_ROBOT_NAMESPACE"] ?? "").trim();
|
|
153
|
+
if (ns.length > 0) {
|
|
154
|
+
issues.push({
|
|
155
|
+
severity: "yellow",
|
|
156
|
+
message: `Hermes AGENTICROS_ROBOT_NAMESPACE is hardcoded ('${ns}')`,
|
|
157
|
+
hint: 'Leave it empty in ~/.hermes/config.yaml so `agenticros mode real|sim` drives the namespace (same as Codex).',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
if (cfg.enabled === false) {
|
|
161
|
+
issues.push({
|
|
162
|
+
severity: "yellow",
|
|
163
|
+
message: "Hermes agenticros MCP server is disabled (enabled: false)",
|
|
164
|
+
hint: "Remove enabled: false or re-run `agenticros hermes setup`.",
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
const hasRed = issues.some((i) => i.severity === "red");
|
|
168
|
+
return { ok: !hasRed && issues.length === 0, issues };
|
|
169
|
+
}
|
|
170
|
+
/** Doctor check entries for Hermes MCP config (used by `agenticros doctor`). */
|
|
171
|
+
export function buildHermesDoctorChecks(mcpEntryExpected) {
|
|
172
|
+
const checks = [];
|
|
173
|
+
const configPath = globalHermesConfigPath();
|
|
174
|
+
const cfg = readHermesAgenticrosConfig(configPath);
|
|
175
|
+
if (!cfg.exists) {
|
|
176
|
+
checks.push({
|
|
177
|
+
id: "hermes-config",
|
|
178
|
+
label: "Hermes MCP config missing (~/.hermes/config.yaml)",
|
|
179
|
+
severity: "yellow",
|
|
180
|
+
hint: "Run `agenticros hermes setup` to register the AgenticROS MCP server.",
|
|
181
|
+
});
|
|
182
|
+
return checks;
|
|
183
|
+
}
|
|
184
|
+
const v = validateHermesAgenticrosConfig(cfg, mcpEntryExpected);
|
|
185
|
+
if (v.ok) {
|
|
186
|
+
checks.push({
|
|
187
|
+
id: "hermes-config",
|
|
188
|
+
label: "Hermes MCP config OK",
|
|
189
|
+
severity: "green",
|
|
190
|
+
detail: configPath,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
const worst = v.issues.some((i) => i.severity === "red") ? "red" : "yellow";
|
|
195
|
+
const first = v.issues[0];
|
|
196
|
+
checks.push({
|
|
197
|
+
id: "hermes-config",
|
|
198
|
+
label: `Hermes MCP: ${first.message}`,
|
|
199
|
+
severity: worst,
|
|
200
|
+
hint: first.hint ?? "Run `agenticros hermes setup`.",
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return checks;
|
|
204
|
+
}
|
|
205
|
+
function findAgenticrosLineIndex(lines, mcpIdx) {
|
|
206
|
+
for (let i = mcpIdx + 1; i < lines.length; i++) {
|
|
207
|
+
const trimmed = lines[i]?.trim() ?? "";
|
|
208
|
+
if (/^\S/.test(lines[i] ?? "") && trimmed !== MCP_SERVERS_KEY)
|
|
209
|
+
break;
|
|
210
|
+
if (trimmed === AGENTICROS_KEY)
|
|
211
|
+
return i;
|
|
212
|
+
}
|
|
213
|
+
return -1;
|
|
214
|
+
}
|
|
215
|
+
function findMcpServersInsertPoint(lines, mcpIdx) {
|
|
216
|
+
let insertAt = mcpIdx + 1;
|
|
217
|
+
for (let i = mcpIdx + 1; i < lines.length; i++) {
|
|
218
|
+
const line = lines[i] ?? "";
|
|
219
|
+
if (/^\S/.test(line) && line.trim() !== MCP_SERVERS_KEY)
|
|
220
|
+
break;
|
|
221
|
+
if (/^ \S/.test(line))
|
|
222
|
+
insertAt = i + 1;
|
|
223
|
+
}
|
|
224
|
+
return insertAt;
|
|
225
|
+
}
|
|
226
|
+
function findAgenticrosEndIndex(lines, agentIdx) {
|
|
227
|
+
for (let i = agentIdx + 1; i < lines.length; i++) {
|
|
228
|
+
const line = lines[i] ?? "";
|
|
229
|
+
if (/^ \S/.test(line) && !line.startsWith(" ") && line.trim() !== AGENTICROS_KEY) {
|
|
230
|
+
return i;
|
|
231
|
+
}
|
|
232
|
+
if (/^\S/.test(line))
|
|
233
|
+
return i;
|
|
234
|
+
}
|
|
235
|
+
return lines.length;
|
|
236
|
+
}
|
|
237
|
+
function parseYamlString(section, key) {
|
|
238
|
+
const re = new RegExp(`^\\s*${key}:\\s*"([^"]*)"`, "m");
|
|
239
|
+
const m = section.match(re);
|
|
240
|
+
return m?.[1];
|
|
241
|
+
}
|
|
242
|
+
function parseYamlBoolean(section, key) {
|
|
243
|
+
const re = new RegExp(`^\\s*${key}:\\s*(true|false)`, "m");
|
|
244
|
+
const m = section.match(re);
|
|
245
|
+
if (!m)
|
|
246
|
+
return undefined;
|
|
247
|
+
return m[1] === "true";
|
|
248
|
+
}
|
|
249
|
+
function parseYamlNumber(section, key) {
|
|
250
|
+
const re = new RegExp(`^\\s*${key}:\\s*(\\d+)`, "m");
|
|
251
|
+
const m = section.match(re);
|
|
252
|
+
if (!m)
|
|
253
|
+
return undefined;
|
|
254
|
+
return Number(m[1]);
|
|
255
|
+
}
|
|
256
|
+
function parseYamlStringArray(section, key) {
|
|
257
|
+
const inline = section.match(new RegExp(`^\\s*${key}:\\s*\\[([^\\]]*)\\]`, "m"));
|
|
258
|
+
if (inline?.[1]) {
|
|
259
|
+
return [...inline[1].matchAll(/"((?:\\.|[^"\\])*)"/g)].map((m) => m[1].replace(/\\"/g, '"').replace(/\\\\/g, "\\"));
|
|
260
|
+
}
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
function parseYamlEnvBlock(section) {
|
|
264
|
+
const env = {};
|
|
265
|
+
const envMatch = section.match(/^(\s*)env:\s*$/m);
|
|
266
|
+
if (!envMatch)
|
|
267
|
+
return env;
|
|
268
|
+
const baseIndent = envMatch[1]?.length ?? 0;
|
|
269
|
+
const envKeyIndent = baseIndent + 2;
|
|
270
|
+
for (const line of section.split("\n")) {
|
|
271
|
+
const m = line.match(new RegExp(`^\\s{${envKeyIndent}}([A-Z0-9_]+):\\s*"([^"]*)"`));
|
|
272
|
+
if (m)
|
|
273
|
+
env[m[1]] = m[2];
|
|
274
|
+
}
|
|
275
|
+
return env;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=hermes-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes-config.js","sourceRoot":"","sources":["../../src/util/hermes-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified MCP host setup for Codex, Hermes, and Claude (Option C).
|
|
3
|
+
*
|
|
4
|
+
* All hosts register the same `@agenticros/claude-code` stdio server with an
|
|
5
|
+
* absolute path and empty AGENTICROS_ROBOT_NAMESPACE.
|
|
6
|
+
*/
|
|
7
|
+
import { type CodexConfigScope } from "./codex-config.js";
|
|
8
|
+
import { type ClaudeConfigTarget } from "./claude-config.js";
|
|
9
|
+
export type McpHostId = "codex" | "hermes" | "claude";
|
|
10
|
+
export interface McpSetupOptions {
|
|
11
|
+
/** Configure all hosts (default when no host flags). */
|
|
12
|
+
all?: boolean;
|
|
13
|
+
codex?: boolean;
|
|
14
|
+
hermes?: boolean;
|
|
15
|
+
claude?: boolean;
|
|
16
|
+
/** Codex project `.codex/config.toml` and/or Claude `.mcp.json` in repo root. */
|
|
17
|
+
project?: boolean;
|
|
18
|
+
/** Claude Desktop `claude_desktop_config.json` only (with --claude). */
|
|
19
|
+
desktop?: boolean;
|
|
20
|
+
/** Codex scope when only codex is targeted via legacy `codex setup --project`. */
|
|
21
|
+
codexScope?: CodexConfigScope;
|
|
22
|
+
quiet?: boolean;
|
|
23
|
+
repoRoot?: string;
|
|
24
|
+
cwd?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface McpDoctorOptions {
|
|
27
|
+
json?: boolean;
|
|
28
|
+
quiet?: boolean;
|
|
29
|
+
hosts?: McpHostId[];
|
|
30
|
+
repoRoot?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function codexOnPath(): Promise<boolean>;
|
|
33
|
+
export declare function hermesOnPath(): Promise<boolean>;
|
|
34
|
+
export declare function claudeOnPath(): Promise<boolean>;
|
|
35
|
+
export declare function resolveMcpHosts(opts: McpSetupOptions): McpHostId[];
|
|
36
|
+
export declare function requireMcpEntry(): string;
|
|
37
|
+
export declare function setupCodexMcp(mcpEntry: string, scope: CodexConfigScope, cwd?: string): string;
|
|
38
|
+
export declare function setupHermesMcp(mcpEntry: string): string;
|
|
39
|
+
export declare function setupClaudeMcp(mcpEntry: string, target: ClaudeConfigTarget, cwd?: string): string;
|
|
40
|
+
export declare function mcpSetupCommand(opts?: McpSetupOptions): Promise<void>;
|
|
41
|
+
export declare function buildMcpDoctorChecks(mcpEntryExpected: string | undefined, repoRoot?: string, hosts?: McpHostId[]): Array<{
|
|
42
|
+
id: string;
|
|
43
|
+
label: string;
|
|
44
|
+
severity: "green" | "yellow" | "red";
|
|
45
|
+
hint?: string;
|
|
46
|
+
detail?: string;
|
|
47
|
+
}>;
|
|
48
|
+
export interface McpDoctorResult {
|
|
49
|
+
hosts: McpHostId[];
|
|
50
|
+
mcpEntry: string | undefined;
|
|
51
|
+
checks: ReturnType<typeof buildMcpDoctorChecks>;
|
|
52
|
+
exitCode: number;
|
|
53
|
+
}
|
|
54
|
+
export declare function mcpDoctorCommand(opts?: McpDoctorOptions): Promise<number>;
|
|
55
|
+
//# sourceMappingURL=mcp-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-setup.d.ts","sourceRoot":"","sources":["../../src/util/mcp-setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,KAAK,gBAAgB,EAKtB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,oBAAoB,CAAC;AAI5B,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iFAAiF;IACjF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAYrD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAYrD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,EAAE,CAQlE;AAED,wBAAgB,eAAe,IAAI,MAAM,CAQxC;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7F;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,kBAAkB,EAC1B,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAKR;AAED,wBAAsB,eAAe,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE/E;AAED,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,SAAS,EAAE,GAClB,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB5G;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwEnF"}
|