@roackb2/heddle 0.0.28 → 0.0.30

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 (199) hide show
  1. package/README.md +87 -36
  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.map +1 -1
  5. package/dist/src/cli/ask.js +27 -5
  6. package/dist/src/cli/ask.js.map +1 -1
  7. package/dist/src/cli/chat/App.js +5 -3
  8. package/dist/src/cli/chat/App.js.map +1 -1
  9. package/dist/src/cli/chat/hooks/useAgentRun.d.ts +1 -0
  10. package/dist/src/cli/chat/hooks/useAgentRun.d.ts.map +1 -1
  11. package/dist/src/cli/chat/hooks/useAgentRun.js +73 -0
  12. package/dist/src/cli/chat/hooks/useAgentRun.js.map +1 -1
  13. package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts +1 -0
  14. package/dist/src/cli/chat/hooks/useApprovalFlow.d.ts.map +1 -1
  15. package/dist/src/cli/chat/hooks/useApprovalFlow.js +3 -0
  16. package/dist/src/cli/chat/hooks/useApprovalFlow.js.map +1 -1
  17. package/dist/src/cli/chat/utils/format.d.ts.map +1 -1
  18. package/dist/src/cli/chat/utils/format.js +8 -0
  19. package/dist/src/cli/chat/utils/format.js.map +1 -1
  20. package/dist/src/cli/chat/utils/runtime.d.ts.map +1 -1
  21. package/dist/src/cli/chat/utils/runtime.js +7 -3
  22. package/dist/src/cli/chat/utils/runtime.js.map +1 -1
  23. package/dist/src/cli/main.js +235 -2
  24. package/dist/src/cli/main.js.map +1 -1
  25. package/dist/src/cli/remote/control-plane-client.d.ts +76 -0
  26. package/dist/src/cli/remote/control-plane-client.d.ts.map +1 -1
  27. package/dist/src/core/agent/mutation-tracking.d.ts.map +1 -1
  28. package/dist/src/core/agent/mutation-tracking.js +3 -0
  29. package/dist/src/core/agent/mutation-tracking.js.map +1 -1
  30. package/dist/src/core/agent/post-mutation.js +2 -2
  31. package/dist/src/core/agent/post-mutation.js.map +1 -1
  32. package/dist/src/core/agent/run-agent.d.ts +1 -0
  33. package/dist/src/core/agent/run-agent.d.ts.map +1 -1
  34. package/dist/src/core/agent/run-agent.js +136 -28
  35. package/dist/src/core/agent/run-agent.js.map +1 -1
  36. package/dist/src/core/agent/tool-dispatch.d.ts +2 -0
  37. package/dist/src/core/agent/tool-dispatch.d.ts.map +1 -1
  38. package/dist/src/core/agent/tool-dispatch.js +8 -7
  39. package/dist/src/core/agent/tool-dispatch.js.map +1 -1
  40. package/dist/src/core/chat/conversation-lines.d.ts.map +1 -1
  41. package/dist/src/core/chat/conversation-lines.js +1 -26
  42. package/dist/src/core/chat/conversation-lines.js.map +1 -1
  43. package/dist/src/core/chat/session-lease.d.ts +4 -0
  44. package/dist/src/core/chat/session-lease.d.ts.map +1 -1
  45. package/dist/src/core/chat/session-lease.js +29 -1
  46. package/dist/src/core/chat/session-lease.js.map +1 -1
  47. package/dist/src/core/chat/session-submit.d.ts +2 -0
  48. package/dist/src/core/chat/session-submit.d.ts.map +1 -1
  49. package/dist/src/core/chat/session-submit.js +120 -15
  50. package/dist/src/core/chat/session-submit.js.map +1 -1
  51. package/dist/src/core/chat/trace-summary.d.ts.map +1 -1
  52. package/dist/src/core/chat/trace-summary.js +10 -0
  53. package/dist/src/core/chat/trace-summary.js.map +1 -1
  54. package/dist/src/core/memory/catalog.d.ts +46 -0
  55. package/dist/src/core/memory/catalog.d.ts.map +1 -0
  56. package/dist/src/core/memory/catalog.js +230 -0
  57. package/dist/src/core/memory/catalog.js.map +1 -0
  58. package/dist/src/core/memory/domain-prompt.d.ts +2 -0
  59. package/dist/src/core/memory/domain-prompt.d.ts.map +1 -0
  60. package/dist/src/core/memory/domain-prompt.js +35 -0
  61. package/dist/src/core/memory/domain-prompt.js.map +1 -0
  62. package/dist/src/core/memory/maintainer-tools.d.ts +5 -0
  63. package/dist/src/core/memory/maintainer-tools.d.ts.map +1 -0
  64. package/dist/src/core/memory/maintainer-tools.js +10 -0
  65. package/dist/src/core/memory/maintainer-tools.js.map +1 -0
  66. package/dist/src/core/memory/maintainer.d.ts +45 -0
  67. package/dist/src/core/memory/maintainer.d.ts.map +1 -0
  68. package/dist/src/core/memory/maintainer.js +204 -0
  69. package/dist/src/core/memory/maintainer.js.map +1 -0
  70. package/dist/src/core/memory/maintenance-integration.d.ts +20 -0
  71. package/dist/src/core/memory/maintenance-integration.d.ts.map +1 -0
  72. package/dist/src/core/memory/maintenance-integration.js +189 -0
  73. package/dist/src/core/memory/maintenance-integration.js.map +1 -0
  74. package/dist/src/core/memory/templates.d.ts +9 -0
  75. package/dist/src/core/memory/templates.d.ts.map +1 -0
  76. package/dist/src/core/memory/templates.js +32 -0
  77. package/dist/src/core/memory/templates.js.map +1 -0
  78. package/dist/src/core/memory/validation.d.ts +39 -0
  79. package/dist/src/core/memory/validation.d.ts.map +1 -0
  80. package/dist/src/core/memory/validation.js +94 -0
  81. package/dist/src/core/memory/validation.js.map +1 -0
  82. package/dist/src/core/memory/visibility.d.ts +42 -0
  83. package/dist/src/core/memory/visibility.d.ts.map +1 -0
  84. package/dist/src/core/memory/visibility.js +156 -0
  85. package/dist/src/core/memory/visibility.js.map +1 -0
  86. package/dist/src/core/prompts/system-prompt.d.ts.map +1 -1
  87. package/dist/src/core/prompts/system-prompt.js +0 -10
  88. package/dist/src/core/prompts/system-prompt.js.map +1 -1
  89. package/dist/src/core/review/diff-domain.d.ts +24 -0
  90. package/dist/src/core/review/diff-domain.d.ts.map +1 -0
  91. package/dist/src/core/review/diff-domain.js +134 -0
  92. package/dist/src/core/review/diff-domain.js.map +1 -0
  93. package/dist/src/core/runtime/agent-loop.d.ts.map +1 -1
  94. package/dist/src/core/runtime/agent-loop.js +1 -0
  95. package/dist/src/core/runtime/agent-loop.js.map +1 -1
  96. package/dist/src/core/runtime/daemon-registry.d.ts +6 -1
  97. package/dist/src/core/runtime/daemon-registry.d.ts.map +1 -1
  98. package/dist/src/core/runtime/daemon-registry.js +32 -5
  99. package/dist/src/core/runtime/daemon-registry.js.map +1 -1
  100. package/dist/src/core/runtime/default-tools.d.ts +1 -0
  101. package/dist/src/core/runtime/default-tools.d.ts.map +1 -1
  102. package/dist/src/core/runtime/default-tools.js +33 -13
  103. package/dist/src/core/runtime/default-tools.js.map +1 -1
  104. package/dist/src/core/runtime/heartbeat.d.ts.map +1 -1
  105. package/dist/src/core/runtime/heartbeat.js +9 -2
  106. package/dist/src/core/runtime/heartbeat.js.map +1 -1
  107. package/dist/src/core/runtime/runtime-hosts.js +1 -1
  108. package/dist/src/core/runtime/runtime-hosts.js.map +1 -1
  109. package/dist/src/core/runtime/workspaces.d.ts +7 -0
  110. package/dist/src/core/runtime/workspaces.d.ts.map +1 -1
  111. package/dist/src/core/runtime/workspaces.js +31 -2
  112. package/dist/src/core/runtime/workspaces.js.map +1 -1
  113. package/dist/src/core/tools/edit-file.d.ts +4 -0
  114. package/dist/src/core/tools/edit-file.d.ts.map +1 -1
  115. package/dist/src/core/tools/edit-file.js +48 -43
  116. package/dist/src/core/tools/edit-file.js.map +1 -1
  117. package/dist/src/core/tools/file-edit-core.d.ts +1 -0
  118. package/dist/src/core/tools/file-edit-core.d.ts.map +1 -1
  119. package/dist/src/core/tools/file-edit-core.js +10 -0
  120. package/dist/src/core/tools/file-edit-core.js.map +1 -1
  121. package/dist/src/core/tools/list-files.d.ts +4 -0
  122. package/dist/src/core/tools/list-files.d.ts.map +1 -1
  123. package/dist/src/core/tools/list-files.js +34 -29
  124. package/dist/src/core/tools/list-files.js.map +1 -1
  125. package/dist/src/core/tools/memory-checkpoint.d.ts +8 -0
  126. package/dist/src/core/tools/memory-checkpoint.d.ts.map +1 -0
  127. package/dist/src/core/tools/memory-checkpoint.js +131 -0
  128. package/dist/src/core/tools/memory-checkpoint.js.map +1 -0
  129. package/dist/src/core/tools/memory-notes.d.ts.map +1 -1
  130. package/dist/src/core/tools/memory-notes.js +4 -3
  131. package/dist/src/core/tools/memory-notes.js.map +1 -1
  132. package/dist/src/core/tools/read-file.d.ts +4 -0
  133. package/dist/src/core/tools/read-file.d.ts.map +1 -1
  134. package/dist/src/core/tools/read-file.js +50 -45
  135. package/dist/src/core/tools/read-file.js.map +1 -1
  136. package/dist/src/core/tools/record-knowledge.d.ts +9 -0
  137. package/dist/src/core/tools/record-knowledge.d.ts.map +1 -0
  138. package/dist/src/core/tools/record-knowledge.js +177 -0
  139. package/dist/src/core/tools/record-knowledge.js.map +1 -0
  140. package/dist/src/core/tools/run-shell.d.ts +2 -0
  141. package/dist/src/core/tools/run-shell.d.ts.map +1 -1
  142. package/dist/src/core/tools/run-shell.js +3 -0
  143. package/dist/src/core/tools/run-shell.js.map +1 -1
  144. package/dist/src/core/tools/search-files.d.ts +1 -0
  145. package/dist/src/core/tools/search-files.d.ts.map +1 -1
  146. package/dist/src/core/tools/search-files.js +4 -2
  147. package/dist/src/core/tools/search-files.js.map +1 -1
  148. package/dist/src/core/tools/view-image.d.ts +1 -0
  149. package/dist/src/core/tools/view-image.d.ts.map +1 -1
  150. package/dist/src/core/tools/view-image.js +2 -1
  151. package/dist/src/core/tools/view-image.js.map +1 -1
  152. package/dist/src/core/types.d.ts +33 -0
  153. package/dist/src/core/types.d.ts.map +1 -1
  154. package/dist/src/index.d.ts +13 -0
  155. package/dist/src/index.d.ts.map +1 -1
  156. package/dist/src/index.js +8 -0
  157. package/dist/src/index.js.map +1 -1
  158. package/dist/src/server/app.d.ts.map +1 -1
  159. package/dist/src/server/app.js +1 -1
  160. package/dist/src/server/app.js.map +1 -1
  161. package/dist/src/server/features/control-plane/router.d.ts +78 -1
  162. package/dist/src/server/features/control-plane/router.d.ts.map +1 -1
  163. package/dist/src/server/features/control-plane/router.js +87 -2
  164. package/dist/src/server/features/control-plane/router.js.map +1 -1
  165. package/dist/src/server/features/control-plane/services/ask.d.ts.map +1 -1
  166. package/dist/src/server/features/control-plane/services/ask.js +23 -5
  167. package/dist/src/server/features/control-plane/services/ask.js.map +1 -1
  168. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts +2 -0
  169. package/dist/src/server/features/control-plane/services/chat-sessions.d.ts.map +1 -1
  170. package/dist/src/server/features/control-plane/services/chat-sessions.js +69 -0
  171. package/dist/src/server/features/control-plane/services/chat-sessions.js.map +1 -1
  172. package/dist/src/server/features/control-plane/services/control-plane-state.d.ts.map +1 -1
  173. package/dist/src/server/features/control-plane/services/control-plane-state.js +26 -1
  174. package/dist/src/server/features/control-plane/services/control-plane-state.js.map +1 -1
  175. package/dist/src/server/features/control-plane/services/memory.d.ts +22 -0
  176. package/dist/src/server/features/control-plane/services/memory.d.ts.map +1 -0
  177. package/dist/src/server/features/control-plane/services/memory.js +36 -0
  178. package/dist/src/server/features/control-plane/services/memory.js.map +1 -0
  179. package/dist/src/server/features/control-plane/services/workspace-diff.d.ts +4 -0
  180. package/dist/src/server/features/control-plane/services/workspace-diff.d.ts.map +1 -0
  181. package/dist/src/server/features/control-plane/services/workspace-diff.js +258 -0
  182. package/dist/src/server/features/control-plane/services/workspace-diff.js.map +1 -0
  183. package/dist/src/server/features/control-plane/services/workspace-files.d.ts +18 -0
  184. package/dist/src/server/features/control-plane/services/workspace-files.d.ts.map +1 -1
  185. package/dist/src/server/features/control-plane/services/workspace-files.js +68 -2
  186. package/dist/src/server/features/control-plane/services/workspace-files.js.map +1 -1
  187. package/dist/src/server/features/control-plane/types.d.ts +38 -0
  188. package/dist/src/server/features/control-plane/types.d.ts.map +1 -1
  189. package/dist/src/server/index.d.ts.map +1 -1
  190. package/dist/src/server/index.js +1 -0
  191. package/dist/src/server/index.js.map +1 -1
  192. package/dist/src/server/router.d.ts +76 -0
  193. package/dist/src/server/router.d.ts.map +1 -1
  194. package/dist/src/web/assets/index-BKSxomk7.js +55 -0
  195. package/dist/src/web/assets/index-Bl3oDytR.css +2 -0
  196. package/dist/src/web/index.html +2 -2
  197. package/package.json +18 -2
  198. package/dist/src/web/assets/index-COAJyPuH.css +0 -2
  199. package/dist/src/web/assets/index-DxGlp0Wk.js +0 -52
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintainer-tools.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/maintainer-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,EAAE,CAO7F"}
@@ -0,0 +1,10 @@
1
+ import { createEditMemoryNoteTool, createListMemoryNotesTool, createReadMemoryNoteTool, createSearchMemoryNotesTool, } from '../tools/memory-notes.js';
2
+ export function createMemoryMaintainerTools(options) {
3
+ return [
4
+ createListMemoryNotesTool({ memoryRoot: options.memoryRoot }),
5
+ createReadMemoryNoteTool({ memoryRoot: options.memoryRoot }),
6
+ createSearchMemoryNotesTool({ memoryRoot: options.memoryRoot }),
7
+ createEditMemoryNoteTool({ memoryRoot: options.memoryRoot }),
8
+ ];
9
+ }
10
+ //# sourceMappingURL=maintainer-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintainer-tools.js","sourceRoot":"","sources":["../../../../src/core/memory/maintainer-tools.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,0BAA0B,CAAC;AAElC,MAAM,UAAU,2BAA2B,CAAC,OAA+B;IACzE,OAAO;QACL,yBAAyB,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7D,wBAAwB,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5D,2BAA2B,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/D,wBAAwB,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { LlmAdapter } from '../llm/types.js';
2
+ import type { RunResult } from '../types.js';
3
+ export type KnowledgeCandidate = {
4
+ id: string;
5
+ recordedAt: string;
6
+ status: 'pending';
7
+ summary: string;
8
+ evidence?: string[];
9
+ categoryHint?: string;
10
+ importance?: 'low' | 'medium' | 'high';
11
+ confidence?: 'user-stated' | 'tool-verified' | 'inferred' | 'historical';
12
+ sourceRefs?: string[];
13
+ };
14
+ export type KnowledgeMaintenanceRunRecord = {
15
+ id: string;
16
+ startedAt: string;
17
+ finishedAt: string;
18
+ source: string;
19
+ outcome: RunResult['outcome'] | 'skipped';
20
+ summary: string;
21
+ candidateIds: string[];
22
+ processedCandidateIds: string[];
23
+ failedCandidateIds: string[];
24
+ catalogValid: boolean;
25
+ catalogMissing: string[];
26
+ };
27
+ export type RunKnowledgeMaintenanceOptions = {
28
+ memoryRoot: string;
29
+ observations: KnowledgeCandidate[];
30
+ llm: LlmAdapter;
31
+ source: string;
32
+ maxSteps?: number;
33
+ now?: () => Date;
34
+ nextRunId?: () => string;
35
+ };
36
+ export type RunKnowledgeMaintenanceResult = {
37
+ run: KnowledgeMaintenanceRunRecord;
38
+ result?: RunResult;
39
+ };
40
+ export declare function readPendingKnowledgeCandidates(options: {
41
+ memoryRoot: string;
42
+ }): Promise<KnowledgeCandidate[]>;
43
+ export declare function runKnowledgeMaintenance(options: RunKnowledgeMaintenanceOptions): Promise<RunKnowledgeMaintenanceResult>;
44
+ export declare function runKnowledgeMaintenanceForBacklog(options: Omit<RunKnowledgeMaintenanceOptions, 'observations'>): Promise<RunKnowledgeMaintenanceResult>;
45
+ //# sourceMappingURL=maintainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintainer.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/maintainer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,UAAU,CAAC,EAAE,aAAa,GAAG,eAAe,GAAG,UAAU,GAAG,YAAY,CAAC;IACzE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,GAAG,EAAE,6BAA6B,CAAC;IACnC,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,wBAAsB,8BAA8B,CAAC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwBnH;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAoE7H;AAWD,wBAAsB,iCAAiC,CAAC,OAAO,EAAE,IAAI,CAAC,8BAA8B,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAG7J"}
@@ -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"}