common-memory-core 0.2.0

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 (284) hide show
  1. package/.env.sample +3 -0
  2. package/CHANGELOG.md +39 -0
  3. package/LICENSE +21 -0
  4. package/README.md +120 -0
  5. package/SECURITY.md +48 -0
  6. package/dist/cli/codex/transcript-0.153.4.d.ts +20 -0
  7. package/dist/cli/codex/transcript-0.153.4.d.ts.map +1 -0
  8. package/dist/cli/codex/transcript-0.153.4.js +78 -0
  9. package/dist/cli/codex/transcript-0.153.4.js.map +1 -0
  10. package/dist/cli/codex-config.d.ts +2 -0
  11. package/dist/cli/codex-config.d.ts.map +1 -0
  12. package/dist/cli/codex-config.js +5 -0
  13. package/dist/cli/codex-config.js.map +1 -0
  14. package/dist/cli/codex-hook.d.ts +18 -0
  15. package/dist/cli/codex-hook.d.ts.map +1 -0
  16. package/dist/cli/codex-hook.js +140 -0
  17. package/dist/cli/codex-hook.js.map +1 -0
  18. package/dist/cli/codex-session.d.ts +3 -0
  19. package/dist/cli/codex-session.d.ts.map +1 -0
  20. package/dist/cli/codex-session.js +3 -0
  21. package/dist/cli/codex-session.js.map +1 -0
  22. package/dist/cli/flush-command.d.ts +6 -0
  23. package/dist/cli/flush-command.d.ts.map +1 -0
  24. package/dist/cli/flush-command.js +30 -0
  25. package/dist/cli/flush-command.js.map +1 -0
  26. package/dist/cli/host-launch.d.ts +28 -0
  27. package/dist/cli/host-launch.d.ts.map +1 -0
  28. package/dist/cli/host-launch.js +16 -0
  29. package/dist/cli/host-launch.js.map +1 -0
  30. package/dist/cli/host-process.d.ts +3 -0
  31. package/dist/cli/host-process.d.ts.map +1 -0
  32. package/dist/cli/host-process.js +35 -0
  33. package/dist/cli/host-process.js.map +1 -0
  34. package/dist/cli/host-session.d.ts +22 -0
  35. package/dist/cli/host-session.d.ts.map +1 -0
  36. package/dist/cli/host-session.js +204 -0
  37. package/dist/cli/host-session.js.map +1 -0
  38. package/dist/cli/import-command.d.ts +20 -0
  39. package/dist/cli/import-command.d.ts.map +1 -0
  40. package/dist/cli/import-command.js +98 -0
  41. package/dist/cli/import-command.js.map +1 -0
  42. package/dist/cli/interactive-process.d.ts +3 -0
  43. package/dist/cli/interactive-process.d.ts.map +1 -0
  44. package/dist/cli/interactive-process.js +15 -0
  45. package/dist/cli/interactive-process.js.map +1 -0
  46. package/dist/cli/main.d.ts +3 -0
  47. package/dist/cli/main.d.ts.map +1 -0
  48. package/dist/cli/main.js +151 -0
  49. package/dist/cli/main.js.map +1 -0
  50. package/dist/cli/mcp-config.d.ts +16 -0
  51. package/dist/cli/mcp-config.d.ts.map +1 -0
  52. package/dist/cli/mcp-config.js +108 -0
  53. package/dist/cli/mcp-config.js.map +1 -0
  54. package/dist/cli/network-test.d.ts +4 -0
  55. package/dist/cli/network-test.d.ts.map +1 -0
  56. package/dist/cli/network-test.js +28 -0
  57. package/dist/cli/network-test.js.map +1 -0
  58. package/dist/cli/operations.d.ts +26 -0
  59. package/dist/cli/operations.d.ts.map +1 -0
  60. package/dist/cli/operations.js +55 -0
  61. package/dist/cli/operations.js.map +1 -0
  62. package/dist/cli/session-drain.d.ts +3 -0
  63. package/dist/cli/session-drain.d.ts.map +1 -0
  64. package/dist/cli/session-drain.js +34 -0
  65. package/dist/cli/session-drain.js.map +1 -0
  66. package/dist/cli/storage-paths.d.ts +4 -0
  67. package/dist/cli/storage-paths.d.ts.map +1 -0
  68. package/dist/cli/storage-paths.js +15 -0
  69. package/dist/cli/storage-paths.js.map +1 -0
  70. package/dist/cli/tui-integrations.d.ts +4 -0
  71. package/dist/cli/tui-integrations.d.ts.map +1 -0
  72. package/dist/cli/tui-integrations.js +143 -0
  73. package/dist/cli/tui-integrations.js.map +1 -0
  74. package/dist/cli/tui-prompts.d.ts +22 -0
  75. package/dist/cli/tui-prompts.d.ts.map +1 -0
  76. package/dist/cli/tui-prompts.js +64 -0
  77. package/dist/cli/tui-prompts.js.map +1 -0
  78. package/dist/cli/tui-settings.d.ts +21 -0
  79. package/dist/cli/tui-settings.d.ts.map +1 -0
  80. package/dist/cli/tui-settings.js +198 -0
  81. package/dist/cli/tui-settings.js.map +1 -0
  82. package/dist/cli/tui.d.ts +4 -0
  83. package/dist/cli/tui.d.ts.map +1 -0
  84. package/dist/cli/tui.js +292 -0
  85. package/dist/cli/tui.js.map +1 -0
  86. package/dist/cli/work-config.d.ts +24 -0
  87. package/dist/cli/work-config.d.ts.map +1 -0
  88. package/dist/cli/work-config.js +147 -0
  89. package/dist/cli/work-config.js.map +1 -0
  90. package/dist/config/config.d.ts +41 -0
  91. package/dist/config/config.d.ts.map +1 -0
  92. package/dist/config/config.js +193 -0
  93. package/dist/config/config.js.map +1 -0
  94. package/dist/config/private-env.d.ts +8 -0
  95. package/dist/config/private-env.d.ts.map +1 -0
  96. package/dist/config/private-env.js +38 -0
  97. package/dist/config/private-env.js.map +1 -0
  98. package/dist/config/runtime.d.ts +32 -0
  99. package/dist/config/runtime.d.ts.map +1 -0
  100. package/dist/config/runtime.js +85 -0
  101. package/dist/config/runtime.js.map +1 -0
  102. package/dist/core/contracts/errors.d.ts +10 -0
  103. package/dist/core/contracts/errors.d.ts.map +1 -0
  104. package/dist/core/contracts/errors.js +23 -0
  105. package/dist/core/contracts/errors.js.map +1 -0
  106. package/dist/core/safety/external-preflight.d.ts +7 -0
  107. package/dist/core/safety/external-preflight.d.ts.map +1 -0
  108. package/dist/core/safety/external-preflight.js +47 -0
  109. package/dist/core/safety/external-preflight.js.map +1 -0
  110. package/dist/core/safety/redaction.d.ts +2 -0
  111. package/dist/core/safety/redaction.d.ts.map +1 -0
  112. package/dist/core/safety/redaction.js +4 -0
  113. package/dist/core/safety/redaction.js.map +1 -0
  114. package/dist/core/safety/rules.d.ts +6 -0
  115. package/dist/core/safety/rules.d.ts.map +1 -0
  116. package/dist/core/safety/rules.js +14 -0
  117. package/dist/core/safety/rules.js.map +1 -0
  118. package/dist/core/safety/scanner.d.ts +11 -0
  119. package/dist/core/safety/scanner.d.ts.map +1 -0
  120. package/dist/core/safety/scanner.js +18 -0
  121. package/dist/core/safety/scanner.js.map +1 -0
  122. package/dist/core/transaction/fsync.d.ts +6 -0
  123. package/dist/core/transaction/fsync.d.ts.map +1 -0
  124. package/dist/core/transaction/fsync.js +41 -0
  125. package/dist/core/transaction/fsync.js.map +1 -0
  126. package/dist/index.d.ts +16 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +13 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/mcp/ingress.d.ts +61 -0
  131. package/dist/mcp/ingress.d.ts.map +1 -0
  132. package/dist/mcp/ingress.js +134 -0
  133. package/dist/mcp/ingress.js.map +1 -0
  134. package/dist/mcp/server.d.ts +4 -0
  135. package/dist/mcp/server.d.ts.map +1 -0
  136. package/dist/mcp/server.js +92 -0
  137. package/dist/mcp/server.js.map +1 -0
  138. package/dist/mcp/stdio.d.ts +5 -0
  139. package/dist/mcp/stdio.d.ts.map +1 -0
  140. package/dist/mcp/stdio.js +115 -0
  141. package/dist/mcp/stdio.js.map +1 -0
  142. package/dist/memory-manager/contracts/diagnostic.d.ts +14 -0
  143. package/dist/memory-manager/contracts/diagnostic.d.ts.map +1 -0
  144. package/dist/memory-manager/contracts/diagnostic.js +17 -0
  145. package/dist/memory-manager/contracts/diagnostic.js.map +1 -0
  146. package/dist/memory-manager/contracts/disclosure.d.ts +12 -0
  147. package/dist/memory-manager/contracts/disclosure.d.ts.map +1 -0
  148. package/dist/memory-manager/contracts/disclosure.js +8 -0
  149. package/dist/memory-manager/contracts/disclosure.js.map +1 -0
  150. package/dist/memory-manager/contracts/errors.d.ts +15 -0
  151. package/dist/memory-manager/contracts/errors.d.ts.map +1 -0
  152. package/dist/memory-manager/contracts/errors.js +25 -0
  153. package/dist/memory-manager/contracts/errors.js.map +1 -0
  154. package/dist/memory-manager/contracts/model-port.d.ts +38 -0
  155. package/dist/memory-manager/contracts/model-port.d.ts.map +1 -0
  156. package/dist/memory-manager/contracts/model-port.js +2 -0
  157. package/dist/memory-manager/contracts/model-port.js.map +1 -0
  158. package/dist/memory-manager/network/client.d.ts +13 -0
  159. package/dist/memory-manager/network/client.d.ts.map +1 -0
  160. package/dist/memory-manager/network/client.js +122 -0
  161. package/dist/memory-manager/network/client.js.map +1 -0
  162. package/dist/memory-manager/network/route.d.ts +31 -0
  163. package/dist/memory-manager/network/route.d.ts.map +1 -0
  164. package/dist/memory-manager/network/route.js +148 -0
  165. package/dist/memory-manager/network/route.js.map +1 -0
  166. package/dist/memory-manager/openai/abort.d.ts +4 -0
  167. package/dist/memory-manager/openai/abort.d.ts.map +1 -0
  168. package/dist/memory-manager/openai/abort.js +19 -0
  169. package/dist/memory-manager/openai/abort.js.map +1 -0
  170. package/dist/memory-manager/openai/bounded-body.d.ts +2 -0
  171. package/dist/memory-manager/openai/bounded-body.d.ts.map +1 -0
  172. package/dist/memory-manager/openai/bounded-body.js +49 -0
  173. package/dist/memory-manager/openai/bounded-body.js.map +1 -0
  174. package/dist/memory-manager/openai/openai-chat-adapter.d.ts +16 -0
  175. package/dist/memory-manager/openai/openai-chat-adapter.d.ts.map +1 -0
  176. package/dist/memory-manager/openai/openai-chat-adapter.js +51 -0
  177. package/dist/memory-manager/openai/openai-chat-adapter.js.map +1 -0
  178. package/dist/memory-manager/openai/openai-responses-adapter.d.ts +15 -0
  179. package/dist/memory-manager/openai/openai-responses-adapter.d.ts.map +1 -0
  180. package/dist/memory-manager/openai/openai-responses-adapter.js +14 -0
  181. package/dist/memory-manager/openai/openai-responses-adapter.js.map +1 -0
  182. package/dist/memory-manager/openai/options.d.ts +14 -0
  183. package/dist/memory-manager/openai/options.d.ts.map +1 -0
  184. package/dist/memory-manager/openai/options.js +29 -0
  185. package/dist/memory-manager/openai/options.js.map +1 -0
  186. package/dist/memory-manager/openai/remote-http.d.ts +33 -0
  187. package/dist/memory-manager/openai/remote-http.d.ts.map +1 -0
  188. package/dist/memory-manager/openai/remote-http.js +207 -0
  189. package/dist/memory-manager/openai/remote-http.js.map +1 -0
  190. package/dist/memory-manager/openai/response-decoder.d.ts +3 -0
  191. package/dist/memory-manager/openai/response-decoder.d.ts.map +1 -0
  192. package/dist/memory-manager/openai/response-decoder.js +57 -0
  193. package/dist/memory-manager/openai/response-decoder.js.map +1 -0
  194. package/dist/memory-manager/openai/retry.d.ts +8 -0
  195. package/dist/memory-manager/openai/retry.d.ts.map +1 -0
  196. package/dist/memory-manager/openai/retry.js +18 -0
  197. package/dist/memory-manager/openai/retry.js.map +1 -0
  198. package/dist/pi-extension/extraction-runtime.d.ts +51 -0
  199. package/dist/pi-extension/extraction-runtime.d.ts.map +1 -0
  200. package/dist/pi-extension/extraction-runtime.js +87 -0
  201. package/dist/pi-extension/extraction-runtime.js.map +1 -0
  202. package/dist/pi-extension/index.d.ts +19 -0
  203. package/dist/pi-extension/index.d.ts.map +1 -0
  204. package/dist/pi-extension/index.js +172 -0
  205. package/dist/pi-extension/index.js.map +1 -0
  206. package/dist/v2/canonical.d.ts +53 -0
  207. package/dist/v2/canonical.d.ts.map +1 -0
  208. package/dist/v2/canonical.js +321 -0
  209. package/dist/v2/canonical.js.map +1 -0
  210. package/dist/v2/contract.d.ts +34 -0
  211. package/dist/v2/contract.d.ts.map +1 -0
  212. package/dist/v2/contract.js +53 -0
  213. package/dist/v2/contract.js.map +1 -0
  214. package/dist/v2/document-import.d.ts +100 -0
  215. package/dist/v2/document-import.d.ts.map +1 -0
  216. package/dist/v2/document-import.js +259 -0
  217. package/dist/v2/document-import.js.map +1 -0
  218. package/dist/v2/errors.d.ts +6 -0
  219. package/dist/v2/errors.d.ts.map +1 -0
  220. package/dist/v2/errors.js +29 -0
  221. package/dist/v2/errors.js.map +1 -0
  222. package/dist/v2/import.d.ts +26 -0
  223. package/dist/v2/import.d.ts.map +1 -0
  224. package/dist/v2/import.js +48 -0
  225. package/dist/v2/import.js.map +1 -0
  226. package/dist/v2/lock.d.ts +3 -0
  227. package/dist/v2/lock.d.ts.map +1 -0
  228. package/dist/v2/lock.js +47 -0
  229. package/dist/v2/lock.js.map +1 -0
  230. package/dist/v2/memory-maintainer.md +38 -0
  231. package/dist/v2/read-guidance.d.ts +3 -0
  232. package/dist/v2/read-guidance.d.ts.map +1 -0
  233. package/dist/v2/read-guidance.js +3 -0
  234. package/dist/v2/read-guidance.js.map +1 -0
  235. package/dist/v2/reader.d.ts +25 -0
  236. package/dist/v2/reader.d.ts.map +1 -0
  237. package/dist/v2/reader.js +38 -0
  238. package/dist/v2/reader.js.map +1 -0
  239. package/dist/v2/registry.d.ts +14 -0
  240. package/dist/v2/registry.d.ts.map +1 -0
  241. package/dist/v2/registry.js +46 -0
  242. package/dist/v2/registry.js.map +1 -0
  243. package/dist/v2/runtime.d.ts +133 -0
  244. package/dist/v2/runtime.d.ts.map +1 -0
  245. package/dist/v2/runtime.js +326 -0
  246. package/dist/v2/runtime.js.map +1 -0
  247. package/dist/v2/session-drain.d.ts +14 -0
  248. package/dist/v2/session-drain.d.ts.map +1 -0
  249. package/dist/v2/session-drain.js +16 -0
  250. package/dist/v2/session-drain.js.map +1 -0
  251. package/dist/v2/session.d.ts +54 -0
  252. package/dist/v2/session.d.ts.map +1 -0
  253. package/dist/v2/session.js +158 -0
  254. package/dist/v2/session.js.map +1 -0
  255. package/dist/v2/writer.d.ts +40 -0
  256. package/dist/v2/writer.d.ts.map +1 -0
  257. package/dist/v2/writer.js +327 -0
  258. package/dist/v2/writer.js.map +1 -0
  259. package/docs/00-index.md +19 -0
  260. package/docs/03-target-architecture.md +49 -0
  261. package/docs/init-v0.1-closeout.md +152 -0
  262. package/docs/init-v0.1-design.md +237 -0
  263. package/docs/init-v0.1-verification.md +303 -0
  264. package/docs/outbound-network-design.md +100 -0
  265. package/docs/outbound-network-verification.json +300 -0
  266. package/docs/provider-verification.md +94 -0
  267. package/docs/releasing.md +138 -0
  268. package/docs/session-integration.md +134 -0
  269. package/docs/tui-workbench.md +173 -0
  270. package/docs/usage.md +815 -0
  271. package/docs/v2-ablation-results.json +12035 -0
  272. package/docs/v2-ablation.md +117 -0
  273. package/docs/v2-evaluation-repeat-results.json +7 -0
  274. package/docs/v2-evaluation-scripted-results.json +67 -0
  275. package/docs/v2-evaluation.md +35 -0
  276. package/docs/v2-optimization-plan.md +23 -0
  277. package/docs/v2-performance-baseline-runtime.js.txt +231 -0
  278. package/docs/v2-performance-baseline.json +338 -0
  279. package/docs/v2-performance-behavior-equivalence.json +17 -0
  280. package/docs/v2-performance-results.json +585 -0
  281. package/docs/v2-performance.md +88 -0
  282. package/docs/v2-replacement-test-map.md +14 -0
  283. package/docs/v2-verification.md +49 -0
  284. package/package.json +87 -0
