git-doc-mcp 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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +543 -0
  3. package/dist/audit/index.d.ts +2 -0
  4. package/dist/audit/index.d.ts.map +1 -0
  5. package/dist/audit/index.js +2 -0
  6. package/dist/audit/index.js.map +1 -0
  7. package/dist/audit/logger.d.ts +81 -0
  8. package/dist/audit/logger.d.ts.map +1 -0
  9. package/dist/audit/logger.js +179 -0
  10. package/dist/audit/logger.js.map +1 -0
  11. package/dist/cli/commands/serve.d.ts +44 -0
  12. package/dist/cli/commands/serve.d.ts.map +1 -0
  13. package/dist/cli/commands/serve.js +360 -0
  14. package/dist/cli/commands/serve.js.map +1 -0
  15. package/dist/cli/index.d.ts +21 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +71 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/http/client.d.ts +39 -0
  20. package/dist/http/client.d.ts.map +1 -0
  21. package/dist/http/client.js +114 -0
  22. package/dist/http/client.js.map +1 -0
  23. package/dist/http/index.d.ts +7 -0
  24. package/dist/http/index.d.ts.map +1 -0
  25. package/dist/http/index.js +7 -0
  26. package/dist/http/index.js.map +1 -0
  27. package/dist/http/redirect-utils.d.ts +27 -0
  28. package/dist/http/redirect-utils.d.ts.map +1 -0
  29. package/dist/http/redirect-utils.js +73 -0
  30. package/dist/http/redirect-utils.js.map +1 -0
  31. package/dist/index.d.ts +36 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +44 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/manifest/index.d.ts +7 -0
  36. package/dist/manifest/index.d.ts.map +1 -0
  37. package/dist/manifest/index.js +7 -0
  38. package/dist/manifest/index.js.map +1 -0
  39. package/dist/manifest/loader.d.ts +55 -0
  40. package/dist/manifest/loader.d.ts.map +1 -0
  41. package/dist/manifest/loader.js +222 -0
  42. package/dist/manifest/loader.js.map +1 -0
  43. package/dist/manifest/schema.d.ts +909 -0
  44. package/dist/manifest/schema.d.ts.map +1 -0
  45. package/dist/manifest/schema.js +148 -0
  46. package/dist/manifest/schema.js.map +1 -0
  47. package/dist/rate-limit/index.d.ts +6 -0
  48. package/dist/rate-limit/index.d.ts.map +1 -0
  49. package/dist/rate-limit/index.js +6 -0
  50. package/dist/rate-limit/index.js.map +1 -0
  51. package/dist/rate-limit/limiter.d.ts +38 -0
  52. package/dist/rate-limit/limiter.d.ts.map +1 -0
  53. package/dist/rate-limit/limiter.js +55 -0
  54. package/dist/rate-limit/limiter.js.map +1 -0
  55. package/dist/sandbox/context.d.ts +69 -0
  56. package/dist/sandbox/context.d.ts.map +1 -0
  57. package/dist/sandbox/context.js +134 -0
  58. package/dist/sandbox/context.js.map +1 -0
  59. package/dist/sandbox/executor.d.ts +50 -0
  60. package/dist/sandbox/executor.d.ts.map +1 -0
  61. package/dist/sandbox/executor.js +259 -0
  62. package/dist/sandbox/executor.js.map +1 -0
  63. package/dist/sandbox/index.d.ts +8 -0
  64. package/dist/sandbox/index.d.ts.map +1 -0
  65. package/dist/sandbox/index.js +8 -0
  66. package/dist/sandbox/index.js.map +1 -0
  67. package/dist/sandbox/url-validator.d.ts +40 -0
  68. package/dist/sandbox/url-validator.d.ts.map +1 -0
  69. package/dist/sandbox/url-validator.js +178 -0
  70. package/dist/sandbox/url-validator.js.map +1 -0
  71. package/dist/secrets/index.d.ts +7 -0
  72. package/dist/secrets/index.d.ts.map +1 -0
  73. package/dist/secrets/index.js +7 -0
  74. package/dist/secrets/index.js.map +1 -0
  75. package/dist/secrets/manager.d.ts +55 -0
  76. package/dist/secrets/manager.d.ts.map +1 -0
  77. package/dist/secrets/manager.js +94 -0
  78. package/dist/secrets/manager.js.map +1 -0
  79. package/dist/secrets/patterns.d.ts +33 -0
  80. package/dist/secrets/patterns.d.ts.map +1 -0
  81. package/dist/secrets/patterns.js +71 -0
  82. package/dist/secrets/patterns.js.map +1 -0
  83. package/dist/server/index.d.ts +6 -0
  84. package/dist/server/index.d.ts.map +1 -0
  85. package/dist/server/index.js +6 -0
  86. package/dist/server/index.js.map +1 -0
  87. package/dist/server/mcp.d.ts +60 -0
  88. package/dist/server/mcp.d.ts.map +1 -0
  89. package/dist/server/mcp.js +173 -0
  90. package/dist/server/mcp.js.map +1 -0
  91. package/dist/worker/index.d.ts +7 -0
  92. package/dist/worker/index.d.ts.map +1 -0
  93. package/dist/worker/index.js +7 -0
  94. package/dist/worker/index.js.map +1 -0
  95. package/dist/worker/process.d.ts +64 -0
  96. package/dist/worker/process.d.ts.map +1 -0
  97. package/dist/worker/process.js +222 -0
  98. package/dist/worker/process.js.map +1 -0
  99. package/dist/worker/protocol.d.ts +83 -0
  100. package/dist/worker/protocol.d.ts.map +1 -0
  101. package/dist/worker/protocol.js +55 -0
  102. package/dist/worker/protocol.js.map +1 -0
  103. package/dist/worker/worker-entry.d.ts +30 -0
  104. package/dist/worker/worker-entry.d.ts.map +1 -0
  105. package/dist/worker/worker-entry.js +136 -0
  106. package/dist/worker/worker-entry.js.map +1 -0
  107. package/package.json +55 -0
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Worker process manager.
3
+ * @module worker/process
4
+ */
5
+ import * as childProcess from 'node:child_process';
6
+ import * as url from 'node:url';
7
+ import * as path from 'node:path';
8
+ import * as crypto from 'node:crypto';
9
+ // ESM-compatible __dirname
10
+ const __filename = url.fileURLToPath(import.meta.url);
11
+ const __dirname = path.dirname(__filename);
12
+ /**
13
+ * Sanitized environment variables to pass to worker.
14
+ * Only allow specific, safe environment variables.
15
+ */
16
+ const ALLOWED_ENV_VARS = [
17
+ 'NODE_ENV',
18
+ 'HOME',
19
+ 'USER',
20
+ 'LANG',
21
+ 'LC_ALL',
22
+ 'PATH',
23
+ ];
24
+ /**
25
+ * Default worker options.
26
+ */
27
+ const DEFAULT_WORKER_OPTIONS = {
28
+ timeout: 60000,
29
+ maxRestarts: 2,
30
+ logger: console.error,
31
+ };
32
+ /**
33
+ * Worker process manager.
34
+ * Handles spawning, communication, and lifecycle of worker processes.
35
+ */
36
+ export class WorkerManager {
37
+ worker = null;
38
+ isHealthy = false;
39
+ pendingRequests = new Map();
40
+ buffer = '';
41
+ options;
42
+ constructor(options = {}) {
43
+ const { auditLogger, ...rest } = options;
44
+ this.options = { ...DEFAULT_WORKER_OPTIONS, ...rest, auditLogger };
45
+ }
46
+ /**
47
+ * Spawn a new worker process.
48
+ */
49
+ async spawnWorker() {
50
+ const workerPath = path.join(__dirname, 'worker-entry.js');
51
+ // Create sanitized environment
52
+ const sanitizedEnv = {
53
+ NODE_ENV: 'production',
54
+ };
55
+ // Only copy allowed environment variables
56
+ for (const key of ALLOWED_ENV_VARS) {
57
+ if (process.env[key] !== undefined) {
58
+ sanitizedEnv[key] = process.env[key];
59
+ }
60
+ }
61
+ this.worker = childProcess.fork(workerPath, [], {
62
+ stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
63
+ env: sanitizedEnv,
64
+ });
65
+ this.isHealthy = true;
66
+ this.buffer = '';
67
+ // Handle stdout (JSON responses)
68
+ this.worker.stdout?.on('data', (data) => {
69
+ this.handleStdout(data);
70
+ });
71
+ // Handle stderr (logs)
72
+ this.worker.stderr?.on('data', (data) => {
73
+ this.options.logger('info', data.toString());
74
+ });
75
+ // Handle process exit
76
+ this.worker.on('exit', (code, signal) => {
77
+ this.isHealthy = false;
78
+ this.options.logger('warn', `Worker exited: code=${code}, signal=${signal}`);
79
+ // Reject all pending requests
80
+ for (const pending of this.pendingRequests.values()) {
81
+ clearTimeout(pending.timeoutId);
82
+ pending.reject(new Error('Worker process crashed'));
83
+ }
84
+ this.pendingRequests.clear();
85
+ });
86
+ // Handle errors
87
+ this.worker.on('error', (error) => {
88
+ this.isHealthy = false;
89
+ this.options.logger('error', `Worker error: ${error.message}`);
90
+ });
91
+ // Wait for worker to be ready
92
+ await this.pingWorker();
93
+ }
94
+ /**
95
+ * Handle stdout data from worker.
96
+ */
97
+ handleStdout(data) {
98
+ this.buffer += data.toString();
99
+ // Process complete lines (newline-delimited JSON)
100
+ const lines = this.buffer.split('\n');
101
+ this.buffer = lines.pop() ?? '';
102
+ for (const line of lines) {
103
+ if (line.trim()) {
104
+ this.handleResponse(line);
105
+ }
106
+ }
107
+ }
108
+ /**
109
+ * Handle a response from the worker.
110
+ */
111
+ handleResponse(line) {
112
+ try {
113
+ const parsed = JSON.parse(line);
114
+ // Handle audit messages from worker (forwarded via WorkerAuditProxy)
115
+ if (parsed.type === 'audit' && parsed.event && this.options.auditLogger) {
116
+ this.options.auditLogger.log(parsed.event);
117
+ return;
118
+ }
119
+ const response = parsed;
120
+ const pending = this.pendingRequests.get(response.id);
121
+ if (pending) {
122
+ clearTimeout(pending.timeoutId);
123
+ this.pendingRequests.delete(response.id);
124
+ pending.resolve(response);
125
+ }
126
+ }
127
+ catch (error) {
128
+ this.options.logger('error', `Failed to parse response: ${line}`);
129
+ }
130
+ }
131
+ /**
132
+ * Send a request to the worker.
133
+ */
134
+ sendRequest(request) {
135
+ return new Promise((resolve, reject) => {
136
+ if (!this.worker || !this.isHealthy) {
137
+ reject(new Error('Worker not available'));
138
+ return;
139
+ }
140
+ const timeoutId = setTimeout(() => {
141
+ this.pendingRequests.delete(request.id);
142
+ // Kill the worker on timeout
143
+ this.options.logger('warn', `Request ${request.id} timed out, killing worker`);
144
+ this.killWorker();
145
+ reject(new Error('Request timeout'));
146
+ }, this.options.timeout);
147
+ this.pendingRequests.set(request.id, { resolve, reject, timeoutId });
148
+ // Send request via stdin
149
+ const json = JSON.stringify(request) + '\n';
150
+ this.worker.stdin?.write(json);
151
+ });
152
+ }
153
+ /**
154
+ * Kill the worker process.
155
+ */
156
+ killWorker() {
157
+ if (this.worker) {
158
+ this.isHealthy = false;
159
+ this.worker.kill('SIGKILL');
160
+ this.worker = null;
161
+ }
162
+ }
163
+ /**
164
+ * Ping the worker to check if it's alive.
165
+ */
166
+ async pingWorker() {
167
+ const request = {
168
+ id: crypto.randomUUID(),
169
+ type: 'ping',
170
+ };
171
+ const response = await this.sendRequest(request);
172
+ if (response.type !== 'pong') {
173
+ throw new Error('Worker ping failed');
174
+ }
175
+ }
176
+ /**
177
+ * Execute an action in the worker.
178
+ */
179
+ async executeAction(request) {
180
+ let attempts = 0;
181
+ const maxAttempts = this.options.maxRestarts + 1;
182
+ while (attempts < maxAttempts) {
183
+ try {
184
+ // Ensure worker is running
185
+ if (!this.worker || !this.isHealthy) {
186
+ await this.spawnWorker();
187
+ }
188
+ return await this.sendRequest(request);
189
+ }
190
+ catch (error) {
191
+ attempts++;
192
+ this.isHealthy = false;
193
+ if (attempts >= maxAttempts) {
194
+ throw error;
195
+ }
196
+ this.options.logger('warn', `Worker failed, restarting... (attempt ${attempts})`);
197
+ }
198
+ }
199
+ throw new Error('Worker failed after maximum restarts');
200
+ }
201
+ /**
202
+ * Shutdown the worker.
203
+ */
204
+ async shutdown() {
205
+ if (this.worker) {
206
+ const request = {
207
+ id: crypto.randomUUID(),
208
+ type: 'shutdown',
209
+ };
210
+ try {
211
+ await this.sendRequest(request);
212
+ }
213
+ catch {
214
+ // Ignore shutdown errors
215
+ }
216
+ this.worker.kill();
217
+ this.worker = null;
218
+ this.isHealthy = false;
219
+ }
220
+ }
221
+ }
222
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/worker/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * IPC protocol for worker process communication.
3
+ * @module worker/protocol
4
+ */
5
+ /**
6
+ * Tool result type.
7
+ */
8
+ export interface CallToolResult {
9
+ content: Array<{
10
+ type: 'text';
11
+ text: string;
12
+ } | {
13
+ type: 'image';
14
+ data: string;
15
+ mimeType: string;
16
+ }>;
17
+ isError?: boolean;
18
+ }
19
+ /**
20
+ * Worker request from main process.
21
+ */
22
+ export interface WorkerRequest {
23
+ /** UUID for correlation */
24
+ id: string;
25
+ /** Request type */
26
+ type: 'execute' | 'ping' | 'shutdown';
27
+ /** Execute payload */
28
+ payload?: {
29
+ actionUrl: string;
30
+ actionCode: string;
31
+ input: unknown;
32
+ secrets: Record<string, string>;
33
+ timeout: number;
34
+ manifest: {
35
+ name: string;
36
+ version: string;
37
+ };
38
+ secretScopes: Record<string, string[]>;
39
+ /** Memory limit in bytes for sandbox isolate. Optional for backward compat. */
40
+ memoryLimit?: number;
41
+ };
42
+ }
43
+ /**
44
+ * Worker response to main process.
45
+ */
46
+ export interface WorkerResponse {
47
+ /** Matches request ID */
48
+ id: string;
49
+ /** Response type */
50
+ type: 'result' | 'error' | 'pong';
51
+ /** Tool result (if successful) */
52
+ result?: CallToolResult;
53
+ /** Error details (if failed) */
54
+ error?: {
55
+ code: 'TIMEOUT' | 'MEMORY' | 'VALIDATION' | 'EXECUTION' | 'UNKNOWN';
56
+ message: string;
57
+ };
58
+ }
59
+ /**
60
+ * Error codes for worker errors.
61
+ */
62
+ export type WorkerErrorCode = 'TIMEOUT' | 'MEMORY' | 'VALIDATION' | 'EXECUTION' | 'UNKNOWN';
63
+ /**
64
+ * Create a worker error response.
65
+ */
66
+ export declare function createErrorResponse(id: string, code: WorkerErrorCode, message: string): WorkerResponse;
67
+ /**
68
+ * Create a worker success response.
69
+ */
70
+ export declare function createSuccessResponse(id: string, result: CallToolResult): WorkerResponse;
71
+ /**
72
+ * Create a pong response.
73
+ */
74
+ export declare function createPongResponse(id: string): WorkerResponse;
75
+ /**
76
+ * Parse a worker request from JSON.
77
+ */
78
+ export declare function parseWorkerRequest(data: string): WorkerRequest | null;
79
+ /**
80
+ * Serialize a worker response to JSON.
81
+ */
82
+ export declare function serializeWorkerResponse(response: WorkerResponse): string;
83
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/worker/protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnG,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IACtC,sBAAsB;IACtB,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACvC,+EAA+E;QAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,kCAAkC;IAClC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,gCAAgC;IAChC,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,CAAC;QACpE,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,CAAC;AAE5F;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,GACd,cAAc,CAMhB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,cAAc,GACrB,cAAc,CAMhB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAK7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAUrE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAExE"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * IPC protocol for worker process communication.
3
+ * @module worker/protocol
4
+ */
5
+ /**
6
+ * Create a worker error response.
7
+ */
8
+ export function createErrorResponse(id, code, message) {
9
+ return {
10
+ id,
11
+ type: 'error',
12
+ error: { code, message },
13
+ };
14
+ }
15
+ /**
16
+ * Create a worker success response.
17
+ */
18
+ export function createSuccessResponse(id, result) {
19
+ return {
20
+ id,
21
+ type: 'result',
22
+ result,
23
+ };
24
+ }
25
+ /**
26
+ * Create a pong response.
27
+ */
28
+ export function createPongResponse(id) {
29
+ return {
30
+ id,
31
+ type: 'pong',
32
+ };
33
+ }
34
+ /**
35
+ * Parse a worker request from JSON.
36
+ */
37
+ export function parseWorkerRequest(data) {
38
+ try {
39
+ const parsed = JSON.parse(data);
40
+ if (typeof parsed.id === 'string' && typeof parsed.type === 'string') {
41
+ return parsed;
42
+ }
43
+ return null;
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ /**
50
+ * Serialize a worker response to JSON.
51
+ */
52
+ export function serializeWorkerResponse(response) {
53
+ return JSON.stringify(response);
54
+ }
55
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/worker/protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyDH;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,EAAU,EACV,IAAqB,EACrB,OAAe;IAEf,OAAO;QACL,EAAE;QACF,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,EAAU,EACV,MAAsB;IAEtB,OAAO;QACL,EAAE;QACF,IAAI,EAAE,QAAQ;QACd,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO;QACL,EAAE;QACF,IAAI,EAAE,MAAM;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrE,OAAO,MAAuB,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAwB;IAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Worker process entry point.
3
+ * Handles action execution in an isolated process.
4
+ * @module worker/worker-entry
5
+ */
6
+ import { WorkerRequest, WorkerResponse } from './protocol.js';
7
+ import type { AuditEvent, AuditLogger } from '../audit/logger.js';
8
+ /**
9
+ * Audit proxy that sends structured audit events to the main process via stdout.
10
+ * The main process's WorkerManager intercepts these messages (type: 'audit')
11
+ * and routes them to the single AuditLogger instance.
12
+ *
13
+ * This avoids file write race conditions - only the main process writes to disk.
14
+ */
15
+ export declare class WorkerAuditProxy implements AuditLogger {
16
+ log(event: AuditEvent): void;
17
+ logFetch(url: string, status?: number, duration?: number, manifestName?: string): void;
18
+ logRedirect(from: string, to: string, manifestName?: string): void;
19
+ logSecretAccess(secretName: string, url: string, allowed: boolean, manifestName?: string): void;
20
+ logActionStart(actionName: string, manifestName?: string): void;
21
+ logActionEnd(actionName: string, status: string, duration_ms: number, manifestName?: string): void;
22
+ logActionLog(level: string, message: string, manifestName?: string): void;
23
+ logError(message: string, details?: Record<string, unknown>, manifestName?: string): void;
24
+ close(): Promise<void>;
25
+ }
26
+ /**
27
+ * Handle a worker request.
28
+ */
29
+ export declare function handleRequest(request: WorkerRequest, auditLogger?: AuditLogger): Promise<WorkerResponse>;
30
+ //# sourceMappingURL=worker-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-entry.d.ts","sourceRoot":"","sources":["../../src/worker/worker-entry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAkE,MAAM,eAAe,CAAC;AAC9H,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUlE;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAI5B,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAItF,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlE,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAI/F,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAI/D,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAIzE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAInF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAgDD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAmD9G"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Worker process entry point.
3
+ * Handles action execution in an isolated process.
4
+ * @module worker/worker-entry
5
+ */
6
+ import * as readline from 'node:readline';
7
+ import { executeAction } from '../sandbox/executor.js';
8
+ import { createPongResponse, createSuccessResponse, createErrorResponse } from './protocol.js';
9
+ /**
10
+ * Audit proxy that sends structured audit events to the main process via stdout.
11
+ * The main process's WorkerManager intercepts these messages (type: 'audit')
12
+ * and routes them to the single AuditLogger instance.
13
+ *
14
+ * This avoids file write race conditions - only the main process writes to disk.
15
+ */
16
+ export class WorkerAuditProxy {
17
+ log(event) {
18
+ console.log(JSON.stringify({ type: 'audit', event }));
19
+ }
20
+ logFetch(url, status, duration, manifestName) {
21
+ this.log({ timestamp: new Date().toISOString(), event: 'fetch', url, status: status?.toString(), duration_ms: duration, manifestName });
22
+ }
23
+ logRedirect(from, to, manifestName) {
24
+ this.log({ timestamp: new Date().toISOString(), event: 'redirect', url: to, details: { from }, manifestName });
25
+ }
26
+ logSecretAccess(secretName, url, allowed, manifestName) {
27
+ this.log({ timestamp: new Date().toISOString(), event: 'secret-access', secretName, url, status: allowed ? 'allowed' : 'denied', manifestName });
28
+ }
29
+ logActionStart(actionName, manifestName) {
30
+ this.log({ timestamp: new Date().toISOString(), event: 'action-start', actionName, manifestName });
31
+ }
32
+ logActionEnd(actionName, status, duration_ms, manifestName) {
33
+ this.log({ timestamp: new Date().toISOString(), event: 'action-end', actionName, status, duration_ms, manifestName });
34
+ }
35
+ logActionLog(level, message, manifestName) {
36
+ this.log({ timestamp: new Date().toISOString(), event: 'action-log', status: level, details: { message }, manifestName });
37
+ }
38
+ logError(message, details, manifestName) {
39
+ this.log({ timestamp: new Date().toISOString(), event: 'error', details: { message, ...details }, manifestName });
40
+ }
41
+ async close() {
42
+ // No-op: the worker proxy has no resources to clean up
43
+ }
44
+ }
45
+ /**
46
+ * Main worker loop.
47
+ * Reads JSON requests from stdin, executes actions, writes responses to stdout.
48
+ */
49
+ async function main() {
50
+ const auditProxy = new WorkerAuditProxy();
51
+ const rl = readline.createInterface({
52
+ input: process.stdin,
53
+ output: process.stdout,
54
+ terminal: false,
55
+ });
56
+ rl.on('line', async (line) => {
57
+ let request;
58
+ try {
59
+ request = JSON.parse(line);
60
+ }
61
+ catch {
62
+ auditProxy.logError('Invalid JSON from main process', { line: line.substring(0, 200) });
63
+ return;
64
+ }
65
+ try {
66
+ const response = await handleRequest(request, auditProxy);
67
+ console.log(JSON.stringify(response));
68
+ }
69
+ catch (error) {
70
+ const message = error instanceof Error ? error.message : String(error);
71
+ auditProxy.logError('Worker request failed', { error: message });
72
+ const response = createErrorResponse(request.id, 'EXECUTION', message);
73
+ console.log(JSON.stringify(response));
74
+ }
75
+ });
76
+ // Handle shutdown
77
+ process.on('SIGTERM', () => {
78
+ rl.close();
79
+ process.exit(0);
80
+ });
81
+ process.on('SIGINT', () => {
82
+ rl.close();
83
+ process.exit(0);
84
+ });
85
+ }
86
+ /**
87
+ * Handle a worker request.
88
+ */
89
+ export async function handleRequest(request, auditLogger) {
90
+ switch (request.type) {
91
+ case 'ping':
92
+ return createPongResponse(request.id);
93
+ case 'shutdown':
94
+ // Exit after sending response
95
+ setTimeout(() => process.exit(0), 100);
96
+ return createSuccessResponse(request.id, { content: [{ type: 'text', text: 'Shutting down' }] });
97
+ case 'execute': {
98
+ const payload = request.payload;
99
+ if (!payload) {
100
+ return createErrorResponse(request.id, 'VALIDATION', 'Missing payload');
101
+ }
102
+ try {
103
+ const manifest = {
104
+ name: payload.manifest.name,
105
+ version: payload.manifest.version,
106
+ };
107
+ const memoryLimit = payload.memoryLimit ?? 128 * 1024 * 1024;
108
+ const result = await executeAction(payload.actionCode, payload.input, {
109
+ manifest,
110
+ secrets: payload.secrets ?? {},
111
+ secretScopes: payload.secretScopes ?? {},
112
+ timeout: payload.timeout ?? 60000,
113
+ auditLogger,
114
+ }, {
115
+ memoryLimit,
116
+ cpuTimeLimit: 30000,
117
+ wallTimeLimit: payload.timeout ?? 60000,
118
+ });
119
+ return createSuccessResponse(request.id, result);
120
+ }
121
+ catch (error) {
122
+ const message = error instanceof Error ? error.message : String(error);
123
+ auditLogger?.logError('Worker execution failed', { error: message });
124
+ return createErrorResponse(request.id, 'EXECUTION', message);
125
+ }
126
+ }
127
+ default:
128
+ return createErrorResponse(request.id, 'UNKNOWN', `Unknown request type: ${request.type}`);
129
+ }
130
+ }
131
+ // Start worker
132
+ main().catch((error) => {
133
+ console.error('Worker error:', error);
134
+ process.exit(1);
135
+ });
136
+ //# sourceMappingURL=worker-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-entry.js","sourceRoot":"","sources":["../../src/worker/worker-entry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "git-doc-mcp",
3
+ "version": "0.1.0",
4
+ "description": "Turn any manifest URL into a fully-functional MCP server",
5
+ "keywords": [
6
+ "mcp",
7
+ "model-context-protocol",
8
+ "ai",
9
+ "claude",
10
+ "llm"
11
+ ],
12
+ "author": "",
13
+ "license": "MIT",
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "import": "./dist/index.js",
20
+ "types": "./dist/index.d.ts"
21
+ }
22
+ },
23
+ "bin": {
24
+ "git-doc-mcp": "./dist/cli/index.js"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md",
29
+ "LICENSE"
30
+ ],
31
+ "engines": {
32
+ "node": ">=18.0.0"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc",
36
+ "test": "vitest run",
37
+ "test:watch": "vitest",
38
+ "clean": "rm -rf dist",
39
+ "dev": "tsc --watch"
40
+ },
41
+ "dependencies": {
42
+ "@modelcontextprotocol/sdk": "^1.0.0",
43
+ "commander": "^12.0.0",
44
+ "isolated-vm": "^5.0.0",
45
+ "js-yaml": "^4.1.0",
46
+ "zod": "^3.24.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/js-yaml": "^4.0.9",
50
+ "@types/node": "^22.0.0",
51
+ "@vitest/coverage-v8": "^2.1.9",
52
+ "typescript": "^5.7.0",
53
+ "vitest": "^2.0.0"
54
+ }
55
+ }