@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.
- package/LICENSE +15 -0
- package/README.md +311 -0
- package/dist/backend/backend-provider.d.ts +28 -0
- package/dist/backend/backend-provider.d.ts.map +1 -0
- package/dist/backend/backend-provider.js +60 -0
- package/dist/backend/backend-provider.js.map +1 -0
- package/dist/backend/file-backend.d.ts +22 -0
- package/dist/backend/file-backend.d.ts.map +1 -0
- package/dist/backend/file-backend.js +46 -0
- package/dist/backend/file-backend.js.map +1 -0
- package/dist/backend/http-backend.d.ts +94 -0
- package/dist/backend/http-backend.d.ts.map +1 -0
- package/dist/backend/http-backend.js +185 -0
- package/dist/backend/http-backend.js.map +1 -0
- package/dist/backend/index.d.ts +5 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +4 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/storage-backend.d.ts +22 -0
- package/dist/backend/storage-backend.d.ts.map +1 -0
- package/dist/backend/storage-backend.js +2 -0
- package/dist/backend/storage-backend.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud/backoff.d.ts +19 -0
- package/dist/cloud/backoff.d.ts.map +1 -0
- package/dist/cloud/backoff.js +32 -0
- package/dist/cloud/backoff.js.map +1 -0
- package/dist/cloud/credential-store.d.ts +29 -0
- package/dist/cloud/credential-store.d.ts.map +1 -0
- package/dist/cloud/credential-store.js +38 -0
- package/dist/cloud/credential-store.js.map +1 -0
- package/dist/cloud/http-client.d.ts +36 -0
- package/dist/cloud/http-client.d.ts.map +1 -0
- package/dist/cloud/http-client.js +94 -0
- package/dist/cloud/http-client.js.map +1 -0
- package/dist/cloud/index.d.ts +10 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +7 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/message-inbox.d.ts +49 -0
- package/dist/cloud/message-inbox.d.ts.map +1 -0
- package/dist/cloud/message-inbox.js +109 -0
- package/dist/cloud/message-inbox.js.map +1 -0
- package/dist/cloud/ws-client.d.ts +112 -0
- package/dist/cloud/ws-client.d.ts.map +1 -0
- package/dist/cloud/ws-client.js +241 -0
- package/dist/cloud/ws-client.js.map +1 -0
- package/dist/cloud/ws-frames.d.ts +66 -0
- package/dist/cloud/ws-frames.d.ts.map +1 -0
- package/dist/cloud/ws-frames.js +19 -0
- package/dist/cloud/ws-frames.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/e2e/helpers.d.ts +101 -0
- package/dist/e2e/helpers.d.ts.map +1 -0
- package/dist/e2e/helpers.js +228 -0
- package/dist/e2e/helpers.js.map +1 -0
- package/dist/errors.d.ts +40 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +53 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +79 -0
- package/dist/logger.js.map +1 -0
- package/dist/services/cc-cli.d.ts +8 -0
- package/dist/services/cc-cli.d.ts.map +1 -0
- package/dist/services/cc-cli.js +104 -0
- package/dist/services/cc-cli.js.map +1 -0
- package/dist/services/health-check.d.ts +33 -0
- package/dist/services/health-check.d.ts.map +1 -0
- package/dist/services/health-check.js +96 -0
- package/dist/services/health-check.js.map +1 -0
- package/dist/services/peer-registry.d.ts +9 -0
- package/dist/services/peer-registry.d.ts.map +1 -0
- package/dist/services/peer-registry.js +207 -0
- package/dist/services/peer-registry.js.map +1 -0
- package/dist/startup.d.ts +18 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +270 -0
- package/dist/startup.js.map +1 -0
- package/dist/tools/create-session.d.ts +12 -0
- package/dist/tools/create-session.d.ts.map +1 -0
- package/dist/tools/create-session.js +113 -0
- package/dist/tools/create-session.js.map +1 -0
- package/dist/tools/deregister-peer.d.ts +3 -0
- package/dist/tools/deregister-peer.d.ts.map +1 -0
- package/dist/tools/deregister-peer.js +38 -0
- package/dist/tools/deregister-peer.js.map +1 -0
- package/dist/tools/get-history.d.ts +3 -0
- package/dist/tools/get-history.d.ts.map +1 -0
- package/dist/tools/get-history.js +40 -0
- package/dist/tools/get-history.js.map +1 -0
- package/dist/tools/health-check.d.ts +3 -0
- package/dist/tools/health-check.d.ts.map +1 -0
- package/dist/tools/health-check.js +28 -0
- package/dist/tools/health-check.js.map +1 -0
- package/dist/tools/join-session.d.ts +12 -0
- package/dist/tools/join-session.d.ts.map +1 -0
- package/dist/tools/join-session.js +90 -0
- package/dist/tools/join-session.js.map +1 -0
- package/dist/tools/list-peers.d.ts +3 -0
- package/dist/tools/list-peers.d.ts.map +1 -0
- package/dist/tools/list-peers.js +36 -0
- package/dist/tools/list-peers.js.map +1 -0
- package/dist/tools/register-peer.d.ts +3 -0
- package/dist/tools/register-peer.d.ts.map +1 -0
- package/dist/tools/register-peer.js +155 -0
- package/dist/tools/register-peer.js.map +1 -0
- package/dist/tools/send-message.d.ts +3 -0
- package/dist/tools/send-message.d.ts.map +1 -0
- package/dist/tools/send-message.js +121 -0
- package/dist/tools/send-message.js.map +1 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/wizard/detect.d.ts +4 -0
- package/dist/wizard/detect.d.ts.map +1 -0
- package/dist/wizard/detect.js +21 -0
- package/dist/wizard/detect.js.map +1 -0
- package/dist/wizard/index.d.ts +5 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +140 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/wizard/prompts.d.ts +18 -0
- package/dist/wizard/prompts.d.ts.map +1 -0
- package/dist/wizard/prompts.js +66 -0
- package/dist/wizard/prompts.js.map +1 -0
- package/dist/wizard/scaffold-demo.d.ts +6 -0
- package/dist/wizard/scaffold-demo.d.ts.map +1 -0
- package/dist/wizard/scaffold-demo.js +37 -0
- package/dist/wizard/scaffold-demo.js.map +1 -0
- package/dist/wizard/scaffold-real.d.ts +16 -0
- package/dist/wizard/scaffold-real.d.ts.map +1 -0
- package/dist/wizard/scaffold-real.js +64 -0
- package/dist/wizard/scaffold-real.js.map +1 -0
- package/dist/wizard/templates.d.ts +9 -0
- package/dist/wizard/templates.d.ts.map +1 -0
- package/dist/wizard/templates.js +182 -0
- package/dist/wizard/templates.js.map +1 -0
- package/package.json +71 -0
- package/server.json +60 -0
package/dist/startup.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|