agent-recall-mcp 3.2.3 → 3.3.2

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 (164) hide show
  1. package/README.md +276 -218
  2. package/dist/helpers/journal-files.d.ts +30 -0
  3. package/dist/helpers/journal-files.d.ts.map +1 -0
  4. package/dist/helpers/journal-files.js +96 -0
  5. package/dist/helpers/journal-files.js.map +1 -0
  6. package/dist/helpers/sections.d.ts +12 -0
  7. package/dist/helpers/sections.d.ts.map +1 -0
  8. package/dist/helpers/sections.js +84 -0
  9. package/dist/helpers/sections.js.map +1 -0
  10. package/dist/index.js +59 -1199
  11. package/dist/index.js.map +1 -1
  12. package/dist/palace/awareness.d.ts +67 -0
  13. package/dist/palace/awareness.d.ts.map +1 -0
  14. package/dist/palace/awareness.js +231 -0
  15. package/dist/palace/awareness.js.map +1 -0
  16. package/dist/palace/consolidate.d.ts +28 -0
  17. package/dist/palace/consolidate.d.ts.map +1 -0
  18. package/dist/palace/consolidate.js +129 -0
  19. package/dist/palace/consolidate.js.map +1 -0
  20. package/dist/palace/fan-out.d.ts +15 -0
  21. package/dist/palace/fan-out.d.ts.map +1 -0
  22. package/dist/palace/fan-out.js +78 -0
  23. package/dist/palace/fan-out.js.map +1 -0
  24. package/dist/palace/graph.d.ts +11 -0
  25. package/dist/palace/graph.d.ts.map +1 -0
  26. package/dist/palace/graph.js +59 -0
  27. package/dist/palace/graph.js.map +1 -0
  28. package/dist/palace/identity.d.ts +6 -0
  29. package/dist/palace/identity.d.ts.map +1 -0
  30. package/dist/palace/identity.js +18 -0
  31. package/dist/palace/identity.js.map +1 -0
  32. package/dist/palace/index-manager.d.ts +7 -0
  33. package/dist/palace/index-manager.d.ts.map +1 -0
  34. package/dist/palace/index-manager.js +46 -0
  35. package/dist/palace/index-manager.js.map +1 -0
  36. package/dist/palace/insights-index.d.ts +39 -0
  37. package/dist/palace/insights-index.d.ts.map +1 -0
  38. package/dist/palace/insights-index.js +101 -0
  39. package/dist/palace/insights-index.js.map +1 -0
  40. package/dist/palace/log.d.ts +9 -0
  41. package/dist/palace/log.d.ts.map +1 -0
  42. package/dist/palace/log.js +28 -0
  43. package/dist/palace/log.js.map +1 -0
  44. package/dist/palace/obsidian.d.ts +12 -0
  45. package/dist/palace/obsidian.d.ts.map +1 -0
  46. package/dist/palace/obsidian.js +76 -0
  47. package/dist/palace/obsidian.js.map +1 -0
  48. package/dist/palace/rooms.d.ts +14 -0
  49. package/dist/palace/rooms.d.ts.map +1 -0
  50. package/dist/palace/rooms.js +117 -0
  51. package/dist/palace/rooms.js.map +1 -0
  52. package/dist/palace/salience.d.ts +15 -0
  53. package/dist/palace/salience.d.ts.map +1 -0
  54. package/dist/palace/salience.js +33 -0
  55. package/dist/palace/salience.js.map +1 -0
  56. package/dist/resources/journal-resources.d.ts +3 -0
  57. package/dist/resources/journal-resources.d.ts.map +1 -0
  58. package/dist/resources/journal-resources.js +72 -0
  59. package/dist/resources/journal-resources.js.map +1 -0
  60. package/dist/server.d.ts +4 -0
  61. package/dist/server.d.ts.map +1 -0
  62. package/dist/server.js +7 -0
  63. package/dist/server.js.map +1 -0
  64. package/dist/storage/fs-utils.d.ts +8 -0
  65. package/dist/storage/fs-utils.d.ts.map +1 -0
  66. package/dist/storage/fs-utils.js +28 -0
  67. package/dist/storage/fs-utils.js.map +1 -0
  68. package/dist/storage/paths.d.ts +21 -0
  69. package/dist/storage/paths.d.ts.map +1 -0
  70. package/dist/storage/paths.js +59 -0
  71. package/dist/storage/paths.js.map +1 -0
  72. package/dist/storage/project.d.ts +17 -0
  73. package/dist/storage/project.d.ts.map +1 -0
  74. package/dist/storage/project.js +130 -0
  75. package/dist/storage/project.js.map +1 -0
  76. package/dist/tools/alignment-check.d.ts +3 -0
  77. package/dist/tools/alignment-check.d.ts.map +1 -0
  78. package/dist/tools/alignment-check.js +73 -0
  79. package/dist/tools/alignment-check.js.map +1 -0
  80. package/dist/tools/awareness-update.d.ts +9 -0
  81. package/dist/tools/awareness-update.d.ts.map +1 -0
  82. package/dist/tools/awareness-update.js +90 -0
  83. package/dist/tools/awareness-update.js.map +1 -0
  84. package/dist/tools/context-synthesize.d.ts +3 -0
  85. package/dist/tools/context-synthesize.d.ts.map +1 -0
  86. package/dist/tools/context-synthesize.js +204 -0
  87. package/dist/tools/context-synthesize.js.map +1 -0
  88. package/dist/tools/journal-archive.d.ts +3 -0
  89. package/dist/tools/journal-archive.d.ts.map +1 -0
  90. package/dist/tools/journal-archive.js +62 -0
  91. package/dist/tools/journal-archive.js.map +1 -0
  92. package/dist/tools/journal-capture.d.ts +3 -0
  93. package/dist/tools/journal-capture.d.ts.map +1 -0
  94. package/dist/tools/journal-capture.js +87 -0
  95. package/dist/tools/journal-capture.js.map +1 -0
  96. package/dist/tools/journal-cold-start.d.ts +3 -0
  97. package/dist/tools/journal-cold-start.d.ts.map +1 -0
  98. package/dist/tools/journal-cold-start.js +70 -0
  99. package/dist/tools/journal-cold-start.js.map +1 -0
  100. package/dist/tools/journal-list.d.ts +3 -0
  101. package/dist/tools/journal-list.d.ts.map +1 -0
  102. package/dist/tools/journal-list.js +43 -0
  103. package/dist/tools/journal-list.js.map +1 -0
  104. package/dist/tools/journal-projects.d.ts +3 -0
  105. package/dist/tools/journal-projects.d.ts.map +1 -0
  106. package/dist/tools/journal-projects.js +25 -0
  107. package/dist/tools/journal-projects.js.map +1 -0
  108. package/dist/tools/journal-read.d.ts +3 -0
  109. package/dist/tools/journal-read.d.ts.map +1 -0
  110. package/dist/tools/journal-read.js +72 -0
  111. package/dist/tools/journal-read.js.map +1 -0
  112. package/dist/tools/journal-search.d.ts +3 -0
  113. package/dist/tools/journal-search.d.ts.map +1 -0
  114. package/dist/tools/journal-search.js +113 -0
  115. package/dist/tools/journal-search.js.map +1 -0
  116. package/dist/tools/journal-state.d.ts +6 -0
  117. package/dist/tools/journal-state.d.ts.map +1 -0
  118. package/dist/tools/journal-state.js +111 -0
  119. package/dist/tools/journal-state.js.map +1 -0
  120. package/dist/tools/journal-write.d.ts +3 -0
  121. package/dist/tools/journal-write.d.ts.map +1 -0
  122. package/dist/tools/journal-write.js +88 -0
  123. package/dist/tools/journal-write.js.map +1 -0
  124. package/dist/tools/knowledge-read.d.ts +3 -0
  125. package/dist/tools/knowledge-read.d.ts.map +1 -0
  126. package/dist/tools/knowledge-read.js +118 -0
  127. package/dist/tools/knowledge-read.js.map +1 -0
  128. package/dist/tools/knowledge-write.d.ts +3 -0
  129. package/dist/tools/knowledge-write.d.ts.map +1 -0
  130. package/dist/tools/knowledge-write.js +89 -0
  131. package/dist/tools/knowledge-write.js.map +1 -0
  132. package/dist/tools/nudge.d.ts +3 -0
  133. package/dist/tools/nudge.d.ts.map +1 -0
  134. package/dist/tools/nudge.js +41 -0
  135. package/dist/tools/nudge.js.map +1 -0
  136. package/dist/tools/palace-lint.d.ts +7 -0
  137. package/dist/tools/palace-lint.d.ts.map +1 -0
  138. package/dist/tools/palace-lint.js +149 -0
  139. package/dist/tools/palace-lint.js.map +1 -0
  140. package/dist/tools/palace-read.d.ts +6 -0
  141. package/dist/tools/palace-read.d.ts.map +1 -0
  142. package/dist/tools/palace-read.js +78 -0
  143. package/dist/tools/palace-read.js.map +1 -0
  144. package/dist/tools/palace-search.d.ts +6 -0
  145. package/dist/tools/palace-search.d.ts.map +1 -0
  146. package/dist/tools/palace-search.js +81 -0
  147. package/dist/tools/palace-search.js.map +1 -0
  148. package/dist/tools/palace-walk.d.ts +12 -0
  149. package/dist/tools/palace-walk.d.ts.map +1 -0
  150. package/dist/tools/palace-walk.js +167 -0
  151. package/dist/tools/palace-walk.js.map +1 -0
  152. package/dist/tools/palace-write.d.ts +6 -0
  153. package/dist/tools/palace-write.d.ts.map +1 -0
  154. package/dist/tools/palace-write.js +108 -0
  155. package/dist/tools/palace-write.js.map +1 -0
  156. package/dist/tools/recall-insight.d.ts +9 -0
  157. package/dist/tools/recall-insight.d.ts.map +1 -0
  158. package/dist/tools/recall-insight.js +51 -0
  159. package/dist/tools/recall-insight.js.map +1 -0
  160. package/dist/types.d.ts +112 -0
  161. package/dist/types.d.ts.map +1 -0
  162. package/dist/types.js +31 -0
  163. package/dist/types.js.map +1 -0
  164. package/package.json +8 -4
