@radix-ai/ai-memory 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 (105) hide show
  1. package/.claude-plugin/marketplace.json +19 -0
  2. package/.cursor-plugin/marketplace.json +19 -0
  3. package/LICENSE +21 -0
  4. package/README.md +331 -0
  5. package/dist/cli/adapters.d.ts +32 -0
  6. package/dist/cli/adapters.d.ts.map +1 -0
  7. package/dist/cli/adapters.js +368 -0
  8. package/dist/cli/adapters.js.map +1 -0
  9. package/dist/cli/environment.d.ts +34 -0
  10. package/dist/cli/environment.d.ts.map +1 -0
  11. package/dist/cli/environment.js +119 -0
  12. package/dist/cli/environment.js.map +1 -0
  13. package/dist/cli/index.d.ts +3 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +1108 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/docs-schema.d.ts +27 -0
  18. package/dist/docs-schema.d.ts.map +1 -0
  19. package/dist/docs-schema.js +100 -0
  20. package/dist/docs-schema.js.map +1 -0
  21. package/dist/evals/index.d.ts +13 -0
  22. package/dist/evals/index.d.ts.map +1 -0
  23. package/dist/evals/index.js +205 -0
  24. package/dist/evals/index.js.map +1 -0
  25. package/dist/evals/performance-comparison.d.ts +23 -0
  26. package/dist/evals/performance-comparison.d.ts.map +1 -0
  27. package/dist/evals/performance-comparison.js +76 -0
  28. package/dist/evals/performance-comparison.js.map +1 -0
  29. package/dist/evals/platform-integration.d.ts +34 -0
  30. package/dist/evals/platform-integration.d.ts.map +1 -0
  31. package/dist/evals/platform-integration.js +186 -0
  32. package/dist/evals/platform-integration.js.map +1 -0
  33. package/dist/formatter/index.d.ts +15 -0
  34. package/dist/formatter/index.d.ts.map +1 -0
  35. package/dist/formatter/index.js +207 -0
  36. package/dist/formatter/index.js.map +1 -0
  37. package/dist/hybrid-search/index.d.ts +40 -0
  38. package/dist/hybrid-search/index.d.ts.map +1 -0
  39. package/dist/hybrid-search/index.js +277 -0
  40. package/dist/hybrid-search/index.js.map +1 -0
  41. package/dist/index.d.ts +4 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +5 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/mcp-server/index.d.ts +6 -0
  46. package/dist/mcp-server/index.d.ts.map +1 -0
  47. package/dist/mcp-server/index.js +114 -0
  48. package/dist/mcp-server/index.js.map +1 -0
  49. package/dist/mcp-server/p0-parser.d.ts +43 -0
  50. package/dist/mcp-server/p0-parser.d.ts.map +1 -0
  51. package/dist/mcp-server/p0-parser.js +108 -0
  52. package/dist/mcp-server/p0-parser.js.map +1 -0
  53. package/dist/mcp-server/resources.d.ts +3 -0
  54. package/dist/mcp-server/resources.d.ts.map +1 -0
  55. package/dist/mcp-server/resources.js +156 -0
  56. package/dist/mcp-server/resources.js.map +1 -0
  57. package/dist/mcp-server/tools.d.ts +15 -0
  58. package/dist/mcp-server/tools.d.ts.map +1 -0
  59. package/dist/mcp-server/tools.js +928 -0
  60. package/dist/mcp-server/tools.js.map +1 -0
  61. package/dist/schema-constants.d.ts +7 -0
  62. package/dist/schema-constants.d.ts.map +1 -0
  63. package/dist/schema-constants.js +33 -0
  64. package/dist/schema-constants.js.map +1 -0
  65. package/package.json +84 -0
  66. package/plugins/adapters/claude-code/.claude-plugin/plugin.json +26 -0
  67. package/plugins/adapters/claude-code/CLAUDE.md +21 -0
  68. package/plugins/adapters/claude-code/README.md +37 -0
  69. package/plugins/adapters/claude-code/agents/governance-checker.md +27 -0
  70. package/plugins/adapters/claude-code/agents/memory-writer.md +31 -0
  71. package/plugins/adapters/claude-code/hooks/SessionStart.js +55 -0
  72. package/plugins/adapters/claude-code/hooks/hooks.json +52 -0
  73. package/plugins/adapters/generic/BOOTSTRAP_INSTRUCTION.md +30 -0
  74. package/plugins/adapters/generic/README.md +50 -0
  75. package/plugins/ai-memory/.claude-plugin/plugin.json +30 -0
  76. package/plugins/ai-memory/.cursor-plugin/plugin.json +18 -0
  77. package/plugins/ai-memory/.mcp.json +19 -0
  78. package/plugins/ai-memory/agents/governance-critic/AGENT.md +57 -0
  79. package/plugins/ai-memory/agents/memory-auditor/AGENT.md +54 -0
  80. package/plugins/ai-memory/rules/context7-tool-reference.md +16 -0
  81. package/plugins/ai-memory/rules/load-memory.md +22 -0
  82. package/plugins/ai-memory/rules/parallel-safe-planning.md +19 -0
  83. package/plugins/ai-memory/skills/mem-auto-review/SKILL.md +51 -0
  84. package/plugins/ai-memory/skills/mem-compound/SKILL.md +105 -0
  85. package/plugins/ai-memory/skills/mem-init/SKILL.md +48 -0
  86. package/plugins/ai-memory/skills/mem-session-close/SKILL.md +38 -0
  87. package/plugins/ai-memory/skills/mem-validate/SKILL.md +54 -0
  88. package/templates/.ai/IDENTITY.md +23 -0
  89. package/templates/.ai/agents/_base-auditor.md +28 -0
  90. package/templates/.ai/agents/_template.md +23 -0
  91. package/templates/.ai/memory/debugging.md +14 -0
  92. package/templates/.ai/memory/decisions.md +8 -0
  93. package/templates/.ai/memory/improvements.md +7 -0
  94. package/templates/.ai/memory/memory-index.md +9 -0
  95. package/templates/.ai/memory/patterns.md +8 -0
  96. package/templates/.ai/reference/PROJECT.md +5 -0
  97. package/templates/.ai/reference/capability-specs.json +31 -0
  98. package/templates/.ai/reference/environment-specs.json +41 -0
  99. package/templates/.ai/sessions/archive/thread-archive.md +15 -0
  100. package/templates/.ai/sessions/open-items.md +13 -0
  101. package/templates/.ai/toolbox/README.md +5 -0
  102. package/templates/.ai/toolbox/browser.md +30 -0
  103. package/templates/.ai/toolbox/integrations.md +44 -0
  104. package/templates/.ai/toolbox/shell.md +38 -0
  105. package/templates/AGENTS.md +4 -0
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Hybrid search: keyword (TF) + semantic (Transformers.js) + RRF.
3
+ * Based on experiments/hybrid-search/sandbox-b-inhouse (Approach B).
4
+ * On Windows, onnxruntime-node may fail; set AI_SEARCH_WASM=1 to prefer WASM, or AI_SEARCH=keyword for keyword-only.
5
+ */
6
+ import { readdir, readFile } from "fs/promises";
7
+ import { join, relative, dirname } from "path";
8
+ import { createRequire } from "module";
9
+ import { pathToFileURL } from "url";
10
+ const RRF_K = 60;
11
+ // ─── Chunk loading ───────────────────────────────────────────────────────────
12
+ export async function loadChunks(aiDir) {
13
+ const chunks = [];
14
+ async function walk(dir) {
15
+ const entries = await readdir(dir, { withFileTypes: true });
16
+ for (const entry of entries) {
17
+ const full = join(dir, entry.name);
18
+ if (entry.name === "temp")
19
+ continue;
20
+ if (entry.isDirectory()) {
21
+ await walk(full);
22
+ }
23
+ else if (entry.name.endsWith(".md")) {
24
+ const content = await readFile(full, "utf-8");
25
+ const rel = relative(aiDir, full).replace(/\\/g, "/");
26
+ const sections = content.split(/(?=^## )/m).filter(Boolean);
27
+ for (const section of sections) {
28
+ const text = section.trim();
29
+ if (text.length > 0) {
30
+ chunks.push({ file: rel, text, content });
31
+ }
32
+ }
33
+ if (sections.length === 0) {
34
+ chunks.push({ file: rel, text: content, content });
35
+ }
36
+ }
37
+ }
38
+ }
39
+ await walk(aiDir);
40
+ return chunks;
41
+ }
42
+ // ─── Keyword search (TF) ──────────────────────────────────────────────────────
43
+ function keywordSearchChunks(chunks, query) {
44
+ const terms = query.toLowerCase().split(/\s+/).filter(Boolean);
45
+ if (terms.length === 0)
46
+ return [];
47
+ const fileBest = new Map();
48
+ for (const { file, text } of chunks) {
49
+ const lower = text.toLowerCase();
50
+ let score = 0;
51
+ for (const term of terms) {
52
+ score += lower.split(term).length - 1;
53
+ }
54
+ if (score > 0) {
55
+ const cur = fileBest.get(file);
56
+ if (!cur || score > cur.score) {
57
+ const firstLine = text.split("\n")[0]?.trim() ?? "";
58
+ fileBest.set(file, { excerpt: firstLine, score });
59
+ }
60
+ }
61
+ }
62
+ return [...fileBest.entries()]
63
+ .sort((a, b) => b[1].score - a[1].score)
64
+ .map(([file, { excerpt, score }]) => ({ file, excerpt, score }));
65
+ }
66
+ // ─── Semantic search (Transformers.js) ───────────────────────────────────────
67
+ function cosineSimilarity(a, b) {
68
+ let dot = 0, normA = 0, normB = 0;
69
+ for (let i = 0; i < a.length; i++) {
70
+ dot += a[i] * b[i];
71
+ normA += a[i] * a[i];
72
+ normB += b[i] * b[i];
73
+ }
74
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
75
+ return denom === 0 ? 0 : dot / denom;
76
+ }
77
+ function tensorToArray(tensor) {
78
+ const t = tensor;
79
+ if (Array.isArray(tensor))
80
+ return tensor;
81
+ if (!t?.data) {
82
+ if (typeof t?.tolist === "function")
83
+ return t.tolist();
84
+ throw new Error("Unknown tensor format");
85
+ }
86
+ const data = Array.from(t.data);
87
+ const dims = t.dims ?? t.size ?? [];
88
+ if (Array.isArray(dims) && dims.length >= 2) {
89
+ const [rows, cols] = dims;
90
+ const out = [];
91
+ for (let i = 0; i < rows; i++) {
92
+ out.push(data.slice(i * cols, (i + 1) * cols));
93
+ }
94
+ return out;
95
+ }
96
+ return data;
97
+ }
98
+ function rrfMerge(rankLists, k = RRF_K) {
99
+ const scores = new Map();
100
+ for (const list of rankLists) {
101
+ list.forEach((id, rank) => {
102
+ const rrf = 1 / (k + rank + 1);
103
+ scores.set(id, (scores.get(id) ?? 0) + rrf);
104
+ });
105
+ }
106
+ return [...scores.entries()]
107
+ .sort((a, b) => b[1] - a[1])
108
+ .map(([id]) => id);
109
+ }
110
+ // Lazy-loaded semantic extractor
111
+ let extractor = null;
112
+ let backendUsed = "keyword";
113
+ function isWindows() {
114
+ return process.platform === "win32";
115
+ }
116
+ function preferWasm() {
117
+ return process.env.AI_SEARCH_WASM === "1" || process.env.AI_SEARCH_WASM === "true";
118
+ }
119
+ async function loadNativeExtractor() {
120
+ const { pipeline, env } = await import("@huggingface/transformers");
121
+ const modelPath = process.env.AI_MODEL_PATH;
122
+ if (modelPath) {
123
+ env.localModelPath = modelPath;
124
+ env.allowRemoteModels = false;
125
+ }
126
+ return pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
127
+ }
128
+ async function loadWasmExtractor() {
129
+ const require = createRequire(import.meta.url);
130
+ const pkgRoot = dirname(require.resolve("@huggingface/transformers/package.json"));
131
+ const webPath = join(pkgRoot, "dist", "transformers.web.js");
132
+ const mod = await import(pathToFileURL(webPath).href);
133
+ const { pipeline, env } = mod;
134
+ const modelPath = process.env.AI_MODEL_PATH;
135
+ if (modelPath) {
136
+ env.localModelPath = modelPath;
137
+ env.allowRemoteModels = false;
138
+ }
139
+ return pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
140
+ }
141
+ async function getExtractor() {
142
+ if (extractor)
143
+ return extractor;
144
+ const tryWasmFirst = preferWasm() || (isWindows() && !process.env.AI_SEARCH_FORCE_NATIVE);
145
+ if (tryWasmFirst) {
146
+ try {
147
+ extractor = await loadWasmExtractor();
148
+ backendUsed = "wasm";
149
+ return extractor;
150
+ }
151
+ catch (err) {
152
+ // Fall through to try native
153
+ }
154
+ }
155
+ try {
156
+ extractor = await loadNativeExtractor();
157
+ backendUsed = "native";
158
+ return extractor;
159
+ }
160
+ catch (nativeErr) {
161
+ if (!tryWasmFirst) {
162
+ try {
163
+ extractor = await loadWasmExtractor();
164
+ backendUsed = "wasm";
165
+ return extractor;
166
+ }
167
+ catch {
168
+ // Re-throw original native error for clearer message
169
+ }
170
+ }
171
+ throw nativeErr;
172
+ }
173
+ }
174
+ /** Pre-warm the semantic model (download + load). Call at init or session start to avoid first-query latency. */
175
+ export async function warmSearchModel() {
176
+ if (getSearchMode() === "keyword")
177
+ return;
178
+ await getExtractor();
179
+ }
180
+ /** Backend used for the last semantic/hybrid search, or "keyword" if only keyword was used. */
181
+ export function getLastSearchBackend() {
182
+ return backendUsed;
183
+ }
184
+ async function semanticSearchChunks(chunks, chunksEmbeddings, queryEmbedding) {
185
+ const sims = chunksEmbeddings.map((emb, i) => ({
186
+ file: chunks[i].file,
187
+ sim: cosineSimilarity(queryEmbedding, emb),
188
+ }));
189
+ const byFile = new Map();
190
+ for (const { file, sim } of sims) {
191
+ const cur = byFile.get(file) ?? -Infinity;
192
+ if (sim > cur)
193
+ byFile.set(file, sim);
194
+ }
195
+ return [...byFile.entries()]
196
+ .sort((a, b) => b[1] - a[1])
197
+ .map(([file]) => file);
198
+ }
199
+ /**
200
+ * Run hybrid search. Returns results ordered by relevance.
201
+ * - keyword: TF-based only
202
+ * - semantic: vector similarity only (requires model load)
203
+ * - hybrid: RRF merge of keyword + semantic
204
+ */
205
+ export async function hybridSearch(aiDir, query, options) {
206
+ const { mode, limit = 10, tags, includeDeprecated = false } = options;
207
+ const chunks = await loadChunks(aiDir);
208
+ // Filter deprecated entries (skip chunks whose first line contains [DEPRECATED])
209
+ let filtered = includeDeprecated
210
+ ? chunks
211
+ : chunks.filter((c) => {
212
+ const firstLine = c.text.split("\n")[0] ?? "";
213
+ return !firstLine.includes("[DEPRECATED]");
214
+ });
215
+ // Tag filter
216
+ if (tags && tags.length > 0) {
217
+ const tagLower = tags.map((t) => t.toLowerCase());
218
+ filtered = filtered.filter((c) => {
219
+ const lower = c.text.toLowerCase();
220
+ return tagLower.every((t) => lower.includes(t));
221
+ });
222
+ }
223
+ if (filtered.length === 0)
224
+ return { results: [], backend: "keyword" };
225
+ const kwResults = keywordSearchChunks(filtered, query);
226
+ if (mode === "keyword") {
227
+ backendUsed = "keyword";
228
+ return { results: kwResults.slice(0, limit), backend: "keyword" };
229
+ }
230
+ const kwFileOrder = kwResults.map((r) => r.file);
231
+ const ext = await getExtractor();
232
+ const dim = 384;
233
+ // Embed chunks (batch)
234
+ const chunkTexts = filtered.map((c) => c.text);
235
+ const chunkEmbRaw = await ext(chunkTexts, { pooling: "mean", normalize: true });
236
+ const data = tensorToArray(chunkEmbRaw);
237
+ const chunksEmbeddings = Array.isArray(data[0])
238
+ ? data
239
+ : (() => {
240
+ const flat = data;
241
+ const out = [];
242
+ for (let i = 0; i < flat.length; i += dim) {
243
+ out.push(flat.slice(i, i + dim));
244
+ }
245
+ return out;
246
+ })();
247
+ const qEmbRaw = await ext(query, { pooling: "mean", normalize: true });
248
+ const qEmb = tensorToArray(qEmbRaw);
249
+ const queryEmb = Array.isArray(qEmb[0]) ? qEmb[0] : qEmb;
250
+ const semFileOrder = await semanticSearchChunks(filtered, chunksEmbeddings, queryEmb);
251
+ if (mode === "semantic") {
252
+ const results = semFileOrder.slice(0, limit).map((file) => {
253
+ const c = filtered.find((x) => x.file === file);
254
+ const excerpt = c?.text.split("\n")[0]?.trim() ?? "";
255
+ return { file, excerpt, score: 1 };
256
+ });
257
+ return { results, backend: backendUsed };
258
+ }
259
+ // hybrid
260
+ const merged = rrfMerge([kwFileOrder, semFileOrder], RRF_K);
261
+ const results = merged.slice(0, limit).map((file) => {
262
+ const c = filtered.find((x) => x.file === file);
263
+ const excerpt = c?.text.split("\n")[0]?.trim() ?? "";
264
+ return { file, excerpt, score: 1 };
265
+ });
266
+ return { results, backend: backendUsed };
267
+ }
268
+ /**
269
+ * Get current search mode from env. Default: hybrid.
270
+ */
271
+ export function getSearchMode() {
272
+ const v = process.env.AI_SEARCH?.toLowerCase();
273
+ if (v === "keyword" || v === "semantic" || v === "hybrid")
274
+ return v;
275
+ return "hybrid";
276
+ }
277
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hybrid-search/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { runEvals, type EvalReport, type EvalMetric } from "./evals/index.js";
2
+ export { validateAll, formatAll, generateMemoryIndex, validateFrontmatter, ensureFrontmatter, type ValidationError, } from "./formatter/index.js";
3
+ export { readP0Entries, compileHarnessRules, generateRuleTests, type P0Entry, type HarnessRule, type RuleTest } from "./mcp-server/p0-parser.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EACL,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,eAAe,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // @radix-ai/ai-memory — public API
2
+ export { runEvals } from "./evals/index.js";
3
+ export { validateAll, formatAll, generateMemoryIndex, validateFrontmatter, ensureFrontmatter, } from "./formatter/index.js";
4
+ export { readP0Entries, compileHarnessRules, generateRuleTests } from "./mcp-server/p0-parser.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,QAAQ,EAAoC,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EACL,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,GAElB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAiD,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(options?: {
3
+ http?: boolean;
4
+ port?: number;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp-server/index.ts"],"names":[],"mappings":";AAiBA,wBAAsB,IAAI,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGrF"}
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { join, resolve, dirname } from "path";
5
+ import { existsSync, readFileSync } from "fs";
6
+ import { fileURLToPath } from "url";
7
+ import { timingSafeEqual } from "crypto";
8
+ import { registerResources } from "./resources.js";
9
+ import { registerTools } from "./tools.js";
10
+ function resolveAiDir() {
11
+ // Priority: AI_DIR env var → cwd/.ai
12
+ const fromEnv = process.env.AI_DIR;
13
+ if (fromEnv)
14
+ return resolve(fromEnv);
15
+ return join(process.cwd(), ".ai");
16
+ }
17
+ export async function main(options) {
18
+ const aiDir = resolveAiDir();
19
+ if (!existsSync(aiDir)) {
20
+ process.stderr.write(`[ai-memory] .ai/ directory not found at: ${aiDir}\n` +
21
+ `Run \`ai-memory init\` in your project to set it up.\n`);
22
+ process.exit(1);
23
+ }
24
+ // Read version from package.json — single source of truth
25
+ const __dirname_mcp = dirname(fileURLToPath(import.meta.url));
26
+ const pkgPath = join(__dirname_mcp, "..", "..", "package.json");
27
+ const version = existsSync(pkgPath)
28
+ ? JSON.parse(readFileSync(pkgPath, "utf-8")).version
29
+ : "0.0.0";
30
+ const server = new Server({ name: "ai-memory", version }, { capabilities: { resources: {}, tools: {} } });
31
+ registerResources(server, aiDir);
32
+ registerTools(server, aiDir);
33
+ if (options?.http) {
34
+ // HTTP transport for cloud agents (Cursor cloud, automations)
35
+ const { StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
36
+ const { createServer } = await import("http");
37
+ const port = options.port ?? 3100;
38
+ const httpTransport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
39
+ const authToken = process.env.AI_MEMORY_AUTH_TOKEN;
40
+ const authTokenBuf = authToken ? Buffer.from(authToken) : null;
41
+ const corsOriginsRaw = process.env.AI_MEMORY_CORS_ORIGINS ?? "*";
42
+ const allowedOrigins = corsOriginsRaw === "*" ? null : corsOriginsRaw.split(",").map((o) => o.trim());
43
+ const httpServer = createServer(async (req, res) => {
44
+ const reqOrigin = req.headers.origin ?? "";
45
+ if (allowedOrigins === null) {
46
+ res.setHeader("Access-Control-Allow-Origin", "*");
47
+ }
48
+ else if (allowedOrigins.includes(reqOrigin)) {
49
+ res.setHeader("Access-Control-Allow-Origin", reqOrigin);
50
+ res.setHeader("Vary", "Origin");
51
+ }
52
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, DELETE");
53
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
54
+ if (req.method === "OPTIONS") {
55
+ res.writeHead(204);
56
+ res.end();
57
+ return;
58
+ }
59
+ if (req.url === "/health" && req.method === "GET") {
60
+ res.writeHead(200, { "Content-Type": "application/json" });
61
+ res.end(JSON.stringify({ status: "ok" }));
62
+ return;
63
+ }
64
+ if (authTokenBuf) {
65
+ const header = req.headers.authorization;
66
+ const provided = header?.startsWith("Bearer ") ? header.slice(7) : "";
67
+ const providedBuf = Buffer.from(provided);
68
+ const match = authTokenBuf.length === providedBuf.length &&
69
+ timingSafeEqual(authTokenBuf, providedBuf);
70
+ if (!match) {
71
+ res.writeHead(401, { "Content-Type": "application/json" });
72
+ res.end(JSON.stringify({ error: "Unauthorized. Set Authorization: Bearer <AI_MEMORY_AUTH_TOKEN>." }));
73
+ return;
74
+ }
75
+ }
76
+ if (req.url === "/mcp" || req.url === "/") {
77
+ await httpTransport.handleRequest(req, res);
78
+ return;
79
+ }
80
+ res.writeHead(404);
81
+ res.end("Not found");
82
+ });
83
+ await server.connect(httpTransport);
84
+ httpServer.listen(port, () => {
85
+ process.stderr.write(`[ai-memory] MCP HTTP server started on port ${port}.\n`);
86
+ process.stderr.write(`[ai-memory] Endpoint: http://localhost:${port}/mcp\n`);
87
+ if (authToken)
88
+ process.stderr.write(`[ai-memory] Auth: Bearer token required\n`);
89
+ if (corsOriginsRaw !== "*")
90
+ process.stderr.write(`[ai-memory] CORS: ${corsOriginsRaw}\n`);
91
+ });
92
+ }
93
+ else {
94
+ // Default: stdio transport for local IDEs — silent startup (matches Context7/compound style)
95
+ const transport = new StdioServerTransport();
96
+ await server.connect(transport);
97
+ if (process.env.AI_MEMORY_DEBUG) {
98
+ process.stderr.write(`[ai-memory] MCP server started (stdio). AI_DIR=${aiDir}\n`);
99
+ }
100
+ }
101
+ }
102
+ // Only auto-run when executed directly (not when imported by CLI)
103
+ // import.meta.url is file:///path/to/index.js; process.argv[1] is /path/to/index.js
104
+ if (process.argv[1]) {
105
+ const entryUrl = new URL(`file://${process.argv[1].replace(/\\/g, "/")}`).href;
106
+ if (entryUrl === import.meta.url) {
107
+ main().catch((err) => {
108
+ const msg = err instanceof Error ? err.stack ?? err.message : String(err);
109
+ process.stderr.write(`[ai-memory] Fatal error: ${msg}\n`);
110
+ process.exit(1);
111
+ });
112
+ }
113
+ }
114
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp-server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /** Regex rules only. Which lines to scan: additions (default), deletions, or both. */
2
+ export type RuleScope = "additions" | "deletions" | "all";
3
+ export interface ConstraintPattern {
4
+ type: "ast" | "regex";
5
+ language?: string;
6
+ pattern: string;
7
+ where?: Record<string, {
8
+ regex: string;
9
+ }>;
10
+ path: string;
11
+ /** Regex only. Default: "additions". Use "deletions" for rules like "don't remove [P0] markers". */
12
+ scope?: RuleScope;
13
+ message?: string;
14
+ }
15
+ export interface HarnessRule {
16
+ id: string;
17
+ type: "ast" | "regex";
18
+ language?: string;
19
+ pattern: string;
20
+ where?: Record<string, {
21
+ regex: string;
22
+ }>;
23
+ path: string;
24
+ scope?: RuleScope;
25
+ severity: "P0" | "P1" | "P2";
26
+ message: string;
27
+ }
28
+ export interface RuleTest {
29
+ rule_id: string;
30
+ should_trigger: string;
31
+ should_not_trigger: string;
32
+ }
33
+ export interface P0Entry {
34
+ id: string;
35
+ title: string;
36
+ body: string;
37
+ constraint_pattern?: ConstraintPattern;
38
+ }
39
+ export declare function parseMemoryEntries(content: string, fileId: string): P0Entry[];
40
+ export declare function readP0Entries(aiDir: string): Promise<P0Entry[]>;
41
+ export declare function compileHarnessRules(entries: P0Entry[]): HarnessRule[];
42
+ export declare function generateRuleTests(entries: P0Entry[]): RuleTest[];
43
+ //# sourceMappingURL=p0-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"p0-parser.d.ts","sourceRoot":"","sources":["../../src/mcp-server/p0-parser.ts"],"names":[],"mappings":"AAIA,sFAAsF;AACtF,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,oGAAoG;IACpG,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;CACxC;AAID,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,EAAE,CAyDX;AAGD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAgBrE;AAGD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAmBrE;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAwBhE"}
@@ -0,0 +1,108 @@
1
+ import { readFile } from "fs/promises";
2
+ import { join } from "path";
3
+ import yaml from "js-yaml";
4
+ // Parse [P0] entries from a multi-entry memory file.
5
+ // Entries are markdown sections starting with ### [P0], ### [P1], or ### [P2]
6
+ export function parseMemoryEntries(content, fileId) {
7
+ const entries = [];
8
+ // Split on section headings ### [Px] Title
9
+ const sectionRegex = /^### \[(P0|P1|P2)\] (.+)$/gm;
10
+ const sections = [];
11
+ let match;
12
+ while ((match = sectionRegex.exec(content)) !== null) {
13
+ sections.push({
14
+ priority: match[1],
15
+ title: match[2].trim(),
16
+ start: match.index,
17
+ });
18
+ }
19
+ for (let i = 0; i < sections.length; i++) {
20
+ const section = sections[i];
21
+ const end = i + 1 < sections.length ? sections[i + 1].start : content.length;
22
+ const body = content.slice(section.start, end).trim();
23
+ if (section.priority !== "P0")
24
+ continue;
25
+ // Extract constraint_pattern from inline YAML block if present
26
+ // Format: ```yaml\nconstraint_pattern:\n ...\n```
27
+ let constraint_pattern;
28
+ const yamlBlockMatch = body.match(/```yaml\s*\nconstraint_pattern:\s*\n([\s\S]*?)```/);
29
+ if (yamlBlockMatch) {
30
+ try {
31
+ const parsed = yaml.load(`constraint_pattern:\n${yamlBlockMatch[1]}`, { schema: yaml.JSON_SCHEMA });
32
+ constraint_pattern = parsed.constraint_pattern;
33
+ }
34
+ catch {
35
+ // malformed yaml block — skip pattern
36
+ }
37
+ }
38
+ const slug = section.title
39
+ .toLowerCase()
40
+ .replace(/[^a-z0-9]+/g, "-")
41
+ .slice(0, 40);
42
+ const id = `${fileId}-${slug}`;
43
+ entries.push({
44
+ id,
45
+ title: section.title,
46
+ body,
47
+ constraint_pattern,
48
+ });
49
+ }
50
+ return entries;
51
+ }
52
+ // Read all [P0] entries from decisions.md and debugging.md
53
+ export async function readP0Entries(aiDir) {
54
+ const files = ["memory/decisions.md", "memory/debugging.md"];
55
+ const entries = [];
56
+ for (const file of files) {
57
+ const path = join(aiDir, file);
58
+ try {
59
+ const content = await readFile(path, "utf-8");
60
+ const fileId = file.replace("memory/", "").replace(".md", "");
61
+ entries.push(...parseMemoryEntries(content, fileId));
62
+ }
63
+ catch {
64
+ // file may not exist yet — skip
65
+ }
66
+ }
67
+ return entries;
68
+ }
69
+ // Compile [P0] entries with constraint_pattern into harness rules
70
+ export function compileHarnessRules(entries) {
71
+ return entries
72
+ .filter((e) => e.constraint_pattern !== undefined)
73
+ .map((e) => {
74
+ const cp = e.constraint_pattern;
75
+ return {
76
+ id: e.id,
77
+ type: cp.type,
78
+ language: cp.language,
79
+ pattern: cp.pattern,
80
+ where: cp.where,
81
+ path: cp.path,
82
+ scope: cp.scope,
83
+ severity: "P0",
84
+ message: cp.message ??
85
+ `[P0] Constraint violation: ${e.title} (${e.id})`,
86
+ };
87
+ });
88
+ }
89
+ // Generate rule tests for each harness rule that has examples in the entry body
90
+ export function generateRuleTests(entries) {
91
+ const tests = [];
92
+ for (const entry of entries) {
93
+ if (!entry.constraint_pattern)
94
+ continue;
95
+ // Look for example blocks: **Should trigger:** and **Should not trigger:**
96
+ const triggerMatch = entry.body.match(/\*\*Should trigger:\*\*\s*```[^\n]*\n([\s\S]*?)```/);
97
+ const noTriggerMatch = entry.body.match(/\*\*Should not trigger:\*\*\s*```[^\n]*\n([\s\S]*?)```/);
98
+ if (triggerMatch && noTriggerMatch) {
99
+ tests.push({
100
+ rule_id: entry.id,
101
+ should_trigger: triggerMatch[1].trim(),
102
+ should_not_trigger: noTriggerMatch[1].trim(),
103
+ });
104
+ }
105
+ }
106
+ return tests;
107
+ }
108
+ //# sourceMappingURL=p0-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"p0-parser.js","sourceRoot":"","sources":["../../src/mcp-server/p0-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ export declare function registerResources(server: Server, aiDir: string): void;
3
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/mcp-server/resources.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA4BxE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA6IrE"}