@radix-ai/ai-memory 0.1.0 → 0.1.1

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 (68) hide show
  1. package/README.md +15 -1
  2. package/dist/cli/adapters.d.ts.map +1 -1
  3. package/dist/cli/adapters.js +36 -0
  4. package/dist/cli/adapters.js.map +1 -1
  5. package/dist/cli/index.js +1 -1
  6. package/dist/evals/index.d.ts +2 -6
  7. package/dist/evals/index.d.ts.map +1 -1
  8. package/dist/evals/index.js +1 -1
  9. package/dist/evals/index.js.map +1 -1
  10. package/dist/evals/performance-comparison.d.ts +4 -10
  11. package/dist/evals/performance-comparison.d.ts.map +1 -1
  12. package/dist/evals/performance-comparison.js.map +1 -1
  13. package/dist/evals/platform-integration.d.ts +6 -12
  14. package/dist/evals/platform-integration.d.ts.map +1 -1
  15. package/dist/evals/platform-integration.js.map +1 -1
  16. package/dist/evals/types.d.ts +8 -0
  17. package/dist/evals/types.d.ts.map +1 -0
  18. package/dist/evals/types.js +2 -0
  19. package/dist/evals/types.js.map +1 -0
  20. package/dist/governance/p0-parser.d.ts +43 -0
  21. package/dist/governance/p0-parser.d.ts.map +1 -0
  22. package/dist/governance/p0-parser.js +108 -0
  23. package/dist/governance/p0-parser.js.map +1 -0
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/mcp-server/index.d.ts.map +1 -1
  27. package/dist/mcp-server/index.js +7 -2
  28. package/dist/mcp-server/index.js.map +1 -1
  29. package/dist/mcp-server/resources.d.ts.map +1 -1
  30. package/dist/mcp-server/resources.js +5 -16
  31. package/dist/mcp-server/resources.js.map +1 -1
  32. package/dist/mcp-server/tools/collaboration.d.ts +5 -0
  33. package/dist/mcp-server/tools/collaboration.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/collaboration.js +130 -0
  35. package/dist/mcp-server/tools/collaboration.js.map +1 -0
  36. package/dist/mcp-server/tools/docs.d.ts +5 -0
  37. package/dist/mcp-server/tools/docs.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/docs.js +63 -0
  39. package/dist/mcp-server/tools/docs.js.map +1 -0
  40. package/dist/mcp-server/tools/governance.d.ts +17 -0
  41. package/dist/mcp-server/tools/governance.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/governance.js +215 -0
  43. package/dist/mcp-server/tools/governance.js.map +1 -0
  44. package/dist/mcp-server/tools/index.d.ts +4 -0
  45. package/dist/mcp-server/tools/index.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/index.js +233 -0
  47. package/dist/mcp-server/tools/index.js.map +1 -0
  48. package/dist/mcp-server/tools/memory.d.ts +8 -0
  49. package/dist/mcp-server/tools/memory.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/memory.js +153 -0
  51. package/dist/mcp-server/tools/memory.js.map +1 -0
  52. package/dist/mcp-server/tools/shared.d.ts +19 -0
  53. package/dist/mcp-server/tools/shared.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/shared.js +112 -0
  55. package/dist/mcp-server/tools/shared.js.map +1 -0
  56. package/dist/mcp-server/tools.d.ts.map +1 -1
  57. package/dist/mcp-server/tools.js +33 -17
  58. package/dist/mcp-server/tools.js.map +1 -1
  59. package/dist/schema-constants.d.ts +1 -1
  60. package/dist/schema-constants.d.ts.map +1 -1
  61. package/dist/schema-constants.js +1 -1
  62. package/dist/schema-constants.js.map +1 -1
  63. package/dist/utils/fs.d.ts +5 -0
  64. package/dist/utils/fs.d.ts.map +1 -0
  65. package/dist/utils/fs.js +22 -0
  66. package/dist/utils/fs.js.map +1 -0
  67. package/package.json +2 -2
  68. package/plugins/adapters/generic/BOOTSTRAP_INSTRUCTION.md +1 -0
@@ -1,6 +1,7 @@
1
1
  import { readFile } from "fs/promises";
2
- import { join, relative, resolve } from "path";
2
+ import { join } from "path";
3
3
  import { existsSync } from "fs";
