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,6 @@
1
+ export declare function fsyncFile(path: string): void;
2
+ export declare function fileFsyncOpenMode(platform?: NodeJS.Platform): "r" | "r+";
3
+ export declare function persistDirectory(path: string, platform?: NodeJS.Platform): void;
4
+ export declare const fsyncDirectory: typeof persistDirectory;
5
+ export declare function publishFileAtomically(tempPath: string, targetPath: string, afterRename?: () => void): void;
6
+ //# sourceMappingURL=fsync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsync.d.ts","sourceRoot":"","sources":["../../../src/core/transaction/fsync.ts"],"names":[],"mappings":"AAIA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE5C;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,GAAG,GAAG,IAAI,CAA8C;AAIzI,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,IAAI,CAMjG;AACD,eAAO,MAAM,cAAc,yBAAmB,CAAC;AAE/C,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAK1G"}
@@ -0,0 +1,41 @@
1
+ import { closeSync, fsyncSync, openSync, renameSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { CoreError } from "../contracts/errors.js";
4
+ export function fsyncFile(path) {
5
+ const fd = openSync(path, fileFsyncOpenMode());
6
+ try {
7
+ fsyncSync(fd);
8
+ }
9
+ finally {
10
+ closeSync(fd);
11
+ }
12
+ }
13
+ // FlushFileBuffers on Windows requires a handle opened with write access.
14
+ export function fileFsyncOpenMode(platform = process.platform) { return platform === "win32" ? "r+" : "r"; }
15
+ // Node cannot fsync directory handles on Windows (fsyncSync returns EPERM).
16
+ // File fsync, atomic rename, and journal recovery still protect transaction integrity.
17
+ export function persistDirectory(path, platform = process.platform) {
18
+ if (platform === "win32")
19
+ return;
20
+ let fd;
21
+ try {
22
+ fd = openSync(path, "r");
23
+ fsyncSync(fd);
24
+ }
25
+ catch (error) {
26
+ throw new CoreError("STORE_UNAVAILABLE", "Directory durability is unavailable on this platform", { rule_id: "filesystem.directory_fsync", platform }, { cause: error });
27
+ }
28
+ finally {
29
+ if (fd !== undefined)
30
+ closeSync(fd);
31
+ }
32
+ }
33
+ export const fsyncDirectory = persistDirectory;
34
+ export function publishFileAtomically(tempPath, targetPath, afterRename) {
35
+ // rename is the only publish operation. Replacement failure is surfaced; no
36
+ // remove-then-rename fallback is allowed for an existing target.
37
+ renameSync(tempPath, targetPath);
38
+ afterRename?.();
39
+ persistDirectory(dirname(targetPath));
40
+ }
41
+ //# sourceMappingURL=fsync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsync.js","sourceRoot":"","sources":["../../../src/core/transaction/fsync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAAC,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;YAAS,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AACnG,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB,CAAC,WAA4B,OAAO,CAAC,QAAQ,IAAgB,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzI,4EAA4E;AAC5E,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,WAA4B,OAAO,CAAC,QAAQ;IACzF,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO;IACjC,IAAI,EAAsB,CAAC;IAC3B,IAAI,CAAC;QAAC,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAChD,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAE,sDAAsD,EAAE,EAAE,OAAO,EAAE,4BAA4B,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAAC,CAAC;YAClL,CAAC;QAAC,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AAClD,CAAC;AACD,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,UAAkB,EAAE,WAAwB;IAClG,4EAA4E;IAC5E,iEAAiE;IACjE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAAC,WAAW,EAAE,EAAE,CAAC;IAClD,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export { Writer } from "./v2/writer.js";
2
+ export { RuntimeStore } from "./v2/runtime.js";
3
+ export { CanonicalStore } from "./v2/canonical.js";
4
+ export { ProjectRegistry } from "./v2/registry.js";
5
+ export { readAuthorizedMemory, renderMemoryView, contextTargets, type MemoryView, type MemoryDocumentView } from "./v2/reader.js";
6
+ export { encodeAgentImport, decodeAgentImport, provenanceOf, isImportSource, IMPORT_BASES, AGENT_IMPORT_SOURCE, DOCUMENT_IMPORT_SOURCE, type AgentImportPayload, type ImportBasis, type ProvenanceKind } from "./v2/import.js";
7
+ export { prepareDocumentImport, chunkMarkdown, readMarkdownFile, admitDocumentImport, documentImportOutcome, encodeDocumentChunk, decodeDocumentChunk, DOCUMENT_AUTHORS, MAX_DOCUMENT_BYTES, MAX_DOCUMENT_CHUNK_BYTES, type DocumentAuthor, type DocumentImportChunk, type PreparedDocumentImport, type DocumentImportOutcome } from "./v2/document-import.js";
8
+ export { OpenAIResponsesMemoryModel, createOpenAIResponsesMemoryModel, normalizeOpenAICompatibleBaseUrl, type OpenAIResponsesMemoryModelOptions } from "./memory-manager/openai/openai-responses-adapter.js";
9
+ export type { MemoryModelPort, ApprovedModelRequest, MemoryModelResult, ModelUsage, ModelDiagnosticContext } from "./memory-manager/contracts/model-port.js";
10
+ export { configDirectory, configFilePath, envFilePath, defaultConfig, loadConfig, saveConfig, saveApiKeyToEnvFile, saveNetworkSecret, loadLocalEnv, resolveApiKey, validateConfig, type CommonMemoryConfig } from "./config/config.js";
11
+ export { createConfiguredMemoryModel, createConfiguredWriter, describeConfiguredNetwork, type ConfiguredModelOverrides } from "./config/runtime.js";
12
+ export { OpenAIChatMemoryModel, type OpenAIChatMemoryModelOptions } from "./memory-manager/openai/openai-chat-adapter.js";
13
+ export type { FailureDiagnostic, DiagnosticStage, DiagnosticReason } from "./memory-manager/contracts/diagnostic.js";
14
+ export type { ObservationOutcome, JobStatus } from "./v2/runtime.js";
15
+ export { SessionIngress, sessionKey, SESSION_CACHE_DEFAULTS, type SessionIdentity, type SessionMessage, type SessionTurnState, type SessionCacheOptions } from './v2/session.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAClI,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC/N,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,KAAK,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC/V,OAAO,EAAE,0BAA0B,EAAE,gCAAgC,EAAE,gCAAgC,EAAE,KAAK,iCAAiC,EAAE,MAAM,qDAAqD,CAAC;AAC7M,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAC7J,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACvO,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,KAAK,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpJ,OAAO,EAAE,qBAAqB,EAAE,KAAK,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAC1H,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACrH,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,sBAAsB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { Writer } from "./v2/writer.js";
2
+ export { RuntimeStore } from "./v2/runtime.js";
3
+ export { CanonicalStore } from "./v2/canonical.js";
4
+ export { ProjectRegistry } from "./v2/registry.js";
5
+ export { readAuthorizedMemory, renderMemoryView, contextTargets } from "./v2/reader.js";
6
+ export { encodeAgentImport, decodeAgentImport, provenanceOf, isImportSource, IMPORT_BASES, AGENT_IMPORT_SOURCE, DOCUMENT_IMPORT_SOURCE } from "./v2/import.js";
7
+ export { prepareDocumentImport, chunkMarkdown, readMarkdownFile, admitDocumentImport, documentImportOutcome, encodeDocumentChunk, decodeDocumentChunk, DOCUMENT_AUTHORS, MAX_DOCUMENT_BYTES, MAX_DOCUMENT_CHUNK_BYTES } from "./v2/document-import.js";
8
+ export { OpenAIResponsesMemoryModel, createOpenAIResponsesMemoryModel, normalizeOpenAICompatibleBaseUrl } from "./memory-manager/openai/openai-responses-adapter.js";
9
+ export { configDirectory, configFilePath, envFilePath, defaultConfig, loadConfig, saveConfig, saveApiKeyToEnvFile, saveNetworkSecret, loadLocalEnv, resolveApiKey, validateConfig } from "./config/config.js";
10
+ export { createConfiguredMemoryModel, createConfiguredWriter, describeConfiguredNetwork } from "./config/runtime.js";
11
+ export { OpenAIChatMemoryModel } from "./memory-manager/openai/openai-chat-adapter.js";
12
+ export { SessionIngress, sessionKey, SESSION_CACHE_DEFAULTS } from './v2/session.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,cAAc,EAA4C,MAAM,gBAAgB,CAAC;AAClI,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAkE,MAAM,gBAAgB,CAAC;AAC/N,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,wBAAwB,EAA0G,MAAM,yBAAyB,CAAC;AAC/V,OAAO,EAAE,0BAA0B,EAAE,gCAAgC,EAAE,gCAAgC,EAA0C,MAAM,qDAAqD,CAAC;AAE7M,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAA2B,MAAM,oBAAoB,CAAC;AACvO,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,yBAAyB,EAAiC,MAAM,qBAAqB,CAAC;AAEpJ,OAAO,EAAE,qBAAqB,EAAqC,MAAM,gDAAgD,CAAC;AAI1H,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,sBAAsB,EAA8F,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type { CommonMemoryConfig } from '../config/config.js';
2
+ import { RuntimeStore } from '../v2/runtime.js';
3
+ import { type AgentImportPayload } from '../v2/import.js';
4
+ import { type MemoryView } from '../v2/reader.js';
5
+ export type McpCapability = 'relay' | 'init' | 'read';
6
+ export declare const MCP_CAPABILITIES: readonly McpCapability[];
7
+ export interface McpOptions {
8
+ clientId: string;
9
+ workspaces: string[];
10
+ global: boolean;
11
+ accept: boolean;
12
+ capabilities: McpCapability[];
13
+ }
14
+ export interface SubmissionIdentity {
15
+ submissionId: string;
16
+ conversationId?: string | undefined;
17
+ }
18
+ export interface Submission extends SubmissionIdentity {
19
+ contextId: string;
20
+ text: string;
21
+ }
22
+ export interface InitSubmission extends AgentImportPayload {
23
+ importId: string;
24
+ contextId: string;
25
+ }
26
+ export type SubmissionOutcome = import("../v2/runtime.js").ObservationOutcome;
27
+ /** Local host trust is established at launch, never by a tool argument. */
28
+ export declare class McpIngress {
29
+ #private;
30
+ readonly store: RuntimeStore | null;
31
+ readonly config: CommonMemoryConfig;
32
+ /** Read-only launches never open the runtime database. */
33
+ constructor(store: RuntimeStore | null, config: CommonMemoryConfig, options: McpOptions);
34
+ get capabilities(): readonly McpCapability[];
35
+ has(capability: McpCapability): boolean;
36
+ contexts(): string[];
37
+ info(): {
38
+ capabilities: McpCapability[];
39
+ submissionEnabled: boolean;
40
+ initEnabled: boolean;
41
+ readEnabled: boolean;
42
+ contexts: string[];
43
+ };
44
+ status(input: SubmissionIdentity): SubmissionOutcome | null;
45
+ initStatus(importId: string): SubmissionOutcome | null;
46
+ submit(input: Submission, signal?: AbortSignal): {
47
+ accepted: true;
48
+ duplicate: boolean;
49
+ state: string;
50
+ contextId: string;
51
+ };
52
+ /** Agent-reported understanding: durably queued as one agent_import observation and flushed promptly. */
53
+ init(input: InitSubmission, signal?: AbortSignal): {
54
+ accepted: true;
55
+ duplicate: boolean;
56
+ state: string;
57
+ contextId: string;
58
+ };
59
+ read(contextId?: string): MemoryView;
60
+ }
61
+ //# sourceMappingURL=ingress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../../src/mcp/ingress.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAA0C,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAExE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AACtD,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAA8B,CAAC;AACpF,MAAM,WAAW,UAAU;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,aAAa,EAAE,CAAA;CAAE;AACvI,MAAM,WAAW,kBAAkB;IAAG,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE;AACjG,MAAM,WAAW,UAAW,SAAQ,kBAAkB;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAC1F,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAClG,MAAM,MAAM,iBAAiB,GAAG,OAAO,kBAAkB,EAAE,kBAAkB,CAAC;AAG9E,2EAA2E;AAC3E,qBAAa,UAAU;;IAKT,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAAE,QAAQ,CAAC,MAAM,EAAE,kBAAkB;IADpF,0DAA0D;gBACrC,KAAK,EAAE,YAAY,GAAG,IAAI,EAAW,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU;IAazG,IAAI,YAAY,IAAI,SAAS,aAAa,EAAE,CAAuC;IACnF,GAAG,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO;IACvC,QAAQ,IAAI,MAAM,EAAE;IAQpB,IAAI,IAAI;QAAE,YAAY,EAAE,aAAa,EAAE,CAAC;QAAC,iBAAiB,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;IAsBrI,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,IAAI;IAG3D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAGtD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAQzH,yGAAyG;IACzG,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAS3H,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU;CAoBrC"}
@@ -0,0 +1,134 @@
1
+ import { isAbsolute } from 'node:path';
2
+ import { RuntimeStore } from '../v2/runtime.js';
3
+ import { ProjectRegistry } from '../v2/registry.js';
4
+ import { AGENT_IMPORT_SOURCE, encodeAgentImport } from '../v2/import.js';
5
+ import { readAuthorizedMemory } from '../v2/reader.js';
6
+ export const MCP_CAPABILITIES = ['relay', 'init', 'read'];
7
+ const validId = (id) => /^[A-Za-z0-9_-]{1,128}$/.test(id);
8
+ /** Local host trust is established at launch, never by a tool argument. */
9
+ export class McpIngress {
10
+ store;
11
+ config;
12
+ #registry;
13
+ #projects;
14
+ #options;
15
+ /** Read-only launches never open the runtime database. */
16
+ constructor(store, config, options) {
17
+ this.store = store;
18
+ this.config = config;
19
+ if (!validId(options.clientId))
20
+ throw new Error('INVALID_CLIENT_ID');
21
+ if (!options.capabilities.length || options.capabilities.some(c => !MCP_CAPABILITIES.includes(c)))
22
+ throw new Error('INVALID_CAPABILITY');
23
+ if (!store && options.capabilities.some(c => c !== 'read'))
24
+ throw new Error('STORE_REQUIRED');
25
+ this.#options = { ...options, workspaces: [...options.workspaces], capabilities: [...new Set(options.capabilities)] };
26
+ this.#registry = new ProjectRegistry(config.dataRoot);
27
+ this.#projects = options.workspaces.map(workspace => {
28
+ if (!isAbsolute(workspace))
29
+ throw new Error('WORKSPACE_MUST_BE_ABSOLUTE');
30
+ const project = this.#registry.resolve(workspace);
31
+ if (!project)
32
+ throw new Error('UNREGISTERED_WORKSPACE');
33
+ return { workspace, contextId: `project:${project.id}` };
34
+ });
35
+ }
36
+ get capabilities() { return this.#options.capabilities; }
37
+ has(capability) { return this.#options.capabilities.includes(capability); }
38
+ contexts() {
39
+ const projects = this.#projects.filter(item => {
40
+ try {
41
+ return `project:${this.#registry.resolve(item.workspace)?.id}` === item.contextId;
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }).map(item => item.contextId);
47
+ return [...new Set([...(this.#options.global ? ['global'] : []), ...projects])]
48
+ .filter(scope => this.config.disclosure.allowedScopes.includes(scope));
49
+ }
50
+ info() {
51
+ const contexts = this.contexts();
52
+ const userExplicit = this.config.disclosure.allowedProvenance.includes('user_explicit');
53
+ return {
54
+ capabilities: [...this.#options.capabilities],
55
+ submissionEnabled: this.has('relay') && this.#options.accept && userExplicit && contexts.length > 0,
56
+ // Init needs the launch capability and the configured permission to disclose agent-reported material remotely.
57
+ initEnabled: this.has('init') && this.config.disclosure.allowedProvenance.includes('agent_observation') && contexts.length > 0,
58
+ readEnabled: this.has('read') && contexts.length > 0,
59
+ contexts,
60
+ };
61
+ }
62
+ /** Read-only launches have no queue: item status is not part of their profile, not a backend failure. */
63
+ #store() { if (!this.store)
64
+ throw new Error('STATUS_UNAVAILABLE'); return this.store; }
65
+ #session(input) {
66
+ if (!validId(input.submissionId) || (input.conversationId !== undefined && !validId(input.conversationId)))
67
+ throw new Error('INVALID_SUBMISSION_ID');
68
+ return `mcp:${JSON.stringify([this.#options.clientId, input.conversationId === undefined ? ['submission', input.submissionId] : ['conversation', input.conversationId]])}`;
69
+ }
70
+ #initSession(importId) {
71
+ if (!validId(importId))
72
+ throw new Error('INVALID_SUBMISSION_ID');
73
+ return `mcp-init:${JSON.stringify([this.#options.clientId, importId])}`;
74
+ }
75
+ status(input) {
76
+ return this.#store().observationOutcome(this.#session(input), input.submissionId);
77
+ }
78
+ initStatus(importId) {
79
+ return this.#store().observationOutcome(this.#initSession(importId), importId);
80
+ }
81
+ submit(input, signal) {
82
+ const sessionId = this.#session(input);
83
+ if (!this.info().submissionEnabled)
84
+ throw new Error('SUBMISSION_DISABLED');
85
+ if (!this.contexts().includes(input.contextId))
86
+ throw new Error('CONTEXT_UNAVAILABLE');
87
+ if (!input.text.trim() || Buffer.byteLength(input.text) > this.config.disclosure.maxTotalBytes)
88
+ throw new Error('INVALID_TEXT_SIZE');
89
+ if (signal?.aborted)
90
+ throw new Error('CANCELLED');
91
+ return this.#enqueue(sessionId, input.submissionId, input.contextId, input.text, 'mcp_user_submission', false);
92
+ }
93
+ /** Agent-reported understanding: durably queued as one agent_import observation and flushed promptly. */
94
+ init(input, signal) {
95
+ const sessionId = this.#initSession(input.importId);
96
+ if (!this.info().initEnabled)
97
+ throw new Error('INIT_DISABLED');
98
+ if (!this.contexts().includes(input.contextId))
99
+ throw new Error('CONTEXT_UNAVAILABLE');
100
+ const text = encodeAgentImport({ sourceLabel: input.sourceLabel, basis: input.basis, understanding: input.understanding, gaps: input.gaps });
101
+ if (Buffer.byteLength(text) > this.config.disclosure.maxTotalBytes)
102
+ throw new Error('INVALID_TEXT_SIZE');
103
+ if (signal?.aborted)
104
+ throw new Error('CANCELLED');
105
+ return this.#enqueue(sessionId, input.importId, input.contextId, text, AGENT_IMPORT_SOURCE, true);
106
+ }
107
+ read(contextId) {
108
+ if (!this.info().readEnabled)
109
+ throw new Error('READ_DISABLED');
110
+ const contexts = this.contexts();
111
+ if (contextId !== undefined && !contexts.includes(contextId))
112
+ throw new Error('CONTEXT_UNAVAILABLE');
113
+ return readAuthorizedMemory({ dataRoot: this.config.dataRoot, contexts: contextId === undefined ? contexts : [contextId] });
114
+ }
115
+ #enqueue(sessionId, entryId, scope, text, source, flush) {
116
+ const store = this.#store();
117
+ return store.transaction(() => {
118
+ const duplicate = store.observationStatus(sessionId, entryId) !== null;
119
+ let observation;
120
+ try {
121
+ observation = store.enqueue({ sessionId, entryId, scope, text, source, observedAt: new Date().toISOString() });
122
+ }
123
+ catch (error) {
124
+ if (error instanceof Error && error.message === 'Conflicting observation identity')
125
+ throw new Error('SUBMISSION_CONFLICT');
126
+ throw error;
127
+ }
128
+ if (flush)
129
+ store.requestFlush();
130
+ return { accepted: true, duplicate, state: observation.state, contextId: observation.scope };
131
+ });
132
+ }
133
+ }
134
+ //# sourceMappingURL=ingress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingress.js","sourceRoot":"","sources":["../../src/mcp/ingress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/server';
2
+ import type { McpIngress } from './ingress.js';
3
+ export declare function createMcpServer(ingress: McpIngress): McpServer;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAoB/C,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CA8C9D"}
@@ -0,0 +1,92 @@
1
+ import { MEMORY_READ_GUIDANCE, MEMORY_READ_DESCRIPTION } from '../v2/read-guidance.js';
2
+ import { McpServer } from '@modelcontextprotocol/server';
3
+ import * as z from 'zod/v4';
4
+ import { IMPORT_BASES, MAX_IMPORT_GAPS_BYTES, MAX_IMPORT_UNDERSTANDING_BYTES } from '../v2/import.js';
5
+ import { renderMemoryView } from '../v2/reader.js';
6
+ const id = z.string().regex(/^[A-Za-z0-9_-]{1,128}$/);
7
+ const identity = { submissionId: id, conversationId: id.optional() };
8
+ const safeErrors = new Set(['SUBMISSION_DISABLED', 'INIT_DISABLED', 'READ_DISABLED', 'STATUS_UNAVAILABLE', 'CONTEXT_UNAVAILABLE', 'INVALID_TEXT_SIZE', 'INVALID_SUBMISSION_ID', 'INVALID_IMPORT_LABEL', 'INVALID_IMPORT_BASIS', 'SUBMISSION_CONFLICT', 'CANCELLED']);
9
+ function result(value, text = JSON.stringify(value)) {
10
+ return { content: [{ type: 'text', text }], structuredContent: { ...value } };
11
+ }
12
+ function failure(error) {
13
+ const code = error instanceof Error && safeErrors.has(error.message) ? error.message : 'MEMORY_UNAVAILABLE';
14
+ return { ...result({ code }), isError: true };
15
+ }
16
+ const INSTRUCTIONS = {
17
+ read: MEMORY_READ_GUIDANCE,
18
+ init: 'Common Memory Init: call memory_init only when the user explicitly requests memory import, migration or initialization. Submit only existing material actually visible to you; direct quotations are allowed and remain agent-reported data. Name the actual sources and coverage gaps. Preserve dates, conditions, project scope and uncertainty; exclude this migration session’s execution status and unsupported new claims. Never turn missing knowledge into negative facts about the user. Never include secrets. Approval to migrate does not verify each claim. Accepted means queued; use memory_status with the same importId and ask the user to review the destination with common-memory show. These are soft semantic defenses, not Core guarantees of truth or completeness. Nothing here reads memory.',
19
+ relay: 'Common Memory relay: submit complete user expressions verbatim for background memory maintenance; check processing state with memory_status.',
20
+ };
21
+ export function createMcpServer(ingress) {
22
+ const instructions = ingress.capabilities.map(c => INSTRUCTIONS[c]).join('\n\n');
23
+ const server = new McpServer({ name: 'common-memory', version: '0.2.0' }, { instructions });
24
+ if (ingress.has('relay'))
25
+ server.registerTool('memory_submit_user_turn', {
26
+ description: 'Submit one complete user expression verbatim, not an assistant summary. Requires local host opt-in. Accepted means durably queued, not remembered. Reuse the same submission/conversation IDs when retrying. Cancellation after acceptance does not retract evidence.',
27
+ inputSchema: z.object({ ...identity, contextId: z.string().max(160), text: z.string().min(1).max(ingress.config.disclosure.maxTotalBytes) }).strict(),
28
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },
29
+ }, async (input, ctx) => {
30
+ try {
31
+ return result(ingress.submit(input, ctx.mcpReq.signal));
32
+ }
33
+ catch (error) {
34
+ return failure(error);
35
+ }
36
+ });
37
+ if (ingress.has('init'))
38
+ server.registerTool('memory_init', {
39
+ description: `Import existing material actually visible to you about the user (contextId "global") or current project (contextId "project:<id>"). Call only when the user explicitly asks to import or migrate memory. In "understanding" (≤${MAX_IMPORT_UNDERSTANDING_BYTES} bytes), quote or faithfully summarize selected existing material; even quotations remain agent-reported, never authenticated user statements. Preserve original dates, historical goals, conditions, project scope and tentative wording. Set "basis" from the material actually read; use "sourceLabel" as a source label, and describe specific sources, coverage and uncertainty in "understanding" or "gaps". Do not infer source or full ChatGPT memory coverage from the product or mode name. Keep inaccessible or unknown information in "gaps", not as negative user facts. Exclude this migration session's connection, import, readback and other execution status, unsupported new assertions, secrets, credentials and anything the user did not intend to share. Leave unsupported guesses for review outside the import. User approval to migrate does not establish truth. Accepted means durably queued; Core structural validation cannot guarantee provenance accuracy or prevent all unsupported or contradictory additions. Poll memory_status with the same importId; reuse the importId with the identical payload when retrying. Review the actual destination with common-memory show; an isolated trial does not guarantee the same result on another run.`,
40
+ inputSchema: z.object({
41
+ importId: id,
42
+ contextId: z.string().max(160),
43
+ sourceLabel: z.string().min(1).max(64),
44
+ basis: z.enum(IMPORT_BASES),
45
+ understanding: z.string().min(1).max(MAX_IMPORT_UNDERSTANDING_BYTES),
46
+ gaps: z.string().max(MAX_IMPORT_GAPS_BYTES).optional(),
47
+ }).strict(),
48
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
49
+ }, async (input, ctx) => {
50
+ try {
51
+ return result(ingress.init(input, ctx.mcpReq.signal));
52
+ }
53
+ catch (error) {
54
+ return failure(error);
55
+ }
56
+ });
57
+ if (ingress.has('read'))
58
+ server.registerTool('memory_read', {
59
+ description: MEMORY_READ_DESCRIPTION,
60
+ inputSchema: z.object({ contextId: z.string().max(160).optional() }).strict(),
61
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
62
+ }, async (input) => {
63
+ try {
64
+ const view = ingress.read(input.contextId);
65
+ return result(view, renderMemoryView(view));
66
+ }
67
+ catch (error) {
68
+ return failure(error);
69
+ }
70
+ });
71
+ server.registerTool('memory_status', {
72
+ description: 'Without arguments: this connection\'s capabilities and allowed context IDs. With submissionId or importId: that item\'s processing state, the documents it is retained in (retainedIn), and a diagnostic code. "processed" with an empty retainedIn means the Core kept nothing. No memory or conversation bodies are returned.',
73
+ inputSchema: z.object({ submissionId: id.optional(), conversationId: id.optional(), importId: id.optional() }).strict(),
74
+ annotations: { readOnlyHint: true, openWorldHint: false },
75
+ }, async (input) => {
76
+ try {
77
+ if (input.importId !== undefined) {
78
+ if (input.submissionId || input.conversationId)
79
+ return failure(new Error('INVALID_SUBMISSION_ID'));
80
+ return result({ import: ingress.initStatus(input.importId) });
81
+ }
82
+ if (!input.submissionId && input.conversationId)
83
+ return failure(new Error('INVALID_SUBMISSION_ID'));
84
+ return result(input.submissionId ? { submission: ingress.status({ submissionId: input.submissionId, conversationId: input.conversationId }) } : ingress.info());
85
+ }
86
+ catch (error) {
87
+ return failure(error);
88
+ }
89
+ });
90
+ return server;
91
+ }
92
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type McpOptions } from './ingress.js';
2
+ export declare function parseMcpOptions(args: string[]): McpOptions;
3
+ /** One process owns one Writer, even if SDK discovery invokes the factory twice. Read-only launches own none. */
4
+ export declare function runMcp(args: string[]): Promise<void>;
5
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/mcp/stdio.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoD,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAGjG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAqB1D;AAED,iHAAiH;AACjH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C1D"}
@@ -0,0 +1,115 @@
1
+ import { serveStdio, StdioServerTransport } from '@modelcontextprotocol/server/stdio';
2
+ import { loadConfig } from '../config/config.js';
3
+ import { createConfiguredWriter } from '../config/runtime.js';
4
+ import { MCP_CAPABILITIES, McpIngress } from './ingress.js';
5
+ import { createMcpServer } from './server.js';
6
+ export function parseMcpOptions(args) {
7
+ const options = { clientId: '', workspaces: [], global: false, accept: false, capabilities: [] };
8
+ for (let i = 0; i < args.length; i++) {
9
+ const arg = args[i];
10
+ if (arg === '--global')
11
+ options.global = true;
12
+ else if (arg === '--accept-client-reported-user-turns')
13
+ options.accept = true;
14
+ else if (arg === '--client-id' || arg === '--workspace' || arg === '--capability') {
15
+ const value = args[++i];
16
+ if (!value || value.startsWith('--'))
17
+ throw new Error('MCP option requires a value');
18
+ if (arg === '--workspace')
19
+ options.workspaces.push(value);
20
+ else if (arg === '--capability') {
21
+ if (!MCP_CAPABILITIES.includes(value))
22
+ throw new Error('Unknown MCP capability');
23
+ if (!options.capabilities.includes(value))
24
+ options.capabilities.push(value);
25
+ }
26
+ else {
27
+ if (options.clientId)
28
+ throw new Error('Duplicate --client-id');
29
+ options.clientId = value;
30
+ }
31
+ }
32
+ else
33
+ throw new Error('Unknown MCP option');
34
+ }
35
+ if (!options.clientId)
36
+ throw new Error('MCP requires --client-id');
37
+ // Without --capability the process keeps its original relay behaviour.
38
+ if (!options.capabilities.length)
39
+ options.capabilities.push('relay');
40
+ return options;
41
+ }
42
+ /** One process owns one Writer, even if SDK discovery invokes the factory twice. Read-only launches own none. */
43
+ export async function runMcp(args) {
44
+ const options = parseMcpOptions(args);
45
+ const config = loadConfig();
46
+ if (!config)
47
+ throw new Error('Run common-memory config first');
48
+ const readOnly = options.capabilities.every(c => c === 'read');
49
+ const writer = readOnly ? null : createConfiguredWriter(config);
50
+ let ingress;
51
+ try {
52
+ ingress = new McpIngress(writer?.store ?? null, config, options);
53
+ }
54
+ catch {
55
+ await writer?.close();
56
+ throw new Error('MCP context configuration is invalid');
57
+ }
58
+ const abort = new AbortController();
59
+ let running;
60
+ let closing;
61
+ let finish;
62
+ const finished = new Promise(resolve => { finish = resolve; });
63
+ const report = () => { process.stderr.write('[common-memory] MCP maintenance unavailable; inspect common-memory status.\n'); };
64
+ const check = () => {
65
+ if (closing || running || !writer)
66
+ return;
67
+ running = writer.run({ signal: abort.signal }).then(value => { if (value.outcome === 'failed')
68
+ report(); }, report)
69
+ .finally(() => { running = undefined; });
70
+ };
71
+ const transport = new StdioServerTransport(process.stdin, process.stdout, { maxBufferSize: 1024 * 1024 });
72
+ const handle = serveStdio(() => createMcpServer(ingress), { transport, onerror: report });
73
+ const timer = setInterval(check, 1000);
74
+ timer.unref();
75
+ const shutdown = () => {
76
+ if (closing)
77
+ return;
78
+ // Publish closing before the async cleanup can trigger transport.onclose again.
79
+ closing = Promise.resolve().then(async () => {
80
+ clearInterval(timer);
81
+ abort.abort();
82
+ try {
83
+ writer?.store.requestFlush();
84
+ }
85
+ catch {
86
+ report();
87
+ }
88
+ try {
89
+ await handle.close();
90
+ await running;
91
+ }
92
+ finally {
93
+ await writer?.close();
94
+ process.stdin.off('end', shutdown);
95
+ process.stdin.off('error', shutdown);
96
+ process.stdout.off('error', shutdown);
97
+ process.off('SIGINT', shutdown);
98
+ process.off('SIGTERM', shutdown);
99
+ }
100
+ }).catch(report).finally(finish);
101
+ };
102
+ const sdkClose = transport.onclose;
103
+ transport.onclose = () => { sdkClose?.(); shutdown(); };
104
+ process.stdin.once('end', shutdown);
105
+ process.stdin.once('error', shutdown);
106
+ process.stdout.once('error', shutdown);
107
+ process.once('SIGINT', shutdown);
108
+ process.once('SIGTERM', shutdown);
109
+ if (process.stdin.readableEnded || process.stdin.destroyed)
110
+ shutdown();
111
+ else
112
+ check();
113
+ await finished;
114
+ }
115
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/mcp/stdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Persist only these local enums and bounded scalars, never provider text or secrets. */
2
+ export declare const DIAGNOSTIC_STAGES: readonly ["network_config", "network", "request", "http", "response_body", "response_envelope", "model_output", "core_validation", "commit", "lease", "recovery"];
3
+ export declare const DIAGNOSTIC_REASONS: readonly ["no_proxy_invalid", "proxy_config_invalid", "ca_config_invalid", "proxy_authentication", "proxy_http_error", "proxy_unavailable", "proxy_dns_error", "tls_verification_failed", "dns_error", "connection_refused", "invalid_schema", "request_rejected", "authentication", "rate_limited", "provider_unavailable", "model_not_found", "unsupported_parameter", "context_length_exceeded", "insufficient_quota", "network_error", "body_too_large", "body_read_failed", "invalid_envelope", "incomplete_output", "output_truncated", "tool_call", "invalid_json", "refusal", "timeout", "cancelled", "lease_renewal_failed", "stale_lease", "core_rejected", "commit_failed", "recovery_conflict"];
4
+ export type DiagnosticStage = typeof DIAGNOSTIC_STAGES[number];
5
+ export type DiagnosticReason = typeof DIAGNOSTIC_REASONS[number];
6
+ export interface FailureDiagnostic {
7
+ stage: DiagnosticStage;
8
+ reason: DiagnosticReason;
9
+ httpStatus?: number;
10
+ proxyStatus?: number;
11
+ retryable: boolean;
12
+ }
13
+ export declare function sanitizeDiagnostic(value: unknown): FailureDiagnostic | null;
14
+ //# sourceMappingURL=diagnostic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../../src/memory-manager/contracts/diagnostic.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,mKAAoK,CAAC;AACnM,eAAO,MAAM,kBAAkB,6qBAA8qB,CAAC;AAC9sB,MAAM,MAAM,eAAe,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,WAAW,iBAAiB;IAAG,KAAK,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE;AACtJ,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAQ3E"}
@@ -0,0 +1,17 @@
1
+ /** Persist only these local enums and bounded scalars, never provider text or secrets. */
2
+ export const DIAGNOSTIC_STAGES = ['network_config', 'network', 'request', 'http', 'response_body', 'response_envelope', 'model_output', 'core_validation', 'commit', 'lease', 'recovery'];
3
+ export const DIAGNOSTIC_REASONS = ['no_proxy_invalid', 'proxy_config_invalid', 'ca_config_invalid', 'proxy_authentication', 'proxy_http_error', 'proxy_unavailable', 'proxy_dns_error', 'tls_verification_failed', 'dns_error', 'connection_refused', 'invalid_schema', 'request_rejected', 'authentication', 'rate_limited', 'provider_unavailable', 'model_not_found', 'unsupported_parameter', 'context_length_exceeded', 'insufficient_quota', 'network_error', 'body_too_large', 'body_read_failed', 'invalid_envelope', 'incomplete_output', 'output_truncated', 'tool_call', 'invalid_json', 'refusal', 'timeout', 'cancelled', 'lease_renewal_failed', 'stale_lease', 'core_rejected', 'commit_failed', 'recovery_conflict'];
4
+ export function sanitizeDiagnostic(value) {
5
+ if (!value || typeof value !== 'object' || Array.isArray(value))
6
+ return null;
7
+ const d = value;
8
+ if (!DIAGNOSTIC_STAGES.includes(d.stage) || !DIAGNOSTIC_REASONS.includes(d.reason) || typeof d.retryable !== 'boolean')
9
+ return null;
10
+ const result = { stage: d.stage, reason: d.reason, retryable: d.retryable };
11
+ if (Number.isInteger(d.httpStatus) && Number(d.httpStatus) >= 100 && Number(d.httpStatus) <= 599)
12
+ result.httpStatus = Number(d.httpStatus);
13
+ if (Number.isInteger(d.proxyStatus) && Number(d.proxyStatus) >= 100 && Number(d.proxyStatus) <= 599)
14
+ result.proxyStatus = Number(d.proxyStatus);
15
+ return result;
16
+ }
17
+ //# sourceMappingURL=diagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../../src/memory-manager/contracts/diagnostic.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAU,CAAC;AACnM,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,sBAAsB,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,CAAU,CAAC;AAI9sB,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAwB,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAA0B,CAAC,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3K,MAAM,MAAM,GAAsB,EAAC,KAAK,EAAE,CAAC,CAAC,KAAwB,EAAE,MAAM,EAAE,CAAC,CAAC,MAA0B,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAC,CAAC;IACpI,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG;QAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3I,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG;QAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAChJ,OAAO,MAAM,CAAC;AAChB,CAAC"}