@roackb2/heddle 0.0.27 → 0.0.29

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 (207) hide show
  1. package/README.md +65 -11
  2. package/dist/examples/programmatic-loop.js +12 -0
  3. package/dist/examples/programmatic-loop.js.map +1 -1
  4. package/dist/src/cli/ask.d.ts +2 -0
  5. package/dist/src/cli/ask.d.ts.map +1 -1
  6. package/dist/src/cli/ask.js +107 -5
  7. package/dist/src/cli/ask.js.map +1 -1
  8. package/dist/src/cli/chat/App.d.ts.map +1 -1
  9. package/dist/src/cli/chat/App.js +16 -4
  10. package/dist/src/cli/chat/App.js.map +1 -1
  11. package/dist/src/cli/chat/components/RuntimeHostInterstitial.d.ts +7 -0
  12. package/dist/src/cli/chat/components/RuntimeHostInterstitial.d.ts.map +1 -0
  13. package/dist/src/cli/chat/components/RuntimeHostInterstitial.js +22 -0
  14. package/dist/src/cli/chat/components/RuntimeHostInterstitial.js.map +1 -0
  15. package/dist/src/cli/chat/components/index.d.ts +1 -0
  16. package/dist/src/cli/chat/components/index.d.ts.map +1 -1
  17. package/dist/src/cli/chat/components/index.js +1 -0
  18. package/dist/src/cli/chat/components/index.js.map +1 -1
  19. package/dist/src/cli/chat/hooks/useAgentRun.d.ts +1 -0
  20. package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +1 -1
  21. package/dist/src/cli/chat/hooks/useAgentRun.js +118 -1
  22. package/dist/src/cli/chat/hooks/useAgentRun.js.map +1 -1
  23. package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts +1 -0
  24. package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts.map +1 -1
  25. package/dist/src/cli/chat/hooks/useApprovalFlow.js +3 -0
  26. package/dist/src/cli/chat/hooks/useApprovalFlow.js.map +1 -1
  27. package/dist/src/cli/chat/hooks/useChatSessions.d.ts +3 -1
  28. package/dist/src/cli/chat/hooks/useChatSessions.d.ts.map +1 -1
  29. package/dist/src/cli/chat/hooks/useChatSessions.js +7 -2
  30. package/dist/src/cli/chat/hooks/useChatSessions.js.map +1 -1
  31. package/dist/src/cli/chat/utils/format.d.ts.map +1 -1
  32. package/dist/src/cli/chat/utils/format.js +8 -0
  33. package/dist/src/cli/chat/utils/format.js.map +1 -1
  34. package/dist/src/cli/chat/utils/runtime.d.ts +3 -0
  35. package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
  36. package/dist/src/cli/chat/utils/runtime.js +8 -3
  37. package/dist/src/cli/chat/utils/runtime.js.map +1 -1
  38. package/dist/src/cli/daemon.d.ts +1 -0
  39. package/dist/src/cli/daemon.d.ts.map +1 -1
  40. package/dist/src/cli/daemon.js +6 -1
  41. package/dist/src/cli/daemon.js.map +1 -1
  42. package/dist/src/cli/heartbeat/task-commands.d.ts.map +1 -1
  43. package/dist/src/cli/heartbeat/task-commands.js +10 -1
  44. package/dist/src/cli/heartbeat/task-commands.js.map +1 -1
  45. package/dist/src/cli/heartbeat/worker.d.ts.map +1 -1
  46. package/dist/src/cli/heartbeat/worker.js +9 -1
  47. package/dist/src/cli/heartbeat/worker.js.map +1 -1
  48. package/dist/src/cli/main.js +304 -7
  49. package/dist/src/cli/main.js.map +1 -1
  50. package/dist/src/cli/remote/control-plane-client.d.ts +290 -0
  51. package/dist/src/cli/remote/control-plane-client.d.ts.map +1 -0
  52. package/dist/src/cli/remote/control-plane-client.js +11 -0
  53. package/dist/src/cli/remote/control-plane-client.js.map +1 -0
  54. package/dist/src/core/agent/mutation-tracking.d.ts.map +1 -1
  55. package/dist/src/core/agent/mutation-tracking.js +3 -0
  56. package/dist/src/core/agent/mutation-tracking.js.map +1 -1
  57. package/dist/src/core/agent/post-mutation.js +2 -2
  58. package/dist/src/core/agent/post-mutation.js.map +1 -1
  59. package/dist/src/core/agent/run-agent.d.ts.map +1 -1
  60. package/dist/src/core/agent/run-agent.js +132 -28
  61. package/dist/src/core/agent/run-agent.js.map +1 -1
  62. package/dist/src/core/chat/conversation-lines.d.ts.map +1 -1
  63. package/dist/src/core/chat/conversation-lines.js +1 -26
  64. package/dist/src/core/chat/conversation-lines.js.map +1 -1
  65. package/dist/src/core/chat/session-lease.d.ts +23 -0
  66. package/dist/src/core/chat/session-lease.d.ts.map +1 -0
  67. package/dist/src/core/chat/session-lease.js +72 -0
  68. package/dist/src/core/chat/session-lease.js.map +1 -0
  69. package/dist/src/core/chat/session-submit.d.ts +5 -0
  70. package/dist/src/core/chat/session-submit.d.ts.map +1 -1
  71. package/dist/src/core/chat/session-submit.js +243 -108
  72. package/dist/src/core/chat/session-submit.js.map +1 -1
  73. package/dist/src/core/chat/storage.d.ts +4 -1
  74. package/dist/src/core/chat/storage.d.ts.map +1 -1
  75. package/dist/src/core/chat/storage.js +31 -0
  76. package/dist/src/core/chat/storage.js.map +1 -1
  77. package/dist/src/core/chat/trace-summary.d.ts.map +1 -1
  78. package/dist/src/core/chat/trace-summary.js +10 -0
  79. package/dist/src/core/chat/trace-summary.js.map +1 -1
  80. package/dist/src/core/chat/types.d.ts +9 -0
  81. package/dist/src/core/chat/types.d.ts.map +1 -1
  82. package/dist/src/core/memory/catalog.d.ts +46 -0
  83. package/dist/src/core/memory/catalog.d.ts.map +1 -0
  84. package/dist/src/core/memory/catalog.js +230 -0
  85. package/dist/src/core/memory/catalog.js.map +1 -0
  86. package/dist/src/core/memory/domain-prompt.d.ts +2 -0
  87. package/dist/src/core/memory/domain-prompt.d.ts.map +1 -0
  88. package/dist/src/core/memory/domain-prompt.js +35 -0
  89. package/dist/src/core/memory/domain-prompt.js.map +1 -0
  90. package/dist/src/core/memory/maintainer-tools.d.ts +5 -0
  91. package/dist/src/core/memory/maintainer-tools.d.ts.map +1 -0
  92. package/dist/src/core/memory/maintainer-tools.js +10 -0
  93. package/dist/src/core/memory/maintainer-tools.js.map +1 -0
  94. package/dist/src/core/memory/maintainer.d.ts +45 -0
  95. package/dist/src/core/memory/maintainer.d.ts.map +1 -0
  96. package/dist/src/core/memory/maintainer.js +204 -0
  97. package/dist/src/core/memory/maintainer.js.map +1 -0
  98. package/dist/src/core/memory/maintenance-integration.d.ts +20 -0
  99. package/dist/src/core/memory/maintenance-integration.d.ts.map +1 -0
  100. package/dist/src/core/memory/maintenance-integration.js +189 -0
  101. package/dist/src/core/memory/maintenance-integration.js.map +1 -0
  102. package/dist/src/core/memory/templates.d.ts +9 -0
  103. package/dist/src/core/memory/templates.d.ts.map +1 -0
  104. package/dist/src/core/memory/templates.js +32 -0
  105. package/dist/src/core/memory/templates.js.map +1 -0
  106. package/dist/src/core/memory/validation.d.ts +39 -0
  107. package/dist/src/core/memory/validation.d.ts.map +1 -0
  108. package/dist/src/core/memory/validation.js +94 -0
  109. package/dist/src/core/memory/validation.js.map +1 -0
  110. package/dist/src/core/memory/visibility.d.ts +42 -0
  111. package/dist/src/core/memory/visibility.d.ts.map +1 -0
  112. package/dist/src/core/memory/visibility.js +156 -0
  113. package/dist/src/core/memory/visibility.js.map +1 -0
  114. package/dist/src/core/prompts/system-prompt.d.ts.map +1 -1
  115. package/dist/src/core/prompts/system-prompt.js +0 -10
  116. package/dist/src/core/prompts/system-prompt.js.map +1 -1
  117. package/dist/src/core/runtime/daemon-registry.d.ts +39 -0
  118. package/dist/src/core/runtime/daemon-registry.d.ts.map +1 -0
  119. package/dist/src/core/runtime/daemon-registry.js +120 -0
  120. package/dist/src/core/runtime/daemon-registry.js.map +1 -0
  121. package/dist/src/core/runtime/default-tools.d.ts +1 -0
  122. package/dist/src/core/runtime/default-tools.d.ts.map +1 -1
  123. package/dist/src/core/runtime/default-tools.js +22 -4
  124. package/dist/src/core/runtime/default-tools.js.map +1 -1
  125. package/dist/src/core/runtime/heartbeat-task-store.d.ts +2 -0
  126. package/dist/src/core/runtime/heartbeat-task-store.d.ts.map +1 -1
  127. package/dist/src/core/runtime/heartbeat-task-store.js +1 -0
  128. package/dist/src/core/runtime/heartbeat-task-store.js.map +1 -1
  129. package/dist/src/core/runtime/heartbeat-views.d.ts +2 -0
  130. package/dist/src/core/runtime/heartbeat-views.d.ts.map +1 -1
  131. package/dist/src/core/runtime/heartbeat-views.js +2 -0
  132. package/dist/src/core/runtime/heartbeat-views.js.map +1 -1
  133. package/dist/src/core/runtime/heartbeat.d.ts.map +1 -1
  134. package/dist/src/core/runtime/heartbeat.js +9 -2
  135. package/dist/src/core/runtime/heartbeat.js.map +1 -1
  136. package/dist/src/core/runtime/runtime-hosts.d.ts +30 -0
  137. package/dist/src/core/runtime/runtime-hosts.d.ts.map +1 -0
  138. package/dist/src/core/runtime/runtime-hosts.js +95 -0
  139. package/dist/src/core/runtime/runtime-hosts.js.map +1 -0
  140. package/dist/src/core/runtime/workspaces.d.ts +48 -0
  141. package/dist/src/core/runtime/workspaces.d.ts.map +1 -0
  142. package/dist/src/core/runtime/workspaces.js +139 -0
  143. package/dist/src/core/runtime/workspaces.js.map +1 -0
  144. package/dist/src/core/tools/file-edit-core.d.ts +1 -0
  145. package/dist/src/core/tools/file-edit-core.d.ts.map +1 -1
  146. package/dist/src/core/tools/file-edit-core.js +10 -0
  147. package/dist/src/core/tools/file-edit-core.js.map +1 -1
  148. package/dist/src/core/tools/memory-checkpoint.d.ts +8 -0
  149. package/dist/src/core/tools/memory-checkpoint.d.ts.map +1 -0
  150. package/dist/src/core/tools/memory-checkpoint.js +131 -0
  151. package/dist/src/core/tools/memory-checkpoint.js.map +1 -0
  152. package/dist/src/core/tools/memory-notes.d.ts.map +1 -1
  153. package/dist/src/core/tools/memory-notes.js +4 -3
  154. package/dist/src/core/tools/memory-notes.js.map +1 -1
  155. package/dist/src/core/tools/record-knowledge.d.ts +9 -0
  156. package/dist/src/core/tools/record-knowledge.d.ts.map +1 -0
  157. package/dist/src/core/tools/record-knowledge.js +177 -0
  158. package/dist/src/core/tools/record-knowledge.js.map +1 -0
  159. package/dist/src/core/types.d.ts +33 -0
  160. package/dist/src/core/types.d.ts.map +1 -1
  161. package/dist/src/index.d.ts +13 -0
  162. package/dist/src/index.d.ts.map +1 -1
  163. package/dist/src/index.js +8 -0
  164. package/dist/src/index.js.map +1 -1
  165. package/dist/src/server/app.d.ts +5 -2
  166. package/dist/src/server/app.d.ts.map +1 -1
  167. package/dist/src/server/app.js +31 -7
  168. package/dist/src/server/app.js.map +1 -1
  169. package/dist/src/server/features/control-plane/router.d.ts +88 -0
  170. package/dist/src/server/features/control-plane/router.d.ts.map +1 -1
  171. package/dist/src/server/features/control-plane/router.js +131 -18
  172. package/dist/src/server/features/control-plane/router.js.map +1 -1
  173. package/dist/src/server/features/control-plane/services/ask.d.ts +17 -0
  174. package/dist/src/server/features/control-plane/services/ask.d.ts.map +1 -0
  175. package/dist/src/server/features/control-plane/services/ask.js +63 -0
  176. package/dist/src/server/features/control-plane/services/ask.js.map +1 -0
  177. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts +8 -0
  178. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts.map +1 -1
  179. package/dist/src/server/features/control-plane/services/chat-sessions.js +6 -2
  180. package/dist/src/server/features/control-plane/services/chat-sessions.js.map +1 -1
  181. package/dist/src/server/features/control-plane/services/control-plane-state.d.ts.map +1 -1
  182. package/dist/src/server/features/control-plane/services/control-plane-state.js +15 -6
  183. package/dist/src/server/features/control-plane/services/control-plane-state.js.map +1 -1
  184. package/dist/src/server/features/control-plane/services/memory.d.ts +22 -0
  185. package/dist/src/server/features/control-plane/services/memory.d.ts.map +1 -0
  186. package/dist/src/server/features/control-plane/services/memory.js +36 -0
  187. package/dist/src/server/features/control-plane/services/memory.js.map +1 -0
  188. package/dist/src/server/features/control-plane/types.d.ts +19 -0
  189. package/dist/src/server/features/control-plane/types.d.ts.map +1 -1
  190. package/dist/src/server/index.d.ts.map +1 -1
  191. package/dist/src/server/index.js +114 -6
  192. package/dist/src/server/index.js.map +1 -1
  193. package/dist/src/server/router.d.ts +92 -0
  194. package/dist/src/server/router.d.ts.map +1 -1
  195. package/dist/src/server/router.js +4 -0
  196. package/dist/src/server/router.js.map +1 -1
  197. package/dist/src/server/static.d.ts.map +1 -1
  198. package/dist/src/server/static.js +7 -5
  199. package/dist/src/server/static.js.map +1 -1
  200. package/dist/src/server/types.d.ts +22 -0
  201. package/dist/src/server/types.d.ts.map +1 -1
  202. package/dist/src/web/assets/index-BCCIDJRN.js +52 -0
  203. package/dist/src/web/assets/index-DarVaee6.css +2 -0
  204. package/dist/src/web/index.html +2 -2
  205. package/package.json +16 -2
  206. package/dist/src/web/assets/index-BPZ31ir-.js +0 -12
  207. package/dist/src/web/assets/index-C9sFoCL6.css +0 -2
