@cello-protocol/connect 0.0.43 → 0.0.47
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/dist/bin/cello-mcp.d.ts +13 -31
- package/dist/bin/cello-mcp.d.ts.map +1 -1
- package/dist/bin/cello-mcp.js +158 -605
- package/dist/bin/cello-mcp.js.map +1 -1
- package/dist/ipc-proxy.d.ts +41 -0
- package/dist/ipc-proxy.d.ts.map +1 -0
- package/dist/ipc-proxy.js +188 -0
- package/dist/ipc-proxy.js.map +1 -0
- package/package.json +4 -4
package/dist/bin/cello-mcp.d.ts
CHANGED
|
@@ -1,38 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* cello-mcp —
|
|
3
|
+
* cello-mcp — thin stdio-to-IPC proxy (M7)
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Connects to the running CELLO daemon via ~/.cello/daemon.sock and proxies
|
|
6
|
+
* all MCP tool calls through IPC. Holds no key material, opens no database,
|
|
7
|
+
* creates no libp2p node. Per-connection agent state is managed by the daemon.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* CELLO_LOCK_FILE_PATH Override lock file path (test only; default: computed from CELLO_AGENT_NAME)
|
|
18
|
-
* CELLO_LISTEN_ADDR libp2p listen address (default: /ip4/0.0.0.0/tcp/0)
|
|
19
|
-
* CELLO_ANNOUNCE_ADDRS comma-separated libp2p announce multiaddrs (optional)
|
|
20
|
-
* Required when the node is behind NAT/EIP and must advertise
|
|
21
|
-
* its public address (e.g. /ip4/32.196.100.165/tcp/4001 on EC2)
|
|
22
|
-
* CELLO_DIRECTORY_URL Production directory HTTP endpoint (default: http://directory-us1.cello.mygentic.ai)
|
|
23
|
-
* Overridable for local/staging deployments. Relay multiaddr is
|
|
24
|
-
* dynamically assigned per-session — no relay constant is baked in.
|
|
25
|
-
* CELLO_DIRECTORY_MULTIADDR Directory libp2p multiaddr (optional; used when dialing libp2p directly)
|
|
26
|
-
* NODE_ENV (unused — FROST bootstrap runs whenever CELLO_DIRECTORY_MULTIADDR is set)
|
|
27
|
-
* CELLO_ENV Deployment environment: local | dev | staging | production
|
|
28
|
-
* CELLO_DB_PATH Path to local SQLCipher database (default: ~/.cello/client.db)
|
|
29
|
-
* BACKUP_S3_BUCKET S3 bucket for encrypted backups (required for S3 backup)
|
|
30
|
-
* CELLO_AWS_REGION AWS region for S3 (default: eu-west-1; falls back to AWS_REGION)
|
|
31
|
-
*
|
|
32
|
-
* Backup selection (PERSIST-022):
|
|
33
|
-
* CELLO_ENV=local → LocalCloudStorageProvider (filesystem)
|
|
34
|
-
* CELLO_ENV != local + BACKUP_S3_BUCKET → S3CloudStorageProvider (uses CELLO_AWS_REGION or AWS_REGION)
|
|
35
|
-
* CELLO_ENV != local + no BACKUP_S3_BUCKET → null (no backup; client.backup.not.configured logged)
|
|
9
|
+
* Startup:
|
|
10
|
+
* 1. --version flag
|
|
11
|
+
* 2. TTY detection (print "run cello login first")
|
|
12
|
+
* 3. Connect to daemon IPC socket
|
|
13
|
+
* 4. If ENOENT/ECONNREFUSED → exit 1 with daemon_not_running
|
|
14
|
+
* 5. Send ipc.connect frame
|
|
15
|
+
* 6. Open MCP stdio server
|
|
16
|
+
* 7. Register IPC proxy for every tool
|
|
17
|
+
* 8. On socket close → ipc_connection_lost for all subsequent calls
|
|
36
18
|
*/
|
|
37
19
|
export {};
|
|
38
20
|
//# sourceMappingURL=cello-mcp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cello-mcp.d.ts","sourceRoot":"","sources":["../../src/bin/cello-mcp.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cello-mcp.d.ts","sourceRoot":"","sources":["../../src/bin/cello-mcp.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG"}
|
package/dist/bin/cello-mcp.js
CHANGED
|
@@ -1,80 +1,58 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* cello-mcp —
|
|
3
|
+
* cello-mcp — thin stdio-to-IPC proxy (M7)
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Connects to the running CELLO daemon via ~/.cello/daemon.sock and proxies
|
|
6
|
+
* all MCP tool calls through IPC. Holds no key material, opens no database,
|
|
7
|
+
* creates no libp2p node. Per-connection agent state is managed by the daemon.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* CELLO_LOCK_FILE_PATH Override lock file path (test only; default: computed from CELLO_AGENT_NAME)
|
|
18
|
-
* CELLO_LISTEN_ADDR libp2p listen address (default: /ip4/0.0.0.0/tcp/0)
|
|
19
|
-
* CELLO_ANNOUNCE_ADDRS comma-separated libp2p announce multiaddrs (optional)
|
|
20
|
-
* Required when the node is behind NAT/EIP and must advertise
|
|
21
|
-
* its public address (e.g. /ip4/32.196.100.165/tcp/4001 on EC2)
|
|
22
|
-
* CELLO_DIRECTORY_URL Production directory HTTP endpoint (default: http://directory-us1.cello.mygentic.ai)
|
|
23
|
-
* Overridable for local/staging deployments. Relay multiaddr is
|
|
24
|
-
* dynamically assigned per-session — no relay constant is baked in.
|
|
25
|
-
* CELLO_DIRECTORY_MULTIADDR Directory libp2p multiaddr (optional; used when dialing libp2p directly)
|
|
26
|
-
* NODE_ENV (unused — FROST bootstrap runs whenever CELLO_DIRECTORY_MULTIADDR is set)
|
|
27
|
-
* CELLO_ENV Deployment environment: local | dev | staging | production
|
|
28
|
-
* CELLO_DB_PATH Path to local SQLCipher database (default: ~/.cello/client.db)
|
|
29
|
-
* BACKUP_S3_BUCKET S3 bucket for encrypted backups (required for S3 backup)
|
|
30
|
-
* CELLO_AWS_REGION AWS region for S3 (default: eu-west-1; falls back to AWS_REGION)
|
|
31
|
-
*
|
|
32
|
-
* Backup selection (PERSIST-022):
|
|
33
|
-
* CELLO_ENV=local → LocalCloudStorageProvider (filesystem)
|
|
34
|
-
* CELLO_ENV != local + BACKUP_S3_BUCKET → S3CloudStorageProvider (uses CELLO_AWS_REGION or AWS_REGION)
|
|
35
|
-
* CELLO_ENV != local + no BACKUP_S3_BUCKET → null (no backup; client.backup.not.configured logged)
|
|
9
|
+
* Startup:
|
|
10
|
+
* 1. --version flag
|
|
11
|
+
* 2. TTY detection (print "run cello login first")
|
|
12
|
+
* 3. Connect to daemon IPC socket
|
|
13
|
+
* 4. If ENOENT/ECONNREFUSED → exit 1 with daemon_not_running
|
|
14
|
+
* 5. Send ipc.connect frame
|
|
15
|
+
* 6. Open MCP stdio server
|
|
16
|
+
* 7. Register IPC proxy for every tool
|
|
17
|
+
* 8. On socket close → ipc_connection_lost for all subsequent calls
|
|
36
18
|
*/
|
|
37
19
|
import { homedir } from "node:os";
|
|
38
|
-
import { join
|
|
39
|
-
import { createWriteStream,
|
|
40
|
-
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { createWriteStream, mkdirSync } from "node:fs";
|
|
22
|
+
import { IpcProxy } from "../ipc-proxy.js";
|
|
23
|
+
// AC-020 (1): --version flag — exit cleanly with the package version.
|
|
41
24
|
// Must precede TTY detection so `cello-mcp --version` works in any context.
|
|
42
25
|
if (process.argv.includes("--version") || process.argv.includes("-v")) {
|
|
43
|
-
// Read version from the package.json that ships with the npm package.
|
|
44
|
-
// At runtime the compiled JS is in dist/bin/, package.json is at the package root.
|
|
45
26
|
const { createRequire: cr } = await import("node:module");
|
|
46
27
|
const req = cr(import.meta.url);
|
|
47
28
|
const pkg = req("../../package.json");
|
|
48
29
|
process.stdout.write(`${pkg.version}\n`);
|
|
49
30
|
process.exit(0);
|
|
50
31
|
}
|
|
51
|
-
// AC-
|
|
52
|
-
// If stdin is a TTY, the binary was run directly in a terminal, not as an MCP subprocess.
|
|
53
|
-
// Print install instructions to stdout and exit cleanly.
|
|
32
|
+
// AC-020 (2): TTY detection — if stdin is a TTY, print instructions and exit.
|
|
54
33
|
if (process.stdin.isTTY) {
|
|
55
|
-
// Read version for the TTY banner (AC-001 M6B-005)
|
|
56
34
|
const { createRequire: cr } = await import("node:module");
|
|
57
35
|
const req = cr(import.meta.url);
|
|
58
36
|
const pkg = req("../../package.json");
|
|
59
37
|
process.stdout.write(`cello-mcp v${pkg.version}\n` +
|
|
60
38
|
"\n" +
|
|
61
|
-
"This is a CELLO MCP server. It
|
|
39
|
+
"This is a CELLO MCP server. It communicates with the CELLO daemon process.\n" +
|
|
62
40
|
"\n" +
|
|
63
|
-
"
|
|
64
|
-
" npm install -g @cello-protocol/connect\n" +
|
|
41
|
+
"Run `cello login` to start the daemon first, then use this as an MCP server:\n" +
|
|
65
42
|
" claude mcp add cello -- cello-mcp\n" +
|
|
66
43
|
"\n" +
|
|
67
|
-
"To upgrade to the latest version:\n" +
|
|
68
|
-
" npm install -g @cello-protocol/connect@latest\n" +
|
|
69
|
-
"\n" +
|
|
70
44
|
"Then restart Claude Code (or run /mcp) to activate CELLO.\n");
|
|
71
45
|
process.exit(0);
|
|
72
46
|
}
|
|
73
|
-
//
|
|
74
|
-
|
|
47
|
+
// Resolve CELLO_DIR once (honored exactly as cello-daemon and the cello CLI do) and
|
|
48
|
+
// ensure it exists. Used for BOTH the diagnostics log and the daemon socket below, so
|
|
49
|
+
// every per-home isolation boundary CELLO_DIR establishes is respected — including the
|
|
50
|
+
// stderr tee, which previously went to a single global /tmp file shared across homes.
|
|
51
|
+
const celloDir = process.env.CELLO_DIR || join(homedir(), ".cello");
|
|
52
|
+
mkdirSync(celloDir, { recursive: true });
|
|
53
|
+
// AC-020 (3): Tee stderr to a log file under the home for diagnostics.
|
|
54
|
+
const stderrLog = createWriteStream(join(celloDir, "cello-mcp-stderr.log"), { flags: "a" });
|
|
75
55
|
const origWrite = process.stderr.write.bind(process.stderr);
|
|
76
|
-
// Override stderr.write to tee output to the log file.
|
|
77
|
-
// We handle only the most common call signature (string/Buffer + optional encoding/callback).
|
|
78
56
|
process.stderr.write = (chunk, encodingOrCb, cb) => {
|
|
79
57
|
stderrLog.write(chunk);
|
|
80
58
|
if (typeof encodingOrCb === "function") {
|
|
@@ -85,573 +63,148 @@ process.stderr.write = (chunk, encodingOrCb, cb) => {
|
|
|
85
63
|
}
|
|
86
64
|
return origWrite(chunk);
|
|
87
65
|
};
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
import { pushChannelNotification } from "../notifications.js";
|
|
94
|
-
import { resolveDirectoryUrl, fetchBootstrapMultiaddr } from "../config.js";
|
|
95
|
-
import { acquireLockFile, getLockFilePath } from "../lock-file.js";
|
|
96
|
-
// AC-001 (DX-001): Startup progress — emit one line per step to stderr.
|
|
97
|
-
// Format: 'cello: <step>... <outcome>'
|
|
98
|
-
process.stderr.write("cello: starting...\n");
|
|
99
|
-
// CELLO-M6B-001: Acquire PID lock file BEFORE any DB operations.
|
|
100
|
-
// This kills any prior cello-mcp process holding the same lock, ensuring exactly
|
|
101
|
-
// one cello-mcp per agent at all times. The cleanup function is registered to
|
|
102
|
-
// release the lock on SIGTERM/SIGINT/normal exit.
|
|
103
|
-
const agentName = process.env["CELLO_AGENT_NAME"] ?? null;
|
|
104
|
-
const lockFilePath = process.env["CELLO_LOCK_FILE_PATH"] ?? getLockFilePath(agentName);
|
|
105
|
-
// CRITICAL-2: Validate the final lock file path — reject paths outside ~/.cello/ in production.
|
|
106
|
-
// This guard applies regardless of which env var sourced the path (CELLO_LOCK_FILE_PATH or
|
|
107
|
-
// CELLO_AGENT_NAME), so a traversal-containing agent name (e.g. "../../../tmp/attack") is
|
|
108
|
-
// rejected with the same check as a bad CELLO_LOCK_FILE_PATH.
|
|
109
|
-
// Use path.normalize (without realpathSync) so this works on first run before the lock file
|
|
110
|
-
// or ~/.cello/ directory exists. The normalized path is checked against the normalized ~/.cello/
|
|
111
|
-
// prefix — this catches directory traversal ("../") in the raw path without requiring the file
|
|
112
|
-
// to exist. Note: symlink-based path traversal requires the symlink to already exist at the
|
|
113
|
-
// exact lock file path; if an attacker can already write arbitrary symlinks to ~/.cello/ they
|
|
114
|
-
// have broader access. The normalize check prevents the common env-var injection attack where
|
|
115
|
-
// CELLO_LOCK_FILE_PATH=~/../../../etc/passwd or CELLO_AGENT_NAME=../../tmp/attack is set.
|
|
116
|
-
// Bypass only in NODE_ENV=test (integration test runners set this). Do NOT bypass for
|
|
117
|
-
// CELLO_ENV=local — operators running in local mode are not running tests.
|
|
118
|
-
{
|
|
119
|
-
const isTestEnv = process.env["NODE_ENV"] === "test";
|
|
120
|
-
if (!isTestEnv) {
|
|
121
|
-
const userHome = homedir();
|
|
122
|
-
const celloDir = normalize(join(userHome, ".cello")) + "/";
|
|
123
|
-
const normalizedLockPath = normalize(lockFilePath);
|
|
124
|
-
if (!normalizedLockPath.startsWith(celloDir)) {
|
|
125
|
-
process.stderr.write(`cello-mcp: lock file path must be within ~/.cello/ directory\n`);
|
|
126
|
-
process.stderr.write(`cello-mcp: Got: ${lockFilePath} (normalized to ${normalizedLockPath})\n`);
|
|
127
|
-
process.exit(1);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
const releaseLock = await acquireLockFile(lockFilePath, {
|
|
132
|
-
logger: {
|
|
133
|
-
info: (event, ctx) => process.stderr.write(`cello-mcp: [info] ${event} ${JSON.stringify(ctx)}\n`),
|
|
134
|
-
warn: (event, ctx) => process.stderr.write(`cello-mcp: [warn] ${event} ${JSON.stringify(ctx)}\n`),
|
|
135
|
-
},
|
|
136
|
-
});
|
|
137
|
-
// CRITICAL-1: Register cleanup on exit signals and normal exit.
|
|
138
|
-
// The "exit" handler calls releaseLock() and runs on normal exit.
|
|
139
|
-
// Signal handlers call process.exit() which triggers the exit handler.
|
|
140
|
-
// Exception handlers MUST call releaseLock() before re-throwing because
|
|
141
|
-
// Node.js terminates immediately on uncaught exceptions without firing
|
|
142
|
-
// the "exit" event. Without this, every cello-mcp crash leaves a stale lock.
|
|
143
|
-
//
|
|
144
|
-
// NOTE: In-flight backup operations (cello_backup tool) are NOT awaited on SIGTERM/SIGINT.
|
|
145
|
-
// This is acceptable risk for M6B scope because:
|
|
146
|
-
// 1. Backups are idempotent (checksummed, retried on next run)
|
|
147
|
-
// 2. Backup upload failures are logged and return error to the user
|
|
148
|
-
// 3. Partial S3 uploads are eventually consistent and can be retried
|
|
149
|
-
// 4. Adding graceful shutdown tracking requires wiring state across tool calls (out of scope)
|
|
150
|
-
// If graceful shutdown becomes necessary, add a ClientBackup.shutdown() method that:
|
|
151
|
-
// - Sets a shuttingDown flag
|
|
152
|
-
// - Waits up to 5s for in-flight backup() calls to complete
|
|
153
|
-
// - Then allows process.exit(0) to proceed
|
|
154
|
-
// Late-bound client reference for graceful shutdown. Populated after createClient() below.
|
|
155
|
-
// SIGTERM handler polls this to defer exit until any in-flight FROST ceremony completes.
|
|
156
|
-
// Without this, a new cello-mcp startup (via lock-file kill) arriving mid-ceremony tears
|
|
157
|
-
// down libp2p before session_assignment arrives, causing directory_unreachable on every
|
|
158
|
-
// cello_initiate_session call. (Root cause identified M6-E2E-001, 2026-06-08.)
|
|
159
|
-
let clientForShutdown = null;
|
|
160
|
-
// Graceful SIGTERM: wait up to 4 seconds for any in-flight FROST ceremony to complete,
|
|
161
|
-
// then exit. 4 seconds fits within the 5-second SIGTERM poll window in lock-file.ts,
|
|
162
|
-
// leaving 1 second margin before the new process escalates to SIGKILL.
|
|
163
|
-
async function gracefulShutdown() {
|
|
164
|
-
// Capture in local const so inner loop accesses are null-safe and consistent with the guard.
|
|
165
|
-
const client = clientForShutdown;
|
|
166
|
-
try {
|
|
167
|
-
if (client?.hasInFlightCryptoOperation()) {
|
|
168
|
-
process.stderr.write("cello-mcp: [info] client.shutdown.waiting_for_ceremony {}\n");
|
|
169
|
-
const deadline = Date.now() + 4000;
|
|
170
|
-
while (Date.now() < deadline && client.hasInFlightCryptoOperation()) {
|
|
171
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
172
|
-
}
|
|
173
|
-
if (client.hasInFlightCryptoOperation()) {
|
|
174
|
-
process.stderr.write("cello-mcp: [warn] client.shutdown.ceremony_timeout {}\n");
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
process.stderr.write("cello-mcp: [info] client.shutdown.ceremony_complete {}\n");
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
finally {
|
|
182
|
-
process.exit(0);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
process.on("exit", () => {
|
|
186
|
-
releaseLock();
|
|
187
|
-
});
|
|
188
|
-
process.on("SIGTERM", () => {
|
|
189
|
-
void gracefulShutdown();
|
|
190
|
-
});
|
|
191
|
-
process.on("SIGINT", () => {
|
|
192
|
-
process.exit(0);
|
|
193
|
-
});
|
|
194
|
-
process.on("uncaughtException", (err) => {
|
|
195
|
-
process.stderr.write(`cello-mcp: [error] process.uncaught.exception ${JSON.stringify({ message: err.message, stack: err.stack })}\n`);
|
|
196
|
-
releaseLock();
|
|
197
|
-
process.exit(1);
|
|
198
|
-
});
|
|
199
|
-
process.on("unhandledRejection", (reason) => {
|
|
200
|
-
const msg = reason instanceof Error ? reason.message : String(reason);
|
|
201
|
-
const stack = reason instanceof Error ? reason.stack : undefined;
|
|
202
|
-
process.stderr.write(`cello-mcp: [error] process.unhandled.rejection ${JSON.stringify({ reason: msg, stack })}\n`);
|
|
203
|
-
releaseLock();
|
|
204
|
-
process.exit(1);
|
|
205
|
-
});
|
|
206
|
-
const keyPath = process.env["CELLO_KEY_FILE"] ?? join(homedir(), ".cello", "key");
|
|
207
|
-
const listenAddr = process.env["CELLO_LISTEN_ADDR"] ?? "/ip4/0.0.0.0/tcp/0";
|
|
208
|
-
const announceAddrs = process.env["CELLO_ANNOUNCE_ADDRS"]
|
|
209
|
-
? process.env["CELLO_ANNOUNCE_ADDRS"].split(",").map((a) => a.trim()).filter(Boolean)
|
|
210
|
-
: [];
|
|
211
|
-
// AC-003 (REPOSPLIT-002): production directory endpoint baked in as default; overridable by env.
|
|
212
|
-
// Relay multiaddr is dynamically assigned per-session — no relay constant is baked in.
|
|
213
|
-
const directoryUrl = resolveDirectoryUrl(process.env);
|
|
214
|
-
const directoryMultiaddr = process.env["CELLO_DIRECTORY_MULTIADDR"];
|
|
215
|
-
const celloEnv = process.env["CELLO_ENV"] ?? "local";
|
|
216
|
-
const dbPath = process.env["CELLO_DB_PATH"] ?? join(homedir(), ".cello", "client.db");
|
|
217
|
-
const backupS3Bucket = process.env["BACKUP_S3_BUCKET"];
|
|
218
|
-
// CELLO_AWS_REGION is the operator-settable variable (AWS_REGION is reserved by ECS/Lambda)
|
|
219
|
-
const awsRegion = process.env["CELLO_AWS_REGION"] ?? process.env["AWS_REGION"] ?? "eu-west-1";
|
|
220
|
-
// Load key
|
|
221
|
-
let kp;
|
|
66
|
+
// Connect to daemon IPC socket under the same CELLO_DIR resolved above — otherwise an
|
|
67
|
+
// operator (or test) running the daemon under a non-default home would have cello-mcp
|
|
68
|
+
// look in ~/.cello and fail to find the socket.
|
|
69
|
+
const socketPath = join(celloDir, "daemon.sock");
|
|
70
|
+
const proxy = new IpcProxy(socketPath);
|
|
222
71
|
try {
|
|
223
|
-
|
|
72
|
+
await proxy.connect();
|
|
224
73
|
}
|
|
225
74
|
catch (err) {
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
:
|
|
229
|
-
process.stderr.write(`cello-mcp: key file error: ${msg}\n`);
|
|
230
|
-
process.exit(1);
|
|
231
|
-
}
|
|
232
|
-
// PERSIST-022: Read identity key (Ed25519 seed) from the key file for backup derivation.
|
|
233
|
-
// Key file format (from packages/crypto/src/ed25519.ts):
|
|
234
|
-
// Magic[0..3] = [0xce, 0x11, 0x0e, 0x01] ("CELLO\x01" marker)
|
|
235
|
-
// version[4] = 0x01
|
|
236
|
-
// seed[5..36] = 32-byte Ed25519 seed
|
|
237
|
-
// Total: 37 bytes (KEY_FILE_SIZE)
|
|
238
|
-
// The seed is used only for HKDF derivation (backup_key and db_key).
|
|
239
|
-
// It is never stored, never logged, and is zeroed after ClientBackup construction.
|
|
240
|
-
const KEY_FILE_MAGIC = new Uint8Array([0xce, 0x11, 0x0e, 0x01]);
|
|
241
|
-
const KEY_FILE_VERSION = 0x01;
|
|
242
|
-
const KEY_FILE_SIZE = 37; // Magic(4) + version(1) + seed(32)
|
|
243
|
-
const SEED_OFFSET = 5; // KEY_FILE_MAGIC.length + 1
|
|
244
|
-
const SEED_LENGTH = 32;
|
|
245
|
-
let identityKeyBytes = null;
|
|
246
|
-
try {
|
|
247
|
-
const rawKeyFile = readFileSync(keyPath);
|
|
248
|
-
// Validate exact file size
|
|
249
|
-
if (rawKeyFile.length === KEY_FILE_SIZE) {
|
|
250
|
-
// Validate magic bytes to ensure this is a valid CELLO key file
|
|
251
|
-
const magicOk = KEY_FILE_MAGIC.every((b, i) => rawKeyFile[i] === b);
|
|
252
|
-
// Validate version byte
|
|
253
|
-
const versionOk = rawKeyFile[KEY_FILE_MAGIC.length] === KEY_FILE_VERSION;
|
|
254
|
-
if (magicOk && versionOk) {
|
|
255
|
-
identityKeyBytes = new Uint8Array(rawKeyFile.slice(SEED_OFFSET, SEED_OFFSET + SEED_LENGTH));
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
process.stderr.write(`cello-mcp: key file has invalid magic bytes or version — backup disabled\n`);
|
|
259
|
-
}
|
|
75
|
+
const code = err.code;
|
|
76
|
+
if (code === "ENOENT" || code === "ECONNREFUSED") {
|
|
77
|
+
process.stderr.write("cello-mcp: daemon not running — run `cello login` to start it\n");
|
|
260
78
|
}
|
|
261
79
|
else {
|
|
262
|
-
|
|
80
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
81
|
+
process.stderr.write(`cello-mcp: failed to connect to daemon — ${msg}\n`);
|
|
263
82
|
}
|
|
83
|
+
process.exit(1);
|
|
264
84
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
let cloudStorageForBackup = null;
|
|
274
|
-
if (celloEnv === "local") {
|
|
275
|
-
// Local: use filesystem-backed provider in ~/.cello/backups
|
|
276
|
-
const localBackupDir = join(homedir(), ".cello", "backups");
|
|
277
|
-
cloudStorageForBackup = new LocalCloudStorageProvider(localBackupDir);
|
|
278
|
-
}
|
|
279
|
-
else if (backupS3Bucket) {
|
|
280
|
-
// Non-local with bucket configured: use S3
|
|
281
|
-
cloudStorageForBackup = new S3CloudStorageProvider({ bucket: backupS3Bucket, region: awsRegion });
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
// Non-local without bucket: no backup configured — ClientBackup will log client.backup.not.configured
|
|
285
|
-
}
|
|
286
|
-
// PERSIST-022: Construct ClientBackup (only if identity key is available)
|
|
287
|
-
// A minimal logger for the composition root backup instance that writes to stderr.
|
|
288
|
-
// In production deployments the full structured logger is wired in via server.ts.
|
|
289
|
-
const backupLogger = {
|
|
290
|
-
debug: (event, ctx) => process.stderr.write(`cello-mcp: [debug] ${event} ${JSON.stringify(ctx ?? {})}\n`),
|
|
291
|
-
info: (event, ctx) => process.stderr.write(`cello-mcp: [info] ${event} ${JSON.stringify(ctx ?? {})}\n`),
|
|
292
|
-
warn: (event, ctx) => process.stderr.write(`cello-mcp: [warn] ${event} ${JSON.stringify(ctx ?? {})}\n`),
|
|
293
|
-
error: (event, errorOrContext, context) => {
|
|
294
|
-
if (errorOrContext instanceof Error) {
|
|
295
|
-
process.stderr.write(`cello-mcp: [error] ${event} ${JSON.stringify({ message: errorOrContext.message, stack: errorOrContext.stack, ...context })}\n`);
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
process.stderr.write(`cello-mcp: [error] ${event} ${JSON.stringify(errorOrContext ?? {})}\n`);
|
|
299
|
-
}
|
|
300
|
-
},
|
|
301
|
-
};
|
|
302
|
-
// PERSIST-024 (CRIT-1): Derive dbKey for SQLCipher from identity key before zeroing.
|
|
303
|
-
// The dbKey is derived via HKDF (RFC 5869) from the Ed25519 seed (SI-003: never stored).
|
|
304
|
-
let dbKey = null;
|
|
305
|
-
if (identityKeyBytes) {
|
|
306
|
-
dbKey = deriveDbKey(identityKeyBytes, agentId);
|
|
85
|
+
// Send ipc.connect frame to register this connection as MCP client
|
|
86
|
+
const connectResult = await proxy.call("ipc.connect", { clientType: "mcp" });
|
|
87
|
+
if (connectResult && typeof connectResult === "object" && "reason" in connectResult) {
|
|
88
|
+
const r = connectResult;
|
|
89
|
+
if (r.reason === "version_mismatch") {
|
|
90
|
+
process.stderr.write("cello-mcp: daemon version mismatch — run `cello logout && cello login` to restart with a compatible daemon\n");
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
307
93
|
}
|
|
308
|
-
//
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
cloudStorage: cloudStorageForBackup,
|
|
319
|
-
logger: backupLogger,
|
|
320
|
-
destinationType: celloEnv === "local" ? "local" : (backupS3Bucket ? "s3" : "local"),
|
|
321
|
-
// PERSIST-024 (MED-2): persist backup metadata to structured DB table after successful upload.
|
|
322
|
-
setMetadata: async (_key, value) => {
|
|
323
|
-
if (!clientPersistenceRef)
|
|
324
|
-
return;
|
|
325
|
-
try {
|
|
326
|
-
const meta = JSON.parse(Buffer.from(value).toString("utf8"));
|
|
327
|
-
await clientPersistenceRef.persistBackupMetadata({
|
|
328
|
-
completedAt: new Date(meta.timestamp).toISOString(),
|
|
329
|
-
destinationUrl: meta.destinationUrl,
|
|
330
|
-
checksum: meta.checksum,
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
catch {
|
|
334
|
-
// Non-fatal: metadata write failure does not affect the backup blob
|
|
335
|
-
}
|
|
336
|
-
},
|
|
337
|
-
// PERSIST-024 (MED-2): read backup metadata from structured DB table for restore.
|
|
338
|
-
getMetadata: async (_key) => {
|
|
339
|
-
if (!clientPersistenceRef)
|
|
340
|
-
return undefined;
|
|
341
|
-
try {
|
|
342
|
-
const row = await clientPersistenceRef.loadBackupMetadata();
|
|
343
|
-
if (!row)
|
|
344
|
-
return undefined;
|
|
345
|
-
const meta = {
|
|
346
|
-
timestamp: new Date(row.completed_at).getTime(),
|
|
347
|
-
destinationUrl: row.destination_url,
|
|
348
|
-
checksum: row.checksum,
|
|
349
|
-
};
|
|
350
|
-
return new Uint8Array(Buffer.from(JSON.stringify(meta), "utf8"));
|
|
351
|
-
}
|
|
352
|
-
catch {
|
|
353
|
-
return undefined;
|
|
354
|
-
}
|
|
355
|
-
},
|
|
356
|
-
});
|
|
357
|
-
// Zero the identity key bytes immediately after construction — it must not linger in memory (SI-001)
|
|
358
|
-
identityKeyBytes.fill(0);
|
|
359
|
-
identityKeyBytes = null;
|
|
94
|
+
// Open MCP stdio server
|
|
95
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
96
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
97
|
+
import { z } from "zod";
|
|
98
|
+
// Read version from package.json (same source as --version flag)
|
|
99
|
+
const { createRequire: cr2 } = await import("node:module");
|
|
100
|
+
const req2 = cr2(import.meta.url);
|
|
101
|
+
const pkgForServer = req2("../../package.json");
|
|
102
|
+
function jsonText(value) {
|
|
103
|
+
return { content: [{ type: "text", text: JSON.stringify(value) }] };
|
|
360
104
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
//
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
105
|
+
const server = new McpServer({
|
|
106
|
+
name: "cello",
|
|
107
|
+
version: pkgForServer.version,
|
|
108
|
+
});
|
|
109
|
+
// ─── Agent management tools ─────────────────────────────────────────────────
|
|
110
|
+
server.tool("cello_start_agent", "Bring a registered CELLO agent online so it can participate in sessions", {
|
|
111
|
+
name: z.string().describe("Agent name to start"),
|
|
112
|
+
}, async ({ name }) => {
|
|
113
|
+
const result = await proxy.call("cello_start_agent", { name });
|
|
114
|
+
return jsonText(result);
|
|
115
|
+
});
|
|
116
|
+
server.tool("cello_stop_agent", "Take an online CELLO agent offline (back to registered state)", {
|
|
117
|
+
name: z.string().describe("Agent name to stop"),
|
|
118
|
+
}, async ({ name }) => {
|
|
119
|
+
const result = await proxy.call("cello_stop_agent", { name });
|
|
120
|
+
return jsonText(result);
|
|
121
|
+
});
|
|
122
|
+
server.tool("cello_use_agent", "Set which online agent this connection routes tool calls to", {
|
|
123
|
+
name: z.string().describe("Agent name to set as current for this connection"),
|
|
124
|
+
}, async ({ name }) => {
|
|
125
|
+
const result = await proxy.call("cello_use_agent", { name });
|
|
126
|
+
return jsonText(result);
|
|
127
|
+
});
|
|
128
|
+
server.tool("cello_list_agents", "List all agents with state from this connection's perspective", {}, async () => {
|
|
129
|
+
const result = await proxy.call("cello_list_agents");
|
|
130
|
+
return jsonText(result);
|
|
131
|
+
});
|
|
132
|
+
// ─── Session tools (proxied through daemon) ─────────────────────────────────
|
|
133
|
+
server.tool("cello_initiate_session", "Start a new CELLO session with a target agent", {
|
|
134
|
+
target_pubkey: z.string().describe("Hex-encoded public key of the target agent"),
|
|
135
|
+
}, async ({ target_pubkey }) => {
|
|
136
|
+
const result = await proxy.call("cello_initiate_session", { target_pubkey });
|
|
137
|
+
return jsonText(result);
|
|
138
|
+
});
|
|
139
|
+
server.tool("cello_await_session", "Wait for an inbound session request", {
|
|
140
|
+
timeout_ms: z.number().optional().describe("Timeout in milliseconds (default: 30000)"),
|
|
141
|
+
}, async ({ timeout_ms }) => {
|
|
142
|
+
const result = await proxy.call("cello_await_session", { timeout_ms });
|
|
143
|
+
return jsonText(result);
|
|
370
144
|
});
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
let readyResolve = () => { };
|
|
378
|
-
let readyReject = () => { };
|
|
379
|
-
const readyPromise = new Promise((resolve, reject) => {
|
|
380
|
-
readyResolve = resolve;
|
|
381
|
-
readyReject = reject;
|
|
145
|
+
server.tool("cello_send", "Send a message in an active session", {
|
|
146
|
+
session_id: z.string().describe("Session ID"),
|
|
147
|
+
content: z.string().describe("Message content (UTF-8 text)"),
|
|
148
|
+
}, async ({ session_id, content }) => {
|
|
149
|
+
const result = await proxy.call("cello_send", { session_id, content });
|
|
150
|
+
return jsonText(result);
|
|
382
151
|
});
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
onMessageQueued: (senderHex) => {
|
|
390
|
-
if (mcpServer)
|
|
391
|
-
void pushChannelNotification(mcpServer, senderHex);
|
|
392
|
-
},
|
|
152
|
+
server.tool("cello_receive", "Receive a message from an active session", {
|
|
153
|
+
session_id: z.string().describe("Session ID"),
|
|
154
|
+
timeout_ms: z.number().optional().describe("Timeout in milliseconds (default: 30000)"),
|
|
155
|
+
}, async ({ session_id, timeout_ms }) => {
|
|
156
|
+
const result = await proxy.call("cello_receive", { session_id, timeout_ms });
|
|
157
|
+
return jsonText(result);
|
|
393
158
|
});
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
// Passing undefined is a safe fallback — the tools return M1 stub responses.
|
|
401
|
-
// PERSIST-022: clientBackupInstance passed so cello_backup/cello_restore are registered
|
|
402
|
-
// inside createMcpSessionServer (single canonical registration path).
|
|
403
|
-
const server = createMcpSessionServer(node, client, kp, {
|
|
404
|
-
clientBackup: clientBackupInstance,
|
|
405
|
-
// AC-007 (DX-001): pass directoryUrl so agent_id lookup works in tool handlers
|
|
406
|
-
directoryUrl,
|
|
407
|
-
// AC-009 (DX-001): pass readyPromise so tools can await background init (up to 10s)
|
|
408
|
-
readyPromise,
|
|
409
|
-
// Wire logger so observability events (e.g. client.directory.agent_lookup.failed) are emitted
|
|
410
|
-
logger: backupLogger,
|
|
159
|
+
server.tool("cello_receive_session", "Receive messages from an active session (alias)", {
|
|
160
|
+
session_id: z.string().describe("Session ID"),
|
|
161
|
+
timeout_ms: z.number().optional().describe("Timeout in milliseconds (default: 30000)"),
|
|
162
|
+
}, async ({ session_id, timeout_ms }) => {
|
|
163
|
+
const result = await proxy.call("cello_receive_session", { session_id, timeout_ms });
|
|
164
|
+
return jsonText(result);
|
|
411
165
|
});
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
166
|
+
server.tool("cello_close_session", "Close an active session and trigger the seal ceremony", {
|
|
167
|
+
session_id: z.string().describe("Session ID to close"),
|
|
168
|
+
}, async ({ session_id }) => {
|
|
169
|
+
const result = await proxy.call("cello_close_session", { session_id });
|
|
170
|
+
return jsonText(result);
|
|
171
|
+
});
|
|
172
|
+
server.tool("cello_list_sessions", "List all sessions for the current agent", {}, async () => {
|
|
173
|
+
const result = await proxy.call("cello_list_sessions");
|
|
174
|
+
return jsonText(result);
|
|
175
|
+
});
|
|
176
|
+
// ─── Status and utility tools ───────────────────────────────────────────────
|
|
177
|
+
server.tool("cello_status", "Get daemon and agent status", {}, async () => {
|
|
178
|
+
const result = await proxy.call("cello_status");
|
|
179
|
+
return jsonText(result);
|
|
180
|
+
});
|
|
181
|
+
server.tool("cello_backup", "Backup agent state to configured storage", {}, async () => {
|
|
182
|
+
const result = await proxy.call("cello_backup");
|
|
183
|
+
return jsonText(result);
|
|
184
|
+
});
|
|
185
|
+
server.tool("cello_restore", "Restore agent state from backup", {}, async () => {
|
|
186
|
+
const result = await proxy.call("cello_restore");
|
|
187
|
+
return jsonText(result);
|
|
188
|
+
});
|
|
189
|
+
server.tool("cello_get_sealed_receipt", "Get the sealed receipt for a closed session", {
|
|
190
|
+
session_id: z.string().describe("Session ID"),
|
|
191
|
+
}, async ({ session_id }) => {
|
|
192
|
+
const result = await proxy.call("cello_get_sealed_receipt", { session_id });
|
|
193
|
+
return jsonText(result);
|
|
194
|
+
});
|
|
195
|
+
server.tool("cello_get_transcript", "Get the durable, readable conversation transcript for a session (sent + received messages, in order) — recoverable after a daemon restart", {
|
|
196
|
+
session_id: z.string().describe("Session ID"),
|
|
197
|
+
}, async ({ session_id }) => {
|
|
198
|
+
const result = await proxy.call("cello_get_transcript", { session_id });
|
|
199
|
+
return jsonText(result);
|
|
200
|
+
});
|
|
201
|
+
server.tool("cello_get_inclusion_proof", "Get inclusion proof for a message in a sealed session", {
|
|
202
|
+
session_id: z.string().describe("Session ID"),
|
|
203
|
+
content_hash: z.string().describe("Content hash to prove inclusion of"),
|
|
204
|
+
}, async ({ session_id, content_hash }) => {
|
|
205
|
+
const result = await proxy.call("cello_get_inclusion_proof", { session_id, content_hash });
|
|
206
|
+
return jsonText(result);
|
|
207
|
+
});
|
|
208
|
+
// ─── Connect stdio transport ─────────────────────────────────────────────────
|
|
415
209
|
await server.connect(new StdioServerTransport());
|
|
416
|
-
await client.registerHandler();
|
|
417
|
-
// AC-009 (DX-001): Background init task — runs concurrently with MCP tool calls.
|
|
418
|
-
// All network and disk I/O happens here, not on the critical path of server startup.
|
|
419
|
-
void (async () => {
|
|
420
|
-
try {
|
|
421
|
-
// Step 1: Open SQLCipher database
|
|
422
|
-
process.stderr.write("cello: opening database...");
|
|
423
|
-
let clientPersistence;
|
|
424
|
-
let sqlCipherStore;
|
|
425
|
-
const t0Db = Date.now();
|
|
426
|
-
if (dbKey) {
|
|
427
|
-
try {
|
|
428
|
-
sqlCipherStore = new SQLCipherClientStore(dbKey, {
|
|
429
|
-
dbPath,
|
|
430
|
-
agentId,
|
|
431
|
-
env: celloEnv,
|
|
432
|
-
logger: backupLogger,
|
|
433
|
-
});
|
|
434
|
-
await sqlCipherStore.open();
|
|
435
|
-
clientPersistence = new ClientStatePersistence({
|
|
436
|
-
store: sqlCipherStore,
|
|
437
|
-
agentPubkey: agentId,
|
|
438
|
-
keyFilePath: keyPath,
|
|
439
|
-
logger: backupLogger,
|
|
440
|
-
});
|
|
441
|
-
// PERSIST-024 (MED-2): expose to backup setMetadata/getMetadata callbacks (late binding)
|
|
442
|
-
clientPersistenceRef = clientPersistence;
|
|
443
|
-
// Wire persistence into client
|
|
444
|
-
client.setPersistence?.(clientPersistence);
|
|
445
|
-
const durationMs = Date.now() - t0Db;
|
|
446
|
-
// AC-001: report schema version and table count when available
|
|
447
|
-
const schemaInfo = sqlCipherStore.getSchemaInfo?.();
|
|
448
|
-
if (schemaInfo) {
|
|
449
|
-
process.stderr.write(` ok (V${schemaInfo.version}, ${schemaInfo.tableCount} tables)\n`);
|
|
450
|
-
}
|
|
451
|
-
else {
|
|
452
|
-
process.stderr.write(` ok (${durationMs}ms)\n`);
|
|
453
|
-
}
|
|
454
|
-
backupLogger.info("client.startup.progress", { step: "opening_database", outcome: "ok", durationMs });
|
|
455
|
-
}
|
|
456
|
-
catch (err) {
|
|
457
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
458
|
-
process.stderr.write(` failed: ${msg}\n`);
|
|
459
|
-
backupLogger.warn("client.startup.progress", { step: "opening_database", outcome: "failed", reason: msg, durationMs: Date.now() - t0Db });
|
|
460
|
-
// Detect native module load failures
|
|
461
|
-
const isNativeModuleError = msg.includes("Cannot find module") ||
|
|
462
|
-
msg.includes("was compiled against a different Node.js version") ||
|
|
463
|
-
msg.includes("NODE_MODULE_VERSION") ||
|
|
464
|
-
msg.includes("invalid ELF header") ||
|
|
465
|
-
msg.includes("dlopen") ||
|
|
466
|
-
msg.includes("libcrypto") ||
|
|
467
|
-
msg.includes("libssl");
|
|
468
|
-
if (isNativeModuleError) {
|
|
469
|
-
const platform = process.platform;
|
|
470
|
-
if (platform === "win32") {
|
|
471
|
-
process.stderr.write(`cello-mcp: Windows is not yet supported in the CELLO beta.\n`);
|
|
472
|
-
process.stderr.write(`cello-mcp: Windows support is on the roadmap. Follow https://github.com/Mygentic-AI/cello-client for updates.\n`);
|
|
473
|
-
}
|
|
474
|
-
else if (platform === "linux") {
|
|
475
|
-
process.stderr.write(`cello-mcp: Missing OpenSSL build dependencies on Linux.\n`);
|
|
476
|
-
process.stderr.write(`cello-mcp: Run: sudo apt-get install build-essential libssl-dev\n`);
|
|
477
|
-
process.stderr.write(`cello-mcp: Then re-run: npm install -g @cello-protocol/connect@latest\n`);
|
|
478
|
-
}
|
|
479
|
-
else {
|
|
480
|
-
process.stderr.write(`cello-mcp: Xcode Command Line Tools are required on macOS.\n`);
|
|
481
|
-
process.stderr.write(`cello-mcp: Run: xcode-select --install\n`);
|
|
482
|
-
process.stderr.write(`cello-mcp: Then re-run: npm install -g @cello-protocol/connect@latest\n`);
|
|
483
|
-
}
|
|
484
|
-
process.stderr.write(`cello-mcp: Continuing without persistence — data will not survive restarts.\n`);
|
|
485
|
-
}
|
|
486
|
-
// Non-fatal: client continues without persistence
|
|
487
|
-
clientPersistence = undefined;
|
|
488
|
-
sqlCipherStore = undefined;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
else {
|
|
492
|
-
process.stderr.write(` failed: identity key not available\n`);
|
|
493
|
-
backupLogger.warn("client.startup.progress", { step: "opening_database", outcome: "failed", reason: "identity key not available", durationMs: Date.now() - t0Db });
|
|
494
|
-
}
|
|
495
|
-
// Step 2: Fetch directory address
|
|
496
|
-
let resolvedDirectoryMultiaddr = directoryMultiaddr;
|
|
497
|
-
let directoryEndpoint = undefined;
|
|
498
|
-
if (!resolvedDirectoryMultiaddr) {
|
|
499
|
-
process.stderr.write(`cello: fetching directory address...`);
|
|
500
|
-
const t0Bootstrap = Date.now();
|
|
501
|
-
try {
|
|
502
|
-
const discovered = await fetchBootstrapMultiaddr(directoryUrl);
|
|
503
|
-
if (discovered) {
|
|
504
|
-
resolvedDirectoryMultiaddr = discovered;
|
|
505
|
-
const parts = resolvedDirectoryMultiaddr.split("/");
|
|
506
|
-
const p2pIndex = parts.findIndex((p) => p === "p2p");
|
|
507
|
-
const peerId = p2pIndex !== -1 ? parts[p2pIndex + 1] : null;
|
|
508
|
-
const shortPeerId = peerId ? peerId.slice(0, 20) + "..." : "(unknown)";
|
|
509
|
-
process.stderr.write(` ok (${shortPeerId})\n`);
|
|
510
|
-
backupLogger.info("client.startup.progress", { step: "fetching_directory_address", outcome: "ok", durationMs: Date.now() - t0Bootstrap });
|
|
511
|
-
}
|
|
512
|
-
else {
|
|
513
|
-
const reason = "bootstrap endpoint unreachable";
|
|
514
|
-
backupLogger.warn("client.bootstrap.fetch.failed", { directoryUrl, reason: "endpoint_returned_null", durationMs: Date.now() - t0Bootstrap });
|
|
515
|
-
process.stderr.write(` failed: ${reason}\n`);
|
|
516
|
-
backupLogger.warn("client.startup.progress", { step: "fetching_directory_address", outcome: "failed", reason, durationMs: Date.now() - t0Bootstrap });
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
catch (err) {
|
|
520
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
521
|
-
backupLogger.warn("client.bootstrap.fetch.failed", { directoryUrl, reason: msg, durationMs: Date.now() - t0Bootstrap });
|
|
522
|
-
process.stderr.write(` failed: ${msg}\n`);
|
|
523
|
-
backupLogger.warn("client.startup.progress", { step: "fetching_directory_address", outcome: "failed", reason: msg, durationMs: Date.now() - t0Bootstrap });
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
else {
|
|
527
|
-
// CELLO_DIRECTORY_MULTIADDR is set — use it directly
|
|
528
|
-
process.stderr.write(`cello: fetching directory address... ok (from CELLO_DIRECTORY_MULTIADDR)\n`);
|
|
529
|
-
backupLogger.info("client.startup.progress", { step: "fetching_directory_address", outcome: "ok", durationMs: 0 });
|
|
530
|
-
}
|
|
531
|
-
if (resolvedDirectoryMultiaddr) {
|
|
532
|
-
const parts = resolvedDirectoryMultiaddr.split("/");
|
|
533
|
-
const p2pIndex = parts.findIndex((p) => p === "p2p");
|
|
534
|
-
const peerId = p2pIndex !== -1 ? parts[p2pIndex + 1] : null;
|
|
535
|
-
if (peerId) {
|
|
536
|
-
directoryEndpoint = { peer_id: peerId, multiaddrs: [resolvedDirectoryMultiaddr] };
|
|
537
|
-
}
|
|
538
|
-
else {
|
|
539
|
-
// Multiaddr is present but lacks /p2p/<peer-id> — setDirectoryEndpoint will not be called.
|
|
540
|
-
backupLogger.warn("client.startup.multiaddr_parse.failed", { reason: "multiaddr_missing_peer_id", multiaddr: resolvedDirectoryMultiaddr });
|
|
541
|
-
process.stderr.write("cello-mcp: directory multiaddr must include /p2p/<peer-id>\n");
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
// AC-003 (DX-001): Set directoryEndpoint on the client BEFORE loadPersistedState() so that
|
|
545
|
-
// loadPersistedState() can populate directoryNodeStubs in the reconstructed FrostThresholdSigner.
|
|
546
|
-
// Only called when directoryEndpoint is parsed successfully (requires /p2p/<peer-id> in the
|
|
547
|
-
// multiaddr). If multiaddr lacks peer ID, loadPersistedState() will reconstruct the
|
|
548
|
-
// FrostThresholdSigner with directoryNodeStubs: undefined — ceremonies will fail until the
|
|
549
|
-
// agent reconnects with a valid multiaddr.
|
|
550
|
-
if (directoryEndpoint) {
|
|
551
|
-
client.setDirectoryEndpoint?.(directoryEndpoint);
|
|
552
|
-
}
|
|
553
|
-
// Step 3: Load agent state (moved BEFORE directory connection/bootstrap)
|
|
554
|
-
// Registered agents will have their FrostThresholdSigner reconstructed from DB here.
|
|
555
|
-
// directoryEndpoint is already set, so directoryNodeStubs will be populated.
|
|
556
|
-
process.stderr.write("cello: loading agent state...");
|
|
557
|
-
const t0LoadState = Date.now();
|
|
558
|
-
try {
|
|
559
|
-
await client.loadPersistedState();
|
|
560
|
-
process.stderr.write(" ok\n");
|
|
561
|
-
backupLogger.info("client.startup.progress", { step: "loading_agent_state", outcome: "ok", durationMs: Date.now() - t0LoadState });
|
|
562
|
-
}
|
|
563
|
-
catch (err) {
|
|
564
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
565
|
-
process.stderr.write(` failed: ${msg}\n`);
|
|
566
|
-
backupLogger.warn("client.startup.progress", { step: "loading_agent_state", outcome: "failed", reason: msg, durationMs: Date.now() - t0LoadState });
|
|
567
|
-
throw err;
|
|
568
|
-
}
|
|
569
|
-
// PERSIST-024 AC-008: Build AgentHashQueue
|
|
570
|
-
const loadedPendingHashes = client.getLoadedPendingHashes();
|
|
571
|
-
const hashQueue = new AgentHashQueue({
|
|
572
|
-
store: new LocalClientStore(),
|
|
573
|
-
agentId,
|
|
574
|
-
logger: backupLogger,
|
|
575
|
-
});
|
|
576
|
-
if (loadedPendingHashes.length > 0) {
|
|
577
|
-
await hashQueue.loadPending(loadedPendingHashes);
|
|
578
|
-
process.stderr.write(`cello-mcp: ${loadedPendingHashes.length} pending hash(es) loaded into AgentHashQueue\n`);
|
|
579
|
-
}
|
|
580
|
-
client.setHashQueue(hashQueue);
|
|
581
|
-
// Check if the agent is already registered (FROST share was loaded from DB).
|
|
582
|
-
// If so, skip bootstrap — the signer is already reconstructed from the DB.
|
|
583
|
-
const regStateAfterLoad = typeof client.getRegistrationState === "function"
|
|
584
|
-
? client.getRegistrationState()
|
|
585
|
-
: null;
|
|
586
|
-
// Step 4: Connect to directory and bootstrap ONLY if not already registered
|
|
587
|
-
let thresholdSigner;
|
|
588
|
-
let primaryPubkey;
|
|
589
|
-
const t0Connect = Date.now();
|
|
590
|
-
if (resolvedDirectoryMultiaddr && directoryEndpoint) {
|
|
591
|
-
process.stderr.write(`cello: connecting to directory...`);
|
|
592
|
-
try {
|
|
593
|
-
await node.dial(directoryEndpoint.multiaddrs[0]);
|
|
594
|
-
// Announce to the directory immediately after dial so the directory registers
|
|
595
|
-
// this agent in its #streams map. Without this, the directory considers the
|
|
596
|
-
// agent offline even though the libp2p TCP connection succeeded.
|
|
597
|
-
// registerHandler() was called before directoryEndpoint was set, so the
|
|
598
|
-
// proactive announce inside it was skipped — this call makes up for that.
|
|
599
|
-
await client.announceToDirectory();
|
|
600
|
-
if (!regStateAfterLoad) {
|
|
601
|
-
// Not yet registered — run bootstrap to initialize FROST key shares.
|
|
602
|
-
// Registered agents already have their signer from loadPersistedState().
|
|
603
|
-
const ownPubkey = await kp.getPublicKey();
|
|
604
|
-
const networkNodes = [new NetworkDirectoryNode({
|
|
605
|
-
id: `cello-test-node-0000`,
|
|
606
|
-
node,
|
|
607
|
-
directoryPeerId: directoryEndpoint.peer_id,
|
|
608
|
-
directoryMultiaddrs: directoryEndpoint.multiaddrs,
|
|
609
|
-
})];
|
|
610
|
-
const bootstrap = await bootstrapNetworkKeyShares(ownPubkey, {
|
|
611
|
-
threshold: 2,
|
|
612
|
-
participants: 1,
|
|
613
|
-
directoryNodes: networkNodes,
|
|
614
|
-
});
|
|
615
|
-
thresholdSigner = bootstrap.signer;
|
|
616
|
-
primaryPubkey = bootstrap.primaryPubkey;
|
|
617
|
-
}
|
|
618
|
-
process.stderr.write(` ok\n`);
|
|
619
|
-
backupLogger.info("client.startup.progress", { step: "connecting_to_directory", outcome: "ok", durationMs: Date.now() - t0Connect });
|
|
620
|
-
}
|
|
621
|
-
catch (err) {
|
|
622
|
-
const msg = err instanceof Error ? `${err.name}: ${err.message}` : JSON.stringify(err);
|
|
623
|
-
process.stderr.write(` failed: ${msg}\n`);
|
|
624
|
-
process.stderr.write(`cello-mcp: continuing without threshold signer\n`);
|
|
625
|
-
backupLogger.warn("client.startup.progress", { step: "connecting_to_directory", outcome: "failed", reason: msg, durationMs: Date.now() - t0Connect });
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
else {
|
|
629
|
-
process.stderr.write(`cello: connecting to directory... failed: no multiaddr configured\n`);
|
|
630
|
-
backupLogger.warn("client.startup.progress", { step: "connecting_to_directory", outcome: "failed", reason: "no multiaddr configured", durationMs: Date.now() - t0Connect });
|
|
631
|
-
}
|
|
632
|
-
// Wire threshold signer into client only when bootstrap ran (unregistered agents).
|
|
633
|
-
// Registered agents already have their signer from loadPersistedState().
|
|
634
|
-
if (thresholdSigner) {
|
|
635
|
-
client.setThresholdSigner?.(thresholdSigner);
|
|
636
|
-
}
|
|
637
|
-
if (primaryPubkey) {
|
|
638
|
-
client.setPrimaryPubkey(primaryPubkey);
|
|
639
|
-
}
|
|
640
|
-
// Step 5: Emit final ready message (use regStateAfterLoad from loadPersistedState)
|
|
641
|
-
if (regStateAfterLoad) {
|
|
642
|
-
process.stderr.write(`cello: ready (registered as ${regStateAfterLoad.agent_id})\n`);
|
|
643
|
-
}
|
|
644
|
-
else {
|
|
645
|
-
process.stderr.write(`cello: ready (not registered — call cello_setup_guidance for setup)\n`);
|
|
646
|
-
}
|
|
647
|
-
// durationMs: 0 — "ready" is a completion marker, not a timed operation.
|
|
648
|
-
backupLogger.info("client.startup.progress", { step: "ready", outcome: "ok", durationMs: 0 });
|
|
649
|
-
readyResolve();
|
|
650
|
-
}
|
|
651
|
-
catch (err) {
|
|
652
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
653
|
-
process.stderr.write(`cello-mcp: background init failed: ${msg}\n`);
|
|
654
|
-
readyReject(err);
|
|
655
|
-
}
|
|
656
|
-
})();
|
|
657
210
|
//# sourceMappingURL=cello-mcp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cello-mcp.js","sourceRoot":"","sources":["../../src/bin/cello-mcp.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cello-mcp.js","sourceRoot":"","sources":["../../src/bin/cello-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC Proxy — thin client for connecting cello-mcp to the daemon.
|
|
3
|
+
*
|
|
4
|
+
* Pseudocode:
|
|
5
|
+
* 1. connect(socketPath):
|
|
6
|
+
* a. Create net.Socket via createConnection
|
|
7
|
+
* b. On 'connect' event → resolve
|
|
8
|
+
* c. On 'error' → reject with ENOENT/ECONNREFUSED
|
|
9
|
+
* d. Set up JSON-newline framing reader
|
|
10
|
+
*
|
|
11
|
+
* 2. call(method, params):
|
|
12
|
+
* a. If socket is dead → return ipc_connection_lost immediately
|
|
13
|
+
* b. Generate numeric request ID (incrementing counter)
|
|
14
|
+
* c. Write { id, method, params } + '\n' to socket
|
|
15
|
+
* d. Await matching response by id
|
|
16
|
+
* e. If JSON parse error on response → return ipc_deserialization_error
|
|
17
|
+
* f. If response has error → extract and return as { ok: false, ... }
|
|
18
|
+
* g. Otherwise return result
|
|
19
|
+
*
|
|
20
|
+
* 3. On socket close: set dead flag. All subsequent calls return ipc_connection_lost.
|
|
21
|
+
*/
|
|
22
|
+
export interface IpcProxyResult {
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
}
|
|
25
|
+
export declare class IpcProxy {
|
|
26
|
+
#private;
|
|
27
|
+
constructor(socketPath: string);
|
|
28
|
+
/**
|
|
29
|
+
* Connect to the daemon IPC socket.
|
|
30
|
+
* Throws if the socket doesn't exist (ENOENT) or daemon isn't listening (ECONNREFUSED).
|
|
31
|
+
*/
|
|
32
|
+
connect(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Send an IPC request and await the response.
|
|
35
|
+
* Returns the result directly if successful, or an error object with reason/guidance.
|
|
36
|
+
*/
|
|
37
|
+
call(method: string, params?: Record<string, unknown>): Promise<unknown>;
|
|
38
|
+
close(): void;
|
|
39
|
+
get isDead(): boolean;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ipc-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-proxy.d.ts","sourceRoot":"","sources":["../src/ipc-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAsBD,qBAAa,QAAQ;;gBAQP,UAAU,EAAE,MAAM;IAI9B;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CxB;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAgC9E,KAAK,IAAI,IAAI;IAQb,IAAI,MAAM,IAAI,OAAO,CAEpB;CAsDF"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC Proxy — thin client for connecting cello-mcp to the daemon.
|
|
3
|
+
*
|
|
4
|
+
* Pseudocode:
|
|
5
|
+
* 1. connect(socketPath):
|
|
6
|
+
* a. Create net.Socket via createConnection
|
|
7
|
+
* b. On 'connect' event → resolve
|
|
8
|
+
* c. On 'error' → reject with ENOENT/ECONNREFUSED
|
|
9
|
+
* d. Set up JSON-newline framing reader
|
|
10
|
+
*
|
|
11
|
+
* 2. call(method, params):
|
|
12
|
+
* a. If socket is dead → return ipc_connection_lost immediately
|
|
13
|
+
* b. Generate numeric request ID (incrementing counter)
|
|
14
|
+
* c. Write { id, method, params } + '\n' to socket
|
|
15
|
+
* d. Await matching response by id
|
|
16
|
+
* e. If JSON parse error on response → return ipc_deserialization_error
|
|
17
|
+
* f. If response has error → extract and return as { ok: false, ... }
|
|
18
|
+
* g. Otherwise return result
|
|
19
|
+
*
|
|
20
|
+
* 3. On socket close: set dead flag. All subsequent calls return ipc_connection_lost.
|
|
21
|
+
*/
|
|
22
|
+
import { createConnection } from "node:net";
|
|
23
|
+
const IPC_CONNECTION_LOST = {
|
|
24
|
+
ok: false,
|
|
25
|
+
reason: "ipc_connection_lost",
|
|
26
|
+
guidance: "The connection to the CELLO daemon was lost. Restart this MCP server (close and reopen Claude Code) to reconnect. The daemon itself may still be running — run `cello status` in a terminal to check.",
|
|
27
|
+
};
|
|
28
|
+
const IPC_DESERIALIZATION_ERROR = {
|
|
29
|
+
ok: false,
|
|
30
|
+
reason: "ipc_deserialization_error",
|
|
31
|
+
guidance: "The daemon sent a malformed response — this may be transient. Retry your operation. If the error persists, run `cello-mcp --version` and `cello status` to check for a version mismatch between cello-mcp and the running daemon.",
|
|
32
|
+
};
|
|
33
|
+
// CELLO-M7-MSG-001: must stay in sync with ipc-server.ts MAX_BUFFER_SIZE. Raised to
|
|
34
|
+
// 4 MB so a max-size (1 MB) cello_send content message + JSON envelope traverses IPC and
|
|
35
|
+
// reaches the daemon's content_too_large check, instead of tripping a fatal buffer
|
|
36
|
+
// overflow at the 1 MB content cap boundary.
|
|
37
|
+
const MAX_BUFFER_SIZE = 4 * 1024 * 1024; // 4MB — matches IPC server limit
|
|
38
|
+
export class IpcProxy {
|
|
39
|
+
#socketPath;
|
|
40
|
+
#socket = null;
|
|
41
|
+
#dead = false;
|
|
42
|
+
#nextId = 1;
|
|
43
|
+
#pending = new Map();
|
|
44
|
+
#buffer = "";
|
|
45
|
+
constructor(socketPath) {
|
|
46
|
+
this.#socketPath = socketPath;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Connect to the daemon IPC socket.
|
|
50
|
+
* Throws if the socket doesn't exist (ENOENT) or daemon isn't listening (ECONNREFUSED).
|
|
51
|
+
*/
|
|
52
|
+
connect() {
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
const socket = createConnection(this.#socketPath);
|
|
55
|
+
this.#socket = socket;
|
|
56
|
+
socket.on("connect", () => {
|
|
57
|
+
resolve();
|
|
58
|
+
});
|
|
59
|
+
socket.on("error", (err) => {
|
|
60
|
+
this.#dead = true;
|
|
61
|
+
reject(err);
|
|
62
|
+
// Reject all pending requests
|
|
63
|
+
for (const [, p] of this.#pending) {
|
|
64
|
+
p.reject(new Error("Connection closed"));
|
|
65
|
+
}
|
|
66
|
+
this.#pending.clear();
|
|
67
|
+
});
|
|
68
|
+
socket.on("data", (chunk) => {
|
|
69
|
+
this.#buffer += chunk.toString("utf-8");
|
|
70
|
+
if (this.#buffer.length > MAX_BUFFER_SIZE) {
|
|
71
|
+
this.#dead = true;
|
|
72
|
+
socket.destroy();
|
|
73
|
+
for (const [, p] of this.#pending) {
|
|
74
|
+
p.resolve(IPC_CONNECTION_LOST);
|
|
75
|
+
}
|
|
76
|
+
this.#pending.clear();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
this.#processBuffer();
|
|
80
|
+
});
|
|
81
|
+
socket.on("close", () => {
|
|
82
|
+
this.#dead = true;
|
|
83
|
+
// Reject all pending requests
|
|
84
|
+
for (const [, p] of this.#pending) {
|
|
85
|
+
p.reject(new Error("Connection closed"));
|
|
86
|
+
}
|
|
87
|
+
this.#pending.clear();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Send an IPC request and await the response.
|
|
93
|
+
* Returns the result directly if successful, or an error object with reason/guidance.
|
|
94
|
+
*/
|
|
95
|
+
async call(method, params) {
|
|
96
|
+
if (!method || typeof method !== "string") {
|
|
97
|
+
return { ok: false, reason: "invalid_method", guidance: "IPC method name must be a non-empty string." };
|
|
98
|
+
}
|
|
99
|
+
if (this.#dead) {
|
|
100
|
+
return IPC_CONNECTION_LOST;
|
|
101
|
+
}
|
|
102
|
+
const id = String(this.#nextId++);
|
|
103
|
+
return new Promise((resolve) => {
|
|
104
|
+
this.#pending.set(id, {
|
|
105
|
+
resolve,
|
|
106
|
+
reject: () => {
|
|
107
|
+
// On socket close/error, return ipc_connection_lost
|
|
108
|
+
resolve(IPC_CONNECTION_LOST);
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
const frame = JSON.stringify({ id, method, params }) + "\n";
|
|
112
|
+
try {
|
|
113
|
+
this.#socket.write(frame);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
117
|
+
process.stderr.write(`cello-mcp: IPC write failed: ${msg}\n`);
|
|
118
|
+
this.#dead = true;
|
|
119
|
+
this.#pending.delete(id);
|
|
120
|
+
resolve(IPC_CONNECTION_LOST);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
close() {
|
|
125
|
+
if (this.#socket) {
|
|
126
|
+
this.#socket.end();
|
|
127
|
+
this.#socket = null;
|
|
128
|
+
}
|
|
129
|
+
this.#dead = true;
|
|
130
|
+
}
|
|
131
|
+
get isDead() {
|
|
132
|
+
return this.#dead;
|
|
133
|
+
}
|
|
134
|
+
#processBuffer() {
|
|
135
|
+
let newlineIdx;
|
|
136
|
+
while ((newlineIdx = this.#buffer.indexOf("\n")) !== -1) {
|
|
137
|
+
const line = this.#buffer.slice(0, newlineIdx);
|
|
138
|
+
this.#buffer = this.#buffer.slice(newlineIdx + 1);
|
|
139
|
+
if (line.trim().length === 0)
|
|
140
|
+
continue;
|
|
141
|
+
let frame;
|
|
142
|
+
try {
|
|
143
|
+
frame = JSON.parse(line);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Malformed JSON — resolve the oldest pending request with deserialization error.
|
|
147
|
+
// In production the daemon never sends malformed frames; this handles transient
|
|
148
|
+
// corruption or version mismatch. We resolve the oldest pending because responses
|
|
149
|
+
// arrive in order for the single-socket serial protocol.
|
|
150
|
+
process.stderr.write(`cello-mcp: received malformed IPC frame (${line.length} bytes)\n`);
|
|
151
|
+
const oldestEntry = this.#pending.entries().next();
|
|
152
|
+
if (!oldestEntry.done) {
|
|
153
|
+
const [oldestId, resolver] = oldestEntry.value;
|
|
154
|
+
this.#pending.delete(oldestId);
|
|
155
|
+
resolver.resolve(IPC_DESERIALIZATION_ERROR);
|
|
156
|
+
}
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// Check for notification frames (server-initiated, no id)
|
|
160
|
+
if ("notification" in frame) {
|
|
161
|
+
// Notifications are not correlated to requests; skip for now
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// Regular response — correlate by id
|
|
165
|
+
const responseId = frame.id;
|
|
166
|
+
const pending = this.#pending.get(responseId);
|
|
167
|
+
if (pending) {
|
|
168
|
+
this.#pending.delete(responseId);
|
|
169
|
+
if ("error" in frame) {
|
|
170
|
+
const err = frame.error;
|
|
171
|
+
pending.resolve({
|
|
172
|
+
ok: false,
|
|
173
|
+
reason: err.code,
|
|
174
|
+
message: err.message,
|
|
175
|
+
guidance: err.guidance,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
pending.resolve(frame.result);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (responseId) {
|
|
183
|
+
process.stderr.write(`cello-mcp: orphaned IPC response for id=${responseId} (no pending request)\n`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=ipc-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-proxy.js","sourceRoot":"","sources":["../src/ipc-proxy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cello-protocol/connect",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.47",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"@libp2p/peer-id": "^6.0.8",
|
|
31
31
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
32
32
|
"zod": "^4.4.2",
|
|
33
|
-
"@cello-protocol/client": "0.0.
|
|
34
|
-
"@cello-protocol/crypto": "0.0.
|
|
35
|
-
"@cello-protocol/transport": "0.0.
|
|
33
|
+
"@cello-protocol/client": "0.0.35",
|
|
34
|
+
"@cello-protocol/crypto": "0.0.9",
|
|
35
|
+
"@cello-protocol/transport": "0.0.6"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@claude-flow/testing": "3.0.0-alpha.6",
|