@runcore-sh/runcore 0.1.8 → 0.1.9

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 (173) hide show
  1. package/dist/access/manifest.d.ts +59 -0
  2. package/dist/access/manifest.d.ts.map +1 -0
  3. package/dist/access/manifest.js +251 -0
  4. package/dist/access/manifest.js.map +1 -0
  5. package/dist/activity/log.d.ts +1 -1
  6. package/dist/activity/log.d.ts.map +1 -1
  7. package/dist/agents/autonomous.d.ts.map +1 -1
  8. package/dist/agents/autonomous.js +38 -0
  9. package/dist/agents/autonomous.js.map +1 -1
  10. package/dist/agents/governance.d.ts +70 -0
  11. package/dist/agents/governance.d.ts.map +1 -0
  12. package/dist/agents/governance.js +220 -0
  13. package/dist/agents/governance.js.map +1 -0
  14. package/dist/agents/governed-spawn.d.ts +83 -0
  15. package/dist/agents/governed-spawn.d.ts.map +1 -0
  16. package/dist/agents/governed-spawn.js +186 -0
  17. package/dist/agents/governed-spawn.js.map +1 -0
  18. package/dist/agents/heartbeat.d.ts +91 -0
  19. package/dist/agents/heartbeat.d.ts.map +1 -0
  20. package/dist/agents/heartbeat.js +323 -0
  21. package/dist/agents/heartbeat.js.map +1 -0
  22. package/dist/agents/index.d.ts +4 -1
  23. package/dist/agents/index.d.ts.map +1 -1
  24. package/dist/agents/index.js +6 -1
  25. package/dist/agents/index.js.map +1 -1
  26. package/dist/agents/spawn-policy.d.ts +45 -0
  27. package/dist/agents/spawn-policy.d.ts.map +1 -0
  28. package/dist/agents/spawn-policy.js +202 -0
  29. package/dist/agents/spawn-policy.js.map +1 -0
  30. package/dist/alert.d.ts +16 -0
  31. package/dist/alert.d.ts.map +1 -0
  32. package/dist/alert.js +70 -0
  33. package/dist/alert.js.map +1 -0
  34. package/dist/cli.js +35 -27
  35. package/dist/cli.js.map +1 -1
  36. package/dist/credentials/store.d.ts +1 -1
  37. package/dist/credentials/store.d.ts.map +1 -1
  38. package/dist/credentials/store.js +14 -3
  39. package/dist/credentials/store.js.map +1 -1
  40. package/dist/crystallizer.d.ts +56 -0
  41. package/dist/crystallizer.d.ts.map +1 -0
  42. package/dist/crystallizer.js +159 -0
  43. package/dist/crystallizer.js.map +1 -0
  44. package/dist/distiller.d.ts +48 -0
  45. package/dist/distiller.d.ts.map +1 -0
  46. package/dist/distiller.js +140 -0
  47. package/dist/distiller.js.map +1 -0
  48. package/dist/google/auth.d.ts +2 -0
  49. package/dist/google/auth.d.ts.map +1 -1
  50. package/dist/google/auth.js +2 -0
  51. package/dist/google/auth.js.map +1 -1
  52. package/dist/integrations/gate.d.ts +40 -0
  53. package/dist/integrations/gate.d.ts.map +1 -0
  54. package/dist/integrations/gate.js +100 -0
  55. package/dist/integrations/gate.js.map +1 -0
  56. package/dist/lib/audit.d.ts +43 -0
  57. package/dist/lib/audit.d.ts.map +1 -0
  58. package/dist/lib/audit.js +120 -0
  59. package/dist/lib/audit.js.map +1 -0
  60. package/dist/lib/brain-io.d.ts.map +1 -1
  61. package/dist/lib/brain-io.js +52 -0
  62. package/dist/lib/brain-io.js.map +1 -1
  63. package/dist/lib/dpapi.d.ts +14 -0
  64. package/dist/lib/dpapi.d.ts.map +1 -0
  65. package/dist/lib/dpapi.js +104 -0
  66. package/dist/lib/dpapi.js.map +1 -0
  67. package/dist/lib/glob-match.d.ts +22 -0
  68. package/dist/lib/glob-match.d.ts.map +1 -0
  69. package/dist/lib/glob-match.js +64 -0
  70. package/dist/lib/glob-match.js.map +1 -0
  71. package/dist/lib/locked.d.ts +40 -0
  72. package/dist/lib/locked.d.ts.map +1 -0
  73. package/dist/lib/locked.js +130 -0
  74. package/dist/lib/locked.js.map +1 -0
  75. package/dist/llm/complete.d.ts.map +1 -1
  76. package/dist/llm/complete.js +5 -2
  77. package/dist/llm/complete.js.map +1 -1
  78. package/dist/llm/fetch-guard.d.ts +16 -0
  79. package/dist/llm/fetch-guard.d.ts.map +1 -0
  80. package/dist/llm/fetch-guard.js +61 -0
  81. package/dist/llm/fetch-guard.js.map +1 -0
  82. package/dist/llm/guard.d.ts +40 -0
  83. package/dist/llm/guard.d.ts.map +1 -0
  84. package/dist/llm/guard.js +88 -0
  85. package/dist/llm/guard.js.map +1 -0
  86. package/dist/llm/membrane.d.ts +46 -0
  87. package/dist/llm/membrane.d.ts.map +1 -0
  88. package/dist/llm/membrane.js +123 -0
  89. package/dist/llm/membrane.js.map +1 -0
  90. package/dist/llm/providers/index.d.ts +5 -1
  91. package/dist/llm/providers/index.d.ts.map +1 -1
  92. package/dist/llm/providers/index.js +8 -1
  93. package/dist/llm/providers/index.js.map +1 -1
  94. package/dist/llm/redact.d.ts +39 -0
  95. package/dist/llm/redact.d.ts.map +1 -0
  96. package/dist/llm/redact.js +155 -0
  97. package/dist/llm/redact.js.map +1 -0
  98. package/dist/llm/sensitive-registry.d.ts +33 -0
  99. package/dist/llm/sensitive-registry.d.ts.map +1 -0
  100. package/dist/llm/sensitive-registry.js +106 -0
  101. package/dist/llm/sensitive-registry.js.map +1 -0
  102. package/dist/mcp-server.d.ts +11 -0
  103. package/dist/mcp-server.d.ts.map +1 -0
  104. package/dist/mcp-server.js +520 -0
  105. package/dist/mcp-server.js.map +1 -0
  106. package/dist/mdns.d.ts +17 -0
  107. package/dist/mdns.d.ts.map +1 -0
  108. package/dist/mdns.js +110 -0
  109. package/dist/mdns.js.map +1 -0
  110. package/dist/nerve/push.d.ts +26 -0
  111. package/dist/nerve/push.d.ts.map +1 -0
  112. package/dist/nerve/push.js +170 -0
  113. package/dist/nerve/push.js.map +1 -0
  114. package/dist/nerve/state.d.ts +35 -0
  115. package/dist/nerve/state.d.ts.map +1 -0
  116. package/dist/nerve/state.js +257 -0
  117. package/dist/nerve/state.js.map +1 -0
  118. package/dist/resend/inbox.d.ts +23 -0
  119. package/dist/resend/inbox.d.ts.map +1 -0
  120. package/dist/resend/inbox.js +198 -0
  121. package/dist/resend/inbox.js.map +1 -0
  122. package/dist/resend/webhooks.d.ts +30 -0
  123. package/dist/resend/webhooks.d.ts.map +1 -0
  124. package/dist/resend/webhooks.js +244 -0
  125. package/dist/resend/webhooks.js.map +1 -0
  126. package/dist/server.d.ts +2 -0
  127. package/dist/server.d.ts.map +1 -1
  128. package/dist/server.js +585 -16
  129. package/dist/server.js.map +1 -1
  130. package/dist/settings.d.ts +14 -1
  131. package/dist/settings.d.ts.map +1 -1
  132. package/dist/settings.js +32 -1
  133. package/dist/settings.js.map +1 -1
  134. package/dist/updater.d.ts +32 -0
  135. package/dist/updater.d.ts.map +1 -0
  136. package/dist/updater.js +145 -0
  137. package/dist/updater.js.map +1 -0
  138. package/dist/vault/policy.d.ts +42 -0
  139. package/dist/vault/policy.d.ts.map +1 -0
  140. package/dist/vault/policy.js +159 -0
  141. package/dist/vault/policy.js.map +1 -0
  142. package/dist/vault/store.d.ts +6 -0
  143. package/dist/vault/store.d.ts.map +1 -1
  144. package/dist/vault/store.js +15 -5
  145. package/dist/vault/store.js.map +1 -1
  146. package/dist/vault/transfer.d.ts +33 -0
  147. package/dist/vault/transfer.d.ts.map +1 -0
  148. package/dist/vault/transfer.js +187 -0
  149. package/dist/vault/transfer.js.map +1 -0
  150. package/dist/voucher.d.ts +39 -0
  151. package/dist/voucher.d.ts.map +1 -0
  152. package/dist/voucher.js +105 -0
  153. package/dist/voucher.js.map +1 -0
  154. package/dist/webhooks/handlers.d.ts +10 -0
  155. package/dist/webhooks/handlers.d.ts.map +1 -1
  156. package/dist/webhooks/handlers.js +53 -0
  157. package/dist/webhooks/handlers.js.map +1 -1
  158. package/dist/webhooks/index.d.ts +2 -2
  159. package/dist/webhooks/index.d.ts.map +1 -1
  160. package/dist/webhooks/index.js +2 -2
  161. package/dist/webhooks/index.js.map +1 -1
  162. package/dist/webhooks/verify.d.ts +8 -0
  163. package/dist/webhooks/verify.d.ts.map +1 -1
  164. package/dist/webhooks/verify.js +56 -0
  165. package/dist/webhooks/verify.js.map +1 -1
  166. package/package.json +8 -2
  167. package/public/board.html +8 -3
  168. package/public/browser.html +8 -3
  169. package/public/library.html +8 -3
  170. package/public/observatory.html +8 -3
  171. package/public/ops.html +8 -3
  172. package/public/registry.html +627 -0
  173. package/public/roadmap.html +975 -0
