alaska-ai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -0
- package/dist/adapters/slack.d.ts +130 -0
- package/dist/adapters/slack.js +1484 -0
- package/dist/adapters/slack.js.map +1 -0
- package/dist/backends/claude.d.ts +78 -0
- package/dist/backends/claude.js +452 -0
- package/dist/backends/claude.js.map +1 -0
- package/dist/backends/codex.d.ts +53 -0
- package/dist/backends/codex.js +324 -0
- package/dist/backends/codex.js.map +1 -0
- package/dist/cli/init.d.ts +50 -0
- package/dist/cli/init.js +386 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/prompt.d.ts +31 -0
- package/dist/cli/prompt.js +145 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/start.d.ts +28 -0
- package/dist/cli/start.js +522 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +65 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/callbacks.d.ts +32 -0
- package/dist/mcp/callbacks.js +181 -0
- package/dist/mcp/callbacks.js.map +1 -0
- package/dist/mcp/config.d.ts +15 -0
- package/dist/mcp/config.js +22 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/entry.d.ts +13 -0
- package/dist/mcp/entry.js +119 -0
- package/dist/mcp/entry.js.map +1 -0
- package/dist/mcp/file-browser.d.ts +15 -0
- package/dist/mcp/file-browser.js +135 -0
- package/dist/mcp/file-browser.js.map +1 -0
- package/dist/mcp/ipc-server.d.ts +64 -0
- package/dist/mcp/ipc-server.js +380 -0
- package/dist/mcp/ipc-server.js.map +1 -0
- package/dist/mcp/preview-server.d.ts +33 -0
- package/dist/mcp/preview-server.js +254 -0
- package/dist/mcp/preview-server.js.map +1 -0
- package/dist/mcp/server.d.ts +51 -0
- package/dist/mcp/server.js +257 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tunnel.d.ts +17 -0
- package/dist/mcp/tunnel.js +154 -0
- package/dist/mcp/tunnel.js.map +1 -0
- package/dist/router.d.ts +113 -0
- package/dist/router.js +511 -0
- package/dist/router.js.map +1 -0
- package/dist/sandbox-policy.d.ts +6 -0
- package/dist/sandbox-policy.js +46 -0
- package/dist/sandbox-policy.js.map +1 -0
- package/dist/scheduler.d.ts +42 -0
- package/dist/scheduler.js +169 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/store.d.ts +95 -0
- package/dist/store.js +353 -0
- package/dist/store.js.map +1 -0
- package/dist/types/adapter.d.ts +50 -0
- package/dist/types/adapter.js +9 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/types/backend.d.ts +73 -0
- package/dist/types/backend.js +8 -0
- package/dist/types/backend.js.map +1 -0
- package/dist/types/events.d.ts +47 -0
- package/dist/types/events.js +9 -0
- package/dist/types/events.js.map +1 -0
- package/dist/utils.d.ts +59 -0
- package/dist/utils.js +272 -0
- package/dist/utils.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local HTTP IPC server for MCP callback communication.
|
|
3
|
+
*
|
|
4
|
+
* The bridge starts this on 127.0.0.1:0 (random port). The MCP entry
|
|
5
|
+
* script (grandchild process) makes fetch() calls to it when the agent
|
|
6
|
+
* invokes MCP tools like upload_file or preview_server.
|
|
7
|
+
*
|
|
8
|
+
* Auth: every request must include the ALASKA_IPC_SECRET header.
|
|
9
|
+
*/
|
|
10
|
+
import * as http from 'node:http';
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
12
|
+
/** In-memory store for pending permission requests. */
|
|
13
|
+
const pendingPermissions = new Map();
|
|
14
|
+
/** In-memory store for pending user questions. */
|
|
15
|
+
const pendingQuestions = new Map();
|
|
16
|
+
/** Index: threadId → requestId for resolving questions by thread (typed responses). */
|
|
17
|
+
const questionsByThread = new Map();
|
|
18
|
+
/** Stale entry cleanup interval (10 minutes). */
|
|
19
|
+
const STALE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
20
|
+
/** Resolve a pending permission request (called by adapters in-process). */
|
|
21
|
+
export function resolvePermission(requestId, decision) {
|
|
22
|
+
const entry = pendingPermissions.get(requestId);
|
|
23
|
+
if (!entry)
|
|
24
|
+
return false;
|
|
25
|
+
entry.decision = decision;
|
|
26
|
+
for (const resolver of entry.resolvers) {
|
|
27
|
+
resolver(decision);
|
|
28
|
+
}
|
|
29
|
+
entry.resolvers = [];
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
/** Resolve a pending user question (called by adapters in-process). */
|
|
33
|
+
export function resolveUserQuestion(requestId, answer) {
|
|
34
|
+
const entry = pendingQuestions.get(requestId);
|
|
35
|
+
if (!entry)
|
|
36
|
+
return false;
|
|
37
|
+
entry.answer = answer;
|
|
38
|
+
for (const resolver of entry.resolvers) {
|
|
39
|
+
resolver(answer);
|
|
40
|
+
}
|
|
41
|
+
entry.resolvers = [];
|
|
42
|
+
// Clean up thread index
|
|
43
|
+
for (const [tid, rid] of questionsByThread) {
|
|
44
|
+
if (rid === requestId) {
|
|
45
|
+
questionsByThread.delete(tid);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
/** Resolve a pending user question by thread ID (called when user types instead of clicking).
|
|
52
|
+
* Returns the requestId if resolved, null otherwise (so caller can update the button message). */
|
|
53
|
+
export function resolveQuestionByThread(threadId, answer) {
|
|
54
|
+
const requestId = questionsByThread.get(threadId);
|
|
55
|
+
if (!requestId)
|
|
56
|
+
return null;
|
|
57
|
+
const resolved = resolveUserQuestion(requestId, answer);
|
|
58
|
+
return resolved ? requestId : null;
|
|
59
|
+
}
|
|
60
|
+
/** Check if a thread has a pending user question. */
|
|
61
|
+
export function hasPendingQuestion(threadId) {
|
|
62
|
+
return questionsByThread.has(threadId);
|
|
63
|
+
}
|
|
64
|
+
/** Clean up stale permission and question entries older than STALE_TIMEOUT_MS. */
|
|
65
|
+
function cleanupStaleEntries() {
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
for (const [id, entry] of pendingPermissions) {
|
|
68
|
+
if (now - entry.createdAt > STALE_TIMEOUT_MS) {
|
|
69
|
+
console.warn(`[ipc] auto-denying stale permission request ${id} (age: ${Math.round((now - entry.createdAt) / 1000)}s)`);
|
|
70
|
+
for (const resolver of entry.resolvers) {
|
|
71
|
+
resolver('deny');
|
|
72
|
+
}
|
|
73
|
+
pendingPermissions.delete(id);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const [id, entry] of pendingQuestions) {
|
|
77
|
+
if (now - entry.createdAt > STALE_TIMEOUT_MS) {
|
|
78
|
+
console.warn(`[ipc] expiring stale question ${id} (age: ${Math.round((now - entry.createdAt) / 1000)}s)`);
|
|
79
|
+
// Don't resolve with a value — let the poller time out naturally
|
|
80
|
+
pendingQuestions.delete(id);
|
|
81
|
+
// Clean up thread index
|
|
82
|
+
for (const [tid, rid] of questionsByThread) {
|
|
83
|
+
if (rid === id) {
|
|
84
|
+
questionsByThread.delete(tid);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Read the full request body as a string. */
|
|
92
|
+
function readBody(req) {
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
const chunks = [];
|
|
95
|
+
req.on('data', (chunk) => chunks.push(chunk));
|
|
96
|
+
req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
|
|
97
|
+
req.on('error', reject);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Start the IPC server on localhost with a random port.
|
|
102
|
+
* Returns the port, secret, and a close function.
|
|
103
|
+
*/
|
|
104
|
+
export function startIpcServer(handler) {
|
|
105
|
+
const secret = randomUUID();
|
|
106
|
+
const server = http.createServer(async (req, res) => {
|
|
107
|
+
// Auth check
|
|
108
|
+
const authHeader = req.headers['x-alaska-secret'];
|
|
109
|
+
if (authHeader !== secret) {
|
|
110
|
+
res.writeHead(401, { 'Content-Type': 'application/json' });
|
|
111
|
+
res.end(JSON.stringify({ error: 'Unauthorized' }));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Only accept POST
|
|
115
|
+
if (req.method !== 'POST') {
|
|
116
|
+
res.writeHead(405, { 'Content-Type': 'application/json' });
|
|
117
|
+
res.end(JSON.stringify({ error: 'Method not allowed' }));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const body = await readBody(req);
|
|
121
|
+
let data;
|
|
122
|
+
try {
|
|
123
|
+
data = JSON.parse(body);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
127
|
+
res.end(JSON.stringify({ error: 'Invalid JSON' }));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
switch (req.url) {
|
|
132
|
+
case '/upload-file': {
|
|
133
|
+
const { channelId, threadId, filePath, platform } = data;
|
|
134
|
+
await handler.uploadFile(channelId, threadId, filePath, platform);
|
|
135
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
136
|
+
res.end(JSON.stringify({ ok: true }));
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case '/open-tunnel': {
|
|
140
|
+
const { port, ttl } = data;
|
|
141
|
+
const url = await handler.openTunnel(port, ttl);
|
|
142
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
143
|
+
res.end(JSON.stringify({ ok: true, url }));
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
case '/serve-file-browser': {
|
|
147
|
+
const { directory } = data;
|
|
148
|
+
const url = await handler.serveFileBrowser(directory);
|
|
149
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
150
|
+
res.end(JSON.stringify({ ok: true, url }));
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case '/preview-server': {
|
|
154
|
+
const { directory, command, ttl } = data;
|
|
155
|
+
const result = await handler.previewServer(directory, command ?? undefined, ttl);
|
|
156
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
157
|
+
res.end(JSON.stringify({ ok: true, url: result.url, port: result.port }));
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
case '/post-message': {
|
|
161
|
+
const { channelId, threadId, text, platform } = data;
|
|
162
|
+
await handler.postMessage(channelId, threadId, text, platform);
|
|
163
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
164
|
+
res.end(JSON.stringify({ ok: true }));
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
case '/permission-request': {
|
|
168
|
+
const { channelId, threadId, toolName, toolInput, platform } = data;
|
|
169
|
+
const requestId = randomUUID();
|
|
170
|
+
pendingPermissions.set(requestId, {
|
|
171
|
+
decision: null,
|
|
172
|
+
resolvers: [],
|
|
173
|
+
createdAt: Date.now(),
|
|
174
|
+
});
|
|
175
|
+
console.log(`[ipc] permission-request: ${toolName} (${requestId})`);
|
|
176
|
+
// Notify adapter to show Allow/Deny buttons
|
|
177
|
+
if (handler.requestPermission) {
|
|
178
|
+
try {
|
|
179
|
+
await handler.requestPermission(channelId, threadId, toolName, toolInput, platform, requestId);
|
|
180
|
+
}
|
|
181
|
+
catch (renderErr) {
|
|
182
|
+
const msg = renderErr instanceof Error ? renderErr.message : String(renderErr);
|
|
183
|
+
console.error(`[ipc] failed to render permission prompt: ${msg}`);
|
|
184
|
+
// Best-effort: surface the error in chat so the user sees it
|
|
185
|
+
try {
|
|
186
|
+
await handler.postMessage(channelId, threadId, `⚠️ Failed to render permission prompt for \`${toolName}\`: ${msg}`, platform);
|
|
187
|
+
}
|
|
188
|
+
catch { /* don't mask the original error */ }
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
192
|
+
res.end(JSON.stringify({ ok: true, requestId }));
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
case '/permission-poll': {
|
|
196
|
+
const { requestId } = data;
|
|
197
|
+
cleanupStaleEntries();
|
|
198
|
+
const entry = pendingPermissions.get(requestId);
|
|
199
|
+
if (!entry) {
|
|
200
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
201
|
+
res.end(JSON.stringify({ status: 'expired' }));
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
if (entry.decision) {
|
|
205
|
+
// Already resolved — return immediately
|
|
206
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
207
|
+
res.end(JSON.stringify({ status: 'resolved', decision: entry.decision }));
|
|
208
|
+
pendingPermissions.delete(requestId);
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
// Long-poll: wait up to 5 seconds for a decision
|
|
212
|
+
const decision = await new Promise((resolve) => {
|
|
213
|
+
const timeout = setTimeout(() => resolve('pending'), 5000);
|
|
214
|
+
entry.resolvers.push((d) => {
|
|
215
|
+
clearTimeout(timeout);
|
|
216
|
+
resolve(d);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
if (decision === 'pending') {
|
|
220
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
221
|
+
res.end(JSON.stringify({ status: 'pending' }));
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
225
|
+
res.end(JSON.stringify({ status: 'resolved', decision }));
|
|
226
|
+
pendingPermissions.delete(requestId);
|
|
227
|
+
}
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
case '/permission-resolve': {
|
|
231
|
+
const { requestId: resolveId, decision: resolveDecision } = data;
|
|
232
|
+
const resolved = resolvePermission(resolveId, resolveDecision);
|
|
233
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
234
|
+
res.end(JSON.stringify({ ok: resolved }));
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
case '/ask-user-question': {
|
|
238
|
+
const { channelId, threadId, questions, platform } = data;
|
|
239
|
+
const requestId = randomUUID();
|
|
240
|
+
pendingQuestions.set(requestId, {
|
|
241
|
+
answer: null,
|
|
242
|
+
resolvers: [],
|
|
243
|
+
createdAt: Date.now(),
|
|
244
|
+
});
|
|
245
|
+
questionsByThread.set(threadId, requestId);
|
|
246
|
+
console.log(`[ipc] ask-user-question (${requestId}) for thread ${threadId}`);
|
|
247
|
+
if (handler.askUserQuestion) {
|
|
248
|
+
try {
|
|
249
|
+
await handler.askUserQuestion(channelId, threadId, questions, platform, requestId);
|
|
250
|
+
}
|
|
251
|
+
catch (renderErr) {
|
|
252
|
+
const msg = renderErr instanceof Error ? renderErr.message : String(renderErr);
|
|
253
|
+
console.error(`[ipc] failed to render user question: ${msg}`);
|
|
254
|
+
try {
|
|
255
|
+
await handler.postMessage(channelId, threadId, `⚠️ Failed to render question buttons: ${msg}`, platform);
|
|
256
|
+
}
|
|
257
|
+
catch { /* don't mask the original error */ }
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
261
|
+
res.end(JSON.stringify({ ok: true, requestId }));
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
case '/question-poll': {
|
|
265
|
+
const { requestId } = data;
|
|
266
|
+
cleanupStaleEntries();
|
|
267
|
+
const entry = pendingQuestions.get(requestId);
|
|
268
|
+
if (!entry) {
|
|
269
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
270
|
+
res.end(JSON.stringify({ status: 'expired' }));
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
if (entry.answer) {
|
|
274
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
275
|
+
res.end(JSON.stringify({ status: 'resolved', answer: entry.answer }));
|
|
276
|
+
pendingQuestions.delete(requestId);
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
// Long-poll: wait up to 5 seconds for an answer
|
|
280
|
+
const answer = await new Promise((resolve) => {
|
|
281
|
+
const timeout = setTimeout(() => resolve('pending'), 5000);
|
|
282
|
+
entry.resolvers.push((a) => {
|
|
283
|
+
clearTimeout(timeout);
|
|
284
|
+
resolve(a);
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
if (answer === 'pending') {
|
|
288
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
289
|
+
res.end(JSON.stringify({ status: 'pending' }));
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
293
|
+
res.end(JSON.stringify({ status: 'resolved', answer }));
|
|
294
|
+
pendingQuestions.delete(requestId);
|
|
295
|
+
}
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
case '/question-resolve': {
|
|
299
|
+
const { requestId: resolveId, answer: resolveAnswer } = data;
|
|
300
|
+
const resolved = resolveUserQuestion(resolveId, resolveAnswer);
|
|
301
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
302
|
+
res.end(JSON.stringify({ ok: resolved }));
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
case '/save-uploaded-file': {
|
|
306
|
+
const { uploadId, destination, projectDir } = data;
|
|
307
|
+
if (!handler.saveUploadedFile) {
|
|
308
|
+
res.writeHead(501, { 'Content-Type': 'application/json' });
|
|
309
|
+
res.end(JSON.stringify({ error: 'saveUploadedFile not implemented' }));
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
const savedPath = await handler.saveUploadedFile(uploadId, destination, projectDir);
|
|
313
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
314
|
+
res.end(JSON.stringify({ ok: true, path: savedPath }));
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case '/render-todos': {
|
|
318
|
+
const { channelId, threadId, todos, platform } = data;
|
|
319
|
+
console.log(`[ipc] render-todos for thread ${threadId} (${todos.length} items)`);
|
|
320
|
+
if (handler.renderTodos) {
|
|
321
|
+
try {
|
|
322
|
+
await handler.renderTodos(channelId, threadId, todos, platform);
|
|
323
|
+
}
|
|
324
|
+
catch (renderErr) {
|
|
325
|
+
const msg = renderErr instanceof Error ? renderErr.message : String(renderErr);
|
|
326
|
+
console.error(`[ipc] failed to render todos: ${msg}`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
330
|
+
res.end(JSON.stringify({ ok: true }));
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
case '/schedule-session': {
|
|
334
|
+
const { channelId, threadId, prompt, originalRequest, cronExpression, scheduledAt, title } = data;
|
|
335
|
+
if (!handler.scheduleSession) {
|
|
336
|
+
res.writeHead(501, { 'Content-Type': 'application/json' });
|
|
337
|
+
res.end(JSON.stringify({ error: 'scheduleSession not implemented' }));
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
const result = await handler.scheduleSession(channelId, threadId, prompt, originalRequest, cronExpression, scheduledAt, title);
|
|
341
|
+
console.log(`[ipc] schedule-session created: ${result.scheduleId}`);
|
|
342
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
343
|
+
res.end(JSON.stringify({ ok: true, scheduleId: result.scheduleId }));
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
default:
|
|
347
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
348
|
+
res.end(JSON.stringify({ error: 'Not found' }));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
353
|
+
console.error('[ipc] handler error:', message);
|
|
354
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
355
|
+
res.end(JSON.stringify({ error: message }));
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
return new Promise((resolve, reject) => {
|
|
359
|
+
server.listen(0, '127.0.0.1', () => {
|
|
360
|
+
const addr = server.address();
|
|
361
|
+
if (!addr || typeof addr === 'string') {
|
|
362
|
+
reject(new Error('Failed to get server address'));
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
const port = addr.port;
|
|
366
|
+
console.log(`[ipc] server listening on 127.0.0.1:${port}`);
|
|
367
|
+
resolve({
|
|
368
|
+
port,
|
|
369
|
+
secret,
|
|
370
|
+
close() {
|
|
371
|
+
return new Promise((res, rej) => {
|
|
372
|
+
server.close((err) => (err ? rej(err) : res()));
|
|
373
|
+
});
|
|
374
|
+
},
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
server.on('error', reject);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=ipc-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-server.js","sourceRoot":"","sources":["../../src/mcp/ipc-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview server manager — starts a local server and tunnels it.
|
|
3
|
+
*
|
|
4
|
+
* Consolidates the "start server + open tunnel" flow into one operation:
|
|
5
|
+
* 1. Find a free port
|
|
6
|
+
* 2. Start a server (built-in static or user command)
|
|
7
|
+
* 3. Wait for the server to respond
|
|
8
|
+
* 4. Open a tunnel to expose it publicly
|
|
9
|
+
*
|
|
10
|
+
* This prevents port collisions and silent failures that occur when
|
|
11
|
+
* the AI agent tries to background servers manually.
|
|
12
|
+
*/
|
|
13
|
+
export interface PreviewServer {
|
|
14
|
+
/** Public tunnel URL. */
|
|
15
|
+
url: string;
|
|
16
|
+
/** Local port the server is running on. */
|
|
17
|
+
port: number;
|
|
18
|
+
/** Shut down the server and tunnel. */
|
|
19
|
+
close(): void;
|
|
20
|
+
}
|
|
21
|
+
/** Find a free port by briefly binding to port 0. */
|
|
22
|
+
export declare function findFreePort(): Promise<number>;
|
|
23
|
+
/**
|
|
24
|
+
* Start a preview server and tunnel it.
|
|
25
|
+
*
|
|
26
|
+
* @param directory - The directory to serve (absolute path).
|
|
27
|
+
* @param command - Optional shell command to run instead of built-in static server.
|
|
28
|
+
* PORT env var is injected automatically.
|
|
29
|
+
* @param ttl - Tunnel time-to-live in seconds.
|
|
30
|
+
*/
|
|
31
|
+
export declare function startPreviewServer(directory: string, command: string | undefined, ttl: number): Promise<PreviewServer>;
|
|
32
|
+
/** Close all active preview servers. Called during shutdown. */
|
|
33
|
+
export declare function closeAllPreviews(): void;
|