dsh-super-code 0.3.7 → 0.3.8

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 (47) hide show
  1. package/README.md +14 -10
  2. package/client/index.js +576 -24
  3. package/cordis.patch.yml +1 -1
  4. package/docs/Changelog.md +9 -0
  5. package/docs/Compatibility.md +30 -0
  6. package/docs/UsageGuide.md +60 -0
  7. package/lib/connection/directories.d.ts +30 -0
  8. package/lib/connection/directories.d.ts.map +1 -0
  9. package/lib/connection/directories.js +82 -0
  10. package/lib/connection/directories.js.map +1 -0
  11. package/lib/connection/git.d.ts +5 -0
  12. package/lib/connection/git.d.ts.map +1 -0
  13. package/lib/connection/git.js +86 -0
  14. package/lib/connection/git.js.map +1 -0
  15. package/lib/connection/http.d.ts +38 -0
  16. package/lib/connection/http.d.ts.map +1 -0
  17. package/lib/connection/http.js +275 -0
  18. package/lib/connection/http.js.map +1 -0
  19. package/lib/connection/service.d.ts +57 -0
  20. package/lib/connection/service.d.ts.map +1 -0
  21. package/lib/connection/service.js +168 -0
  22. package/lib/connection/service.js.map +1 -0
  23. package/lib/connection/store.d.ts +21 -0
  24. package/lib/connection/store.d.ts.map +1 -0
  25. package/lib/connection/store.js +139 -0
  26. package/lib/connection/store.js.map +1 -0
  27. package/lib/connection/tasks.d.ts +84 -0
  28. package/lib/connection/tasks.d.ts.map +1 -0
  29. package/lib/connection/tasks.js +270 -0
  30. package/lib/connection/tasks.js.map +1 -0
  31. package/lib/connection/types.d.ts +90 -0
  32. package/lib/connection/types.d.ts.map +1 -0
  33. package/lib/connection/types.js +21 -0
  34. package/lib/connection/types.js.map +1 -0
  35. package/lib/dsh/connection-host.d.ts +81 -0
  36. package/lib/dsh/connection-host.d.ts.map +1 -0
  37. package/lib/dsh/connection-host.js +130 -0
  38. package/lib/dsh/connection-host.js.map +1 -0
  39. package/lib/dsh/connection.d.ts +72 -0
  40. package/lib/dsh/connection.d.ts.map +1 -0
  41. package/lib/dsh/connection.js +183 -0
  42. package/lib/dsh/connection.js.map +1 -0
  43. package/lib/dsh/index.d.ts.map +1 -1
  44. package/lib/dsh/index.js +2 -0
  45. package/lib/dsh/index.js.map +1 -1
  46. package/package.json +7 -6
  47. package/presets/super-code/agent.cordis.yml +1 -1