@@ -0,0 +1,204 @@
1
+ import { appendFile, mkdir, readFile } from 'node:fs/promises';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { runAgent } from '../agent/run-agent.js';
4
+ import { createLogger } from '../utils/logger.js';
5
+ import { bootstrapMemoryWorkspace, loadMemoryRootCatalog, validateMemoryCatalogShape } from './catalog.js';
6
+ import { createMemoryMaintainerTools } from './maintainer-tools.js';
7
+ export async function readPendingKnowledgeCandidates(options) {
8
+ const memoryRoot = resolve(options.memoryRoot);
9
+ const candidatesPath = join(memoryRoot, '_maintenance', 'candidates.jsonl');
10
+ const lines = await readJsonlLines(candidatesPath);
11
+ const processed = new Set();
12
+ const pending = [];
13
+ for (const line of lines) {
14
+ const parsed = parseJsonObject(line);
15
+ if (!parsed) {
16
+ continue;
17
+ }
18
+ if (parsed.kind === 'candidate_status' && typeof parsed.candidateId === 'string' && parsed.status === 'processed') {
19
+ processed.add(parsed.candidateId);
20
+ continue;
21
+ }
22
+ if (isKnowledgeCandidate(parsed)) {
23
+ pending.push(parsed);
24
+ }
25
+ }
26
+ return pending.filter((candidate) => !processed.has(candidate.id));
27
+ }
28
+ export async function runKnowledgeMaintenance(options) {
29
+ const memoryRoot = resolve(options.memoryRoot);
30
+ bootstrapMemoryWorkspace({ memoryRoot });
31
+ const now = options.now ?? (() => new Date());
32
+ const startedAt = now();
33
+ const runId = options.nextRunId?.() ?? `memory-run-${startedAt.getTime()}`;
34
+ const candidateIds = options.observations.map((candidate) => candidate.id);
35
+ const skippedCandidateIds = options.observations
36
+ .filter((candidate) => !isMaintainerCandidateAllowed(candidate))
37
+ .map((candidate) => candidate.id);
38
+ const observations = options.observations.filter(isMaintainerCandidateAllowed);
39
+ if (observations.length === 0) {
40
+ const validation = validateMemoryCatalogShape({ memoryRoot });
41
+ const summary = candidateIds.length === 0 ? 'No pending knowledge candidates.'
42
+ : `Skipped ${candidateIds.length} low-value, duplicate, or secret-like memory candidate(s).`;
43
+ const run = {
44
+ id: runId,
45
+ startedAt: startedAt.toISOString(),
46
+ finishedAt: now().toISOString(),
47
+ source: options.source,
48
+ outcome: 'skipped',
49
+ summary,
50
+ candidateIds,
51
+ processedCandidateIds: [],
52
+ failedCandidateIds: skippedCandidateIds,
53
+ catalogValid: validation.ok,
54
+ catalogMissing: validation.missing,
55
+ };
56
+ await appendMaintenanceRun(memoryRoot, run);
57
+ return { run };
58
+ }
59
+ const rootCatalog = loadMemoryRootCatalog({ memoryRoot }).content;
60
+ const goal = buildMaintenanceGoal(observations);
61
+ const systemContext = buildMaintainerSystemContext(rootCatalog);
62
+ const result = await runAgent({
63
+ goal,
64
+ llm: options.llm,
65
+ tools: createMemoryMaintainerTools({ memoryRoot }),
66
+ maxSteps: options.maxSteps ?? 40,
67
+ logger: createLogger({ console: false, level: 'silent' }),
68
+ systemContext,
69
+ });
70
+ const validation = validateMemoryCatalogShape({ memoryRoot });
71
+ const processedCandidateIds = result.outcome === 'done' ? observations.map((candidate) => candidate.id) : [];
72
+ const failedCandidateIds = result.outcome === 'done' ? skippedCandidateIds : candidateIds;
73
+ const run = {
74
+ id: runId,
75
+ startedAt: startedAt.toISOString(),
76
+ finishedAt: now().toISOString(),
77
+ source: options.source,
78
+ outcome: result.outcome,
79
+ summary: result.summary,
80
+ candidateIds,
81
+ processedCandidateIds,
82
+ failedCandidateIds,
83
+ catalogValid: validation.ok,
84
+ catalogMissing: validation.missing,
85
+ };
86
+ await appendMaintenanceRun(memoryRoot, run);
87
+ if (processedCandidateIds.length > 0) {
88
+ await appendCandidateStatusEvents(memoryRoot, processedCandidateIds, run.id, now);
89
+ }
90
+ return { run, result };
91
+ }
92
+ function isMaintainerCandidateAllowed(candidate) {
93
+ const text = [
94
+ candidate.summary,
95
+ ...(candidate.evidence ?? []),
96
+ ...(candidate.sourceRefs ?? []),
97
+ ].join('\n');
98
+ return !containsSecretLikeText(text);
99
+ }
100
+ export async function runKnowledgeMaintenanceForBacklog(options) {
101
+ const observations = await readPendingKnowledgeCandidates({ memoryRoot: options.memoryRoot });
102
+ return await runKnowledgeMaintenance({ ...options, observations });
103
+ }
104
+ function buildMaintainerSystemContext(rootCatalog) {
105
+ return [
106
+ '## Memory Maintainer Mode',
107
+ '',
108
+ 'You maintain Heddle workspace memory. You are not doing general coding work.',
109
+ 'Use only memory tools. Do not ask for shell, code edit, web, or external tools.',
110
+ '',
111
+ 'Hard invariants:',
112
+ '- Every durable note must be discoverable through the root catalog or a folder catalog.',
113
+ '- Read the root catalog first, then read the relevant folder catalog before writing.',
114
+ '- Search existing notes before creating a new note.',
115
+ '- Prefer updating existing notes over creating duplicates.',
116
+ '- Update folder catalogs whenever you create, rename, or retire a note.',
117
+ '- Update the root catalog only when a new high-value note or discovery path matters globally.',
118
+ '- Do not store secrets, credentials, private keys, tokens, or passwords.',
119
+ '- Skip low-value, duplicate, speculative, or one-turn scratch observations.',
120
+ '',
121
+ 'Loaded root catalog:',
122
+ '',
123
+ rootCatalog,
124
+ ].join('\n');
125
+ }
126
+ function buildMaintenanceGoal(observations) {
127
+ return [
128
+ 'Process these pending memory candidates into maintained cataloged memory.',
129
+ '',
130
+ ...observations.map((candidate, index) => [
131
+ `Candidate ${index + 1}: ${candidate.id}`,
132
+ `Summary: ${candidate.summary}`,
133
+ candidate.categoryHint ? `Category hint: ${candidate.categoryHint}` : undefined,
134
+ candidate.importance ? `Importance: ${candidate.importance}` : undefined,
135
+ candidate.confidence ? `Confidence: ${candidate.confidence}` : undefined,
136
+ candidate.evidence?.length ? `Evidence:\n${candidate.evidence.map((item) => `- ${item}`).join('\n')}` : undefined,
137
+ candidate.sourceRefs?.length ? `Source refs: ${candidate.sourceRefs.join(', ')}` : undefined,
138
+ ].filter((line) => Boolean(line)).join('\n')),
139
+ '',
140
+ 'End with a concise summary of what memory notes or catalogs changed, or why candidates were skipped.',
141
+ ].join('\n\n');
142
+ }
143
+ async function appendMaintenanceRun(memoryRoot, run) {
144
+ const path = join(memoryRoot, '_maintenance', 'runs.jsonl');
145
+ await mkdir(dirname(path), { recursive: true });
146
+ await appendFile(path, `${JSON.stringify(run)}\n`, 'utf8');
147
+ }
148
+ async function appendCandidateStatusEvents(memoryRoot, candidateIds, runId, now) {
149
+ const path = join(memoryRoot, '_maintenance', 'candidates.jsonl');
150
+ await mkdir(dirname(path), { recursive: true });
151
+ const recordedAt = now().toISOString();
152
+ await appendFile(path, candidateIds.map((candidateId) => JSON.stringify({
153
+ kind: 'candidate_status',
154
+ candidateId,
155
+ status: 'processed',
156
+ runId,
157
+ recordedAt,
158
+ })).join('\n') + '\n', 'utf8');
159
+ }
160
+ async function readJsonlLines(path) {
161
+ try {
162
+ const raw = await readFile(path, 'utf8');
163
+ return raw.split(/\r?\n/u).filter((line) => line.trim());
164
+ }
165
+ catch (error) {
166
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
167
+ return [];
168
+ }
169
+ throw error;
170
+ }
171
+ }
172
+ function parseJsonObject(line) {
173
+ try {
174
+ const parsed = JSON.parse(line);
175
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : undefined;
176
+ }
177
+ catch {
178
+ return undefined;
179
+ }
180
+ }
181
+ function isKnowledgeCandidate(value) {
182
+ return typeof value.id === 'string'
183
+ && typeof value.recordedAt === 'string'
184
+ && value.status === 'pending'
185
+ && typeof value.summary === 'string'
186
+ && (value.evidence === undefined || isStringArray(value.evidence))
187
+ && (value.categoryHint === undefined || typeof value.categoryHint === 'string')
188
+ && (value.importance === undefined || value.importance === 'low' || value.importance === 'medium' || value.importance === 'high')
189
+ && (value.confidence === undefined || value.confidence === 'user-stated' || value.confidence === 'tool-verified' || value.confidence === 'inferred' || value.confidence === 'historical')
190
+ && (value.sourceRefs === undefined || isStringArray(value.sourceRefs));
191
+ }
192
+ function isStringArray(value) {
193
+ return Array.isArray(value) && value.every((item) => typeof item === 'string');
194
+ }
195
+ function containsSecretLikeText(value) {
196
+ const normalized = value.toLowerCase();
197
+ return /\b(api[_ -]?key|password|passwd|private[_ -]?key|access[_ -]?token|refresh[_ -]?token|bearer\s+[a-z0-9._~+/=-]{12,})\b/i.test(value)
198
+ || /\bsecret\s*[:=]\s*\S{8,}/i.test(value)
199
+ || /\bsk-[a-z0-9_-]{12,}\b/i.test(value)
200
+ || normalized.includes('-----begin private key-----')
201
+ || normalized.includes('-----begin rsa private key-----')
202
+ || normalized.includes('-----begin openssh private key-----');
203
+ }
204
+ //# sourceMappingURL=maintainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintainer.js","sourceRoot":"","sources":["../../../../src/core/memory/maintainer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { LlmAdapter } from '../llm/types.js';
2
+ import type { TraceEvent } from '../types.js';
3
+ import { type RunKnowledgeMaintenanceResult } from './maintainer.js';
4
+ export type RunMaintenanceForRecordedCandidatesOptions = {
5
+ memoryRoot: string;
6
+ llm: LlmAdapter;
7
+ source: string;
8
+ trace: TraceEvent[];
9
+ maxSteps?: number;
10
+ lockTimeoutMs?: number;
11
+ lockStaleAfterMs?: number;
12
+ onTraceEvent?: (event: TraceEvent) => void;
13
+ };
14
+ export type RunMaintenanceForRecordedCandidatesResult = {
15
+ candidateIds: string[];
16
+ maintenance?: RunKnowledgeMaintenanceResult;
17
+ events: TraceEvent[];
18
+ };
19
+ export declare function runMaintenanceForRecordedCandidates(options: RunMaintenanceForRecordedCandidatesOptions): Promise<RunMaintenanceForRecordedCandidatesResult>;
20
+ //# sourceMappingURL=maintenance-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintenance-integration.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/maintenance-integration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,iBAAiB,CAAC;AAOzB,MAAM,MAAM,0CAA0C,GAAG;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,yCAAyC,GAAG;IACtD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,6BAA6B,CAAC;IAC5C,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB,CAAC;AAEF,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,0CAA0C,GAClD,OAAO,CAAC,yCAAyC,CAAC,CAEpD"}
@@ -0,0 +1,189 @@
1
+ import { mkdir, open, readFile, rm } from 'node:fs/promises';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { readPendingKnowledgeCandidates, runKnowledgeMaintenance, } from './maintainer.js';
4
+ const DEFAULT_LOCK_STALE_AFTER_MS = 10 * 60 * 1000;
5
+ const DEFAULT_LOCK_POLL_MS = 250;
6
+ const DEFAULT_LOCK_TIMEOUT_MS = 30 * 1000;
7
+ const maintenanceQueues = new Map();
8
+ export async function runMaintenanceForRecordedCandidates(options) {
9
+ return await enqueueMaintenance(options.memoryRoot, () => runMaintenanceForRecordedCandidatesNow(options));
10
+ }
11
+ async function runMaintenanceForRecordedCandidatesNow(options) {
12
+ const candidateIds = [...new Set(options.trace
13
+ .filter((event) => event.type === 'memory.candidate_recorded')
14
+ .map((event) => event.candidateId))];
15
+ if (candidateIds.length === 0) {
16
+ return { candidateIds, events: [] };
17
+ }
18
+ const pending = await readPendingKnowledgeCandidates({ memoryRoot: options.memoryRoot });
19
+ const observations = pending.filter((candidate) => candidateIds.includes(candidate.id));
20
+ if (observations.length === 0) {
21
+ return { candidateIds, events: [] };
22
+ }
23
+ const runId = `memory-run-${Date.now()}`;
24
+ const started = createEvent({
25
+ type: 'memory.maintenance_started',
26
+ runId,
27
+ candidateIds: observations.map((candidate) => candidate.id),
28
+ step: nextMemoryStep(options.trace),
29
+ });
30
+ options.onTraceEvent?.(started);
31
+ let lock;
32
+ try {
33
+ lock = await acquireMemoryMaintenanceLock({
34
+ memoryRoot: options.memoryRoot,
35
+ staleAfterMs: options.lockStaleAfterMs,
36
+ timeoutMs: options.lockTimeoutMs,
37
+ });
38
+ const maintenance = await runKnowledgeMaintenance({
39
+ memoryRoot: options.memoryRoot,
40
+ observations,
41
+ llm: options.llm,
42
+ source: options.source,
43
+ maxSteps: options.maxSteps,
44
+ nextRunId: () => runId,
45
+ });
46
+ if (maintenance.run.outcome === 'error' || maintenance.run.outcome === 'max_steps' || maintenance.run.outcome === 'interrupted') {
47
+ const failed = createEvent({
48
+ type: 'memory.maintenance_failed',
49
+ runId: maintenance.run.id,
50
+ error: maintenance.run.summary,
51
+ candidateIds: observations.map((candidate) => candidate.id),
52
+ step: nextMemoryStep(options.trace),
53
+ });
54
+ options.onTraceEvent?.(failed);
55
+ return { candidateIds, maintenance, events: [started, failed] };
56
+ }
57
+ const finished = createEvent({
58
+ type: 'memory.maintenance_finished',
59
+ runId: maintenance.run.id,
60
+ outcome: maintenance.run.outcome,
61
+ summary: maintenance.run.summary,
62
+ processedCandidateIds: maintenance.run.processedCandidateIds,
63
+ failedCandidateIds: maintenance.run.failedCandidateIds,
64
+ step: nextMemoryStep(options.trace),
65
+ });
66
+ options.onTraceEvent?.(finished);
67
+ return { candidateIds, maintenance, events: [started, finished] };
68
+ }
69
+ catch (error) {
70
+ const failed = createEvent({
71
+ type: 'memory.maintenance_failed',
72
+ runId,
73
+ error: error instanceof Error ? error.message : String(error),
74
+ candidateIds: observations.map((candidate) => candidate.id),
75
+ step: nextMemoryStep(options.trace),
76
+ });
77
+ options.onTraceEvent?.(failed);
78
+ return { candidateIds, events: [started, failed] };
79
+ }
80
+ finally {
81
+ await lock?.release();
82
+ }
83
+ }
84
+ async function acquireMemoryMaintenanceLock(options) {
85
+ const memoryRoot = resolve(options.memoryRoot);
86
+ const lockPath = join(memoryRoot, '_maintenance', 'maintenance.lock');
87
+ const lockId = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
88
+ const startedAt = Date.now();
89
+ const timeoutMs = options.timeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;
90
+ const staleAfterMs = options.staleAfterMs ?? DEFAULT_LOCK_STALE_AFTER_MS;
91
+ await mkdir(dirname(lockPath), { recursive: true });
92
+ while (true) {
93
+ try {
94
+ const handle = await open(lockPath, 'wx');
95
+ await handle.writeFile(JSON.stringify({
96
+ id: lockId,
97
+ pid: process.pid,
98
+ acquiredAt: new Date().toISOString(),
99
+ }) + '\n', 'utf8');
100
+ await handle.close();
101
+ return {
102
+ async release() {
103
+ await releaseMemoryMaintenanceLock(lockPath, lockId);
104
+ },
105
+ };
106
+ }
107
+ catch (error) {
108
+ if (!(error instanceof Error) || !('code' in error) || error.code !== 'EEXIST') {
109
+ throw error;
110
+ }
111
+ if (await removeStaleMemoryMaintenanceLock(lockPath, staleAfterMs)) {
112
+ continue;
113
+ }
114
+ if (Date.now() - startedAt >= timeoutMs) {
115
+ throw new Error(`Memory maintenance lock is busy: ${lockPath}`);
116
+ }
117
+ await sleep(DEFAULT_LOCK_POLL_MS);
118
+ }
119
+ }
120
+ }
121
+ async function releaseMemoryMaintenanceLock(lockPath, lockId) {
122
+ const current = await readMemoryMaintenanceLock(lockPath);
123
+ if (current?.id !== lockId) {
124
+ return;
125
+ }
126
+ await rm(lockPath, { force: true });
127
+ }
128
+ async function removeStaleMemoryMaintenanceLock(lockPath, staleAfterMs) {
129
+ const current = await readMemoryMaintenanceLock(lockPath);
130
+ if (!current) {
131
+ return false;
132
+ }
133
+ const acquiredAt = Date.parse(current.acquiredAt);
134
+ if (!Number.isFinite(acquiredAt) || Date.now() - acquiredAt < staleAfterMs) {
135
+ return false;
136
+ }
137
+ await rm(lockPath, { force: true });
138
+ return true;
139
+ }
140
+ async function readMemoryMaintenanceLock(lockPath) {
141
+ try {
142
+ const parsed = JSON.parse(await readFile(lockPath, 'utf8'));
143
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
144
+ return undefined;
145
+ }
146
+ const candidate = parsed;
147
+ return typeof candidate.id === 'string' && typeof candidate.acquiredAt === 'string' ?
148
+ { id: candidate.id, acquiredAt: candidate.acquiredAt }
149
+ : undefined;
150
+ }
151
+ catch (error) {
152
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
153
+ return undefined;
154
+ }
155
+ return undefined;
156
+ }
157
+ }
158
+ async function sleep(ms) {
159
+ await new Promise((resolve) => setTimeout(resolve, ms));
160
+ }
161
+ async function enqueueMaintenance(memoryRoot, run) {
162
+ const previous = maintenanceQueues.get(memoryRoot) ?? Promise.resolve();
163
+ let release;
164
+ const current = new Promise((resolve) => {
165
+ release = resolve;
166
+ });
167
+ const queued = previous.then(() => current, () => current);
168
+ maintenanceQueues.set(memoryRoot, queued);
169
+ await previous.catch(() => undefined);
170
+ try {
171
+ return await run();
172
+ }
173
+ finally {
174
+ release();
175
+ if (maintenanceQueues.get(memoryRoot) === queued) {
176
+ maintenanceQueues.delete(memoryRoot);
177
+ }
178
+ }
179
+ }
180
+ function createEvent(event) {
181
+ return {
182
+ ...event,
183
+ timestamp: new Date().toISOString(),
184
+ };
185
+ }
186
+ function nextMemoryStep(trace) {
187
+ return trace.reduce((max, event) => 'step' in event ? Math.max(max, event.step) : max, 0) + 1;
188
+ }
189
+ //# sourceMappingURL=maintenance-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintenance-integration.js","sourceRoot":"","sources":["../../../../src/core/memory/maintenance-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function createMemoryNoteTemplate(options: {
2
+ title: string;
3
+ summary: string;
4
+ confidence?: string;
5
+ sourceRefs?: string[];
6
+ now?: Date;
7
+ }): string;
8
+ export declare function slugifyMemoryTitle(value: string): string;
9
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/templates.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,MAAM,CAiBT;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD"}
@@ -0,0 +1,32 @@
1
+ export function createMemoryNoteTemplate(options) {
2
+ const updatedAt = (options.now ?? new Date()).toISOString();
3
+ const sourceRefs = options.sourceRefs && options.sourceRefs.length > 0 ? options.sourceRefs : undefined;
4
+ return [
5
+ '---',
6
+ `title: ${quoteYaml(options.title)}`,
7
+ `updated: ${quoteYaml(updatedAt)}`,
8
+ options.confidence ? `confidence: ${quoteYaml(options.confidence)}` : undefined,
9
+ sourceRefs ? 'sourceRefs:' : undefined,
10
+ ...(sourceRefs?.map((sourceRef) => ` - ${quoteYaml(sourceRef)}`) ?? []),
11
+ '---',
12
+ '',
13
+ `# ${options.title}`,
14
+ '',
15
+ options.summary,
16
+ '',
17
+ ].filter((line) => line !== undefined).join('\n');
18
+ }
19
+ export function slugifyMemoryTitle(value) {
20
+ const slug = value
21
+ .toLowerCase()
22
+ .replace(/[`'"]/g, '')
23
+ .replace(/[^a-z0-9]+/g, '-')
24
+ .replace(/^-+|-+$/g, '')
25
+ .slice(0, 80)
26
+ .replace(/-+$/g, '');
27
+ return slug || 'memory-note';
28
+ }
29
+ function quoteYaml(value) {
30
+ return JSON.stringify(value);
31
+ }
32
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../../src/core/memory/templates.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,wBAAwB,CAAC,OAMxC;IACC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACxG,OAAO;QACL,KAAK;QACL,UAAU,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACpC,YAAY,SAAS,CAAC,SAAS,CAAC,EAAE;QAClC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QAC/E,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;QACtC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACxE,KAAK;QACL,EAAE;QACF,KAAK,OAAO,CAAC,KAAK,EAAE;QACpB,EAAE;QACF,OAAO,CAAC,OAAO;QACf,EAAE;KACH,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,IAAI,GAAG,KAAK;SACf,WAAW,EAAE;SACb,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvB,OAAO,IAAI,IAAI,aAAa,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,39 @@
1
+ export type MemoryValidationIssue = {
2
+ type: 'missing_catalog';
3
+ severity: 'error';
4
+ path: string;
5
+ message: string;
6
+ } | {
7
+ type: 'oversized_catalog';
8
+ severity: 'warning';
9
+ path: string;
10
+ sizeBytes: number;
11
+ maxBytes: number;
12
+ message: string;
13
+ } | {
14
+ type: 'orphan_note';
15
+ severity: 'warning';
16
+ path: string;
17
+ message: string;
18
+ } | {
19
+ type: 'pending_candidates';
20
+ severity: 'info';
21
+ count: number;
22
+ message: string;
23
+ };
24
+ export type MemoryValidationResult = {
25
+ memoryRoot: string;
26
+ ok: boolean;
27
+ issueCount: number;
28
+ issues: MemoryValidationIssue[];
29
+ };
30
+ export declare function validateMemoryWorkspace(options: {
31
+ memoryRoot: string;
32
+ }): Promise<MemoryValidationResult>;
33
+ export declare function repairMissingMemoryCatalogs(options: {
34
+ memoryRoot: string;
35
+ }): Promise<{
36
+ memoryRoot: string;
37
+ createdPaths: string[];
38
+ }>;
39
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/validation.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,qBAAqB,GAC7B;IACA,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,GACC;IACA,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,GACC;IACA,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,GACC;IACA,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEJ,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,qBAAqB,EAAE,CAAC;CACjC,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAiC9G;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAE1I"}
@@ -0,0 +1,94 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import { basename, dirname, join, resolve } from 'node:path';
3
+ import { DEFAULT_MEMORY_FOLDER_CATALOG_MAX_BYTES, DEFAULT_MEMORY_ROOT_CATALOG_MAX_BYTES, bootstrapMemoryWorkspace, validateMemoryCatalogShape, } from './catalog.js';
4
+ import { readPendingKnowledgeCandidates } from './maintainer.js';
5
+ import { listMemoryNotePaths } from './visibility.js';
6
+ export async function validateMemoryWorkspace(options) {
7
+ const memoryRoot = resolve(options.memoryRoot);
8
+ const issues = [];
9
+ const shape = validateMemoryCatalogShape({ memoryRoot });
10
+ for (const path of shape.missing) {
11
+ issues.push({
12
+ type: 'missing_catalog',
13
+ severity: 'error',
14
+ path,
15
+ message: `Missing required memory catalog: ${path}`,
16
+ });
17
+ }
18
+ const notes = await listMemoryNotePaths({ memoryRoot });
19
+ await appendOversizedCatalogIssues(memoryRoot, notes, issues);
20
+ await appendOrphanNoteIssues(memoryRoot, notes, issues);
21
+ const pending = await readPendingKnowledgeCandidates({ memoryRoot });
22
+ if (pending.length > 0) {
23
+ issues.push({
24
+ type: 'pending_candidates',
25
+ severity: 'info',
26
+ count: pending.length,
27
+ message: `${pending.length} pending memory candidate${pending.length === 1 ? '' : 's'} waiting for maintenance.`,
28
+ });
29
+ }
30
+ return {
31
+ memoryRoot,
32
+ ok: issues.every((issue) => issue.severity !== 'error'),
33
+ issueCount: issues.length,
34
+ issues,
35
+ };
36
+ }
37
+ export async function repairMissingMemoryCatalogs(options) {
38
+ return bootstrapMemoryWorkspace({ memoryRoot: options.memoryRoot });
39
+ }
40
+ async function appendOversizedCatalogIssues(memoryRoot, notes, issues) {
41
+ for (const path of notes.filter((note) => basename(note).toLowerCase() === 'readme.md')) {
42
+ const fullPath = join(memoryRoot, path);
43
+ const info = await stat(fullPath);
44
+ const maxBytes = path === 'README.md' ? DEFAULT_MEMORY_ROOT_CATALOG_MAX_BYTES : DEFAULT_MEMORY_FOLDER_CATALOG_MAX_BYTES;
45
+ if (info.size <= maxBytes) {
46
+ continue;
47
+ }
48
+ issues.push({
49
+ type: 'oversized_catalog',
50
+ severity: 'warning',
51
+ path,
52
+ sizeBytes: info.size,
53
+ maxBytes,
54
+ message: `Memory catalog ${path} is ${info.size} bytes, above the ${maxBytes} byte cap.`,
55
+ });
56
+ }
57
+ }
58
+ async function appendOrphanNoteIssues(memoryRoot, notes, issues) {
59
+ const catalogPaths = notes.filter((note) => basename(note).toLowerCase() === 'readme.md');
60
+ const catalogTextByPath = new Map();
61
+ for (const catalogPath of catalogPaths) {
62
+ catalogTextByPath.set(catalogPath, await readFile(join(memoryRoot, catalogPath), 'utf8'));
63
+ }
64
+ for (const note of notes) {
65
+ if (basename(note).toLowerCase() === 'readme.md') {
66
+ continue;
67
+ }
68
+ const folderCatalog = catalogPathForNote(note);
69
+ const folderCatalogText = catalogTextByPath.get(folderCatalog) ?? '';
70
+ const rootCatalogText = catalogTextByPath.get('README.md') ?? '';
71
+ const localName = basename(note);
72
+ const linkedFromFolder = folderCatalogText.includes(localName) || folderCatalogText.includes(note);
73
+ const linkedFromRoot = rootCatalogText.includes(note);
74
+ if (linkedFromFolder || linkedFromRoot) {
75
+ continue;
76
+ }
77
+ issues.push({
78
+ type: 'orphan_note',
79
+ severity: 'warning',
80
+ path: note,
81
+ message: orphanNoteMessage(note, folderCatalog),
82
+ });
83
+ }
84
+ }
85
+ function catalogPathForNote(path) {
86
+ const folder = dirname(path);
87
+ return folder === '.' ? 'README.md' : join(folder, 'README.md');
88
+ }
89
+ function orphanNoteMessage(note, folderCatalog) {
90
+ return folderCatalog === 'README.md' ?
91
+ `Memory note ${note} is not linked from README.md.`
92
+ : `Memory note ${note} is not linked from ${folderCatalog} or README.md.`;
93
+ }
94
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/core/memory/validation.ts"],"names":[],"mappings":"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"}