dsh-super-code 0.3.6 → 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 (64) hide show
  1. package/README.md +95 -63
  2. package/client/index.js +1049 -47
  3. package/cordis.patch.yml +1 -1
  4. package/docs/Changelog.md +19 -0
  5. package/docs/Compatibility.md +44 -0
  6. package/docs/EvaluationResults.md +134 -58
  7. package/docs/UsageGuide.md +112 -0
  8. package/lib/connection/directories.d.ts +30 -0
  9. package/lib/connection/directories.d.ts.map +1 -0
  10. package/lib/connection/directories.js +82 -0
  11. package/lib/connection/directories.js.map +1 -0
  12. package/lib/connection/git.d.ts +5 -0
  13. package/lib/connection/git.d.ts.map +1 -0
  14. package/lib/connection/git.js +86 -0
  15. package/lib/connection/git.js.map +1 -0
  16. package/lib/connection/http.d.ts +38 -0
  17. package/lib/connection/http.d.ts.map +1 -0
  18. package/lib/connection/http.js +275 -0
  19. package/lib/connection/http.js.map +1 -0
  20. package/lib/connection/service.d.ts +57 -0
  21. package/lib/connection/service.d.ts.map +1 -0
  22. package/lib/connection/service.js +168 -0
  23. package/lib/connection/service.js.map +1 -0
  24. package/lib/connection/store.d.ts +21 -0
  25. package/lib/connection/store.d.ts.map +1 -0
  26. package/lib/connection/store.js +139 -0
  27. package/lib/connection/store.js.map +1 -0
  28. package/lib/connection/tasks.d.ts +84 -0
  29. package/lib/connection/tasks.d.ts.map +1 -0
  30. package/lib/connection/tasks.js +270 -0
  31. package/lib/connection/tasks.js.map +1 -0
  32. package/lib/connection/types.d.ts +90 -0
  33. package/lib/connection/types.d.ts.map +1 -0
  34. package/lib/connection/types.js +21 -0
  35. package/lib/connection/types.js.map +1 -0
  36. package/lib/core/deletion-command.d.ts +3 -0
  37. package/lib/core/deletion-command.d.ts.map +1 -0
  38. package/lib/core/deletion-command.js +169 -0
  39. package/lib/core/deletion-command.js.map +1 -0
  40. package/lib/dsh/budgets.d.ts +5 -0
  41. package/lib/dsh/budgets.d.ts.map +1 -1
  42. package/lib/dsh/budgets.js +11 -0
  43. package/lib/dsh/budgets.js.map +1 -1
  44. package/lib/dsh/connection-host.d.ts +81 -0
  45. package/lib/dsh/connection-host.d.ts.map +1 -0
  46. package/lib/dsh/connection-host.js +130 -0
  47. package/lib/dsh/connection-host.js.map +1 -0
  48. package/lib/dsh/connection.d.ts +72 -0
  49. package/lib/dsh/connection.d.ts.map +1 -0
  50. package/lib/dsh/connection.js +183 -0
  51. package/lib/dsh/connection.js.map +1 -0
  52. package/lib/dsh/deletion-protection.d.ts +13 -0
  53. package/lib/dsh/deletion-protection.d.ts.map +1 -0
  54. package/lib/dsh/deletion-protection.js +68 -0
  55. package/lib/dsh/deletion-protection.js.map +1 -0
  56. package/lib/dsh/index.d.ts.map +1 -1
  57. package/lib/dsh/index.js +6 -0
  58. package/lib/dsh/index.js.map +1 -1
  59. package/lib/task-feedback-projection.d.ts +68 -0
  60. package/lib/task-feedback-projection.d.ts.map +1 -0
  61. package/lib/task-feedback-projection.js +176 -0
  62. package/lib/task-feedback-projection.js.map +1 -0
  63. package/package.json +7 -6
  64. package/presets/super-code/agent.cordis.yml +1 -1
