@switchboard-mcp/core 0.1.0
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 +9 -0
- package/dist/approvals/approval-requests.d.ts +151 -0
- package/dist/approvals/approval-requests.d.ts.map +1 -0
- package/dist/approvals/approval-requests.js +393 -0
- package/dist/approvals/approval-requests.js.map +1 -0
- package/dist/audit/audit-log.d.ts +45 -0
- package/dist/audit/audit-log.d.ts.map +1 -0
- package/dist/audit/audit-log.js +88 -0
- package/dist/audit/audit-log.js.map +1 -0
- package/dist/config/gitignore.d.ts +9 -0
- package/dist/config/gitignore.d.ts.map +1 -0
- package/dist/config/gitignore.js +90 -0
- package/dist/config/gitignore.js.map +1 -0
- package/dist/config/load-config.d.ts +28 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +138 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/paths.d.ts +13 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +38 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/daemon/daemon-state.d.ts +44 -0
- package/dist/daemon/daemon-state.d.ts.map +1 -0
- package/dist/daemon/daemon-state.js +110 -0
- package/dist/daemon/daemon-state.js.map +1 -0
- package/dist/import/import-plan.d.ts +92 -0
- package/dist/import/import-plan.d.ts.map +1 -0
- package/dist/import/import-plan.js +677 -0
- package/dist/import/import-plan.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/install/client-config.d.ts +73 -0
- package/dist/install/client-config.d.ts.map +1 -0
- package/dist/install/client-config.js +514 -0
- package/dist/install/client-config.js.map +1 -0
- package/dist/mandates/mandates.d.ts +244 -0
- package/dist/mandates/mandates.d.ts.map +1 -0
- package/dist/mandates/mandates.js +690 -0
- package/dist/mandates/mandates.js.map +1 -0
- package/dist/namespaces/namespaces.d.ts +16 -0
- package/dist/namespaces/namespaces.d.ts.map +1 -0
- package/dist/namespaces/namespaces.js +49 -0
- package/dist/namespaces/namespaces.js.map +1 -0
- package/dist/onboarding/init-config.d.ts +19 -0
- package/dist/onboarding/init-config.d.ts.map +1 -0
- package/dist/onboarding/init-config.js +85 -0
- package/dist/onboarding/init-config.js.map +1 -0
- package/dist/providers/provider-add.d.ts +25 -0
- package/dist/providers/provider-add.d.ts.map +1 -0
- package/dist/providers/provider-add.js +179 -0
- package/dist/providers/provider-add.js.map +1 -0
- package/dist/providers/provider-templates.d.ts +96 -0
- package/dist/providers/provider-templates.d.ts.map +1 -0
- package/dist/providers/provider-templates.js +556 -0
- package/dist/providers/provider-templates.js.map +1 -0
- package/dist/scan/scan.d.ts +67 -0
- package/dist/scan/scan.d.ts.map +1 -0
- package/dist/scan/scan.js +389 -0
- package/dist/scan/scan.js.map +1 -0
- package/dist/schemas/config.d.ts +197 -0
- package/dist/schemas/config.d.ts.map +1 -0
- package/dist/schemas/config.js +133 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/secrets/secret-refs.d.ts +10 -0
- package/dist/secrets/secret-refs.d.ts.map +1 -0
- package/dist/secrets/secret-refs.js +32 -0
- package/dist/secrets/secret-refs.js.map +1 -0
- package/dist/secrets/secrets.d.ts +63 -0
- package/dist/secrets/secrets.d.ts.map +1 -0
- package/dist/secrets/secrets.js +301 -0
- package/dist/secrets/secrets.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access, copyFile, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { delimiter, dirname, isAbsolute, join } from "node:path";
|
|
4
|
+
const defaultServerName = "switchboard";
|
|
5
|
+
const defaultCommand = "switchboard";
|
|
6
|
+
export function renderSwitchboardClientConfig(options) {
|
|
7
|
+
const serverName = options.serverName ?? defaultServerName;
|
|
8
|
+
const command = options.command ?? defaultCommand;
|
|
9
|
+
const commandArgs = options.commandArgs ?? [];
|
|
10
|
+
const args = [...commandArgs, "--cwd", options.cwd, "mcp"];
|
|
11
|
+
const validation = validateSwitchboardClientConfigOptions({
|
|
12
|
+
...options,
|
|
13
|
+
serverName,
|
|
14
|
+
command,
|
|
15
|
+
commandArgs
|
|
16
|
+
});
|
|
17
|
+
if (!validation.ok) {
|
|
18
|
+
throw new Error(validation.errors.join("\n"));
|
|
19
|
+
}
|
|
20
|
+
if (options.client === "codex") {
|
|
21
|
+
return {
|
|
22
|
+
client: "codex",
|
|
23
|
+
serverName,
|
|
24
|
+
target: "~/.codex/config.toml or .codex/config.toml",
|
|
25
|
+
content: renderCodexConfig({ serverName, command, args, cwd: options.cwd })
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
client: "claude",
|
|
30
|
+
serverName,
|
|
31
|
+
target: ".mcp.json for project scope or ~/.claude.json for local/user scope",
|
|
32
|
+
content: JSON.stringify({
|
|
33
|
+
mcpServers: {
|
|
34
|
+
[serverName]: {
|
|
35
|
+
command,
|
|
36
|
+
args,
|
|
37
|
+
env: {}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}, null, 2)
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export async function writeSwitchboardClientConfig(options) {
|
|
44
|
+
const rendered = renderSwitchboardClientConfig(options);
|
|
45
|
+
const targetPath = resolveProjectClientConfigPath(options.client, options.cwd);
|
|
46
|
+
const existing = await readOptionalTextFile(targetPath);
|
|
47
|
+
const nextContent = mergeClientConfigContent({
|
|
48
|
+
client: options.client,
|
|
49
|
+
existing,
|
|
50
|
+
renderedContent: rendered.content,
|
|
51
|
+
serverName: rendered.serverName
|
|
52
|
+
});
|
|
53
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
54
|
+
const backupPath = existing
|
|
55
|
+
? await backupExistingFile(targetPath, options.now)
|
|
56
|
+
: null;
|
|
57
|
+
await writeFile(targetPath, nextContent, "utf8");
|
|
58
|
+
return {
|
|
59
|
+
client: options.client,
|
|
60
|
+
serverName: rendered.serverName,
|
|
61
|
+
targetPath,
|
|
62
|
+
backupPath,
|
|
63
|
+
action: existing ? "updated" : "created"
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export async function rollbackSwitchboardClientConfig(options) {
|
|
67
|
+
const targetPath = resolveProjectClientConfigPath(options.client, options.cwd);
|
|
68
|
+
const backupContent = await readFile(options.backupPath, "utf8");
|
|
69
|
+
const existing = await readOptionalTextFile(targetPath);
|
|
70
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
71
|
+
const currentBackupPath = existing
|
|
72
|
+
? await backupExistingFile(targetPath, options.now)
|
|
73
|
+
: null;
|
|
74
|
+
await writeFile(targetPath, backupContent, "utf8");
|
|
75
|
+
return {
|
|
76
|
+
client: options.client,
|
|
77
|
+
targetPath,
|
|
78
|
+
restoredFrom: options.backupPath,
|
|
79
|
+
backupPath: currentBackupPath
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function resolveProjectClientConfigPath(client, cwd) {
|
|
83
|
+
if (client === "codex") {
|
|
84
|
+
return join(cwd, ".codex", "config.toml");
|
|
85
|
+
}
|
|
86
|
+
return join(cwd, ".mcp.json");
|
|
87
|
+
}
|
|
88
|
+
export async function inspectProjectClientConfig(options) {
|
|
89
|
+
const rendered = renderSwitchboardClientConfig(options);
|
|
90
|
+
const targetPath = resolveProjectClientConfigPath(options.client, options.cwd);
|
|
91
|
+
const existing = await readOptionalTextFile(targetPath);
|
|
92
|
+
if (existing === null) {
|
|
93
|
+
return {
|
|
94
|
+
client: options.client,
|
|
95
|
+
serverName: rendered.serverName,
|
|
96
|
+
targetPath,
|
|
97
|
+
status: "missing",
|
|
98
|
+
message: "Project client config file was not found.",
|
|
99
|
+
otherServerNames: [],
|
|
100
|
+
launch: null
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
if (options.client === "claude") {
|
|
105
|
+
return inspectClaudeProjectConfig({
|
|
106
|
+
existing,
|
|
107
|
+
renderedContent: rendered.content,
|
|
108
|
+
targetPath,
|
|
109
|
+
serverName: rendered.serverName
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return inspectCodexProjectConfig({
|
|
113
|
+
existing,
|
|
114
|
+
targetPath,
|
|
115
|
+
serverName: rendered.serverName,
|
|
116
|
+
command: options.command ?? defaultCommand,
|
|
117
|
+
commandArgs: options.commandArgs ?? [],
|
|
118
|
+
cwd: options.cwd
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return {
|
|
123
|
+
client: options.client,
|
|
124
|
+
serverName: rendered.serverName,
|
|
125
|
+
targetPath,
|
|
126
|
+
status: "invalid",
|
|
127
|
+
message: messageFromError(error),
|
|
128
|
+
otherServerNames: [],
|
|
129
|
+
launch: null
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export async function inspectProjectClientConfigs(options) {
|
|
134
|
+
return Promise.all([
|
|
135
|
+
inspectProjectClientConfig({ ...options, client: "codex" }),
|
|
136
|
+
inspectProjectClientConfig({ ...options, client: "claude" })
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
export function validateSwitchboardClientConfigOptions(options) {
|
|
140
|
+
const serverName = options.serverName ?? defaultServerName;
|
|
141
|
+
const command = options.command ?? defaultCommand;
|
|
142
|
+
const commandArgs = options.commandArgs ?? [];
|
|
143
|
+
const errors = [];
|
|
144
|
+
if (serverName.trim().length === 0) {
|
|
145
|
+
errors.push("server name must not be empty");
|
|
146
|
+
}
|
|
147
|
+
if (containsControlCharacter(serverName)) {
|
|
148
|
+
errors.push("server name must not contain control characters");
|
|
149
|
+
}
|
|
150
|
+
if (command.trim().length === 0) {
|
|
151
|
+
errors.push("command must not be empty");
|
|
152
|
+
}
|
|
153
|
+
if (containsControlCharacter(command)) {
|
|
154
|
+
errors.push("command must not contain control characters");
|
|
155
|
+
}
|
|
156
|
+
for (const [index, arg] of commandArgs.entries()) {
|
|
157
|
+
if (containsControlCharacter(arg)) {
|
|
158
|
+
errors.push(`command arg ${index + 1} must not contain control characters`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return { ok: errors.length === 0, errors };
|
|
162
|
+
}
|
|
163
|
+
export async function checkInstalledClientLaunches(inspections, env = process.env) {
|
|
164
|
+
return Promise.all(inspections
|
|
165
|
+
.filter((inspection) => inspection.status === "installed")
|
|
166
|
+
.map(async (inspection) => {
|
|
167
|
+
const launch = inspection.launch;
|
|
168
|
+
if (!launch) {
|
|
169
|
+
return {
|
|
170
|
+
client: inspection.client,
|
|
171
|
+
serverName: inspection.serverName,
|
|
172
|
+
command: "",
|
|
173
|
+
args: [],
|
|
174
|
+
ok: false,
|
|
175
|
+
message: `${inspection.client} config is installed, but the launch command could not be read.`
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const resolved = await resolveExecutable(launch.command, env);
|
|
179
|
+
return {
|
|
180
|
+
client: inspection.client,
|
|
181
|
+
serverName: inspection.serverName,
|
|
182
|
+
command: launch.command,
|
|
183
|
+
args: launch.args,
|
|
184
|
+
ok: resolved !== null,
|
|
185
|
+
message: resolved === null
|
|
186
|
+
? launchCommandMissingMessage(inspection.client, launch.command)
|
|
187
|
+
: `${inspection.client} launch command is available: ${launch.command}`
|
|
188
|
+
};
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
function launchCommandMissingMessage(client, command) {
|
|
192
|
+
if (isAbsolute(command)) {
|
|
193
|
+
return `${client} config points to "${command}", but that executable is missing or not executable.`;
|
|
194
|
+
}
|
|
195
|
+
return `${client} config points to "${command}", but that executable is not available on PATH.`;
|
|
196
|
+
}
|
|
197
|
+
function containsControlCharacter(value) {
|
|
198
|
+
return [...value].some((character) => {
|
|
199
|
+
const codePoint = character.codePointAt(0);
|
|
200
|
+
return codePoint !== undefined && (codePoint < 32 || codePoint === 127);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
async function readOptionalTextFile(path) {
|
|
204
|
+
try {
|
|
205
|
+
return await readFile(path, "utf8");
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
if (error instanceof Error &&
|
|
209
|
+
"code" in error &&
|
|
210
|
+
error.code === "ENOENT") {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function backupExistingFile(path, now) {
|
|
217
|
+
const baseBackupPath = `${path}.switchboard-backup-${backupTimestamp(now)}`;
|
|
218
|
+
for (let attempt = 0; attempt < 100; attempt += 1) {
|
|
219
|
+
const backupPath = attempt === 0 ? baseBackupPath : `${baseBackupPath}-${attempt}`;
|
|
220
|
+
try {
|
|
221
|
+
await copyFile(path, backupPath, constants.COPYFILE_EXCL);
|
|
222
|
+
return backupPath;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (error instanceof Error &&
|
|
226
|
+
"code" in error &&
|
|
227
|
+
error.code === "EEXIST") {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
throw error;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
throw new Error(`could not create a unique backup path for ${path}`);
|
|
234
|
+
}
|
|
235
|
+
function backupTimestamp(now = new Date()) {
|
|
236
|
+
return now.toISOString().replaceAll(/[-:.]/g, "").replace("T", "-");
|
|
237
|
+
}
|
|
238
|
+
function mergeClientConfigContent(options) {
|
|
239
|
+
if (options.client === "claude") {
|
|
240
|
+
return mergeClaudeConfigContent(options.existing, options.renderedContent);
|
|
241
|
+
}
|
|
242
|
+
return mergeCodexConfigContent(options.existing, options.renderedContent, options.serverName);
|
|
243
|
+
}
|
|
244
|
+
function mergeClaudeConfigContent(existing, renderedContent) {
|
|
245
|
+
const rendered = JSON.parse(renderedContent);
|
|
246
|
+
const parsed = existing?.trim()
|
|
247
|
+
? JSON.parse(existing)
|
|
248
|
+
: {};
|
|
249
|
+
const existingServers = isRecord(parsed.mcpServers) && !Array.isArray(parsed.mcpServers)
|
|
250
|
+
? parsed.mcpServers
|
|
251
|
+
: {};
|
|
252
|
+
return `${JSON.stringify({
|
|
253
|
+
...parsed,
|
|
254
|
+
mcpServers: {
|
|
255
|
+
...existingServers,
|
|
256
|
+
...rendered.mcpServers
|
|
257
|
+
}
|
|
258
|
+
}, null, 2)}\n`;
|
|
259
|
+
}
|
|
260
|
+
function mergeCodexConfigContent(existing, renderedContent, serverName) {
|
|
261
|
+
if (!existing?.trim()) {
|
|
262
|
+
return `${renderedContent}\n`;
|
|
263
|
+
}
|
|
264
|
+
const lines = existing.split(/\r?\n/);
|
|
265
|
+
const start = lines.findIndex((line) => codexMcpServerNameFromHeader(line) === serverName);
|
|
266
|
+
const renderedLines = renderedContent.split("\n");
|
|
267
|
+
if (start === -1) {
|
|
268
|
+
const separator = existing.endsWith("\n") ? "\n" : "\n\n";
|
|
269
|
+
return `${existing}${separator}${renderedContent}\n`;
|
|
270
|
+
}
|
|
271
|
+
let end = start + 1;
|
|
272
|
+
while (end < lines.length && !lines[end]?.trim().startsWith("[")) {
|
|
273
|
+
end += 1;
|
|
274
|
+
}
|
|
275
|
+
lines.splice(start, end - start, ...renderedLines);
|
|
276
|
+
return `${lines.join("\n").replace(/\n*$/, "")}\n`;
|
|
277
|
+
}
|
|
278
|
+
function inspectClaudeProjectConfig(options) {
|
|
279
|
+
const parsed = JSON.parse(options.existing);
|
|
280
|
+
const rendered = JSON.parse(options.renderedContent);
|
|
281
|
+
const existingServers = isRecord(parsed.mcpServers) && !Array.isArray(parsed.mcpServers)
|
|
282
|
+
? parsed.mcpServers
|
|
283
|
+
: {};
|
|
284
|
+
const otherServerNames = Object.keys(existingServers).filter((name) => name !== options.serverName);
|
|
285
|
+
const actual = existingServers[options.serverName];
|
|
286
|
+
const expected = rendered.mcpServers[options.serverName];
|
|
287
|
+
if (actual === undefined) {
|
|
288
|
+
return {
|
|
289
|
+
client: "claude",
|
|
290
|
+
serverName: options.serverName,
|
|
291
|
+
targetPath: options.targetPath,
|
|
292
|
+
status: "missing",
|
|
293
|
+
message: "Claude project config does not include the Switchboard MCP server.",
|
|
294
|
+
otherServerNames,
|
|
295
|
+
launch: null
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
if (!clientServerEntryRoutesThroughSwitchboard(actual, expected)) {
|
|
299
|
+
return {
|
|
300
|
+
client: "claude",
|
|
301
|
+
serverName: options.serverName,
|
|
302
|
+
targetPath: options.targetPath,
|
|
303
|
+
status: "stale",
|
|
304
|
+
message: "Claude project config has a different Switchboard MCP server entry.",
|
|
305
|
+
otherServerNames,
|
|
306
|
+
launch: clientServerEntryLaunch(actual)
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
client: "claude",
|
|
311
|
+
serverName: options.serverName,
|
|
312
|
+
targetPath: options.targetPath,
|
|
313
|
+
status: "installed",
|
|
314
|
+
message: "Claude project config routes through switchboard mcp.",
|
|
315
|
+
otherServerNames,
|
|
316
|
+
launch: clientServerEntryLaunch(actual)
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function inspectCodexProjectConfig(options) {
|
|
320
|
+
const section = codexMcpServerSection(options.existing, options.serverName);
|
|
321
|
+
const otherServerNames = codexMcpServerNames(options.existing).filter((name) => name !== options.serverName);
|
|
322
|
+
if (section === null) {
|
|
323
|
+
return {
|
|
324
|
+
client: "codex",
|
|
325
|
+
serverName: options.serverName,
|
|
326
|
+
targetPath: options.targetPath,
|
|
327
|
+
status: "missing",
|
|
328
|
+
message: "Codex project config does not include the Switchboard MCP server.",
|
|
329
|
+
otherServerNames,
|
|
330
|
+
launch: null
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
const values = parseSimpleTomlAssignments(section);
|
|
334
|
+
const command = parseTomlString(values.command);
|
|
335
|
+
const args = parseTomlStringArray(values.args);
|
|
336
|
+
const cwd = parseTomlString(values.cwd);
|
|
337
|
+
const expectedArgs = [...options.commandArgs, "--cwd", options.cwd, "mcp"];
|
|
338
|
+
if (!command ||
|
|
339
|
+
(cwd !== undefined && cwd !== options.cwd) ||
|
|
340
|
+
!args ||
|
|
341
|
+
!launchArgsRouteThroughSwitchboard(args, expectedArgs)) {
|
|
342
|
+
return {
|
|
343
|
+
client: "codex",
|
|
344
|
+
serverName: options.serverName,
|
|
345
|
+
targetPath: options.targetPath,
|
|
346
|
+
status: "stale",
|
|
347
|
+
message: "Codex project config has a different Switchboard MCP server entry.",
|
|
348
|
+
otherServerNames,
|
|
349
|
+
launch: command && args ? { command, args } : null
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
client: "codex",
|
|
354
|
+
serverName: options.serverName,
|
|
355
|
+
targetPath: options.targetPath,
|
|
356
|
+
status: "installed",
|
|
357
|
+
message: "Codex project config routes through switchboard mcp.",
|
|
358
|
+
otherServerNames,
|
|
359
|
+
launch: { command, args }
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
function codexMcpServerNames(content) {
|
|
363
|
+
return content
|
|
364
|
+
.split(/\r?\n/)
|
|
365
|
+
.map(codexMcpServerNameFromHeader)
|
|
366
|
+
.filter((name) => name !== null);
|
|
367
|
+
}
|
|
368
|
+
function clientServerEntryRoutesThroughSwitchboard(actual, expected) {
|
|
369
|
+
if (!isRecord(actual) || !isRecord(expected)) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
if (typeof actual.command !== "string" || actual.command.trim().length === 0) {
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
if (!Array.isArray(actual.args) || !Array.isArray(expected.args)) {
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
return (actual.args.every((arg) => typeof arg === "string") &&
|
|
379
|
+
expected.args.every((arg) => typeof arg === "string") &&
|
|
380
|
+
launchArgsRouteThroughSwitchboard(actual.args, expected.args));
|
|
381
|
+
}
|
|
382
|
+
function launchArgsRouteThroughSwitchboard(actual, expected) {
|
|
383
|
+
const expectedPrefixLength = Math.max(0, expected.length - 3);
|
|
384
|
+
if (expectedPrefixLength > 0) {
|
|
385
|
+
return JSON.stringify(actual) === JSON.stringify(expected);
|
|
386
|
+
}
|
|
387
|
+
if (actual.length < 3) {
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
const suffix = actual.slice(-3);
|
|
391
|
+
return JSON.stringify(suffix) === JSON.stringify(expected.slice(-3));
|
|
392
|
+
}
|
|
393
|
+
function clientServerEntryLaunch(entry) {
|
|
394
|
+
if (!isRecord(entry) || typeof entry.command !== "string") {
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
if (entry.args !== undefined &&
|
|
398
|
+
(!Array.isArray(entry.args) ||
|
|
399
|
+
!entry.args.every((arg) => typeof arg === "string"))) {
|
|
400
|
+
return null;
|
|
401
|
+
}
|
|
402
|
+
return {
|
|
403
|
+
command: entry.command,
|
|
404
|
+
args: Array.isArray(entry.args) ? entry.args : []
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
function codexMcpServerSection(content, serverName) {
|
|
408
|
+
const lines = content.split(/\r?\n/);
|
|
409
|
+
const start = lines.findIndex((line) => codexMcpServerNameFromHeader(line) === serverName);
|
|
410
|
+
if (start === -1) {
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
let end = start + 1;
|
|
414
|
+
while (end < lines.length && !lines[end]?.trim().startsWith("[")) {
|
|
415
|
+
end += 1;
|
|
416
|
+
}
|
|
417
|
+
return lines.slice(start + 1, end);
|
|
418
|
+
}
|
|
419
|
+
function parseSimpleTomlAssignments(lines) {
|
|
420
|
+
const values = {};
|
|
421
|
+
for (const line of lines) {
|
|
422
|
+
const trimmed = line.trim();
|
|
423
|
+
const separator = trimmed.indexOf("=");
|
|
424
|
+
if (separator === -1 || trimmed.startsWith("#")) {
|
|
425
|
+
continue;
|
|
426
|
+
}
|
|
427
|
+
values[trimmed.slice(0, separator).trim()] = trimmed
|
|
428
|
+
.slice(separator + 1)
|
|
429
|
+
.trim();
|
|
430
|
+
}
|
|
431
|
+
return values;
|
|
432
|
+
}
|
|
433
|
+
function parseTomlString(value) {
|
|
434
|
+
if (!value?.startsWith('"')) {
|
|
435
|
+
return undefined;
|
|
436
|
+
}
|
|
437
|
+
return JSON.parse(value);
|
|
438
|
+
}
|
|
439
|
+
function parseTomlStringArray(value) {
|
|
440
|
+
if (!value?.startsWith("[")) {
|
|
441
|
+
return undefined;
|
|
442
|
+
}
|
|
443
|
+
const parsed = JSON.parse(value);
|
|
444
|
+
return Array.isArray(parsed) && parsed.every((item) => typeof item === "string")
|
|
445
|
+
? parsed
|
|
446
|
+
: undefined;
|
|
447
|
+
}
|
|
448
|
+
function messageFromError(error) {
|
|
449
|
+
return error instanceof Error ? error.message : String(error);
|
|
450
|
+
}
|
|
451
|
+
function codexMcpServerNameFromHeader(line) {
|
|
452
|
+
const trimmed = line.trim();
|
|
453
|
+
if (!trimmed.startsWith("[mcp_servers.") || !trimmed.endsWith("]")) {
|
|
454
|
+
return null;
|
|
455
|
+
}
|
|
456
|
+
const rawKey = trimmed.slice("[mcp_servers.".length, -1).trim();
|
|
457
|
+
if (rawKey.startsWith('"') && rawKey.endsWith('"')) {
|
|
458
|
+
try {
|
|
459
|
+
return JSON.parse(rawKey);
|
|
460
|
+
}
|
|
461
|
+
catch {
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return rawKey;
|
|
466
|
+
}
|
|
467
|
+
function isRecord(value) {
|
|
468
|
+
return typeof value === "object" && value !== null;
|
|
469
|
+
}
|
|
470
|
+
function renderCodexConfig(options) {
|
|
471
|
+
return [
|
|
472
|
+
`[mcp_servers.${tomlKey(options.serverName)}]`,
|
|
473
|
+
`command = ${tomlString(options.command)}`,
|
|
474
|
+
`args = ${tomlArray(options.args)}`,
|
|
475
|
+
`cwd = ${tomlString(options.cwd)}`,
|
|
476
|
+
"startup_timeout_sec = 20",
|
|
477
|
+
"tool_timeout_sec = 60"
|
|
478
|
+
].join("\n");
|
|
479
|
+
}
|
|
480
|
+
function tomlArray(values) {
|
|
481
|
+
return `[${values.map(tomlString).join(", ")}]`;
|
|
482
|
+
}
|
|
483
|
+
function tomlKey(value) {
|
|
484
|
+
return `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`;
|
|
485
|
+
}
|
|
486
|
+
function tomlString(value) {
|
|
487
|
+
return JSON.stringify(value);
|
|
488
|
+
}
|
|
489
|
+
async function resolveExecutable(command, env) {
|
|
490
|
+
if (isAbsolute(command)) {
|
|
491
|
+
return (await isExecutable(command)) ? command : null;
|
|
492
|
+
}
|
|
493
|
+
const path = env.PATH ?? "";
|
|
494
|
+
for (const directory of path.split(delimiter)) {
|
|
495
|
+
if (directory.length === 0) {
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
const candidate = join(directory, command);
|
|
499
|
+
if (await isExecutable(candidate)) {
|
|
500
|
+
return candidate;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
async function isExecutable(path) {
|
|
506
|
+
try {
|
|
507
|
+
await access(path, constants.X_OK);
|
|
508
|
+
return true;
|
|
509
|
+
}
|
|
510
|
+
catch {
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
//# sourceMappingURL=client-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-config.js","sourceRoot":"","sources":["../../src/install/client-config.ts"],"names":[],"mappings":"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"}
|