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,117 @@
1
+ /**
2
+ * Palace room management — create, list, read, update rooms.
3
+ */
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ import { DEFAULT_PALACE_ROOMS, VERSION } from "../types.js";
7
+ import { ensureDir } from "../storage/fs-utils.js";
8
+ import { palaceDir } from "../storage/paths.js";
9
+ import { readJsonSafe, writeJsonAtomic } from "../storage/fs-utils.js";
10
+ import { roomReadmeContent } from "./obsidian.js";
11
+ function roomMetaPath(projectPalaceDir, roomSlug) {
12
+ return path.join(projectPalaceDir, "rooms", roomSlug, "_room.json");
13
+ }
14
+ export function createRoom(project, slug, name, description, tags = [], connections = []) {
15
+ const pd = palaceDir(project);
16
+ const roomPath = path.join(pd, "rooms", slug);
17
+ ensureDir(roomPath);
18
+ const now = new Date().toISOString();
19
+ const meta = {
20
+ slug,
21
+ name,
22
+ description,
23
+ created: now,
24
+ updated: now,
25
+ salience: 0.5,
26
+ access_count: 0,
27
+ last_accessed: now,
28
+ tags,
29
+ connections,
30
+ };
31
+ writeJsonAtomic(path.join(roomPath, "_room.json"), meta);
32
+ // Create README.md with Obsidian-compatible frontmatter
33
+ const readmePath = path.join(roomPath, "README.md");
34
+ if (!fs.existsSync(readmePath)) {
35
+ fs.writeFileSync(readmePath, roomReadmeContent(meta), "utf-8");
36
+ }
37
+ return meta;
38
+ }
39
+ export function getRoomMeta(project, roomSlug) {
40
+ const pd = palaceDir(project);
41
+ return readJsonSafe(roomMetaPath(pd, roomSlug));
42
+ }
43
+ export function updateRoomMeta(project, roomSlug, updates) {
44
+ const pd = palaceDir(project);
45
+ const metaPath = roomMetaPath(pd, roomSlug);
46
+ const existing = readJsonSafe(metaPath);
47
+ if (!existing)
48
+ return null;
49
+ const updated = { ...existing, ...updates, updated: new Date().toISOString() };
50
+ writeJsonAtomic(metaPath, updated);
51
+ return updated;
52
+ }
53
+ export function listRooms(project) {
54
+ const pd = palaceDir(project);
55
+ const roomsDir = path.join(pd, "rooms");
56
+ if (!fs.existsSync(roomsDir))
57
+ return [];
58
+ const rooms = [];
59
+ const entries = fs.readdirSync(roomsDir);
60
+ for (const entry of entries) {
61
+ const metaPath = path.join(roomsDir, entry, "_room.json");
62
+ const meta = readJsonSafe(metaPath);
63
+ if (meta)
64
+ rooms.push(meta);
65
+ }
66
+ // Sort by salience descending
67
+ rooms.sort((a, b) => b.salience - a.salience);
68
+ return rooms;
69
+ }
70
+ export function roomExists(project, roomSlug) {
71
+ const pd = palaceDir(project);
72
+ return fs.existsSync(roomMetaPath(pd, roomSlug));
73
+ }
74
+ /** Initialize default palace rooms if palace doesn't exist yet. */
75
+ export function ensurePalaceInitialized(project) {
76
+ const pd = palaceDir(project);
77
+ const indexPath = path.join(pd, "palace-index.json");
78
+ if (fs.existsSync(indexPath))
79
+ return; // already initialized
80
+ ensureDir(pd);
81
+ ensureDir(path.join(pd, "rooms"));
82
+ // Create default rooms
83
+ for (const room of DEFAULT_PALACE_ROOMS) {
84
+ createRoom(project, room.slug, room.name, room.description, [...room.tags]);
85
+ }
86
+ // Create identity.md
87
+ const identityPath = path.join(pd, "identity.md");
88
+ if (!fs.existsSync(identityPath)) {
89
+ fs.writeFileSync(identityPath, `---\nproject: ${project}\ncreated: ${new Date().toISOString()}\n---\n\n# ${project}\n\n> _(fill in: 1-line purpose, primary language, key constraint)_\n`, "utf-8");
90
+ }
91
+ // Create palace-index.json
92
+ const rooms = {};
93
+ for (const room of DEFAULT_PALACE_ROOMS) {
94
+ rooms[room.slug] = { salience: 0.5, memory_count: 0, last_updated: new Date().toISOString() };
95
+ }
96
+ writeJsonAtomic(indexPath, {
97
+ version: VERSION,
98
+ project,
99
+ created: new Date().toISOString(),
100
+ rooms,
101
+ identity_hash: "",
102
+ last_lint: "",
103
+ });
104
+ // Create graph.json
105
+ writeJsonAtomic(path.join(pd, "graph.json"), { edges: [] });
106
+ }
107
+ /** Record an access (bump access_count and last_accessed). */
108
+ export function recordAccess(project, roomSlug) {
109
+ const meta = getRoomMeta(project, roomSlug);
110
+ if (!meta)
111
+ return;
112
+ updateRoomMeta(project, roomSlug, {
113
+ access_count: meta.access_count + 1,
114
+ last_accessed: new Date().toISOString(),
115
+ });
116
+ }
117
+ //# sourceMappingURL=rooms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rooms.js","sourceRoot":"","sources":["../../src/palace/rooms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Salience scoring for palace memories and rooms.
3
+ *
4
+ * Formula: salience = (importance × 0.4) + (recency × 0.3) + (access_freq × 0.2) + (connections × 0.1)
5
+ */
6
+ import type { Importance } from "../types.js";
7
+ export declare function computeSalience(params: {
8
+ importance: Importance;
9
+ lastUpdated: string;
10
+ accessCount: number;
11
+ connectionCount: number;
12
+ }): number;
13
+ export declare const ARCHIVE_THRESHOLD = 0.15;
14
+ export declare const AUTO_ARCHIVE_THRESHOLD = 0.05;
15
+ //# sourceMappingURL=salience.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"salience.d.ts","sourceRoot":"","sources":["../../src/palace/salience.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAyB9C,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,CAMT;AAED,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,sBAAsB,OAAO,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Salience scoring for palace memories and rooms.
3
+ *
4
+ * Formula: salience = (importance × 0.4) + (recency × 0.3) + (access_freq × 0.2) + (connections × 0.1)
5
+ */
6
+ const IMPORTANCE_WEIGHTS = {
7
+ high: 1.0,
8
+ medium: 0.6,
9
+ low: 0.3,
10
+ };
11
+ /** Exponential decay: 0.95^days, floor at 0.05. */
12
+ function recencyScore(lastUpdated) {
13
+ const days = (Date.now() - new Date(lastUpdated).getTime()) / (1000 * 60 * 60 * 24);
14
+ return Math.max(0.05, Math.pow(0.95, days));
15
+ }
16
+ /** Normalized access frequency: min(1.0, count / 20). */
17
+ function accessScore(accessCount) {
18
+ return Math.min(1.0, accessCount / 20);
19
+ }
20
+ /** Connection score: min(1.0, edgeCount / 10). */
21
+ function connectionScore(edgeCount) {
22
+ return Math.min(1.0, edgeCount / 10);
23
+ }
24
+ export function computeSalience(params) {
25
+ const imp = IMPORTANCE_WEIGHTS[params.importance] * 0.4;
26
+ const rec = recencyScore(params.lastUpdated) * 0.3;
27
+ const acc = accessScore(params.accessCount) * 0.2;
28
+ const con = connectionScore(params.connectionCount) * 0.1;
29
+ return Math.round((imp + rec + acc + con) * 1000) / 1000;
30
+ }
31
+ export const ARCHIVE_THRESHOLD = 0.15;
32
+ export const AUTO_ARCHIVE_THRESHOLD = 0.05;
33
+ //# sourceMappingURL=salience.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"salience.js","sourceRoot":"","sources":["../../src/palace/salience.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,kBAAkB,GAA+B;IACrD,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,GAAG,EAAE,GAAG;CACT,CAAC;AAEF,mDAAmD;AACnD,SAAS,YAAY,CAAC,WAAmB;IACvC,MAAM,IAAI,GACR,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,yDAAyD;AACzD,SAAS,WAAW,CAAC,WAAmB;IACtC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,kDAAkD;AAClD,SAAS,eAAe,CAAC,SAAiB;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAK/B;IACC,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC;IACxD,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;IACnD,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;IAClD,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC;IAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC"}
@@ -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-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-resources.d.ts","sourceRoot":"","sources":["../../src/resources/journal-resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyEhD"}
@@ -0,0 +1,72 @@
1
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { journalDir } from "../storage/paths.js";
5
+ import { todayISO } from "../storage/fs-utils.js";
6
+ import { listAllProjects } from "../storage/project.js";
7
+ import { listJournalFiles, readJournalFile } from "../helpers/journal-files.js";
8
+ export function register(server) {
9
+ // Resource: project index
10
+ server.registerResource("Journal Index", new ResourceTemplate("agent-recall://{project}/index", {
11
+ list: async () => {
12
+ const projects = listAllProjects();
13
+ return {
14
+ resources: projects.map((p) => ({
15
+ uri: `agent-recall://${p.slug}/index`,
16
+ name: `${p.slug} — Journal Index`,
17
+ mimeType: "text/markdown",
18
+ })),
19
+ };
20
+ },
21
+ }), { description: "Journal index for a project", mimeType: "text/markdown" }, async (uri, { project }) => {
22
+ const slug = Array.isArray(project) ? project[0] : (project || "unknown");
23
+ const indexPath = path.join(journalDir(slug), "index.md");
24
+ let content = "";
25
+ if (fs.existsSync(indexPath)) {
26
+ content = fs.readFileSync(indexPath, "utf-8");
27
+ }
28
+ else {
29
+ content = `# ${slug} — No journal index found\n`;
30
+ }
31
+ return {
32
+ contents: [{
33
+ uri: uri.href,
34
+ text: content,
35
+ mimeType: "text/markdown",
36
+ }],
37
+ };
38
+ });
39
+ // Resource: specific date entry
40
+ server.registerResource("Journal Entry", new ResourceTemplate("agent-recall://{project}/{date}", {
41
+ list: async () => {
42
+ const projects = listAllProjects();
43
+ const resources = [];
44
+ for (const p of projects) {
45
+ const entries = listJournalFiles(p.slug).slice(0, 5);
46
+ for (const e of entries) {
47
+ resources.push({
48
+ uri: `agent-recall://${p.slug}/${e.date}`,
49
+ name: `${p.slug} — ${e.date}`,
50
+ mimeType: "text/markdown",
51
+ });
52
+ }
53
+ }
54
+ return { resources };
55
+ },
56
+ }), {
57
+ description: "A specific journal entry by date",
58
+ mimeType: "text/markdown",
59
+ }, async (uri, { project, date }) => {
60
+ const slug = Array.isArray(project) ? project[0] : (project || "unknown");
61
+ const entryDate = Array.isArray(date) ? date[0] : (date || todayISO());
62
+ const content = readJournalFile(slug, entryDate);
63
+ return {
64
+ contents: [{
65
+ uri: uri.href,
66
+ text: content || `# No entry for ${entryDate}\n`,
67
+ mimeType: "text/markdown",
68
+ }],
69
+ };
70
+ });
71
+ }
72
+ //# sourceMappingURL=journal-resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-resources.js","sourceRoot":"","sources":["../../src/resources/journal-resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare const server: McpServer;
3
+ export type ServerType = typeof server;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,eAAO,MAAM,MAAM,WAGjB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC"}
package/dist/server.js ADDED
@@ -0,0 +1,7 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { VERSION } from "./types.js";
3
+ export const server = new McpServer({
4
+ name: "agent-recall",
5
+ version: VERSION,
6
+ });
7
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAClC,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Filesystem utility functions.
3
+ */
4
+ export declare function ensureDir(dir: string): void;
5
+ export declare function todayISO(): string;
6
+ export declare function readJsonSafe<T>(filePath: string): T | null;
7
+ export declare function writeJsonAtomic(filePath: string, data: unknown): void;
8
+ //# sourceMappingURL=fs-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/storage/fs-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAO1D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAGrE"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Filesystem utility functions.
3
+ */
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ export function ensureDir(dir) {
7
+ if (!fs.existsSync(dir)) {
8
+ fs.mkdirSync(dir, { recursive: true });
9
+ }
10
+ }
11
+ export function todayISO() {
12
+ return new Date().toISOString().slice(0, 10);
13
+ }
14
+ export function readJsonSafe(filePath) {
15
+ if (!fs.existsSync(filePath))
16
+ return null;
17
+ try {
18
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ export function writeJsonAtomic(filePath, data) {
25
+ ensureDir(path.dirname(filePath));
26
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
27
+ }
28
+ //# sourceMappingURL=fs-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../src/storage/fs-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,QAAgB;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAM,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,IAAa;IAC7D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Journal and palace directory path resolution.
3
+ */
4
+ /**
5
+ * Resolve the journal directory for a project.
6
+ * For writes, always use the new location.
7
+ */
8
+ export declare function journalDir(project: string): string;
9
+ /**
10
+ * Find all journal directories for a project (new + legacy fallback).
11
+ */
12
+ export declare function journalDirs(project: string): string[];
13
+ /**
14
+ * Resolve the palace directory for a project.
15
+ */
16
+ export declare function palaceDir(project: string): string;
17
+ /**
18
+ * Resolve a room directory within a project's palace.
19
+ */
20
+ export declare function roomDir(project: string, roomSlug: string): string;
21
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BrD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Journal and palace directory path resolution.
3
+ */
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ import { JOURNAL_ROOT, LEGACY_ROOT } from "../types.js";
7
+ /**
8
+ * Resolve the journal directory for a project.
9
+ * For writes, always use the new location.
10
+ */
11
+ export function journalDir(project) {
12
+ const safe = project.replace(/[^a-zA-Z0-9_\-\.]/g, "-");
13
+ const resolved = path.join(JOURNAL_ROOT, "projects", safe, "journal");
14
+ if (!resolved.startsWith(JOURNAL_ROOT)) {
15
+ throw new Error(`Invalid project name: ${project}`);
16
+ }
17
+ return resolved;
18
+ }
19
+ /**
20
+ * Find all journal directories for a project (new + legacy fallback).
21
+ */
22
+ export function journalDirs(project) {
23
+ const dirs = [];
24
+ const primary = journalDir(project);
25
+ if (fs.existsSync(primary))
26
+ dirs.push(primary);
27
+ // Legacy: ~/.claude/projects/*/memory/journal/
28
+ if (fs.existsSync(LEGACY_ROOT)) {
29
+ try {
30
+ const entries = fs.readdirSync(LEGACY_ROOT);
31
+ for (const entry of entries) {
32
+ if (entry.includes(project)) {
33
+ const legacyJournal = path.join(LEGACY_ROOT, entry, "memory", "journal");
34
+ if (fs.existsSync(legacyJournal)) {
35
+ dirs.push(legacyJournal);
36
+ }
37
+ }
38
+ }
39
+ }
40
+ catch {
41
+ // ignore
42
+ }
43
+ }
44
+ return dirs;
45
+ }
46
+ /**
47
+ * Resolve the palace directory for a project.
48
+ */
49
+ export function palaceDir(project) {
50
+ const safe = project.replace(/[^a-zA-Z0-9_\-\.]/g, "-");
51
+ return path.join(JOURNAL_ROOT, "projects", safe, "palace");
52
+ }
53
+ /**
54
+ * Resolve a room directory within a project's palace.
55
+ */
56
+ export function roomDir(project, roomSlug) {
57
+ return path.join(palaceDir(project), "rooms", roomSlug);
58
+ }
59
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE/C,+CAA+C;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,WAAW,EACX,KAAK,EACL,QAAQ,EACR,SAAS,CACV,CAAC;oBACF,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;wBACjC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,QAAgB;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Project detection and listing.
3
+ */
4
+ import type { ProjectInfo } from "../types.js";
5
+ /**
6
+ * Auto-detect project slug from environment, git, or cwd.
7
+ */
8
+ export declare function detectProject(): Promise<string>;
9
+ /**
10
+ * Resolve "auto" project to actual slug.
11
+ */
12
+ export declare function resolveProject(project: string | undefined): Promise<string>;
13
+ /**
14
+ * List all projects (from both new and legacy locations).
15
+ */
16
+ export declare function listAllProjects(): ProjectInfo[];
17
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/storage/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CA0CrD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAKjF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CA0D/C"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Project detection and listing.
3
+ */
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ import { execFile } from "node:child_process";
7
+ import { promisify } from "node:util";
8
+ import { JOURNAL_ROOT, LEGACY_ROOT } from "../types.js";
9
+ const execFileAsync = promisify(execFile);
10
+ let _cachedProject = null;
11
+ /**
12
+ * Auto-detect project slug from environment, git, or cwd.
13
+ */
14
+ export async function detectProject() {
15
+ if (_cachedProject)
16
+ return _cachedProject;
17
+ // 1. Env var
18
+ if (process.env.AGENT_RECALL_PROJECT) {
19
+ _cachedProject = process.env.AGENT_RECALL_PROJECT;
20
+ return _cachedProject;
21
+ }
22
+ // 2. Git repo name (async)
23
+ try {
24
+ const { stdout } = await execFileAsync("git", ["config", "--get", "remote.origin.url"], { timeout: 3000 });
25
+ const remote = stdout.trim();
26
+ if (remote) {
27
+ const name = path.basename(remote, ".git");
28
+ if (name) {
29
+ _cachedProject = name;
30
+ return name;
31
+ }
32
+ }
33
+ }
34
+ catch {
35
+ try {
36
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--show-toplevel"], { timeout: 3000 });
37
+ const root = stdout.trim();
38
+ if (root) {
39
+ _cachedProject = path.basename(root);
40
+ return _cachedProject;
41
+ }
42
+ }
43
+ catch {
44
+ // fall through
45
+ }
46
+ }
47
+ // 3. package.json name
48
+ const cwd = process.cwd();
49
+ const pkgPath = path.join(cwd, "package.json");
50
+ if (fs.existsSync(pkgPath)) {
51
+ try {
52
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
53
+ if (pkg.name) {
54
+ _cachedProject = pkg.name.replace(/^@[^/]+\//, "");
55
+ return _cachedProject;
56
+ }
57
+ }
58
+ catch {
59
+ // fall through
60
+ }
61
+ }
62
+ // 4. Basename of cwd
63
+ _cachedProject = path.basename(cwd);
64
+ return _cachedProject;
65
+ }
66
+ /**
67
+ * Resolve "auto" project to actual slug.
68
+ */
69
+ export async function resolveProject(project) {
70
+ if (!project || project === "auto") {
71
+ return await detectProject();
72
+ }
73
+ return project;
74
+ }
75
+ /**
76
+ * List all projects (from both new and legacy locations).
77
+ */
78
+ export function listAllProjects() {
79
+ const projects = new Map();
80
+ // New location
81
+ const projectsDir = path.join(JOURNAL_ROOT, "projects");
82
+ if (fs.existsSync(projectsDir)) {
83
+ const dirs = fs.readdirSync(projectsDir);
84
+ for (const slug of dirs) {
85
+ const jDir = path.join(projectsDir, slug, "journal");
86
+ if (fs.existsSync(jDir)) {
87
+ const files = fs.readdirSync(jDir).filter((f) => /^\d{4}-\d{2}-\d{2}\.md$/.test(f));
88
+ if (files.length > 0) {
89
+ files.sort().reverse();
90
+ projects.set(slug, {
91
+ slug,
92
+ lastEntry: files[0].replace(".md", ""),
93
+ entryCount: files.length,
94
+ });
95
+ }
96
+ }
97
+ }
98
+ }
99
+ // Legacy location
100
+ if (fs.existsSync(LEGACY_ROOT)) {
101
+ try {
102
+ const entries = fs.readdirSync(LEGACY_ROOT);
103
+ for (const entry of entries) {
104
+ const journalPath = path.join(LEGACY_ROOT, entry, "memory", "journal");
105
+ if (fs.existsSync(journalPath)) {
106
+ const parts = entry.split("-").filter(Boolean);
107
+ const slug = parts[parts.length - 1] || entry;
108
+ if (!projects.has(slug)) {
109
+ const files = fs.readdirSync(journalPath).filter((f) => /^\d{4}-\d{2}-\d{2}\.md$/.test(f));
110
+ if (files.length > 0) {
111
+ files.sort().reverse();
112
+ projects.set(slug, {
113
+ slug,
114
+ lastEntry: files[0].replace(".md", ""),
115
+ entryCount: files.length,
116
+ });
117
+ }
118
+ }
119
+ }
120
+ }
121
+ }
122
+ catch {
123
+ // ignore
124
+ }
125
+ }
126
+ const result = Array.from(projects.values());
127
+ result.sort((a, b) => b.lastEntry.localeCompare(a.lastEntry));
128
+ return result;
129
+ }
130
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/storage/project.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=alignment-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alignment-check.d.ts","sourceRoot":"","sources":["../../src/tools/alignment-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiEhD"}