@dahch/muninn 0.0.0-stage → 0.2.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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +395 -2
  3. package/dist/cli.d.ts +23 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +186 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/check.d.ts +3 -0
  8. package/dist/commands/check.d.ts.map +1 -0
  9. package/dist/commands/check.js +56 -0
  10. package/dist/commands/check.js.map +1 -0
  11. package/dist/commands/memory.d.ts +6 -0
  12. package/dist/commands/memory.d.ts.map +1 -0
  13. package/dist/commands/memory.js +374 -0
  14. package/dist/commands/memory.js.map +1 -0
  15. package/dist/commands/setup.d.ts +3 -0
  16. package/dist/commands/setup.d.ts.map +1 -0
  17. package/dist/commands/setup.js +397 -0
  18. package/dist/commands/setup.js.map +1 -0
  19. package/dist/contracts/compiler.d.ts +71 -0
  20. package/dist/contracts/compiler.d.ts.map +1 -0
  21. package/dist/contracts/compiler.js +362 -0
  22. package/dist/contracts/compiler.js.map +1 -0
  23. package/dist/contracts/index.d.ts +2 -0
  24. package/dist/contracts/index.d.ts.map +1 -0
  25. package/dist/contracts/index.js +2 -0
  26. package/dist/contracts/index.js.map +1 -0
  27. package/dist/db/client.d.ts +100 -0
  28. package/dist/db/client.d.ts.map +1 -0
  29. package/dist/db/client.js +318 -0
  30. package/dist/db/client.js.map +1 -0
  31. package/dist/db/schema.sql +99 -0
  32. package/dist/index.d.ts +23 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +23 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/indexer/ast-indexer.d.ts +55 -0
  37. package/dist/indexer/ast-indexer.d.ts.map +1 -0
  38. package/dist/indexer/ast-indexer.js +445 -0
  39. package/dist/indexer/ast-indexer.js.map +1 -0
  40. package/dist/indexer/index.d.ts +2 -0
  41. package/dist/indexer/index.d.ts.map +1 -0
  42. package/dist/indexer/index.js +2 -0
  43. package/dist/indexer/index.js.map +1 -0
  44. package/dist/mcp/index.d.ts +2 -0
  45. package/dist/mcp/index.d.ts.map +1 -0
  46. package/dist/mcp/index.js +2 -0
  47. package/dist/mcp/index.js.map +1 -0
  48. package/dist/mcp/server.d.ts +254 -0
  49. package/dist/mcp/server.d.ts.map +1 -0
  50. package/dist/mcp/server.js +636 -0
  51. package/dist/mcp/server.js.map +1 -0
  52. package/dist/service/index.d.ts +2 -0
  53. package/dist/service/index.d.ts.map +1 -0
  54. package/dist/service/index.js +2 -0
  55. package/dist/service/index.js.map +1 -0
  56. package/dist/service/memory-service.d.ts +320 -0
  57. package/dist/service/memory-service.d.ts.map +1 -0
  58. package/dist/service/memory-service.js +1511 -0
  59. package/dist/service/memory-service.js.map +1 -0
  60. package/dist/setup/index.d.ts +6 -0
  61. package/dist/setup/index.d.ts.map +1 -0
  62. package/dist/setup/index.js +6 -0
  63. package/dist/setup/index.js.map +1 -0
  64. package/dist/setup/json-target.d.ts +30 -0
  65. package/dist/setup/json-target.d.ts.map +1 -0
  66. package/dist/setup/json-target.js +263 -0
  67. package/dist/setup/json-target.js.map +1 -0
  68. package/dist/setup/portable.d.ts +56 -0
  69. package/dist/setup/portable.d.ts.map +1 -0
  70. package/dist/setup/portable.js +365 -0
  71. package/dist/setup/portable.js.map +1 -0
  72. package/dist/setup/registry.d.ts +54 -0
  73. package/dist/setup/registry.d.ts.map +1 -0
  74. package/dist/setup/registry.js +225 -0
  75. package/dist/setup/registry.js.map +1 -0
  76. package/dist/setup/rules-target.d.ts +31 -0
  77. package/dist/setup/rules-target.d.ts.map +1 -0
  78. package/dist/setup/rules-target.js +270 -0
  79. package/dist/setup/rules-target.js.map +1 -0
  80. package/dist/setup/toml-target.d.ts +62 -0
  81. package/dist/setup/toml-target.d.ts.map +1 -0
  82. package/dist/setup/toml-target.js +869 -0
  83. package/dist/setup/toml-target.js.map +1 -0
  84. package/dist/util/path-safety.d.ts +94 -0
  85. package/dist/util/path-safety.d.ts.map +1 -0
  86. package/dist/util/path-safety.js +162 -0
  87. package/dist/util/path-safety.js.map +1 -0
  88. package/dist/util/text.d.ts +9 -0
  89. package/dist/util/text.d.ts.map +1 -0
  90. package/dist/util/text.js +19 -0
  91. package/dist/util/text.js.map +1 -0
  92. package/package.json +87 -4