@@ -0,0 +1,30 @@
1
+ export interface DirectoryApplication {
2
+ requestId: string;
3
+ path: string;
4
+ reason: string;
5
+ }
6
+ export interface DirectoryRequest {
7
+ id: string;
8
+ requestId: string;
9
+ path: string;
10
+ reason: string;
11
+ client: string;
12
+ createdAt: number;
13
+ status: 'pending' | 'approved' | 'rejected' | 'expired';
14
+ }
15
+ /** Pending consent is deliberately ephemeral; only an approved allowlist is persisted. */
16
+ export declare class DirectoryRequests {
17
+ private readonly allowed;
18
+ private readonly now;
19
+ private readonly requests;
20
+ private readonly sources;
21
+ constructor(allowed: () => string[], now?: () => number);
22
+ private expire;
23
+ request(input: DirectoryApplication, client: string): Promise<DirectoryRequest>;
24
+ pending(): DirectoryRequest[];
25
+ resolve(id: string, decision: 'approved' | 'rejected', grant: (path: string) => Promise<void>): Promise<{
26
+ status: DirectoryRequest['status'];
27
+ }>;
28
+ rejectPending(): void;
29
+ }
30
+ //# sourceMappingURL=directories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directories.d.ts","sourceRoot":"","sources":["../../src/connection/directories.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACzF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAC/F,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CACzD;AACD,0FAA0F;AAC1F,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAkB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAF1E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBACvB,OAAO,EAAE,MAAM,MAAM,EAAE,EAAmB,GAAG,GAAE,MAAM,MAAiB;IACnG,OAAO,CAAC,MAAM;IAKR,OAAO,CAAC,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsBrF,OAAO,IAAI,gBAAgB,EAAE;IACvB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAC;IAarJ,aAAa,IAAI,IAAI;CACtB"}
@@ -0,0 +1,82 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { realpath, stat } from 'node:fs/promises';
3
+ import { isAbsolute } from 'node:path';
4
+ import { ConnectionError } from './types.js';
5
+ import { withinDirectory } from './tasks.js';
6
+ /** Pending consent is deliberately ephemeral; only an approved allowlist is persisted. */
7
+ export class DirectoryRequests {
8
+ allowed;
9
+ now;
10
+ requests = new Map();
11
+ sources = new Map();
12
+ constructor(allowed, now = Date.now) {
13
+ this.allowed = allowed;
14
+ this.now = now;
15
+ }
16
+ expire() {
17
+ for (const row of this.requests.values()) {
18
+ if (row.status === 'pending' && this.now() - row.createdAt >= 5 * 60 * 1000)
19
+ row.status = 'expired';
20
+ }
21
+ }
22
+ async request(input, client) {
23
+ this.expire();
24
+ const existing = this.requests.get(input.requestId);
25
+ if (existing) {
26
+ if (this.sources.get(input.requestId) !== input.path || existing.reason !== input.reason)
27
+ throw new ConnectionError('request-conflict');
28
+ return { ...existing };
29
+ }
30
+ if (!isAbsolute(input.path))
31
+ throw new ConnectionError('absolute-directory-required');
32
+ let path;
33
+ try {
34
+ path = await realpath(input.path);
35
+ if (!(await stat(path)).isDirectory())
36
+ throw new Error();
37
+ }
38
+ catch {
39
+ throw new ConnectionError('directory-unavailable');
40
+ }
41
+ if (this.pending().length >= 8)
42
+ throw new ConnectionError('directory-request-limit');
43
+ if (this.requests.size >= 100) {
44
+ const oldest = [...this.requests.entries()].find(([, row]) => row.status !== 'pending');
45
+ if (oldest) {
46
+ this.requests.delete(oldest[0]);
47
+ this.sources.delete(oldest[0]);
48
+ }
49
+ }
50
+ const row = { id: randomUUID(), ...input, path, client: client.slice(0, 80), createdAt: this.now(),
51
+ status: this.allowed().some(parent => withinDirectory(parent, path)) ? 'approved' : 'pending' };
52
+ this.requests.set(input.requestId, row);
53
+ this.sources.set(input.requestId, input.path);
54
+ return { ...row };
55
+ }
56
+ pending() { this.expire(); return [...this.requests.values()].filter(row => row.status === 'pending').map(row => ({ ...row })); }
57
+ async resolve(id, decision, grant) {
58
+ this.expire();
59
+ const row = [...this.requests.values()].find(row => row.id === id);
60
+ if (!row)
61
+ throw new ConnectionError('directory-request-not-found');
62
+ if (row.status !== 'pending')
63
+ return { status: row.status };
64
+ if (decision === 'approved') {
65
+ try {
66
+ if (await realpath(row.path) !== row.path || !(await stat(row.path)).isDirectory())
67
+ throw new Error();
68
+ }
69
+ catch {
70
+ row.status = 'rejected';
71
+ throw new ConnectionError('directory-changed');
72
+ }
73
+ await grant(row.path);
74
+ }
75
+ row.status = decision;
76
+ return { status: row.status };
77
+ }
78
+ rejectPending() { for (const row of this.requests.values())
79
+ if (row.status === 'pending')
80
+ row.status = 'rejected'; }
81
+ }
82
+ //# sourceMappingURL=directories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directories.js","sourceRoot":"","sources":["../../src/connection/directories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { GitSnapshot, WorkspaceChanges } from './types.js';
2
+ export declare function gitWorktreeRoot(cwd: string): Promise<string | false>;
3
+ export declare function gitSnapshot(cwd: string): Promise<GitSnapshot>;
4
+ export declare function workspaceChanges(cwd: string, baseline: GitSnapshot): Promise<WorkspaceChanges>;
5
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/connection/git.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAkC/D,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,CAE1E;AACD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAcnE;AACD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQpG"}
@@ -0,0 +1,86 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { createHash } from 'node:crypto';
4
+ import { constants } from 'node:fs';
5
+ import { lstat, open, readlink, realpath } from 'node:fs/promises';
6
+ import { resolve, relative, sep, isAbsolute } from 'node:path';
7
+ const exec = promisify(execFile);
8
+ async function git(cwd, args) {
9
+ const result = await exec('git', ['--no-optional-locks', '-C', cwd, ...args], {
10
+ timeout: 5000, maxBuffer: 1024 * 1024, env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
11
+ });
12
+ return result.stdout;
13
+ }
14
+ /** Bound untracked observations and never follow symlinks into another workspace. */
15
+ async function untrackedFingerprint(cwd, root) {
16
+ const paths = (await git(cwd, ['ls-files', '--others', '--exclude-standard', '-z', '--', '.'])).split('\0').filter(Boolean);
17
+ if (paths.length > 160)
18
+ throw new Error('Untracked observation limit');
19
+ const hash = createHash('sha256');
20
+ let bytes = 0;
21
+ for (const path of paths) {
22
+ const absolute = resolve(cwd, path), fromRoot = relative(root, absolute);
23
+ if (fromRoot === '..' || fromRoot.startsWith(`..${sep}`) || isAbsolute(fromRoot))
24
+ throw new Error('Outside worktree');
25
+ const info = await lstat(absolute);
26
+ hash.update(path);
27
+ if (info.isSymbolicLink()) {
28
+ hash.update(await readlink(absolute));
29
+ continue;
30
+ }
31
+ bytes += info.size;
32
+ if (!info.isFile() || bytes > 1024 * 1024)
33
+ throw new Error('Untracked observation limit');
34
+ const file = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW);
35
+ try {
36
+ const opened = await file.stat();
37
+ if (opened.ino !== info.ino || opened.dev !== info.dev || opened.size !== info.size)
38
+ throw new Error('File changed during observation');
39
+ const buffer = Buffer.alloc(info.size + 1);
40
+ const read = await file.read(buffer, 0, buffer.length, 0);
41
+ if (read.bytesRead !== info.size)
42
+ throw new Error('File changed during observation');
43
+ hash.update(buffer.subarray(0, read.bytesRead));
44
+ }
45
+ finally {
46
+ await file.close();
47
+ }
48
+ }
49
+ return hash.digest('hex');
50
+ }
51
+ export async function gitWorktreeRoot(cwd) {
52
+ try {
53
+ return (await git(cwd, ['rev-parse', '--show-toplevel'])).trim();
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ export async function gitSnapshot(cwd) {
60
+ try {
61
+ cwd = await realpath(cwd);
62
+ const root = (await git(cwd, ['rev-parse', '--show-toplevel'])).trim();
63
+ const head = await git(cwd, ['rev-parse', '--verify', 'HEAD']).catch(() => 'unborn');
64
+ const status = await git(cwd, ['status', '--porcelain=v1', '-z', '--untracked-files=all', '--', '.']);
65
+ const args = ['--no-ext-diff', '--no-textconv'];
66
+ const diff = head === 'unborn'
67
+ ? await git(cwd, ['diff', ...args, '--', '.']) + await git(cwd, ['diff', ...args, '--cached', '--', '.'])
68
+ : await git(cwd, ['diff', ...args, 'HEAD', '--', '.']);
69
+ const untracked = await untrackedFingerprint(cwd, root);
70
+ return { available: true, root, head, fingerprint: createHash('sha256').update(head).update(status).update(diff).update(untracked).digest('hex'),
71
+ dirty: status.split('\0').filter(Boolean).slice(0, 160).map(row => row.slice(0, 1024)) };
72
+ }
73
+ catch {
74
+ return { available: false, root: '', head: '', fingerprint: '', dirty: [] };
75
+ }
76
+ }
77
+ export async function workspaceChanges(cwd, baseline) {
78
+ const current = await gitSnapshot(cwd);
79
+ const args = ['diff', '--no-ext-diff', '--no-textconv', '--stat', ...(current.head === 'unborn' ? [] : ['HEAD']), '--', '.'];
80
+ const stat = current.available ? await git(cwd, args).catch(() => '') : '';
81
+ const available = baseline.available && current.available;
82
+ return { available, baselineDirty: baseline.dirty, currentDirty: current.dirty,
83
+ changedSinceStart: available && baseline.fingerprint !== current.fingerprint, headChanged: available && baseline.head !== current.head,
84
+ diffStat: stat.slice(0, 8000), truncated: !available || stat.length > 8000 || current.dirty.length >= 160, attribution: 'workspace-observation' };
85
+ }
86
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/connection/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { DelegatedTasks } from './tasks.js';
3
+ import type { DirectoryApplication, DirectoryRequest } from './directories.js';
4
+ type RequestDirectory = (input: DirectoryApplication, client: string) => Promise<DirectoryRequest>;
5
+ type ClientName = () => string;
6
+ type ConnectionStatus = () => {
7
+ connections: number;
8
+ maxConnections: number;
9
+ ids: readonly string[];
10
+ };
11
+ export declare function delegationMcpServer(tasks: DelegatedTasks, signal: (id: string | number) => AbortSignal, connectionId?: string, requestDirectory?: (input: DirectoryApplication) => Promise<DirectoryRequest>, clientName?: ClientName, connectionStatus?: ConnectionStatus): McpServer;
12
+ export interface ConnectedClient {
13
+ id: string;
14
+ name: string;
15
+ version: string;
16
+ connectedAt: number;
17
+ lastSeen: number;
18
+ }
19
+ /** MCP sessions, rather than TCP sockets or individual HTTP requests, define a connection. */
20
+ export declare class ConnectionHttp {
21
+ private readonly tasks;
22
+ private readonly requestDirectory;
23
+ private server;
24
+ private requests;
25
+ private readonly clients;
26
+ private readonly pending;
27
+ private timer;
28
+ constructor(tasks: DelegatedTasks, requestDirectory?: RequestDirectory | undefined);
29
+ connections(): ConnectedClient[];
30
+ disconnect(id: string): Promise<void>;
31
+ private prune;
32
+ start(port: number, token: string, maxConnections?: number): Promise<void>;
33
+ private admit;
34
+ private handle;
35
+ close(): Promise<void>;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/connection/http.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAM9E,KAAK,gBAAgB,GAAG,CAAC,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;AAClG,KAAK,UAAU,GAAG,MAAM,MAAM,CAAA;AAC9B,KAAK,gBAAgB,GAAG,MAAM;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AACrG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,WAAW,EAAE,YAAY,SAAK,EAAE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC,gBAAgB,CAAC,EAAE,UAAU,GAAE,UAAwB,EAAE,gBAAgB,GAAE,gBAA4H,GAAG,SAAS,CAqC1Y;AAQD,MAAM,WAAW,eAAe;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAKrH,8FAA8F;AAC9F,qBAAa,cAAc;IAMb,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAkB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IALrF,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,KAAK,CAAgD;gBAChC,KAAK,EAAE,cAAc,EAAmB,gBAAgB,GAAE,gBAAgB,GAAG,SAAqB;IAC/H,WAAW,IAAI,eAAe,EAAE;IAG1B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAO7B,KAAK;IAIb,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAY7D,KAAK;YAoBL,MAAM;IAoDd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAS7B"}
@@ -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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"}