diagram-tool 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 (46) hide show
  1. package/README.md +64 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +239 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/context.d.ts +27 -0
  6. package/dist/context.js +55 -0
  7. package/dist/context.js.map +1 -0
  8. package/dist/diagram.d.ts +51 -0
  9. package/dist/diagram.js +519 -0
  10. package/dist/diagram.js.map +1 -0
  11. package/dist/dom-shim.d.ts +1 -0
  12. package/dist/dom-shim.js +59 -0
  13. package/dist/dom-shim.js.map +1 -0
  14. package/dist/guide.d.ts +9 -0
  15. package/dist/guide.js +99 -0
  16. package/dist/guide.js.map +1 -0
  17. package/dist/library.d.ts +76 -0
  18. package/dist/library.js +364 -0
  19. package/dist/library.js.map +1 -0
  20. package/dist/llm.d.ts +23 -0
  21. package/dist/llm.js +124 -0
  22. package/dist/llm.js.map +1 -0
  23. package/dist/mcp-install.d.ts +1 -0
  24. package/dist/mcp-install.js +68 -0
  25. package/dist/mcp-install.js.map +1 -0
  26. package/dist/mcp.d.ts +6 -0
  27. package/dist/mcp.js +262 -0
  28. package/dist/mcp.js.map +1 -0
  29. package/dist/public/Assistant-Bold-ZDZZ6JHA.woff2 +0 -0
  30. package/dist/public/Assistant-Medium-DZ25RZU3.woff2 +0 -0
  31. package/dist/public/Assistant-Regular-PLF2XOGW.woff2 +0 -0
  32. package/dist/public/Assistant-SemiBold-CZ5MX6FK.woff2 +0 -0
  33. package/dist/public/viewer.css +2 -0
  34. package/dist/public/viewer.css.map +7 -0
  35. package/dist/public/viewer.js +3092 -0
  36. package/dist/public/viewer.js.map +7 -0
  37. package/dist/server.d.ts +9 -0
  38. package/dist/server.js +166 -0
  39. package/dist/server.js.map +1 -0
  40. package/libraries/UML-ER-library.excalidrawlib +5380 -0
  41. package/libraries/awesome-icons.excalidrawlib +4081 -0
  42. package/libraries/dev_ops.excalidrawlib +35468 -0
  43. package/libraries/network-topology-icons.excalidrawlib +5290 -0
  44. package/libraries/system-icons.excalidrawlib +4521 -0
  45. package/libraries/systemdesignicons.excalidrawlib +1307 -0
  46. package/package.json +38 -0
