qantara 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/LICENSE +21 -0
- package/README.md +272 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/debug.js +25 -0
- package/dist/debug.js.map +1 -0
- package/dist/exec.js +105 -0
- package/dist/exec.js.map +1 -0
- package/dist/jobs.js +22 -0
- package/dist/jobs.js.map +1 -0
- package/dist/registry.js +24 -0
- package/dist/registry.js.map +1 -0
- package/dist/runners/claude.js +73 -0
- package/dist/runners/claude.js.map +1 -0
- package/dist/runners/codex.js +81 -0
- package/dist/runners/codex.js.map +1 -0
- package/dist/runners/gemini.js +73 -0
- package/dist/runners/gemini.js.map +1 -0
- package/dist/server.js +232 -0
- package/dist/server.js.map +1 -0
- package/dist/sessions.js +14 -0
- package/dist/sessions.js.map +1 -0
- package/dist/setup.js +240 -0
- package/dist/setup.js.map +1 -0
- package/package.json +50 -0
package/dist/setup.js
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `qantara setup` — one-command registration into every detected host.
|
|
3
|
+
*
|
|
4
|
+
* Principles:
|
|
5
|
+
* - Surgical merges only: never rewrite a host's config wholesale.
|
|
6
|
+
* - Backup before touching any file (<file>.qantara.bak).
|
|
7
|
+
* - Idempotent: running twice changes nothing the second time.
|
|
8
|
+
* - --dry-run prints the plan without writing.
|
|
9
|
+
*
|
|
10
|
+
* Per host it configures the bridge to expose every OTHER detected agent
|
|
11
|
+
* (Claude sees ask_codex/ask_gemini, Codex sees ask_claude/ask_gemini, ...).
|
|
12
|
+
*/
|
|
13
|
+
import { spawnSync } from "node:child_process";
|
|
14
|
+
import { copyFileSync, existsSync, readFileSync, writeFileSync, } from "node:fs";
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
import { dirname, join } from "node:path";
|
|
17
|
+
import { fileURLToPath } from "node:url";
|
|
18
|
+
const SERVER = "qantara";
|
|
19
|
+
function cliWorks(cmd) {
|
|
20
|
+
try {
|
|
21
|
+
const r = spawnSync(cmd, ["--version"], {
|
|
22
|
+
shell: true,
|
|
23
|
+
windowsHide: true,
|
|
24
|
+
timeout: 60_000,
|
|
25
|
+
encoding: "utf8",
|
|
26
|
+
});
|
|
27
|
+
return r.status === 0;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function backup(file) {
|
|
34
|
+
copyFileSync(file, `${file}.qantara.bak`);
|
|
35
|
+
}
|
|
36
|
+
/** Proxy vars worth forwarding into hosts that strip the environment (Codex). */
|
|
37
|
+
function proxyVars() {
|
|
38
|
+
const out = {};
|
|
39
|
+
for (const key of ["HTTP_PROXY", "HTTPS_PROXY", "NO_PROXY"]) {
|
|
40
|
+
const v = process.env[key] ?? process.env[key.toLowerCase()];
|
|
41
|
+
if (v)
|
|
42
|
+
out[key] = v;
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
export async function runSetup(argv) {
|
|
47
|
+
const dryRun = argv.includes("--dry-run");
|
|
48
|
+
const serverPath = join(dirname(fileURLToPath(import.meta.url)), "server.js");
|
|
49
|
+
const nodePath = process.execPath;
|
|
50
|
+
const home = homedir();
|
|
51
|
+
console.log(`qantara setup${dryRun ? " (dry run)" : ""}`);
|
|
52
|
+
console.log(` server: ${serverPath}`);
|
|
53
|
+
const detected = {
|
|
54
|
+
claude: cliWorks("claude"),
|
|
55
|
+
codex: cliWorks("codex"),
|
|
56
|
+
gemini: cliWorks("gemini"),
|
|
57
|
+
};
|
|
58
|
+
const agents = Object.keys(detected).filter((k) => detected[k]);
|
|
59
|
+
console.log(` detected: ${Object.entries(detected)
|
|
60
|
+
.map(([k, v]) => `${k}=${v ? "yes" : "no"}`)
|
|
61
|
+
.join(" ")}`);
|
|
62
|
+
if (agents.length < 2) {
|
|
63
|
+
console.log("Fewer than two agent CLIs found — there is nothing to bridge. " +
|
|
64
|
+
"Install at least two of: claude, codex, gemini.");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const exposeFor = (host) => agents.filter((a) => a !== host).join(",");
|
|
68
|
+
const actions = [];
|
|
69
|
+
const warnings = [];
|
|
70
|
+
// ---------- Claude Code (via its own `claude mcp` CLI) ----------
|
|
71
|
+
if (detected.claude) {
|
|
72
|
+
const legacy = spawnSync("claude", ["mcp", "get", "agent-bridge"], {
|
|
73
|
+
shell: true,
|
|
74
|
+
windowsHide: true,
|
|
75
|
+
timeout: 60_000,
|
|
76
|
+
encoding: "utf8",
|
|
77
|
+
});
|
|
78
|
+
if (legacy.status === 0) {
|
|
79
|
+
warnings.push('Claude Code still has the old "agent-bridge" server registered — ' +
|
|
80
|
+
"remove it with: claude mcp remove -s user agent-bridge");
|
|
81
|
+
}
|
|
82
|
+
const existing = spawnSync("claude", ["mcp", "get", SERVER], {
|
|
83
|
+
shell: true,
|
|
84
|
+
windowsHide: true,
|
|
85
|
+
timeout: 60_000,
|
|
86
|
+
encoding: "utf8",
|
|
87
|
+
});
|
|
88
|
+
if (existing.status === 0) {
|
|
89
|
+
console.log(" claude: already registered — skipping");
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const expose = exposeFor("claude");
|
|
93
|
+
actions.push({
|
|
94
|
+
desc: `claude: register "${SERVER}" (user scope) with BRIDGE_EXPOSE=${expose}`,
|
|
95
|
+
apply: () => {
|
|
96
|
+
const r = spawnSync("claude",
|
|
97
|
+
// Name must precede -e: the -e option is variadic and would
|
|
98
|
+
// otherwise swallow the server name as another KEY=value.
|
|
99
|
+
[
|
|
100
|
+
"mcp", "add", "-s", "user", SERVER,
|
|
101
|
+
"-e", `BRIDGE_EXPOSE=${expose}`,
|
|
102
|
+
"--", `"${nodePath}"`, `"${serverPath}"`,
|
|
103
|
+
], { shell: true, windowsHide: true, timeout: 120_000, encoding: "utf8" });
|
|
104
|
+
if (r.status !== 0) {
|
|
105
|
+
throw new Error(`claude mcp add failed: ${r.stderr || r.stdout}`);
|
|
106
|
+
}
|
|
107
|
+
return "registered via `claude mcp add -s user`";
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Pre-approve the bridge's tools so they don't prompt every session.
|
|
112
|
+
const settingsPath = join(home, ".claude", "settings.json");
|
|
113
|
+
if (existsSync(settingsPath)) {
|
|
114
|
+
const settings = JSON.parse(readFileSync(settingsPath, "utf8"));
|
|
115
|
+
const allow = (settings.permissions ??= {}).allow ??= [];
|
|
116
|
+
if (allow.includes(`mcp__${SERVER}`)) {
|
|
117
|
+
console.log(" claude: tools already allowlisted — skipping");
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
actions.push({
|
|
121
|
+
desc: `claude: allowlist "mcp__${SERVER}" in ~/.claude/settings.json`,
|
|
122
|
+
apply: () => {
|
|
123
|
+
backup(settingsPath);
|
|
124
|
+
allow.push(`mcp__${SERVER}`);
|
|
125
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
126
|
+
return "allowlisted (backup: settings.json.qantara.bak)";
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ---------- Codex (append to ~/.codex/config.toml) ----------
|
|
133
|
+
if (detected.codex) {
|
|
134
|
+
const configPath = join(process.env.CODEX_HOME ?? join(home, ".codex"), "config.toml");
|
|
135
|
+
const toml = existsSync(configPath) ? readFileSync(configPath, "utf8") : "";
|
|
136
|
+
if (toml.includes("[mcp_servers.agent-bridge]")) {
|
|
137
|
+
warnings.push('Codex config still has the old "[mcp_servers.agent-bridge]" entry — ' +
|
|
138
|
+
`remove it from ${configPath} to avoid running two copies of the bridge.`);
|
|
139
|
+
}
|
|
140
|
+
if (toml.includes(`[mcp_servers.${SERVER}]`)) {
|
|
141
|
+
console.log(" codex: already registered — skipping");
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const expose = exposeFor("codex");
|
|
145
|
+
const proxies = proxyVars();
|
|
146
|
+
actions.push({
|
|
147
|
+
desc: `codex: append [mcp_servers.${SERVER}] to ${configPath} ` +
|
|
148
|
+
`(BRIDGE_EXPOSE=${expose}, approval=approve` +
|
|
149
|
+
(Object.keys(proxies).length ? ", forwarding proxy vars" : "") +
|
|
150
|
+
")",
|
|
151
|
+
apply: () => {
|
|
152
|
+
if (existsSync(configPath))
|
|
153
|
+
backup(configPath);
|
|
154
|
+
const lines = [
|
|
155
|
+
"",
|
|
156
|
+
`[mcp_servers.${SERVER}]`,
|
|
157
|
+
`command = '${nodePath}'`,
|
|
158
|
+
`args = ['${serverPath}']`,
|
|
159
|
+
"enabled = true",
|
|
160
|
+
"startup_timeout_sec = 120",
|
|
161
|
+
"tool_timeout_sec = 600",
|
|
162
|
+
"# Required so headless `codex exec` does not auto-cancel MCP tool calls.",
|
|
163
|
+
'default_tools_approval_mode = "approve"',
|
|
164
|
+
"",
|
|
165
|
+
`[mcp_servers.${SERVER}.env]`,
|
|
166
|
+
`BRIDGE_EXPOSE = "${expose}"`,
|
|
167
|
+
];
|
|
168
|
+
if (Object.keys(proxies).length) {
|
|
169
|
+
lines.push("# Codex strips the environment for MCP servers; forward the proxy.");
|
|
170
|
+
for (const [k, v] of Object.entries(proxies)) {
|
|
171
|
+
lines.push(`${k} = "${v}"`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
writeFileSync(configPath, toml + lines.join("\n") + "\n");
|
|
175
|
+
return `appended (backup: config.toml.qantara.bak)`;
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// ---------- Gemini (merge into ~/.gemini/settings.json) ----------
|
|
181
|
+
if (detected.gemini) {
|
|
182
|
+
const settingsPath = join(home, ".gemini", "settings.json");
|
|
183
|
+
const settings = existsSync(settingsPath)
|
|
184
|
+
? JSON.parse(readFileSync(settingsPath, "utf8"))
|
|
185
|
+
: {};
|
|
186
|
+
const servers = (settings.mcpServers ??= {});
|
|
187
|
+
if (servers["agent-bridge"]) {
|
|
188
|
+
warnings.push('Gemini settings still have the old "agent-bridge" server — ' +
|
|
189
|
+
`remove it from ${settingsPath}.`);
|
|
190
|
+
}
|
|
191
|
+
if (servers[SERVER]) {
|
|
192
|
+
console.log(" gemini: already registered — skipping");
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
const expose = exposeFor("gemini");
|
|
196
|
+
actions.push({
|
|
197
|
+
desc: `gemini: add mcpServers.${SERVER} to ${settingsPath} (BRIDGE_EXPOSE=${expose})`,
|
|
198
|
+
apply: () => {
|
|
199
|
+
if (existsSync(settingsPath))
|
|
200
|
+
backup(settingsPath);
|
|
201
|
+
servers[SERVER] = {
|
|
202
|
+
command: nodePath,
|
|
203
|
+
args: [serverPath],
|
|
204
|
+
env: { BRIDGE_EXPOSE: expose },
|
|
205
|
+
};
|
|
206
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
207
|
+
return "added (backup: settings.json.qantara.bak)";
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// ---------- Execute ----------
|
|
213
|
+
if (actions.length === 0) {
|
|
214
|
+
console.log("\nNothing to do — every detected host is already configured.");
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
console.log("\nPlan:");
|
|
218
|
+
for (const a of actions)
|
|
219
|
+
console.log(` * ${a.desc}`);
|
|
220
|
+
if (dryRun) {
|
|
221
|
+
console.log("\nDry run — nothing written.");
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
console.log("");
|
|
225
|
+
for (const a of actions) {
|
|
226
|
+
try {
|
|
227
|
+
console.log(` ok: ${a.apply()}`);
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
console.error(` FAILED: ${a.desc}\n ${err.message}`);
|
|
231
|
+
process.exitCode = 1;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
console.log("\nDone. Restart each host (new MCP servers load at session start).");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
for (const w of warnings)
|
|
238
|
+
console.log(`\nWARNING: ${w}`);
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "qantara",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Qantara (arched bridge): an MCP bridge that lets coding agents (Claude Code, Codex, Gemini) delegate tasks to each other.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"model-context-protocol",
|
|
8
|
+
"claude-code",
|
|
9
|
+
"codex",
|
|
10
|
+
"agent",
|
|
11
|
+
"multi-agent",
|
|
12
|
+
"delegation"
|
|
13
|
+
],
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"author": "Ahmed Gamil <ahmed.gamil.codes@gmail.com>",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/ahmeedgamil/qantara.git"
|
|
19
|
+
},
|
|
20
|
+
"homepage": "https://github.com/ahmeedgamil/qantara#readme",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/ahmeedgamil/qantara/issues"
|
|
23
|
+
},
|
|
24
|
+
"type": "module",
|
|
25
|
+
"bin": {
|
|
26
|
+
"qantara": "dist/cli.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"README.md",
|
|
31
|
+
"LICENSE"
|
|
32
|
+
],
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc -p tsconfig.json",
|
|
35
|
+
"prepublishOnly": "npm run build",
|
|
36
|
+
"dev": "tsc -p tsconfig.json --watch",
|
|
37
|
+
"start": "node dist/server.js"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
44
|
+
"zod": "^3.23.8"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^22.0.0",
|
|
48
|
+
"typescript": "^5.6.0"
|
|
49
|
+
}
|
|
50
|
+
}
|