@essentialai/cogent-bridge 1.0.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.
Files changed (156) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +311 -0
  3. package/dist/backend/backend-provider.d.ts +28 -0
  4. package/dist/backend/backend-provider.d.ts.map +1 -0
  5. package/dist/backend/backend-provider.js +60 -0
  6. package/dist/backend/backend-provider.js.map +1 -0
  7. package/dist/backend/file-backend.d.ts +22 -0
  8. package/dist/backend/file-backend.d.ts.map +1 -0
  9. package/dist/backend/file-backend.js +46 -0
  10. package/dist/backend/file-backend.js.map +1 -0
  11. package/dist/backend/http-backend.d.ts +94 -0
  12. package/dist/backend/http-backend.d.ts.map +1 -0
  13. package/dist/backend/http-backend.js +185 -0
  14. package/dist/backend/http-backend.js.map +1 -0
  15. package/dist/backend/index.d.ts +5 -0
  16. package/dist/backend/index.d.ts.map +1 -0
  17. package/dist/backend/index.js +4 -0
  18. package/dist/backend/index.js.map +1 -0
  19. package/dist/backend/storage-backend.d.ts +22 -0
  20. package/dist/backend/storage-backend.d.ts.map +1 -0
  21. package/dist/backend/storage-backend.js +2 -0
  22. package/dist/backend/storage-backend.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +18 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/cloud/backoff.d.ts +19 -0
  28. package/dist/cloud/backoff.d.ts.map +1 -0
  29. package/dist/cloud/backoff.js +32 -0
  30. package/dist/cloud/backoff.js.map +1 -0
  31. package/dist/cloud/credential-store.d.ts +29 -0
  32. package/dist/cloud/credential-store.d.ts.map +1 -0
  33. package/dist/cloud/credential-store.js +38 -0
  34. package/dist/cloud/credential-store.js.map +1 -0
  35. package/dist/cloud/http-client.d.ts +36 -0
  36. package/dist/cloud/http-client.d.ts.map +1 -0
  37. package/dist/cloud/http-client.js +94 -0
  38. package/dist/cloud/http-client.js.map +1 -0
  39. package/dist/cloud/index.d.ts +10 -0
  40. package/dist/cloud/index.d.ts.map +1 -0
  41. package/dist/cloud/index.js +7 -0
  42. package/dist/cloud/index.js.map +1 -0
  43. package/dist/cloud/message-inbox.d.ts +49 -0
  44. package/dist/cloud/message-inbox.d.ts.map +1 -0
  45. package/dist/cloud/message-inbox.js +109 -0
  46. package/dist/cloud/message-inbox.js.map +1 -0
  47. package/dist/cloud/ws-client.d.ts +112 -0
  48. package/dist/cloud/ws-client.d.ts.map +1 -0
  49. package/dist/cloud/ws-client.js +241 -0
  50. package/dist/cloud/ws-client.js.map +1 -0
  51. package/dist/cloud/ws-frames.d.ts +66 -0
  52. package/dist/cloud/ws-frames.d.ts.map +1 -0
  53. package/dist/cloud/ws-frames.js +19 -0
  54. package/dist/cloud/ws-frames.js.map +1 -0
  55. package/dist/config.d.ts +40 -0
  56. package/dist/config.d.ts.map +1 -0
  57. package/dist/config.js +39 -0
  58. package/dist/config.js.map +1 -0
  59. package/dist/constants.d.ts +3 -0
  60. package/dist/constants.d.ts.map +1 -0
  61. package/dist/constants.js +6 -0
  62. package/dist/constants.js.map +1 -0
  63. package/dist/e2e/helpers.d.ts +101 -0
  64. package/dist/e2e/helpers.d.ts.map +1 -0
  65. package/dist/e2e/helpers.js +228 -0
  66. package/dist/e2e/helpers.js.map +1 -0
  67. package/dist/errors.d.ts +40 -0
  68. package/dist/errors.d.ts.map +1 -0
  69. package/dist/errors.js +53 -0
  70. package/dist/errors.js.map +1 -0
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +108 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/logger.d.ts +22 -0
  76. package/dist/logger.d.ts.map +1 -0
  77. package/dist/logger.js +79 -0
  78. package/dist/logger.js.map +1 -0
  79. package/dist/services/cc-cli.d.ts +8 -0
  80. package/dist/services/cc-cli.d.ts.map +1 -0
  81. package/dist/services/cc-cli.js +104 -0
  82. package/dist/services/cc-cli.js.map +1 -0
  83. package/dist/services/health-check.d.ts +33 -0
  84. package/dist/services/health-check.d.ts.map +1 -0
  85. package/dist/services/health-check.js +96 -0
  86. package/dist/services/health-check.js.map +1 -0
  87. package/dist/services/peer-registry.d.ts +9 -0
  88. package/dist/services/peer-registry.d.ts.map +1 -0
  89. package/dist/services/peer-registry.js +207 -0
  90. package/dist/services/peer-registry.js.map +1 -0
  91. package/dist/startup.d.ts +18 -0
  92. package/dist/startup.d.ts.map +1 -0
  93. package/dist/startup.js +270 -0
  94. package/dist/startup.js.map +1 -0
  95. package/dist/tools/create-session.d.ts +12 -0
  96. package/dist/tools/create-session.d.ts.map +1 -0
  97. package/dist/tools/create-session.js +113 -0
  98. package/dist/tools/create-session.js.map +1 -0
  99. package/dist/tools/deregister-peer.d.ts +3 -0
  100. package/dist/tools/deregister-peer.d.ts.map +1 -0
  101. package/dist/tools/deregister-peer.js +38 -0
  102. package/dist/tools/deregister-peer.js.map +1 -0
  103. package/dist/tools/get-history.d.ts +3 -0
  104. package/dist/tools/get-history.d.ts.map +1 -0
  105. package/dist/tools/get-history.js +40 -0
  106. package/dist/tools/get-history.js.map +1 -0
  107. package/dist/tools/health-check.d.ts +3 -0
  108. package/dist/tools/health-check.d.ts.map +1 -0
  109. package/dist/tools/health-check.js +28 -0
  110. package/dist/tools/health-check.js.map +1 -0
  111. package/dist/tools/join-session.d.ts +12 -0
  112. package/dist/tools/join-session.d.ts.map +1 -0
  113. package/dist/tools/join-session.js +90 -0
  114. package/dist/tools/join-session.js.map +1 -0
  115. package/dist/tools/list-peers.d.ts +3 -0
  116. package/dist/tools/list-peers.d.ts.map +1 -0
  117. package/dist/tools/list-peers.js +36 -0
  118. package/dist/tools/list-peers.js.map +1 -0
  119. package/dist/tools/register-peer.d.ts +3 -0
  120. package/dist/tools/register-peer.d.ts.map +1 -0
  121. package/dist/tools/register-peer.js +155 -0
  122. package/dist/tools/register-peer.js.map +1 -0
  123. package/dist/tools/send-message.d.ts +3 -0
  124. package/dist/tools/send-message.d.ts.map +1 -0
  125. package/dist/tools/send-message.js +121 -0
  126. package/dist/tools/send-message.js.map +1 -0
  127. package/dist/types.d.ts +31 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +2 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/wizard/detect.d.ts +4 -0
  132. package/dist/wizard/detect.d.ts.map +1 -0
  133. package/dist/wizard/detect.js +21 -0
  134. package/dist/wizard/detect.js.map +1 -0
  135. package/dist/wizard/index.d.ts +5 -0
  136. package/dist/wizard/index.d.ts.map +1 -0
  137. package/dist/wizard/index.js +140 -0
  138. package/dist/wizard/index.js.map +1 -0
  139. package/dist/wizard/prompts.d.ts +18 -0
  140. package/dist/wizard/prompts.d.ts.map +1 -0
  141. package/dist/wizard/prompts.js +66 -0
  142. package/dist/wizard/prompts.js.map +1 -0
  143. package/dist/wizard/scaffold-demo.d.ts +6 -0
  144. package/dist/wizard/scaffold-demo.d.ts.map +1 -0
  145. package/dist/wizard/scaffold-demo.js +37 -0
  146. package/dist/wizard/scaffold-demo.js.map +1 -0
  147. package/dist/wizard/scaffold-real.d.ts +16 -0
  148. package/dist/wizard/scaffold-real.d.ts.map +1 -0
  149. package/dist/wizard/scaffold-real.js +64 -0
  150. package/dist/wizard/scaffold-real.js.map +1 -0
  151. package/dist/wizard/templates.d.ts +9 -0
  152. package/dist/wizard/templates.d.ts.map +1 -0
  153. package/dist/wizard/templates.js +182 -0
  154. package/dist/wizard/templates.js.map +1 -0
  155. package/package.json +71 -0
  156. package/server.json +60 -0