package/dist/llm.js ADDED
@@ -0,0 +1,124 @@
1
+ /** Tiny fetch-based LLM layer. No provider SDKs. */
2
+ export class LlmError extends Error {
3
+ provider;
4
+ status;
5
+ constructor(provider, message, status) {
6
+ super(`[${provider}] ${message}`);
7
+ this.name = "LlmError";
8
+ this.provider = provider;
9
+ this.status = status;
10
+ }
11
+ }
12
+ const DEFAULT_KEYS = {
13
+ openai: ["OPENAI_API_KEY"],
14
+ anthropic: ["ANTHROPIC_API_KEY"],
15
+ google: ["GOOGLE_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY"],
16
+ ollama: [],
17
+ openrouter: ["OPENROUTER_API_KEY"],
18
+ };
19
+ export const DEFAULT_MODELS = {
20
+ openai: "gpt-4.1-mini",
21
+ anthropic: "claude-sonnet-4-6",
22
+ google: "gemini-2.0-flash",
23
+ ollama: "llama3.1",
24
+ openrouter: "meta-llama/llama-3.3-70b-instruct",
25
+ };
26
+ export function resolveKey(provider, apiKey) {
27
+ if (apiKey)
28
+ return apiKey;
29
+ for (const n of DEFAULT_KEYS[provider]) {
30
+ const v = process.env[n];
31
+ if (v)
32
+ return v;
33
+ }
34
+ return undefined;
35
+ }
36
+ async function postJson(url, headers, body, timeoutMs) {
37
+ const ctrl = new AbortController();
38
+ const t = setTimeout(() => ctrl.abort(), timeoutMs);
39
+ try {
40
+ const res = await fetch(url, {
41
+ method: "POST",
42
+ headers: { "content-type": "application/json", ...headers },
43
+ body: JSON.stringify(body),
44
+ signal: ctrl.signal,
45
+ });
46
+ const data = (await res.json().catch(() => ({})));
47
+ if (!res.ok) {
48
+ const msg = typeof data.error === "string" ? data.error : (data.error?.message ?? `HTTP ${res.status}`);
49
+ const err = new Error(msg);
50
+ err.status = res.status;
51
+ throw err;
52
+ }
53
+ return data;
54
+ }
55
+ finally {
56
+ clearTimeout(t);
57
+ }
58
+ }
59
+ function isTransient(status, err) {
60
+ if (status === 429 || (status !== undefined && status >= 500))
61
+ return true;
62
+ const m = err instanceof Error ? err.message : String(err);
63
+ return /timeout|abort|econnreset|fetch failed|socket hang up|overloaded/i.test(m);
64
+ }
65
+ async function completeOnce(provider, model, messages, o) {
66
+ const temp = o.temperature ?? 0.2;
67
+ switch (provider) {
68
+ case "openai":
69
+ case "openrouter": {
70
+ const base = provider === "openrouter"
71
+ ? (o.baseUrl || "https://openrouter.ai").replace(/\/$/, "")
72
+ : (o.baseUrl || "https://api.openai.com").replace(/\/$/, "");
73
+ const url = `${base}/api/v1/chat/completions`;
74
+ const headers = provider === "openrouter"
75
+ ? { authorization: `Bearer ${o.key ?? ""}`, "HTTP-Referer": "https://github.com/diagram-tool", "X-Title": "Diagram Tool" }
76
+ : { authorization: `Bearer ${o.key ?? ""}` };
77
+ const d = (await postJson(url, headers, { model, messages, temperature: temp }, 30_000));
78
+ return d.choices?.[0]?.message?.content?.trim() ?? "";
79
+ }
80
+ case "ollama": {
81
+ const base = (o.baseUrl || process.env.DIAGRAM_TOOL_BASE_URL || process.env.FORGE_BASE_URL || "http://localhost:11434").replace(/\/$/, "");
82
+ const d = (await postJson(`${base}/api/chat`, {}, { model, messages, stream: false, options: { temperature: temp } }, 30_000));
83
+ return d.message?.content?.trim() ?? "";
84
+ }
85
+ case "anthropic": {
86
+ const base = (o.baseUrl || "https://api.anthropic.com").replace(/\/$/, "");
87
+ const system = messages.filter((m) => m.role === "system").map((m) => m.content).join("\n\n");
88
+ const rest = messages.filter((m) => m.role !== "system");
89
+ const d = (await postJson(`${base}/v1/messages`, { "x-api-key": o.key ?? "", "anthropic-version": "2023-06-01" }, { model, max_tokens: 2048, ...(system ? { system } : {}), messages: rest, temperature: temp }, 30_000));
90
+ return d.content?.filter((b) => b.type === "text").map((b) => b.text ?? "").join("") ?? "";
91
+ }
92
+ case "google": {
93
+ const base = (o.baseUrl || "https://generativelanguage.googleapis.com").replace(/\/$/, "");
94
+ const system = messages.filter((m) => m.role === "system").map((m) => m.content).join("\n\n");
95
+ const contents = messages
96
+ .filter((m) => m.role !== "system")
97
+ .map((m) => ({ role: m.role === "assistant" ? "model" : "user", parts: [{ text: m.content }] }));
98
+ const d = (await postJson(`${base}/v1beta/models/${model}:generateContent?key=${o.key ?? ""}`, {}, { ...(system ? { system_instruction: { parts: [{ text: system }] } } : {}), contents, generationConfig: { temperature: temp } }, 30_000));
99
+ return d.candidates?.[0]?.content?.parts?.map((p) => p.text ?? "").join("") ?? "";
100
+ }
101
+ }
102
+ }
103
+ /** One automatic retry on 429/5xx/timeout. Throws LlmError otherwise. */
104
+ export async function complete(messages, opts) {
105
+ const key = resolveKey(opts.provider, opts.apiKey);
106
+ const base = { apiKey: opts.apiKey ?? "", baseUrl: opts.baseUrl ?? "", temperature: opts.temperature ?? 0.2, key };
107
+ for (let attempt = 1; attempt <= 2; attempt++) {
108
+ try {
109
+ const text = await completeOnce(opts.provider, opts.model, messages, base);
110
+ if (!text)
111
+ throw new LlmError(opts.provider, "empty response from model");
112
+ return text;
113
+ }
114
+ catch (e) {
115
+ const status = e.status;
116
+ const msg = e instanceof Error ? e.message : String(e);
117
+ if (attempt === 2 || !isTransient(status, e))
118
+ throw new LlmError(opts.provider, msg, status);
119
+ await new Promise((r) => setTimeout(r, 500 + Math.random() * 500));
120
+ }
121
+ }
122
+ throw new LlmError(opts.provider, "failed");
123
+ }
124
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function installMcp(agent: string): Promise<void>;
@@ -0,0 +1,68 @@
1
+ /** diagram-tool mcp-install — write the MCP snippet into agent configs. */
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { join, dirname } from "node:path";
4
+ import { existsSync } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ const SNIPPET = { command: "npx", args: ["-y", "diagram-tool", "mcp"] };
7
+ async function readJson(path) {
8
+ try {
9
+ return JSON.parse(await readFile(path, "utf8"));
10
+ }
11
+ catch {
12
+ return {};
13
+ }
14
+ }
15
+ async function writeJson(path, data) {
16
+ await mkdir(dirname(path), { recursive: true });
17
+ await writeFile(path, JSON.stringify(data, null, 2) + "\n");
18
+ console.log(`updated ${path}`);
19
+ }
20
+ /** Generic mcpServers.json shape (Claude Code / Cursor / Windsurf / VSCode). */
21
+ async function installGeneric(path) {
22
+ const cfg = await readJson(path);
23
+ const servers = cfg.mcpServers ?? {};
24
+ servers["diagram-tool"] = SNIPPET;
25
+ cfg.mcpServers = servers;
26
+ await writeJson(path, cfg);
27
+ }
28
+ /** OpenCode shape: { mcp: { diagram-tool: { type: "local", command: [...], enabled: true } } } */
29
+ async function installOpenCode(path) {
30
+ const cfg = await readJson(path);
31
+ const mcp = cfg.mcp ?? {};
32
+ mcp["diagram-tool"] = { type: "local", command: [...["npx", "-y", "diagram-tool"], "mcp"], enabled: true };
33
+ cfg.mcp = mcp;
34
+ await writeJson(path, cfg);
35
+ }
36
+ function detect() {
37
+ if (existsSync(".cursor") || existsSync(join(homedir(), ".cursor", "mcp.json")))
38
+ return "cursor";
39
+ if (existsSync(".vscode") || existsSync(join(homedir(), ".vscode", "mcp.json")))
40
+ return "vscode";
41
+ if (existsSync("opencode.json"))
42
+ return "opencode";
43
+ return "claude";
44
+ }
45
+ export async function installMcp(agent) {
46
+ const a = agent === "auto" ? detect() : agent;
47
+ switch (a) {
48
+ case "opencode": {
49
+ const local = "opencode.json";
50
+ await installOpenCode(existsSync(local) ? local : join(homedir(), ".config", "opencode", "opencode.json"));
51
+ break;
52
+ }
53
+ case "cursor":
54
+ await installGeneric(existsSync(".cursor") ? ".cursor/mcp.json" : join(homedir(), ".cursor", "mcp.json"));
55
+ break;
56
+ case "vscode":
57
+ await installGeneric(existsSync(".vscode") ? ".vscode/mcp.json" : join(homedir(), ".vscode", "mcp.json"));
58
+ break;
59
+ case "claude":
60
+ await installGeneric(join(homedir(), ".config", "Claude", "claude_desktop_config.json"));
61
+ break;
62
+ default:
63
+ throw new Error(`unknown agent "${agent}" (auto|opencode|claude|cursor|vscode)`);
64
+ }
65
+ console.log('verify: restart your agent, then ask it to list tools — "diagram-tool" with render_diagram should appear.');
66
+ console.log('manual snippet: {"mcpServers":{"diagram-tool":{"command":"npx","args":["-y","diagram-tool","mcp"]}}}');
67
+ }
68
+ //# sourceMappingURL=mcp-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-install.js","sourceRoot":"","sources":["../src/mcp-install.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export interface McpOptions {
2
+ context: string;
3
+ port: number;
4
+ noServe: boolean;
5
+ }
6
+ export declare function runMcp(opts: McpOptions): Promise<void>;
package/dist/mcp.js ADDED
@@ -0,0 +1,262 @@
1
+ /** diagram-tool mcp — hand-rolled MCP JSON-RPC over stdio. No deps, stderr-only logs. */
2
+ import { loadContext, saveContext } from "./context.js";
3
+ import { convertToScene, validateMermaid } from "./diagram.js";
4
+ import { applyDecorations, listLibraries, loadLibraryBySlug } from "./library.js";
5
+ import { startServer } from "./server.js";
6
+ import { GET_DESCRIPTION, GUIDE, LIST_ITEMS_DESCRIPTION, LIST_LIBRARIES_DESCRIPTION, RENDER_DESCRIPTION, SERVER_INSTRUCTIONS, } from "./guide.js";
7
+ const TOOLS = [
8
+ {
9
+ name: "render_diagram",
10
+ description: RENDER_DESCRIPTION,
11
+ inputSchema: {
12
+ type: "object",
13
+ properties: {
14
+ mermaidSource: { type: "string", description: "Full mermaid diagram source." },
15
+ prompt: { type: "string", description: "Short label of what changed (stored in context)." },
16
+ decorations: {
17
+ type: "array",
18
+ description: "Optional library icons (max 6). Discover via list_libraries + list_library_items.",
19
+ items: {
20
+ type: "object",
21
+ properties: {
22
+ library: { type: "string", description: "Library slug, e.g. aws-serverless." },
23
+ itemIndex: { type: "integer", description: "Item index from list_library_items." },
24
+ libraryUrl: { type: "string", description: "Custom .excalidrawlib URL (rarely needed)." },
25
+ scale: { type: "number", description: "Scale multiplier, default 1." },
26
+ x: { type: "number", description: "Explicit x (default: auto-tiled row)." },
27
+ y: { type: "number", description: "Explicit y (default: below diagram)." },
28
+ },
29
+ required: ["library", "itemIndex"],
30
+ },
31
+ },
32
+ },
33
+ required: ["mermaidSource"],
34
+ },
35
+ },
36
+ {
37
+ name: "get_diagram",
38
+ description: GET_DESCRIPTION,
39
+ inputSchema: { type: "object", properties: {} },
40
+ },
41
+ {
42
+ name: "list_libraries",
43
+ description: LIST_LIBRARIES_DESCRIPTION,
44
+ inputSchema: {
45
+ type: "object",
46
+ properties: {
47
+ query: { type: "string", description: "Keywords, e.g. 'aws', 'network'. Empty = top picks." },
48
+ },
49
+ },
50
+ },
51
+ {
52
+ name: "list_library_items",
53
+ description: LIST_ITEMS_DESCRIPTION,
54
+ inputSchema: {
55
+ type: "object",
56
+ properties: {
57
+ library: { type: "string", description: "Slug from list_libraries." },
58
+ search: { type: "string", description: "Filter by name substring." },
59
+ libraryUrl: { type: "string", description: "Custom .excalidrawlib URL." },
60
+ },
61
+ required: ["library"],
62
+ },
63
+ },
64
+ ];
65
+ const RESOURCES = [
66
+ { uri: "diagram-tool://guide", name: "Diagram Tool agent guide", mimeType: "text/markdown" },
67
+ ];
68
+ export async function runMcp(opts) {
69
+ let singleton = null;
70
+ const ensureUrl = async () => {
71
+ if (opts.noServe)
72
+ return null;
73
+ if (!singleton)
74
+ singleton = await startServer(opts.context, opts.port);
75
+ return singleton.url;
76
+ };
77
+ const callTool = async (name, args) => {
78
+ switch (name) {
79
+ case "render_diagram": {
80
+ const source = args.mermaidSource;
81
+ if (typeof source !== "string" || !source.trim()) {
82
+ return { text: JSON.stringify({ error: "mermaidSource (string) is required." }), isError: true };
83
+ }
84
+ try {
85
+ await validateMermaid(source.trim());
86
+ }
87
+ catch (e) {
88
+ return { text: JSON.stringify({ error: e instanceof Error ? e.message : String(e) }), isError: true };
89
+ }
90
+ let scene;
91
+ try {
92
+ scene = await convertToScene(source.trim());
93
+ }
94
+ catch (e) {
95
+ return { text: JSON.stringify({ error: e instanceof Error ? e.message : String(e) }), isError: true };
96
+ }
97
+ let placed = undefined;
98
+ const decos = args.decorations;
99
+ if (Array.isArray(decos) && decos.length > 0) {
100
+ try {
101
+ const r = await applyDecorations(scene.elements, decos);
102
+ placed = r.placed;
103
+ }
104
+ catch (e) {
105
+ return { text: JSON.stringify({ error: e instanceof Error ? e.message : String(e) }), isError: true };
106
+ }
107
+ }
108
+ const next = await saveContext(opts.context, {
109
+ ...(typeof args.prompt === "string" ? { prompt: args.prompt } : {}),
110
+ mermaidSource: source.trim(),
111
+ elements: scene.elements,
112
+ });
113
+ const url = await ensureUrl();
114
+ const base = opts.context.replace(/\.context\.json$/, "").replace(/\.json$/, "");
115
+ return {
116
+ text: JSON.stringify({
117
+ rev: next.rev, elements: scene.elements.length, url,
118
+ excalidrawJson: `${base}.excalidraw.json`, mmd: `${base}.mmd`,
119
+ ...(placed !== undefined ? { placed } : {}),
120
+ }),
121
+ };
122
+ }
123
+ case "get_diagram": {
124
+ const ctx = await loadContext(opts.context);
125
+ return { text: JSON.stringify({ rev: ctx.rev, prompt: ctx.prompt, mermaidSource: ctx.mermaidSource }) };
126
+ }
127
+ case "list_libraries": {
128
+ const q = typeof args.query === "string" ? args.query : "";
129
+ return { text: JSON.stringify(listLibraries(q)) };
130
+ }
131
+ case "list_library_items": {
132
+ const lib = args.library;
133
+ if (typeof lib !== "string" || !lib) {
134
+ return { text: JSON.stringify({ error: "library (slug string) is required." }), isError: true };
135
+ }
136
+ try {
137
+ const { groups, names } = await loadLibraryBySlug(lib, typeof args.libraryUrl === "string" ? args.libraryUrl : undefined);
138
+ const search = typeof args.search === "string" ? args.search.toLowerCase() : "";
139
+ const items = groups.map((els, index) => {
140
+ const kinds = els.map((e) => String(e.type));
141
+ const kind = kinds.sort((a, b) => kinds.filter((k) => k === a).length - kinds.filter((k) => k === b).length).pop() ?? "unknown";
142
+ return { index, name: names[index] ?? `item ${index}`, kind };
143
+ }).filter((it) => !search || it.name.toLowerCase().includes(search));
144
+ return { text: JSON.stringify({ library: lib, count: groups.length, items }) };
145
+ }
146
+ catch (e) {
147
+ return { text: JSON.stringify({ error: e instanceof Error ? e.message : String(e) }), isError: true };
148
+ }
149
+ }
150
+ default:
151
+ return { text: JSON.stringify({ error: `Unknown tool "${name}".` }), isError: true };
152
+ }
153
+ };
154
+ const handle = async (msg) => {
155
+ const id = msg.id ?? null;
156
+ const respond = (result) => ({ jsonrpc: "2.0", id, result });
157
+ const fail = (code, message) => ({ jsonrpc: "2.0", id, error: { code, message } });
158
+ try {
159
+ switch (msg.method) {
160
+ case "initialize":
161
+ return respond({
162
+ protocolVersion: "2024-11-05",
163
+ capabilities: { tools: {}, resources: {} },
164
+ serverInfo: { name: "diagram-tool", version: "0.1.0" },
165
+ instructions: SERVER_INSTRUCTIONS,
166
+ });
167
+ case "ping":
168
+ return respond({});
169
+ case "tools/list":
170
+ return respond({ tools: TOOLS });
171
+ case "tools/call": {
172
+ const p = msg.params ?? {};
173
+ const r = await callTool(String(p.name), p.arguments ?? {});
174
+ return respond({ content: [{ type: "text", text: r.text }], ...(r.isError ? { isError: true } : {}) });
175
+ }
176
+ case "resources/list":
177
+ return respond({ resources: RESOURCES });
178
+ case "resources/read": {
179
+ const uri = String((msg.params ?? {}).uri ?? "");
180
+ if (uri === "diagram-tool://guide" || uri === "diagram-tool:///guide") {
181
+ return respond({ contents: [{ uri: "diagram-tool://guide", mimeType: "text/markdown", text: GUIDE }] });
182
+ }
183
+ return fail(-32602, `Unknown resource "${uri}".`);
184
+ }
185
+ default:
186
+ // Notifications (no id) get no response; unknown requests get Method-not-found.
187
+ if (id === null || id === undefined)
188
+ return null;
189
+ return fail(-32601, `Method not found: ${msg.method}`);
190
+ }
191
+ }
192
+ catch (e) {
193
+ if (id === null || id === undefined)
194
+ return null;
195
+ return fail(-32603, e instanceof Error ? e.message : String(e));
196
+ }
197
+ };
198
+ // Framing: MCP stdio is newline-delimited JSON; also accept Content-Length framing.
199
+ let buf = Buffer.alloc(0);
200
+ const dispatch = async (line) => {
201
+ if (!line.trim())
202
+ return;
203
+ let msg;
204
+ try {
205
+ msg = JSON.parse(line);
206
+ }
207
+ catch {
208
+ return;
209
+ }
210
+ const res = await handle(msg);
211
+ if (res)
212
+ process.stdout.write(JSON.stringify(res) + "\n");
213
+ };
214
+ const pump = async () => {
215
+ for (;;) {
216
+ const text = buf.toString("utf8");
217
+ const clMatch = /^Content-Length:\s*(\d+)\r?\n/i.exec(text);
218
+ if (clMatch) {
219
+ const len = Number(clMatch[1]);
220
+ const headerEnd = text.indexOf("\n\n") !== -1 ? text.indexOf("\n\n") + 2 : text.indexOf("\r\n\r\n") + 4;
221
+ const start = Buffer.byteLength(text.slice(0, headerEnd));
222
+ if (buf.length < start + len)
223
+ break;
224
+ const body = buf.subarray(start, start + len).toString("utf8");
225
+ buf = buf.subarray(start + len);
226
+ await dispatch(body);
227
+ continue;
228
+ }
229
+ const nl = buf.indexOf(0x0a);
230
+ if (nl === -1)
231
+ break;
232
+ const line = buf.subarray(0, nl).toString("utf8");
233
+ buf = buf.subarray(nl + 1);
234
+ await dispatch(line);
235
+ }
236
+ };
237
+ process.stdin.on("data", (chunk) => {
238
+ buf = Buffer.concat([buf, chunk]);
239
+ pending++;
240
+ void pump()
241
+ .catch((e) => console.error(`[mcp] pump: ${e instanceof Error ? e.message : String(e)}`))
242
+ .finally(() => {
243
+ pending--;
244
+ void maybeExit();
245
+ });
246
+ });
247
+ let stdinEnded = false;
248
+ let pending = 0;
249
+ const maybeExit = async () => {
250
+ if (stdinEnded && pending === 0) {
251
+ // flush stdout before exiting
252
+ await new Promise((r) => setTimeout(r, 20));
253
+ process.exit(0);
254
+ }
255
+ };
256
+ process.stdin.on("end", () => {
257
+ stdinEnded = true;
258
+ void maybeExit();
259
+ });
260
+ process.stdin.resume();
261
+ }
262
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}