@@ -0,0 +1,73 @@
1
+ import * as z from "zod/v4";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { resolveProject } from "../storage/project.js";
5
+ import { journalDir, palaceDir } from "../storage/paths.js";
6
+ import { ensureDir, todayISO } from "../storage/fs-utils.js";
7
+ import { ensurePalaceInitialized, roomExists } from "../palace/rooms.js";
8
+ import { updatePalaceIndex } from "../palace/index-manager.js";
9
+ export function register(server) {
10
+ server.registerTool("alignment_check", {
11
+ title: "Alignment Check",
12
+ description: "Record what the agent understood, its confidence, and any human correction. Measures the Intelligent Distance gap.",
13
+ inputSchema: {
14
+ goal: z.string().describe("Agent's understanding of the goal"),
15
+ confidence: z.enum(["high", "medium", "low"]).describe("Agent's confidence"),
16
+ assumptions: z.array(z.string()).optional().describe("What agent assumed"),
17
+ unclear: z.string().optional().describe("What agent is unsure about"),
18
+ human_correction: z.string().optional().describe("Human's correction or 'confirmed'"),
19
+ delta: z.string().optional().describe("The gap, or 'none'"),
20
+ category: z.enum(["goal", "scope", "priority", "technical", "aesthetic"]).default("goal"),
21
+ project: z.string().default("auto"),
22
+ },
23
+ }, async ({ goal, confidence, assumptions, unclear, human_correction, delta, category, project }) => {
24
+ const slug = await resolveProject(project);
25
+ const date = todayISO();
26
+ const dir = journalDir(slug);
27
+ ensureDir(dir);
28
+ const time = new Date().toISOString().slice(11, 19);
29
+ const assumeStr = assumptions?.length ? assumptions.map(a => ` - ${a}`).join("\n") : " (none)";
30
+ let entry = `### Alignment (${time})\n`;
31
+ entry += `**Goal**: ${goal}\n**Confidence**: ${confidence}\n**Category**: ${category}\n`;
32
+ entry += `**Assumptions**:\n${assumeStr}\n`;
33
+ if (unclear)
34
+ entry += `**Unclear**: ${unclear}\n`;
35
+ if (human_correction)
36
+ entry += `**Human**: ${human_correction}\n**Delta**: ${delta || "not specified"}\n`;
37
+ entry += "\n";
38
+ const logPath = path.join(dir, `${date}-alignment.md`);
39
+ if (!fs.existsSync(logPath)) {
40
+ fs.writeFileSync(logPath, `# ${date} — Alignment Records\n\n---\n\n${entry}`, "utf-8");
41
+ }
42
+ else {
43
+ fs.appendFileSync(logPath, entry, "utf-8");
44
+ }
45
+ // Palace integration: also write to alignment room
46
+ try {
47
+ ensurePalaceInitialized(slug);
48
+ if (roomExists(slug, "alignment")) {
49
+ const pd = palaceDir(slug);
50
+ const alignFile = path.join(pd, "rooms", "alignment", `${category}.md`);
51
+ ensureDir(path.dirname(alignFile));
52
+ const palaceEntry = `\n### ${date} ${time} — ${confidence}\n**Goal**: ${goal}\n`;
53
+ if (human_correction) {
54
+ const corrEntry = palaceEntry + `**Human correction**: ${human_correction}\n**Delta**: ${delta || "pending"}\n`;
55
+ if (fs.existsSync(alignFile)) {
56
+ fs.appendFileSync(alignFile, corrEntry, "utf-8");
57
+ }
58
+ else {
59
+ fs.writeFileSync(alignFile, `# alignment / ${category}\n${corrEntry}`, "utf-8");
60
+ }
61
+ }
62
+ updatePalaceIndex(slug);
63
+ }
64
+ }
65
+ catch {
66
+ // Palace integration is optional
67
+ }
68
+ return {
69
+ content: [{ type: "text", text: JSON.stringify({ success: true, date, confidence, delta: delta || "pending", file: logPath }) }],
70
+ };
71
+ });
72
+ }
73
+ //# sourceMappingURL=alignment-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alignment-check.js","sourceRoot":"","sources":["../../src/tools/alignment-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tool: awareness_update — Update the awareness system with new insights.
3
+ *
4
+ * Called at end of session. Merges new insights into the living awareness.md.
5
+ * The 200-line constraint forces compression and compounding.
6
+ */
7
+ import type { ServerType } from "../server.js";
8
+ export declare function register(server: ServerType): void;
9
+ //# sourceMappingURL=awareness-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"awareness-update.d.ts","sourceRoot":"","sources":["../../src/tools/awareness-update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAU/C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAwFjD"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Tool: awareness_update — Update the awareness system with new insights.
3
+ *
4
+ * Called at end of session. Merges new insights into the living awareness.md.
5
+ * The 200-line constraint forces compression and compounding.
6
+ */
7
+ import * as z from "zod/v4";
8
+ import { readAwarenessState, initAwareness, addInsight, detectCompoundInsights, renderAwareness, } from "../palace/awareness.js";
9
+ import { addIndexedInsight } from "../palace/insights-index.js";
10
+ export function register(server) {
11
+ server.registerTool("awareness_update", {
12
+ title: "Update Awareness",
13
+ description: "Add insights to the awareness system. Call at end of session. " +
14
+ "New insights are merged with existing ones (strengthening confirmed patterns) " +
15
+ "or added (demoting least-relevant if over 10). " +
16
+ "Also updates the cross-project insights index.",
17
+ inputSchema: {
18
+ insights: z.array(z.object({
19
+ title: z.string().describe("One-line insight title"),
20
+ evidence: z.string().describe("What happened that confirmed this insight"),
21
+ applies_when: z.array(z.string()).describe("Situations where this insight is relevant (keywords)"),
22
+ source: z.string().describe("Where this was learned (project name, date, context)"),
23
+ severity: z.enum(["critical", "important", "minor"]).default("important"),
24
+ })).describe("1-5 insights from this session"),
25
+ trajectory: z.string().optional().describe("Where is the work heading? One line."),
26
+ blind_spots: z.array(z.string()).optional().describe("What might matter but hasn't been explored?"),
27
+ identity: z.string().optional().describe("Update user identity (only on first use or major change)"),
28
+ },
29
+ }, async ({ insights, trajectory, blind_spots, identity }) => {
30
+ // Initialize if needed
31
+ let state = readAwarenessState();
32
+ if (!state) {
33
+ state = initAwareness(identity || "(unknown user)");
34
+ }
35
+ // Update identity if provided
36
+ if (identity) {
37
+ state.identity = identity;
38
+ }
39
+ // Process each insight
40
+ const results = [];
41
+ for (const insight of insights) {
42
+ const result = addInsight({
43
+ title: insight.title,
44
+ evidence: insight.evidence,
45
+ appliesWhen: insight.applies_when,
46
+ source: insight.source,
47
+ });
48
+ results.push({ title: insight.title, action: result.action });
49
+ // Also add to cross-project insights index
50
+ addIndexedInsight({
51
+ title: insight.title,
52
+ source: insight.source,
53
+ applies_when: insight.applies_when,
54
+ file: undefined,
55
+ severity: insight.severity,
56
+ });
57
+ }
58
+ // Update trajectory
59
+ if (trajectory) {
60
+ state = readAwarenessState();
61
+ state.trajectory = trajectory;
62
+ }
63
+ // Update blind spots
64
+ if (blind_spots && blind_spots.length > 0) {
65
+ state = readAwarenessState();
66
+ state.blindSpots = blind_spots.slice(0, 5);
67
+ }
68
+ // Save and render
69
+ if (state) {
70
+ state.lastUpdated = new Date().toISOString();
71
+ const { writeAwarenessState } = await import("../palace/awareness.js");
72
+ writeAwarenessState(state);
73
+ renderAwareness(state);
74
+ }
75
+ // Detect compound insights
76
+ const compounds = detectCompoundInsights();
77
+ return {
78
+ content: [{
79
+ type: "text",
80
+ text: JSON.stringify({
81
+ success: true,
82
+ insights_processed: results,
83
+ compound_insights_detected: compounds.length,
84
+ total_insights: readAwarenessState()?.topInsights.length ?? 0,
85
+ }),
86
+ }],
87
+ };
88
+ });
89
+ }
90
+ //# sourceMappingURL=awareness-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"awareness-update.js","sourceRoot":"","sources":["../../src/tools/awareness-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=context-synthesize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-synthesize.d.ts","sourceRoot":"","sources":["../../src/tools/context-synthesize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0MhD"}
@@ -0,0 +1,204 @@
1
+ import * as z from "zod/v4";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { resolveProject } from "../storage/project.js";
5
+ import { journalDir, palaceDir } from "../storage/paths.js";
6
+ import { ensureDir, todayISO } from "../storage/fs-utils.js";
7
+ import { listJournalFiles } from "../helpers/journal-files.js";
8
+ import { extractSection } from "../helpers/sections.js";
9
+ import { ensurePalaceInitialized, listRooms, roomExists, createRoom } from "../palace/rooms.js";
10
+ import { fanOut } from "../palace/fan-out.js";
11
+ import { generateFrontmatter } from "../palace/obsidian.js";
12
+ import { updatePalaceIndex } from "../palace/index-manager.js";
13
+ export function register(server) {
14
+ server.registerTool("context_synthesize", {
15
+ title: "Synthesize Context",
16
+ description: "Generate L3 semantic synthesis from recent journals and palace rooms. " +
17
+ "Use consolidate=true to write synthesis results into palace rooms as consolidated memories.",
18
+ inputSchema: {
19
+ entries: z.number().int().default(5).describe("Number of recent entries to analyze"),
20
+ focus: z.enum(["full", "decisions", "blockers", "goals"]).default("full"),
21
+ include_palace: z.boolean().default(true).describe("Include palace room summaries in synthesis"),
22
+ consolidate: z.boolean().default(false).describe("Write synthesis results into palace rooms"),
23
+ project: z.string().default("auto"),
24
+ },
25
+ }, async ({ entries: count, focus, include_palace, consolidate, project }) => {
26
+ const slug = await resolveProject(project);
27
+ const journalEntries = listJournalFiles(slug);
28
+ if (journalEntries.length === 0) {
29
+ return { content: [{ type: "text", text: JSON.stringify({ error: `No entries for '${slug}'` }) }], isError: true };
30
+ }
31
+ const toRead = journalEntries.slice(0, count);
32
+ const data = [];
33
+ for (const entry of toRead) {
34
+ const content = fs.readFileSync(path.join(entry.dir, entry.file), "utf-8");
35
+ data.push({
36
+ date: entry.date,
37
+ brief: extractSection(content, "brief"),
38
+ decisions: extractSection(content, "decisions"),
39
+ blockers: extractSection(content, "blockers"),
40
+ next: extractSection(content, "next"),
41
+ observations: extractSection(content, "observations"),
42
+ });
43
+ }
44
+ let syn = `# L3 Synthesis — ${slug}\n`;
45
+ syn += `> ${toRead.length} entries: ${toRead[toRead.length - 1]?.date} → ${toRead[0]?.date}\n\n`;
46
+ // Goal evolution
47
+ if (focus === "full" || focus === "goals") {
48
+ syn += `## Goal Evolution\n\n`;
49
+ for (const e of data) {
50
+ if (e.brief)
51
+ syn += `**${e.date}**: ${e.brief.split("\n")[0]}\n`;
52
+ }
53
+ syn += "\n";
54
+ }
55
+ // Decisions
56
+ if (focus === "full" || focus === "decisions") {
57
+ syn += `## Decisions\n\n`;
58
+ const allDecisions = [];
59
+ for (const e of data) {
60
+ if (e.decisions)
61
+ allDecisions.push(`**${e.date}**:\n${e.decisions}\n`);
62
+ }
63
+ syn += allDecisions.length > 0 ? allDecisions.join("\n") : "(none recorded)\n";
64
+ if (allDecisions.length >= 2) {
65
+ syn += "\n### Potential Contradictions\n\n";
66
+ syn += "Review the decisions above. Flag if:\n";
67
+ syn += "- A decision from an earlier date was reversed without explanation\n";
68
+ syn += "- The same topic has conflicting approaches across dates\n";
69
+ syn += "- A goal stated in one entry differs from another\n\n";
70
+ }
71
+ }
72
+ // Blockers
73
+ if (focus === "full" || focus === "blockers") {
74
+ syn += `## Active Blockers\n\n`;
75
+ const latest = data.find(e => e.blockers);
76
+ syn += latest ? `**${latest.date}**:\n${latest.blockers}\n\n` : "(none)\n\n";
77
+ const oldBlockers = data.filter(e => e.blockers && e !== latest);
78
+ if (oldBlockers.length > 0) {
79
+ syn += "### Recurring Blockers (appeared in older entries too)\n\n";
80
+ for (const ob of oldBlockers.slice(0, 2)) {
81
+ syn += `**${ob.date}**: ${ob.blockers?.split("\n")[0] || ""}\n`;
82
+ }
83
+ syn += "\n";
84
+ }
85
+ }
86
+ // Observations
87
+ if (focus === "full") {
88
+ const obs = data.filter(e => e.observations);
89
+ if (obs.length > 0) {
90
+ syn += `## Patterns from Agent Observations\n\n`;
91
+ for (const o of obs.slice(0, 3)) {
92
+ syn += `**${o.date}**: ${o.observations?.split("\n").slice(0, 2).join(" ") || ""}\n`;
93
+ }
94
+ syn += "\n";
95
+ }
96
+ }
97
+ // Today's alignment
98
+ const alignPath = path.join(journalDir(slug), `${todayISO()}-alignment.md`);
99
+ if (fs.existsSync(alignPath)) {
100
+ const alignContent = fs.readFileSync(alignPath, "utf-8");
101
+ const checks = (alignContent.match(/### .*Alignment/g) || []).length;
102
+ const nudges = (alignContent.match(/### .*Nudge/g) || []).length;
103
+ const low = (alignContent.match(/Confidence: low/g) || []).length;
104
+ if (checks > 0 || nudges > 0) {
105
+ syn += `## Today's Alignment\n\n`;
106
+ syn += `- Alignment checks: ${checks}\n- Nudges: ${nudges}\n- Low confidence: ${low}\n\n`;
107
+ }
108
+ }
109
+ // Palace room summaries
110
+ let palaceRoomCount = 0;
111
+ if (include_palace) {
112
+ try {
113
+ ensurePalaceInitialized(slug);
114
+ const rooms = listRooms(slug);
115
+ if (rooms.length > 0) {
116
+ syn += `## Memory Palace — Room Summaries\n\n`;
117
+ for (const room of rooms.slice(0, 5)) {
118
+ syn += `- **${room.name}** (salience: ${room.salience.toFixed(2)}) — ${room.description}\n`;
119
+ if (room.connections.length > 0) {
120
+ syn += ` Connected to: ${room.connections.join(", ")}\n`;
121
+ }
122
+ }
123
+ syn += "\n";
124
+ palaceRoomCount = rooms.length;
125
+ }
126
+ }
127
+ catch {
128
+ // Palace not initialized, skip
129
+ }
130
+ }
131
+ // Consolidation: write synthesis into palace rooms
132
+ let consolidated = 0;
133
+ if (consolidate) {
134
+ try {
135
+ ensurePalaceInitialized(slug);
136
+ const pd = palaceDir(slug);
137
+ const date = todayISO();
138
+ // Consolidate decisions → architecture room
139
+ const decisionsData = data.filter(e => e.decisions).map(e => `**${e.date}**: ${e.decisions}`).join("\n");
140
+ if (decisionsData) {
141
+ if (!roomExists(slug, "architecture")) {
142
+ createRoom(slug, "architecture", "Architecture", "Technical decisions and patterns", ["technical"]);
143
+ }
144
+ const decPath = path.join(pd, "rooms", "architecture", "decisions.md");
145
+ ensureDir(path.dirname(decPath));
146
+ const entry = `\n### Consolidated ${date}\n\n${decisionsData}\n`;
147
+ if (fs.existsSync(decPath)) {
148
+ fs.appendFileSync(decPath, entry, "utf-8");
149
+ }
150
+ else {
151
+ const fm = generateFrontmatter({ room: "architecture", topic: "decisions", created: new Date().toISOString(), source: "consolidation" });
152
+ fs.writeFileSync(decPath, `${fm}# architecture / decisions\n${entry}`, "utf-8");
153
+ }
154
+ fanOut(slug, "architecture", "decisions", decisionsData, ["goals"], "high");
155
+ consolidated++;
156
+ }
157
+ // Consolidate goals → goals room
158
+ const goalsData = data.filter(e => e.brief).map(e => `**${e.date}**: ${e.brief?.split("\n")[0]}`).join("\n");
159
+ if (goalsData) {
160
+ const evoPath = path.join(pd, "rooms", "goals", "evolution.md");
161
+ ensureDir(path.dirname(evoPath));
162
+ const entry = `\n### Consolidated ${date}\n\n${goalsData}\n`;
163
+ if (fs.existsSync(evoPath)) {
164
+ fs.appendFileSync(evoPath, entry, "utf-8");
165
+ }
166
+ else {
167
+ const fm = generateFrontmatter({ room: "goals", topic: "evolution", created: new Date().toISOString(), source: "consolidation" });
168
+ fs.writeFileSync(evoPath, `${fm}# goals / evolution\n${entry}`, "utf-8");
169
+ }
170
+ consolidated++;
171
+ }
172
+ // Consolidate blockers → blockers room
173
+ const blockersData = data.filter(e => e.blockers).map(e => `**${e.date}**: ${e.blockers?.split("\n")[0]}`).join("\n");
174
+ if (blockersData) {
175
+ const blkPath = path.join(pd, "rooms", "blockers", "history.md");
176
+ ensureDir(path.dirname(blkPath));
177
+ const entry = `\n### Consolidated ${date}\n\n${blockersData}\n`;
178
+ if (fs.existsSync(blkPath)) {
179
+ fs.appendFileSync(blkPath, entry, "utf-8");
180
+ }
181
+ else {
182
+ const fm = generateFrontmatter({ room: "blockers", topic: "history", created: new Date().toISOString(), source: "consolidation" });
183
+ fs.writeFileSync(blkPath, `${fm}# blockers / history\n${entry}`, "utf-8");
184
+ }
185
+ consolidated++;
186
+ }
187
+ updatePalaceIndex(slug);
188
+ }
189
+ catch {
190
+ // Consolidation is optional
191
+ }
192
+ }
193
+ return {
194
+ content: [{ type: "text", text: JSON.stringify({
195
+ project: slug,
196
+ entries_analyzed: toRead.length,
197
+ palace_rooms: palaceRoomCount,
198
+ consolidated,
199
+ synthesis: syn,
200
+ }) }],
201
+ };
202
+ });
203
+ }
204
+ //# sourceMappingURL=context-synthesize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-synthesize.js","sourceRoot":"","sources":["../../src/tools/context-synthesize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=journal-archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-archive.d.ts","sourceRoot":"","sources":["../../src/tools/journal-archive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6DhD"}
@@ -0,0 +1,62 @@
1
+ import * as z from "zod/v4";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { resolveProject } from "../storage/project.js";
5
+ import { journalDir } from "../storage/paths.js";
6
+ import { ensureDir } from "../storage/fs-utils.js";
7
+ import { listJournalFiles, updateIndex } from "../helpers/journal-files.js";
8
+ import { extractSection } from "../helpers/sections.js";
9
+ import { stateFilePath } from "./journal-state.js";
10
+ export function register(server) {
11
+ server.registerTool("journal_archive", {
12
+ title: "Archive Old Entries",
13
+ description: "Move entries older than N days to cold archive. Keeps a one-line summary per archived entry. " +
14
+ "Use after a project milestone or when journal count gets too high.",
15
+ inputSchema: {
16
+ older_than_days: z.number().int().default(7).describe("Archive entries older than this many days"),
17
+ project: z.string().default("auto"),
18
+ },
19
+ }, async ({ older_than_days, project }) => {
20
+ const slug = await resolveProject(project);
21
+ const entries = listJournalFiles(slug);
22
+ const dir = journalDir(slug);
23
+ const archiveDir = path.join(dir, "archive");
24
+ ensureDir(archiveDir);
25
+ let archived = 0;
26
+ const summaries = [];
27
+ for (const entry of entries) {
28
+ const ageMs = Date.now() - new Date(entry.date).getTime();
29
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
30
+ if (ageDays > older_than_days) {
31
+ const srcPath = path.join(entry.dir, entry.file);
32
+ const content = fs.readFileSync(srcPath, "utf-8");
33
+ const brief = extractSection(content, "brief");
34
+ const firstLine = brief?.split("\n").find(l => l.trim().length > 0) ?? "(no brief)";
35
+ const destPath = path.join(archiveDir, entry.file);
36
+ fs.copyFileSync(srcPath, destPath);
37
+ fs.unlinkSync(srcPath);
38
+ const stateSrc = stateFilePath(slug, entry.date);
39
+ if (fs.existsSync(stateSrc)) {
40
+ const stateDest = path.join(archiveDir, `${entry.date}.state.json`);
41
+ fs.copyFileSync(stateSrc, stateDest);
42
+ fs.unlinkSync(stateSrc);
43
+ }
44
+ summaries.push(`${entry.date}: ${firstLine}`);
45
+ archived++;
46
+ }
47
+ }
48
+ if (summaries.length > 0) {
49
+ const indexPath = path.join(archiveDir, "index.md");
50
+ const existing = fs.existsSync(indexPath) ? fs.readFileSync(indexPath, "utf-8") : "# Archive\n\n";
51
+ fs.writeFileSync(indexPath, existing + summaries.join("\n") + "\n", "utf-8");
52
+ }
53
+ updateIndex(slug);
54
+ return {
55
+ content: [{
56
+ type: "text",
57
+ text: JSON.stringify({ archived, summaries, archive_dir: archiveDir }),
58
+ }],
59
+ };
60
+ });
61
+ }
62
+ //# sourceMappingURL=journal-archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-archive.js","sourceRoot":"","sources":["../../src/tools/journal-archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=journal-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-capture.d.ts","sourceRoot":"","sources":["../../src/tools/journal-capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0FhD"}
@@ -0,0 +1,87 @@
1
+ import * as z from "zod/v4";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { resolveProject } from "../storage/project.js";
5
+ import { journalDir } from "../storage/paths.js";
6
+ import { ensureDir, todayISO } from "../storage/fs-utils.js";
7
+ import { countLogEntries } from "../helpers/journal-files.js";
8
+ export function register(server) {
9
+ server.registerTool("journal_capture", {
10
+ title: "Capture Q&A",
11
+ description: "Layer 1: lightweight Q&A capture. Appends to today's log file without loading the full journal.",
12
+ inputSchema: {
13
+ question: z
14
+ .string()
15
+ .describe("The human's question or request (summarized, 1 sentence)"),
16
+ answer: z
17
+ .string()
18
+ .describe("The agent's key answer or decision (summarized, 1-2 sentences)"),
19
+ tags: z
20
+ .array(z.string())
21
+ .optional()
22
+ .describe("Optional tags for this entry (e.g. ['decision', 'bug-fix', 'architecture'])"),
23
+ palace_room: z.string().optional()
24
+ .describe("Optional: also capture this Q&A into a palace room"),
25
+ project: z
26
+ .string()
27
+ .default("auto")
28
+ .describe("Project slug. Defaults to auto-detect."),
29
+ },
30
+ }, async ({ question, answer, tags, palace_room, project }) => {
31
+ const slug = await resolveProject(project);
32
+ const date = todayISO();
33
+ const dir = journalDir(slug);
34
+ ensureDir(dir);
35
+ const logPath = path.join(dir, `${date}-log.md`);
36
+ const entryNum = countLogEntries(logPath) + 1;
37
+ const tagStr = tags && tags.length > 0 ? ` [${tags.join(", ")}]` : "";
38
+ const timestamp = new Date().toISOString().slice(11, 19);
39
+ let entry = `### Q${entryNum} (${timestamp})${tagStr}\n\n`;
40
+ entry += `**Q:** ${question}\n\n`;
41
+ entry += `**A:** ${answer}\n\n`;
42
+ if (!fs.existsSync(logPath)) {
43
+ const header = `# ${date} — ${slug} — Session Log\n\n`;
44
+ fs.writeFileSync(logPath, header + entry, "utf-8");
45
+ }
46
+ else {
47
+ fs.appendFileSync(logPath, entry, "utf-8");
48
+ }
49
+ // Palace integration
50
+ let palaceResult = null;
51
+ if (palace_room) {
52
+ try {
53
+ const { ensurePalaceInitialized, roomExists, createRoom } = await import("../palace/rooms.js");
54
+ const { palaceDir } = await import("../storage/paths.js");
55
+ const { fanOut } = await import("../palace/fan-out.js");
56
+ const { updatePalaceIndex } = await import("../palace/index-manager.js");
57
+ ensurePalaceInitialized(slug);
58
+ if (!roomExists(slug, palace_room)) {
59
+ createRoom(slug, palace_room, palace_room.charAt(0).toUpperCase() + palace_room.slice(1), "Auto-created from capture", []);
60
+ }
61
+ const pd = palaceDir(slug);
62
+ const targetPath = path.join(pd, "rooms", palace_room, "captures.md");
63
+ ensureDir(path.dirname(targetPath));
64
+ const captureEntry = `\n### Q${entryNum} (${date})\n**Q:** ${question}\n**A:** ${answer}\n`;
65
+ if (fs.existsSync(targetPath)) {
66
+ fs.appendFileSync(targetPath, captureEntry, "utf-8");
67
+ }
68
+ else {
69
+ fs.writeFileSync(targetPath, `# ${palace_room} / captures\n${captureEntry}`, "utf-8");
70
+ }
71
+ fanOut(slug, palace_room, "captures", `${question} ${answer}`, [], "medium");
72
+ updatePalaceIndex(slug);
73
+ palaceResult = { room: palace_room };
74
+ }
75
+ catch {
76
+ // Palace integration is optional, don't fail the capture
77
+ }
78
+ }
79
+ return {
80
+ content: [{
81
+ type: "text",
82
+ text: JSON.stringify({ success: true, entry_number: entryNum, palace: palaceResult }),
83
+ }],
84
+ };
85
+ });
86
+ }
87
+ //# sourceMappingURL=journal-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-capture.js","sourceRoot":"","sources":["../../src/tools/journal-capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=journal-cold-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-cold-start.d.ts","sourceRoot":"","sources":["../../src/tools/journal-cold-start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+DhD"}