4
+ import { safeRead, assertPathWithinAiDir } from "../utils/fs.js";
4
5
  import { ListResourcesRequestSchema, ReadResourceRequestSchema, ErrorCode, McpError, } from "@modelcontextprotocol/sdk/types.js";
5
6
  // Returns the last N lines of a file, or all lines if fewer than N
6
7
  async function tail(filePath, lines) {
@@ -13,15 +14,6 @@ async function tail(filePath, lines) {
13
14
  return "";
14
15
  }
15
16
  }
16
- // Read a file safely, returning empty string if not found
17
- async function safeRead(filePath) {
18
- try {
19
- return await readFile(filePath, "utf-8");
20
- }
21
- catch {
22
- return "";
23
- }
24
- }
25
17
  export function registerResources(server, aiDir) {
26
18
  // List available resources
27
19
  server.setRequestHandler(ListResourcesRequestSchema, async () => {
@@ -125,7 +117,6 @@ export function registerResources(server, aiDir) {
125
117
  }
126
118
  // Dynamic: memory://file/{path}
127
119
  if (uri.startsWith("memory://file/")) {
128
- // Decode before path check to prevent %2e%2e bypass
129
120
  let relativePath;
130
121
  try {
131
122
  relativePath = decodeURIComponent(uri.slice("memory://file/".length));
@@ -133,12 +124,10 @@ export function registerResources(server, aiDir) {
133
124
  catch {
134
125
  throw new McpError(ErrorCode.InvalidRequest, `Invalid URI encoding: ${uri}`);
135
126
  }
136
- // Security: ensure resolved path stays inside aiDir
137
- const fullPath = resolve(aiDir, relativePath);
138
- const rel = relative(aiDir, fullPath);
139
- if (rel.startsWith("..") || rel.startsWith("/") || /\.\.[\\/]/.test(rel)) {
140
- throw new McpError(ErrorCode.InvalidRequest, `Path traversal not allowed: ${relativePath}`);
127
+ if (relativePath.includes("\0")) {
128
+ throw new McpError(ErrorCode.InvalidRequest, "Path must not contain null bytes.");
141
129
  }
130
+ const fullPath = assertPathWithinAiDir(aiDir, relativePath);
142
131
  const content = await safeRead(fullPath);
143
132
  return {
144
133
  contents: [
@@ -1 +1 @@
1
- {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/mcp-server/resources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/mcp-server/resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type McpResponse } from "./shared.js";
2
+ export declare function handleClaimTask(aiDir: string, args: Record<string, unknown>): Promise<McpResponse>;
3
+ export declare function handlePublishResult(aiDir: string, args: Record<string, unknown>): Promise<McpResponse>;
4
+ export declare function handleSyncMemory(aiDir: string, args: Record<string, unknown>): Promise<McpResponse>;
5
+ //# sourceMappingURL=collaboration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/collaboration.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAEpH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAgDxG;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAqC5G;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAuCzG"}
@@ -0,0 +1,130 @@
1
+ import { readFile, writeFile, mkdir } from "fs/promises";
2
+ import { join, dirname, resolve } from "path";
3
+ import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
4
+ import { assertPathWithinAiDir } from "../../utils/fs.js";
5
+ import { generateSessionId, sanitizeCommitMessage, textResponse } from "./shared.js";
6
+ export async function handleClaimTask(aiDir, args) {
7
+ const taskDesc = args.task_description;
8
+ if (typeof taskDesc !== "string" || !taskDesc.trim()) {
9
+ throw new McpError(ErrorCode.InvalidParams, "task_description is required.");
10
+ }
11
+ const sessionId = (typeof args.session_id === "string" && args.session_id) || generateSessionId();
12
+ const sourcePath = typeof args.source === "string" && args.source
13
+ ? args.source
14
+ : "sessions/open-items.md";
15
+ const sourceFullPath = assertPathWithinAiDir(aiDir, sourcePath);
16
+ let sourceContent = "";
17
+ try {
18
+ sourceContent = await readFile(sourceFullPath, "utf-8");
19
+ }
20
+ catch { /* no file yet */ }
21
+ const taskTerms = taskDesc.toLowerCase().split(/\s+/).filter(Boolean);
22
+ const lines = sourceContent.split("\n");
23
+ let matchedLine = -1;
24
+ let bestScore = 0;
25
+ const taskLinePattern = /^(\s*[-*]\s*\[[ ]\]|\s*[-*]\s|\s*\d+\.\s)/;
26
+ for (let i = 0; i < lines.length; i++) {
27
+ const line = lines[i];
28
+ if (!taskLinePattern.test(line))
29
+ continue;
30
+ if (line.includes("[CLAIMED:") || line.match(/\[x\]/i))
31
+ continue;
32
+ const lower = line.toLowerCase();
33
+ const score = taskTerms.filter((t) => lower.includes(t)).length;
34
+ if (score > bestScore) {
35
+ bestScore = score;
36
+ matchedLine = i;
37
+ }
38
+ }
39
+ if (matchedLine >= 0 && bestScore >= Math.min(2, taskTerms.length)) {
40
+ const original = lines[matchedLine];
41
+ lines[matchedLine] = original.replace("- [ ]", "- [~]") + ` [CLAIMED:${sessionId}]`;
42
+ await writeFile(sourceFullPath, lines.join("\n"));
43
+ return textResponse(`✓ Claimed task from ${sourcePath} (session ${sessionId}):\n${lines[matchedLine]}`);
44
+ }
45
+ const openItemsPath = join(aiDir, "sessions/open-items.md");
46
+ let openItems = "";
47
+ try {
48
+ openItems = await readFile(openItemsPath, "utf-8");
49
+ }
50
+ catch { }
51
+ const newItem = `- [~] ${taskDesc} [CLAIMED:${sessionId}]`;
52
+ const updated = openItems.includes("## Open")
53
+ ? openItems.replace("## Open", `## Open\n\n${newItem}`)
54
+ : openItems + `\n\n## Open\n\n${newItem}`;
55
+ await mkdir(dirname(openItemsPath), { recursive: true });
56
+ await writeFile(openItemsPath, updated);
57
+ return textResponse(`✓ No match in ${sourcePath}. Created and claimed new task in open-items.md (session ${sessionId}):\n${newItem}`);
58
+ }
59
+ export async function handlePublishResult(aiDir, args) {
60
+ const summary = args.summary;
61
+ const outcome = args.outcome;
62
+ if (typeof summary !== "string" || !summary.trim()) {
63
+ throw new McpError(ErrorCode.InvalidParams, "summary is required.");
64
+ }
65
+ if (typeof outcome !== "string" || !["success", "failure", "partial"].includes(outcome)) {
66
+ throw new McpError(ErrorCode.InvalidParams, "outcome must be 'success', 'failure', or 'partial'.");
67
+ }
68
+ const learnings = typeof args.learnings === "string" ? args.learnings : "";
69
+ const sessionId = (typeof args.session_id === "string" && args.session_id) || generateSessionId();
70
+ const date = new Date().toISOString().slice(0, 10);
71
+ const icon = outcome === "success" ? "✓" : outcome === "failure" ? "✗" : "~";
72
+ const archivePath = join(aiDir, "sessions/archive/thread-archive.md");
73
+ const entry = `[${date}] [${icon} ${outcome}] ${summary}${learnings ? ` — Learnings: ${learnings}` : ""} (session:${sessionId})`;
74
+ try {
75
+ const existing = await readFile(archivePath, "utf-8");
76
+ await writeFile(archivePath, existing.trimEnd() + "\n" + entry + "\n");
77
+ }
78
+ catch {
79
+ await mkdir(join(aiDir, "sessions/archive"), { recursive: true });
80
+ await writeFile(archivePath, entry + "\n");
81
+ }
82
+ const openItemsPath = join(aiDir, "sessions/open-items.md");
83
+ try {
84
+ let openItems = await readFile(openItemsPath, "utf-8");
85
+ const marker = outcome === "success" ? "- [x]" : "- [ ]";
86
+ openItems = openItems.replace(new RegExp(`^- \\[~\\] (.+?)\\[CLAIMED:${sessionId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\]`, "gm"), (_, task) => `${marker} ${task.trim()} [${outcome}:${date}]`);
87
+ await writeFile(openItemsPath, openItems);
88
+ }
89
+ catch { /* no open-items yet */ }
90
+ return textResponse(`✓ Result published to thread-archive:\n${entry}`);
91
+ }
92
+ export async function handleSyncMemory(aiDir, args) {
93
+ const rawMsg = typeof args.message === "string" && args.message
94
+ ? args.message
95
+ : `ai-memory: auto-sync ${new Date().toISOString().slice(0, 19)}`;
96
+ const commitMsg = sanitizeCommitMessage(rawMsg);
97
+ const shouldPush = args.push === true;
98
+ const { execFileSync } = await import("child_process");
99
+ const execOpts = { cwd: resolve(aiDir, ".."), encoding: "utf-8", timeout: 30000 };
100
+ try {
101
+ execFileSync("git", ["rev-parse", "--git-dir"], execOpts);
102
+ }
103
+ catch {
104
+ return textResponse("Not a git repository. sync_memory requires git. Commit .ai/ manually.");
105
+ }
106
+ try {
107
+ execFileSync("git", ["add", ".ai/"], execOpts);
108
+ const status = execFileSync("git", ["diff", "--cached", "--name-only"], execOpts).trim();
109
+ if (!status)
110
+ return textResponse("No .ai/ changes to sync.");
111
+ execFileSync("git", ["commit", "-m", commitMsg], execOpts);
112
+ let result = `✓ Committed .ai/ changes: ${commitMsg}\nFiles: ${status.split("\n").length} file(s)`;
113
+ if (shouldPush) {
114
+ try {
115
+ execFileSync("git", ["push"], execOpts);
116
+ result += "\n✓ Pushed to remote.";
117
+ }
118
+ catch (pushErr) {
119
+ const msg = pushErr instanceof Error ? pushErr.message : String(pushErr);
120
+ result += `\n⚠ Push failed: ${msg}\nChanges are committed locally. Push manually.`;
121
+ }
122
+ }
123
+ return textResponse(result);
124
+ }
125
+ catch (err) {
126
+ const msg = err instanceof Error ? err.message : String(err);
127
+ throw new McpError(ErrorCode.InternalError, `sync_memory failed: ${msg}`);
128
+ }
129
+ }
130
+ //# sourceMappingURL=collaboration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration.js","sourceRoot":"","sources":["../../../src/mcp-server/tools/collaboration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type McpResponse } from "./shared.js";
2
+ export declare function handleGetDocPath(aiDir: string, args: Record<string, unknown>): Promise<McpResponse>;
3
+ export declare function handleValidateDocPlacement(aiDir: string, args: Record<string, unknown>): Promise<McpResponse>;
4
+ export declare function handleListDocTypes(aiDir: string): Promise<McpResponse>;
5
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/docs.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAuBzG;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAoBnH;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAO5E"}
@@ -0,0 +1,63 @@
1
+ import { resolve } from "path";
2
+ import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ import { loadDocsSchema, getDocPath, validateDocPlacement, listDocTypes, } from "../../docs-schema.js";
4
+ import { textResponse } from "./shared.js";
5
+ export async function handleGetDocPath(aiDir, args) {
6
+ const docType = args.type;
7
+ if (typeof docType !== "string" || !docType.trim()) {
8
+ throw new McpError(ErrorCode.InvalidParams, "type is required.");
9
+ }
10
+ const projectRoot = resolve(aiDir, "..");
11
+ const schema = await loadDocsSchema(projectRoot);
12
+ if (!schema)
13
+ return textResponse("No .ai/docs-schema.json found. Run `ai-memory init --full` to create one.");
14
+ const slug = typeof args.slug === "string" ? args.slug : undefined;
15
+ let path;
16
+ try {
17
+ path = getDocPath(schema, docType, slug);
18
+ }
19
+ catch (err) {
20
+ if (err instanceof Error && err.message.includes("slug")) {
21
+ throw new McpError(ErrorCode.InvalidParams, err.message);
22
+ }
23
+ throw err;
24
+ }
25
+ if (!path) {
26
+ return textResponse(`Unknown doc type "${docType}". Available: ${Object.keys(schema.docTypes).join(", ")}`);
27
+ }
28
+ return textResponse(path);
29
+ }
30
+ export async function handleValidateDocPlacement(aiDir, args) {
31
+ const projectRoot = resolve(aiDir, "..");
32
+ const schema = await loadDocsSchema(projectRoot);
33
+ if (!schema)
34
+ return textResponse("valid: true (no schema)");
35
+ const pathsToCheck = [];
36
+ if (typeof args.path === "string" && args.path)
37
+ pathsToCheck.push(args.path);
38
+ if (Array.isArray(args.paths))
39
+ pathsToCheck.push(...args.paths.filter((p) => typeof p === "string"));
40
+ if (pathsToCheck.length === 0)
41
+ return textResponse("Provide path or paths to validate.");
42
+ const allErrors = [];
43
+ for (const p of pathsToCheck) {
44
+ const result = validateDocPlacement(schema, p, projectRoot);
45
+ if (!result.valid)
46
+ allErrors.push(...result.errors.map((e) => `${p}: ${e}`));
47
+ }
48
+ const valid = allErrors.length === 0;
49
+ const text = valid
50
+ ? `valid: true (${pathsToCheck.length} path(s) OK)`
51
+ : `valid: false\n${allErrors.join("\n")}`;
52
+ return textResponse(text);
53
+ }
54
+ export async function handleListDocTypes(aiDir) {
55
+ const projectRoot = resolve(aiDir, "..");
56
+ const schema = await loadDocsSchema(projectRoot);
57
+ if (!schema)
58
+ return textResponse("No .ai/docs-schema.json found.");
59
+ const types = listDocTypes(schema);
60
+ const text = types.map((t) => `- ${t.type}: ${t.path}/${t.pattern}`).join("\n");
61
+ return textResponse(text || "No doc types defined.");
62
+ }
63
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/mcp-server/tools/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type McpResponse } from "./shared.js";
2
+ export interface ValidationResult {
3
+ violations: Array<{
4
+ rule_id: string;
5
+ message: string;
6
+ severity: string;
7
+ }>;
8
+ audit: Array<{
9
+ rule_id: string;
10
+ path: string;
11
+ status: "passed" | "failed" | "skipped";
12
+ }>;
13
+ }
14
+ export declare function handleValidateContext(aiDir: string, args: Record<string, unknown>): Promise<McpResponse>;
15
+ export declare function handleValidateSchema(_aiDir: string, args: Record<string, unknown>): Promise<McpResponse>;
16
+ export declare function handleGenerateHarness(aiDir: string): Promise<McpResponse>;
17
+ //# sourceMappingURL=governance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/governance.ts"],"names":[],"mappings":"AAYA,OAAO,EAAiD,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAiB9F,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1E,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;CAC1F;AA6GD,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CA8D9G;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAQ9G;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoB/E"}
@@ -0,0 +1,215 @@
1
+ import { readFile, writeFile, mkdir } from "fs/promises";
2
+ import { join, resolve } from "path";
3
+ import { existsSync } from "fs";
4
+ import { minimatch } from "minimatch";
5
+ import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
6
+ import { readP0Entries, compileHarnessRules, generateRuleTests, } from "../../governance/p0-parser.js";
7
+ import { VALID_TYPES, VALID_STATUSES } from "../../schema-constants.js";
8
+ import { getRepoRoot, MAX_GIT_DIFF_BYTES, textResponse } from "./shared.js";
9
+ // Parse diff into sections with file path and added/deleted lines
10
+ function parseDiffSections(diff) {
11
+ const sections = [];
12
+ const parts = diff.split(/^diff --git /m).slice(1);
13
+ for (const part of parts) {
14
+ const fileMatch = part.match(/^[^\n]*b\/(.+)$/m);
15
+ if (!fileMatch)
16
+ continue;
17
+ const path = fileMatch[1].trim();
18
+ const addedLines = part.split("\n").filter((l) => l.startsWith("+") && !l.startsWith("+++")).map((l) => l.slice(1)).join("\n");
19
+ const deletedLines = part.split("\n").filter((l) => l.startsWith("-") && !l.startsWith("---")).map((l) => l.slice(1)).join("\n");
20
+ sections.push({ path, addedLines, deletedLines });
21
+ }
22
+ return sections;
23
+ }
24
+ async function validateDiff(diff, rules, aiDir, repoRoot) {
25
+ const sections = parseDiffSections(diff);
26
+ const violations = [];
27
+ const audit = [];
28
+ for (const rule of rules) {
29
+ const pathGlob = rule.path || "**/*";
30
+ const matchingSections = sections.filter((s) => {
31
+ const relPath = repoRoot ? s.path : s.path;
32
+ return minimatch(relPath, pathGlob, { dot: true });
33
+ });
34
+ if (matchingSections.length === 0) {
35
+ audit.push({ rule_id: rule.id, path: pathGlob, status: "skipped" });
36
+ continue;
37
+ }
38
+ if (rule.type === "regex") {
39
+ const scope = rule.scope || "additions";
40
+ let content = "";
41
+ for (const section of matchingSections) {
42
+ if (scope === "additions")
43
+ content += section.addedLines + "\n";
44
+ else if (scope === "deletions")
45
+ content += section.deletedLines + "\n";
46
+ else
47
+ content += section.addedLines + "\n" + section.deletedLines + "\n";
48
+ }
49
+ try {
50
+ const regex = new RegExp(rule.pattern, "gm");
51
+ if (regex.test(content)) {
52
+ violations.push({ rule_id: rule.id, message: rule.message, severity: rule.severity });
53
+ audit.push({ rule_id: rule.id, path: pathGlob, status: "failed" });
54
+ }
55
+ else {
56
+ audit.push({ rule_id: rule.id, path: pathGlob, status: "passed" });
57
+ }
58
+ }
59
+ catch {
60
+ violations.push({
61
+ rule_id: rule.id,
62
+ message: `${rule.message} (invalid regex pattern — manual review required)`,
63
+ severity: rule.severity,
64
+ });
65
+ audit.push({ rule_id: rule.id, path: pathGlob, status: "failed" });
66
+ }
67
+ }
68
+ else if (rule.type === "ast") {
69
+ try {
70
+ const { parse } = await import("@ast-grep/napi");
71
+ const lang = rule.language || "typescript";
72
+ let matcher;
73
+ if (rule.where) {
74
+ matcher = { rule: { pattern: rule.pattern }, constraints: rule.where };
75
+ }
76
+ else {
77
+ matcher = rule.pattern;
78
+ }
79
+ let found = false;
80
+ for (const section of matchingSections) {
81
+ const addedCode = section.addedLines;
82
+ if (!addedCode.trim())
83
+ continue;
84
+ const tree = parse(lang, addedCode);
85
+ const sgRoot = tree.root();
86
+ const matches = typeof matcher === "string"
87
+ ? sgRoot.findAll(matcher)
88
+ : sgRoot.findAll(matcher);
89
+ if (matches.length > 0) {
90
+ found = true;
91
+ violations.push({ rule_id: rule.id, message: rule.message, severity: rule.severity });
92
+ audit.push({ rule_id: rule.id, path: pathGlob, status: "failed" });
93
+ break;
94
+ }
95
+ }
96
+ if (!found) {
97
+ audit.push({ rule_id: rule.id, path: pathGlob, status: "passed" });
98
+ }
99
+ }
100
+ catch {
101
+ violations.push({
102
+ rule_id: rule.id,
103
+ message: `${rule.message} (ast-grep unavailable — manual review required)`,
104
+ severity: rule.severity,
105
+ });
106
+ audit.push({ rule_id: rule.id, path: pathGlob, status: "failed" });
107
+ }
108
+ }
109
+ }
110
+ return { violations, audit };
111
+ }
112
+ function validateEntrySchema(entry) {
113
+ const errors = [];
114
+ const required = ["id", "type", "status"];
115
+ for (const field of required) {
116
+ if (!entry[field])
117
+ errors.push(`Missing required field: ${field}`);
118
+ }
119
+ if (entry.type && !VALID_TYPES.includes(entry.type)) {
120
+ errors.push(`Invalid type: ${entry.type}. Must be one of: ${VALID_TYPES.join(", ")}`);
121
+ }
122
+ if (entry.status && !VALID_STATUSES.includes(entry.status)) {
123
+ errors.push(`Invalid status: ${entry.status}. Must be one of: ${VALID_STATUSES.join(", ")}`);
124
+ }
125
+ return errors;
126
+ }
127
+ export async function handleValidateContext(aiDir, args) {
128
+ const gitDiffRaw = args.git_diff;
129
+ if (typeof gitDiffRaw !== "string" || !gitDiffRaw.trim()) {
130
+ throw new McpError(ErrorCode.InvalidParams, "git_diff is required and must be a non-empty string.");
131
+ }
132
+ const gitDiffSize = Buffer.byteLength(gitDiffRaw, "utf-8");
133
+ if (gitDiffSize > MAX_GIT_DIFF_BYTES) {
134
+ throw new McpError(ErrorCode.InvalidParams, `git_diff exceeds ${MAX_GIT_DIFF_BYTES / 1024}KB limit (got ${Math.round(gitDiffSize / 1024)}KB). Trim the diff or validate in chunks.`);
135
+ }
136
+ const harnessPath = join(aiDir, "temp", "harness.json");
137
+ if (!existsSync(harnessPath)) {
138
+ return textResponse("No harness.json found. Run generate_harness to create one, or initialize with --full.");
139
+ }
140
+ let rules;
141
+ try {
142
+ const harnessRaw = await readFile(harnessPath, "utf-8");
143
+ rules = JSON.parse(harnessRaw);
144
+ }
145
+ catch {
146
+ throw new McpError(ErrorCode.InternalError, "Failed to parse harness.json. Run `ai-memory generate-harness` to regenerate.");
147
+ }
148
+ const repoRoot = getRepoRoot(resolve(aiDir, ".."));
149
+ const { violations, audit } = await validateDiff(gitDiffRaw, rules, aiDir, repoRoot);
150
+ const timestamp = new Date().toISOString();
151
+ const harnessVersion = "1.0";
152
+ if (violations.length === 0) {
153
+ const auditLines = audit.map((a) => {
154
+ const icon = a.status === "passed" ? "✓" : a.status === "skipped" ? "○" : "✗";
155
+ return ` ${icon} [P0] ${a.rule_id} (${a.path}) — ${a.status}`;
156
+ });
157
+ const cert = [
158
+ "═══ Stability Certificate ═══",
159
+ `Status: PASSED`,
160
+ `Harness: ${harnessVersion} | ${timestamp}`,
161
+ `repo_root: ${repoRoot ?? "null"}`,
162
+ "",
163
+ "Audit log:",
164
+ ...auditLines,
165
+ "",
166
+ "Stability Surface is 100% compliant with active [P0] constraints.",
167
+ ].join("\n");
168
+ return textResponse(cert);
169
+ }
170
+ const p0Violations = violations.filter((v) => v.severity === "P0");
171
+ if (p0Violations.length > 0) {
172
+ const report = [
173
+ "═══ Constraint Violation Report ═══",
174
+ `Status: FAILED`,
175
+ `Harness: ${harnessVersion} | ${timestamp}`,
176
+ `repo_root: ${repoRoot ?? "null"}`,
177
+ "",
178
+ `[HARD BLOCK] ${p0Violations.length} P0 constraint violation(s):`,
179
+ "",
180
+ ...p0Violations.map((v) => `• ${v.rule_id}: ${v.message}`),
181
+ ].join("\n");
182
+ throw new McpError(ErrorCode.InvalidRequest, report);
183
+ }
184
+ const text = violations.map((v) => `• [${v.severity}] ${v.rule_id}: ${v.message}`).join("\n");
185
+ return textResponse(`Constraint warnings:\n\n${text}`, true);
186
+ }
187
+ export async function handleValidateSchema(_aiDir, args) {
188
+ const entry = args.entry;
189
+ if (!entry || typeof entry !== "object") {
190
+ throw new McpError(ErrorCode.InvalidParams, "entry is required and must be an object.");
191
+ }
192
+ const errors = validateEntrySchema(entry);
193
+ if (errors.length === 0)
194
+ return textResponse("✓ Schema valid.");
195
+ throw new McpError(ErrorCode.InvalidParams, `Schema validation failed:\n\n${errors.map((e) => `• ${e}`).join("\n")}`);
196
+ }
197
+ export async function handleGenerateHarness(aiDir) {
198
+ const entries = await readP0Entries(aiDir);
199
+ const rules = compileHarnessRules(entries);
200
+ const tests = generateRuleTests(entries);
201
+ const tempDir = join(aiDir, "temp");
202
+ await mkdir(tempDir, { recursive: true });
203
+ await writeFile(join(tempDir, "harness.json"), JSON.stringify(rules, null, 2));
204
+ if (tests.length > 0) {
205
+ const testsDir = join(tempDir, "rule-tests");
206
+ await mkdir(testsDir, { recursive: true });
207
+ await writeFile(join(testsDir, "tests.json"), JSON.stringify(tests, null, 2));
208
+ }
209
+ const harnessOk = `✓ Governance gate active: ${rules.length} rule(s) compiled from ${entries.length} [P0] entries. Run validate_context with your git diff to enforce.`;
210
+ const testsLine = tests.length > 0
211
+ ? `✓ Rule tests: ${tests.length} test(s) written to temp/rule-tests/tests.json`
212
+ : `○ Rule tests: none (optional). Add **Should trigger:** and **Should not trigger:** to [P0] entries to generate tests.`;
213
+ return textResponse(`${harnessOk}\n${testsLine}`);
214
+ }
215
+ //# sourceMappingURL=governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.js","sourceRoot":"","sources":["../../../src/mcp-server/tools/governance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,iBAAiB,GAElB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAoB,MAAM,aAAa,CAAC;AAE9F,kEAAkE;AAClE,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,QAAQ,GAAsE,EAAE,CAAC;IACvF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/H,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjI,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAOD,KAAK,UAAU,YAAY,CACzB,IAAY,EACZ,KAAoB,EACpB,KAAa,EACb,QAAuB;IAEvB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,UAAU,GAAkE,EAAE,CAAC;IACrF,MAAM,KAAK,GAAsF,EAAE,CAAC;IAEpG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;QACrC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3C,OAAO,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACpE,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC;YACxC,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBACvC,IAAI,KAAK,KAAK,WAAW;oBAAE,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;qBAC3D,IAAI,KAAK,KAAK,WAAW;oBAAE,OAAO,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;;oBAClE,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;YAC1E,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACtF,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrE,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,CAAC,IAAI,CAAC;oBACd,OAAO,EAAE,IAAI,CAAC,EAAE;oBAChB,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,mDAAmD;oBAC3E,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBACjD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,YAAY,CAAC;gBAE3C,IAAI,OAA+F,CAAC;gBACpG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACzE,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBACzB,CAAC;gBAED,IAAI,KAAK,GAAG,KAAK,CAAC;gBAClB,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;oBACvC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;oBACrC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;wBAAE,SAAS;oBAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAmC,EAAE,SAAS,CAAC,CAAC;oBACnE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC3B,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ;wBACzC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;wBACzB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAwF,CAAC,CAAC;oBAC7G,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvB,KAAK,GAAG,IAAI,CAAC;wBACb,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;wBACtF,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;wBACnE,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,CAAC,IAAI,CAAC;oBACd,OAAO,EAAE,IAAI,CAAC,EAAE;oBAChB,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,kDAAkD;oBAC1E,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA8B;IACzD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,IAAI,CAAE,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAc,CAAC,EAAE,CAAC;QACrF,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,qBAAqB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAE,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAgB,CAAC,EAAE,CAAC;QAC5F,MAAM,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,MAAM,qBAAqB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAa,EAAE,IAA6B;IACtF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;IACjC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QACzD,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,sDAAsD,CAAC,CAAC;IACtG,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,WAAW,GAAG,kBAAkB,EAAE,CAAC;QACrC,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,oBAAoB,kBAAkB,GAAG,IAAI,iBAAiB,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACvL,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC,uFAAuF,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,KAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,+EAA+E,CAAC,CAAC;IAC/H,CAAC;IACD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAErF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,cAAc,GAAG,KAAK,CAAC;IAE7B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9E,OAAO,KAAK,IAAI,SAAS,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QACjE,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG;YACX,+BAA+B;YAC/B,gBAAgB;YAChB,YAAY,cAAc,MAAM,SAAS,EAAE;YAC3C,cAAc,QAAQ,IAAI,MAAM,EAAE;YAClC,EAAE;YACF,YAAY;YACZ,GAAG,UAAU;YACb,EAAE;YACF,mEAAmE;SACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IACnE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG;YACb,qCAAqC;YACrC,gBAAgB;YAChB,YAAY,cAAc,MAAM,SAAS,EAAE;YAC3C,cAAc,QAAQ,IAAI,MAAM,EAAE;YAClC,EAAE;YACF,gBAAgB,YAAY,CAAC,MAAM,8BAA8B;YACjE,EAAE;YACF,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9F,OAAO,YAAY,CAAC,2BAA2B,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,IAA6B;IACtF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,0CAA0C,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAgC,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAChE,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,gCAAgC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAa;IACvD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,SAAS,GAAG,6BAA6B,KAAK,CAAC,MAAM,0BAA0B,OAAO,CAAC,MAAM,oEAAoE,CAAC;IACxK,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAChC,CAAC,CAAC,iBAAiB,KAAK,CAAC,MAAM,gDAAgD;QAC/E,CAAC,CAAC,uHAAuH,CAAC;IAC5H,OAAO,YAAY,CAAC,GAAG,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ export type { ValidationResult } from "./governance.js";
3
+ export declare function registerTools(server: Server, aiDir: string): void;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAexE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAuPjE"}