@@ -0,0 +1,56 @@
1
+ import path from "node:path";
2
+ import chalk from "chalk";
3
+ import { verifyTypeScriptContracts } from "../contracts/compiler.js";
4
+ export function printCheckUsage() {
5
+ console.log(`muninn check — Static TypeScript execution contract verification
6
+
7
+ Usage:
8
+ muninn check [files...] [--project <path>]
9
+
10
+ Options:
11
+ --project <path> Target project root containing tsconfig.json (default: cwd)
12
+ `);
13
+ }
14
+ export async function handleCheckCommand(files, args) {
15
+ if (args["--help"] || args["-h"]) {
16
+ printCheckUsage();
17
+ return;
18
+ }
19
+ const projectRoot = typeof args["--project"] === "string"
20
+ ? path.resolve(args["--project"])
21
+ : typeof args["--root"] === "string"
22
+ ? path.resolve(args["--root"])
23
+ : process.cwd();
24
+ const targetFiles = files.length > 0 ? files : undefined;
25
+ const result = verifyTypeScriptContracts(projectRoot, targetFiles);
26
+ if (result.valid) {
27
+ console.log(chalk.green(`✔ TypeScript contracts verified: 0 errors (${result.diagnostics.length} diagnostic(s)).`));
28
+ if (result.diagnostics.length > 0) {
29
+ console.log(chalk.yellow("\nDiagnostics:"));
30
+ for (const d of result.diagnostics) {
31
+ const loc = chalk.dim(`${d.filePath}:${d.line}:${d.character}`);
32
+ const code = chalk.yellow(`[${d.code}]`);
33
+ const category = chalk.yellow(d.category.toUpperCase());
34
+ console.log(`- ${loc} ${code} ${category}: ${d.message}`);
35
+ if (d.snippet) {
36
+ console.log(chalk.dim(d.snippet) + "\n");
37
+ }
38
+ }
39
+ }
40
+ return;
41
+ }
42
+ console.error(chalk.red.bold(`✖ TypeScript contracts check failed with ${result.errorsCount} error(s):\n`));
43
+ for (const d of result.diagnostics) {
44
+ const loc = chalk.cyan(`${d.filePath}:${d.line}:${d.character}`);
45
+ const code = chalk.yellow(`[${d.code}]`);
46
+ const category = d.category === "error"
47
+ ? chalk.red("ERROR")
48
+ : chalk.yellow(d.category.toUpperCase());
49
+ console.error(`- ${loc} ${code} ${category}: ${d.message}`);
50
+ if (d.snippet) {
51
+ console.error(chalk.dim(d.snippet) + "\n");
52
+ }
53
+ }
54
+ process.exitCode = 1;
55
+ }
56
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function findSourceFiles(dir: string): string[];
2
+ export declare function printMemoryUsage(): void;
3
+ export declare function printMcpUsage(): void;
4
+ export declare function handleMemoryCommand(subcommand: string | undefined, args: Record<string, string | boolean | undefined>, positionals?: string[]): Promise<void>;
5
+ export declare function handleMcpCommand(subcommand: string | undefined, args: Record<string, string | boolean | undefined>): Promise<void>;
6
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AAkCA,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBrD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAiBvC;AAED,wBAAgB,aAAa,IAAI,IAAI,CASpC;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,EAClD,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CA6Nf;AAsDD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACjD,OAAO,CAAC,IAAI,CAAC,CAoFf"}
@@ -0,0 +1,374 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import { MemoryService, MAX_SESSION_BRIEF_BUDGET, MAX_SESSION_BRIEF_PATHS, readSessionBrief, } from "../service/memory-service.js";
5
+ import { startMcpServer } from "../mcp/server.js";
6
+ import { indexFilesIntoMuninn } from "../indexer/ast-indexer.js";
7
+ import { sanitizeTerminalText } from "../util/text.js";
8
+ const IGNORED_INDEX_DIRS = new Set([
9
+ "node_modules",
10
+ ".git",
11
+ ".harness",
12
+ ".huginn",
13
+ "dist",
14
+ "build",
15
+ ".cache",
16
+ ]);
17
+ const SOURCE_FILE_EXTENSIONS = new Set([
18
+ ".ts",
19
+ ".tsx",
20
+ ".mts",
21
+ ".cts",
22
+ ".js",
23
+ ".jsx",
24
+ ".mjs",
25
+ ".cjs",
26
+ ]);
27
+ export function findSourceFiles(dir) {
28
+ const results = [];
29
+ function walk(current) {
30
+ if (!fs.existsSync(current))
31
+ return;
32
+ try {
33
+ const entries = fs.readdirSync(current, { withFileTypes: true });
34
+ for (const entry of entries) {
35
+ if (entry.isDirectory()) {
36
+ if (!IGNORED_INDEX_DIRS.has(entry.name)) {
37
+ walk(path.join(current, entry.name));
38
+ }
39
+ }
40
+ else if (entry.isFile()) {
41
+ const ext = path.extname(entry.name).toLowerCase();
42
+ if (SOURCE_FILE_EXTENSIONS.has(ext)) {
43
+ results.push(path.join(current, entry.name));
44
+ }
45
+ }
46
+ }
47
+ }
48
+ catch {
49
+ // ignore read error
50
+ }
51
+ }
52
+ walk(dir);
53
+ return results;
54
+ }
55
+ export function printMemoryUsage() {
56
+ console.log(`muninn memory — Persistent codebase memory across spec-build cycles
57
+
58
+ Usage:
59
+ muninn memory init [--db <path>] [--project <path>]
60
+ muninn memory search <query> [--category <cat>] [--limit <n>] [--project <path>]
61
+ muninn memory sync [--import] [--file <path>] [--project <path>]
62
+ muninn memory index [files...] [--project <path>] [--db <path>]
63
+ muninn memory brief [--project <path>] [--paths a,b] [--budget <n>] [--db <path>]
64
+
65
+ Subcommands:
66
+ init Initialize SQLite database and verify schema
67
+ search Search observations with BM25 relevance ranking
68
+ sync Export observations to disk (.jsonl) or import with --import
69
+ index Index AST symbols and dependencies into Muninn memory
70
+ brief Print a bounded read-only session brief (Markdown)
71
+ `);
72
+ }
73
+ export function printMcpUsage() {
74
+ console.log(`muninn mcp — Model Context Protocol server for Muninn memory
75
+
76
+ Usage:
77
+ muninn mcp run [--db <path>] [--project <path>]
78
+
79
+ Subcommands:
80
+ run Start the stdio MCP server for agent memory integration
81
+ `);
82
+ }
83
+ export async function handleMemoryCommand(subcommand, args, positionals) {
84
+ const dbPath = typeof args["--db"] === "string" ? args["--db"] : undefined;
85
+ const projectRoot = typeof args["--project"] === "string"
86
+ ? args["--project"]
87
+ : typeof args["--root"] === "string"
88
+ ? args["--root"]
89
+ : undefined;
90
+ if (!subcommand ||
91
+ args["--help"] ||
92
+ args["-h"] ||
93
+ subcommand === "help" ||
94
+ subcommand === "--help" ||
95
+ subcommand === "-h") {
96
+ printMemoryUsage();
97
+ return;
98
+ }
99
+ if (subcommand === "init") {
100
+ const service = new MemoryService({ dbPath, projectRoot });
101
+ try {
102
+ const project = service.currentProject;
103
+ console.log(chalk.green("✔ Muninn memory database initialized"));
104
+ console.log(` Database: ${service.db.name}`);
105
+ console.log(` Project: ${project.name} (${project.root_path})`);
106
+ console.log(` Status: Tables ready`);
107
+ }
108
+ finally {
109
+ service.close?.();
110
+ }
111
+ return;
112
+ }
113
+ if (subcommand === "search") {
114
+ const queryPositional = positionals?.[0] ??
115
+ (typeof args._positional === "string" && args._positional !== "search"
116
+ ? args._positional
117
+ : undefined);
118
+ const query = typeof args["--query"] === "string" ? args["--query"] : queryPositional;
119
+ if (!query || query.trim() === "") {
120
+ console.error(chalk.red("Error: Search query is required."));
121
+ process.exitCode = 1;
122
+ return;
123
+ }
124
+ const category = typeof args["--category"] === "string" ? args["--category"] : undefined;
125
+ const parsedLimit = typeof args["--limit"] === "string"
126
+ ? Math.floor(Number(args["--limit"]))
127
+ : undefined;
128
+ const limit = parsedLimit && parsedLimit > 0 ? parsedLimit : 10;
129
+ const service = new MemoryService({ dbPath, projectRoot });
130
+ try {
131
+ const results = service.search({
132
+ query: query.trim(),
133
+ category,
134
+ limit,
135
+ });
136
+ if (results.length === 0) {
137
+ console.log(`No observations found matching "${query.trim()}".`);
138
+ return;
139
+ }
140
+ console.log(chalk.bold(`Found ${results.length} result(s) for "${query.trim()}" (BM25 ranked):`));
141
+ for (const obs of results) {
142
+ const categoryTag = chalk.cyan(`[${obs.category.toUpperCase()}]`);
143
+ const rankScore = chalk.gray(`(score: ${obs.rank.toFixed(3)})`);
144
+ console.log(`\n${categoryTag} ${chalk.bold(obs.title)} ${rankScore}`);
145
+ if (obs.topic_key) {
146
+ console.log(` ${chalk.dim("Topic:")} ${obs.topic_key}`);
147
+ }
148
+ const preview = obs.content.length > 150
149
+ ? `${obs.content.slice(0, 147)}...`
150
+ : obs.content;
151
+ console.log(` ${chalk.white(preview.replace(/\n/g, " "))}`);
152
+ if (obs.entities && obs.entities.length > 0) {
153
+ const symbols = obs.entities.map((e) => e.identifier).join(", ");
154
+ console.log(` ${chalk.dim("Symbols:")} ${chalk.yellow(symbols)}`);
155
+ }
156
+ }
157
+ }
158
+ finally {
159
+ service.close?.();
160
+ }
161
+ return;
162
+ }
163
+ if (subcommand === "sync") {
164
+ const syncPositional = positionals?.[0] ??
165
+ (typeof args._positional === "string" && args._positional !== "sync"
166
+ ? args._positional
167
+ : undefined);
168
+ const filePath = typeof args["--file"] === "string" ? args["--file"] : syncPositional;
169
+ const isImport = Boolean(args["--import"]);
170
+ const service = new MemoryService({ dbPath, projectRoot });
171
+ try {
172
+ if (isImport) {
173
+ const result = service.importFromDisk(filePath);
174
+ console.log(`Imported ${result.imported} memories (skipped ${result.skipped} duplicates) from ${filePath ?? path.join(service.currentProject.root_path || process.cwd(), ".huginn", "memories.jsonl")}.`);
175
+ }
176
+ else {
177
+ const result = service.syncToDisk(filePath);
178
+ console.log(`Synced ${result.count} memories to ${result.path}.`);
179
+ }
180
+ }
181
+ finally {
182
+ service.close?.();
183
+ }
184
+ return;
185
+ }
186
+ if (subcommand === "brief") {
187
+ const rawPaths = typeof args["--paths"] === "string" ? args["--paths"] : undefined;
188
+ const paths = rawPaths === undefined
189
+ ? undefined
190
+ : rawPaths
191
+ .split(",")
192
+ .map((p) => p.trim())
193
+ .filter(Boolean);
194
+ if (paths && paths.length > MAX_SESSION_BRIEF_PATHS) {
195
+ console.error(chalk.red(`Error: At most ${MAX_SESSION_BRIEF_PATHS} paths may be requested.`));
196
+ process.exitCode = 1;
197
+ return;
198
+ }
199
+ let budgetChars;
200
+ if (typeof args["--budget"] === "string") {
201
+ const parsedBudget = Number(args["--budget"]);
202
+ if (!Number.isInteger(parsedBudget) ||
203
+ parsedBudget <= 0 ||
204
+ parsedBudget > MAX_SESSION_BRIEF_BUDGET) {
205
+ console.error(chalk.red(`Error: --budget must be a positive integer no greater than ${MAX_SESSION_BRIEF_BUDGET}.`));
206
+ process.exitCode = 1;
207
+ return;
208
+ }
209
+ budgetChars = parsedBudget;
210
+ }
211
+ try {
212
+ const brief = readSessionBrief({
213
+ dbPath,
214
+ projectRoot,
215
+ paths,
216
+ budgetChars,
217
+ });
218
+ console.log(brief.markdown);
219
+ }
220
+ catch (err) {
221
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
222
+ process.exitCode = 1;
223
+ }
224
+ return;
225
+ }
226
+ if (subcommand === "index") {
227
+ const rawFiles = positionals && positionals.length > 0
228
+ ? positionals
229
+ : typeof args._positional === "string" && args._positional !== "index"
230
+ ? [args._positional]
231
+ : [];
232
+ const service = new MemoryService({ dbPath, projectRoot });
233
+ try {
234
+ const root = service.currentProject.root_path || process.cwd();
235
+ const targetFiles = rawFiles.length > 0 ? rawFiles : findSourceFiles(root);
236
+ const result = indexFilesIntoMuninn(service, targetFiles, {
237
+ projectRoot: root,
238
+ });
239
+ console.log(chalk.green(`✔ Indexed ${result.indexedFiles} file(s) (${result.indexedSymbols} symbol(s), ${result.indexedDependencies} dependency link(s)) into Muninn memory.`));
240
+ }
241
+ finally {
242
+ service.close?.();
243
+ }
244
+ return;
245
+ }
246
+ console.error(chalk.red(`Unknown subcommand: ${subcommand}`));
247
+ printMemoryUsage();
248
+ process.exitCode = 1;
249
+ }
250
+ /**
251
+ * Logs to stderr without ever risking a second crash (ADR-30.3): once the
252
+ * parent pipe is gone, even the diagnostic write can fail with EPIPE.
253
+ */
254
+ function logToStderr(line) {
255
+ try {
256
+ process.stderr.write(line.endsWith("\n") ? line : `${line}\n`);
257
+ }
258
+ catch {
259
+ /* stderr is gone too — the process is exiting anyway */
260
+ }
261
+ }
262
+ /**
263
+ * Installs the stdio guards that keep `muninn mcp run` from crashing or hanging
264
+ * when its parent goes away (REQ-30 / AC-30.3):
265
+ *
266
+ * - an `'error'` handler on `process.stdout` so an EPIPE from a closed parent
267
+ * pipe is logged and turned into a clean shutdown instead of an unhandled
268
+ * exception that kills the server mid-response;
269
+ * - a no-op `'error'` handler on `process.stderr` for the same reason (a dead
270
+ * parent usually breaks both ends);
271
+ * - `'end'`/`'close'` on `process.stdin` — the SDK transport only observes
272
+ * `'data'`/`'error'`, so without this bridge a parent disconnect is invisible
273
+ * and the server would keep running forever.
274
+ */
275
+ function installStdioGuards(onStdoutFailure) {
276
+ const onStdoutError = (err) => {
277
+ logToStderr(`[muninn] mcp run: stdout write failed (${sanitizeTerminalText(err.message)}); shutting down.`);
278
+ onStdoutFailure();
279
+ };
280
+ const onStderrError = () => {
281
+ /* a broken stderr must never crash the JSON-RPC server */
282
+ };
283
+ process.stdout.on("error", onStdoutError);
284
+ process.stderr.on("error", onStderrError);
285
+ return {
286
+ dispose() {
287
+ process.stdout.off("error", onStdoutError);
288
+ process.stderr.off("error", onStderrError);
289
+ },
290
+ };
291
+ }
292
+ export async function handleMcpCommand(subcommand, args) {
293
+ const dbPath = typeof args["--db"] === "string" ? args["--db"] : undefined;
294
+ const projectRoot = typeof args["--project"] === "string"
295
+ ? args["--project"]
296
+ : typeof args["--root"] === "string"
297
+ ? args["--root"]
298
+ : undefined;
299
+ if (!subcommand ||
300
+ args["--help"] ||
301
+ args["-h"] ||
302
+ subcommand === "help" ||
303
+ subcommand === "--help" ||
304
+ subcommand === "-h") {
305
+ printMcpUsage();
306
+ return;
307
+ }
308
+ if (subcommand === "run") {
309
+ const started = await startMcpServer({
310
+ dbPath,
311
+ projectRoot,
312
+ });
313
+ const { server, transport } = started;
314
+ try {
315
+ // Protocol failures were previously discarded (AC-30.3): surface them on
316
+ // stderr (never stdout — that stream carries JSON-RPC) without aborting.
317
+ if (server) {
318
+ server.onerror = (err) => {
319
+ logToStderr(`[muninn] mcp run: protocol error: ${sanitizeTerminalText(err.message)}`);
320
+ };
321
+ }
322
+ // Keep process alive while stdio transport is connected:
323
+ await new Promise((resolve) => {
324
+ let finished = false;
325
+ const onStdinClosed = () => {
326
+ if ((process.env.MUNINN_DEBUG || process.env.HUGINN_DEBUG)) {
327
+ logToStderr("[muninn] mcp run: stdin closed by the client; shutting down.");
328
+ }
329
+ done();
330
+ };
331
+ const guards = installStdioGuards(() => done());
332
+ const done = () => {
333
+ if (finished)
334
+ return;
335
+ finished = true;
336
+ process.removeListener("SIGINT", done);
337
+ process.removeListener("SIGTERM", done);
338
+ process.stdin.removeListener("end", onStdinClosed);
339
+ process.stdin.removeListener("close", onStdinClosed);
340
+ guards.dispose();
341
+ resolve();
342
+ };
343
+ if (transport) {
344
+ transport.onclose = () => done();
345
+ }
346
+ else {
347
+ done();
348
+ return;
349
+ }
350
+ // The parent disappearing is a lifecycle event, not a hang: bridge EOF
351
+ // (and an abruptly closed pipe) to the same shutdown path as onclose.
352
+ process.stdin.on("end", onStdinClosed);
353
+ process.stdin.on("close", onStdinClosed);
354
+ process.on("SIGINT", done);
355
+ process.on("SIGTERM", done);
356
+ });
357
+ }
358
+ finally {
359
+ if (typeof started.closeService === "function") {
360
+ started.closeService();
361
+ }
362
+ else {
363
+ // Compatibility with injected test doubles that predate the lazy handle.
364
+ started.service?.close?.();
365
+ }
366
+ await server?.close?.();
367
+ }
368
+ return;
369
+ }
370
+ console.error(chalk.red(`Unknown subcommand: ${subcommand}`));
371
+ printMcpUsage();
372
+ process.exitCode = 1;
373
+ }
374
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function printSetupUsage(): void;
2
+ export declare function handleSetupCommand(args: Record<string, string | boolean | undefined>): Promise<void>;
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAuCA,wBAAgB,eAAe,IAAI,IAAI,CAmBtC;AAgND,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GACjD,OAAO,CAAC,IAAI,CAAC,CAgMf"}