@lon-ask/dockit 0.1.1 → 0.1.2

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 (136) hide show
  1. package/README.md +482 -337
  2. package/SKILL.md +94 -103
  3. package/apps/client/index.html +12 -0
  4. package/apps/client/package.json +26 -0
  5. package/apps/client/src/App.tsx +18 -0
  6. package/apps/client/src/api/client.ts +54 -0
  7. package/apps/client/src/components/BuildPanel.tsx +77 -0
  8. package/apps/client/src/components/DocViewer.tsx +76 -0
  9. package/apps/client/src/components/EntryDetail.tsx +322 -0
  10. package/apps/client/src/components/EntryForm.tsx +117 -0
  11. package/apps/client/src/components/EntryList.tsx +165 -0
  12. package/apps/client/src/components/GlobalSearchBar.tsx +166 -0
  13. package/apps/client/src/components/Layout.tsx +57 -0
  14. package/apps/client/src/components/SearchBar.tsx +103 -0
  15. package/apps/client/src/components/SourceForm.tsx +497 -0
  16. package/apps/client/src/hooks/useTheme.ts +19 -0
  17. package/apps/client/src/index.css +77 -0
  18. package/apps/client/src/main.tsx +13 -0
  19. package/apps/client/src/types.ts +105 -0
  20. package/apps/client/vite.config.ts +13 -0
  21. package/apps/server/dist/core/domain/entry.js +20 -0
  22. package/apps/server/dist/core/domain/entry.js.map +1 -0
  23. package/apps/server/dist/core/domain/errors.js +33 -0
  24. package/apps/server/dist/core/domain/errors.js.map +1 -0
  25. package/apps/server/dist/core/domain/knowledge-graph.js +2 -0
  26. package/apps/server/dist/core/domain/knowledge-graph.js.map +1 -0
  27. package/apps/server/dist/core/domain/types.js +2 -0
  28. package/apps/server/dist/core/domain/types.js.map +1 -0
  29. package/apps/server/dist/core/ports/IBuildRepository.js +2 -0
  30. package/apps/server/dist/core/ports/IBuildRepository.js.map +1 -0
  31. package/apps/server/dist/core/ports/IDocumentNormalizer.js +2 -0
  32. package/apps/server/dist/core/ports/IDocumentNormalizer.js.map +1 -0
  33. package/apps/server/dist/core/ports/IDocumentStore.js +2 -0
  34. package/apps/server/dist/core/ports/IDocumentStore.js.map +1 -0
  35. package/apps/server/dist/core/ports/IEntryReadModel.js +2 -0
  36. package/apps/server/dist/core/ports/IEntryReadModel.js.map +1 -0
  37. package/apps/server/dist/core/ports/IEntryRepository.js +2 -0
  38. package/apps/server/dist/core/ports/IEntryRepository.js.map +1 -0
  39. package/apps/server/dist/core/ports/IKnowledgeGraph.js +2 -0
  40. package/apps/server/dist/core/ports/IKnowledgeGraph.js.map +1 -0
  41. package/apps/server/dist/core/ports/IPathResolver.js +2 -0
  42. package/apps/server/dist/core/ports/IPathResolver.js.map +1 -0
  43. package/apps/server/dist/core/ports/ISearchEngine.js +2 -0
  44. package/apps/server/dist/core/ports/ISearchEngine.js.map +1 -0
  45. package/apps/server/dist/core/ports/ISourceProcessor.js +2 -0
  46. package/apps/server/dist/core/ports/ISourceProcessor.js.map +1 -0
  47. package/apps/server/dist/core/ports/ISourceRepository.js +2 -0
  48. package/apps/server/dist/core/ports/ISourceRepository.js.map +1 -0
  49. package/apps/server/dist/core/usecases/BuildUseCase.js +76 -0
  50. package/apps/server/dist/core/usecases/BuildUseCase.js.map +1 -0
  51. package/apps/server/dist/core/usecases/ConfigUseCase.js +62 -0
  52. package/apps/server/dist/core/usecases/ConfigUseCase.js.map +1 -0
  53. package/apps/server/dist/core/usecases/SearchUseCase.js +17 -0
  54. package/apps/server/dist/core/usecases/SearchUseCase.js.map +1 -0
  55. package/apps/server/dist/index.js +86 -0
  56. package/apps/server/dist/index.js.map +1 -0
  57. package/apps/server/dist/infrastructure/filesystem/FileSystemDocumentStore.js +25 -0
  58. package/apps/server/dist/infrastructure/filesystem/FileSystemDocumentStore.js.map +1 -0
  59. package/apps/server/dist/infrastructure/graph/GraphSearchDecorator.js +42 -0
  60. package/apps/server/dist/infrastructure/graph/GraphSearchDecorator.js.map +1 -0
  61. package/apps/server/dist/infrastructure/graph/GraphifyKnowledgeGraph.js +145 -0
  62. package/apps/server/dist/infrastructure/graph/GraphifyKnowledgeGraph.js.map +1 -0
  63. package/apps/server/dist/infrastructure/graph/index.js +3 -0
  64. package/apps/server/dist/infrastructure/graph/index.js.map +1 -0
  65. package/apps/server/dist/infrastructure/persistence/sqlite/SqliteBuildRepository.js +21 -0
  66. package/apps/server/dist/infrastructure/persistence/sqlite/SqliteBuildRepository.js.map +1 -0
  67. package/apps/server/dist/infrastructure/persistence/sqlite/SqliteEntryReadModel.js +11 -0
  68. package/apps/server/dist/infrastructure/persistence/sqlite/SqliteEntryReadModel.js.map +1 -0
  69. package/apps/server/dist/infrastructure/persistence/sqlite/SqliteEntryRepository.js +59 -0
  70. package/apps/server/dist/infrastructure/persistence/sqlite/SqliteEntryRepository.js.map +1 -0
  71. package/apps/server/dist/infrastructure/persistence/sqlite/SqliteSourceRepository.js +47 -0
  72. package/apps/server/dist/infrastructure/persistence/sqlite/SqliteSourceRepository.js.map +1 -0
  73. package/apps/server/dist/infrastructure/persistence/sqlite/connection.js +50 -0
  74. package/apps/server/dist/infrastructure/persistence/sqlite/connection.js.map +1 -0
  75. package/apps/server/dist/infrastructure/search/SearchEngineFactory.js +32 -0
  76. package/apps/server/dist/infrastructure/search/SearchEngineFactory.js.map +1 -0
  77. package/apps/server/dist/infrastructure/search/json/JsonSearchEngine.js +147 -0
  78. package/apps/server/dist/infrastructure/search/json/JsonSearchEngine.js.map +1 -0
  79. package/apps/server/dist/infrastructure/search/vector/EmbeddingService.js +23 -0
  80. package/apps/server/dist/infrastructure/search/vector/EmbeddingService.js.map +1 -0
  81. package/apps/server/dist/infrastructure/search/vector/VectorSearchEngine.js +378 -0
  82. package/apps/server/dist/infrastructure/search/vector/VectorSearchEngine.js.map +1 -0
  83. package/apps/server/dist/infrastructure/source-processors/AntoraSourceProcessor.js +11 -0
  84. package/apps/server/dist/infrastructure/source-processors/AntoraSourceProcessor.js.map +1 -0
  85. package/apps/server/dist/infrastructure/source-processors/AsciidocSourceProcessor.js +9 -0
  86. package/apps/server/dist/infrastructure/source-processors/AsciidocSourceProcessor.js.map +1 -0
  87. package/apps/server/dist/infrastructure/source-processors/DocumentNormalizer.js +11 -0
  88. package/apps/server/dist/infrastructure/source-processors/DocumentNormalizer.js.map +1 -0
  89. package/apps/server/dist/infrastructure/source-processors/GithubMarkdownSourceProcessor.js +9 -0
  90. package/apps/server/dist/infrastructure/source-processors/GithubMarkdownSourceProcessor.js.map +1 -0
  91. package/apps/server/dist/infrastructure/source-processors/MavenSourceProcessor.js +9 -0
  92. package/apps/server/dist/infrastructure/source-processors/MavenSourceProcessor.js.map +1 -0
  93. package/apps/server/dist/infrastructure/source-processors/PathResolver.js +5 -0
  94. package/apps/server/dist/infrastructure/source-processors/PathResolver.js.map +1 -0
  95. package/apps/server/dist/infrastructure/source-processors/SourceCodeSourceProcessor.js +261 -0
  96. package/apps/server/dist/infrastructure/source-processors/SourceCodeSourceProcessor.js.map +1 -0
  97. package/apps/server/dist/infrastructure/source-processors/ZipSourceProcessor.js +9 -0
  98. package/apps/server/dist/infrastructure/source-processors/ZipSourceProcessor.js.map +1 -0
  99. package/apps/server/dist/mcp-http.js +93 -0
  100. package/apps/server/dist/mcp-http.js.map +1 -0
  101. package/apps/server/dist/mcp.js +339 -0
  102. package/apps/server/dist/mcp.js.map +1 -0
  103. package/apps/server/dist/routes/build.js +89 -0
  104. package/apps/server/dist/routes/build.js.map +1 -0
  105. package/apps/server/dist/routes/entries.js +52 -0
  106. package/apps/server/dist/routes/entries.js.map +1 -0
  107. package/apps/server/dist/routes/graph.js +58 -0
  108. package/apps/server/dist/routes/graph.js.map +1 -0
  109. package/apps/server/dist/routes/search.js +24 -0
  110. package/apps/server/dist/routes/search.js.map +1 -0
  111. package/apps/server/dist/routes/sources.js +100 -0
  112. package/apps/server/dist/routes/sources.js.map +1 -0
  113. package/apps/server/dist/routes/viewer.js +22 -0
  114. package/apps/server/dist/routes/viewer.js.map +1 -0
  115. package/apps/server/dist/services/antora.js +222 -0
  116. package/apps/server/dist/services/antora.js.map +1 -0
  117. package/apps/server/dist/services/asciidoc.js +206 -0
  118. package/apps/server/dist/services/asciidoc.js.map +1 -0
  119. package/apps/server/dist/services/configLoader.js +150 -0
  120. package/apps/server/dist/services/configLoader.js.map +1 -0
  121. package/apps/server/dist/services/githubMarkdown.js +221 -0
  122. package/apps/server/dist/services/githubMarkdown.js.map +1 -0
  123. package/apps/server/dist/services/maven.js +148 -0
  124. package/apps/server/dist/services/maven.js.map +1 -0
  125. package/apps/server/dist/services/normalizer.js +42 -0
  126. package/apps/server/dist/services/normalizer.js.map +1 -0
  127. package/apps/server/dist/services/paths.js +5 -0
  128. package/apps/server/dist/services/paths.js.map +1 -0
  129. package/apps/server/dist/services/textExtractor.js +46 -0
  130. package/apps/server/dist/services/textExtractor.js.map +1 -0
  131. package/apps/server/dist/services/zip.js +63 -0
  132. package/apps/server/dist/services/zip.js.map +1 -0
  133. package/apps/server/package.json +38 -0
  134. package/bin/commands/dev.ts +2 -2
  135. package/bin/commands/serve.ts +2 -2
  136. package/package.json +17 -3
