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,16 @@
1
+ import { setTimeout } from 'node:timers/promises';
2
+ import { SessionIngress } from './session.js';
3
+ /** Waits through backoff and foreign leases. Dead/quarantined work is terminal, never success. */
4
+ export async function drainSessions(writer, options = {}) {
5
+ const ingress = new SessionIngress(writer.store);
6
+ for (;;) {
7
+ options.signal?.throwIfAborted();
8
+ const pending = options.sessionId ? writer.store.db.prepare("SELECT 1 FROM observations WHERE sessionId=? AND state IN ('pending','claimed') LIMIT 1").get(options.sessionId) : writer.store.hasWork();
9
+ if (!pending)
10
+ return options.sessionId ? ingress.status(options.sessionId).complete : !writer.store.hasIncompleteWork() && writer.store.db.prepare('SELECT id FROM sessions WHERE closing=1').all().every(row => ingress.status(String(row.id)).complete);
11
+ const result = await writer.run({ force: true, ...(options.signal ? { signal: options.signal } : {}) });
12
+ if (result && typeof result === 'object' && 'outcome' in result && (result.outcome === 'idle' || result.outcome === 'failed'))
13
+ await setTimeout(250, undefined, { ...(options.signal ? { signal: options.signal } : {}) });
14
+ }
15
+ }
16
+ //# sourceMappingURL=session-drain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-drain.js","sourceRoot":"","sources":["../../src/v2/session-drain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAkB,EAAE,UAAgD,EAAE;IACxG,MAAM,OAAO,GAAC,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/C,SAAQ,CAAC;QACP,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QACjC,MAAM,OAAO,GAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,yFAAyF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACrM,IAAG,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAA,EAAE,CAAA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvP,MAAM,MAAM,GAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAA,CAAC,CAAA,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,CAAC,CAAC;QAC3F,IAAG,MAAM,IAAI,OAAO,MAAM,KAAG,QAAQ,IAAI,SAAS,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,KAAG,MAAM,IAAE,MAAM,CAAC,OAAO,KAAG,QAAQ,CAAC;YAAE,MAAM,UAAU,CAAC,GAAG,EAAC,SAAS,EAAC,EAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAA,CAAC,CAAA,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,CAAC,CAAC;IACzM,CAAC;AACH,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { RuntimeStore, Observation, RuntimeJob } from './runtime.js';
2
+ export interface SessionIdentity {
3
+ client: 'pi' | 'codex' | 'chatgpt-work';
4
+ processInstance: string;
5
+ sessionId: string;
6
+ }
7
+ export interface SessionCacheOptions {
8
+ maxSessionBytes?: number;
9
+ maxTotalBytes?: number;
10
+ contextTailTurns?: number;
11
+ }
12
+ export declare const SESSION_CACHE_DEFAULTS: {
13
+ maxSessionBytes: number;
14
+ maxTotalBytes: number;
15
+ contextTailTurns: number;
16
+ };
17
+ export interface SessionMessage {
18
+ sequence?: number;
19
+ id: string;
20
+ turnId: string;
21
+ role: 'user' | 'assistant' | 'tool';
22
+ text: string;
23
+ scope: string;
24
+ source: string;
25
+ observedAt: string;
26
+ }
27
+ export type SessionTurnState = 'settled' | 'interrupted' | 'incomplete';
28
+ export declare function sessionKey(identity: SessionIdentity): string;
29
+ export declare function initializeSessions(store: RuntimeStore): void;
30
+ /** Local host ingress. User delivery authentication belongs to the versioned host adapter. */
31
+ export declare class SessionIngress {
32
+ readonly store: RuntimeStore;
33
+ readonly limits: Required<SessionCacheOptions>;
34
+ constructor(store: RuntimeStore, options?: SessionCacheOptions);
35
+ open(identity: SessionIdentity): string;
36
+ capture(key: string, message: SessionMessage): void;
37
+ reserve(key: string, bytes: number): void;
38
+ settle(key: string, turnId: string, state?: SessionTurnState): void;
39
+ seal(key: string, tail?: boolean): void;
40
+ end(key: string): void;
41
+ status(key: string): {
42
+ closing: boolean;
43
+ complete: boolean;
44
+ pending: number;
45
+ failed: number;
46
+ batches: number;
47
+ };
48
+ }
49
+ export declare function sessionGroup(store: RuntimeStore, o: Observation): {
50
+ turn: number;
51
+ batch: number;
52
+ } | null;
53
+ export declare function sessionProjection(store: RuntimeStore, job: RuntimeJob, authorized: boolean, tail?: number): unknown[];
54
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/v2/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1E,MAAM,WAAW,eAAe;IAAG,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,cAAc,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACxH,MAAM,WAAW,mBAAmB;IAAG,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE;AACpH,eAAO,MAAM,sBAAsB;;;;CAA8E,CAAC;AAClH,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,EAAC,MAAM,CAAC;IAAC,EAAE,EAAC,MAAM,CAAC;IAAC,MAAM,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,MAAM,GAAC,WAAW,GAAC,MAAM,CAAC;IAAC,IAAI,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,MAAM,EAAC,MAAM,CAAC;IAAC,UAAU,EAAC,MAAM,CAAA;CAAE;AAC3K,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,aAAa,GAAG,YAAY,CAAC;AACxE,wBAAgB,UAAU,CAAC,QAAQ,EAAC,eAAe,GAAE,MAAM,CAG1D;AACD,wBAAgB,kBAAkB,CAAC,KAAK,EAAC,YAAY,GAAE,IAAI,CAc1D;AACD,8FAA8F;AAC9F,qBAAa,cAAc;IAEb,QAAQ,CAAC,KAAK,EAAC,YAAY;IADvC,QAAQ,CAAC,MAAM,EAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBACzB,KAAK,EAAC,YAAY,EAAE,OAAO,GAAC,mBAAwB;IAIzE,IAAI,CAAC,QAAQ,EAAC,eAAe,GAAE,MAAM;IACrC,OAAO,CAAC,GAAG,EAAC,MAAM,EAAC,OAAO,EAAC,cAAc,GAAE,IAAI;IAwB/C,OAAO,CAAC,GAAG,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,GAAE,IAAI;IAWrC,MAAM,CAAC,GAAG,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,GAAC,gBAA0B,GAAE,IAAI;IAWtE,IAAI,CAAC,GAAG,EAAC,MAAM,EAAC,IAAI,UAAM,GAAE,IAAI;IAahC,GAAG,CAAC,GAAG,EAAC,MAAM,GAAE,IAAI;IASpB,MAAM,CAAC,GAAG,EAAC,MAAM,GAAE;QAAC,OAAO,EAAC,OAAO,CAAC;QAAA,QAAQ,EAAC,OAAO,CAAC;QAAA,OAAO,EAAC,MAAM,CAAC;QAAA,MAAM,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,CAAA;KAAC;CAUlG;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAC,YAAY,EAAC,CAAC,EAAC,WAAW,GAAE;IAAC,IAAI,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAA;CAAC,GAAC,IAAI,CAG7F;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAC,YAAY,EAAC,GAAG,EAAC,UAAU,EAAC,UAAU,EAAC,OAAO,EAAC,IAAI,SAAE,GAAE,OAAO,EAAE,CAYvG"}
@@ -0,0 +1,158 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { provenanceOf } from './import.js';
3
+ import { externalPreflight } from '../core/safety/external-preflight.js';
4
+ export const SESSION_CACHE_DEFAULTS = { maxSessionBytes: 8 * 1024 * 1024, maxTotalBytes: 64 * 1024 * 1024, contextTailTurns: 2 };
5
+ export function sessionKey(identity) {
6
+ if (!['pi', 'codex', 'chatgpt-work'].includes(identity.client) || !identity.processInstance || !identity.sessionId)
7
+ throw new Error('INVALID_SESSION_IDENTITY');
8
+ return 'session-' + createHash('sha256').update(JSON.stringify([identity.client, identity.processInstance, identity.sessionId])).digest('hex');
9
+ }
10
+ export function initializeSessions(store) {
11
+ store.db.exec(`
12
+ CREATE TABLE IF NOT EXISTS sessions(id TEXT PRIMARY KEY, closing INTEGER NOT NULL DEFAULT 0);
13
+ CREATE TABLE IF NOT EXISTS session_turns(id INTEGER PRIMARY KEY, sessionId TEXT NOT NULL, turnId TEXT NOT NULL, state TEXT NOT NULL DEFAULT 'open', batchId INTEGER, UNIQUE(sessionId,turnId));
14
+ CREATE TABLE IF NOT EXISTS session_batches(id INTEGER PRIMARY KEY, sessionId TEXT NOT NULL);
15
+ CREATE TABLE IF NOT EXISTS session_messages(id INTEGER PRIMARY KEY, sessionId TEXT NOT NULL, messageId TEXT NOT NULL, turn INTEGER NOT NULL, role TEXT NOT NULL, digest TEXT NOT NULL, scope TEXT NOT NULL, source TEXT NOT NULL, observedAt TEXT NOT NULL, observationId INTEGER, text TEXT, unavailable TEXT, UNIQUE(sessionId,messageId));
16
+ CREATE INDEX IF NOT EXISTS session_messages_observation ON session_messages(observationId);
17
+ CREATE INDEX IF NOT EXISTS session_messages_turn ON session_messages(turn,id);
18
+ CREATE INDEX IF NOT EXISTS session_turns_batch ON session_turns(batchId,id);
19
+ CREATE TRIGGER IF NOT EXISTS session_forget_context AFTER UPDATE OF text ON observations WHEN NEW.text IS NULL BEGIN
20
+ UPDATE session_messages SET text=NULL,unavailable='source_unavailable' WHERE role!='user' AND turn IN (SELECT turn FROM session_messages WHERE observationId=NEW.id);
21
+ END;
22
+ `);
23
+ store.transaction(() => { if (!store.db.prepare('PRAGMA table_info(session_messages)').all().some(r => r.name === 'sequence'))
24
+ store.db.exec('ALTER TABLE session_messages ADD COLUMN sequence INTEGER'); });
25
+ }
26
+ /** Local host ingress. User delivery authentication belongs to the versioned host adapter. */
27
+ export class SessionIngress {
28
+ store;
29
+ limits;
30
+ constructor(store, options = {}) {
31
+ this.store = store;
32
+ this.limits = { ...SESSION_CACHE_DEFAULTS, ...options };
33
+ for (const [key, n] of Object.entries(this.limits))
34
+ if (!Number.isSafeInteger(n) || n < (key === 'contextTailTurns' ? 0 : 1))
35
+ throw new Error('INVALID_SESSION_LIMIT');
36
+ }
37
+ open(identity) { const key = sessionKey(identity); this.store.db.prepare('INSERT OR IGNORE INTO sessions(id) VALUES(?)').run(key); return key; }
38
+ capture(key, message) {
39
+ if (!message.id || !message.turnId || !['user', 'assistant', 'tool'].includes(message.role) || typeof message.text !== 'string' || !message.text || !message.text.isWellFormed() || message.text.includes('\0') || !Number.isFinite(Date.parse(message.observedAt)))
40
+ throw new Error('INVALID_SESSION_MESSAGE');
41
+ const digest = createHash('sha256').update(JSON.stringify(message)).digest('hex');
42
+ this.store.transaction(() => {
43
+ const prior = this.store.db.prepare('SELECT digest FROM session_messages WHERE sessionId=? AND messageId=?').get(key, message.id);
44
+ if (prior) {
45
+ if (prior.digest !== digest)
46
+ throw new Error('SESSION_MESSAGE_CONFLICT');
47
+ return;
48
+ }
49
+ const session = this.store.db.prepare('SELECT closing FROM sessions WHERE id=?').get(key);
50
+ if (!session || session.closing)
51
+ throw new Error('SESSION_CLOSED');
52
+ this.store.db.prepare('INSERT OR IGNORE INTO session_turns(sessionId,turnId) VALUES(?,?)').run(key, message.turnId);
53
+ const turn = this.store.db.prepare('SELECT id,state FROM session_turns WHERE sessionId=? AND turnId=?').get(key, message.turnId);
54
+ if (turn.state !== 'open')
55
+ throw new Error('SESSION_TURN_CLOSED');
56
+ let observationId = null, unavailable = null;
57
+ if (message.role === 'user') {
58
+ const o = this.store.enqueue({ sessionId: key, entryId: message.id, text: message.text, scope: message.scope, source: message.source, observedAt: message.observedAt });
59
+ observationId = o.id;
60
+ this.store.db.prepare("UPDATE observations SET state='buffered' WHERE id=? AND state='pending'").run(o.id);
61
+ }
62
+ else {
63
+ try {
64
+ externalPreflight({ text: message.text }, { maxExcerptBytes: this.limits.maxSessionBytes, maxCandidateBytes: this.limits.maxSessionBytes, maxTotalBytes: this.limits.maxSessionBytes });
65
+ }
66
+ catch {
67
+ unavailable = 'sensitive_context';
68
+ }
69
+ }
70
+ this.store.db.prepare('INSERT INTO session_messages(sessionId,messageId,turn,role,digest,scope,source,observedAt,observationId,text,unavailable,sequence) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)')
71
+ .run(key, message.id, turn.id, message.role, digest, message.scope, message.source, message.observedAt, observationId, message.role === 'user' || unavailable ? null : message.text, unavailable, message.sequence ?? null);
72
+ this.reserve(key, 0);
73
+ });
74
+ }
75
+ reserve(key, bytes) {
76
+ const usage = (session) => {
77
+ let bytes = Number(this.store.db.prepare(`SELECT COALESCE(SUM(length(CAST(COALESCE(m.text,o.text,'') AS BLOB))),0) AS n FROM session_messages m LEFT JOIN observations o ON o.id=m.observationId ${session ? 'WHERE m.sessionId=?' : ''}`).get(...(session ? [key] : [])).n);
78
+ for (const [table, column] of [['inputs', 'text'], ['deliveries', 'text'], ['codex_inbox', 'body'], ['codex_candidates', 'text'], ['host_snapshots', 'body']]) {
79
+ if ((table.startsWith('codex_') || table === 'host_snapshots') && !this.store.db.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name=?").get(table))
80
+ continue;
81
+ bytes += Number(this.store.db.prepare(`SELECT COALESCE(SUM(length(CAST(${column} AS BLOB))),0) AS n FROM ${table} ${session ? 'WHERE sessionId=?' : ''}`).get(...(session ? [key] : [])).n);
82
+ }
83
+ return bytes;
84
+ };
85
+ if (usage(true) + bytes > this.limits.maxSessionBytes || usage(false) + bytes > this.limits.maxTotalBytes)
86
+ throw new Error('SESSION_CAPACITY_EXCEEDED');
87
+ }
88
+ settle(key, turnId, state = 'settled') {
89
+ this.store.transaction(() => {
90
+ const turn = this.store.db.prepare('SELECT * FROM session_turns WHERE sessionId=? AND turnId=?').get(key, turnId);
91
+ if (!turn)
92
+ return; // Undelivered inputs never count.
93
+ if (turn.state !== 'open') {
94
+ if (turn.state !== state)
95
+ throw new Error('SESSION_SETTLE_CONFLICT');
96
+ return;
97
+ }
98
+ const users = this.store.db.prepare("SELECT scope,source FROM session_messages WHERE turn=? AND role='user'").all(turn.id);
99
+ if (users.some(m => provenanceOf(String(m.source)) !== 'user_explicit' || m.scope !== users[0]?.scope))
100
+ this.store.db.prepare("UPDATE observations SET state='quarantined',issue='MIXED_SESSION_TURN' WHERE id IN (SELECT observationId FROM session_messages WHERE turn=?)").run(turn.id);
101
+ this.store.db.prepare('UPDATE session_turns SET state=? WHERE id=?').run(state, turn.id);
102
+ this.seal(key, false);
103
+ });
104
+ }
105
+ seal(key, tail = false) {
106
+ this.store.transaction(() => {
107
+ const turns = this.store.db.prepare("SELECT t.id FROM session_turns t WHERE sessionId=? AND batchId IS NULL AND state!='open' AND EXISTS(SELECT 1 FROM session_messages m WHERE m.turn=t.id AND role='user') ORDER BY t.id").all(key);
108
+ while (turns.length >= 10 || tail && turns.length) {
109
+ const group = turns.splice(0, 10);
110
+ const batch = this.store.db.prepare('INSERT INTO session_batches(sessionId) VALUES(?)').run(key).lastInsertRowid;
111
+ for (const t of group) {
112
+ this.store.db.prepare('UPDATE session_turns SET batchId=? WHERE id=?').run(batch, t.id);
113
+ this.store.db.prepare("UPDATE observations SET state='pending' WHERE state='buffered' AND id IN (SELECT observationId FROM session_messages WHERE turn=?)").run(t.id);
114
+ }
115
+ }
116
+ });
117
+ }
118
+ end(key) {
119
+ this.store.transaction(() => {
120
+ for (const turn of this.store.db.prepare("SELECT turnId FROM session_turns WHERE sessionId=? AND state='open'").all(key))
121
+ this.settle(key, String(turn.turnId), 'incomplete');
122
+ this.seal(key, true);
123
+ this.store.db.prepare('UPDATE sessions SET closing=1 WHERE id=?').run(key);
124
+ this.store.db.prepare("UPDATE session_messages SET text=NULL,unavailable='undelivered_turn' WHERE sessionId=? AND role!='user' AND NOT EXISTS(SELECT 1 FROM session_messages u WHERE u.turn=session_messages.turn AND u.role='user')").run(key);
125
+ this.store.cancelInputs(key);
126
+ });
127
+ }
128
+ status(key) {
129
+ const closing = Boolean(this.store.db.prepare('SELECT closing FROM sessions WHERE id=?').get(key)?.closing);
130
+ const rows = this.store.db.prepare('SELECT state,COUNT(*) AS n FROM observations WHERE sessionId=? GROUP BY state').all(key);
131
+ const unbound = Number(this.store.db.prepare("SELECT COUNT(*) AS n FROM deliveries WHERE sessionId=? AND state='unbound'").get(key).n);
132
+ const isolated = Number(this.store.db.prepare("SELECT COUNT(*) AS n FROM deliveries WHERE sessionId=? AND state='quarantined'").get(key).n);
133
+ const pending = unbound + rows.filter(r => ['buffered', 'pending', 'claimed'].includes(String(r.state))).reduce((n, r) => n + Number(r.n), 0);
134
+ const failed = isolated + rows.filter(r => ['dead', 'quarantined'].includes(String(r.state))).reduce((n, r) => n + Number(r.n), 0);
135
+ const incomplete = Boolean(this.store.db.prepare("SELECT 1 FROM session_turns WHERE sessionId=? AND state='incomplete' LIMIT 1").get(key));
136
+ return { closing, complete: closing && !pending && !failed && !incomplete, pending, failed, batches: Number(this.store.db.prepare('SELECT COUNT(*) AS n FROM session_batches WHERE sessionId=?').get(key).n) };
137
+ }
138
+ }
139
+ export function sessionGroup(store, o) {
140
+ const row = store.db.prepare('SELECT m.turn,t.batchId FROM session_messages m JOIN session_turns t ON t.id=m.turn WHERE observationId=?').get(o.id);
141
+ return row ? { turn: Number(row.turn), batch: Number(row.batchId) } : null;
142
+ }
143
+ export function sessionProjection(store, job, authorized, tail = 2) {
144
+ const first = sessionGroup(store, job.observations[0]);
145
+ if (!first)
146
+ return [];
147
+ const current = [...new Set(job.observations.map(o => sessionGroup(store, o).turn))];
148
+ const previous = store.db.prepare("SELECT t.id FROM session_turns t WHERE sessionId=? AND t.id<? AND batchId IS NOT NULL AND NOT EXISTS(SELECT 1 FROM session_messages m LEFT JOIN observations o ON o.id=m.observationId WHERE m.turn=t.id AND (m.scope!=? OR (m.role='user' AND o.state!='processed'))) ORDER BY t.id DESC LIMIT ?").all(job.observations[0].sessionId, first.turn, job.observations[0].scope, tail).reverse().map(r => Number(r.id));
149
+ return [...previous, ...current].map(id => {
150
+ const turn = store.db.prepare('SELECT turnId,state FROM session_turns WHERE id=?').get(id);
151
+ return { turn_id: turn.turnId, state: turn.state, context_only: !current.includes(id), messages: store.db.prepare('SELECT m.*,o.text AS userText FROM session_messages m LEFT JOIN observations o ON o.id=m.observationId WHERE turn=? ORDER BY COALESCE(m.sequence,m.id),m.id').all(id).map(m => {
152
+ const canDisclose = authorized && m.scope === job.observations[0].scope;
153
+ const evidence = current.includes(id) && m.role === 'user' && job.observations.some(o => o.id === m.observationId);
154
+ return { message_id: m.messageId, role: m.role, source: m.source, source_scope: m.scope, observed_at: m.observedAt, context_only: !evidence, ...(evidence ? { ref: `ev_${m.observationId}` } : { text: canDisclose ? (m.role === 'user' ? m.userText : m.text) : null, unavailable: !canDisclose ? 'unauthorized_conversation_context' : m.unavailable ?? (m.role === 'user' && m.userText === null ? 'source_unavailable' : null) }) };
155
+ }) };
156
+ });
157
+ }
158
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/v2/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type SessionCacheOptions } from './session.js';
2
+ import { CanonicalStore } from './canonical.js';
3
+ import { RuntimeStore, type RuntimeOptions } from './runtime.js';
4
+ import { type ProvenanceKind } from './import.js';
5
+ import type { MemoryModelPort } from '../memory-manager/contracts/model-port.js';
6
+ export declare const maintainerPrompt: string;
7
+ export interface WriterOptions {
8
+ dataRoot: string;
9
+ model: MemoryModelPort;
10
+ allowedScopes: readonly string[];
11
+ writableScopes?: readonly string[];
12
+ /** Provenance classes that may be sent to the remote model; a batch outside it is quarantined, never disclosed. Omitted means all. */
13
+ allowedProvenance?: readonly ProvenanceKind[];
14
+ documentSoftBytes?: number;
15
+ documentHardBytes?: number;
16
+ retentionMs?: number;
17
+ sessionCache?: SessionCacheOptions;
18
+ scheduler?: RuntimeOptions;
19
+ deadlineMs?: number;
20
+ maxRequestBytes?: number;
21
+ modelVersion?: string;
22
+ checkpoint?: (phase: 'files_committed') => void;
23
+ }
24
+ /** Network runs outside both locks. Canonical commits are fenced inside lock -> DB. */
25
+ export declare class Writer {
26
+ #private;
27
+ readonly store: RuntimeStore;
28
+ readonly canonical: CanonicalStore;
29
+ constructor(options: WriterOptions);
30
+ recover(): void;
31
+ run(options?: {
32
+ force?: boolean;
33
+ signal?: AbortSignal;
34
+ }): Promise<{
35
+ outcome: string;
36
+ reason?: string;
37
+ }>;
38
+ close(): void;
39
+ }
40
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/v2/writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGzF,OAAO,EAAE,cAAc,EAAyB,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAmB,KAAK,cAAc,EAAuB,MAAM,cAAc,CAAC;AAOvG,OAAO,EAAgG,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhJ,OAAO,KAAK,EAAwB,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAEvG,eAAO,MAAM,gBAAgB,QAA2E,CAAC;AACzG,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/G,sIAAsI;IACtI,iBAAiB,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC7E,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IACrI,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACjD;AACD,uFAAuF;AACvF,qBAAa,MAAM;;IACjB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;gBAEvB,OAAO,EAAE,aAAa;IAQlC,OAAO,IAAI,IAAI;IAYT,GAAG,CAAC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC;QAAC,OAAO,EAAC,MAAM,CAAC;QAAC,MAAM,CAAC,EAAC,MAAM,CAAA;KAAC,CAAC;IAsL7G,KAAK,IAAI,IAAI;CACd"}