@@ -0,0 +1,270 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import fs from "node:fs/promises";
4
+ import readline from "node:readline";
5
+ import { execFile } from "node:child_process";
6
+ import { promisify } from "node:util";
7
+ import { loadConfig, getConfig } from "./config.js";
8
+ import { createBackend, isCloudEndpoint, initBackend, resetBackend } from "./backend/index.js";
9
+ import { HttpBackend } from "./backend/http-backend.js";
10
+ import { initLogger, logger } from "./logger.js";
11
+ import { BridgeError, BridgeErrorCode } from "./errors.js";
12
+ import { loadCredentials } from "./cloud/credential-store.js";
13
+ import { CloudWsClient, MessageInbox } from "./cloud/index.js";
14
+ import { HttpClient } from "./cloud/http-client.js";
15
+ const execFileAsync = promisify(execFile);
16
+ const PERSIST_PATH = path.join(os.homedir(), ".cogent-config.json");
17
+ // ---------------------------------------------------------------------------
18
+ // Cloud service singletons -- accessible to index.ts and tool handlers
19
+ // ---------------------------------------------------------------------------
20
+ export let cloudWsClient = null;
21
+ export let cloudInbox = null;
22
+ export let cloudHttpClient = null;
23
+ async function loadPersistedConfig() {
24
+ try {
25
+ const raw = await fs.readFile(PERSIST_PATH, "utf-8");
26
+ return JSON.parse(raw);
27
+ }
28
+ catch {
29
+ return {};
30
+ }
31
+ }
32
+ async function savePersistedConfig(config) {
33
+ try {
34
+ await fs.writeFile(PERSIST_PATH, JSON.stringify(config, null, 2) + "\n", "utf-8");
35
+ }
36
+ catch (err) {
37
+ const msg = err instanceof Error ? err.message : String(err);
38
+ logger.warn(`Could not save config to ${PERSIST_PATH}: ${msg}`);
39
+ }
40
+ }
41
+ // ---------------------------------------------------------------------------
42
+ // First-run interactive prompt
43
+ // ---------------------------------------------------------------------------
44
+ async function firstRunPrompt(defaultPath) {
45
+ // Non-TTY (MCP host context): use defaults silently
46
+ if (!process.stdin.isTTY) {
47
+ return defaultPath;
48
+ }
49
+ // Check if persisted config already exists (not first run)
50
+ const persisted = await loadPersistedConfig();
51
+ if (persisted.statePath) {
52
+ return persisted.statePath;
53
+ }
54
+ // First run with TTY -- prompt the user
55
+ const rl = readline.createInterface({
56
+ input: process.stdin,
57
+ output: process.stderr, // CRITICAL: output to stderr, not stdout
58
+ });
59
+ return new Promise((resolve) => {
60
+ rl.question(`\nFirst run detected. Where should cogent-bridge store its data?\n` +
61
+ ` Default: ${defaultPath}\n` +
62
+ ` Press Enter to accept, or type a custom path: `, async (answer) => {
63
+ rl.close();
64
+ const chosen = answer.trim() || defaultPath;
65
+ await savePersistedConfig({ statePath: chosen });
66
+ resolve(chosen);
67
+ });
68
+ });
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Validation helpers
72
+ // ---------------------------------------------------------------------------
73
+ async function validateStateDir(statePath) {
74
+ await fs.mkdir(statePath, { recursive: true });
75
+ const testFile = path.join(statePath, ".write-test");
76
+ try {
77
+ await fs.writeFile(testFile, "test", "utf-8");
78
+ await fs.unlink(testFile);
79
+ }
80
+ catch {
81
+ throw new BridgeError(BridgeErrorCode.STARTUP_FAILED, `Cannot write to state directory: ${statePath}`, "Check permissions or set COGENT_STATE_PATH to a writable directory");
82
+ }
83
+ }
84
+ async function checkClaudeCli(claudePath) {
85
+ try {
86
+ const { stdout } = await execFileAsync(claudePath, ["--version"], {
87
+ timeout: 5000,
88
+ });
89
+ logger.info(`Claude CLI detected: ${stdout.trim()}`);
90
+ }
91
+ catch {
92
+ logger.warn(`CLI_NOT_FOUND: '${claudePath}' not found on PATH. ` +
93
+ `cogent_send_message will fail until Claude Code is installed. ` +
94
+ `Set COGENT_CLAUDE_PATH if installed in a non-standard location.`);
95
+ }
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // Helper to create a CloudWsClient with standard callbacks
99
+ // ---------------------------------------------------------------------------
100
+ function createCloudWsClient(endpoint, sessionId, token, http, inbox, pollIntervalMs) {
101
+ return new CloudWsClient({
102
+ endpoint,
103
+ sessionId,
104
+ peerId: "", // Will be set after first registerPeer call via setPeerId()
105
+ token,
106
+ http,
107
+ onMessage: (msg) => { inbox.addMessage(msg); },
108
+ onMessages: (msgs) => { inbox.addMessages(msgs); },
109
+ onPeerConnected: (peer) => { logger.info(`Peer connected: ${peer.peerId} (${peer.name})`); },
110
+ onPeerDisconnected: (id) => { logger.info(`Peer disconnected: ${id}`); },
111
+ onPeersSnapshot: (peers) => { logger.debug(`Peers snapshot: ${peers.length} peers`); },
112
+ onStateChange: (state) => { logger.info(`WebSocket state: ${state}`); },
113
+ onError: (err) => { logger.warn(`WebSocket error frame: ${err.code}: ${err.message}`); },
114
+ pollIntervalMs,
115
+ });
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ // Reinitialize cloud backend at runtime
119
+ // ---------------------------------------------------------------------------
120
+ /**
121
+ * Reinitialize the cloud backend with new credentials at runtime.
122
+ * Called by create-session, join-session, and register-peer auto-create
123
+ * after obtaining new session credentials.
124
+ *
125
+ * This function:
126
+ * 1. Creates a new HttpClient with the new token
127
+ * 2. Creates a new HttpBackend and replaces the current backend
128
+ * 3. Creates or updates CloudWsClient and MessageInbox
129
+ */
130
+ export async function reinitCloudBackend(endpoint, sessionId, token) {
131
+ const config = getConfig();
132
+ // 1. Create new HttpClient with new token
133
+ cloudHttpClient = new HttpClient(endpoint, token);
134
+ // 2. Create new HttpBackend and replace current backend
135
+ const newBackend = new HttpBackend(cloudHttpClient, sessionId);
136
+ resetBackend(); // Clear the existing backend reference
137
+ initBackend(newBackend); // Set the new one
138
+ logger.info(`Cloud backend reinitialized for session ${sessionId}`);
139
+ // 3. Create or update CloudWsClient
140
+ if (cloudWsClient) {
141
+ // Update existing client's credentials for reconnection
142
+ cloudWsClient.updateToken(token);
143
+ cloudWsClient.updateSessionId(sessionId);
144
+ cloudWsClient.updateHttp(cloudHttpClient);
145
+ // Don't call connect() here -- peerId may still be empty.
146
+ // connect() will happen when register-peer calls setPeerId().
147
+ }
148
+ else {
149
+ // First time -- create inbox and WS client
150
+ if (!cloudInbox) {
151
+ cloudInbox = new MessageInbox();
152
+ }
153
+ cloudWsClient = createCloudWsClient(endpoint, sessionId, token, cloudHttpClient, cloudInbox, config.COGENT_POLL_INTERVAL_MS);
154
+ logger.info("Cloud WebSocket client created (will connect after peer registration)");
155
+ }
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // Main startup flow
159
+ // ---------------------------------------------------------------------------
160
+ export async function runStartup() {
161
+ // Determine state path: env var takes precedence, then first-run prompt
162
+ const envStatePath = process.env.COGENT_STATE_PATH;
163
+ let statePath;
164
+ if (envStatePath) {
165
+ statePath = envStatePath;
166
+ }
167
+ else {
168
+ const defaultPath = path.join(os.homedir(), ".cogent");
169
+ statePath = await firstRunPrompt(defaultPath);
170
+ }
171
+ // If the prompt chose a different path, set it in env for loadConfig
172
+ if (!envStatePath && statePath !== path.join(os.homedir(), ".cogent")) {
173
+ process.env.COGENT_STATE_PATH = statePath;
174
+ }
175
+ else if (!envStatePath) {
176
+ // Ensure the default or persisted path is available to loadConfig
177
+ process.env.COGENT_STATE_PATH = statePath;
178
+ }
179
+ // Load and freeze config
180
+ loadConfig();
181
+ const config = getConfig();
182
+ // ---------------------------------------------------------------------------
183
+ // Cloud credential resolution
184
+ // ---------------------------------------------------------------------------
185
+ let effectiveSessionId = config.COGENT_SESSION_ID;
186
+ let effectiveToken;
187
+ const effectiveEndpoint = config.COGENT_ENDPOINT;
188
+ const isCloud = effectiveEndpoint && isCloudEndpoint(effectiveEndpoint);
189
+ if (isCloud) {
190
+ // Cloud mode: resolve credentials
191
+ // Priority: env vars (highest) > persisted credentials (lowest)
192
+ if (config.COGENT_SECRET && effectiveSessionId) {
193
+ // Full env var config -- need to join session to get a token
194
+ // This happens later when register-peer or join-session is called
195
+ // For now, try persisted credentials for the token
196
+ const persisted = await loadCredentials();
197
+ if (persisted && persisted.sessionId === effectiveSessionId && persisted.endpoint === effectiveEndpoint) {
198
+ effectiveToken = persisted.token;
199
+ }
200
+ }
201
+ else if (effectiveSessionId) {
202
+ // Have session ID but no secret -- try persisted token
203
+ const persisted = await loadCredentials();
204
+ if (persisted && persisted.sessionId === effectiveSessionId && persisted.endpoint === effectiveEndpoint) {
205
+ effectiveToken = persisted.token;
206
+ }
207
+ }
208
+ else {
209
+ // No session ID at all -- try persisted credentials
210
+ const persisted = await loadCredentials();
211
+ if (persisted && persisted.endpoint === effectiveEndpoint) {
212
+ effectiveSessionId = persisted.sessionId;
213
+ effectiveToken = persisted.token;
214
+ logger.info(`Loaded persisted cloud session ${effectiveSessionId}`);
215
+ }
216
+ // If no persisted creds either, cloud mode will be "deferred" --
217
+ // user needs to call create-session or join-session first
218
+ }
219
+ }
220
+ // ---------------------------------------------------------------------------
221
+ // Initialize transport backend
222
+ // ---------------------------------------------------------------------------
223
+ if (isCloud && effectiveSessionId && effectiveToken) {
224
+ // Cloud mode with full credentials -- create HttpBackend directly
225
+ const backend = createBackend(effectiveEndpoint, effectiveSessionId, effectiveToken);
226
+ initBackend(backend);
227
+ }
228
+ else if (isCloud) {
229
+ // Cloud mode but deferred (no credentials yet) -- create local FileBackend as placeholder.
230
+ // reinitCloudBackend() will replace it when create-session/join-session provides credentials.
231
+ const backend = createBackend(undefined);
232
+ initBackend(backend);
233
+ }
234
+ else {
235
+ // Local mode
236
+ const backend = createBackend(config.COGENT_ENDPOINT);
237
+ initBackend(backend);
238
+ }
239
+ // Initialize full logger with file outputs
240
+ initLogger(config.COGENT_LOG_LEVEL, path.join(config.COGENT_STATE_PATH, "logs"));
241
+ // ---------------------------------------------------------------------------
242
+ // Cloud mode: set up real-time connection infrastructure
243
+ // ---------------------------------------------------------------------------
244
+ if (isCloud && effectiveSessionId && effectiveToken) {
245
+ // Cloud mode with full credentials -- set up real-time connection
246
+ cloudInbox = new MessageInbox();
247
+ cloudHttpClient = new HttpClient(effectiveEndpoint, effectiveToken);
248
+ cloudWsClient = createCloudWsClient(effectiveEndpoint, effectiveSessionId, effectiveToken, cloudHttpClient, cloudInbox, config.COGENT_POLL_INTERVAL_MS);
249
+ // Note: WS connect requires a registered peerId. Don't connect yet --
250
+ // the peerId is empty and connect() guards against this.
251
+ // WS connect will be triggered when register-peer calls cloudWsClient.setPeerId(peerId).
252
+ // Per Pitfall 4 in RESEARCH: WS connect must happen AFTER peer registration.
253
+ logger.info(`Cloud mode initialized. Session: ${effectiveSessionId}. WebSocket will connect after peer registration.`);
254
+ }
255
+ else if (isCloud) {
256
+ logger.info("Cloud mode endpoint configured but no session credentials. Use cogent_create_session or cogent_join_session.");
257
+ }
258
+ // ---------------------------------------------------------------------------
259
+ // Local-mode-only validation
260
+ // ---------------------------------------------------------------------------
261
+ if (!isCloud) {
262
+ // Validate state directory writability (only needed in local mode)
263
+ await validateStateDir(config.COGENT_STATE_PATH);
264
+ // Check for claude CLI (warn-only, only needed in local mode)
265
+ await checkClaudeCli(config.COGENT_CLAUDE_PATH);
266
+ }
267
+ const mode = isCloud ? "cloud" : "local";
268
+ logger.info(`Startup complete. Mode: ${mode}, State: ${config.COGENT_STATE_PATH}, Log level: ${config.COGENT_LOG_LEVEL}`);
269
+ }
270
+ //# sourceMappingURL=startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Register the cogent_create_session MCP tool.
4
+ *
5
+ * Creates a new cloud bridge session on the relay server.
6
+ * Only available when COGENT_ENDPOINT is configured.
7
+ * After creation, persists credentials locally and reinitializes
8
+ * the cloud backend so runtime HttpClient and CloudWsClient use
9
+ * the new token/sessionId.
10
+ */
11
+ export declare function registerCreateSessionTool(server: McpServer): void;
12
+ //# sourceMappingURL=create-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-session.d.ts","sourceRoot":"","sources":["../../src/tools/create-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwIjE"}
@@ -0,0 +1,113 @@
1
+ import crypto from "node:crypto";
2
+ import { z } from "zod";
3
+ import { getConfig } from "../config.js";
4
+ import { successResult, errorResult } from "../errors.js";
5
+ import { saveCredentials } from "../cloud/credential-store.js";
6
+ import { logger } from "../logger.js";
7
+ /**
8
+ * Register the cogent_create_session MCP tool.
9
+ *
10
+ * Creates a new cloud bridge session on the relay server.
11
+ * Only available when COGENT_ENDPOINT is configured.
12
+ * After creation, persists credentials locally and reinitializes
13
+ * the cloud backend so runtime HttpClient and CloudWsClient use
14
+ * the new token/sessionId.
15
+ */
16
+ export function registerCreateSessionTool(server) {
17
+ server.registerTool("cogent_create_session", {
18
+ title: "Create Cloud Session",
19
+ description: "Create a new cloud bridge session on the relay server. " +
20
+ "Returns session ID and secret for other peers to join. " +
21
+ "Only available when COGENT_ENDPOINT is configured.",
22
+ inputSchema: {
23
+ label: z
24
+ .string()
25
+ .optional()
26
+ .describe("Human-readable label for the session"),
27
+ secret: z
28
+ .string()
29
+ .min(8)
30
+ .optional()
31
+ .describe("Shared secret for session authentication (min 8 chars). " +
32
+ "Auto-generated if omitted."),
33
+ },
34
+ annotations: {
35
+ readOnlyHint: false,
36
+ destructiveHint: false,
37
+ idempotentHint: false,
38
+ openWorldHint: true,
39
+ },
40
+ }, async ({ label, secret }) => {
41
+ try {
42
+ const config = getConfig();
43
+ if (!config.COGENT_ENDPOINT) {
44
+ return errorResult(new Error("COGENT_ENDPOINT not configured. Set it to use cloud mode."));
45
+ }
46
+ // Generate secret if not provided (32 hex chars, well above min 8)
47
+ const sessionSecret = secret ?? crypto.randomBytes(16).toString("hex");
48
+ // POST to create session (unauthenticated endpoint -- no token yet)
49
+ const resp = await fetch(`${config.COGENT_ENDPOINT}/api/sessions`, {
50
+ method: "POST",
51
+ headers: { "Content-Type": "application/json" },
52
+ body: JSON.stringify({ secret: sessionSecret, label }),
53
+ });
54
+ if (!resp.ok) {
55
+ const body = await resp.text().catch(() => "");
56
+ return errorResult(new Error(`Failed to create session: HTTP ${resp.status}${body ? ` - ${body}` : ""}`));
57
+ }
58
+ const data = (await resp.json());
59
+ // Persist credentials locally
60
+ await saveCredentials({
61
+ endpoint: config.COGENT_ENDPOINT,
62
+ sessionId: data.sessionId,
63
+ token: data.token,
64
+ savedAt: new Date().toISOString(),
65
+ });
66
+ // Reinitialize cloud backend with new credentials.
67
+ // Uses dynamic import to avoid compile-time dependency on startup.ts
68
+ // (reinitCloudBackend is added in Plan 05). Cast to Record to avoid
69
+ // TS2339 since the export doesn't exist yet.
70
+ try {
71
+ const startupModule = (await import("../startup.js"));
72
+ if (typeof startupModule.reinitCloudBackend === "function") {
73
+ await startupModule.reinitCloudBackend(config.COGENT_ENDPOINT, data.sessionId, data.token);
74
+ logger.info("Cloud backend reinitialized with new session credentials");
75
+ }
76
+ }
77
+ catch (err) {
78
+ // reinitCloudBackend may not exist yet (Plan 05 adds it).
79
+ // Credentials are persisted, so a restart will pick them up.
80
+ logger.debug(`Backend reinit not available: ${err}`);
81
+ }
82
+ return successResult({
83
+ success: true,
84
+ sessionId: data.sessionId,
85
+ secret: sessionSecret,
86
+ token: data.token,
87
+ createdAt: data.createdAt,
88
+ config_snippet: {
89
+ env_vars: `COGENT_ENDPOINT=${config.COGENT_ENDPOINT}\n` +
90
+ `COGENT_SESSION_ID=${data.sessionId}\n` +
91
+ `COGENT_SECRET=${sessionSecret}`,
92
+ mcp_config: {
93
+ "cogent-bridge": {
94
+ command: "npx",
95
+ args: ["@essentialai/cogent-bridge"],
96
+ env: {
97
+ COGENT_ENDPOINT: config.COGENT_ENDPOINT,
98
+ COGENT_SESSION_ID: data.sessionId,
99
+ COGENT_SECRET: sessionSecret,
100
+ },
101
+ },
102
+ },
103
+ },
104
+ note: "Share the secret with peers who need to join. Credentials have been saved locally. Cloud backend updated.",
105
+ });
106
+ }
107
+ catch (err) {
108
+ logger.error("create-session failed", { error: err });
109
+ return errorResult(err);
110
+ }
111
+ });
112
+ }
113
+ //# sourceMappingURL=create-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../src/tools/create-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDeregisterPeerTool(server: McpServer): void;
3
+ //# sourceMappingURL=deregister-peer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deregister-peer.d.ts","sourceRoot":"","sources":["../../src/tools/deregister-peer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoClE"}
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ import { getBackend } from "../backend/index.js";
3
+ import { successResult, errorResult } from "../errors.js";
4
+ import { logger } from "../logger.js";
5
+ export function registerDeregisterPeerTool(server) {
6
+ server.registerTool("cogent_deregister_peer", {
7
+ title: "Deregister Peer",
8
+ description: "Remove a previously registered peer from the bridge. " +
9
+ "The peer will no longer be reachable for messaging.",
10
+ inputSchema: {
11
+ peerId: z
12
+ .string()
13
+ .describe("Peer ID to deregister, e.g. 'backend'"),
14
+ },
15
+ annotations: {
16
+ readOnlyHint: false,
17
+ destructiveHint: true,
18
+ idempotentHint: true,
19
+ openWorldHint: false,
20
+ },
21
+ }, async ({ peerId }) => {
22
+ try {
23
+ const backend = getBackend();
24
+ const removed = await backend.deregisterPeer(peerId);
25
+ return successResult({
26
+ success: removed,
27
+ message: removed
28
+ ? `Peer '${peerId}' deregistered`
29
+ : `Peer '${peerId}' was not registered`,
30
+ });
31
+ }
32
+ catch (err) {
33
+ logger.error("deregister-peer failed", { error: err });
34
+ return errorResult(err);
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=deregister-peer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deregister-peer.js","sourceRoot":"","sources":["../../src/tools/deregister-peer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,uDAAuD;YACvD,qDAAqD;QACvD,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,CAAC,uCAAuC,CAAC;SACrD;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACrD,OAAO,aAAa,CAAC;gBACnB,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,OAAO;oBACd,CAAC,CAAC,SAAS,MAAM,gBAAgB;oBACjC,CAAC,CAAC,SAAS,MAAM,sBAAsB;aAC1C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACvD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerGetHistoryTool(server: McpServer): void;
3
+ //# sourceMappingURL=get-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsC9D"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ import { getBackend } from "../backend/index.js";
3
+ import { successResult, errorResult } from "../errors.js";
4
+ import { logger } from "../logger.js";
5
+ export function registerGetHistoryTool(server) {
6
+ server.registerTool("cogent_get_history", {
7
+ title: "Get Message History",
8
+ description: "Retrieve the message history for the bridge. " +
9
+ "Optionally filter by a specific peer ID. " +
10
+ "Returns messages in chronological order, most recent last.",
11
+ inputSchema: {
12
+ peerId: z
13
+ .string()
14
+ .optional()
15
+ .describe("Optional peer ID to filter history for"),
16
+ limit: z
17
+ .number()
18
+ .optional()
19
+ .default(50)
20
+ .describe("Maximum number of messages to return (default 50)"),
21
+ },
22
+ annotations: {
23
+ readOnlyHint: true,
24
+ destructiveHint: false,
25
+ idempotentHint: true,
26
+ openWorldHint: false,
27
+ },
28
+ }, async ({ peerId, limit }) => {
29
+ try {
30
+ const backend = getBackend();
31
+ const messages = await backend.getHistory(peerId, limit);
32
+ return successResult({ messages, count: messages.length });
33
+ }
34
+ catch (err) {
35
+ logger.error("get-history failed", { error: err });
36
+ return errorResult(err);
37
+ }
38
+ });
39
+ }
40
+ //# sourceMappingURL=get-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-history.js","sourceRoot":"","sources":["../../src/tools/get-history.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,+CAA+C;YAC/C,2CAA2C;YAC3C,4DAA4D;QAC9D,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,wCAAwC,CAAC;YACrD,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,mDAAmD,CAAC;SACjE;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACzD,OAAO,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACnD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerHealthCheckTool(server: McpServer): void;
3
+ //# sourceMappingURL=health-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../src/tools/health-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6B/D"}
@@ -0,0 +1,28 @@
1
+ import { getBackend } from "../backend/index.js";
2
+ import { successResult, errorResult } from "../errors.js";
3
+ import { logger } from "../logger.js";
4
+ export function registerHealthCheckTool(server) {
5
+ server.registerTool("cogent_health_check", {
6
+ title: "Health Check",
7
+ description: "Diagnose the bridge's operational status. Checks state file accessibility, " +
8
+ "lock mechanism, and Claude CLI availability. Returns per-check pass/fail with details.",
9
+ inputSchema: {},
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ destructiveHint: false,
13
+ idempotentHint: true,
14
+ openWorldHint: false,
15
+ },
16
+ }, async () => {
17
+ try {
18
+ const backend = getBackend();
19
+ const result = await backend.checkHealth();
20
+ return successResult(JSON.parse(JSON.stringify(result)));
21
+ }
22
+ catch (err) {
23
+ logger.error("health-check failed", { error: err });
24
+ return errorResult(err);
25
+ }
26
+ });
27
+ }
28
+ //# sourceMappingURL=health-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../src/tools/health-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,6EAA6E;YAC7E,wFAAwF;QAC1F,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAC3C,OAAO,aAAa,CAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAA4B,CAC9D,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACpD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /**
3
+ * Register the cogent_join_session MCP tool.
4
+ *
5
+ * Joins an existing cloud bridge session using a session ID and shared secret.
6
+ * Only available when COGENT_ENDPOINT is configured.
7
+ * After joining, persists credentials locally and reinitializes
8
+ * the cloud backend so runtime HttpClient and CloudWsClient use
9
+ * the new token/sessionId.
10
+ */
11
+ export declare function registerJoinSessionTool(server: McpServer): void;
12
+ //# sourceMappingURL=join-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-session.d.ts","sourceRoot":"","sources":["../../src/tools/join-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6G/D"}