@@ -0,0 +1,275 @@
1
+ /** Local Streamable HTTP boundary. Authentication precedes body parsing and MCP dispatch. */
2
+ import { createServer } from 'node:http';
3
+ import { timingSafeEqual, randomUUID } from 'node:crypto';
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
6
+ import { z } from 'zod';
7
+ import { pluginVersion } from '../dsh/preset-version.js';
8
+ import { ConnectionError } from './types.js';
9
+ const identity = z.string().min(1).max(128).regex(/^[a-zA-Z0-9_.:-]+$/);
10
+ const prompt = z.string().trim().min(1).max(32000);
11
+ const cursor = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).default(0);
12
+ const waitMs = z.number().int().min(0).max(30000).default(0);
13
+ export function delegationMcpServer(tasks, signal, connectionId = '', requestDirectory, clientName = () => 'mcp', connectionStatus = () => ({ connections: connectionId ? 1 : 0, maxConnections: 1, ids: connectionId ? [connectionId] : [] })) {
14
+ const server = new McpServer({ name: 'dsh-super-code', version: pluginVersion }, { maxToolInputElements: 64 });
15
+ const result = async (run) => {
16
+ try {
17
+ return { content: [{ type: 'text', text: JSON.stringify(await run()) }] };
18
+ }
19
+ catch (error) {
20
+ return { isError: true, content: [{ type: 'text', text: error instanceof ConnectionError ? error.code : 'operation-unavailable' }] };
21
+ }
22
+ };
23
+ server.registerTool('dsh_sessions', { description: 'List recent DSH conversations for an allowed working directory before choosing dsh_run. Each entry includes taskId, status, reuse availability and linked connection count; the response also includes current/max/available MCP connections and active/available task slots. Pass a listed taskId to dsh_run to reuse that conversation, or set newConversation=true to create a new root.',
24
+ inputSchema: z.object({ cwd: z.string().min(1).max(4096), limit: z.number().int().min(1).max(25).default(10) }).strict(),
25
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
26
+ }, input => result(() => tasks.sessions(input.cwd, input.limit, connectionStatus())));
27
+ server.registerTool('dsh_run', { description: 'Delegate to DSH Super Code. Call dsh_sessions first and let the user choose a history entry. Pass taskId to reuse an exact conversation, or set newConversation=true to explicitly create a new root session. If neither is provided, a new root is created for backward compatibility. Use a stable requestId for retries; conflicts do not dispatch. DSH permissions apply independently of the caller sandbox. A finished turn is not verified acceptance.',
28
+ inputSchema: z.object({ requestId: identity, cwd: z.string().min(1).max(4096), prompt, client: z.string().min(1).max(80).optional(), taskId: identity.optional(), newConversation: z.boolean().optional() }).strict(),
29
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
30
+ }, input => result(() => {
31
+ if (input.taskId) {
32
+ if (input.newConversation)
33
+ throw new ConnectionError('conflicting-session-options');
34
+ return tasks.send({ taskId: input.taskId, requestId: input.requestId, cwd: input.cwd, prompt: input.prompt, connectionId });
35
+ }
36
+ return tasks.run({ requestId: input.requestId, cwd: input.cwd, prompt: input.prompt, client: input.client ?? clientName(), connectionId });
37
+ }));
38
+ server.registerTool('dsh_wait', { description: 'Omit taskId to list service-owned tasks (cursor is a list offset). With taskId, read bounded output, workspace observations and events after cursor. Long-poll up to 30 seconds; timeout/disconnect never cancels execution. waiting_confirmation must be resolved in DSH. finished means execution ended, not acceptance verified.',
39
+ inputSchema: z.object({ taskId: identity.optional(), cursor, waitMs }).strict(),
40
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
41
+ }, (input, extra) => result(() => input.taskId ? tasks.wait(input.taskId, input.cursor, input.waitMs, signal(extra.requestId)) : tasks.list(input.cursor)));
42
+ server.registerTool('dsh_send', { description: 'Explicitly queue a follow-up in a service-owned root session, including after an interruption. Use a new stable requestId for each follow-up. An ambiguous admission is never automatically resent. Does not approve host permissions.',
43
+ inputSchema: z.object({ taskId: identity, requestId: identity, prompt }).strict(),
44
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
45
+ }, input => result(() => tasks.send({ ...input, connectionId })));
46
+ server.registerTool('dsh_cancel', { description: 'Request cancellation of a service-owned root and its managed descendants. Check the returned status; cancelling/unavailable do not confirm that all execution stopped. Already accepted external side effects cannot be undone.',
47
+ inputSchema: z.object({ taskId: identity }).strict(),
48
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
49
+ }, input => result(() => tasks.cancel(input.taskId)));
50
+ server.registerTool('dsh_request_directory', { description: 'Request access to an existing absolute directory (including its descendants). DSH displays a consent dialog; only the user can approve. Repeat the same requestId, path and reason to poll. Pending requests expire after 5 minutes and are discarded on host restart. Rejection is final for that requestId. Never assume access before approved.',
51
+ inputSchema: z.object({ requestId: identity, path: z.string().min(1).max(4096), reason: z.string().trim().min(1).max(1000) }).strict(),
52
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
53
+ }, input => result(() => { if (!requestDirectory)
54
+ throw new ConnectionError('unavailable'); return requestDirectory(input); }));
55
+ return server;
56
+ }
57
+ function reply(res, code, message) {
58
+ res.writeHead(code, { 'Content-Type': 'text/plain; charset=utf-8', 'Cache-Control': 'no-store' });
59
+ res.end(message);
60
+ }
61
+ function authorized(req, token) {
62
+ const actual = Buffer.from(req.headers.authorization ?? ''), expected = Buffer.from(`Bearer ${token}`);
63
+ return actual.length === expected.length && timingSafeEqual(actual, expected);
64
+ }
65
+ /** MCP sessions, rather than TCP sockets or individual HTTP requests, define a connection. */
66
+ export class ConnectionHttp {
67
+ tasks;
68
+ requestDirectory;
69
+ server = false;
70
+ requests = 0;
71
+ clients = new Map();
72
+ pending = new Set();
73
+ timer = false;
74
+ constructor(tasks, requestDirectory = undefined) {
75
+ this.tasks = tasks;
76
+ this.requestDirectory = requestDirectory;
77
+ }
78
+ connections() {
79
+ return [...this.clients.values()].filter(client => client.transport.sessionId).map(({ id, name, version, connectedAt, lastSeen }) => ({ id, name, version, connectedAt, lastSeen }));
80
+ }
81
+ async disconnect(id) {
82
+ const client = this.clients.get(id);
83
+ if (!client)
84
+ return;
85
+ this.clients.delete(id);
86
+ client.lifetime.abort();
87
+ for (const call of client.calls.values())
88
+ call.abort();
89
+ await client.mcp.close();
90
+ }
91
+ async prune() {
92
+ const expired = [...this.clients.values()].filter(client => !client.active && Date.now() - client.lastSeen > 10 * 60 * 1000);
93
+ await Promise.all(expired.map(client => this.disconnect(client.id)));
94
+ }
95
+ async start(port, token, maxConnections = 3) {
96
+ if (this.server)
97
+ throw new ConnectionError('already-listening');
98
+ const server = createServer((req, res) => { void this.handle(req, res, port, token, maxConnections).catch(() => { if (!res.headersSent)
99
+ reply(res, 500, 'Request failed');
100
+ else
101
+ res.end(); }); });
102
+ server.requestTimeout = 15000;
103
+ server.headersTimeout = 10000;
104
+ server.keepAliveTimeout = 1000;
105
+ server.maxHeadersCount = 40;
106
+ await new Promise((resolve, reject) => {
107
+ server.once('error', reject);
108
+ server.listen(port, '127.0.0.1', () => { server.removeListener('error', reject); resolve(); });
109
+ }).catch(() => { server.close(); throw new ConnectionError('port-unavailable'); });
110
+ this.server = server;
111
+ this.timer = setInterval(() => { void this.prune().catch(() => { }); }, 5000);
112
+ this.timer.unref();
113
+ }
114
+ async admit(body, maxConnections) {
115
+ if (!body || typeof body !== 'object' || body.method !== 'initialize')
116
+ return false;
117
+ await this.prune();
118
+ if (this.clients.size >= maxConnections)
119
+ throw new ConnectionError('connection-limit');
120
+ const id = randomUUID(), now = Date.now(), lifetime = new AbortController(), calls = new Map();
121
+ const mcp = delegationMcpServer(this.tasks, requestId => calls.get(requestId)?.signal ?? lifetime.signal, id, input => { if (!this.requestDirectory)
122
+ throw new ConnectionError('unavailable'); return this.requestDirectory(input, this.clients.get(id)?.name ?? 'MCP client'); }, () => this.clients.get(id)?.name ?? 'mcp', () => ({ connections: this.clients.size, maxConnections, ids: [...this.clients.keys()] }));
123
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: () => id, enableJsonResponse: true,
124
+ onsessionclosed: () => { void this.disconnect(id); } });
125
+ const client = { id, name: 'MCP client', version: '', connectedAt: now, lastSeen: now, mcp, transport, lifetime, calls, active: 0 };
126
+ this.clients.set(id, client);
127
+ mcp.server.oninitialized = () => {
128
+ const info = mcp.server.getClientVersion();
129
+ client.name = (info?.name ?? 'MCP client').slice(0, 80);
130
+ client.version = (info?.version ?? '').slice(0, 80);
131
+ };
132
+ try {
133
+ await mcp.connect(transport);
134
+ }
135
+ catch (error) {
136
+ await this.disconnect(id);
137
+ throw error;
138
+ }
139
+ return client;
140
+ }
141
+ async handle(req, res, port, token, maxConnections) {
142
+ const address = '127.0.0.1:' + port;
143
+ if (req.headers.host !== address && req.headers.host !== 'localhost:' + port) {
144
+ reply(res, 403, 'Invalid Host');
145
+ return;
146
+ }
147
+ if (req.headers.origin !== undefined) {
148
+ reply(res, 403, 'Origin not allowed');
149
+ return;
150
+ }
151
+ if (req.url !== '/mcp') {
152
+ reply(res, 404, 'Not found');
153
+ return;
154
+ }
155
+ if (!authorized(req, token)) {
156
+ res.setHeader('WWW-Authenticate', 'Bearer');
157
+ reply(res, 401, 'Bearer token required');
158
+ return;
159
+ }
160
+ if (!['POST', 'DELETE'].includes(req.method ?? '')) {
161
+ res.setHeader('Allow', 'POST, DELETE');
162
+ reply(res, 405, 'Use POST or DELETE');
163
+ return;
164
+ }
165
+ if (req.method === 'POST' && !/^application\/json(?:\s*;|$)/i.test(req.headers['content-type'] ?? '')) {
166
+ reply(res, 415, 'JSON required');
167
+ return;
168
+ }
169
+ if (this.requests >= 12) {
170
+ reply(res, 429, 'Too many requests');
171
+ return;
172
+ }
173
+ if (Number(req.headers['content-length'] ?? 0) > 131072) {
174
+ reply(res, 413, 'Request too large');
175
+ return;
176
+ }
177
+ this.requests++;
178
+ const abort = new AbortController();
179
+ this.pending.add(abort);
180
+ res.once('close', () => abort.abort());
181
+ let client = false, requestId = false, admitted = false;
182
+ try {
183
+ let body;
184
+ if (req.method === 'POST') {
185
+ const chunks = [];
186
+ let length = 0;
187
+ for await (const chunk of req) {
188
+ length += chunk.length;
189
+ if (length > 131072) {
190
+ reply(res, 413, 'Request too large');
191
+ return;
192
+ }
193
+ chunks.push(Buffer.from(chunk));
194
+ }
195
+ try {
196
+ body = JSON.parse(Buffer.concat(chunks).toString('utf8'));
197
+ }
198
+ catch {
199
+ reply(res, 400, 'Invalid JSON');
200
+ return;
201
+ }
202
+ if (Array.isArray(body)) {
203
+ reply(res, 400, 'Batch requests are not supported');
204
+ return;
205
+ }
206
+ }
207
+ const session = req.headers['mcp-session-id'];
208
+ if (session !== undefined) {
209
+ client = typeof session === 'string' ? this.clients.get(session) ?? false : false;
210
+ if (!client) {
211
+ reply(res, 404, 'MCP session not found; initialize again');
212
+ return;
213
+ }
214
+ }
215
+ else {
216
+ try {
217
+ client = await this.admit(body, maxConnections);
218
+ admitted = !!client;
219
+ }
220
+ catch (error) {
221
+ if (error instanceof ConnectionError && error.code === 'connection-limit') {
222
+ reply(res, 429, 'Maximum MCP connections reached');
223
+ return;
224
+ }
225
+ ;
226
+ throw error;
227
+ }
228
+ if (!client) {
229
+ reply(res, 400, 'Initialize an MCP session first');
230
+ return;
231
+ }
232
+ }
233
+ client.active++;
234
+ client.lastSeen = Date.now();
235
+ const id = body && typeof body === 'object' ? body.id : false;
236
+ if (typeof id === 'string' || typeof id === 'number') {
237
+ requestId = id;
238
+ if (client.calls.has(id)) {
239
+ reply(res, 409, 'Duplicate in-flight request ID');
240
+ return;
241
+ }
242
+ client.calls.set(id, abort);
243
+ }
244
+ await client.transport.handleRequest(req, res, body);
245
+ }
246
+ finally {
247
+ if (client) {
248
+ client.active--;
249
+ client.lastSeen = Date.now();
250
+ if (requestId !== false && client.calls.get(requestId) === abort)
251
+ client.calls.delete(requestId);
252
+ if (admitted && (!client.transport.sessionId || res.statusCode >= 400))
253
+ await this.disconnect(client.id);
254
+ }
255
+ this.pending.delete(abort);
256
+ this.requests--;
257
+ }
258
+ }
259
+ async close() {
260
+ const server = this.server;
261
+ this.server = false;
262
+ if (this.timer) {
263
+ clearInterval(this.timer);
264
+ this.timer = false;
265
+ }
266
+ for (const pending of this.pending)
267
+ pending.abort();
268
+ await Promise.all([...this.clients.keys()].map(id => this.disconnect(id)));
269
+ if (!server)
270
+ return;
271
+ server.closeAllConnections();
272
+ await new Promise(resolve => server.close(() => resolve()));
273
+ }
274
+ }
275
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/connection/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { ConnectionConfig, DelegationHost } from './types.js';
2
+ import { ConnectionStore } from './store.js';
3
+ import { DelegatedTasks } from './tasks.js';
4
+ import type { ConnectedClient } from './http.js';
5
+ import type { DirectoryRequest } from './directories.js';
6
+ export interface ConnectionSnapshot {
7
+ configuration: ConnectionConfig;
8
+ revision: number;
9
+ writable: boolean;
10
+ state: 'disabled' | 'listening' | 'error';
11
+ error: string;
12
+ url: string;
13
+ }
14
+ export interface ConnectionOverview {
15
+ connections: ConnectedClient[];
16
+ sessions: ReturnType<DelegatedTasks['overview']>;
17
+ }
18
+ export type ConnectionSaveResult = {
19
+ ok: true;
20
+ snapshot: ConnectionSnapshot;
21
+ } | {
22
+ ok: false;
23
+ error: string;
24
+ };
25
+ export declare class ConnectionService {
26
+ private readonly store;
27
+ private readonly host;
28
+ private settings;
29
+ private tasks;
30
+ private http;
31
+ private directoryRequests;
32
+ private timer;
33
+ private tail;
34
+ private state;
35
+ private error;
36
+ private observing;
37
+ constructor(store: ConnectionStore, host: DelegationHost);
38
+ initialize(): Promise<void>;
39
+ read(): ConnectionSnapshot;
40
+ overview(): ConnectionOverview;
41
+ disconnect(id: string): Promise<{
42
+ disconnected: true;
43
+ }>;
44
+ pendingDirectories(): DirectoryRequest[];
45
+ resolveDirectory(id: string, decision: string): Promise<{
46
+ status: DirectoryRequest['status'];
47
+ }>;
48
+ private exclusive;
49
+ save(content: string, revision: string): Promise<ConnectionSaveResult>;
50
+ reveal(): {
51
+ token: string;
52
+ };
53
+ rotate(revision: string): Promise<ConnectionSaveResult>;
54
+ private listen;
55
+ close(): Promise<void>;
56
+ }
57
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/connection/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAEhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD,MAAM,WAAW,kBAAkB;IAAG,aAAa,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IACzG,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACzE,MAAM,WAAW,kBAAkB;IAAG,WAAW,EAAE,eAAe,EAAE,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;CAAE;AACxH,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAC5G,qBAAa,iBAAiB;IAUhB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAmB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAT1E,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,KAAK,CAAgD;IAC7D,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAAiB;gBACL,KAAK,EAAE,eAAe,EAAmB,IAAI,EAAE,cAAc;IACpF,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC,IAAI,IAAI,kBAAkB;IAI1B,QAAQ,IAAI,kBAAkB;IACxB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,IAAI,CAAA;KAAE,CAAC;IAC7D,kBAAkB,IAAI,gBAAgB,EAAE;IAClC,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAC;IAarG,OAAO,CAAC,SAAS;IAGX,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA4B5E,MAAM,IAAI;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;IACrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAU/C,MAAM;IAMd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
@@ -0,0 +1,168 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { realpath, stat } from 'node:fs/promises';
3
+ import { isAbsolute } from 'node:path';
4
+ import { ConnectionError, connectionConfigSchema } from './types.js';
5
+ import { ConnectionStore } from './store.js';
6
+ import { DelegatedTasks } from './tasks.js';
7
+ import { ConnectionHttp } from './http.js';
8
+ import { DirectoryRequests } from './directories.js';
9
+ export class ConnectionService {
10
+ store;
11
+ host;
12
+ settings;
13
+ tasks;
14
+ http;
15
+ directoryRequests;
16
+ timer = false;
17
+ tail = Promise.resolve();
18
+ state = 'disabled';
19
+ error = '';
20
+ observing = false;
21
+ constructor(store, host) {
22
+ this.store = store;
23
+ this.host = host;
24
+ }
25
+ async initialize() {
26
+ await this.store.initialize();
27
+ try {
28
+ this.settings = await this.store.settings();
29
+ this.tasks = new DelegatedTasks(this.store, this.host, () => this.settings.config);
30
+ await this.tasks.initialize();
31
+ this.directoryRequests = new DirectoryRequests(() => this.settings.config.allowedDirectories);
32
+ this.http = new ConnectionHttp(this.tasks, (input, client) => this.exclusive(async () => {
33
+ if (!this.settings.config.enabled)
34
+ throw new ConnectionError('connection-disabled');
35
+ return this.directoryRequests.request(input, client);
36
+ }));
37
+ await this.listen();
38
+ this.timer = setInterval(() => {
39
+ if (this.observing)
40
+ return;
41
+ this.observing = true;
42
+ void this.tasks.tick().catch(() => { this.error = 'storage-unavailable'; }).finally(() => { this.observing = false; });
43
+ }, 1000);
44
+ this.timer.unref();
45
+ }
46
+ catch (error) {
47
+ await this.store.close();
48
+ throw error;
49
+ }
50
+ }
51
+ read() {
52
+ return { configuration: structuredClone(this.settings.config), revision: this.settings.revision, writable: true,
53
+ state: this.state, error: this.error, url: `http://127.0.0.1:${this.settings.config.port}/mcp` };
54
+ }
55
+ overview() { return { connections: this.http.connections(), sessions: this.tasks.overview() }; }
56
+ async disconnect(id) { await this.http.disconnect(id); return { disconnected: true }; }
57
+ pendingDirectories() { return this.directoryRequests.pending(); }
58
+ async resolveDirectory(id, decision) {
59
+ if (decision !== 'approved' && decision !== 'rejected')
60
+ throw new ConnectionError('invalid-decision');
61
+ return this.exclusive(() => this.directoryRequests.resolve(id, decision, async (path) => {
62
+ if (!this.settings.config.enabled)
63
+ throw new ConnectionError('connection-disabled');
64
+ const allowedDirectories = [...new Set([...this.settings.config.allowedDirectories, path])];
65
+ if (allowedDirectories.length > 32)
66
+ throw new ConnectionError('directory-limit');
67
+ const next = { ...this.settings, revision: this.settings.revision + 1,
68
+ config: { ...this.settings.config, directoriesConfigured: true, allowedDirectories,
69
+ knownDirectories: [...new Set([...this.settings.config.knownDirectories, path])].slice(-128) } };
70
+ await this.store.saveSettings(next);
71
+ this.settings = next;
72
+ }));
73
+ }
74
+ exclusive(run) {
75
+ const operation = this.tail.then(run);
76
+ this.tail = operation.catch(() => { });
77
+ return operation;
78
+ }
79
+ async save(content, revision) {
80
+ return this.exclusive(async () => {
81
+ if (revision !== String(this.settings.revision))
82
+ return { ok: false, error: 'conflict' };
83
+ let config;
84
+ try {
85
+ if (content.length > 131072)
86
+ throw new Error();
87
+ config = connectionConfigSchema.parse(JSON.parse(content));
88
+ config.maxConcurrent = config.maxConnections;
89
+ if (config.knownDirectories.some(path => !isAbsolute(path)))
90
+ throw new Error();
91
+ config.knownDirectories = [...new Set(config.knownDirectories)];
92
+ config.allowedDirectories = [...new Set(await Promise.all(config.allowedDirectories.map(async (path) => {
93
+ if (!isAbsolute(path))
94
+ throw new Error();
95
+ const canonical = await realpath(path);
96
+ if (!(await stat(canonical)).isDirectory())
97
+ throw new Error();
98
+ return canonical;
99
+ })))].sort();
100
+ if (config.enabled && !config.allowedDirectories.length)
101
+ throw new Error();
102
+ }
103
+ catch {
104
+ return { ok: false, error: 'invalid' };
105
+ }
106
+ const previous = this.settings.config;
107
+ const next = { ...this.settings, revision: this.settings.revision + 1, config };
108
+ try {
109
+ await this.store.saveSettings(next);
110
+ }
111
+ catch {
112
+ return { ok: false, error: 'save-failed' };
113
+ }
114
+ this.settings = next;
115
+ if (!config.enabled)
116
+ this.directoryRequests.rejectPending();
117
+ const transportChanged = this.state === 'error' || config.enabled !== previous.enabled || config.port !== previous.port || config.maxConnections !== previous.maxConnections;
118
+ if (transportChanged) {
119
+ await this.http.close();
120
+ await this.listen();
121
+ }
122
+ return { ok: true, snapshot: this.read() };
123
+ });
124
+ }
125
+ reveal() { return { token: this.settings.token }; }
126
+ async rotate(revision) {
127
+ return this.exclusive(async () => {
128
+ if (revision !== String(this.settings.revision))
129
+ return { ok: false, error: 'conflict' };
130
+ const next = { ...this.settings, revision: this.settings.revision + 1, token: randomBytes(32).toString('hex') };
131
+ try {
132
+ await this.store.saveSettings(next);
133
+ }
134
+ catch {
135
+ return { ok: false, error: 'save-failed' };
136
+ }
137
+ this.settings = next;
138
+ await this.http.close();
139
+ await this.listen();
140
+ return { ok: true, snapshot: this.read() };
141
+ });
142
+ }
143
+ async listen() {
144
+ this.error = '';
145
+ this.state = 'disabled';
146
+ if (!this.settings.config.enabled)
147
+ return;
148
+ try {
149
+ await this.http.start(this.settings.config.port, this.settings.token, this.settings.config.maxConnections);
150
+ this.state = 'listening';
151
+ }
152
+ catch (error) {
153
+ this.state = 'error';
154
+ this.error = error instanceof ConnectionError ? error.code : 'unavailable';
155
+ }
156
+ }
157
+ async close() {
158
+ await this.exclusive(async () => {
159
+ if (this.timer)
160
+ clearInterval(this.timer);
161
+ this.directoryRequests.rejectPending();
162
+ await this.http.close();
163
+ await this.tasks.close();
164
+ await this.store.close();
165
+ });
166
+ }
167
+ }
168
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/connection/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ConnectionConfig, DelegatedTask } from './types.js';
2
+ export interface ConnectionSettings {
3
+ revision: number;
4
+ config: ConnectionConfig;
5
+ token: string;
6
+ }
7
+ export declare class ConnectionStore {
8
+ readonly directory: string;
9
+ private lock;
10
+ private owned;
11
+ constructor(directory: string);
12
+ initialize(): Promise<void>;
13
+ private claim;
14
+ close(): Promise<void>;
15
+ settings(): Promise<ConnectionSettings>;
16
+ saveSettings(value: ConnectionSettings): Promise<void>;
17
+ tasks(): Promise<DelegatedTask[]>;
18
+ saveTasks(tasks: DelegatedTask[]): Promise<void>;
19
+ private write;
20
+ }
21
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/connection/store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAejE,MAAM,WAAW,kBAAkB;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACjG,qBAAa,eAAe;IAGd,QAAQ,CAAC,SAAS,EAAE,MAAM;IAFtC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAiB;gBACT,SAAS,EAAE,MAAM;IAChC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBnB,KAAK;IAIb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAgBvC,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD,KAAK,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAUjC,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YACxC,KAAK;CAapB"}