@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,146 @@
1
+ /**
2
+ * Packaging and assembly observability helpers.
3
+ *
4
+ * Builds explicit summaries for the packaged context emitted by search()
5
+ * without changing candidate membership, ranking, or canonical storage.
6
+ */
7
+ import { isAnswerBearing, sortBySessionPriority } from './session-packaging.js';
8
+ import { estimateTokens } from './tiered-loading.js';
9
+ import { buildTimelinePack, spansMultipleDates } from './timeline-pack.js';
10
+ import { deduplicateCompositeMembersHard } from './composite-dedup.js';
11
+ function buildPackagingTraceSummary(candidateMemories, includedMemories, mode, injectionText, estimatedTokenCost) {
12
+ const groups = groupByNamespace(includedMemories);
13
+ const packageType = resolvePackageType(groups, mode);
14
+ const ordered = orderIncludedMemories(groups, mode);
15
+ const includedIds = ordered.map((memory) => memory.id);
16
+ const includedSet = new Set(includedIds);
17
+ return {
18
+ packageType,
19
+ includedIds,
20
+ droppedIds: candidateMemories.map((memory) => memory.id).filter((id) => !includedSet.has(id)),
21
+ evidenceRoles: buildEvidenceRoles(groups, ordered, mode),
22
+ episodeCount: countDistinctEpisodes(includedMemories),
23
+ dateCount: countDistinctDates(includedMemories),
24
+ hasCurrentMarker: packageType === 'timeline-pack',
25
+ hasConflictBlock: false,
26
+ tokenCost: estimatedTokenCost ?? estimateTokens(injectionText),
27
+ };
28
+ }
29
+ function buildAssemblyTraceSummary(packaging, tokenBudget) {
30
+ return {
31
+ finalIds: packaging.includedIds,
32
+ finalTokenCost: packaging.tokenCost,
33
+ tokenBudget: tokenBudget ?? null,
34
+ primaryEvidencePosition: resolvePrimaryEvidencePosition(packaging),
35
+ blocks: resolveAssemblyBlocks(packaging.packageType),
36
+ };
37
+ }
38
+ function groupByNamespace(memories) {
39
+ const groups = new Map();
40
+ for (const memory of memories) {
41
+ const namespace = memory.namespace || 'general';
42
+ const existing = groups.get(namespace);
43
+ if (existing) {
44
+ existing.push(memory);
45
+ continue;
46
+ }
47
+ groups.set(namespace, [memory]);
48
+ }
49
+ return [...groups.entries()].map(([namespace, grouped]) => ({ namespace, memories: grouped }));
50
+ }
51
+ function resolvePackageType(groups, mode) {
52
+ if (mode !== 'flat')
53
+ return 'tiered';
54
+ return groups.some((group) => spansMultipleDates(group.memories)) ? 'timeline-pack' : 'subject-pack';
55
+ }
56
+ function orderIncludedMemories(groups, mode) {
57
+ if (mode !== 'flat') {
58
+ return [...groups.flatMap((group) => group.memories)]
59
+ .sort((left, right) => left.created_at.getTime() - right.created_at.getTime());
60
+ }
61
+ return groups.flatMap((group) => orderGroup(group));
62
+ }
63
+ function orderGroup(group) {
64
+ if (spansMultipleDates(group.memories)) {
65
+ return buildTimelinePack(group.namespace, group.memories)
66
+ .entries
67
+ .map((entry) => group.memories.find((memory) => memory.id === entry.memoryId))
68
+ .filter((memory) => memory !== undefined);
69
+ }
70
+ return sortBySessionPriority(group.memories);
71
+ }
72
+ function buildEvidenceRoles(groups, ordered, mode) {
73
+ const timelineNamespaces = new Set(getTimelineNamespaces(groups, mode));
74
+ const timelineLatestIds = new Set(getTimelineLatestIds(groups, mode));
75
+ return Object.fromEntries(ordered.map((memory) => [
76
+ memory.id,
77
+ resolveEvidenceRole(memory, mode, timelineNamespaces, timelineLatestIds),
78
+ ]));
79
+ }
80
+ function getTimelineNamespaces(groups, mode) {
81
+ if (mode !== 'flat')
82
+ return [];
83
+ return groups.filter((group) => spansMultipleDates(group.memories)).map((group) => group.namespace);
84
+ }
85
+ function getTimelineLatestIds(groups, mode) {
86
+ if (mode !== 'flat')
87
+ return [];
88
+ return groups
89
+ .filter((group) => spansMultipleDates(group.memories))
90
+ .map((group) => buildTimelinePack(group.namespace, group.memories).latestEntryId);
91
+ }
92
+ function resolveEvidenceRole(memory, mode, timelineNamespaces, timelineLatestIds) {
93
+ if (timelineLatestIds.has(memory.id))
94
+ return 'primary';
95
+ if (mode !== 'flat')
96
+ return isAnswerBearing(memory.content) ? 'primary' : 'contextual';
97
+ const isTimelineMemory = timelineNamespaces.has(memory.namespace || 'general');
98
+ if (isAnswerBearing(memory.content))
99
+ return isTimelineMemory ? 'historical' : 'primary';
100
+ if (isTimelineMemory)
101
+ return 'contextual';
102
+ return 'supporting';
103
+ }
104
+ function countDistinctEpisodes(memories) {
105
+ return new Set(memories.map((memory) => memory.episode_id).filter(Boolean)).size;
106
+ }
107
+ function countDistinctDates(memories) {
108
+ return new Set(memories.map((memory) => memory.created_at.toISOString().slice(0, 10))).size;
109
+ }
110
+ function resolvePrimaryEvidencePosition(packaging) {
111
+ const position = packaging.includedIds.findIndex((id) => packaging.evidenceRoles[id] === 'primary');
112
+ return position === -1 ? null : position + 1;
113
+ }
114
+ function resolveAssemblyBlocks(packageType) {
115
+ if (packageType === 'tiered')
116
+ return ['tiered'];
117
+ if (packageType === 'timeline-pack')
118
+ return ['timeline'];
119
+ return ['subject'];
120
+ }
121
+ /**
122
+ * Build packaging + assembly summaries, emit the tiered-packaging trace
123
+ * event when in tiered mode, and attach both summaries to the active
124
+ * trace. Returns the summaries so the caller can include them in the
125
+ * retrieval result. Does NOT finalize the trace — caller owns that.
126
+ */
127
+ export function finalizePackagingTrace(activeTrace, input) {
128
+ const packagedForSummary = input.mode === 'flat'
129
+ ? input.outputMemories
130
+ : deduplicateCompositeMembersHard(input.outputMemories);
131
+ const packagingSummary = buildPackagingTraceSummary(input.outputMemories, packagedForSummary, input.mode, input.injectionText, input.estimatedContextTokens);
132
+ const assemblySummary = buildAssemblyTraceSummary(packagingSummary, input.mode === 'flat' ? undefined : input.tokenBudget);
133
+ if (input.mode === 'tiered') {
134
+ activeTrace.event('tiered-packaging', {
135
+ budget: input.tokenBudget ?? null,
136
+ estimatedTokens: input.estimatedContextTokens,
137
+ tierDistribution: input.tierAssignments?.reduce((acc, a) => {
138
+ acc[a.tier] = (acc[a.tier] || 0) + 1;
139
+ return acc;
140
+ }, {}),
141
+ });
142
+ }
143
+ activeTrace.setPackagingSummary(packagingSummary);
144
+ activeTrace.setAssemblySummary(assemblySummary);
145
+ return { packagingSummary, assemblySummary };
146
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Query expansion via entity graph bridging.
3
+ *
4
+ * Two modes:
5
+ * 1. **Query augmentation** (zero-LLM): Embeds the query, matches against
6
+ * entity embeddings, appends top entity names to the query text before
7
+ * the main vector search. Sub-millisecond cost, improves cold-path
8
+ * retrieval by grounding generic queries in user-specific context.
9
+ *
10
+ * 2. **LLM-based expansion**: Extracts entity names and concepts from the
11
+ * query via LLM, looks them up in the entity graph, traverses relations,
12
+ * and returns memory IDs that are conceptually related but not
13
+ * embedding-adjacent.
14
+ *
15
+ * Example (augmentation): "How should I implement caching?" → matches
16
+ * entities [Python, Redis, FastAPI] → augmented query becomes
17
+ * "How should I implement caching? [context: Python, Redis, FastAPI]"
18
+ */
19
+ import type { CoreRuntimeConfig } from '../app/runtime-container.js';
20
+ import type { SearchResult } from '../db/repository-types.js';
21
+ import type { SearchStore, EntityStore } from '../db/stores.js';
22
+ type SearchExpansionRuntimeConfig = Pick<CoreRuntimeConfig, 'queryExpansionMinSimilarity' | 'queryAugmentationMaxEntities' | 'queryAugmentationMinSimilarity'>;
23
+ export interface QueryExpansionResult {
24
+ extractedEntities: string[];
25
+ extractedConcepts: string[];
26
+ matchedEntityIds: string[];
27
+ expandedMemoryIds: string[];
28
+ }
29
+ /** Parse LLM response into structured terms. Pure function for testability. */
30
+ export declare function parseQueryTerms(response: string): {
31
+ entities: string[];
32
+ concepts: string[];
33
+ };
34
+ /**
35
+ * Run full query expansion: extract terms → find entities → traverse
36
+ * relations → retrieve bridging memories.
37
+ */
38
+ export declare function expandQueryViaEntities(entityRepo: EntityStore, repo: SearchStore, userId: string, query: string, queryEmbedding: number[], excludeIds: Set<string>, budget: number, runtimeConfig?: SearchExpansionRuntimeConfig): Promise<{
39
+ memories: SearchResult[];
40
+ expansion: QueryExpansionResult;
41
+ }>;
42
+ export interface QueryAugmentationResult {
43
+ originalQuery: string;
44
+ augmentedQuery: string;
45
+ matchedEntities: Array<{
46
+ name: string;
47
+ entityType: string;
48
+ similarity: number;
49
+ }>;
50
+ }
51
+ /**
52
+ * Augment a query with entity names from the memory graph.
53
+ *
54
+ * Uses the query embedding (already computed) to find semantically matching
55
+ * entities, then appends their names as context hints to the query text.
56
+ * This grounds generic queries in the user's specific context without any
57
+ * LLM call.
58
+ *
59
+ * Returns the augmented query string and metadata about matched entities.
60
+ * If no entities match above threshold, returns the original query unchanged.
61
+ */
62
+ export declare function augmentQueryWithEntities(entityRepo: EntityStore, userId: string, query: string, queryEmbedding: number[], runtimeConfig?: SearchExpansionRuntimeConfig): Promise<QueryAugmentationResult>;
63
+ /**
64
+ * Extract capitalized multi-word phrases and proper nouns from a query.
65
+ * These are candidate entity names for exact-match co-retrieval.
66
+ *
67
+ * Matches patterns like "Acme Corp", "New Zealand", "Studio Ghibli",
68
+ * single capitalized words like "Redis", and quoted phrases.
69
+ */
70
+ export declare function extractNamedEntityCandidates(query: string): string[];
71
+ /**
72
+ * Co-retrieve all memories linked to entities whose names appear in the query.
73
+ * Uses exact name matching (case-insensitive) — no embedding or LLM needed.
74
+ *
75
+ * This ensures that when a user asks about "Acme Corp", all memories linked
76
+ * to the Acme Corp entity are included in the result set, even if their
77
+ * content embeddings don't match the query semantically.
78
+ */
79
+ export declare function coRetrieveByEntityNames(entityRepo: EntityStore, repo: SearchStore, userId: string, query: string, queryEmbedding: number[], excludeIds: Set<string>, budget: number): Promise<{
80
+ memories: SearchResult[];
81
+ matchedNames: string[];
82
+ }>;
83
+ export {};
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Query expansion via entity graph bridging.
3
+ *
4
+ * Two modes:
5
+ * 1. **Query augmentation** (zero-LLM): Embeds the query, matches against
6
+ * entity embeddings, appends top entity names to the query text before
7
+ * the main vector search. Sub-millisecond cost, improves cold-path
8
+ * retrieval by grounding generic queries in user-specific context.
9
+ *
10
+ * 2. **LLM-based expansion**: Extracts entity names and concepts from the
11
+ * query via LLM, looks them up in the entity graph, traverses relations,
12
+ * and returns memory IDs that are conceptually related but not
13
+ * embedding-adjacent.
14
+ *
15
+ * Example (augmentation): "How should I implement caching?" → matches
16
+ * entities [Python, Redis, FastAPI] → augmented query becomes
17
+ * "How should I implement caching? [context: Python, Redis, FastAPI]"
18
+ */
19
+ import { config } from '../config.js';
20
+ import { llm } from './llm.js';
21
+ import { embedText } from './embedding.js';
22
+ const ENTITY_EXTRACTION_PROMPT = 'Extract entity names and conceptual topics from this search query. ' +
23
+ 'Return a JSON object with two arrays: ' +
24
+ '"entities" (specific named things: tools, people, projects, places, organizations) and ' +
25
+ '"concepts" (abstract topics: caching, deployment, testing, fitness, cooking). ' +
26
+ 'Be thorough — include implicit references. ' +
27
+ 'Example: "How should I cache my API?" → {"entities":["API"],"concepts":["caching","performance"]}. ' +
28
+ 'Return ONLY valid JSON, no explanation.';
29
+ /** Extract entity names and concepts from a query using the LLM. */
30
+ async function extractQueryTerms(query) {
31
+ const response = await llm.chat([
32
+ { role: 'system', content: ENTITY_EXTRACTION_PROMPT },
33
+ { role: 'user', content: query },
34
+ ], { temperature: 0, maxTokens: 200 });
35
+ return parseQueryTerms(response);
36
+ }
37
+ /** Parse LLM response into structured terms. Pure function for testability. */
38
+ export function parseQueryTerms(response) {
39
+ const fallback = { entities: [], concepts: [] };
40
+ try {
41
+ const parsed = JSON.parse(response.trim());
42
+ const entities = Array.isArray(parsed.entities)
43
+ ? parsed.entities.filter((e) => typeof e === 'string' && e.trim().length > 0)
44
+ : [];
45
+ const concepts = Array.isArray(parsed.concepts)
46
+ ? parsed.concepts.filter((c) => typeof c === 'string' && c.trim().length > 0)
47
+ : [];
48
+ return { entities, concepts };
49
+ }
50
+ catch {
51
+ return fallback;
52
+ }
53
+ }
54
+ /**
55
+ * Search entities by name (case-insensitive substring match).
56
+ * Returns entity IDs that match any of the provided terms.
57
+ */
58
+ async function findEntitiesByTerms(entityRepo, userId, terms, limit, runtimeConfig = config) {
59
+ if (terms.length === 0)
60
+ return [];
61
+ const allIds = new Set();
62
+ for (const term of terms) {
63
+ const embedding = await embedText(term);
64
+ const matches = await entityRepo.searchEntities(userId, embedding, limit, runtimeConfig.queryExpansionMinSimilarity);
65
+ for (const match of matches) {
66
+ allIds.add(match.id);
67
+ }
68
+ }
69
+ return [...allIds];
70
+ }
71
+ /**
72
+ * Run full query expansion: extract terms → find entities → traverse
73
+ * relations → retrieve bridging memories.
74
+ */
75
+ export async function expandQueryViaEntities(entityRepo, repo, userId, query, queryEmbedding, excludeIds, budget, runtimeConfig = config) {
76
+ const { entities, concepts } = await extractQueryTerms(query);
77
+ const allTerms = [...entities, ...concepts];
78
+ if (allTerms.length === 0) {
79
+ return {
80
+ memories: [],
81
+ expansion: { extractedEntities: entities, extractedConcepts: concepts, matchedEntityIds: [], expandedMemoryIds: [] },
82
+ };
83
+ }
84
+ const matchedEntityIds = await findEntitiesByTerms(entityRepo, userId, allTerms, 10, runtimeConfig);
85
+ if (matchedEntityIds.length === 0) {
86
+ return {
87
+ memories: [],
88
+ expansion: { extractedEntities: entities, extractedConcepts: concepts, matchedEntityIds: [], expandedMemoryIds: [] },
89
+ };
90
+ }
91
+ const relatedEntityIds = await entityRepo.findRelatedEntityIds(userId, matchedEntityIds, new Set(matchedEntityIds), budget);
92
+ const allEntityIds = [...matchedEntityIds, ...relatedEntityIds];
93
+ const memoryIds = await entityRepo.findMemoryIdsByEntities(userId, allEntityIds, excludeIds, budget);
94
+ if (memoryIds.length === 0) {
95
+ return {
96
+ memories: [],
97
+ expansion: { extractedEntities: entities, extractedConcepts: concepts, matchedEntityIds, expandedMemoryIds: [] },
98
+ };
99
+ }
100
+ const memories = await repo.fetchMemoriesByIds(userId, memoryIds, queryEmbedding);
101
+ return {
102
+ memories,
103
+ expansion: {
104
+ extractedEntities: entities,
105
+ extractedConcepts: concepts,
106
+ matchedEntityIds,
107
+ expandedMemoryIds: memoryIds,
108
+ },
109
+ };
110
+ }
111
+ /**
112
+ * Augment a query with entity names from the memory graph.
113
+ *
114
+ * Uses the query embedding (already computed) to find semantically matching
115
+ * entities, then appends their names as context hints to the query text.
116
+ * This grounds generic queries in the user's specific context without any
117
+ * LLM call.
118
+ *
119
+ * Returns the augmented query string and metadata about matched entities.
120
+ * If no entities match above threshold, returns the original query unchanged.
121
+ */
122
+ export async function augmentQueryWithEntities(entityRepo, userId, query, queryEmbedding, runtimeConfig = config) {
123
+ const matches = await entityRepo.searchEntities(userId, queryEmbedding, runtimeConfig.queryAugmentationMaxEntities, runtimeConfig.queryAugmentationMinSimilarity);
124
+ const matchedEntities = matches.map((e) => ({
125
+ name: e.name,
126
+ entityType: e.entity_type,
127
+ similarity: e.similarity,
128
+ }));
129
+ if (matchedEntities.length === 0) {
130
+ return { originalQuery: query, augmentedQuery: query, matchedEntities: [] };
131
+ }
132
+ const entityNames = matchedEntities.map((e) => e.name);
133
+ const augmentedQuery = `${query} [context: ${entityNames.join(', ')}]`;
134
+ return { originalQuery: query, augmentedQuery, matchedEntities };
135
+ }
136
+ // ─── Entity Name Co-Retrieval ─────────────────────────────────────────
137
+ /** Common English words that appear capitalized but aren't entity names. */
138
+ const STOP_WORDS = new Set([
139
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
140
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
141
+ 'should', 'may', 'might', 'can', 'shall', 'must', 'need', 'dare',
142
+ 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as',
143
+ 'into', 'through', 'during', 'before', 'after', 'above', 'below',
144
+ 'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'both', 'either',
145
+ 'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those',
146
+ 'how', 'when', 'where', 'why', 'if', 'then', 'than', 'because',
147
+ 'while', 'although', 'though', 'unless', 'until', 'whether',
148
+ 'it', 'its', 'he', 'she', 'they', 'we', 'you', 'i', 'me', 'my',
149
+ 'about', 'also', 'just', 'like', 'more', 'most', 'much', 'no',
150
+ 'yes', 'all', 'any', 'each', 'every', 'some', 'such', 'very',
151
+ 'ask', 'tell', 'give', 'get', 'make', 'take', 'see', 'know',
152
+ ]);
153
+ /**
154
+ * Extract capitalized multi-word phrases and proper nouns from a query.
155
+ * These are candidate entity names for exact-match co-retrieval.
156
+ *
157
+ * Matches patterns like "Acme Corp", "New Zealand", "Studio Ghibli",
158
+ * single capitalized words like "Redis", and quoted phrases.
159
+ */
160
+ export function extractNamedEntityCandidates(query) {
161
+ const candidates = new Set();
162
+ collectQuotedPhrases(query, candidates);
163
+ collectMultiWordNames(query, candidates);
164
+ collectSingleCapitalizedWords(query, candidates);
165
+ return [...candidates].filter((c) => c.length >= 2);
166
+ }
167
+ /** Extract quoted strings as entity candidates. */
168
+ function collectQuotedPhrases(query, candidates) {
169
+ const quoted = query.match(/["']([^"']+)["']/g);
170
+ if (!quoted)
171
+ return;
172
+ for (const q of quoted) {
173
+ candidates.add(q.replace(/["']/g, '').trim());
174
+ }
175
+ }
176
+ /** Extract capitalized multi-word sequences, stripping stop words. */
177
+ function collectMultiWordNames(query, candidates) {
178
+ const multiWord = query.match(/\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)+\b/g);
179
+ if (!multiWord)
180
+ return;
181
+ for (const m of multiWord) {
182
+ const cleaned = stripStopWords(m);
183
+ if (cleaned.length >= 2)
184
+ candidates.add(cleaned);
185
+ }
186
+ }
187
+ /** Extract single capitalized words that are not sentence-starters or stop words. */
188
+ function collectSingleCapitalizedWords(query, candidates) {
189
+ const words = query.split(/\s+/);
190
+ for (let i = 0; i < words.length; i++) {
191
+ const word = words[i].replace(/[?.,!;:]/g, '');
192
+ if (!word || word.length <= 1)
193
+ continue;
194
+ const isCapitalized = /^[A-Z][a-z]*$/.test(word);
195
+ const isSentenceStart = i === 0 || /[.!?]$/.test(words[i - 1] ?? '');
196
+ if (isCapitalized && !isSentenceStart && !STOP_WORDS.has(word.toLowerCase())) {
197
+ candidates.add(word);
198
+ }
199
+ }
200
+ }
201
+ /** Strip leading and trailing stop words from a multi-word phrase. */
202
+ function stripStopWords(phrase) {
203
+ const words = phrase.split(/\s+/);
204
+ let start = 0;
205
+ let end = words.length - 1;
206
+ while (start <= end && STOP_WORDS.has(words[start].toLowerCase()))
207
+ start++;
208
+ while (end >= start && STOP_WORDS.has(words[end].toLowerCase()))
209
+ end--;
210
+ return words.slice(start, end + 1).join(' ');
211
+ }
212
+ /**
213
+ * Co-retrieve all memories linked to entities whose names appear in the query.
214
+ * Uses exact name matching (case-insensitive) — no embedding or LLM needed.
215
+ *
216
+ * This ensures that when a user asks about "Acme Corp", all memories linked
217
+ * to the Acme Corp entity are included in the result set, even if their
218
+ * content embeddings don't match the query semantically.
219
+ */
220
+ export async function coRetrieveByEntityNames(entityRepo, repo, userId, query, queryEmbedding, excludeIds, budget) {
221
+ const candidates = extractNamedEntityCandidates(query);
222
+ if (candidates.length === 0)
223
+ return { memories: [], matchedNames: [] };
224
+ const matchedEntityIds = [];
225
+ const matchedNames = [];
226
+ for (const name of candidates) {
227
+ const entities = await entityRepo.findEntitiesByName(userId, name);
228
+ for (const entity of entities) {
229
+ matchedEntityIds.push(entity.id);
230
+ if (!matchedNames.includes(entity.name)) {
231
+ matchedNames.push(entity.name);
232
+ }
233
+ }
234
+ }
235
+ if (matchedEntityIds.length === 0)
236
+ return { memories: [], matchedNames: [] };
237
+ const memoryIds = await entityRepo.findMemoryIdsByEntities(userId, matchedEntityIds, excludeIds, budget);
238
+ if (memoryIds.length === 0)
239
+ return { memories: [], matchedNames };
240
+ const memories = await repo.fetchMemoriesByIds(userId, memoryIds, queryEmbedding);
241
+ return { memories, matchedNames };
242
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared query keyword matching utilities for retrieval-time reranking.
3
+ */
4
+ /** Collapse light verb-form differences so event matching is less brittle. */
5
+ export declare function normalizeKeywordToken(token: string): string;
6
+ export declare function countKeywordMatches(content: string, keywords: string[]): number;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Shared query keyword matching utilities for retrieval-time reranking.
3
+ */
4
+ const IRREGULAR_KEYWORD_NORMALIZATION = {
5
+ won: 'win',
6
+ winning: 'win',
7
+ met: 'meet',
8
+ meeting: 'meet',
9
+ began: 'begin',
10
+ begun: 'begin',
11
+ started: 'start',
12
+ starting: 'start',
13
+ moved: 'move',
14
+ moving: 'move',
15
+ dated: 'date',
16
+ dating: 'date',
17
+ adopted: 'adopt',
18
+ adopting: 'adopt',
19
+ adoption: 'adopt',
20
+ expanded: 'expand',
21
+ expanding: 'expand',
22
+ };
23
+ const KEYWORD_STEM_SUFFIXES = ['ing', 'ed', 'es', 's'];
24
+ /** Collapse light verb-form differences so event matching is less brittle. */
25
+ export function normalizeKeywordToken(token) {
26
+ const irregular = IRREGULAR_KEYWORD_NORMALIZATION[token];
27
+ if (irregular)
28
+ return irregular;
29
+ for (const suffix of KEYWORD_STEM_SUFFIXES) {
30
+ if (token.length > suffix.length + 2 && token.endsWith(suffix)) {
31
+ return token.slice(0, -suffix.length);
32
+ }
33
+ }
34
+ return token;
35
+ }
36
+ /** Normalize free text into a whitespace-joined token string. */
37
+ function normalizeKeywordText(text) {
38
+ return text
39
+ .toLowerCase()
40
+ .replace(/\b([a-z]+)'s\b/g, '$1')
41
+ .replace(/[^a-z0-9\s-]/g, ' ')
42
+ .split(/\s+/)
43
+ .filter(Boolean)
44
+ .map(normalizeKeywordToken)
45
+ .join(' ');
46
+ }
47
+ export function countKeywordMatches(content, keywords) {
48
+ const normalizedContent = normalizeKeywordText(content);
49
+ const contentTokens = new Set(normalizedContent.split(/\s+/).filter(Boolean));
50
+ const normalizedKeywords = [...new Set(keywords
51
+ .map(normalizeKeywordText)
52
+ .filter(Boolean))];
53
+ return normalizedKeywords.filter((keyword) => (keyword.includes(' ')
54
+ ? normalizedContent.includes(keyword)
55
+ : contentTokens.has(keyword))).length;
56
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Query-term visibility preservation for tiered context packaging.
3
+ *
4
+ * Tiered loading can compress a memory to L0/L1 and hide exact words from the
5
+ * user query. This helper upgrades only those compressed memories whose richer
6
+ * tiers reveal missing query terms without exceeding the caller's token budget.
7
+ *
8
+ * Returns the (possibly upgraded) assignments AND a list of memory ids whose
9
+ * reveal-bearing upgrade was rejected solely because of the token budget.
10
+ * Those ids feed `meta.budget_constrained` so callers can report budget
11
+ * pressure on visibility, separately from allocator-level pressure.
12
+ */
13
+ import type { SearchResult } from '../db/memory-repository.js';
14
+ import type { TierAssignment } from './tiered-loading.js';
15
+ export interface VisibilityResult {
16
+ assignments: TierAssignment[];
17
+ /**
18
+ * Memory ids where a query-term-revealing upgrade existed but was
19
+ * skipped because `extra > remainingBudget`. A larger budget would
20
+ * have made these terms visible.
21
+ */
22
+ budgetBlockedVisibilityIds: string[];
23
+ }
24
+ /** Upgrade compressed memories when exact query terms are otherwise hidden. */
25
+ export declare function preserveQueryTermVisibility(memories: SearchResult[], assignments: TierAssignment[], query: string, tokenBudget: number): VisibilityResult;
26
+ export declare function sumAssignmentTokens(assignments: Array<{
27
+ estimatedTokens: number;
28
+ }>): number;
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Query-term visibility preservation for tiered context packaging.
3
+ *
4
+ * Tiered loading can compress a memory to L0/L1 and hide exact words from the
5
+ * user query. This helper upgrades only those compressed memories whose richer
6
+ * tiers reveal missing query terms without exceeding the caller's token budget.
7
+ *
8
+ * Returns the (possibly upgraded) assignments AND a list of memory ids whose
9
+ * reveal-bearing upgrade was rejected solely because of the token budget.
10
+ * Those ids feed `meta.budget_constrained` so callers can report budget
11
+ * pressure on visibility, separately from allocator-level pressure.
12
+ */
13
+ import { estimateTokens, getContentAtTier } from './tiered-loading.js';
14
+ const QUERY_TERM_MIN_LENGTH = 4;
15
+ const QUERY_TERM_STOP_WORDS = new Set([
16
+ 'what', 'when', 'where', 'which', 'with', 'from', 'that', 'this',
17
+ 'recently', 'attend', 'attended', 'does', 'have', 'has', 'did',
18
+ ]);
19
+ /** Upgrade compressed memories when exact query terms are otherwise hidden. */
20
+ export function preserveQueryTermVisibility(memories, assignments, query, tokenBudget) {
21
+ const terms = extractQueryVisibilityTerms(query);
22
+ if (terms.length === 0)
23
+ return { assignments, budgetBlockedVisibilityIds: [] };
24
+ const nextAssignments = assignments.map((assignment) => ({ ...assignment }));
25
+ const budgetBlockedVisibilityIds = [];
26
+ let remaining = tokenBudget - sumAssignmentTokens(nextAssignments);
27
+ for (const memory of memories) {
28
+ const index = nextAssignments.findIndex((assignment) => assignment.memoryId === memory.id);
29
+ if (index === -1 || nextAssignments[index].tier === 'L2')
30
+ continue;
31
+ const decision = chooseVisibleTier(memory, nextAssignments[index], terms, remaining);
32
+ if (decision.kind === 'no-reveal')
33
+ continue;
34
+ if (decision.kind === 'budget-blocked') {
35
+ budgetBlockedVisibilityIds.push(memory.id);
36
+ continue;
37
+ }
38
+ remaining -= decision.upgrade.estimatedTokens - nextAssignments[index].estimatedTokens;
39
+ nextAssignments[index] = decision.upgrade;
40
+ }
41
+ return { assignments: nextAssignments, budgetBlockedVisibilityIds };
42
+ }
43
+ export function sumAssignmentTokens(assignments) {
44
+ return assignments.reduce((sum, assignment) => sum + assignment.estimatedTokens, 0);
45
+ }
46
+ /**
47
+ * Pick the affordable tier that reveals the most missing query terms.
48
+ * Tie-break by lower extra tokens. If every revealing tier exceeds the
49
+ * remaining budget, return `budget-blocked` so callers can flag visibility
50
+ * pressure separately from allocator pressure.
51
+ */
52
+ function chooseVisibleTier(memory, assignment, terms, remainingBudget) {
53
+ const current = getContentAtTier(memory, assignment.tier).toLowerCase();
54
+ const fullContent = memory.content.toLowerCase();
55
+ const missingTerms = terms.filter((term) => !current.includes(term) && fullContent.includes(term));
56
+ if (missingTerms.length === 0)
57
+ return { kind: 'no-reveal' };
58
+ const candidates = collectRevealCandidates(memory, assignment, missingTerms);
59
+ if (candidates.length === 0)
60
+ return { kind: 'no-reveal' };
61
+ const affordable = candidates.filter((candidate) => candidate.extra <= remainingBudget);
62
+ if (affordable.length === 0)
63
+ return { kind: 'budget-blocked' };
64
+ affordable.sort((a, b) => (b.reveals - a.reveals) || (a.extra - b.extra));
65
+ const best = affordable[0];
66
+ return {
67
+ kind: 'upgrade',
68
+ upgrade: { memoryId: memory.id, tier: best.tier, estimatedTokens: best.tokens },
69
+ };
70
+ }
71
+ function collectRevealCandidates(memory, assignment, missingTerms) {
72
+ const candidates = [];
73
+ for (const tier of ['L1', 'L2']) {
74
+ if (tier === assignment.tier)
75
+ continue;
76
+ const content = getContentAtTier(memory, tier).toLowerCase();
77
+ const reveals = missingTerms.reduce((count, term) => content.includes(term) ? count + 1 : count, 0);
78
+ if (reveals === 0)
79
+ continue;
80
+ const tokens = estimateTokens(content);
81
+ const extra = tokens - assignment.estimatedTokens;
82
+ // Allow zero-extra upgrades: a richer tier with the same token cost
83
+ // is a strict win when it reveals a missing query term. Skip only
84
+ // strict downgrades (extra < 0), which would silently shrink the
85
+ // representation and surprise callers reading the tier label.
86
+ if (extra < 0)
87
+ continue;
88
+ candidates.push({ tier, tokens, extra, reveals });
89
+ }
90
+ return candidates;
91
+ }
92
+ function extractQueryVisibilityTerms(query) {
93
+ const terms = query
94
+ .toLowerCase()
95
+ .replace(/[^a-z0-9\s]/g, ' ')
96
+ .split(/\s+/)
97
+ .filter((term) => term.length >= QUERY_TERM_MIN_LENGTH)
98
+ .filter((term) => !QUERY_TERM_STOP_WORDS.has(term));
99
+ return [...new Set(terms)];
100
+ }