@@ -0,0 +1,520 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Core Brain MCP Server — exposes Brain memory and knowledge to Claude Code.
4
+ * stdio-only transport. No network port. All logging to stderr.
5
+ *
6
+ * Tools: memory_retrieve, memory_learn, memory_list, read_brain_file,
7
+ * get_settings, list_locked, list_rooms
8
+ * Resources: brain://memory/*, brain://identity, brain://operations
9
+ */
10
+ import { resolve, normalize, join } from "node:path";
11
+ import { readdir, stat } from "node:fs/promises";
12
+ import { z } from "zod";
13
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
15
+ import { Brain } from "./brain.js";
16
+ import { FileSystemLongTermMemory } from "./memory/file-backed.js";
17
+ import { readBrainFile, readBrainLines } from "./lib/brain-io.js";
18
+ import { runWithAuditContext } from "./lib/audit.js";
19
+ import { loadLockedPaths as loadLockedPathsCentral, reloadLockedPaths, isLocked, } from "./lib/locked.js";
20
+ import { setEncryptionKey, setWriteEncryptionEnabled } from "./lib/key-store.js";
21
+ import { loadSettings, getSettings } from "./settings.js";
22
+ import { issueVoucher, checkVoucherWithAlert, setVoucherAlertFn } from "./voucher.js";
23
+ import { sendAlert } from "./alert.js";
24
+ import { Crystallizer, scoreEntry } from "./crystallizer.js";
25
+ import { createCredentialStore } from "./credentials/store.js";
26
+ import { readSessionKey, isDpapiAvailable } from "./lib/dpapi.js";
27
+ // ── Helpers ──────────────────────────────────────────────────────────────────
28
+ const BRAIN_DIR = resolve(process.cwd(), "brain");
29
+ const MEMORY_DIR = join(BRAIN_DIR, "memory");
30
+ /** Log to stderr so stdout stays clean for MCP protocol. */
31
+ function log(msg) {
32
+ process.stderr.write(`[core-brain-mcp] ${msg}\n`);
33
+ }
34
+ /**
35
+ * Resolve a relative path under brain/, guarding against traversal.
36
+ * Returns the absolute path or throws if it escapes brain/.
37
+ * Lock checking is now handled by brain-io functions via the centralized guard.
38
+ */
39
+ function resolveBrainPath(relativePath) {
40
+ const cleaned = normalize(relativePath).replace(/^[/\\]+/, "");
41
+ const full = resolve(BRAIN_DIR, cleaned);
42
+ if (!full.startsWith(BRAIN_DIR)) {
43
+ throw new Error("Path traversal blocked");
44
+ }
45
+ return full;
46
+ }
47
+ /** Format memory entries for display. */
48
+ function formatEntries(entries) {
49
+ if (entries.length === 0)
50
+ return "No entries found.";
51
+ return entries
52
+ .map((e) => `[${e.id}] (${e.type}) ${e.createdAt}\n${e.content}${e.meta ? "\nmeta: " + JSON.stringify(e.meta) : ""}`)
53
+ .join("\n\n---\n\n");
54
+ }
55
+ // ── Startup ──────────────────────────────────────────────────────────────────
56
+ async function main() {
57
+ log("Starting...");
58
+ // 1. Load settings
59
+ const settings = await loadSettings();
60
+ log(`Instance: ${settings.instanceName ?? "Core"}`);
61
+ // 2. Load locked paths (centralized guard)
62
+ const lockedPaths = await loadLockedPathsCentral();
63
+ log(`Locked paths: ${lockedPaths.length}`);
64
+ // 3. Read session key (DPAPI-protected if available, plaintext fallback)
65
+ const keyPath = join(BRAIN_DIR, "identity", ".session-key");
66
+ let encryptionKey;
67
+ try {
68
+ const key = await readSessionKey(keyPath);
69
+ if (key) {
70
+ encryptionKey = key;
71
+ setEncryptionKey(encryptionKey);
72
+ log(`Encryption key loaded (DPAPI: ${isDpapiAvailable() ? "yes" : "no"})`);
73
+ }
74
+ }
75
+ catch {
76
+ log("Could not read session key — running without encryption");
77
+ }
78
+ // 4. Honor encryptBrainFiles setting
79
+ setWriteEncryptionEnabled(settings.encryptBrainFiles);
80
+ // 4b. Hydrate credentials into process.env (encrypted at rest)
81
+ const credStore = createCredentialStore(BRAIN_DIR);
82
+ const hydrated = await credStore.hydrate();
83
+ log(`Credentials hydrated: ${hydrated}`);
84
+ // 5. Construct LTM + Brain
85
+ const ltm = new FileSystemLongTermMemory(MEMORY_DIR, encryptionKey);
86
+ await ltm.init();
87
+ log("LTM initialized");
88
+ // Wire voucher failure alerts to the alert system
89
+ setVoucherAlertFn((subject, body) => sendAlert(subject, body));
90
+ const brain = new Brain({ systemPrompt: "Core Brain MCP", maxRetrieved: 20 }, ltm);
91
+ // 7. Initialize crystallizer — open loops as standing queries
92
+ const crystallizer = new Crystallizer(MEMORY_DIR, async (event) => {
93
+ // Precipitation callback: write notification + log
94
+ const notifPath = resolve(BRAIN_DIR, "operations", "notifications.jsonl");
95
+ const notif = {
96
+ timestamp: new Date().toISOString(),
97
+ source: "crystallizer",
98
+ message: `Loop precipitated: "${event.query}" — ${event.evidenceCount} pieces of evidence collected. Context: ${event.context}`,
99
+ loopId: event.loopId,
100
+ id: Math.random().toString(36).slice(2, 10),
101
+ };
102
+ try {
103
+ const { appendFile } = await import("node:fs/promises");
104
+ await appendFile(notifPath, JSON.stringify(notif) + "\n", "utf-8");
105
+ }
106
+ catch { /* fire and forget */ }
107
+ log(`Loop precipitated: "${event.query}" (${event.evidenceCount} evidence)`);
108
+ });
109
+ await crystallizer.init();
110
+ log(`Open loops loaded: ${crystallizer.list("open").length} active`);
111
+ // 6. Create MCP server
112
+ const mcp = new McpServer({
113
+ name: "core-brain",
114
+ version: "0.1.0",
115
+ });
116
+ // ── Hallway scan: read all unlocked JSONL files in brain/memory/ ─────────
117
+ /** Scan all JSONL files in memory dir, parse entries, skip locked files. */
118
+ async function hallwayScanMemory() {
119
+ const files = await readdir(MEMORY_DIR);
120
+ const jsonlFiles = files.filter((f) => f.endsWith(".jsonl") && f !== "embeddings.jsonl");
121
+ const all = [];
122
+ for (const file of jsonlFiles) {
123
+ const relPath = `memory/${file}`;
124
+ if (isLocked(relPath))
125
+ continue;
126
+ const lines = await readBrainLines(join(MEMORY_DIR, file));
127
+ const archived = new Set();
128
+ for (const line of lines) {
129
+ try {
130
+ const obj = JSON.parse(line);
131
+ if (obj._schema)
132
+ continue;
133
+ if (obj.status === "archived" && typeof obj.id === "string") {
134
+ archived.add(obj.id);
135
+ continue;
136
+ }
137
+ all.push(obj);
138
+ }
139
+ catch {
140
+ continue;
141
+ }
142
+ }
143
+ // Remove archived entries
144
+ for (let i = all.length - 1; i >= 0; i--) {
145
+ if (archived.has(all[i].id))
146
+ all.splice(i, 1);
147
+ }
148
+ }
149
+ return all.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
150
+ }
151
+ // ── Tools ────────────────────────────────────────────────────────────────
152
+ mcp.tool("memory_retrieve", "Search long-term memory by query, with optional type filter", {
153
+ query: z.string().max(500).describe("Search query"),
154
+ type: z.enum(["episodic", "semantic", "procedural"]).optional().describe("Filter by memory type"),
155
+ max: z.number().int().min(1).max(50).optional().describe("Max results (default 10)"),
156
+ }, async ({ query, type, max }) => runWithAuditContext({ caller: "mcp:memory_retrieve", channel: "mcp" }, async () => {
157
+ const maxResults = max ?? 10;
158
+ // If type-filtered, use Brain's existing LTM (3-file) retrieval
159
+ if (type) {
160
+ const entries = await brain.retrieve(query, {
161
+ type: type,
162
+ max: maxResults,
163
+ });
164
+ return { content: [{ type: "text", text: formatEntries(entries) }] };
165
+ }
166
+ // Otherwise, search across ALL unlocked JSONL files with scored retrieval
167
+ const all = await hallwayScanMemory();
168
+ const queryLower = query.toLowerCase();
169
+ const terms = queryLower.split(/\s+/).filter((t) => t.length > 1);
170
+ if (terms.length === 0) {
171
+ return { content: [{ type: "text", text: formatEntries(all.slice(0, maxResults)) }] };
172
+ }
173
+ // Score each entry: term matches + density + co-occurrence + recency + meta
174
+ const now = Date.now();
175
+ const scored = all
176
+ .map((e) => {
177
+ const text = [
178
+ e.content ?? "",
179
+ e.meta ? JSON.stringify(e.meta) : "",
180
+ e.summary ?? "",
181
+ e.title ?? "",
182
+ e.description ?? "",
183
+ ].join(" ").toLowerCase();
184
+ if (!text)
185
+ return { entry: e, score: 0 };
186
+ // Shared scoring geometry (word boundaries, concentration, proximity)
187
+ const baseScore = scoreEntry(terms, queryLower, text);
188
+ if (baseScore === 0)
189
+ return { entry: e, score: 0 };
190
+ // Recency: newer entries score slightly higher (retrieval-only concern)
191
+ const age = now - new Date(e.createdAt).getTime();
192
+ const dayAge = age / (1000 * 60 * 60 * 24);
193
+ const recencyScore = Math.max(0, 0.1 * (1 - dayAge / 365));
194
+ const score = baseScore + recencyScore;
195
+ return { entry: e, score };
196
+ })
197
+ .filter((s) => s.score > 0)
198
+ .sort((a, b) => b.score - a.score)
199
+ .slice(0, maxResults)
200
+ .map((s) => s.entry);
201
+ return {
202
+ content: [{ type: "text", text: formatEntries(scored) }],
203
+ };
204
+ }));
205
+ mcp.tool("memory_learn", "Append a new entry to long-term memory (episodic, semantic, or procedural)", {
206
+ type: z.enum(["episodic", "semantic", "procedural"]).describe("Memory type"),
207
+ content: z.string().min(1).max(10000).describe("Content to store"),
208
+ meta: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional().describe("Optional metadata"),
209
+ }, async ({ type, content, meta }) => {
210
+ const entry = await brain.learn({
211
+ type: type,
212
+ content,
213
+ meta: meta,
214
+ });
215
+ // Flow through the crystallizer — every new memory passes through all open loops
216
+ let crystalNote = "";
217
+ try {
218
+ const precipitations = await crystallizer.test(entry);
219
+ if (precipitations.length > 0) {
220
+ crystalNote = `\n\nCrystallization: ${precipitations.length} loop(s) precipitated:\n` +
221
+ precipitations.map((p) => ` - "${p.query}" (${p.evidenceCount} evidence)`).join("\n");
222
+ }
223
+ }
224
+ catch { /* never block memory writes */ }
225
+ return {
226
+ content: [
227
+ { type: "text", text: `Stored as ${entry.id} (${entry.type}) at ${entry.createdAt}${crystalNote}` },
228
+ ],
229
+ };
230
+ });
231
+ mcp.tool("memory_list", "List memory entries by type, most recent first", {
232
+ type: z.enum(["episodic", "semantic", "procedural"]).optional().describe("Filter by type (omit for all)"),
233
+ limit: z.number().int().min(1).max(100).optional().describe("Max entries (default 20)"),
234
+ }, async ({ type, limit }) => runWithAuditContext({ caller: "mcp:memory_list", channel: "mcp" }, async () => {
235
+ // If type-filtered, use LTM's 3-file scope
236
+ if (type) {
237
+ const entries = await ltm.list(type);
238
+ const sliced = entries.slice(0, limit ?? 20);
239
+ return { content: [{ type: "text", text: formatEntries(sliced) }] };
240
+ }
241
+ // Otherwise, scan all unlocked JSONL files
242
+ const entries = await hallwayScanMemory();
243
+ const sliced = entries.slice(0, limit ?? 20);
244
+ return { content: [{ type: "text", text: formatEntries(sliced) }] };
245
+ }));
246
+ mcp.tool("read_brain_file", "Read any file under brain/ (path-guarded, encrypted files auto-decrypted)", {
247
+ path: z.string().max(500).describe("Relative path under brain/, e.g. 'operations/goals.yaml'"),
248
+ }, async ({ path }) => runWithAuditContext({ caller: "mcp:read_brain_file", channel: "mcp" }, async () => {
249
+ try {
250
+ const fullPath = resolveBrainPath(path);
251
+ const content = await readBrainFile(fullPath);
252
+ return { content: [{ type: "text", text: content }] };
253
+ }
254
+ catch (err) {
255
+ const msg = err instanceof Error ? err.message : String(err);
256
+ return {
257
+ content: [{ type: "text", text: `Error: ${msg}` }],
258
+ isError: true,
259
+ };
260
+ }
261
+ }));
262
+ mcp.tool("get_settings", "Return safe subset of Core settings (no keys or secrets)", {}, async () => {
263
+ const s = getSettings();
264
+ const safe = {
265
+ instanceName: s.instanceName,
266
+ airplaneMode: s.airplaneMode,
267
+ privateMode: s.privateMode,
268
+ encryptBrainFiles: s.encryptBrainFiles,
269
+ models: s.models,
270
+ pulse: s.pulse,
271
+ };
272
+ return {
273
+ content: [{ type: "text", text: JSON.stringify(safe, null, 2) }],
274
+ };
275
+ });
276
+ mcp.tool("list_locked", "Show all currently locked paths in brain/.locked", {}, async () => {
277
+ // Re-read in case it changed
278
+ const paths = await reloadLockedPaths();
279
+ const lines = paths.length > 0
280
+ ? paths.map((p) => `🔒 ${p}`).join("\n")
281
+ : "No locked paths.";
282
+ return { content: [{ type: "text", text: lines }] };
283
+ });
284
+ mcp.tool("list_rooms", "List all files/dirs under brain/ with their locked status", {}, async () => {
285
+ // Re-read locked paths fresh
286
+ await reloadLockedPaths();
287
+ async function walk(dir, prefix) {
288
+ const items = [];
289
+ let entries;
290
+ try {
291
+ entries = await readdir(dir);
292
+ }
293
+ catch {
294
+ return items;
295
+ }
296
+ for (const name of entries.sort()) {
297
+ const relPath = prefix ? `${prefix}/${name}` : name;
298
+ const fullPath = join(dir, name);
299
+ const locked = isLocked(relPath);
300
+ const icon = locked ? "🔒" : "📄";
301
+ try {
302
+ const s = await stat(fullPath);
303
+ if (s.isDirectory()) {
304
+ items.push(`${locked ? "🔒" : "📁"} ${relPath}/`);
305
+ if (!locked) {
306
+ const children = await walk(fullPath, relPath);
307
+ items.push(...children);
308
+ }
309
+ }
310
+ else {
311
+ items.push(`${icon} ${relPath}`);
312
+ }
313
+ }
314
+ catch {
315
+ items.push(`❌ ${relPath} (unreadable)`);
316
+ }
317
+ }
318
+ return items;
319
+ }
320
+ const tree = await walk(BRAIN_DIR, "");
321
+ return {
322
+ content: [{ type: "text", text: tree.join("\n") || "Empty brain directory." }],
323
+ };
324
+ });
325
+ // ── Voucher tools ───────────────────────────────────────────────────────
326
+ mcp.tool("voucher_issue", "Issue a short-lived voucher token for brain-to-brain verification", {
327
+ scope: z.string().optional().describe("What the voucher authorizes (e.g. 'read:settings')"),
328
+ ttlMinutes: z.number().int().min(1).max(1440).optional().describe("Time-to-live in minutes (default 30)"),
329
+ }, async ({ scope, ttlMinutes }) => {
330
+ const token = await issueVoucher(ltm, scope, ttlMinutes);
331
+ return {
332
+ content: [{ type: "text", text: `Voucher issued: ${token}${scope ? ` (scope: ${scope})` : ""}\nExpires in ${ttlMinutes ?? 30} minutes. Carry this token to the other brain.` }],
333
+ };
334
+ });
335
+ mcp.tool("voucher_check", "Verify a voucher token carried from another brain", {
336
+ token: z.string().describe("The voucher token to verify (e.g. 'vch_a8f3x9b2')"),
337
+ }, async ({ token }) => {
338
+ const result = await checkVoucherWithAlert(ltm, token, "mcp:voucher_check");
339
+ if (result.valid) {
340
+ return {
341
+ content: [{ type: "text", text: `Valid voucher.${result.scope ? ` Scope: ${result.scope}` : " No scope restriction."}` }],
342
+ };
343
+ }
344
+ return {
345
+ content: [{ type: "text", text: "Invalid or expired voucher. Request denied." }],
346
+ };
347
+ });
348
+ // ── Alert tool ──────────────────────────────────────────────────────────
349
+ mcp.tool("send_alert", "Send an alert to the human via email and/or SMS. Use when something needs attention (failed voucher, suspicious access, system issue).", {
350
+ subject: z.string().max(200).describe("Alert subject line"),
351
+ body: z.string().max(2000).describe("Alert body with details"),
352
+ }, async ({ subject, body }) => {
353
+ const results = await sendAlert(subject, body);
354
+ const summary = results
355
+ .map((r) => `${r.channel}: ${r.sent ? "sent" : `failed (${r.error})`}`)
356
+ .join(", ");
357
+ return {
358
+ content: [{ type: "text", text: summary }],
359
+ };
360
+ });
361
+ // ── Open loop tools (crystallizer) ──────────────────────────────────────
362
+ mcp.tool("loop_open", "Create an open loop — a standing query that filters the memory stream. Evidence accumulates as matching memories are added. When enough evidence sticks, the loop precipitates and surfaces as a notification.", {
363
+ query: z.string().min(2).max(500).describe("The search shape — terms that define what this loop catches"),
364
+ context: z.string().min(1).max(2000).describe("Why this loop exists — what question you're trying to answer"),
365
+ threshold: z.number().int().min(1).max(50).optional().describe("How many evidence hits before precipitation (default 3)"),
366
+ minScore: z.number().min(0.1).max(2.0).optional().describe("Minimum match score to count as evidence (default 0.4)"),
367
+ }, async ({ query, context, threshold, minScore }) => {
368
+ const loop = await crystallizer.open(query, context, threshold ?? 3, minScore ?? 0.4);
369
+ return {
370
+ content: [{ type: "text", text: `Loop opened: ${loop.id}\nQuery: "${loop.query}"\nContext: ${loop.context}\nThreshold: ${loop.threshold} evidence hits\nMin score: ${loop.minScore}` }],
371
+ };
372
+ });
373
+ mcp.tool("loop_list", "List open loops and their evidence state. Shows what's filtering, what's accumulated, what's precipitated.", {
374
+ status: z.enum(["open", "precipitated", "resolved", "all"]).optional().describe("Filter by status (default: all)"),
375
+ }, async ({ status }) => {
376
+ const filterStatus = status === "all" ? undefined : (status ?? undefined);
377
+ const loops = crystallizer.list(filterStatus);
378
+ if (loops.length === 0) {
379
+ return { content: [{ type: "text", text: "No loops found." }] };
380
+ }
381
+ const lines = loops.map((l) => {
382
+ const evidenceStr = l.evidence.length > 0
383
+ ? `\n Evidence (${l.evidence.length}/${l.threshold}):\n` +
384
+ l.evidence.map((e) => ` - [${e.score.toFixed(2)}] ${e.snippet.slice(0, 80)}...`).join("\n")
385
+ : `\n No evidence yet (0/${l.threshold})`;
386
+ return `[${l.status.toUpperCase()}] ${l.id}\n Query: "${l.query}"\n Context: ${l.context}\n Created: ${l.createdAt}${evidenceStr}`;
387
+ });
388
+ return { content: [{ type: "text", text: lines.join("\n\n") }] };
389
+ });
390
+ mcp.tool("loop_resolve", "Manually resolve (close) an open loop. Use when the question has been answered or is no longer relevant.", {
391
+ loopId: z.string().describe("The loop ID to resolve"),
392
+ }, async ({ loopId }) => {
393
+ const loop = await crystallizer.resolve(loopId);
394
+ if (!loop) {
395
+ return { content: [{ type: "text", text: `Loop ${loopId} not found.` }], isError: true };
396
+ }
397
+ return {
398
+ content: [{ type: "text", text: `Loop resolved: ${loop.id} ("${loop.query}")\nFinal evidence count: ${loop.evidence.length}` }],
399
+ };
400
+ });
401
+ // ── Dash status + handoff check ──────────────────────────────────────────
402
+ mcp.tool("dash_status", "Check if Dash is running and review pending handoffs. Use anytime to verify Dash is alive and see what's queued for his planner.", {}, async () => {
403
+ // Check Dash health
404
+ let dashHealth;
405
+ try {
406
+ const res = await fetch("http://localhost:3577/healthz", { signal: AbortSignal.timeout(5000) });
407
+ if (res.ok) {
408
+ const h = await res.json();
409
+ dashHealth = `Dash is RUNNING. Uptime: ${h.uptime}s. Status: ${h.status}`;
410
+ }
411
+ else {
412
+ dashHealth = `Dash responded but unhealthy: HTTP ${res.status}`;
413
+ }
414
+ }
415
+ catch {
416
+ dashHealth = "Dash is DOWN — no response on localhost:3577";
417
+ }
418
+ // Read handoffs
419
+ let handoffSummary;
420
+ try {
421
+ const handoffPath = resolve(process.cwd(), "../dash/brain/operations/handoffs.jsonl");
422
+ const { readFile } = await import("node:fs/promises");
423
+ const raw = await readFile(handoffPath, "utf-8");
424
+ const lines = raw.split("\n").filter((l) => l.trim() && !l.includes("_schema"));
425
+ const pending = lines.filter((l) => {
426
+ try {
427
+ return JSON.parse(l).status === "pending";
428
+ }
429
+ catch {
430
+ return false;
431
+ }
432
+ });
433
+ const items = pending.map((l) => {
434
+ const o = JSON.parse(l);
435
+ return `[${o.priority || "?"}] ${o.title}`;
436
+ });
437
+ handoffSummary = pending.length === 0
438
+ ? "No pending handoffs."
439
+ : `${pending.length} pending handoffs:\n${items.join("\n")}`;
440
+ }
441
+ catch {
442
+ handoffSummary = "Could not read handoffs file.";
443
+ }
444
+ return {
445
+ content: [{ type: "text", text: `${dashHealth}\n\n${handoffSummary}` }],
446
+ };
447
+ });
448
+ // ── Resources ────────────────────────────────────────────────────────────
449
+ for (const memType of ["episodic", "semantic", "procedural"]) {
450
+ mcp.resource(`memory-${memType}`, `brain://memory/${memType}`, { description: `All ${memType} memories` }, async () => runWithAuditContext({ caller: `mcp:resource:memory/${memType}`, channel: "mcp" }, async () => {
451
+ const entries = await ltm.list(memType);
452
+ return {
453
+ contents: [
454
+ {
455
+ uri: `brain://memory/${memType}`,
456
+ text: formatEntries(entries),
457
+ mimeType: "text/plain",
458
+ },
459
+ ],
460
+ };
461
+ }));
462
+ }
463
+ mcp.resource("identity", "brain://identity", { description: "Tone of voice, brand, personality" }, async () => runWithAuditContext({ caller: "mcp:resource:identity", channel: "mcp" }, async () => {
464
+ const identityDir = join(BRAIN_DIR, "identity");
465
+ let text = "";
466
+ try {
467
+ const files = await readdir(identityDir);
468
+ for (const f of files) {
469
+ if (f.startsWith("."))
470
+ continue; // skip hidden files like .session-key
471
+ try {
472
+ const content = await readBrainFile(join(identityDir, f));
473
+ text += `--- ${f} ---\n${content}\n\n`;
474
+ }
475
+ catch { /* skip unreadable */ }
476
+ }
477
+ }
478
+ catch {
479
+ text = "Identity directory not found.";
480
+ }
481
+ return {
482
+ contents: [
483
+ { uri: "brain://identity", text: text || "No identity files found.", mimeType: "text/plain" },
484
+ ],
485
+ };
486
+ }));
487
+ mcp.resource("operations", "brain://operations", { description: "Goals, todos, operational state" }, async () => runWithAuditContext({ caller: "mcp:resource:operations", channel: "mcp" }, async () => {
488
+ const opsDir = join(BRAIN_DIR, "operations");
489
+ let text = "";
490
+ try {
491
+ const files = await readdir(opsDir);
492
+ for (const f of files) {
493
+ if (f.startsWith("."))
494
+ continue;
495
+ try {
496
+ const content = await readBrainFile(join(opsDir, f));
497
+ text += `--- ${f} ---\n${content}\n\n`;
498
+ }
499
+ catch { /* skip unreadable */ }
500
+ }
501
+ }
502
+ catch {
503
+ text = "Operations directory not found.";
504
+ }
505
+ return {
506
+ contents: [
507
+ { uri: "brain://operations", text: text || "No operations files found.", mimeType: "text/plain" },
508
+ ],
509
+ };
510
+ }));
511
+ // ── Connect ──────────────────────────────────────────────────────────────
512
+ const transport = new StdioServerTransport();
513
+ await mcp.connect(transport);
514
+ log("Connected via stdio — ready");
515
+ }
516
+ main().catch((err) => {
517
+ process.stderr.write(`[core-brain-mcp] Fatal: ${err}\n`);
518
+ process.exit(1);
519
+ });
520
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
package/dist/mdns.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * mDNS service announcement for Core board discovery.
3
+ * Announces the HTTP server as `_core-board._tcp.local` so that
4
+ * Dash and other instances can find it on the LAN automatically.
5
+ *
6
+ * Gated behind `settings.mesh.lanAnnounce` — disabled by default.
7
+ */
8
+ /**
9
+ * Start announcing the Core board service on the local network.
10
+ * Call after the HTTP server is listening and the actual port is known.
11
+ */
12
+ export declare function startMdns(port: number): void;
13
+ /**
14
+ * Stop the mDNS responder and send a goodbye packet.
15
+ */
16
+ export declare function stopMdns(): void;
17
+ //# sourceMappingURL=mdns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdns.d.ts","sourceRoot":"","sources":["../src/mdns.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA8D5C;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CA+B/B"}