agent-recall-core 3.3.4

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 (165) hide show
  1. package/dist/helpers/journal-files.d.ts +30 -0
  2. package/dist/helpers/journal-files.d.ts.map +1 -0
  3. package/dist/helpers/journal-files.js +96 -0
  4. package/dist/helpers/journal-files.js.map +1 -0
  5. package/dist/helpers/rollup.d.ts +35 -0
  6. package/dist/helpers/rollup.d.ts.map +1 -0
  7. package/dist/helpers/rollup.js +78 -0
  8. package/dist/helpers/rollup.js.map +1 -0
  9. package/dist/helpers/sections.d.ts +12 -0
  10. package/dist/helpers/sections.d.ts.map +1 -0
  11. package/dist/helpers/sections.js +84 -0
  12. package/dist/helpers/sections.js.map +1 -0
  13. package/dist/index.d.ts +52 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +63 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/palace/awareness.d.ts +67 -0
  18. package/dist/palace/awareness.d.ts.map +1 -0
  19. package/dist/palace/awareness.js +231 -0
  20. package/dist/palace/awareness.js.map +1 -0
  21. package/dist/palace/consolidate.d.ts +28 -0
  22. package/dist/palace/consolidate.d.ts.map +1 -0
  23. package/dist/palace/consolidate.js +129 -0
  24. package/dist/palace/consolidate.js.map +1 -0
  25. package/dist/palace/fan-out.d.ts +15 -0
  26. package/dist/palace/fan-out.d.ts.map +1 -0
  27. package/dist/palace/fan-out.js +78 -0
  28. package/dist/palace/fan-out.js.map +1 -0
  29. package/dist/palace/graph.d.ts +11 -0
  30. package/dist/palace/graph.d.ts.map +1 -0
  31. package/dist/palace/graph.js +59 -0
  32. package/dist/palace/graph.js.map +1 -0
  33. package/dist/palace/identity.d.ts +6 -0
  34. package/dist/palace/identity.d.ts.map +1 -0
  35. package/dist/palace/identity.js +18 -0
  36. package/dist/palace/identity.js.map +1 -0
  37. package/dist/palace/index-manager.d.ts +7 -0
  38. package/dist/palace/index-manager.d.ts.map +1 -0
  39. package/dist/palace/index-manager.js +46 -0
  40. package/dist/palace/index-manager.js.map +1 -0
  41. package/dist/palace/insights-index.d.ts +39 -0
  42. package/dist/palace/insights-index.d.ts.map +1 -0
  43. package/dist/palace/insights-index.js +101 -0
  44. package/dist/palace/insights-index.js.map +1 -0
  45. package/dist/palace/log.d.ts +9 -0
  46. package/dist/palace/log.d.ts.map +1 -0
  47. package/dist/palace/log.js +28 -0
  48. package/dist/palace/log.js.map +1 -0
  49. package/dist/palace/obsidian.d.ts +12 -0
  50. package/dist/palace/obsidian.d.ts.map +1 -0
  51. package/dist/palace/obsidian.js +76 -0
  52. package/dist/palace/obsidian.js.map +1 -0
  53. package/dist/palace/rooms.d.ts +14 -0
  54. package/dist/palace/rooms.d.ts.map +1 -0
  55. package/dist/palace/rooms.js +117 -0
  56. package/dist/palace/rooms.js.map +1 -0
  57. package/dist/palace/salience.d.ts +15 -0
  58. package/dist/palace/salience.d.ts.map +1 -0
  59. package/dist/palace/salience.js +33 -0
  60. package/dist/palace/salience.js.map +1 -0
  61. package/dist/storage/fs-utils.d.ts +8 -0
  62. package/dist/storage/fs-utils.d.ts.map +1 -0
  63. package/dist/storage/fs-utils.js +28 -0
  64. package/dist/storage/fs-utils.js.map +1 -0
  65. package/dist/storage/paths.d.ts +21 -0
  66. package/dist/storage/paths.d.ts.map +1 -0
  67. package/dist/storage/paths.js +71 -0
  68. package/dist/storage/paths.js.map +1 -0
  69. package/dist/storage/project.d.ts +17 -0
  70. package/dist/storage/project.d.ts.map +1 -0
  71. package/dist/storage/project.js +131 -0
  72. package/dist/storage/project.js.map +1 -0
  73. package/dist/tools-logic/alignment-check.d.ts +19 -0
  74. package/dist/tools-logic/alignment-check.d.ts.map +1 -0
  75. package/dist/tools-logic/alignment-check.js +54 -0
  76. package/dist/tools-logic/alignment-check.js.map +1 -0
  77. package/dist/tools-logic/awareness-update.d.ts +23 -0
  78. package/dist/tools-logic/awareness-update.d.ts.map +1 -0
  79. package/dist/tools-logic/awareness-update.js +47 -0
  80. package/dist/tools-logic/awareness-update.js.map +1 -0
  81. package/dist/tools-logic/context-synthesize.d.ts +17 -0
  82. package/dist/tools-logic/context-synthesize.d.ts.map +1 -0
  83. package/dist/tools-logic/context-synthesize.js +174 -0
  84. package/dist/tools-logic/context-synthesize.js.map +1 -0
  85. package/dist/tools-logic/journal-archive.d.ts +11 -0
  86. package/dist/tools-logic/journal-archive.d.ts.map +1 -0
  87. package/dist/tools-logic/journal-archive.js +47 -0
  88. package/dist/tools-logic/journal-archive.js.map +1 -0
  89. package/dist/tools-logic/journal-capture.d.ts +16 -0
  90. package/dist/tools-logic/journal-capture.d.ts.map +1 -0
  91. package/dist/tools-logic/journal-capture.js +57 -0
  92. package/dist/tools-logic/journal-capture.js.map +1 -0
  93. package/dist/tools-logic/journal-cold-start.d.ts +37 -0
  94. package/dist/tools-logic/journal-cold-start.d.ts.map +1 -0
  95. package/dist/tools-logic/journal-cold-start.js +78 -0
  96. package/dist/tools-logic/journal-cold-start.js.map +1 -0
  97. package/dist/tools-logic/journal-list.d.ts +14 -0
  98. package/dist/tools-logic/journal-list.d.ts.map +1 -0
  99. package/dist/tools-logic/journal-list.js +18 -0
  100. package/dist/tools-logic/journal-list.js.map +1 -0
  101. package/dist/tools-logic/journal-projects.d.ts +10 -0
  102. package/dist/tools-logic/journal-projects.d.ts.map +1 -0
  103. package/dist/tools-logic/journal-projects.js +10 -0
  104. package/dist/tools-logic/journal-projects.js.map +1 -0
  105. package/dist/tools-logic/journal-read.d.ts +13 -0
  106. package/dist/tools-logic/journal-read.d.ts.map +1 -0
  107. package/dist/tools-logic/journal-read.js +22 -0
  108. package/dist/tools-logic/journal-read.js.map +1 -0
  109. package/dist/tools-logic/journal-rollup.d.ts +16 -0
  110. package/dist/tools-logic/journal-rollup.d.ts.map +1 -0
  111. package/dist/tools-logic/journal-rollup.js +79 -0
  112. package/dist/tools-logic/journal-rollup.js.map +1 -0
  113. package/dist/tools-logic/journal-search.d.ts +16 -0
  114. package/dist/tools-logic/journal-search.d.ts.map +1 -0
  115. package/dist/tools-logic/journal-search.js +80 -0
  116. package/dist/tools-logic/journal-search.js.map +1 -0
  117. package/dist/tools-logic/journal-state.d.ts +26 -0
  118. package/dist/tools-logic/journal-state.d.ts.map +1 -0
  119. package/dist/tools-logic/journal-state.js +80 -0
  120. package/dist/tools-logic/journal-state.js.map +1 -0
  121. package/dist/tools-logic/journal-write.d.ts +18 -0
  122. package/dist/tools-logic/journal-write.d.ts.map +1 -0
  123. package/dist/tools-logic/journal-write.js +54 -0
  124. package/dist/tools-logic/journal-write.js.map +1 -0
  125. package/dist/tools-logic/knowledge-read.d.ts +7 -0
  126. package/dist/tools-logic/knowledge-read.d.ts.map +1 -0
  127. package/dist/tools-logic/knowledge-read.js +88 -0
  128. package/dist/tools-logic/knowledge-read.js.map +1 -0
  129. package/dist/tools-logic/knowledge-write.d.ts +23 -0
  130. package/dist/tools-logic/knowledge-write.d.ts.map +1 -0
  131. package/dist/tools-logic/knowledge-write.js +58 -0
  132. package/dist/tools-logic/knowledge-write.js.map +1 -0
  133. package/dist/tools-logic/nudge.d.ts +15 -0
  134. package/dist/tools-logic/nudge.d.ts.map +1 -0
  135. package/dist/tools-logic/nudge.js +27 -0
  136. package/dist/tools-logic/nudge.js.map +1 -0
  137. package/dist/tools-logic/palace-lint.d.ts +20 -0
  138. package/dist/tools-logic/palace-lint.d.ts.map +1 -0
  139. package/dist/tools-logic/palace-lint.js +87 -0
  140. package/dist/tools-logic/palace-lint.js.map +1 -0
  141. package/dist/tools-logic/palace-read.d.ts +24 -0
  142. package/dist/tools-logic/palace-read.d.ts.map +1 -0
  143. package/dist/tools-logic/palace-read.js +45 -0
  144. package/dist/tools-logic/palace-read.js.map +1 -0
  145. package/dist/tools-logic/palace-search.d.ts +19 -0
  146. package/dist/tools-logic/palace-search.d.ts.map +1 -0
  147. package/dist/tools-logic/palace-search.js +46 -0
  148. package/dist/tools-logic/palace-search.js.map +1 -0
  149. package/dist/tools-logic/palace-walk.d.ts +18 -0
  150. package/dist/tools-logic/palace-walk.d.ts.map +1 -0
  151. package/dist/tools-logic/palace-walk.js +89 -0
  152. package/dist/tools-logic/palace-walk.js.map +1 -0
  153. package/dist/tools-logic/palace-write.d.ts +22 -0
  154. package/dist/tools-logic/palace-write.d.ts.map +1 -0
  155. package/dist/tools-logic/palace-write.js +60 -0
  156. package/dist/tools-logic/palace-write.js.map +1 -0
  157. package/dist/tools-logic/recall-insight.d.ts +20 -0
  158. package/dist/tools-logic/recall-insight.d.ts.map +1 -0
  159. package/dist/tools-logic/recall-insight.js +27 -0
  160. package/dist/tools-logic/recall-insight.js.map +1 -0
  161. package/dist/types.d.ts +123 -0
  162. package/dist/types.d.ts.map +1 -0
  163. package/dist/types.js +54 -0
  164. package/dist/types.js.map +1 -0
  165. package/package.json +36 -0
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Awareness system — a living 200-line document that compounds insights.
3
+ *
4
+ * Unlike the palace (room-based storage) or journal (temporal log),
5
+ * awareness.md is a SELF-REWRITING document. Every update forces the
6
+ * system to merge, compress, or demote — creating compounding knowledge.
7
+ *
8
+ * Structure:
9
+ * ## Identity (5 lines) — who is the user, what matters
10
+ * ## Top Insights (10 items) — ranked by relevance + confirmation count
11
+ * ## Compound Insights (5 max) — patterns spanning 3+ individual insights
12
+ * ## Trajectory (3 lines) — where is the work heading
13
+ * ## Blind Spots (3 lines) — what the system suspects matters but hasn't confirmed
14
+ *
15
+ * Max 200 lines enforced. Overflow triggers merge/demote.
16
+ */
17
+ import * as fs from "node:fs";
18
+ import * as path from "node:path";
19
+ import { getRoot } from "../types.js";
20
+ import { ensureDir } from "../storage/fs-utils.js";
21
+ const MAX_LINES = 200;
22
+ function awarenessPath() {
23
+ return path.join(getRoot(), "awareness.md");
24
+ }
25
+ export function readAwareness() {
26
+ const p = awarenessPath();
27
+ if (!fs.existsSync(p))
28
+ return "";
29
+ return fs.readFileSync(p, "utf-8");
30
+ }
31
+ export function writeAwareness(content) {
32
+ const p = awarenessPath();
33
+ ensureDir(path.dirname(p));
34
+ // Enforce 200-line max
35
+ const lines = content.split("\n");
36
+ if (lines.length > MAX_LINES) {
37
+ const truncated = lines.slice(0, MAX_LINES).join("\n");
38
+ fs.writeFileSync(p, truncated + "\n", "utf-8");
39
+ }
40
+ else {
41
+ fs.writeFileSync(p, content, "utf-8");
42
+ }
43
+ }
44
+ const AWARENESS_JSON_PATH = () => path.join(getRoot(), "awareness-state.json");
45
+ export function readAwarenessState() {
46
+ const p = AWARENESS_JSON_PATH();
47
+ if (!fs.existsSync(p))
48
+ return null;
49
+ try {
50
+ return JSON.parse(fs.readFileSync(p, "utf-8"));
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ export function writeAwarenessState(state) {
57
+ const p = AWARENESS_JSON_PATH();
58
+ ensureDir(path.dirname(p));
59
+ fs.writeFileSync(p, JSON.stringify(state, null, 2), "utf-8");
60
+ }
61
+ /**
62
+ * Initialize awareness from scratch.
63
+ */
64
+ export function initAwareness(identity) {
65
+ const state = {
66
+ identity,
67
+ topInsights: [],
68
+ compoundInsights: [],
69
+ trajectory: "",
70
+ blindSpots: [],
71
+ lastUpdated: new Date().toISOString(),
72
+ };
73
+ writeAwarenessState(state);
74
+ renderAwareness(state);
75
+ return state;
76
+ }
77
+ /**
78
+ * Add or merge an insight into the awareness state.
79
+ * If similar insight exists (by title keyword overlap), merge and strengthen.
80
+ * If new, add and demote lowest if over 10.
81
+ */
82
+ export function addInsight(newInsight) {
83
+ let state = readAwarenessState();
84
+ if (!state) {
85
+ state = initAwareness("(unknown user)");
86
+ }
87
+ const now = new Date().toISOString();
88
+ const titleWords = newInsight.title.toLowerCase().split(/\s+/);
89
+ // Check for similar existing insight (>50% word overlap)
90
+ let bestMatch = null;
91
+ for (let i = 0; i < state.topInsights.length; i++) {
92
+ const existing = state.topInsights[i];
93
+ const existingWords = existing.title.toLowerCase().split(/\s+/);
94
+ const overlap = titleWords.filter((w) => existingWords.includes(w) && w.length > 3).length;
95
+ const ratio = overlap / Math.max(titleWords.length, existingWords.length);
96
+ if (ratio > 0.5 && (!bestMatch || ratio > bestMatch.overlap)) {
97
+ bestMatch = { idx: i, overlap: ratio };
98
+ }
99
+ }
100
+ if (bestMatch) {
101
+ // Merge: strengthen existing insight
102
+ const existing = state.topInsights[bestMatch.idx];
103
+ existing.confirmations++;
104
+ existing.lastConfirmed = now;
105
+ existing.evidence += ` | ${newInsight.evidence}`;
106
+ // Merge appliesWhen
107
+ for (const aw of newInsight.appliesWhen) {
108
+ if (!existing.appliesWhen.includes(aw)) {
109
+ existing.appliesWhen.push(aw);
110
+ }
111
+ }
112
+ writeAwarenessState(state);
113
+ renderAwareness(state);
114
+ return { action: "merged", insight: existing };
115
+ }
116
+ // New insight
117
+ const insight = {
118
+ id: `insight-${Date.now()}`,
119
+ title: newInsight.title,
120
+ evidence: newInsight.evidence,
121
+ confirmations: 1,
122
+ lastConfirmed: now,
123
+ appliesWhen: newInsight.appliesWhen,
124
+ source: newInsight.source,
125
+ };
126
+ if (state.topInsights.length < 10) {
127
+ state.topInsights.push(insight);
128
+ writeAwarenessState(state);
129
+ renderAwareness(state);
130
+ return { action: "added", insight };
131
+ }
132
+ // Over 10: replace lowest-confirmation insight
133
+ state.topInsights.sort((a, b) => b.confirmations - a.confirmations);
134
+ const demoted = state.topInsights.pop();
135
+ state.topInsights.push(insight);
136
+ writeAwarenessState(state);
137
+ renderAwareness(state);
138
+ return { action: "replaced", insight };
139
+ }
140
+ /**
141
+ * Detect compound insights — patterns spanning 3+ individual insights.
142
+ * Looks for shared appliesWhen keywords across insights.
143
+ */
144
+ export function detectCompoundInsights() {
145
+ const state = readAwarenessState();
146
+ if (!state || state.topInsights.length < 3)
147
+ return [];
148
+ // Group insights by shared appliesWhen keywords
149
+ const keywordMap = new Map();
150
+ for (const insight of state.topInsights) {
151
+ for (const aw of insight.appliesWhen) {
152
+ const key = aw.toLowerCase();
153
+ if (!keywordMap.has(key))
154
+ keywordMap.set(key, []);
155
+ keywordMap.get(key).push(insight);
156
+ }
157
+ }
158
+ const compounds = [];
159
+ for (const [keyword, insights] of keywordMap) {
160
+ if (insights.length >= 3) {
161
+ const id = `compound-${keyword}`;
162
+ // Don't duplicate
163
+ if (state.compoundInsights.some((c) => c.id === id))
164
+ continue;
165
+ compounds.push({
166
+ id,
167
+ title: `Pattern: "${keyword}" appears across ${insights.length} insights`,
168
+ sourceInsights: insights.map((i) => i.id),
169
+ pattern: insights.map((i) => i.title).join(" + "),
170
+ confidence: Math.min(1.0, insights.length * 0.25),
171
+ });
172
+ }
173
+ }
174
+ if (compounds.length > 0) {
175
+ state.compoundInsights = [...state.compoundInsights, ...compounds].slice(0, 5);
176
+ writeAwarenessState(state);
177
+ renderAwareness(state);
178
+ }
179
+ return compounds;
180
+ }
181
+ /**
182
+ * Render awareness state into the 200-line markdown document.
183
+ */
184
+ export function renderAwareness(state) {
185
+ const lines = [];
186
+ lines.push("# Awareness");
187
+ lines.push(`> Last updated: ${state.lastUpdated}`);
188
+ lines.push("");
189
+ // Identity
190
+ lines.push("## Identity");
191
+ lines.push(state.identity || "_(not set)_");
192
+ lines.push("");
193
+ // Top insights (sorted by confirmations)
194
+ lines.push("## Top Insights");
195
+ lines.push("");
196
+ const sorted = [...state.topInsights].sort((a, b) => b.confirmations - a.confirmations);
197
+ for (const insight of sorted) {
198
+ lines.push(`### ${insight.title} (${insight.confirmations}x confirmed)`);
199
+ lines.push(`- Evidence: ${insight.evidence.slice(0, 150)}`);
200
+ lines.push(`- Applies when: ${insight.appliesWhen.join(", ")}`);
201
+ lines.push(`- Source: ${insight.source} | Last: ${insight.lastConfirmed.slice(0, 10)}`);
202
+ lines.push("");
203
+ }
204
+ // Compound insights
205
+ if (state.compoundInsights.length > 0) {
206
+ lines.push("## Compound Insights");
207
+ lines.push("");
208
+ for (const ci of state.compoundInsights) {
209
+ lines.push(`### ${ci.title} (confidence: ${ci.confidence.toFixed(2)})`);
210
+ lines.push(`- Pattern: ${ci.pattern.slice(0, 200)}`);
211
+ lines.push(`- Sources: ${ci.sourceInsights.length} insights`);
212
+ lines.push("");
213
+ }
214
+ }
215
+ // Trajectory
216
+ lines.push("## Trajectory");
217
+ lines.push(state.trajectory || "_(not set — will emerge after 3+ sessions)_");
218
+ lines.push("");
219
+ // Blind spots
220
+ lines.push("## Blind Spots");
221
+ if (state.blindSpots.length > 0) {
222
+ for (const bs of state.blindSpots) {
223
+ lines.push(`- ${bs}`);
224
+ }
225
+ }
226
+ else {
227
+ lines.push("_(none detected yet)_");
228
+ }
229
+ writeAwareness(lines.join("\n"));
230
+ }
231
+ //# sourceMappingURL=awareness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"awareness.js","sourceRoot":"","sources":["../../src/palace/awareness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Memory transformation pipeline: episodic (journal) → semantic (palace).
3
+ *
4
+ * Inspired by:
5
+ * - Karpathy's LLM Wiki: fan-out on ingest, query-as-deposit
6
+ * - llm_wiki: two-step ingest (analyze then generate), source traceability
7
+ * - Human memory: episodic → semantic consolidation during sleep
8
+ *
9
+ * This module extracts decisions, goals, blockers, and observations from
10
+ * journal entries and consolidates them into palace rooms.
11
+ */
12
+ export interface ConsolidationResult {
13
+ entriesProcessed: number;
14
+ roomsUpdated: string[];
15
+ memoriesCreated: number;
16
+ }
17
+ /**
18
+ * Consolidate recent journal entries into palace rooms.
19
+ *
20
+ * Process:
21
+ * 1. Read N recent journal entries
22
+ * 2. Extract structured content per section type
23
+ * 3. Route each to the appropriate palace room
24
+ * 4. Add source traceability (which journal entry it came from)
25
+ * 5. Trigger fan-out for cross-references
26
+ */
27
+ export declare function consolidateJournalToPalace(project: string, entryCount?: number): ConsolidationResult;
28
+ //# sourceMappingURL=consolidate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidate.d.ts","sourceRoot":"","sources":["../../src/palace/consolidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAU,GACrB,mBAAmB,CAqHrB"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Memory transformation pipeline: episodic (journal) → semantic (palace).
3
+ *
4
+ * Inspired by:
5
+ * - Karpathy's LLM Wiki: fan-out on ingest, query-as-deposit
6
+ * - llm_wiki: two-step ingest (analyze then generate), source traceability
7
+ * - Human memory: episodic → semantic consolidation during sleep
8
+ *
9
+ * This module extracts decisions, goals, blockers, and observations from
10
+ * journal entries and consolidates them into palace rooms.
11
+ */
12
+ import * as fs from "node:fs";
13
+ import * as path from "node:path";
14
+ import { palaceDir } from "../storage/paths.js";
15
+ import { ensureDir, todayISO } from "../storage/fs-utils.js";
16
+ import { listJournalFiles } from "../helpers/journal-files.js";
17
+ import { extractSection } from "../helpers/sections.js";
18
+ import { ensurePalaceInitialized, roomExists, createRoom, updateRoomMeta } from "./rooms.js";
19
+ import { fanOut } from "./fan-out.js";
20
+ import { generateFrontmatter } from "./obsidian.js";
21
+ import { updatePalaceIndex } from "./index-manager.js";
22
+ import { appendToLog } from "./log.js";
23
+ /**
24
+ * Consolidate recent journal entries into palace rooms.
25
+ *
26
+ * Process:
27
+ * 1. Read N recent journal entries
28
+ * 2. Extract structured content per section type
29
+ * 3. Route each to the appropriate palace room
30
+ * 4. Add source traceability (which journal entry it came from)
31
+ * 5. Trigger fan-out for cross-references
32
+ */
33
+ export function consolidateJournalToPalace(project, entryCount = 5) {
34
+ ensurePalaceInitialized(project);
35
+ const entries = listJournalFiles(project);
36
+ const toProcess = entries.slice(0, entryCount);
37
+ const pd = palaceDir(project);
38
+ const date = todayISO();
39
+ const result = {
40
+ entriesProcessed: 0,
41
+ roomsUpdated: [],
42
+ memoriesCreated: 0,
43
+ };
44
+ const updatedRooms = new Set();
45
+ for (const entry of toProcess) {
46
+ const content = fs.readFileSync(path.join(entry.dir, entry.file), "utf-8");
47
+ const sourceRef = `[[journal/${entry.date}]]`;
48
+ // Extract and route each section type
49
+ const routes = [
50
+ { section: "decisions", room: "architecture", topic: "decisions" },
51
+ { section: "blockers", room: "blockers", topic: "current" },
52
+ { section: "next", room: "goals", topic: "active" },
53
+ { section: "observations", room: "knowledge", topic: "observations" },
54
+ ];
55
+ for (const route of routes) {
56
+ const sectionContent = extractSection(content, route.section);
57
+ if (!sectionContent || sectionContent.trim().length < 10)
58
+ continue;
59
+ // Ensure room exists
60
+ if (!roomExists(project, route.room)) {
61
+ const name = route.room.charAt(0).toUpperCase() + route.room.slice(1);
62
+ createRoom(project, route.room, name, `Consolidated from journal ${route.section}`, []);
63
+ }
64
+ const topicPath = path.join(pd, "rooms", route.room, `${route.topic}.md`);
65
+ ensureDir(path.dirname(topicPath));
66
+ // Build entry with source traceability
67
+ const fm = !fs.existsSync(topicPath)
68
+ ? generateFrontmatter({
69
+ room: route.room,
70
+ topic: route.topic,
71
+ created: new Date().toISOString(),
72
+ source: "consolidation",
73
+ sources: [entry.date],
74
+ })
75
+ : "";
76
+ const memoryEntry = `\n### ${entry.date} ${sourceRef}\n\n${sectionContent.replace(/^## .+\n/, "").trim()}\n`;
77
+ if (fs.existsSync(topicPath)) {
78
+ // Check if this date's content is already consolidated (idempotent)
79
+ const existing = fs.readFileSync(topicPath, "utf-8");
80
+ if (existing.includes(`### ${entry.date}`))
81
+ continue;
82
+ fs.appendFileSync(topicPath, memoryEntry, "utf-8");
83
+ }
84
+ else {
85
+ fs.writeFileSync(topicPath, `${fm}# ${route.room} / ${route.topic}\n${memoryEntry}`, "utf-8");
86
+ }
87
+ // Update room metadata
88
+ updateRoomMeta(project, route.room, {
89
+ updated: new Date().toISOString(),
90
+ });
91
+ updatedRooms.add(route.room);
92
+ result.memoriesCreated++;
93
+ // Fan-out with source reference
94
+ fanOut(project, route.room, route.topic, sectionContent, [], "medium");
95
+ }
96
+ // Extract brief → goals/evolution
97
+ const brief = extractSection(content, "brief");
98
+ if (brief && brief.trim().length > 5) {
99
+ const evoPath = path.join(pd, "rooms", "goals", "evolution.md");
100
+ ensureDir(path.dirname(evoPath));
101
+ const evoEntry = `\n### ${entry.date} ${sourceRef}\n\n${brief.split("\n")[0]}\n`;
102
+ if (fs.existsSync(evoPath)) {
103
+ const existing = fs.readFileSync(evoPath, "utf-8");
104
+ if (!existing.includes(`### ${entry.date}`)) {
105
+ fs.appendFileSync(evoPath, evoEntry, "utf-8");
106
+ result.memoriesCreated++;
107
+ }
108
+ }
109
+ else {
110
+ const fm = generateFrontmatter({ room: "goals", topic: "evolution", created: new Date().toISOString(), source: "consolidation" });
111
+ fs.writeFileSync(evoPath, `${fm}# goals / evolution\n${evoEntry}`, "utf-8");
112
+ result.memoriesCreated++;
113
+ }
114
+ updatedRooms.add("goals");
115
+ }
116
+ result.entriesProcessed++;
117
+ }
118
+ result.roomsUpdated = Array.from(updatedRooms);
119
+ // Update palace index
120
+ updatePalaceIndex(project);
121
+ // Log the operation
122
+ appendToLog(project, "consolidate", {
123
+ entries_processed: result.entriesProcessed,
124
+ rooms_updated: result.roomsUpdated,
125
+ memories_created: result.memoriesCreated,
126
+ });
127
+ return result;
128
+ }
129
+ //# sourceMappingURL=consolidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidate.js","sourceRoot":"","sources":["../../src/palace/consolidate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Fan-out write logic.
3
+ * When content is written to a room, this module:
4
+ * 1. Parses [[wikilinks]] from the content
5
+ * 2. Adds back-references in referenced rooms
6
+ * 3. Updates graph.json with new edges
7
+ * 4. Recalculates salience for affected rooms
8
+ */
9
+ import type { Importance } from "../types.js";
10
+ export interface FanOutResult {
11
+ updatedRooms: string[];
12
+ newEdges: number;
13
+ }
14
+ export declare function fanOut(project: string, sourceRoom: string, sourceTopic: string, content: string, explicitConnections?: string[], importance?: Importance): FanOutResult;
15
+ //# sourceMappingURL=fan-out.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan-out.d.ts","sourceRoot":"","sources":["../../src/palace/fan-out.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,MAAM,CACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,mBAAmB,GAAE,MAAM,EAAO,EAClC,UAAU,GAAE,UAAqB,GAChC,YAAY,CAoEd"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Fan-out write logic.
3
+ * When content is written to a room, this module:
4
+ * 1. Parses [[wikilinks]] from the content
5
+ * 2. Adds back-references in referenced rooms
6
+ * 3. Updates graph.json with new edges
7
+ * 4. Recalculates salience for affected rooms
8
+ */
9
+ import * as fs from "node:fs";
10
+ import * as path from "node:path";
11
+ import { palaceDir } from "../storage/paths.js";
12
+ import { extractWikilinks, addBackReference } from "./obsidian.js";
13
+ import { addEdge, getConnectionCount } from "./graph.js";
14
+ import { getRoomMeta, updateRoomMeta } from "./rooms.js";
15
+ import { computeSalience } from "./salience.js";
16
+ export function fanOut(project, sourceRoom, sourceTopic, content, explicitConnections = [], importance = "medium") {
17
+ const pd = palaceDir(project);
18
+ const result = { updatedRooms: [], newEdges: 0 };
19
+ // Collect all targets: from wikilinks + explicit connections
20
+ const wikiTargets = extractWikilinks(content);
21
+ const allTargets = new Set([...wikiTargets, ...explicitConnections]);
22
+ for (const target of allTargets) {
23
+ // Target could be "roomSlug" or "roomSlug/topic"
24
+ const targetRoom = target.split("/")[0];
25
+ if (targetRoom === sourceRoom)
26
+ continue; // skip self-references
27
+ // Add back-reference in target room's README.md
28
+ const targetReadme = path.join(pd, "rooms", targetRoom, "README.md");
29
+ if (fs.existsSync(targetReadme)) {
30
+ const readmeContent = fs.readFileSync(targetReadme, "utf-8");
31
+ const updated = addBackReference(readmeContent, sourceRoom, sourceTopic);
32
+ if (updated !== readmeContent) {
33
+ fs.writeFileSync(targetReadme, updated, "utf-8");
34
+ result.updatedRooms.push(targetRoom);
35
+ }
36
+ }
37
+ // Add edge to graph
38
+ addEdge(pd, `${sourceRoom}/${sourceTopic}`, target, "references");
39
+ result.newEdges++;
40
+ // Update target room's connections list
41
+ const targetMeta = getRoomMeta(project, targetRoom);
42
+ if (targetMeta && !targetMeta.connections.includes(sourceRoom)) {
43
+ updateRoomMeta(project, targetRoom, {
44
+ connections: [...targetMeta.connections, sourceRoom],
45
+ });
46
+ }
47
+ }
48
+ // Update source room's connections list
49
+ const sourceMeta = getRoomMeta(project, sourceRoom);
50
+ if (sourceMeta) {
51
+ const newConns = new Set(sourceMeta.connections);
52
+ for (const target of allTargets) {
53
+ const targetRoom = target.split("/")[0];
54
+ if (targetRoom !== sourceRoom)
55
+ newConns.add(targetRoom);
56
+ }
57
+ updateRoomMeta(project, sourceRoom, {
58
+ connections: Array.from(newConns),
59
+ });
60
+ }
61
+ // Recalculate salience for all affected rooms
62
+ const affectedRooms = new Set([sourceRoom, ...result.updatedRooms]);
63
+ for (const room of affectedRooms) {
64
+ const meta = getRoomMeta(project, room);
65
+ if (!meta)
66
+ continue;
67
+ const connCount = getConnectionCount(pd, room);
68
+ const newSalience = computeSalience({
69
+ importance,
70
+ lastUpdated: meta.updated,
71
+ accessCount: meta.access_count,
72
+ connectionCount: connCount,
73
+ });
74
+ updateRoomMeta(project, room, { salience: newSalience });
75
+ }
76
+ return result;
77
+ }
78
+ //# sourceMappingURL=fan-out.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan-out.js","sourceRoot":"","sources":["../../src/palace/fan-out.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Palace graph management — cross-reference edges between rooms and memories.
3
+ */
4
+ import type { PalaceGraph } from "../types.js";
5
+ export declare function readGraph(palaceDir: string): PalaceGraph;
6
+ export declare function writeGraph(palaceDir: string, graph: PalaceGraph): void;
7
+ export declare function addEdge(palaceDir: string, from: string, to: string, type?: string, weight?: number): void;
8
+ export declare function removeEdgesFor(palaceDir: string, target: string): void;
9
+ export declare function getConnectionCount(palaceDir: string, roomSlug: string): number;
10
+ export declare function getConnectedRooms(palaceDir: string, roomSlug: string): string[];
11
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/palace/graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,aAAa,CAAC;AAO1D,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAExD;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAEtE;AAED,wBAAgB,OAAO,CACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAqB,EAC3B,MAAM,GAAE,MAAY,GACnB,IAAI,CAkBN;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAMtE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS9E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB/E"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Palace graph management — cross-reference edges between rooms and memories.
3
+ */
4
+ import * as path from "node:path";
5
+ import { readJsonSafe, writeJsonAtomic } from "../storage/fs-utils.js";
6
+ function graphPath(palaceDir) {
7
+ return path.join(palaceDir, "graph.json");
8
+ }
9
+ export function readGraph(palaceDir) {
10
+ return readJsonSafe(graphPath(palaceDir)) ?? { edges: [] };
11
+ }
12
+ export function writeGraph(palaceDir, graph) {
13
+ writeJsonAtomic(graphPath(palaceDir), graph);
14
+ }
15
+ export function addEdge(palaceDir, from, to, type = "references", weight = 0.5) {
16
+ const graph = readGraph(palaceDir);
17
+ // Don't duplicate
18
+ const exists = graph.edges.some((e) => e.from === from && e.to === to && e.type === type);
19
+ if (exists)
20
+ return;
21
+ graph.edges.push({
22
+ from,
23
+ to,
24
+ type,
25
+ weight,
26
+ created: new Date().toISOString(),
27
+ });
28
+ writeGraph(palaceDir, graph);
29
+ }
30
+ export function removeEdgesFor(palaceDir, target) {
31
+ const graph = readGraph(palaceDir);
32
+ graph.edges = graph.edges.filter((e) => e.from !== target && e.to !== target);
33
+ writeGraph(palaceDir, graph);
34
+ }
35
+ export function getConnectionCount(palaceDir, roomSlug) {
36
+ const graph = readGraph(palaceDir);
37
+ return graph.edges.filter((e) => e.from.startsWith(roomSlug + "/") ||
38
+ e.to.startsWith(roomSlug + "/") ||
39
+ e.from === roomSlug ||
40
+ e.to === roomSlug).length;
41
+ }
42
+ export function getConnectedRooms(palaceDir, roomSlug) {
43
+ const graph = readGraph(palaceDir);
44
+ const connected = new Set();
45
+ for (const edge of graph.edges) {
46
+ if (edge.from.startsWith(roomSlug + "/") || edge.from === roomSlug) {
47
+ const target = edge.to.split("/")[0];
48
+ if (target !== roomSlug)
49
+ connected.add(target);
50
+ }
51
+ if (edge.to.startsWith(roomSlug + "/") || edge.to === roomSlug) {
52
+ const source = edge.from.split("/")[0];
53
+ if (source !== roomSlug)
54
+ connected.add(source);
55
+ }
56
+ }
57
+ return Array.from(connected);
58
+ }
59
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/palace/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Palace identity card — ~50 token project summary.
3
+ */
4
+ export declare function readIdentity(project: string): string;
5
+ export declare function writeIdentity(project: string, content: string): void;
6
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/palace/identity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGpE"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Palace identity card — ~50 token project summary.
3
+ */
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ import { palaceDir } from "../storage/paths.js";
7
+ export function readIdentity(project) {
8
+ const idPath = path.join(palaceDir(project), "identity.md");
9
+ if (!fs.existsSync(idPath)) {
10
+ return `# ${project}\n\n> No identity card yet. Use palace_write to add one.`;
11
+ }
12
+ return fs.readFileSync(idPath, "utf-8");
13
+ }
14
+ export function writeIdentity(project, content) {
15
+ const idPath = path.join(palaceDir(project), "identity.md");
16
+ fs.writeFileSync(idPath, content, "utf-8");
17
+ }
18
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/palace/identity.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;IAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,OAAO,0DAA0D,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,OAAe;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;IAC5D,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Palace index management — maintains palace-index.json.
3
+ */
4
+ import type { PalaceIndex } from "../types.js";
5
+ export declare function readPalaceIndex(project: string): PalaceIndex | null;
6
+ export declare function updatePalaceIndex(project: string): PalaceIndex;
7
+ //# sourceMappingURL=index-manager.d.ts.map