@@ -0,0 +1,321 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { closeSync, constants, existsSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ export function digest(content) { return createHash('sha256').update(content).digest('hex'); }
5
+ export function syncDirectory(path) { if (process.platform === 'win32')
6
+ return; const fd = openSync(path, 'r'); try {
7
+ fsyncSync(fd);
8
+ }
9
+ finally {
10
+ closeSync(fd);
11
+ } }
12
+ /** Reject symlinks in every existing ancestor, including the configured root. */
13
+ export function safeDirectory(path) {
14
+ const absolute = resolve(path);
15
+ const parent = dirname(absolute);
16
+ if (parent !== absolute)
17
+ safeDirectory(parent);
18
+ if (!existsSync(absolute)) {
19
+ try {
20
+ mkdirSync(absolute, { mode: 0o700 });
21
+ syncDirectory(parent);
22
+ }
23
+ catch (error) {
24
+ if (!existsSync(absolute))
25
+ throw error;
26
+ }
27
+ }
28
+ const stat = lstatSync(absolute);
29
+ if (stat.isSymbolicLink() || !stat.isDirectory())
30
+ throw new Error('Unsafe directory');
31
+ }
32
+ /** Validate existing ancestors without creating storage on consumer read paths. */
33
+ function existingDirectory(path) {
34
+ const absolute = resolve(path);
35
+ const parent = dirname(absolute);
36
+ if (parent !== absolute && !existingDirectory(parent))
37
+ return false;
38
+ try {
39
+ const stat = lstatSync(absolute);
40
+ if (stat.isSymbolicLink() || !stat.isDirectory())
41
+ throw new Error('Unsafe directory');
42
+ return true;
43
+ }
44
+ catch (error) {
45
+ if (error.code === 'ENOENT')
46
+ return false;
47
+ throw error;
48
+ }
49
+ }
50
+ export function readRegular(path, options = {}) {
51
+ if (options.createParents === false) {
52
+ if (!existingDirectory(dirname(path)))
53
+ return null;
54
+ }
55
+ else
56
+ safeDirectory(dirname(path));
57
+ try {
58
+ const stat = lstatSync(path);
59
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1 || stat.size > 1024 * 1024)
60
+ throw new Error('Unsafe file');
61
+ }
62
+ catch (error) {
63
+ if (error.code === 'ENOENT')
64
+ return null;
65
+ throw error;
66
+ }
67
+ const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
68
+ try {
69
+ const stat = fstatSync(fd);
70
+ if (!stat.isFile() || stat.nlink !== 1 || stat.size > 1024 * 1024)
71
+ throw new Error('Unsafe file');
72
+ return readFileSync(fd, 'utf8');
73
+ }
74
+ finally {
75
+ closeSync(fd);
76
+ }
77
+ }
78
+ export function atomicWrite(path, content) {
79
+ readRegular(path);
80
+ const temporary = join(dirname(path), `.write-${randomUUID()}`);
81
+ const fd = openSync(temporary, 'wx', 0o600);
82
+ try {
83
+ writeFileSync(fd, content);
84
+ fsyncSync(fd);
85
+ }
86
+ finally {
87
+ closeSync(fd);
88
+ }
89
+ renameSync(temporary, path);
90
+ syncDirectory(dirname(path));
91
+ }
92
+ function hashFile(path) { const content = readRegular(path); return content === null ? 'missing' : digest(content); }
93
+ function parse(content, expectedTitle, hardLimitBytes) {
94
+ if (Buffer.byteLength(content) > hardLimitBytes)
95
+ throw new Error('Document hard limit exceeded');
96
+ const lines = content.match(/[^\n]*\n|[^\n]+$/g) ?? [];
97
+ let offset = 0;
98
+ let fence;
99
+ let h1 = false;
100
+ const sections = [];
101
+ const titles = new Set();
102
+ for (const line of lines) {
103
+ const text = line.replace(/\r?\n$/, '');
104
+ const marker = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(text);
105
+ if (marker) {
106
+ const token = marker[1];
107
+ if (!fence)
108
+ fence = { char: token[0], size: token.length };
109
+ else if (token[0] === fence.char && token.length >= fence.size && !marker[2].trim())
110
+ fence = undefined;
111
+ offset += line.length;
112
+ continue;
113
+ }
114
+ if (!fence) {
115
+ if (/^ {0,3}#(?:\s|$)/.test(text)) {
116
+ if (h1 || offset !== 0 || text !== `# ${expectedTitle}`)
117
+ throw new Error('Invalid document H1');
118
+ h1 = true;
119
+ }
120
+ else if (/^ {0,3}##(?:\s|$)/.test(text)) {
121
+ const match = /^## ([^\r\n]+)$/.exec(text);
122
+ const title = match?.[1];
123
+ if (!h1 || !title || title.trim() !== title || titles.has(title))
124
+ throw new Error('Invalid or duplicate section');
125
+ titles.add(title);
126
+ if (sections.length)
127
+ sections.at(-1).end = offset;
128
+ sections.push({ ref: `s${sections.length + 1}`, title, body: '', start: offset, end: content.length });
129
+ }
130
+ else if (!sections.length && text.trim())
131
+ throw new Error('Content outside sections');
132
+ else if (/^ {0,3}(?:=+|-+)\s*$/.test(text) && text.trim().length > 0 && sections.length)
133
+ throw new Error('Setext headings are not supported');
134
+ }
135
+ offset += line.length;
136
+ }
137
+ if (!h1 || fence)
138
+ throw new Error('Invalid Markdown structure');
139
+ for (const section of sections) {
140
+ const newline = content.indexOf('\n', section.start);
141
+ section.body = newline < 0 ? '' : content.slice(newline + 1, section.end);
142
+ }
143
+ return sections;
144
+ }
145
+ export function targetInfo(target) {
146
+ if (target === 'profile')
147
+ return { relative: 'memory/profile.md', title: 'Profile' };
148
+ if (target === 'preferences')
149
+ return { relative: 'memory/preferences.md', title: 'Preferences' };
150
+ const match = /^project:([A-Za-z0-9_-]{1,128})$/.exec(target);
151
+ if (!match)
152
+ throw new Error('Invalid target');
153
+ return { relative: `memory/projects/${match[1]}.md`, title: 'Project' };
154
+ }
155
+ export class CanonicalStore {
156
+ root;
157
+ hardLimitBytes;
158
+ #checkpoint;
159
+ constructor(dataRoot, options = {}) { this.hardLimitBytes = options.hardLimitBytes ?? 16384; if (!Number.isSafeInteger(this.hardLimitBytes) || this.hardLimitBytes < 64 || this.hardLimitBytes > 1048576)
160
+ throw new Error('Invalid document limit'); this.#checkpoint = options.checkpoint ?? (() => { }); this.root = resolve(dataRoot); safeDirectory(this.root); for (const path of ['memory/projects', 'runtime/receipts', 'runtime/transactions'])
161
+ safeDirectory(join(this.root, path)); }
162
+ snapshot(projectIds = []) {
163
+ return [...new Set(['profile', 'preferences', ...projectIds.map(id => `project:${id}`)])].map(target => {
164
+ const info = targetInfo(target);
165
+ const path = join(this.root, info.relative);
166
+ const raw = readRegular(path);
167
+ const content = raw ?? `# ${info.title}\n\n`;
168
+ return { target, path, content, hash: raw === null ? 'missing' : digest(raw), sections: parse(content, info.title, this.hardLimitBytes).map(({ ref, title, body }) => ({ ref, title, body })) };
169
+ });
170
+ }
171
+ apply(snapshot, operations) {
172
+ const updates = new Map();
173
+ const grouped = new Map();
174
+ for (const operation of operations) {
175
+ if (!snapshot.some(doc => doc.target === operation.target))
176
+ throw new Error('Unauthorized target');
177
+ const group = grouped.get(operation.target) ?? [];
178
+ group.push(operation);
179
+ grouped.set(operation.target, group);
180
+ }
181
+ for (const [target, group] of grouped) {
182
+ const doc = snapshot.find(item => item.target === target);
183
+ const info = targetInfo(target);
184
+ const sections = parse(doc.content, info.title, this.hardLimitBytes);
185
+ const edits = [];
186
+ const touched = new Set();
187
+ let appended = '';
188
+ for (const operation of group) {
189
+ const section = operation.section === null ? undefined : sections.find(item => item.ref === operation.section);
190
+ if (operation.section !== null && (!section || touched.has(operation.section)))
191
+ throw new Error('Invalid or duplicate section reference');
192
+ if (section)
193
+ touched.add(section.ref);
194
+ if (operation.op === 'remove_section') {
195
+ if (!section)
196
+ throw new Error('Removal requires section');
197
+ edits.push({ start: section.start, end: section.end, text: '' });
198
+ }
199
+ else if (operation.op === 'put_section') {
200
+ const { title, body } = operation;
201
+ if (!title || title.trim() !== title || /[\r\n]/.test(title) || body === undefined)
202
+ throw new Error('Invalid section payload');
203
+ const text = `## ${title}\n${body}${body.endsWith('\n') ? '' : '\n'}`;
204
+ const validation = parse(`# ${info.title}\n\n${text}`, info.title, this.hardLimitBytes);
205
+ if (validation.length !== 1)
206
+ throw new Error('Undeclared section in body');
207
+ if (section)
208
+ edits.push({ start: section.start, end: section.end, text });
209
+ else
210
+ appended += text;
211
+ }
212
+ else
213
+ throw new Error('Invalid operation');
214
+ }
215
+ let result = doc.content;
216
+ for (const edit of edits.sort((a, b) => b.start - a.start))
217
+ result = result.slice(0, edit.start) + edit.text + result.slice(edit.end);
218
+ if (appended)
219
+ result += (result.endsWith('\n') ? '' : '\n') + appended;
220
+ parse(result, info.title, this.hardLimitBytes);
221
+ updates.set(target, result);
222
+ }
223
+ return updates;
224
+ }
225
+ commit(snapshot, updates, receipt, beforePublish = () => { }) {
226
+ if (!/^[A-Za-z0-9_-]{1,128}$/.test(receipt.id))
227
+ throw new Error('Invalid receipt id');
228
+ this.recover();
229
+ for (const doc of snapshot) {
230
+ const path = join(this.root, targetInfo(doc.target).relative);
231
+ if (doc.path !== path || hashFile(path) !== doc.hash)
232
+ throw new Error('STALE_REVISION');
233
+ }
234
+ const receiptPath = `runtime/receipts/${receipt.id}.json`;
235
+ if (readRegular(join(this.root, receiptPath)) !== null)
236
+ throw new Error('Receipt already committed');
237
+ const files = [];
238
+ for (const [target, content] of updates) {
239
+ if (!snapshot.some(doc => doc.target === target))
240
+ throw new Error('Unauthorized target');
241
+ const info = targetInfo(target);
242
+ parse(content, info.title, this.hardLimitBytes);
243
+ files.push({ path: info.relative, content });
244
+ }
245
+ files.push({ path: receiptPath, content: JSON.stringify(receipt) + '\n' });
246
+ const id = randomUUID();
247
+ const directory = join(this.root, 'runtime/transactions', id);
248
+ safeDirectory(directory);
249
+ const journal = { id, files: files.map((file, index) => { const stage = `stage-${index}`; atomicWrite(join(directory, stage), file.content); return { path: file.path, stage, before: snapshot.find(doc => targetInfo(doc.target).relative === file.path)?.hash ?? 'missing', after: digest(file.content) }; }) };
250
+ atomicWrite(join(directory, 'journal.json'), JSON.stringify(journal));
251
+ this.#checkpoint('staged');
252
+ for (const doc of snapshot)
253
+ if (hashFile(doc.path) !== doc.hash)
254
+ throw new Error('STALE_REVISION');
255
+ beforePublish();
256
+ atomicWrite(join(directory, 'COMMITTING'), 'v2\n');
257
+ this.#checkpoint('commit-marker');
258
+ this.recover();
259
+ }
260
+ recover() {
261
+ const root = join(this.root, 'runtime/transactions');
262
+ safeDirectory(root);
263
+ for (const id of readdirSync(root)) {
264
+ if (/^done\.[a-f0-9-]{36}$/.test(id)) {
265
+ const completed = join(root, id);
266
+ safeDirectory(completed);
267
+ rmSync(completed, { recursive: true });
268
+ syncDirectory(root);
269
+ continue;
270
+ }
271
+ if (!/^[a-f0-9-]{36}$/.test(id))
272
+ throw new Error('Unsafe transaction identity');
273
+ const directory = join(root, id);
274
+ safeDirectory(directory);
275
+ const marker = readRegular(join(directory, 'COMMITTING'));
276
+ if (marker === null) {
277
+ rmSync(directory, { recursive: true });
278
+ syncDirectory(root);
279
+ continue;
280
+ }
281
+ if (marker !== 'v2\n')
282
+ throw new Error('Invalid commit marker');
283
+ const journal = JSON.parse(readRegular(join(directory, 'journal.json')) ?? 'null');
284
+ if (!journal || journal.id !== id || !Array.isArray(journal.files) || !journal.files.length)
285
+ throw new Error('Invalid transaction');
286
+ const paths = new Set();
287
+ for (const file of journal.files) {
288
+ if (!file || typeof file.path !== 'string' || typeof file.stage !== 'string' || !/^(?:missing|[a-f0-9]{64})$/.test(file.before) || !/^[a-f0-9]{64}$/.test(file.after) || !/^(?:memory\/(?:profile|preferences)\.md|memory\/projects\/[A-Za-z0-9_-]{1,128}\.md|runtime\/receipts\/[A-Za-z0-9_-]{1,128}\.json)$/.test(file.path) || !/^stage-\d+$/.test(file.stage) || paths.has(file.path))
289
+ throw new Error('Unsafe transaction path');
290
+ paths.add(file.path);
291
+ const staged = readRegular(join(directory, file.stage));
292
+ if (staged === null || digest(staged) !== file.after)
293
+ throw new Error('Corrupt transaction');
294
+ const current = hashFile(join(this.root, file.path));
295
+ if (current !== file.before && current !== file.after)
296
+ throw new Error('Recovery conflict: external modification');
297
+ }
298
+ for (const file of journal.files) {
299
+ const path = join(this.root, file.path);
300
+ if (hashFile(path) !== file.after) {
301
+ atomicWrite(path, readRegular(join(directory, file.stage)));
302
+ this.#checkpoint(`target:${file.path}`);
303
+ }
304
+ }
305
+ this.#checkpoint('before-cleanup');
306
+ const completed = join(root, `done.${id}`);
307
+ renameSync(directory, completed);
308
+ syncDirectory(root);
309
+ rmSync(completed, { recursive: true });
310
+ syncDirectory(root);
311
+ }
312
+ }
313
+ receipts() {
314
+ const root = join(this.root, 'runtime/receipts');
315
+ safeDirectory(root);
316
+ return readdirSync(root).map(name => { if (!/^[A-Za-z0-9_-]{1,128}\.json$/.test(name))
317
+ throw new Error('Unsafe receipt'); const value = JSON.parse(readRegular(join(root, name))); if (value.id !== name.slice(0, -5))
318
+ throw new Error('Invalid receipt'); return value; });
319
+ }
320
+ }
321
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/v2/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/K,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOnD,MAAM,UAAU,MAAM,CAAC,OAAe,IAAY,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9G,MAAM,UAAU,aAAa,CAAC,IAAY,IAAU,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;IAAE,OAAO,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAAC,CAAC;QAAS,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAAC,CAAC,CAAC,CAAC;AACjL,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjE,IAAI,MAAM,KAAK,QAAQ;QAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC;YAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,MAAM,KAAK,CAAC;QAAC,CAAC;IAAC,CAAC;IAC7J,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAAC,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAC1H,CAAC;AACD,mFAAmF;AACnF,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjE,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;AACxG,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,UAAuC,EAAE;IACjF,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAAC,CAAC;;QACvF,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC;QAAC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IAAC,CAAC;IACjK,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IACnG,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAAC,IAAI,CAAC;QAAC,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAAC,OAAO,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;YAAS,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AAC1Q,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe;IACvD,WAAW,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,UAAU,EAAE,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAChI,IAAI,CAAC;QAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;YAAS,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAC7E,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AACD,SAAS,QAAQ,CAAC,IAAY,IAAY,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACrI,SAAS,KAAK,CAAC,OAAe,EAAE,aAAqB,EAAE,cAAsB;IAC3E,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;IAAC,IAAI,MAAM,GAAG,CAAC,CAAC;IAAC,IAAI,KAAiD,CAAC;IAAC,IAAI,EAAE,GAAG,KAAK,CAAC;IAC9I,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAAC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACvE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAAC,MAAM,MAAM,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/F,IAAI,MAAM,EAAE,CAAC;YAAC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YAAC,IAAI,CAAC,KAAK;gBAAE,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;iBAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;gBAAE,KAAK,GAAG,SAAS,CAAC;YAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QAChP,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAC,IAAI,EAAE,IAAI,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,aAAa,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBAAC,EAAE,GAAG,IAAI,CAAC;YAAC,CAAC;iBAC7I,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAC,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBACxL,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAAC,IAAI,QAAQ,CAAC,MAAM;oBAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,MAAM,CAAC;gBACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACzG,CAAC;iBAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;iBACnF,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAChJ,CAAC;QACD,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,EAAE,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IACpK,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACrF,IAAI,MAAM,KAAK,aAAa;QAAE,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IACjG,MAAM,KAAK,GAAG,kCAAkC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7G,OAAO,EAAE,QAAQ,EAAE,mBAAmB,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,OAAO,cAAc;IAChB,IAAI,CAAS;IACb,cAAc,CAAS;IACvB,WAAW,CAA0B;IAC9C,YAAY,QAAgB,EAAE,UAAiC,EAAE,IAAI,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,cAAc,GAAG,EAAE,IAAI,IAAI,CAAC,cAAc,GAAG,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,sBAAsB,CAAC;QAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7f,QAAQ,CAAC,aAAuB,EAAE;QAChC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACrG,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAAC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC,KAAK,MAAM,CAAC;YAC1J,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAClM,CAAC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,QAA4B,EAAE,UAA8B;QAChE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAAC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;QACjG,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAAC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAC3P,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAE,CAAC;YAAC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAAC,MAAM,KAAK,GAAmD,EAAE,CAAC;YAAC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;YAC1R,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC/G,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBAAC,IAAI,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACjL,IAAI,SAAS,CAAC,EAAE,KAAK,gBAAgB,EAAE,CAAC;oBAAC,IAAI,CAAC,OAAO;wBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAAC,CAAC;qBAClK,IAAI,SAAS,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;oBACxC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;oBAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,SAAS;wBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;oBAClK,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACtE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,OAAO,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;oBAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;wBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;oBACpK,IAAI,OAAO;wBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;;wBAAM,QAAQ,IAAI,IAAI,CAAC;gBACnG,CAAC;;oBAAM,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;YAAC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChK,IAAI,QAAQ;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YACvE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,CAAC,QAA4B,EAAE,OAA4B,EAAE,OAA+C,EAAE,gBAA4B,GAAG,EAAE,GAAE,CAAC;QACtJ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACtF,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAAC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;YAAC,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAAC,CAAC;QACvL,MAAM,WAAW,GAAG,oBAAoB,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAChK,MAAM,KAAK,GAAwC,EAAE,CAAC;QACtD,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAAC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAAC,CAAC;QACtQ,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACjH,MAAM,OAAO,GAAY,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,MAAM,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3T,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClG,KAAK,MAAM,GAAG,IAAI,QAAQ;YAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACnG,aAAa,EAAE,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACxG,CAAC;IACD,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1E,KAAK,MAAM,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC5K,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC5I,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAC1D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC/F,IAAI,MAAM,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,IAAI,MAAM,CAAY,CAAC;YAC9F,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACpI,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;YAChC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,oIAAoI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5b,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACtJ,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAC,IAAI,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC3K,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAAC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;oBAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAE,CAAC,CAAC;oBAAC,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC;YAAC,CAAC;YAC5N,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACjK,CAAC;IACH,CAAC;IACD,QAAQ;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAE,CAAmB,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjS,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ import type { DocumentSnapshot } from './canonical.js';
2
+ export interface SectionOperation {
3
+ op: 'put_section' | 'remove_section';
4
+ target: string;
5
+ section: string | null;
6
+ title?: string;
7
+ body?: string;
8
+ }
9
+ interface CommonDecision {
10
+ applicability: 'global' | 'project' | 'uncertain';
11
+ confidence: number;
12
+ evidence: string[];
13
+ reason: string;
14
+ }
15
+ export type Decision = CommonDecision & ({
16
+ kind: 'retain';
17
+ admission: 'remember' | 'update' | 'correct';
18
+ lifetime: 'stable' | 'until_changed';
19
+ operations: SectionOperation[];
20
+ } | {
21
+ kind: 'forget' | 'maintain';
22
+ operations: SectionOperation[];
23
+ } | {
24
+ kind: 'ignore';
25
+ });
26
+ export interface MaintenanceDecision {
27
+ version: 'memory_maintenance_v2';
28
+ request_id: string;
29
+ decisions: Decision[];
30
+ }
31
+ export declare const maintenanceSchema: Readonly<Record<string, unknown>>;
32
+ export declare function validateDecision(body: unknown, requestId: string, documents: DocumentSnapshot[], evidenceScopes: Map<string, string>): MaintenanceDecision;
33
+ export {};
34
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/v2/contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,MAAM,WAAW,gBAAgB;IAAG,EAAE,EAAE,aAAa,GAAG,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AACjJ,UAAU,cAAc;IAAG,aAAa,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACtI,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,CACpC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAAC;IAAC,UAAU,EAAE,gBAAgB,EAAE,CAAA;CAAE,GACtI;IAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAAC,UAAU,EAAE,gBAAgB,EAAE,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CACrB,CAAC;AACF,MAAM,WAAW,mBAAmB;IAAG,OAAO,EAAE,uBAAuB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE;AAQpH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAS/D,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAC,MAAM,CAAC,GAAG,mBAAmB,CAuBzJ"}
@@ -0,0 +1,53 @@
1
+ import { Ajv2020 } from 'ajv/dist/2020.js';
2
+ // Explicit types on string const/enum fields preserve their value domain and satisfy strict remote schema parsers.
3
+ const string = { type: 'string' };
4
+ const operationSchema = { anyOf: [
5
+ { type: 'object', additionalProperties: false, required: ['op', 'target', 'section', 'title', 'body'], properties: { op: { type: 'string', const: 'put_section' }, target: string, section: { type: ['string', 'null'] }, title: string, body: string } },
6
+ { type: 'object', additionalProperties: false, required: ['op', 'target', 'section'], properties: { op: { type: 'string', const: 'remove_section' }, target: string, section: string } },
7
+ ] };
8
+ const common = { applicability: { type: 'string', enum: ['global', 'project', 'uncertain'] }, confidence: { type: 'number', minimum: 0, maximum: 1 }, evidence: { type: 'array', items: string, maxItems: 128 }, reason: { type: 'string', maxLength: 4000 } };
9
+ export const maintenanceSchema = {
10
+ type: 'object', additionalProperties: false, required: ['version', 'request_id', 'decisions'], properties: {
11
+ version: { type: 'string', const: 'memory_maintenance_v2' }, request_id: string,
12
+ decisions: { type: 'array', minItems: 1, maxItems: 64, items: { anyOf: [
13
+ { type: 'object', additionalProperties: false, required: ['kind', 'applicability', 'confidence', 'evidence', 'reason', 'admission', 'lifetime', 'operations'], properties: { ...common, kind: { type: 'string', const: 'retain' }, admission: { type: 'string', enum: ['remember', 'update', 'correct'] }, lifetime: { type: 'string', enum: ['stable', 'until_changed'] }, operations: { type: 'array', minItems: 1, maxItems: 32, items: operationSchema } } },
14
+ ...['forget', 'maintain'].map(kind => ({ type: 'object', additionalProperties: false, required: ['kind', 'applicability', 'confidence', 'evidence', 'reason', 'operations'], properties: { ...common, kind: { type: 'string', const: kind }, operations: { type: 'array', minItems: 1, maxItems: 32, items: operationSchema } } })),
15
+ { type: 'object', additionalProperties: false, required: ['kind', 'applicability', 'confidence', 'evidence', 'reason'], properties: { ...common, kind: { type: 'string', const: 'ignore' } } },
16
+ ] } },
17
+ },
18
+ };
19
+ const validate = new Ajv2020({ strict: false, allErrors: true }).compile(maintenanceSchema);
20
+ export function validateDecision(body, requestId, documents, evidenceScopes) {
21
+ if (!validate(body))
22
+ throw new Error('INVALID_DECISION');
23
+ const result = body;
24
+ if (result.request_id !== requestId)
25
+ throw new Error('INVALID_REQUEST_REFERENCE');
26
+ const touched = new Set();
27
+ for (const decision of result.decisions) {
28
+ if (decision.evidence.some(ref => !evidenceScopes.has(ref)))
29
+ throw new Error('INVALID_EVIDENCE_REFERENCE');
30
+ if ((decision.kind === 'retain' || decision.kind === 'forget') && !decision.evidence.length)
31
+ throw new Error('MISSING_EVIDENCE');
32
+ if (decision.kind === 'ignore')
33
+ continue;
34
+ for (const op of decision.operations) {
35
+ const doc = documents.find(doc => doc.target === op.target);
36
+ if (!doc || op.section !== null && !doc.sections.some(s => s.ref === op.section))
37
+ throw new Error('INVALID_TARGET_REFERENCE');
38
+ // Applicability describes the destination; evidence scopes describe origin only.
39
+ const projectTarget = op.target.startsWith('project:');
40
+ if (decision.applicability !== (projectTarget ? 'project' : 'global'))
41
+ throw new Error('UNAUTHORIZED_SCOPE');
42
+ // Check the whole batch, including maintain decisions with no evidence.
43
+ if (projectTarget && (!evidenceScopes.size || [...evidenceScopes.values()].some(scope => scope !== op.target)))
44
+ throw new Error('UNAUTHORIZED_SCOPE');
45
+ const key = `${op.target}\0${op.section ?? op.title}`;
46
+ if (touched.has(key))
47
+ throw new Error('DUPLICATE_SECTION_OPERATION');
48
+ touched.add(key);
49
+ }
50
+ }
51
+ return result;
52
+ }
53
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/v2/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import type { RuntimeStore } from './runtime.js';
2
+ /**
3
+ * Input preprocessing for a user-chosen local Markdown file. It reads, validates, and splits the
4
+ * material into structural chunks that the unchanged Writer receives as `document_import`
5
+ * observations. It never decides what is worth remembering, never summarizes, never strips
6
+ * headings, quotes, qualifiers or code, and never executes or follows anything in the file.
7
+ */
8
+ export declare const DOCUMENT_AUTHORS: readonly ["user", "agent", "third_party", "mixed", "unknown"];
9
+ export type DocumentAuthor = typeof DOCUMENT_AUTHORS[number];
10
+ /** One chunk must fit the same per-item budget as an Init understanding; the Writer request cap still applies. */
11
+ export declare const MAX_DOCUMENT_CHUNK_BYTES = 32768;
12
+ /** Whole-file cap for the first version: larger files are rejected up front, never truncated. */
13
+ export declare const MAX_DOCUMENT_BYTES = 262144;
14
+ export declare const DOCUMENT_EXTENSIONS: readonly [".md", ".markdown"];
15
+ /** Queue-key format of the chunk envelope; a change in chunking rules starts a new import rather than a stuck resume. */
16
+ export declare const DOCUMENT_IMPORT_FORMAT = "v1";
17
+ export interface MarkdownChunk {
18
+ headingPath: string[];
19
+ text: string;
20
+ }
21
+ export interface DocumentImportChunk {
22
+ importId: string;
23
+ sourceLabel: string;
24
+ declaredAuthor: DocumentAuthor;
25
+ fileName: string;
26
+ contentDigest: string;
27
+ part: {
28
+ index: number;
29
+ count: number;
30
+ };
31
+ headingPath: string[];
32
+ text: string;
33
+ }
34
+ export interface PreparedDocumentImport {
35
+ importId: string;
36
+ fileName: string;
37
+ bytes: number;
38
+ contentDigest: string;
39
+ sourceLabel: string;
40
+ declaredAuthor: DocumentAuthor;
41
+ chunks: {
42
+ entryId: string;
43
+ text: string;
44
+ headingPath: string[];
45
+ bytes: number;
46
+ }[];
47
+ }
48
+ /** Read one regular Markdown file: no symlinks, no directories, strict UTF-8, bounded size. */
49
+ export declare function readMarkdownFile(path: string): {
50
+ path: string;
51
+ fileName: string;
52
+ text: string;
53
+ bytes: number;
54
+ };
55
+ /**
56
+ * Split at Markdown structure only. A chunk is a run of whole paragraphs; headings start new units,
57
+ * fenced code is never split, blank lines inside fences are not boundaries. Sections stay whole when
58
+ * they fit. `headingPath` is the ancestor heading stack at the chunk start, so a chunk that begins
59
+ * under "## Examples" still says so. One unit larger than the budget rejects the whole import.
60
+ */
61
+ export declare function chunkMarkdown(text: string, budget?: number): MarkdownChunk[];
62
+ /** Deterministic envelope: identical content, label and author digest identically so retries deduplicate. */
63
+ export declare function encodeDocumentChunk(chunk: DocumentImportChunk): string;
64
+ export declare function decodeDocumentChunk(text: string): DocumentImportChunk | null;
65
+ /**
66
+ * Validate, chunk and safety-scan a file without touching any store. The import identity is the
67
+ * content digest: the same bytes under another name are the same import, changed bytes are a new one.
68
+ * The scan is the Writer's own outbound preflight run early, so a rejected file is reported before
69
+ * anything is queued (the Writer repeats it before any network call).
70
+ */
71
+ export declare function prepareDocumentImport(path: string, options?: {
72
+ label?: string | undefined;
73
+ author?: DocumentAuthor | undefined;
74
+ maxTotalBytes?: number | undefined;
75
+ }): PreparedDocumentImport;
76
+ /** The queue namespace for local Markdown imports; the same content into two scopes is two items. */
77
+ export declare function documentImportSession(importId: string, contextId: string): string;
78
+ /**
79
+ * Admit every chunk of one import in a single transaction and request a prompt flush, exactly like Init.
80
+ * Identity is the content digest within the scope: re-importing identical bytes (under any file name,
81
+ * label or declared author) is a duplicate of the existing material and queues nothing new; the
82
+ * original metadata stays. Different bytes are a different import.
83
+ */
84
+ export declare function admitDocumentImport(store: RuntimeStore, prepared: PreparedDocumentImport, contextId: string): {
85
+ importId: string;
86
+ duplicate: boolean;
87
+ parts: number;
88
+ };
89
+ export interface DocumentImportOutcome {
90
+ importId: string;
91
+ contextId: string;
92
+ complete: boolean;
93
+ parts: (import("./runtime.js").ObservationOutcome & {
94
+ part: number;
95
+ })[];
96
+ retainedIn: string[];
97
+ }
98
+ /** Per-part state without bodies; `complete` only when every part was processed. */
99
+ export declare function documentImportOutcome(store: RuntimeStore, importId: string, contextId: string, count: number): DocumentImportOutcome;
100
+ //# sourceMappingURL=document-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-import.d.ts","sourceRoot":"","sources":["../../src/v2/document-import.ts"],"names":[],"mappings":"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"}