@@ -0,0 +1,261 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import os from 'node:os';
4
+ import { spawn, execSync } from 'node:child_process';
5
+ import { Readable } from 'node:stream';
6
+ import { pipeline } from 'node:stream/promises';
7
+ import unzipper from 'unzipper';
8
+ const GRAPHIFY_TIMEOUT = 600_000;
9
+ function execWithTimeout(cmd, args, log) {
10
+ return new Promise((resolve, reject) => {
11
+ const proc = spawn(cmd, args, {
12
+ stdio: ['ignore', 'pipe', 'pipe'],
13
+ timeout: GRAPHIFY_TIMEOUT,
14
+ });
15
+ let stderr = '';
16
+ proc.stdout?.on('data', (data) => {
17
+ for (const line of data.toString().trim().split('\n')) {
18
+ if (line)
19
+ log(` graphify: ${line}`);
20
+ }
21
+ });
22
+ proc.stderr?.on('data', (data) => {
23
+ stderr += data.toString();
24
+ });
25
+ proc.on('close', (code) => {
26
+ if (code === 0)
27
+ resolve();
28
+ else if (code === 1) {
29
+ log(' graphify: completed with warnings (partial results)');
30
+ resolve();
31
+ }
32
+ else
33
+ reject(new Error(`graphify exited with code ${code}: ${stderr.slice(-500)}`));
34
+ });
35
+ proc.on('error', (err) => reject(new Error(`Failed to run graphify: ${err.message}`)));
36
+ });
37
+ }
38
+ function ensureGraphify(log) {
39
+ try {
40
+ execSync('graphify --version', { stdio: 'pipe', timeout: 10_000 });
41
+ log('Graphify is available on PATH');
42
+ }
43
+ catch {
44
+ log('Graphify not found. Installing via pip...');
45
+ execSync('pip3 install graphify 2>&1', { stdio: 'pipe', timeout: 120_000 });
46
+ log('Graphify installed successfully');
47
+ }
48
+ try {
49
+ execSync('pip3 install openai 2>&1', { stdio: 'pipe', timeout: 120_000 });
50
+ }
51
+ catch {
52
+ log('Warning: could not install openai (semantic extraction unavailable)');
53
+ }
54
+ }
55
+ async function cloneRepo(repoUrl, targetDir, branch, log) {
56
+ log(`Cloning repository ${repoUrl}`);
57
+ const branchArg = branch ? ['--branch', branch] : [];
58
+ if (fs.existsSync(targetDir))
59
+ fs.rmSync(targetDir, { recursive: true, force: true });
60
+ return new Promise((resolve, reject) => {
61
+ const proc = spawn('git', ['clone', '--depth', '1', ...branchArg, repoUrl, targetDir], {
62
+ stdio: ['ignore', 'pipe', 'pipe'],
63
+ });
64
+ let stderr = '';
65
+ proc.stderr?.on('data', (data) => {
66
+ stderr += data.toString();
67
+ for (const line of data.toString().trim().split('\n')) {
68
+ if (line)
69
+ log(` git: ${line}`);
70
+ }
71
+ });
72
+ proc.on('close', (code) => {
73
+ if (code === 0) {
74
+ log('Repository cloned successfully');
75
+ resolve();
76
+ }
77
+ else
78
+ reject(new Error(`git clone failed with code ${code}: ${stderr.slice(-300)}`));
79
+ });
80
+ proc.on('error', reject);
81
+ });
82
+ }
83
+ async function extractZip(zipPath, targetDir, log) {
84
+ log(`Extracting ZIP from ${zipPath}`);
85
+ fs.mkdirSync(targetDir, { recursive: true });
86
+ const data = fs.readFileSync(zipPath);
87
+ const stream = Readable.from(data);
88
+ await pipeline(stream, unzipper.Extract({ path: targetDir }));
89
+ const entries = fs.readdirSync(targetDir);
90
+ if (entries.length === 1 && fs.statSync(path.join(targetDir, entries[0])).isDirectory()) {
91
+ log('Flattening single root directory...');
92
+ const innerDir = path.join(targetDir, entries[0]);
93
+ for (const entry of fs.readdirSync(innerDir)) {
94
+ fs.renameSync(path.join(innerDir, entry), path.join(targetDir, entry));
95
+ }
96
+ fs.rmdirSync(innerDir);
97
+ }
98
+ log(`Extracted to ${targetDir}`);
99
+ }
100
+ function readGraphMetadata(graphJsonPath) {
101
+ try {
102
+ const data = JSON.parse(fs.readFileSync(graphJsonPath, 'utf-8'));
103
+ const nodes = (data.nodes || []).length;
104
+ const edges = (data.edges || []).length;
105
+ const communities = new Set((data.nodes || []).map((n) => n.community).filter(Boolean)).size;
106
+ return { nodeCount: nodes, edgeCount: edges, communities };
107
+ }
108
+ catch {
109
+ return { nodeCount: 0, edgeCount: 0, communities: 0 };
110
+ }
111
+ }
112
+ export class SourceCodeSourceProcessor {
113
+ sourceType = 'source-code';
114
+ async runGraphify(config, entryDir, log) {
115
+ const cfg = config;
116
+ let repoDir;
117
+ let shouldCleanupRepo = false;
118
+ try {
119
+ if (cfg.localPath) {
120
+ if (!fs.existsSync(cfg.localPath))
121
+ throw new Error(`Local path not found: ${cfg.localPath}`);
122
+ log(`Using local directory: ${cfg.localPath}`);
123
+ repoDir = cfg.localPath;
124
+ }
125
+ else if (cfg.repoUrl) {
126
+ repoDir = path.join(os.tmpdir(), `dockit-graphify-${Date.now()}`);
127
+ await cloneRepo(cfg.repoUrl, repoDir, cfg.branch, log);
128
+ shouldCleanupRepo = true;
129
+ }
130
+ else if (cfg.zipPath) {
131
+ repoDir = path.join(os.tmpdir(), `dockit-graphify-${Date.now()}`);
132
+ fs.mkdirSync(repoDir, { recursive: true });
133
+ await extractZip(cfg.zipPath, repoDir, log);
134
+ shouldCleanupRepo = true;
135
+ }
136
+ else {
137
+ throw new Error('graphifyEnabled requires repoUrl, localPath, or zipPath on the source');
138
+ }
139
+ ensureGraphify(log);
140
+ const graphifyDir = cfg.graphifySourcePath ? path.join(repoDir, cfg.graphifySourcePath) : repoDir;
141
+ if (!fs.existsSync(graphifyDir)) {
142
+ throw new Error(`graphifySourcePath not found: ${cfg.graphifySourcePath}`);
143
+ }
144
+ log(`Running Graphify on ${graphifyDir}...`);
145
+ await execWithTimeout('graphify', ['update', graphifyDir], log);
146
+ const graphOutDir = path.join(graphifyDir, 'graphify-out');
147
+ const graphJsonPath = path.join(graphOutDir, 'graph.json');
148
+ const graphHtmlPath = path.join(graphOutDir, 'graph.html');
149
+ if (fs.existsSync(graphJsonPath)) {
150
+ const destJson = path.join(entryDir, 'graph.json');
151
+ fs.copyFileSync(graphJsonPath, destJson);
152
+ log(`Copied graph.json to ${destJson}`);
153
+ const meta = readGraphMetadata(destJson);
154
+ log(`Graph: ${meta.nodeCount} nodes, ${meta.edgeCount} edges, ${meta.communities} communities`);
155
+ }
156
+ else {
157
+ log('WARNING: graph.json not produced by Graphify');
158
+ }
159
+ if (fs.existsSync(graphHtmlPath)) {
160
+ const destHtml = path.join(entryDir, 'graph.html');
161
+ fs.copyFileSync(graphHtmlPath, destHtml);
162
+ log(`Copied graph.html to ${destHtml}`);
163
+ }
164
+ }
165
+ finally {
166
+ if (shouldCleanupRepo && repoDir && fs.existsSync(repoDir)) {
167
+ fs.rmSync(repoDir, { recursive: true, force: true });
168
+ }
169
+ }
170
+ }
171
+ async process(source, sourceDir, entryDir, _entryId, log) {
172
+ const config = source.config;
173
+ let repoDir;
174
+ let shouldCleanup;
175
+ if (config.localPath) {
176
+ if (!fs.existsSync(config.localPath))
177
+ throw new Error(`Local path not found: ${config.localPath}`);
178
+ if (!fs.statSync(config.localPath).isDirectory())
179
+ throw new Error(`localPath must be a directory: ${config.localPath}`);
180
+ log(`Using local directory: ${config.localPath}`);
181
+ repoDir = config.localPath;
182
+ shouldCleanup = false;
183
+ }
184
+ else if (config.repoUrl) {
185
+ repoDir = path.join(os.tmpdir(), `dockit-source-${Date.now()}`);
186
+ await cloneRepo(config.repoUrl, repoDir, config.branch, log);
187
+ shouldCleanup = true;
188
+ }
189
+ else if (config.zipPath) {
190
+ repoDir = path.join(os.tmpdir(), `dockit-source-${Date.now()}`);
191
+ fs.mkdirSync(repoDir, { recursive: true });
192
+ await extractZip(config.zipPath, repoDir, log);
193
+ shouldCleanup = true;
194
+ }
195
+ else {
196
+ throw new Error('Source code source requires repoUrl, localPath, or zipPath');
197
+ }
198
+ try {
199
+ const targetDir = config.sourcePath ? path.join(repoDir, config.sourcePath) : repoDir;
200
+ if (!fs.existsSync(targetDir)) {
201
+ throw new Error(`Source path not found: ${config.sourcePath || '(root)'}`);
202
+ }
203
+ fs.mkdirSync(sourceDir, { recursive: true });
204
+ copyDirContents(targetDir, sourceDir, log);
205
+ log('Ensuring Graphify is available...');
206
+ ensureGraphify(log);
207
+ const graphifyDir = config.graphifySourcePath
208
+ ? path.join(repoDir, config.graphifySourcePath)
209
+ : config.sourcePath
210
+ ? targetDir
211
+ : repoDir;
212
+ if (!fs.existsSync(graphifyDir)) {
213
+ throw new Error(`Graphify target not found: ${config.graphifySourcePath || config.sourcePath || '(root)'}`);
214
+ }
215
+ log(`Running Graphify on ${graphifyDir}...`);
216
+ await execWithTimeout('graphify', ['update', graphifyDir], log);
217
+ const graphOutDir = path.join(graphifyDir, 'graphify-out');
218
+ const graphJsonPath = path.join(graphOutDir, 'graph.json');
219
+ const graphHtmlPath = path.join(graphOutDir, 'graph.html');
220
+ if (fs.existsSync(graphJsonPath)) {
221
+ const destJson = path.join(entryDir, 'graph.json');
222
+ fs.copyFileSync(graphJsonPath, destJson);
223
+ log(`Copied graph.json to ${destJson}`);
224
+ const meta = readGraphMetadata(destJson);
225
+ log(`Graph: ${meta.nodeCount} nodes, ${meta.edgeCount} edges, ${meta.communities} communities`);
226
+ }
227
+ else {
228
+ log('WARNING: graph.json not produced by Graphify');
229
+ }
230
+ if (fs.existsSync(graphHtmlPath)) {
231
+ const destHtml = path.join(entryDir, 'graph.html');
232
+ fs.copyFileSync(graphHtmlPath, destHtml);
233
+ log(`Copied graph.html to ${destHtml}`);
234
+ }
235
+ return sourceDir;
236
+ }
237
+ finally {
238
+ if (shouldCleanup && fs.existsSync(repoDir)) {
239
+ log('Cleaning up cloned repository...');
240
+ fs.rmSync(repoDir, { recursive: true, force: true });
241
+ }
242
+ }
243
+ }
244
+ }
245
+ function copyDirContents(srcDir, destDir, log) {
246
+ const entries = fs.readdirSync(srcDir, { withFileTypes: true });
247
+ for (const entry of entries) {
248
+ if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'target')
249
+ continue;
250
+ const srcPath = path.join(srcDir, entry.name);
251
+ const destPath = path.join(destDir, entry.name);
252
+ if (entry.isDirectory()) {
253
+ fs.mkdirSync(destPath, { recursive: true });
254
+ copyDirContents(srcPath, destPath, log);
255
+ }
256
+ else {
257
+ fs.copyFileSync(srcPath, destPath);
258
+ }
259
+ }
260
+ }
261
+ //# sourceMappingURL=SourceCodeSourceProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourceCodeSourceProcessor.js","sourceRoot":"","sources":["../../../src/infrastructure/source-processors/SourceCodeSourceProcessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { downloadAndExtractZip } from '../../services/zip.js';
2
+ export class ZipSourceProcessor {
3
+ sourceType = 'zip';
4
+ async process(source, sourceDir, _entryDir, _entryId, log) {
5
+ await downloadAndExtractZip(source.config, sourceDir, log);
6
+ return sourceDir;
7
+ }
8
+ }
9
+ //# sourceMappingURL=ZipSourceProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZipSourceProcessor.js","sourceRoot":"","sources":["../../../src/infrastructure/source-processors/ZipSourceProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,OAAO,kBAAkB;IACpB,UAAU,GAAG,KAAc,CAAC;IAErC,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,SAAiB,EAAE,SAAiB,EAAE,QAAgB,EAAE,GAA0B;QAC9G,MAAM,qBAAqB,CAAC,MAAM,CAAC,MAAyB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9E,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Dockit MCP HTTP Bridge
4
+ * Proxies JSON-RPC requests over HTTP to the Dockit MCP stdio server.
5
+ *
6
+ * Usage:
7
+ * node --import=tsx apps/server/src/mcp-http.ts [port]
8
+ * DOCKIT_MCP_HTTP_PORT=3456 npx tsx apps/server/src/mcp-http.ts
9
+ *
10
+ * Then curl:
11
+ * curl -X POST http://localhost:3456 \
12
+ * -H "Content-Type: application/json" \
13
+ * -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
14
+ */
15
+ import { spawn } from 'node:child_process';
16
+ import http from 'node:http';
17
+ import path from 'node:path';
18
+ import { fileURLToPath } from 'node:url';
19
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
20
+ const MCP_SCRIPT = path.join(__dirname, 'mcp.ts');
21
+ const PORT = parseInt(process.env.DOCKIT_MCP_HTTP_PORT || process.argv[2] || '3456', 10);
22
+ // Spawn the stdio MCP server
23
+ const mcp = spawn('npx', ['tsx', MCP_SCRIPT], {
24
+ cwd: path.join(__dirname, '..', '..', '..'),
25
+ env: { ...process.env, PATH: process.env.PATH },
26
+ });
27
+ let buffer = '';
28
+ const pending = new Map();
29
+ mcp.stdout.on('data', (data) => {
30
+ buffer += data.toString('utf-8');
31
+ let lines = buffer.split('\n');
32
+ buffer = lines.pop() || '';
33
+ for (const line of lines) {
34
+ const trimmed = line.trim();
35
+ if (!trimmed)
36
+ continue;
37
+ try {
38
+ const msg = JSON.parse(trimmed);
39
+ if (msg.id !== undefined && pending.has(msg.id)) {
40
+ pending.get(msg.id)(msg);
41
+ pending.delete(msg.id);
42
+ }
43
+ }
44
+ catch {
45
+ // ignore non-JSON lines
46
+ }
47
+ }
48
+ });
49
+ mcp.stderr.on('data', (data) => {
50
+ process.stderr.write(data);
51
+ });
52
+ mcp.on('exit', (code) => {
53
+ console.error(`[mcp-http] MCP server exited with code ${code}`);
54
+ process.exit(code ?? 1);
55
+ });
56
+ // HTTP server
57
+ const server = http.createServer((req, res) => {
58
+ if (req.method !== 'POST') {
59
+ res.writeHead(405, { 'Content-Type': 'application/json' });
60
+ res.end(JSON.stringify({ error: 'Method not allowed' }));
61
+ return;
62
+ }
63
+ let body = '';
64
+ req.on('data', (chunk) => { body += chunk; });
65
+ req.on('end', () => {
66
+ try {
67
+ const request = JSON.parse(body);
68
+ const id = request.id ?? Math.random().toString(36).slice(2);
69
+ request.id = id;
70
+ const timeout = setTimeout(() => {
71
+ if (pending.has(id)) {
72
+ pending.delete(id);
73
+ res.writeHead(504, { 'Content-Type': 'application/json' });
74
+ res.end(JSON.stringify({ jsonrpc: '2.0', id, error: { code: -32000, message: 'Request timeout' } }));
75
+ }
76
+ }, 30000);
77
+ pending.set(id, (response) => {
78
+ clearTimeout(timeout);
79
+ res.writeHead(200, { 'Content-Type': 'application/json' });
80
+ res.end(JSON.stringify(response));
81
+ });
82
+ mcp.stdin.write(JSON.stringify(request) + '\n');
83
+ }
84
+ catch (err) {
85
+ res.writeHead(400, { 'Content-Type': 'application/json' });
86
+ res.end(JSON.stringify({ error: err.message }));
87
+ }
88
+ });
89
+ });
90
+ server.listen(PORT, () => {
91
+ console.error(`[mcp-http] Bridge listening on http://localhost:${PORT}`);
92
+ });
93
+ //# sourceMappingURL=mcp-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-http.js","sourceRoot":"","sources":["../src/mcp-http.ts"],"names":[],"mappings":"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"}