@atomicmemory/core 1.0.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 (589) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +201 -0
  3. package/README.md +314 -0
  4. package/dist/app/bind-ephemeral.d.ts +18 -0
  5. package/dist/app/bind-ephemeral.js +22 -0
  6. package/dist/app/cors-headers.d.ts +12 -0
  7. package/dist/app/cors-headers.js +18 -0
  8. package/dist/app/create-app.d.ts +25 -0
  9. package/dist/app/create-app.js +156 -0
  10. package/dist/app/runtime-config-route-snapshot.d.ts +27 -0
  11. package/dist/app/runtime-config-route-snapshot.js +27 -0
  12. package/dist/app/runtime-container.d.ts +281 -0
  13. package/dist/app/runtime-container.js +297 -0
  14. package/dist/app/startup-checks.d.ts +28 -0
  15. package/dist/app/startup-checks.js +45 -0
  16. package/dist/bin.d.ts +17 -0
  17. package/dist/bin.js +128 -0
  18. package/dist/config.d.ts +680 -0
  19. package/dist/config.js +808 -0
  20. package/dist/db/agent-trust-repository.d.ts +49 -0
  21. package/dist/db/agent-trust-repository.js +66 -0
  22. package/dist/db/belief-edges-repository.d.ts +68 -0
  23. package/dist/db/belief-edges-repository.js +124 -0
  24. package/dist/db/claim-repository.d.ts +6 -0
  25. package/dist/db/claim-repository.js +4 -0
  26. package/dist/db/contradictions-repository.d.ts +56 -0
  27. package/dist/db/contradictions-repository.js +88 -0
  28. package/dist/db/document-chunk-repository.d.ts +48 -0
  29. package/dist/db/document-chunk-repository.js +145 -0
  30. package/dist/db/document-chunk-types.d.ts +35 -0
  31. package/dist/db/document-chunk-types.js +9 -0
  32. package/dist/db/document-list-cursor.d.ts +45 -0
  33. package/dist/db/document-list-cursor.js +111 -0
  34. package/dist/db/document-list-repository.d.ts +103 -0
  35. package/dist/db/document-list-repository.js +204 -0
  36. package/dist/db/entity-cards-repository.d.ts +37 -0
  37. package/dist/db/entity-cards-repository.js +46 -0
  38. package/dist/db/entity-values-repository.d.ts +26 -0
  39. package/dist/db/entity-values-repository.js +57 -0
  40. package/dist/db/link-repository.d.ts +30 -0
  41. package/dist/db/link-repository.js +54 -0
  42. package/dist/db/memory-repository.d.ts +163 -0
  43. package/dist/db/memory-repository.js +232 -0
  44. package/dist/db/migrate.d.ts +6 -0
  45. package/dist/db/migrate.js +36 -0
  46. package/dist/db/mmr.d.ts +14 -0
  47. package/dist/db/mmr.js +57 -0
  48. package/dist/db/passport-feed-repository.d.ts +91 -0
  49. package/dist/db/passport-feed-repository.js +198 -0
  50. package/dist/db/pg-episode-store.d.ts +19 -0
  51. package/dist/db/pg-episode-store.js +17 -0
  52. package/dist/db/pg-link-store.d.ts +17 -0
  53. package/dist/db/pg-link-store.js +14 -0
  54. package/dist/db/pg-memory-store.d.ts +68 -0
  55. package/dist/db/pg-memory-store.js +53 -0
  56. package/dist/db/pg-recap-store.d.ts +13 -0
  57. package/dist/db/pg-recap-store.js +19 -0
  58. package/dist/db/pg-representation-store.d.ts +17 -0
  59. package/dist/db/pg-representation-store.js +17 -0
  60. package/dist/db/pg-search-store.d.ts +29 -0
  61. package/dist/db/pg-search-store.js +47 -0
  62. package/dist/db/pool.d.ts +5 -0
  63. package/dist/db/pool.js +21 -0
  64. package/dist/db/ppr.d.ts +56 -0
  65. package/dist/db/ppr.js +178 -0
  66. package/dist/db/query-helpers.d.ts +44 -0
  67. package/dist/db/query-helpers.js +60 -0
  68. package/dist/db/raw-doc-artifact-sync.d.ts +128 -0
  69. package/dist/db/raw-doc-artifact-sync.js +259 -0
  70. package/dist/db/raw-document-blob-repository.d.ts +148 -0
  71. package/dist/db/raw-document-blob-repository.js +300 -0
  72. package/dist/db/raw-document-repository.d.ts +104 -0
  73. package/dist/db/raw-document-repository.js +410 -0
  74. package/dist/db/raw-document-status-repository.d.ts +122 -0
  75. package/dist/db/raw-document-status-repository.js +183 -0
  76. package/dist/db/raw-document-types.d.ts +236 -0
  77. package/dist/db/raw-document-types.js +10 -0
  78. package/dist/db/raw-storage-reconciliation-repository.d.ts +110 -0
  79. package/dist/db/raw-storage-reconciliation-repository.js +200 -0
  80. package/dist/db/reflection-jobs-repository.d.ts +33 -0
  81. package/dist/db/reflection-jobs-repository.js +48 -0
  82. package/dist/db/reflections-repository.d.ts +41 -0
  83. package/dist/db/reflections-repository.js +83 -0
  84. package/dist/db/repository-claims.d.ts +141 -0
  85. package/dist/db/repository-claims.js +376 -0
  86. package/dist/db/repository-deferred-audn.d.ts +33 -0
  87. package/dist/db/repository-deferred-audn.js +69 -0
  88. package/dist/db/repository-document-delete.d.ts +53 -0
  89. package/dist/db/repository-document-delete.js +156 -0
  90. package/dist/db/repository-entities.d.ts +114 -0
  91. package/dist/db/repository-entities.js +317 -0
  92. package/dist/db/repository-entity-attributes.d.ts +41 -0
  93. package/dist/db/repository-entity-attributes.js +65 -0
  94. package/dist/db/repository-entity-graph.d.ts +32 -0
  95. package/dist/db/repository-entity-graph.js +87 -0
  96. package/dist/db/repository-first-mentions.d.ts +41 -0
  97. package/dist/db/repository-first-mentions.js +79 -0
  98. package/dist/db/repository-lessons.d.ts +51 -0
  99. package/dist/db/repository-lessons.js +90 -0
  100. package/dist/db/repository-links.d.ts +26 -0
  101. package/dist/db/repository-links.js +105 -0
  102. package/dist/db/repository-observation.d.ts +26 -0
  103. package/dist/db/repository-observation.js +51 -0
  104. package/dist/db/repository-read.d.ts +56 -0
  105. package/dist/db/repository-read.js +271 -0
  106. package/dist/db/repository-recaps.d.ts +59 -0
  107. package/dist/db/repository-recaps.js +158 -0
  108. package/dist/db/repository-representations.d.ts +48 -0
  109. package/dist/db/repository-representations.js +162 -0
  110. package/dist/db/repository-temporal-state.d.ts +35 -0
  111. package/dist/db/repository-temporal-state.js +46 -0
  112. package/dist/db/repository-tll.d.ts +88 -0
  113. package/dist/db/repository-tll.js +179 -0
  114. package/dist/db/repository-types.d.ts +313 -0
  115. package/dist/db/repository-types.js +142 -0
  116. package/dist/db/repository-user-profiles.d.ts +17 -0
  117. package/dist/db/repository-user-profiles.js +28 -0
  118. package/dist/db/repository-vector-search.d.ts +33 -0
  119. package/dist/db/repository-vector-search.js +373 -0
  120. package/dist/db/repository-wipe.d.ts +34 -0
  121. package/dist/db/repository-wipe.js +94 -0
  122. package/dist/db/repository-write.d.ts +61 -0
  123. package/dist/db/repository-write.js +279 -0
  124. package/dist/db/schema.sql +1355 -0
  125. package/dist/db/storage-artifact-delete-tx.d.ts +56 -0
  126. package/dist/db/storage-artifact-delete-tx.js +123 -0
  127. package/dist/db/storage-artifact-providers.d.ts +21 -0
  128. package/dist/db/storage-artifact-providers.js +21 -0
  129. package/dist/db/storage-artifact-recovery-repository.d.ts +66 -0
  130. package/dist/db/storage-artifact-recovery-repository.js +58 -0
  131. package/dist/db/storage-artifact-repository.d.ts +329 -0
  132. package/dist/db/storage-artifact-repository.js +497 -0
  133. package/dist/db/stores.d.ts +220 -0
  134. package/dist/db/stores.js +12 -0
  135. package/dist/db/summaries-repository.d.ts +74 -0
  136. package/dist/db/summaries-repository.js +125 -0
  137. package/dist/eval/beam-10m-loader.d.ts +98 -0
  138. package/dist/eval/beam-10m-loader.js +128 -0
  139. package/dist/index.d.ts +18 -0
  140. package/dist/index.js +17 -0
  141. package/dist/middleware/require-bearer.d.ts +27 -0
  142. package/dist/middleware/require-bearer.js +60 -0
  143. package/dist/middleware/validate-response.d.ts +33 -0
  144. package/dist/middleware/validate-response.js +55 -0
  145. package/dist/middleware/validate.d.ts +43 -0
  146. package/dist/middleware/validate.js +85 -0
  147. package/dist/routes/agents.d.ts +13 -0
  148. package/dist/routes/agents.js +89 -0
  149. package/dist/routes/document-response-formatters.d.ts +98 -0
  150. package/dist/routes/document-response-formatters.js +243 -0
  151. package/dist/routes/documents.d.ts +74 -0
  152. package/dist/routes/documents.js +425 -0
  153. package/dist/routes/memories.d.ts +29 -0
  154. package/dist/routes/memories.js +725 -0
  155. package/dist/routes/memory-response-formatters.d.ts +179 -0
  156. package/dist/routes/memory-response-formatters.js +210 -0
  157. package/dist/routes/public-raw-storage-metadata.d.ts +54 -0
  158. package/dist/routes/public-raw-storage-metadata.js +56 -0
  159. package/dist/routes/reflect.d.ts +14 -0
  160. package/dist/routes/reflect.js +19 -0
  161. package/dist/routes/response-schema-map.d.ts +14 -0
  162. package/dist/routes/response-schema-map.js +69 -0
  163. package/dist/routes/route-errors.d.ts +12 -0
  164. package/dist/routes/route-errors.js +30 -0
  165. package/dist/routes/storage-error-handlers.d.ts +34 -0
  166. package/dist/routes/storage-error-handlers.js +185 -0
  167. package/dist/routes/storage-response-formatters.d.ts +44 -0
  168. package/dist/routes/storage-response-formatters.js +155 -0
  169. package/dist/routes/storage.d.ts +38 -0
  170. package/dist/routes/storage.js +369 -0
  171. package/dist/routes/upstream-provider-errors.d.ts +19 -0
  172. package/dist/routes/upstream-provider-errors.js +95 -0
  173. package/dist/schemas/agents.d.ts +79 -0
  174. package/dist/schemas/agents.js +126 -0
  175. package/dist/schemas/common.d.ts +110 -0
  176. package/dist/schemas/common.js +190 -0
  177. package/dist/schemas/document-list-responses.d.ts +102 -0
  178. package/dist/schemas/document-list-responses.js +87 -0
  179. package/dist/schemas/document-list-schemas.d.ts +123 -0
  180. package/dist/schemas/document-list-schemas.js +174 -0
  181. package/dist/schemas/document-response-schemas.d.ts +610 -0
  182. package/dist/schemas/document-response-schemas.js +264 -0
  183. package/dist/schemas/document-status-envelope.d.ts +48 -0
  184. package/dist/schemas/document-status-envelope.js +54 -0
  185. package/dist/schemas/documents.d.ts +292 -0
  186. package/dist/schemas/documents.js +449 -0
  187. package/dist/schemas/errors.d.ts +75 -0
  188. package/dist/schemas/errors.js +105 -0
  189. package/dist/schemas/memories.d.ts +378 -0
  190. package/dist/schemas/memories.js +542 -0
  191. package/dist/schemas/openapi.d.ts +24 -0
  192. package/dist/schemas/openapi.js +1038 -0
  193. package/dist/schemas/response-scalars.d.ts +10 -0
  194. package/dist/schemas/response-scalars.js +10 -0
  195. package/dist/schemas/responses.d.ts +536 -0
  196. package/dist/schemas/responses.js +350 -0
  197. package/dist/schemas/search-response-parts.d.ts +97 -0
  198. package/dist/schemas/search-response-parts.js +103 -0
  199. package/dist/schemas/storage-schemas.d.ts +175 -0
  200. package/dist/schemas/storage-schemas.js +277 -0
  201. package/dist/schemas/zod-setup.d.ts +15 -0
  202. package/dist/schemas/zod-setup.js +17 -0
  203. package/dist/server.d.ts +13 -0
  204. package/dist/server.js +57 -0
  205. package/dist/services/abstract-query-policy.d.ts +13 -0
  206. package/dist/services/abstract-query-policy.js +50 -0
  207. package/dist/services/affinity-clustering.d.ts +66 -0
  208. package/dist/services/affinity-clustering.js +125 -0
  209. package/dist/services/agentic-retrieval.d.ts +38 -0
  210. package/dist/services/agentic-retrieval.js +126 -0
  211. package/dist/services/answer-format.d.ts +56 -0
  212. package/dist/services/answer-format.js +118 -0
  213. package/dist/services/answer-rescue.d.ts +72 -0
  214. package/dist/services/answer-rescue.js +177 -0
  215. package/dist/services/answer-verifier.d.ts +24 -0
  216. package/dist/services/answer-verifier.js +73 -0
  217. package/dist/services/api-retry.d.ts +6 -0
  218. package/dist/services/api-retry.js +41 -0
  219. package/dist/services/assistant-turn-filter.d.ts +20 -0
  220. package/dist/services/assistant-turn-filter.js +69 -0
  221. package/dist/services/atomicmem-uri.d.ts +33 -0
  222. package/dist/services/atomicmem-uri.js +86 -0
  223. package/dist/services/audit-events.d.ts +54 -0
  224. package/dist/services/audit-events.js +56 -0
  225. package/dist/services/chunked-extraction.d.ts +21 -0
  226. package/dist/services/chunked-extraction.js +108 -0
  227. package/dist/services/claim-slotting.d.ts +27 -0
  228. package/dist/services/claim-slotting.js +38 -0
  229. package/dist/services/claude-code-llm.d.ts +19 -0
  230. package/dist/services/claude-code-llm.js +96 -0
  231. package/dist/services/composite-dedup.d.ts +50 -0
  232. package/dist/services/composite-dedup.js +153 -0
  233. package/dist/services/composite-grouping.d.ts +41 -0
  234. package/dist/services/composite-grouping.js +111 -0
  235. package/dist/services/composite-staleness.d.ts +20 -0
  236. package/dist/services/composite-staleness.js +50 -0
  237. package/dist/services/conciseness-preference.d.ts +14 -0
  238. package/dist/services/conciseness-preference.js +42 -0
  239. package/dist/services/conflict-policy.d.ts +20 -0
  240. package/dist/services/conflict-policy.js +335 -0
  241. package/dist/services/consensus-extraction.d.ts +39 -0
  242. package/dist/services/consensus-extraction.js +147 -0
  243. package/dist/services/consensus-validation.d.ts +52 -0
  244. package/dist/services/consensus-validation.js +206 -0
  245. package/dist/services/consolidation-service.d.ts +60 -0
  246. package/dist/services/consolidation-service.js +171 -0
  247. package/dist/services/content-detection.d.ts +18 -0
  248. package/dist/services/content-detection.js +25 -0
  249. package/dist/services/contradiction-surfacing.d.ts +62 -0
  250. package/dist/services/contradiction-surfacing.js +111 -0
  251. package/dist/services/cost-telemetry.d.ts +39 -0
  252. package/dist/services/cost-telemetry.js +58 -0
  253. package/dist/services/counter-evidence.d.ts +34 -0
  254. package/dist/services/counter-evidence.js +92 -0
  255. package/dist/services/current-state-ranking.d.ts +21 -0
  256. package/dist/services/current-state-ranking.js +152 -0
  257. package/dist/services/deferred-audn.d.ts +47 -0
  258. package/dist/services/deferred-audn.js +162 -0
  259. package/dist/services/document-chunker.d.ts +50 -0
  260. package/dist/services/document-chunker.js +153 -0
  261. package/dist/services/document-failure-markers.d.ts +91 -0
  262. package/dist/services/document-failure-markers.js +305 -0
  263. package/dist/services/document-indexer.d.ts +122 -0
  264. package/dist/services/document-indexer.js +405 -0
  265. package/dist/services/document-service.d.ts +245 -0
  266. package/dist/services/document-service.js +325 -0
  267. package/dist/services/document-upload-artifact-sync.d.ts +80 -0
  268. package/dist/services/document-upload-artifact-sync.js +162 -0
  269. package/dist/services/document-upload-beta2-recovery.d.ts +72 -0
  270. package/dist/services/document-upload-beta2-recovery.js +94 -0
  271. package/dist/services/document-upload.d.ts +44 -0
  272. package/dist/services/document-upload.js +353 -0
  273. package/dist/services/embedding.d.ts +57 -0
  274. package/dist/services/embedding.js +416 -0
  275. package/dist/services/entity-attribute-extractor.d.ts +34 -0
  276. package/dist/services/entity-attribute-extractor.js +117 -0
  277. package/dist/services/entity-card-synthesis.d.ts +54 -0
  278. package/dist/services/entity-card-synthesis.js +92 -0
  279. package/dist/services/entity-dedup.d.ts +9 -0
  280. package/dist/services/entity-dedup.js +14 -0
  281. package/dist/services/entity-graph.d.ts +17 -0
  282. package/dist/services/entity-graph.js +135 -0
  283. package/dist/services/entropy-gate.d.ts +52 -0
  284. package/dist/services/entropy-gate.js +56 -0
  285. package/dist/services/episode-fetcher.d.ts +47 -0
  286. package/dist/services/episode-fetcher.js +128 -0
  287. package/dist/services/event-anchor-facts.d.ts +8 -0
  288. package/dist/services/event-anchor-facts.js +205 -0
  289. package/dist/services/event-chain-detector.d.ts +52 -0
  290. package/dist/services/event-chain-detector.js +83 -0
  291. package/dist/services/extraction-cache.d.ts +9 -0
  292. package/dist/services/extraction-cache.js +54 -0
  293. package/dist/services/extraction-enrichment.d.ts +9 -0
  294. package/dist/services/extraction-enrichment.js +223 -0
  295. package/dist/services/extraction.d.ts +69 -0
  296. package/dist/services/extraction.js +596 -0
  297. package/dist/services/fact-normalization.d.ts +12 -0
  298. package/dist/services/fact-normalization.js +248 -0
  299. package/dist/services/filecoin-observability.d.ts +127 -0
  300. package/dist/services/filecoin-observability.js +200 -0
  301. package/dist/services/first-mention-service.d.ts +76 -0
  302. package/dist/services/first-mention-service.js +186 -0
  303. package/dist/services/hierarchical-retrieval.d.ts +49 -0
  304. package/dist/services/hierarchical-retrieval.js +50 -0
  305. package/dist/services/ingest-fact-pipeline.d.ts +32 -0
  306. package/dist/services/ingest-fact-pipeline.js +212 -0
  307. package/dist/services/ingest-post-write.d.ts +50 -0
  308. package/dist/services/ingest-post-write.js +117 -0
  309. package/dist/services/ingest-trace.d.ts +32 -0
  310. package/dist/services/ingest-trace.js +60 -0
  311. package/dist/services/input-sanitizer.d.ts +41 -0
  312. package/dist/services/input-sanitizer.js +135 -0
  313. package/dist/services/iterative-retrieval.d.ts +26 -0
  314. package/dist/services/iterative-retrieval.js +139 -0
  315. package/dist/services/keyword-expansion.d.ts +10 -0
  316. package/dist/services/keyword-expansion.js +26 -0
  317. package/dist/services/lesson-service.d.ts +68 -0
  318. package/dist/services/lesson-service.js +178 -0
  319. package/dist/services/literal-extractor.d.ts +16 -0
  320. package/dist/services/literal-extractor.js +74 -0
  321. package/dist/services/literal-list-protection.d.ts +17 -0
  322. package/dist/services/literal-list-protection.js +134 -0
  323. package/dist/services/literal-query-expansion.d.ts +20 -0
  324. package/dist/services/literal-query-expansion.js +181 -0
  325. package/dist/services/llm.d.ts +61 -0
  326. package/dist/services/llm.js +265 -0
  327. package/dist/services/memcell-projection.d.ts +17 -0
  328. package/dist/services/memcell-projection.js +41 -0
  329. package/dist/services/memory-audn.d.ts +43 -0
  330. package/dist/services/memory-audn.js +419 -0
  331. package/dist/services/memory-crud.d.ts +93 -0
  332. package/dist/services/memory-crud.js +255 -0
  333. package/dist/services/memory-ingest.d.ts +21 -0
  334. package/dist/services/memory-ingest.js +249 -0
  335. package/dist/services/memory-lifecycle.d.ts +75 -0
  336. package/dist/services/memory-lifecycle.js +108 -0
  337. package/dist/services/memory-lineage.d.ts +181 -0
  338. package/dist/services/memory-lineage.js +232 -0
  339. package/dist/services/memory-network.d.ts +40 -0
  340. package/dist/services/memory-network.js +75 -0
  341. package/dist/services/memory-search-types.d.ts +25 -0
  342. package/dist/services/memory-search-types.js +10 -0
  343. package/dist/services/memory-search.d.ts +48 -0
  344. package/dist/services/memory-search.js +505 -0
  345. package/dist/services/memory-service-types.d.ts +371 -0
  346. package/dist/services/memory-service-types.js +8 -0
  347. package/dist/services/memory-service.d.ts +152 -0
  348. package/dist/services/memory-service.js +225 -0
  349. package/dist/services/memory-storage.d.ts +33 -0
  350. package/dist/services/memory-storage.js +328 -0
  351. package/dist/services/msr-aggregator.d.ts +38 -0
  352. package/dist/services/msr-aggregator.js +97 -0
  353. package/dist/services/msr-detector.d.ts +35 -0
  354. package/dist/services/msr-detector.js +65 -0
  355. package/dist/services/namespace-retrieval.d.ts +60 -0
  356. package/dist/services/namespace-retrieval.js +180 -0
  357. package/dist/services/observation-date-extraction.d.ts +12 -0
  358. package/dist/services/observation-date-extraction.js +50 -0
  359. package/dist/services/observation-service.d.ts +27 -0
  360. package/dist/services/observation-service.js +84 -0
  361. package/dist/services/packaging-observability.d.ts +29 -0
  362. package/dist/services/packaging-observability.js +146 -0
  363. package/dist/services/query-expansion.d.ts +83 -0
  364. package/dist/services/query-expansion.js +242 -0
  365. package/dist/services/query-keyword-matches.d.ts +6 -0
  366. package/dist/services/query-keyword-matches.js +56 -0
  367. package/dist/services/query-term-visibility.d.ts +28 -0
  368. package/dist/services/query-term-visibility.js +100 -0
  369. package/dist/services/quick-extraction.d.ts +25 -0
  370. package/dist/services/quick-extraction.js +431 -0
  371. package/dist/services/quoted-entity-extraction.d.ts +10 -0
  372. package/dist/services/quoted-entity-extraction.js +161 -0
  373. package/dist/services/raw-storage-reconciler-backoff.d.ts +8 -0
  374. package/dist/services/raw-storage-reconciler-backoff.js +14 -0
  375. package/dist/services/raw-storage-reconciler-scheduler.d.ts +29 -0
  376. package/dist/services/raw-storage-reconciler-scheduler.js +43 -0
  377. package/dist/services/raw-storage-reconciler.d.ts +71 -0
  378. package/dist/services/raw-storage-reconciler.js +278 -0
  379. package/dist/services/recap-builder.d.ts +49 -0
  380. package/dist/services/recap-builder.js +157 -0
  381. package/dist/services/reflect-jobs.d.ts +23 -0
  382. package/dist/services/reflect-jobs.js +36 -0
  383. package/dist/services/reflect-prompts.d.ts +71 -0
  384. package/dist/services/reflect-prompts.js +99 -0
  385. package/dist/services/reflect-retrieval.d.ts +33 -0
  386. package/dist/services/reflect-retrieval.js +30 -0
  387. package/dist/services/reflect.d.ts +49 -0
  388. package/dist/services/reflect.js +84 -0
  389. package/dist/services/relative-temporal.d.ts +14 -0
  390. package/dist/services/relative-temporal.js +163 -0
  391. package/dist/services/relevance-policy.d.ts +37 -0
  392. package/dist/services/relevance-policy.js +109 -0
  393. package/dist/services/rerank.d.ts +32 -0
  394. package/dist/services/rerank.js +118 -0
  395. package/dist/services/reranker.d.ts +20 -0
  396. package/dist/services/reranker.js +99 -0
  397. package/dist/services/retrieval-channel-rules.d.ts +34 -0
  398. package/dist/services/retrieval-channel-rules.js +41 -0
  399. package/dist/services/retrieval-config-overlay.d.ts +36 -0
  400. package/dist/services/retrieval-config-overlay.js +44 -0
  401. package/dist/services/retrieval-format.d.ts +119 -0
  402. package/dist/services/retrieval-format.js +559 -0
  403. package/dist/services/retrieval-policy.d.ts +69 -0
  404. package/dist/services/retrieval-policy.js +275 -0
  405. package/dist/services/retrieval-profiles.d.ts +37 -0
  406. package/dist/services/retrieval-profiles.js +90 -0
  407. package/dist/services/retrieval-side-effects.d.ts +14 -0
  408. package/dist/services/retrieval-side-effects.js +26 -0
  409. package/dist/services/retrieval-trace.d.ts +108 -0
  410. package/dist/services/retrieval-trace.js +147 -0
  411. package/dist/services/rrf-fusion.d.ts +18 -0
  412. package/dist/services/rrf-fusion.js +34 -0
  413. package/dist/services/search-pipeline.d.ts +71 -0
  414. package/dist/services/search-pipeline.js +788 -0
  415. package/dist/services/session-date.d.ts +20 -0
  416. package/dist/services/session-date.js +61 -0
  417. package/dist/services/session-packaging.d.ts +53 -0
  418. package/dist/services/session-packaging.js +182 -0
  419. package/dist/services/session-summary-generator.d.ts +53 -0
  420. package/dist/services/session-summary-generator.js +134 -0
  421. package/dist/services/specialists/cr-specialist.d.ts +52 -0
  422. package/dist/services/specialists/cr-specialist.js +121 -0
  423. package/dist/services/specialists/dispatch.d.ts +53 -0
  424. package/dist/services/specialists/dispatch.js +102 -0
  425. package/dist/services/specialists/ie-ku-specialist.d.ts +37 -0
  426. package/dist/services/specialists/ie-ku-specialist.js +63 -0
  427. package/dist/services/specialists/msr-specialist.d.ts +61 -0
  428. package/dist/services/specialists/msr-specialist.js +162 -0
  429. package/dist/services/specialists/tr-specialist.d.ts +37 -0
  430. package/dist/services/specialists/tr-specialist.js +146 -0
  431. package/dist/services/storage-key-prefix.d.ts +42 -0
  432. package/dist/services/storage-key-prefix.js +45 -0
  433. package/dist/services/storage-put-recovery.d.ts +71 -0
  434. package/dist/services/storage-put-recovery.js +269 -0
  435. package/dist/services/storage-service-errors.d.ts +124 -0
  436. package/dist/services/storage-service-errors.js +189 -0
  437. package/dist/services/storage-service.d.ts +176 -0
  438. package/dist/services/storage-service.js +423 -0
  439. package/dist/services/subject-aware-ranking.d.ts +19 -0
  440. package/dist/services/subject-aware-ranking.js +161 -0
  441. package/dist/services/supplemental-extraction.d.ts +7 -0
  442. package/dist/services/supplemental-extraction.js +116 -0
  443. package/dist/services/tbc-execution.d.ts +49 -0
  444. package/dist/services/tbc-execution.js +284 -0
  445. package/dist/services/temporal-classifier.d.ts +56 -0
  446. package/dist/services/temporal-classifier.js +94 -0
  447. package/dist/services/temporal-endpoint-evidence.d.ts +12 -0
  448. package/dist/services/temporal-endpoint-evidence.js +313 -0
  449. package/dist/services/temporal-fingerprint.d.ts +6 -0
  450. package/dist/services/temporal-fingerprint.js +12 -0
  451. package/dist/services/temporal-format.d.ts +9 -0
  452. package/dist/services/temporal-format.js +21 -0
  453. package/dist/services/temporal-intent.d.ts +39 -0
  454. package/dist/services/temporal-intent.js +78 -0
  455. package/dist/services/temporal-query-constraints.d.ts +16 -0
  456. package/dist/services/temporal-query-constraints.js +107 -0
  457. package/dist/services/temporal-query-expansion.d.ts +14 -0
  458. package/dist/services/temporal-query-expansion.js +131 -0
  459. package/dist/services/temporal-rerank.d.ts +22 -0
  460. package/dist/services/temporal-rerank.js +47 -0
  461. package/dist/services/temporal-result-protection.d.ts +7 -0
  462. package/dist/services/temporal-result-protection.js +60 -0
  463. package/dist/services/temporal-state-write.d.ts +57 -0
  464. package/dist/services/temporal-state-write.js +45 -0
  465. package/dist/services/tiered-context.d.ts +87 -0
  466. package/dist/services/tiered-context.js +214 -0
  467. package/dist/services/tiered-loading.d.ts +88 -0
  468. package/dist/services/tiered-loading.js +263 -0
  469. package/dist/services/timeline-pack.d.ts +36 -0
  470. package/dist/services/timeline-pack.js +50 -0
  471. package/dist/services/timing.d.ts +13 -0
  472. package/dist/services/timing.js +72 -0
  473. package/dist/services/tll-augmentation.d.ts +20 -0
  474. package/dist/services/tll-augmentation.js +125 -0
  475. package/dist/services/tll-retrieval.d.ts +55 -0
  476. package/dist/services/tll-retrieval.js +101 -0
  477. package/dist/services/topic-abstraction.d.ts +36 -0
  478. package/dist/services/topic-abstraction.js +105 -0
  479. package/dist/services/trust-scoring.d.ts +43 -0
  480. package/dist/services/trust-scoring.js +89 -0
  481. package/dist/services/typed-belief-calculus.d.ts +126 -0
  482. package/dist/services/typed-belief-calculus.js +204 -0
  483. package/dist/services/upload-config.d.ts +34 -0
  484. package/dist/services/upload-config.js +23 -0
  485. package/dist/services/upload-decision.d.ts +65 -0
  486. package/dist/services/upload-decision.js +98 -0
  487. package/dist/services/upload-helpers.d.ts +107 -0
  488. package/dist/services/upload-helpers.js +148 -0
  489. package/dist/services/user-profile-builder.d.ts +22 -0
  490. package/dist/services/user-profile-builder.js +109 -0
  491. package/dist/services/voyage-embedding.d.ts +22 -0
  492. package/dist/services/voyage-embedding.js +77 -0
  493. package/dist/services/write-security.d.ts +31 -0
  494. package/dist/services/write-security.js +64 -0
  495. package/dist/storage/artifact-public-redaction.d.ts +34 -0
  496. package/dist/storage/artifact-public-redaction.js +83 -0
  497. package/dist/storage/cleanup.d.ts +103 -0
  498. package/dist/storage/cleanup.js +138 -0
  499. package/dist/storage/codec-factory.d.ts +17 -0
  500. package/dist/storage/codec-factory.js +33 -0
  501. package/dist/storage/codecs/aes-gcm-codec.d.ts +44 -0
  502. package/dist/storage/codecs/aes-gcm-codec.js +108 -0
  503. package/dist/storage/codecs/noop-codec.d.ts +16 -0
  504. package/dist/storage/codecs/noop-codec.js +23 -0
  505. package/dist/storage/factory.d.ts +44 -0
  506. package/dist/storage/factory.js +99 -0
  507. package/dist/storage/filecoin-cid-validation.d.ts +82 -0
  508. package/dist/storage/filecoin-cid-validation.js +122 -0
  509. package/dist/storage/filecoin-public-metadata.d.ts +73 -0
  510. package/dist/storage/filecoin-public-metadata.js +110 -0
  511. package/dist/storage/local-fs-store.d.ts +39 -0
  512. package/dist/storage/local-fs-store.js +145 -0
  513. package/dist/storage/pointer-uri-allowlist.d.ts +38 -0
  514. package/dist/storage/pointer-uri-allowlist.js +70 -0
  515. package/dist/storage/provider-metadata-projection.d.ts +27 -0
  516. package/dist/storage/provider-metadata-projection.js +68 -0
  517. package/dist/storage/providers/filecoin/backend.d.ts +42 -0
  518. package/dist/storage/providers/filecoin/backend.js +250 -0
  519. package/dist/storage/providers/filecoin/config.d.ts +70 -0
  520. package/dist/storage/providers/filecoin/config.js +275 -0
  521. package/dist/storage/providers/filecoin/errors.d.ts +45 -0
  522. package/dist/storage/providers/filecoin/errors.js +56 -0
  523. package/dist/storage/providers/filecoin/filecoin-pin-car.d.ts +78 -0
  524. package/dist/storage/providers/filecoin/filecoin-pin-car.js +155 -0
  525. package/dist/storage/providers/filecoin/filecoin-pin-client.d.ts +92 -0
  526. package/dist/storage/providers/filecoin/filecoin-pin-client.js +199 -0
  527. package/dist/storage/providers/filecoin/filecoin-pin-mapping.d.ts +58 -0
  528. package/dist/storage/providers/filecoin/filecoin-pin-mapping.js +103 -0
  529. package/dist/storage/providers/filecoin/filecoin-pin-timeout.d.ts +30 -0
  530. package/dist/storage/providers/filecoin/filecoin-pin-timeout.js +53 -0
  531. package/dist/storage/providers/filecoin/filecoin-pin-vendor.d.ts +111 -0
  532. package/dist/storage/providers/filecoin/filecoin-pin-vendor.js +87 -0
  533. package/dist/storage/providers/filecoin/hints.d.ts +71 -0
  534. package/dist/storage/providers/filecoin/hints.js +123 -0
  535. package/dist/storage/providers/filecoin/index.d.ts +51 -0
  536. package/dist/storage/providers/filecoin/index.js +103 -0
  537. package/dist/storage/providers/filecoin/ipfs-cid.d.ts +50 -0
  538. package/dist/storage/providers/filecoin/ipfs-cid.js +64 -0
  539. package/dist/storage/providers/filecoin/metadata.d.ts +72 -0
  540. package/dist/storage/providers/filecoin/metadata.js +137 -0
  541. package/dist/storage/providers/filecoin/piece-cid.d.ts +48 -0
  542. package/dist/storage/providers/filecoin/piece-cid.js +57 -0
  543. package/dist/storage/providers/filecoin/provider-client.d.ts +234 -0
  544. package/dist/storage/providers/filecoin/provider-client.js +27 -0
  545. package/dist/storage/providers/filecoin/readiness.d.ts +62 -0
  546. package/dist/storage/providers/filecoin/readiness.js +85 -0
  547. package/dist/storage/providers/filecoin/retriever.d.ts +82 -0
  548. package/dist/storage/providers/filecoin/retriever.js +63 -0
  549. package/dist/storage/providers/filecoin/skeleton-client.d.ts +36 -0
  550. package/dist/storage/providers/filecoin/skeleton-client.js +55 -0
  551. package/dist/storage/providers/filecoin/synapse-client.d.ts +169 -0
  552. package/dist/storage/providers/filecoin/synapse-client.js +343 -0
  553. package/dist/storage/providers/filecoin/synapse-construction.d.ts +26 -0
  554. package/dist/storage/providers/filecoin/synapse-construction.js +47 -0
  555. package/dist/storage/providers/filecoin/synapse-error-mapping.d.ts +23 -0
  556. package/dist/storage/providers/filecoin/synapse-error-mapping.js +49 -0
  557. package/dist/storage/providers/filecoin/synapse-readiness.d.ts +37 -0
  558. package/dist/storage/providers/filecoin/synapse-readiness.js +231 -0
  559. package/dist/storage/providers/filecoin/uri.d.ts +49 -0
  560. package/dist/storage/providers/filecoin/uri.js +84 -0
  561. package/dist/storage/providers/filecoin/verified-fetch-lifecycle.d.ts +77 -0
  562. package/dist/storage/providers/filecoin/verified-fetch-lifecycle.js +196 -0
  563. package/dist/storage/providers/filecoin/verified-fetch-retriever.d.ts +54 -0
  564. package/dist/storage/providers/filecoin/verified-fetch-retriever.js +81 -0
  565. package/dist/storage/providers/filecoin/verified-fetch-vendor.d.ts +71 -0
  566. package/dist/storage/providers/filecoin/verified-fetch-vendor.js +94 -0
  567. package/dist/storage/raw-content-codec.d.ts +89 -0
  568. package/dist/storage/raw-content-codec.js +47 -0
  569. package/dist/storage/raw-content-store-backend-adapter.d.ts +28 -0
  570. package/dist/storage/raw-content-store-backend-adapter.js +67 -0
  571. package/dist/storage/raw-content-store.d.ts +228 -0
  572. package/dist/storage/raw-content-store.js +27 -0
  573. package/dist/storage/s3-store.d.ts +42 -0
  574. package/dist/storage/s3-store.js +181 -0
  575. package/dist/storage/storage-backend-registry.d.ts +58 -0
  576. package/dist/storage/storage-backend-registry.js +56 -0
  577. package/dist/storage/storage-backend.d.ts +82 -0
  578. package/dist/storage/storage-backend.js +14 -0
  579. package/dist/storage/storage-capabilities.d.ts +56 -0
  580. package/dist/storage/storage-capabilities.js +170 -0
  581. package/dist/storage/store-registry.d.ts +67 -0
  582. package/dist/storage/store-registry.js +77 -0
  583. package/dist/vector-math.d.ts +15 -0
  584. package/dist/vector-math.js +31 -0
  585. package/dist/xml-escape.d.ts +5 -0
  586. package/dist/xml-escape.js +7 -0
  587. package/openapi.json +15395 -0
  588. package/openapi.yaml +10794 -0
  589. package/package.json +119 -0
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Tiered Context Loading (L0/L1/L2).
3
+ *
4
+ * Three representation tiers for each memory, inspired by OpenViking's
5
+ * SemanticDagExecutor pattern. Token savings come from injecting the
6
+ * cheapest tier that preserves enough signal for the model to act on.
7
+ *
8
+ * L0 — Abstract/headline (~10-20 tokens). Stored in `summary`.
9
+ * L1 — Condensed overview (~100-200 tokens). Stored in `overview`.
10
+ * L2 — Full content (variable). Stored in `content`.
11
+ *
12
+ * Tier selection is driven by a token budget: the caller declares how
13
+ * many tokens are available for context injection, and `assignTiers`
14
+ * decides the best tier per memory to maximize information within budget.
15
+ *
16
+ * Strategy:
17
+ * 1. Greedy L0-fit: include ranked memories at L0 only while the
18
+ * cumulative L0 sum fits the budget; tail that can't fit is excluded.
19
+ * 2. Within the included set, reserve L2 for the top 1–2 results.
20
+ * 3. Promote a bounded support slice to L1.
21
+ * 4. Track which exclusions and demotions were budget-driven (vs
22
+ * quota-driven) so callers can surface `meta.budget_constrained`
23
+ * truthfully without resorting to heuristics.
24
+ */
25
+ import type { SearchResult } from '../db/memory-repository.js';
26
+ export type ContextTier = 'L0' | 'L1' | 'L2';
27
+ export interface TierAssignment {
28
+ memoryId: string;
29
+ tier: ContextTier;
30
+ estimatedTokens: number;
31
+ }
32
+ export interface TierBudgetResult {
33
+ assignments: TierAssignment[];
34
+ totalTokens: number;
35
+ budgetUsed: number;
36
+ /** Memories that survived L0-fit and were rendered into the package. */
37
+ includedMemories: SearchResult[];
38
+ /** Memories dropped because their L0 representation did not fit the budget. */
39
+ excludedMemoryIds: string[];
40
+ /**
41
+ * Memories kept at a lower tier than they were eligible for, solely
42
+ * because the budget could not afford the upgrade. Quota-only blocks
43
+ * (e.g. MAX_L2_MEMORIES, l1Quota cap) are NOT recorded here — those
44
+ * are packaging policy and would not relax under a larger budget.
45
+ */
46
+ budgetLimitedPromotionIds: string[];
47
+ }
48
+ export interface TierAssignmentOptions {
49
+ forceRichTopHit?: boolean;
50
+ }
51
+ /**
52
+ * Estimate token count for a string using a simple character-based heuristic.
53
+ * Accurate enough for budget allocation (±20% vs real tokenizer).
54
+ */
55
+ export declare function estimateTokens(text: string): number;
56
+ /**
57
+ * Get the content string for a memory at the requested tier.
58
+ * Falls through to the next available tier if the requested one is empty.
59
+ */
60
+ export declare function getContentAtTier(memory: SearchResult, tier: ContextTier): string;
61
+ /**
62
+ * Determine the best tier for a single memory given a remaining budget.
63
+ * Tries L2 first, falls back to L1, then L0.
64
+ */
65
+ export declare function selectTierForBudget(memory: SearchResult, remainingBudget: number): TierAssignment;
66
+ /**
67
+ * Assign tiers to a ranked list of memories under a token budget.
68
+ *
69
+ * Compression-and-exclude policy:
70
+ * 1. Greedy L0-fit: include each memory at L0 only while the L0 sum
71
+ * fits the budget. Tail beyond that is dropped (excludedMemoryIds).
72
+ * 2. Reserve L2 for the top 1-2 included results.
73
+ * 3. Promote a bounded support slice to L1.
74
+ * 4. Track budget-driven (not quota-driven) failures to upgrade.
75
+ */
76
+ export declare function assignTiers(memories: SearchResult[], tokenBudget: number, options?: TierAssignmentOptions): TierBudgetResult;
77
+ /**
78
+ * Build the tiered injection payload: one entry per assignment, in
79
+ * assignment order. Driven off `assignments` (not `memories`) so
80
+ * memories that were excluded during L0-fit do not silently
81
+ * re-appear at L0. Throws if an assignment references a memory id
82
+ * not present in `memories` — that signals a caller bug.
83
+ */
84
+ export declare function buildTieredPayload(memories: SearchResult[], assignments: TierAssignment[]): Array<{
85
+ id: string;
86
+ tier: ContextTier;
87
+ content: string;
88
+ }>;
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Tiered Context Loading (L0/L1/L2).
3
+ *
4
+ * Three representation tiers for each memory, inspired by OpenViking's
5
+ * SemanticDagExecutor pattern. Token savings come from injecting the
6
+ * cheapest tier that preserves enough signal for the model to act on.
7
+ *
8
+ * L0 — Abstract/headline (~10-20 tokens). Stored in `summary`.
9
+ * L1 — Condensed overview (~100-200 tokens). Stored in `overview`.
10
+ * L2 — Full content (variable). Stored in `content`.
11
+ *
12
+ * Tier selection is driven by a token budget: the caller declares how
13
+ * many tokens are available for context injection, and `assignTiers`
14
+ * decides the best tier per memory to maximize information within budget.
15
+ *
16
+ * Strategy:
17
+ * 1. Greedy L0-fit: include ranked memories at L0 only while the
18
+ * cumulative L0 sum fits the budget; tail that can't fit is excluded.
19
+ * 2. Within the included set, reserve L2 for the top 1–2 results.
20
+ * 3. Promote a bounded support slice to L1.
21
+ * 4. Track which exclusions and demotions were budget-driven (vs
22
+ * quota-driven) so callers can surface `meta.budget_constrained`
23
+ * truthfully without resorting to heuristics.
24
+ */
25
+ const TOKENS_PER_CHAR = 0.25;
26
+ const MAX_L2_MEMORIES = 2;
27
+ const L2_BUDGET_SHARE = 0.6;
28
+ const TARGET_L2_SHARE = 0.2;
29
+ const TARGET_L1_SHARE = 0.3;
30
+ /**
31
+ * Estimate token count for a string using a simple character-based heuristic.
32
+ * Accurate enough for budget allocation (±20% vs real tokenizer).
33
+ */
34
+ export function estimateTokens(text) {
35
+ if (!text)
36
+ return 0;
37
+ return Math.ceil(text.length * TOKENS_PER_CHAR);
38
+ }
39
+ /**
40
+ * Get the content string for a memory at the requested tier.
41
+ * Falls through to the next available tier if the requested one is empty.
42
+ */
43
+ export function getContentAtTier(memory, tier) {
44
+ if (tier === 'L0') {
45
+ return memory.summary || truncateToHeadline(memory.content);
46
+ }
47
+ if (tier === 'L1') {
48
+ if (memory.overview)
49
+ return memory.overview;
50
+ return memory.content;
51
+ }
52
+ return memory.content;
53
+ }
54
+ /**
55
+ * Determine the best tier for a single memory given a remaining budget.
56
+ * Tries L2 first, falls back to L1, then L0.
57
+ */
58
+ export function selectTierForBudget(memory, remainingBudget) {
59
+ const l2Tokens = estimateTokens(memory.content);
60
+ if (l2Tokens <= remainingBudget) {
61
+ return { memoryId: memory.id, tier: 'L2', estimatedTokens: l2Tokens };
62
+ }
63
+ const l1Content = memory.overview || memory.content;
64
+ const l1Tokens = estimateTokens(l1Content);
65
+ if (l1Tokens <= remainingBudget && memory.overview) {
66
+ return { memoryId: memory.id, tier: 'L1', estimatedTokens: l1Tokens };
67
+ }
68
+ const l0Content = memory.summary || truncateToHeadline(memory.content);
69
+ const l0Tokens = estimateTokens(l0Content);
70
+ return { memoryId: memory.id, tier: 'L0', estimatedTokens: l0Tokens };
71
+ }
72
+ /**
73
+ * Assign tiers to a ranked list of memories under a token budget.
74
+ *
75
+ * Compression-and-exclude policy:
76
+ * 1. Greedy L0-fit: include each memory at L0 only while the L0 sum
77
+ * fits the budget. Tail beyond that is dropped (excludedMemoryIds).
78
+ * 2. Reserve L2 for the top 1-2 included results.
79
+ * 3. Promote a bounded support slice to L1.
80
+ * 4. Track budget-driven (not quota-driven) failures to upgrade.
81
+ */
82
+ export function assignTiers(memories, tokenBudget, options = {}) {
83
+ if (memories.length === 0) {
84
+ return { assignments: [], totalTokens: 0, budgetUsed: 0, includedMemories: [], excludedMemoryIds: [], budgetLimitedPromotionIds: [] };
85
+ }
86
+ const allTierOptions = memories.map(buildTierOptions);
87
+ const { included, includedTierOptions, excludedMemoryIds } = selectL0Fit(memories, allTierOptions, tokenBudget);
88
+ if (included.length === 0) {
89
+ return { assignments: [], totalTokens: 0, budgetUsed: 0, includedMemories: [], excludedMemoryIds, budgetLimitedPromotionIds: [] };
90
+ }
91
+ const assignments = includedTierOptions.map(({ L0 }) => ({ ...L0 }));
92
+ const topSliceCount = getTopSliceCount(included.length);
93
+ const l1Quota = getL1Quota(included.length, topSliceCount);
94
+ const budgetLimitedPromotionIds = [];
95
+ let remaining = tokenBudget - sumTokens(assignments);
96
+ if (options.forceRichTopHit) {
97
+ remaining = promoteFirstMemoryToRichContext(assignments, includedTierOptions, remaining, budgetLimitedPromotionIds);
98
+ }
99
+ const remainingL2Budget = Math.floor(tokenBudget * L2_BUDGET_SHARE);
100
+ promoteTopSliceToL2(assignments, includedTierOptions, remaining, remainingL2Budget, topSliceCount, budgetLimitedPromotionIds);
101
+ remaining = tokenBudget - sumTokens(assignments);
102
+ promoteSupportingSliceToL1(assignments, includedTierOptions, remaining, topSliceCount, l1Quota, budgetLimitedPromotionIds);
103
+ const totalTokens = sumTokens(assignments);
104
+ return {
105
+ assignments,
106
+ totalTokens,
107
+ budgetUsed: totalTokens,
108
+ includedMemories: included,
109
+ excludedMemoryIds,
110
+ budgetLimitedPromotionIds,
111
+ };
112
+ }
113
+ /**
114
+ * Tail-exclude L0 selector. Walks input in rank order and includes
115
+ * each memory while its L0 token cost fits the remaining budget. On
116
+ * the first overflow it stops and excludes the entire remaining
117
+ * suffix — preserving semantic priority (drop the least-relevant
118
+ * tail, never a higher-ranked memory in favor of a smaller
119
+ * lower-ranked one).
120
+ */
121
+ function selectL0Fit(memories, allTierOptions, tokenBudget) {
122
+ const included = [];
123
+ const includedTierOptions = [];
124
+ const excludedMemoryIds = [];
125
+ let used = 0;
126
+ let overflowed = false;
127
+ for (let i = 0; i < memories.length; i++) {
128
+ if (!overflowed) {
129
+ const l0Cost = allTierOptions[i].L0.estimatedTokens;
130
+ if (used + l0Cost <= tokenBudget) {
131
+ included.push(memories[i]);
132
+ includedTierOptions.push(allTierOptions[i]);
133
+ used += l0Cost;
134
+ continue;
135
+ }
136
+ overflowed = true;
137
+ }
138
+ excludedMemoryIds.push(memories[i].id);
139
+ }
140
+ return { included, includedTierOptions, excludedMemoryIds };
141
+ }
142
+ /**
143
+ * Build the tiered injection payload: one entry per assignment, in
144
+ * assignment order. Driven off `assignments` (not `memories`) so
145
+ * memories that were excluded during L0-fit do not silently
146
+ * re-appear at L0. Throws if an assignment references a memory id
147
+ * not present in `memories` — that signals a caller bug.
148
+ */
149
+ export function buildTieredPayload(memories, assignments) {
150
+ const memoryById = new Map(memories.map((m) => [m.id, m]));
151
+ return assignments.map((a) => {
152
+ const memory = memoryById.get(a.memoryId);
153
+ if (!memory) {
154
+ throw new Error(`buildTieredPayload: assignment references missing memory id "${a.memoryId}"`);
155
+ }
156
+ return {
157
+ id: a.memoryId,
158
+ tier: a.tier,
159
+ content: getContentAtTier(memory, a.tier),
160
+ };
161
+ });
162
+ }
163
+ const HEADLINE_MAX_WORDS = 10;
164
+ function truncateToHeadline(content) {
165
+ const words = content.split(/\s+/);
166
+ if (words.length <= HEADLINE_MAX_WORDS)
167
+ return content;
168
+ return words.slice(0, HEADLINE_MAX_WORDS).join(' ') + '...';
169
+ }
170
+ function buildTierOptions(memory) {
171
+ return {
172
+ L0: buildAssignment(memory, 'L0'),
173
+ L1: buildAssignment(memory, 'L1'),
174
+ L2: buildAssignment(memory, 'L2'),
175
+ };
176
+ }
177
+ function buildAssignment(memory, tier) {
178
+ const content = getContentAtTier(memory, tier);
179
+ return {
180
+ memoryId: memory.id,
181
+ tier,
182
+ estimatedTokens: estimateTokens(content),
183
+ };
184
+ }
185
+ /** True iff a larger budget would have allowed `chooseRichTopHit` to upgrade. */
186
+ function richTopHitHasBudgetUpgrade(options, baseline) {
187
+ return options.L2.estimatedTokens > baseline || options.L1.estimatedTokens > baseline;
188
+ }
189
+ function promoteFirstMemoryToRichContext(assignments, tierOptions, remainingBudget, budgetBlocked) {
190
+ if (assignments.length === 0)
191
+ return remainingBudget;
192
+ const baseline = assignments[0].estimatedTokens;
193
+ const preferredUpgrade = chooseRichTopHit(tierOptions[0], remainingBudget, baseline);
194
+ if (!preferredUpgrade) {
195
+ if (richTopHitHasBudgetUpgrade(tierOptions[0], baseline)) {
196
+ budgetBlocked.push(assignments[0].memoryId);
197
+ }
198
+ return remainingBudget;
199
+ }
200
+ assignments[0] = preferredUpgrade;
201
+ return remainingBudget - (preferredUpgrade.estimatedTokens - tierOptions[0].L0.estimatedTokens);
202
+ }
203
+ function chooseRichTopHit(options, remainingBudget, baselineTokens) {
204
+ const l2Extra = options.L2.estimatedTokens - baselineTokens;
205
+ if (l2Extra <= remainingBudget)
206
+ return options.L2;
207
+ const l1Extra = options.L1.estimatedTokens - baselineTokens;
208
+ if (options.L1.estimatedTokens > baselineTokens && l1Extra <= remainingBudget) {
209
+ return options.L1;
210
+ }
211
+ return null;
212
+ }
213
+ function promoteTopSliceToL2(assignments, tierOptions, remainingBudget, remainingL2Budget, topSliceCount, budgetBlocked) {
214
+ let remaining = remainingBudget;
215
+ let remainingL2 = remainingL2Budget;
216
+ for (let index = 0; index < topSliceCount; index++) {
217
+ const next = tierOptions[index].L2;
218
+ const extraTokens = next.estimatedTokens - assignments[index].estimatedTokens;
219
+ if (extraTokens > remaining || extraTokens > remainingL2) {
220
+ // Both bounds scale with tokenBudget (remainingL2 = floor(budget * L2_BUDGET_SHARE)),
221
+ // so a larger budget would have permitted the upgrade. Record budget block,
222
+ // but only if there was an actual upgrade available (extraTokens > 0).
223
+ if (extraTokens > 0)
224
+ budgetBlocked.push(assignments[index].memoryId);
225
+ continue;
226
+ }
227
+ assignments[index] = next;
228
+ remaining -= extraTokens;
229
+ remainingL2 -= extraTokens;
230
+ }
231
+ }
232
+ function promoteSupportingSliceToL1(assignments, tierOptions, remainingBudget, topSliceCount, l1Quota, budgetBlocked) {
233
+ let remaining = remainingBudget;
234
+ const stopIndex = Math.min(assignments.length, topSliceCount + l1Quota);
235
+ for (let index = topSliceCount; index < stopIndex; index++) {
236
+ const next = tierOptions[index].L1;
237
+ const extraTokens = next.estimatedTokens - assignments[index].estimatedTokens;
238
+ // No real upgrade (no `overview`, L1 collapses to L0). Not a budget question.
239
+ if (next.estimatedTokens === assignments[index].estimatedTokens)
240
+ continue;
241
+ if (extraTokens > remaining) {
242
+ budgetBlocked.push(assignments[index].memoryId);
243
+ continue;
244
+ }
245
+ assignments[index] = next;
246
+ remaining -= extraTokens;
247
+ }
248
+ }
249
+ function getTopSliceCount(totalMemories) {
250
+ if (totalMemories === 0)
251
+ return 0;
252
+ return Math.min(MAX_L2_MEMORIES, Math.max(1, Math.round(totalMemories * TARGET_L2_SHARE)));
253
+ }
254
+ function getL1Quota(totalMemories, topSliceCount) {
255
+ const remainingAfterTopSlice = totalMemories - topSliceCount;
256
+ if (remainingAfterTopSlice <= 1)
257
+ return Math.max(0, remainingAfterTopSlice);
258
+ const targetL1Count = Math.max(1, Math.floor(totalMemories * TARGET_L1_SHARE));
259
+ return Math.min(remainingAfterTopSlice - 1, targetL1Count);
260
+ }
261
+ function sumTokens(assignments) {
262
+ return assignments.reduce((sum, assignment) => sum + assignment.estimatedTokens, 0);
263
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Timeline-pack formatting — derived retrieval projection.
3
+ *
4
+ * Groups memories within a namespace that span multiple distinct dates into
5
+ * a chronologically-ordered timeline with the latest entry explicitly tagged
6
+ * [CURRENT]. This gives the answering LLM an unambiguous signal for which
7
+ * value is most recent, targeting knowledge-update failures where older
8
+ * values outrank newer ones in flat chronological injection.
9
+ *
10
+ * This is a formatting-only transform — same memories in, differently
11
+ * formatted text out. No changes to ingestion, retrieval, or storage.
12
+ */
13
+ import type { SearchResult } from '../db/memory-repository.js';
14
+ export interface TimelineEntry {
15
+ memoryId: string;
16
+ date: string;
17
+ content: string;
18
+ isCurrent: boolean;
19
+ }
20
+ export interface TimelinePack {
21
+ topic: string;
22
+ entries: TimelineEntry[];
23
+ latestEntryId: string;
24
+ }
25
+ /** True when memories span at least 2 distinct calendar dates. */
26
+ export declare function spansMultipleDates(memories: SearchResult[]): boolean;
27
+ /**
28
+ * Build a single timeline pack from memories sharing a namespace.
29
+ * Memories are sorted chronologically; the most recent gets isCurrent=true.
30
+ */
31
+ export declare function buildTimelinePack(topic: string, memories: SearchResult[]): TimelinePack;
32
+ /**
33
+ * Format a timeline pack as injection text.
34
+ * Each entry is a dash-delimited line; the latest carries a [CURRENT] tag.
35
+ */
36
+ export declare function formatTimelinePack(pack: TimelinePack): string;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Timeline-pack formatting — derived retrieval projection.
3
+ *
4
+ * Groups memories within a namespace that span multiple distinct dates into
5
+ * a chronologically-ordered timeline with the latest entry explicitly tagged
6
+ * [CURRENT]. This gives the answering LLM an unambiguous signal for which
7
+ * value is most recent, targeting knowledge-update failures where older
8
+ * values outrank newer ones in flat chronological injection.
9
+ *
10
+ * This is a formatting-only transform — same memories in, differently
11
+ * formatted text out. No changes to ingestion, retrieval, or storage.
12
+ */
13
+ import { isAnswerBearing } from './session-packaging.js';
14
+ /** True when memories span at least 2 distinct calendar dates. */
15
+ export function spansMultipleDates(memories) {
16
+ const dates = new Set();
17
+ for (const m of memories) {
18
+ dates.add(m.created_at.toISOString().slice(0, 10));
19
+ if (dates.size >= 2)
20
+ return true;
21
+ }
22
+ return false;
23
+ }
24
+ /**
25
+ * Build a single timeline pack from memories sharing a namespace.
26
+ * Memories are sorted chronologically; the most recent gets isCurrent=true.
27
+ */
28
+ export function buildTimelinePack(topic, memories) {
29
+ const sorted = [...memories].sort((a, b) => a.created_at.getTime() - b.created_at.getTime());
30
+ const latestEntry = sorted[sorted.length - 1];
31
+ const entries = sorted.map((m) => ({
32
+ memoryId: m.id,
33
+ date: m.created_at.toISOString().slice(0, 10),
34
+ content: m.content,
35
+ isCurrent: m.id === latestEntry.id,
36
+ }));
37
+ return { topic, entries, latestEntryId: latestEntry.id };
38
+ }
39
+ /**
40
+ * Format a timeline pack as injection text.
41
+ * Each entry is a dash-delimited line; the latest carries a [CURRENT] tag.
42
+ */
43
+ export function formatTimelinePack(pack) {
44
+ const lines = pack.entries.map((e) => {
45
+ const kind = isAnswerBearing(e.content) ? 'answer' : 'context';
46
+ const currentTag = e.isCurrent ? ' [CURRENT]' : '';
47
+ return `- [${e.date}] [${kind}]${currentTag} ${e.content}`;
48
+ });
49
+ return `### Timeline: ${pack.topic}\n${lines.join('\n')}`;
50
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Lightweight timing instrumentation for profiling search and ingest paths.
3
+ * Collects per-operation latencies and reports P50/P95/P99 summaries.
4
+ */
5
+ export interface TimingEntry {
6
+ operation: string;
7
+ durationMs: number;
8
+ metadata?: Record<string, unknown>;
9
+ }
10
+ /** Time an async operation and record its duration. */
11
+ export declare function timed<T>(operation: string, fn: () => Promise<T>, metadata?: Record<string, unknown>): Promise<T>;
12
+ /** Time a sync operation and record its duration. */
13
+ export declare function timedSync<T>(operation: string, fn: () => T, metadata?: Record<string, unknown>): T;
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Lightweight timing instrumentation for profiling search and ingest paths.
3
+ * Collects per-operation latencies and reports P50/P95/P99 summaries.
4
+ */
5
+ const entries = [];
6
+ /** Time an async operation and record its duration. */
7
+ export async function timed(operation, fn, metadata) {
8
+ const start = performance.now();
9
+ const result = await fn();
10
+ const durationMs = performance.now() - start;
11
+ entries.push({ operation, durationMs, metadata });
12
+ console.log(`[timing] ${operation}: ${durationMs.toFixed(1)}ms`);
13
+ return result;
14
+ }
15
+ /** Time a sync operation and record its duration. */
16
+ export function timedSync(operation, fn, metadata) {
17
+ const start = performance.now();
18
+ const result = fn();
19
+ const durationMs = performance.now() - start;
20
+ entries.push({ operation, durationMs, metadata });
21
+ console.log(`[timing] ${operation}: ${durationMs.toFixed(1)}ms`);
22
+ return result;
23
+ }
24
+ /** Get all collected timing entries. */
25
+ function getTimingEntries() {
26
+ return [...entries];
27
+ }
28
+ /** Clear collected entries. */
29
+ function clearTimingEntries() {
30
+ entries.length = 0;
31
+ }
32
+ /** Compute percentile from sorted array. */
33
+ function percentile(sorted, p) {
34
+ if (sorted.length === 0)
35
+ return 0;
36
+ const idx = Math.ceil((p / 100) * sorted.length) - 1;
37
+ return sorted[Math.max(0, idx)];
38
+ }
39
+ /** Generate a summary report of all collected timings, grouped by operation. */
40
+ function getTimingSummary() {
41
+ const grouped = new Map();
42
+ for (const entry of entries) {
43
+ const list = grouped.get(entry.operation) ?? [];
44
+ list.push(entry.durationMs);
45
+ grouped.set(entry.operation, list);
46
+ }
47
+ const summary = {};
48
+ for (const [op, durations] of grouped) {
49
+ const sorted = [...durations].sort((a, b) => a - b);
50
+ const total = sorted.reduce((a, b) => a + b, 0);
51
+ summary[op] = {
52
+ count: sorted.length,
53
+ p50: percentile(sorted, 50),
54
+ p95: percentile(sorted, 95),
55
+ p99: percentile(sorted, 99),
56
+ mean: total / sorted.length,
57
+ total,
58
+ };
59
+ }
60
+ return summary;
61
+ }
62
+ /** Print a formatted timing report to console. */
63
+ function printTimingReport() {
64
+ const summary = getTimingSummary();
65
+ console.log('\n=== TIMING REPORT ===');
66
+ console.log('| Operation | Count | P50 | P95 | P99 | Mean | Total |');
67
+ console.log('|-----------|-------|-----|-----|-----|------|-------|');
68
+ for (const [op, stats] of Object.entries(summary).sort((a, b) => b[1].total - a[1].total)) {
69
+ console.log(`| ${op} | ${stats.count} | ${stats.p50.toFixed(1)}ms | ${stats.p95.toFixed(1)}ms | ${stats.p99.toFixed(1)}ms | ${stats.mean.toFixed(1)}ms | ${stats.total.toFixed(0)}ms |`);
70
+ }
71
+ console.log();
72
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * TLL chain-membership augmentation for `performSearch`.
3
+ *
4
+ * Extracted from `memory-search.ts` to keep that orchestrator focused on
5
+ * pipeline coordination and to bring the file back under the 400 LOC
6
+ * project cap. The augmentation runs AFTER `applySearchRelevanceFilter`
7
+ * (see `appendTllAugmentation`); chain membership is a different
8
+ * retrieval signal than semantic similarity, so the augmented rows
9
+ * don't pass through the similarity gate.
10
+ */
11
+ import type { TraceCollector } from './retrieval-trace.js';
12
+ import type { MemoryServiceDeps } from './memory-service-types.js';
13
+ import type { PostProcessedSearch } from './memory-search-types.js';
14
+ /**
15
+ * Append TLL chain-membership augmentations after the relevance gate.
16
+ * The augmented rows ride around the similarity threshold because chain
17
+ * membership is a structurally different signal — they have no
18
+ * meaningful similarity score against the query.
19
+ */
20
+ export declare function appendTllAugmentation(deps: MemoryServiceDeps, userId: string, query: string, postProcessed: PostProcessedSearch, effectiveLimit: number, activeTrace: TraceCollector): Promise<PostProcessedSearch>;
@@ -0,0 +1,125 @@
1
+ /**
2
+ * TLL chain-membership augmentation for `performSearch`.
3
+ *
4
+ * Extracted from `memory-search.ts` to keep that orchestrator focused on
5
+ * pipeline coordination and to bring the file back under the 400 LOC
6
+ * project cap. The augmentation runs AFTER `applySearchRelevanceFilter`
7
+ * (see `appendTllAugmentation`); chain membership is a different
8
+ * retrieval signal than semantic similarity, so the augmented rows
9
+ * don't pass through the similarity gate.
10
+ */
11
+ import { normalizeMemoryRow } from '../db/repository-types.js';
12
+ import { shouldUseTLL, expandViaTLL, TLL_ENTITY_LOOKUP_SEED_LIMIT } from './tll-retrieval.js';
13
+ /**
14
+ * Append TLL chain-membership augmentations after the relevance gate.
15
+ * The augmented rows ride around the similarity threshold because chain
16
+ * membership is a structurally different signal — they have no
17
+ * meaningful similarity score against the query.
18
+ */
19
+ export async function appendTllAugmentation(deps, userId, query, postProcessed, effectiveLimit, activeTrace) {
20
+ const result = await maybeExpandViaTLL(deps, userId, query, postProcessed.memories, effectiveLimit);
21
+ // Surface the fail-open path on the retrieval trace as a distinct
22
+ // event so the failure is observable in trace artifacts even when no
23
+ // augmentation rows are produced. Pairs with the structured
24
+ // `[tll-expansion-failed]` log line emitted by `maybeExpandViaTLL`.
25
+ if (result.failed) {
26
+ activeTrace.event('tll_expansion_failed', { errorMessage: result.errorMessage });
27
+ }
28
+ if (result.memories.length === 0)
29
+ return postProcessed;
30
+ activeTrace.stage('tll-augmentation', [...postProcessed.memories, ...result.memories], {
31
+ addedCount: result.memories.length,
32
+ addedIds: result.memories.map((m) => m.id),
33
+ });
34
+ return {
35
+ ...postProcessed,
36
+ memories: [...postProcessed.memories, ...result.memories],
37
+ };
38
+ }
39
+ /**
40
+ * TLL retrieval signal. For ordering/temporal/multi-session queries, expand
41
+ * the candidate set by traversing entity event chains. Returns hydrated
42
+ * SearchResult rows tagged with `retrieval_signal: 'tll-chain'` so the
43
+ * relevance gate can recognize them as non-similarity-scored augmentations.
44
+ *
45
+ * Fail-open by design: chain expansion errors never block primary
46
+ * retrieval. The deliberate fallback is to log the error with a
47
+ * structured `[tll-expansion-failed]` prefix and surface a
48
+ * `tll_expansion_failed` event on the retrieval trace so the failure is
49
+ * observable rather than lost.
50
+ */
51
+ async function maybeExpandViaTLL(deps, userId, query, memories, effectiveLimit) {
52
+ if (!deps.tllRepository || memories.length === 0 || !shouldUseTLL(query)) {
53
+ return { memories: [], failed: false };
54
+ }
55
+ try {
56
+ const initialIds = memories.slice(0, TLL_ENTITY_LOOKUP_SEED_LIMIT).map((m) => m.id);
57
+ const chainIds = await expandViaTLL(userId, initialIds, deps.tllRepository, deps.stores.pool);
58
+ const knownIds = new Set(memories.map((m) => m.id));
59
+ const newIds = chainIds.filter((id) => !knownIds.has(id)).slice(0, effectiveLimit);
60
+ if (newIds.length === 0)
61
+ return { memories: [], failed: false };
62
+ const hydrated = await hydrateChainMemories(deps, userId, newIds);
63
+ console.log(`[tll-retrieval] expanded ${newIds.length} chain memories for ordering query`);
64
+ return { memories: hydrated, failed: false };
65
+ }
66
+ catch (err) {
67
+ // Fail-open: TLL is augmentation, never block primary retrieval.
68
+ // Structured prefix `[tll-expansion-failed]` lets log scrapers
69
+ // pick this up as a distinct failure class. The retrieval-trace
70
+ // event is added by the caller (see `appendTllAugmentation`).
71
+ const errorMessage = err instanceof Error ? err.message : String(err);
72
+ console.error('[tll-expansion-failed]', errorMessage);
73
+ return { memories: [], failed: true, errorMessage };
74
+ }
75
+ }
76
+ /**
77
+ * Direct SQL hydration into SearchResult shape — bypasses the store
78
+ * abstraction since this is a deterministic chain-traversal augmentation,
79
+ * not a similarity search. Selects the full memories row and runs it
80
+ * through `normalizeMemoryRow` so every required `MemoryRow` field is
81
+ * present (response formatters call `.toFixed()` on `score`/`similarity`
82
+ * and read `source_site`/`summary` directly — partial rows crash there).
83
+ *
84
+ * Three non-obvious requirements addressed by the SQL + projection shape:
85
+ *
86
+ * 1. Order preservation. `expandViaTLL` returns memory IDs in
87
+ * chronological observation_date order; a plain `WHERE id = ANY(...)`
88
+ * does not preserve input order. Joining against
89
+ * `unnest($2::uuid[]) WITH ORDINALITY` and `ORDER BY req.ord`
90
+ * keeps the chronology intact through hydration.
91
+ *
92
+ * 2. Workspace isolation. `performSearch` is the global retrieval
93
+ * path — `postProcessResults` already drops workspace-scoped rows
94
+ * before TLL augmentation, but the augmented rows hydrate from a
95
+ * separate query and must apply the same filter, otherwise a
96
+ * workspace memory chained from a global memory's entity would
97
+ * leak into a global response.
98
+ *
99
+ * 3. Defensive `relevance: 1.0`. The augmented rows are appended after
100
+ * `applySearchRelevanceFilter`, so they don't pass through the
101
+ * similarity gate today. But chain-membership rows have no
102
+ * meaningful similarity score against the query — `similarity: 0`
103
+ * and `score: 0` make them load-bearing on the relevance value if
104
+ * any future filter past this point checks `memory.relevance >=
105
+ * threshold`. Setting `relevance: 1.0` (the max) locks in the
106
+ * bypass invariant against drift; the `retrieval_signal: 'tll-chain'`
107
+ * tag remains the canonical way to detect a chain-augmented row.
108
+ */
109
+ async function hydrateChainMemories(deps, userId, newIds) {
110
+ const hydratedRes = await deps.stores.pool.query(`SELECT m.*
111
+ FROM unnest($2::uuid[]) WITH ORDINALITY AS req(id, ord)
112
+ JOIN memories m ON m.id = req.id
113
+ WHERE m.user_id = $1
114
+ AND m.deleted_at IS NULL
115
+ AND m.status = 'active'
116
+ AND m.workspace_id IS NULL
117
+ ORDER BY req.ord`, [userId, newIds]);
118
+ return hydratedRes.rows.map((row) => ({
119
+ ...normalizeMemoryRow(row),
120
+ similarity: 0,
121
+ score: 0,
122
+ relevance: 1.0,
123
+ retrieval_signal: 'tll-chain',
124
+ }));
125
+ }