hippo-memory 1.60.0 → 1.62.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 (593) hide show
  1. package/README.md +29 -54
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.d.ts +1 -1
  4. package/dist/agent-memories/apply.js +4 -1
  5. package/dist/agent-memories/claude-code.d.ts +3 -1
  6. package/dist/agent-memories/claude-code.js +54 -10
  7. package/dist/agent-memories/codex.js +1 -1
  8. package/dist/agent-memories/gemini.js +1 -1
  9. package/dist/agent-memories/legacy.js +1 -1
  10. package/dist/agent-memories/source.js +1 -1
  11. package/dist/agent-memories/sync.d.ts +3 -3
  12. package/dist/agent-memories/sync.js +22 -9
  13. package/dist/agent-memories/types.d.ts +0 -2
  14. package/dist/ambient-store.d.ts +14 -0
  15. package/dist/ambient-store.js +90 -0
  16. package/dist/ambient.d.ts +23 -0
  17. package/dist/ambient.js +72 -50
  18. package/dist/api/assemble.d.ts +93 -0
  19. package/dist/api/assemble.js +153 -0
  20. package/dist/api/audit.d.ts +17 -0
  21. package/dist/api/audit.js +23 -0
  22. package/dist/api/auth.d.ts +79 -0
  23. package/dist/api/auth.js +178 -0
  24. package/dist/api/context-select.d.ts +49 -0
  25. package/dist/api/context-select.js +344 -0
  26. package/dist/api/context-types.d.ts +105 -0
  27. package/dist/api/context-types.js +3 -0
  28. package/dist/api/context.d.ts +31 -0
  29. package/dist/api/context.js +378 -0
  30. package/dist/api/dormant.d.ts +30 -0
  31. package/dist/api/dormant.js +140 -0
  32. package/dist/api/drill-down.d.ts +84 -0
  33. package/dist/api/drill-down.js +126 -0
  34. package/dist/api/forget.d.ts +57 -0
  35. package/dist/api/forget.js +87 -0
  36. package/dist/api/goals.d.ts +18 -0
  37. package/dist/api/goals.js +33 -0
  38. package/dist/api/learn.d.ts +31 -0
  39. package/dist/api/learn.js +88 -0
  40. package/dist/api/outcome.d.ts +61 -0
  41. package/dist/api/outcome.js +66 -0
  42. package/dist/api/promote.d.ts +54 -0
  43. package/dist/api/promote.js +192 -0
  44. package/dist/api/quarantine.d.ts +24 -0
  45. package/dist/api/quarantine.js +121 -0
  46. package/dist/api/recall-types.d.ts +390 -0
  47. package/dist/api/recall-types.js +3 -0
  48. package/dist/api/recall.d.ts +36 -0
  49. package/dist/api/recall.js +499 -0
  50. package/dist/api/remember.d.ts +35 -0
  51. package/dist/api/remember.js +43 -0
  52. package/dist/api/sleep.d.ts +136 -0
  53. package/dist/api/sleep.js +256 -0
  54. package/dist/api/tokens.d.ts +26 -0
  55. package/dist/api/tokens.js +60 -0
  56. package/dist/api/types.d.ts +56 -0
  57. package/dist/api/types.js +38 -0
  58. package/dist/api.d.ts +20 -1262
  59. package/dist/api.js +25 -2727
  60. package/dist/audit.d.ts +3 -0
  61. package/dist/audit.js +6 -3
  62. package/dist/auth.d.ts +45 -4
  63. package/dist/auth.js +125 -48
  64. package/dist/autolearn.js +2 -2
  65. package/dist/capture/command.d.ts +33 -0
  66. package/dist/capture/command.js +264 -0
  67. package/dist/capture/compact.d.ts +44 -0
  68. package/dist/capture/compact.js +354 -0
  69. package/dist/capture/extract.d.ts +21 -0
  70. package/dist/capture/extract.js +464 -0
  71. package/dist/capture/transcript.d.ts +40 -0
  72. package/dist/capture/transcript.js +193 -0
  73. package/dist/capture-error.js +2 -1
  74. package/dist/churn-git.js +4 -2
  75. package/dist/cli/audit.d.ts +3 -0
  76. package/dist/cli/audit.js +159 -0
  77. package/dist/cli/auth.d.ts +2 -0
  78. package/dist/cli/auth.js +171 -0
  79. package/dist/cli/briefs.d.ts +4 -0
  80. package/dist/cli/briefs.js +453 -0
  81. package/dist/cli/card.d.ts +3 -0
  82. package/dist/cli/card.js +333 -0
  83. package/dist/cli/context.d.ts +15 -0
  84. package/dist/cli/context.js +376 -0
  85. package/dist/cli/continuity.d.ts +6 -0
  86. package/dist/cli/continuity.js +457 -0
  87. package/dist/cli/curate.d.ts +19 -0
  88. package/dist/cli/curate.js +556 -0
  89. package/dist/cli/dag.d.ts +5 -0
  90. package/dist/cli/dag.js +177 -0
  91. package/dist/cli/decisions.d.ts +4 -0
  92. package/dist/cli/decisions.js +528 -0
  93. package/dist/cli/eval.d.ts +5 -0
  94. package/dist/cli/eval.js +213 -0
  95. package/dist/cli/explain.d.ts +4 -0
  96. package/dist/cli/explain.js +156 -0
  97. package/dist/cli/goals.d.ts +2 -0
  98. package/dist/cli/goals.js +196 -0
  99. package/dist/cli/hook-blocks.d.ts +18 -0
  100. package/dist/cli/hook-blocks.js +233 -0
  101. package/dist/cli/init.d.ts +2 -0
  102. package/dist/cli/init.js +305 -0
  103. package/dist/cli/maintenance.d.ts +4 -0
  104. package/dist/cli/maintenance.js +190 -0
  105. package/dist/cli/playbooks.d.ts +4 -0
  106. package/dist/cli/playbooks.js +573 -0
  107. package/dist/cli/projects.js +9 -6
  108. package/dist/cli/recall.d.ts +7 -0
  109. package/dist/cli/recall.js +582 -0
  110. package/dist/cli/remember.d.ts +5 -0
  111. package/dist/cli/remember.js +485 -0
  112. package/dist/cli/serve.d.ts +5 -0
  113. package/dist/cli/serve.js +40 -0
  114. package/dist/cli/session-hooks.d.ts +29 -0
  115. package/dist/cli/session-hooks.js +647 -0
  116. package/dist/cli/setup.d.ts +4 -0
  117. package/dist/cli/setup.js +397 -0
  118. package/dist/cli/shared.d.ts +15 -19
  119. package/dist/cli/shared.js +50 -341
  120. package/dist/cli/slack.d.ts +2 -0
  121. package/dist/cli/slack.js +171 -0
  122. package/dist/cli/status.d.ts +18 -0
  123. package/dist/cli/status.js +409 -0
  124. package/dist/cli/transfer.d.ts +10 -0
  125. package/dist/cli/transfer.js +424 -0
  126. package/dist/cli/usage.d.ts +85 -0
  127. package/dist/cli/usage.js +741 -0
  128. package/dist/cli.d.ts +71 -120
  129. package/dist/cli.js +170 -8469
  130. package/dist/client.js +15 -8
  131. package/dist/compaction-record.d.ts +0 -2
  132. package/dist/compaction-record.js +7 -5
  133. package/dist/connectors/github/backfill.js +94 -87
  134. package/dist/connectors/github/cli-impl.js +4 -3
  135. package/dist/connectors/github/dlq.js +67 -54
  136. package/dist/connectors/github/ingest.js +34 -35
  137. package/dist/connectors/github/tenant-routing.js +3 -2
  138. package/dist/connectors/github/webhook.js +135 -216
  139. package/dist/connectors/slack/dlq.js +49 -61
  140. package/dist/connectors/slack/ingest.js +55 -48
  141. package/dist/connectors/slack/tenant-routing.js +4 -3
  142. package/dist/connectors/slack/webhook.js +72 -74
  143. package/dist/consolidate/conflicts.d.ts +10 -0
  144. package/dist/consolidate/conflicts.js +178 -0
  145. package/dist/consolidate/decay.d.ts +12 -0
  146. package/dist/consolidate/decay.js +145 -0
  147. package/dist/consolidate/llm-passes.d.ts +3 -0
  148. package/dist/consolidate/llm-passes.js +141 -0
  149. package/dist/consolidate/merge.d.ts +7 -0
  150. package/dist/consolidate/merge.js +251 -0
  151. package/dist/consolidate/physics-pass.d.ts +3 -0
  152. package/dist/consolidate/physics-pass.js +60 -0
  153. package/dist/consolidate/run.d.ts +69 -0
  154. package/dist/consolidate/run.js +76 -0
  155. package/dist/consolidate/sleep.d.ts +18 -0
  156. package/dist/consolidate/sleep.js +209 -0
  157. package/dist/consolidate/traces.d.ts +4 -0
  158. package/dist/consolidate/traces.js +178 -0
  159. package/dist/context-auto.js +7 -11
  160. package/dist/context-render.d.ts +1 -1
  161. package/dist/context-render.js +1 -1
  162. package/dist/customer-notes.d.ts +3 -0
  163. package/dist/customer-notes.js +83 -72
  164. package/dist/dag.js +225 -188
  165. package/dist/dashboard-actions.d.ts +20 -0
  166. package/dist/dashboard-actions.js +88 -0
  167. package/dist/dashboard-params.d.ts +45 -0
  168. package/dist/dashboard-params.js +127 -0
  169. package/dist/dashboard-queries.d.ts +15 -0
  170. package/dist/dashboard-queries.js +355 -0
  171. package/dist/dashboard-snapshot.d.ts +138 -0
  172. package/dist/dashboard-snapshot.js +308 -0
  173. package/dist/dashboard-types.d.ts +163 -0
  174. package/dist/dashboard-types.js +3 -0
  175. package/dist/dashboard.d.ts +6 -7
  176. package/dist/dashboard.js +228 -202
  177. package/dist/db/busy.d.ts +5 -0
  178. package/dist/db/busy.js +24 -0
  179. package/dist/db/continuity.d.ts +5 -0
  180. package/dist/db/continuity.js +145 -0
  181. package/dist/db/meta.d.ts +8 -0
  182. package/dist/db/meta.js +35 -0
  183. package/dist/db/migrate.d.ts +9 -0
  184. package/dist/db/migrate.js +138 -0
  185. package/dist/db/migrations/index.d.ts +5 -0
  186. package/dist/db/migrations/index.js +109 -0
  187. package/dist/db/migrations/types.d.ts +14 -0
  188. package/dist/db/migrations/types.js +2 -0
  189. package/dist/db/migrations/v01.d.ts +3 -0
  190. package/dist/db/migrations/v01.js +38 -0
  191. package/dist/db/migrations/v02.d.ts +3 -0
  192. package/dist/db/migrations/v02.js +21 -0
  193. package/dist/db/migrations/v03.d.ts +3 -0
  194. package/dist/db/migrations/v03.js +22 -0
  195. package/dist/db/migrations/v04.d.ts +3 -0
  196. package/dist/db/migrations/v04.js +28 -0
  197. package/dist/db/migrations/v05.d.ts +3 -0
  198. package/dist/db/migrations/v05.js +21 -0
  199. package/dist/db/migrations/v06.d.ts +3 -0
  200. package/dist/db/migrations/v06.js +25 -0
  201. package/dist/db/migrations/v07.d.ts +3 -0
  202. package/dist/db/migrations/v07.js +13 -0
  203. package/dist/db/migrations/v08.d.ts +3 -0
  204. package/dist/db/migrations/v08.js +8 -0
  205. package/dist/db/migrations/v09.d.ts +3 -0
  206. package/dist/db/migrations/v09.js +13 -0
  207. package/dist/db/migrations/v10.d.ts +3 -0
  208. package/dist/db/migrations/v10.js +17 -0
  209. package/dist/db/migrations/v11.d.ts +3 -0
  210. package/dist/db/migrations/v11.js +15 -0
  211. package/dist/db/migrations/v12.d.ts +3 -0
  212. package/dist/db/migrations/v12.js +11 -0
  213. package/dist/db/migrations/v13.d.ts +3 -0
  214. package/dist/db/migrations/v13.js +15 -0
  215. package/dist/db/migrations/v14.d.ts +3 -0
  216. package/dist/db/migrations/v14.js +66 -0
  217. package/dist/db/migrations/v15.d.ts +3 -0
  218. package/dist/db/migrations/v15.js +42 -0
  219. package/dist/db/migrations/v16.d.ts +3 -0
  220. package/dist/db/migrations/v16.js +61 -0
  221. package/dist/db/migrations/v17.d.ts +3 -0
  222. package/dist/db/migrations/v17.js +46 -0
  223. package/dist/db/migrations/v18.d.ts +3 -0
  224. package/dist/db/migrations/v18.js +60 -0
  225. package/dist/db/migrations/v19.d.ts +3 -0
  226. package/dist/db/migrations/v19.js +28 -0
  227. package/dist/db/migrations/v20.d.ts +3 -0
  228. package/dist/db/migrations/v20.js +42 -0
  229. package/dist/db/migrations/v21.d.ts +3 -0
  230. package/dist/db/migrations/v21.js +16 -0
  231. package/dist/db/migrations/v22.d.ts +3 -0
  232. package/dist/db/migrations/v22.js +82 -0
  233. package/dist/db/migrations/v23.d.ts +3 -0
  234. package/dist/db/migrations/v23.js +48 -0
  235. package/dist/db/migrations/v24.d.ts +3 -0
  236. package/dist/db/migrations/v24.js +72 -0
  237. package/dist/db/migrations/v25.d.ts +3 -0
  238. package/dist/db/migrations/v25.js +46 -0
  239. package/dist/db/migrations/v26.d.ts +3 -0
  240. package/dist/db/migrations/v26.js +23 -0
  241. package/dist/db/migrations/v27.d.ts +3 -0
  242. package/dist/db/migrations/v27.js +57 -0
  243. package/dist/db/migrations/v28.d.ts +3 -0
  244. package/dist/db/migrations/v28.js +38 -0
  245. package/dist/db/migrations/v29.d.ts +3 -0
  246. package/dist/db/migrations/v29.js +78 -0
  247. package/dist/db/migrations/v30.d.ts +3 -0
  248. package/dist/db/migrations/v30.js +92 -0
  249. package/dist/db/migrations/v31.d.ts +3 -0
  250. package/dist/db/migrations/v31.js +74 -0
  251. package/dist/db/migrations/v32.d.ts +3 -0
  252. package/dist/db/migrations/v32.js +102 -0
  253. package/dist/db/migrations/v33.d.ts +3 -0
  254. package/dist/db/migrations/v33.js +104 -0
  255. package/dist/db/migrations/v34.d.ts +3 -0
  256. package/dist/db/migrations/v34.js +93 -0
  257. package/dist/db/migrations/v35.d.ts +3 -0
  258. package/dist/db/migrations/v35.js +98 -0
  259. package/dist/db/migrations/v36.d.ts +3 -0
  260. package/dist/db/migrations/v36.js +98 -0
  261. package/dist/db/migrations/v37.d.ts +3 -0
  262. package/dist/db/migrations/v37.js +219 -0
  263. package/dist/db/migrations/v38.d.ts +3 -0
  264. package/dist/db/migrations/v38.js +277 -0
  265. package/dist/db/migrations/v39.d.ts +3 -0
  266. package/dist/db/migrations/v39.js +59 -0
  267. package/dist/db/migrations/v40.d.ts +3 -0
  268. package/dist/db/migrations/v40.js +74 -0
  269. package/dist/db/migrations/v41.d.ts +3 -0
  270. package/dist/db/migrations/v41.js +43 -0
  271. package/dist/db/migrations/v42.d.ts +3 -0
  272. package/dist/db/migrations/v42.js +41 -0
  273. package/dist/db/migrations/v43.d.ts +3 -0
  274. package/dist/db/migrations/v43.js +67 -0
  275. package/dist/db/migrations/v44.d.ts +3 -0
  276. package/dist/db/migrations/v44.js +28 -0
  277. package/dist/db/migrations/v45.d.ts +3 -0
  278. package/dist/db/migrations/v45.js +30 -0
  279. package/dist/db/migrations/v46.d.ts +3 -0
  280. package/dist/db/migrations/v46.js +25 -0
  281. package/dist/db/migrations/v47.d.ts +3 -0
  282. package/dist/db/migrations/v47.js +17 -0
  283. package/dist/db/migrations/v48.d.ts +3 -0
  284. package/dist/db/migrations/v48.js +10 -0
  285. package/dist/db/migrations/v49.d.ts +3 -0
  286. package/dist/db/migrations/v49.js +31 -0
  287. package/dist/db/migrations/v50.d.ts +3 -0
  288. package/dist/db/migrations/v50.js +67 -0
  289. package/dist/db/migrations/v51.d.ts +3 -0
  290. package/dist/db/migrations/v51.js +14 -0
  291. package/dist/db/migrations/v52.d.ts +3 -0
  292. package/dist/db/migrations/v52.js +7 -0
  293. package/dist/db/open.d.ts +23 -0
  294. package/dist/db/open.js +146 -0
  295. package/dist/db/sqlite.d.ts +21 -0
  296. package/dist/db/sqlite.js +8 -0
  297. package/dist/db/tables.d.ts +7 -0
  298. package/dist/db/tables.js +38 -0
  299. package/dist/db.d.ts +6 -46
  300. package/dist/db.js +5 -3049
  301. package/dist/decisions.d.ts +4 -1
  302. package/dist/decisions.js +102 -83
  303. package/dist/dedupe.js +3 -2
  304. package/dist/delivery-recorder.js +4 -1
  305. package/dist/doctor.js +14 -10
  306. package/dist/embedding-provider.d.ts +1 -1
  307. package/dist/embedding-provider.js +4 -3
  308. package/dist/embeddings.d.ts +9 -52
  309. package/dist/embeddings.js +43 -297
  310. package/dist/env.d.ts +75 -0
  311. package/dist/env.js +119 -0
  312. package/dist/eval-suite.js +1 -1
  313. package/dist/eval.js +2 -2
  314. package/dist/extract.js +1 -1
  315. package/dist/gated-write.js +3 -1
  316. package/dist/goals.d.ts +3 -1
  317. package/dist/goals.js +117 -86
  318. package/dist/graph/read.d.ts +73 -0
  319. package/dist/graph/read.js +325 -0
  320. package/dist/graph/rows.d.ts +45 -0
  321. package/dist/graph/rows.js +51 -0
  322. package/dist/graph/types.d.ts +83 -0
  323. package/dist/graph/types.js +11 -0
  324. package/dist/graph/write.d.ts +93 -0
  325. package/dist/{graph.js → graph/write.js} +6 -384
  326. package/dist/graph-extract.js +2 -1
  327. package/dist/graph-recall.d.ts +1 -1
  328. package/dist/graph-recall.js +2 -2
  329. package/dist/graph-stream.js +1 -1
  330. package/dist/graph-view.d.ts +1 -1
  331. package/dist/graph-view.js +1 -1
  332. package/dist/half-life-migration.d.ts +1 -1
  333. package/dist/half-life-migration.js +2 -1
  334. package/dist/hooks/codex-session.d.ts +8 -0
  335. package/dist/hooks/codex-session.js +76 -0
  336. package/dist/hooks/codex-wrapper.d.ts +55 -0
  337. package/dist/hooks/codex-wrapper.js +288 -0
  338. package/dist/hooks/json-hooks.d.ts +63 -0
  339. package/dist/hooks/json-hooks.js +356 -0
  340. package/dist/hooks/opencode.d.ts +50 -0
  341. package/dist/hooks/opencode.js +202 -0
  342. package/dist/hooks/shared.d.ts +54 -0
  343. package/dist/hooks/shared.js +77 -0
  344. package/dist/http-retry.d.ts +2 -0
  345. package/dist/http-retry.js +4 -3
  346. package/dist/http-util.d.ts +3 -0
  347. package/dist/http-util.js +10 -0
  348. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  349. package/dist/importers/core.js +141 -0
  350. package/dist/importers/markdown-parse.d.ts +41 -0
  351. package/dist/importers/markdown-parse.js +132 -0
  352. package/dist/importers/markdown.d.ts +3 -0
  353. package/dist/importers/markdown.js +92 -0
  354. package/dist/importers/sources.d.ts +7 -0
  355. package/dist/importers/sources.js +229 -0
  356. package/dist/importers/vault.d.ts +11 -0
  357. package/dist/importers/vault.js +352 -0
  358. package/dist/incidents.d.ts +3 -0
  359. package/dist/incidents.js +52 -43
  360. package/dist/index.d.ts +25 -6
  361. package/dist/index.js +23 -6
  362. package/dist/invalidation.js +2 -1
  363. package/dist/judgment.js +2 -1
  364. package/dist/keyset.d.ts +13 -0
  365. package/dist/keyset.js +8 -0
  366. package/dist/local-embedding.d.ts +13 -0
  367. package/dist/local-embedding.js +165 -0
  368. package/dist/log.d.ts +7 -0
  369. package/dist/log.js +19 -1
  370. package/dist/mcp/admin-tools.d.ts +8 -0
  371. package/dist/mcp/admin-tools.js +116 -0
  372. package/dist/mcp/format.d.ts +27 -0
  373. package/dist/mcp/format.js +135 -0
  374. package/dist/mcp/memory-tools.d.ts +5 -0
  375. package/dist/mcp/memory-tools.js +83 -0
  376. package/dist/mcp/protocol.d.ts +83 -0
  377. package/dist/mcp/protocol.js +55 -0
  378. package/dist/mcp/recall-tools.d.ts +6 -0
  379. package/dist/mcp/recall-tools.js +320 -0
  380. package/dist/mcp/request.d.ts +10 -0
  381. package/dist/mcp/request.js +163 -0
  382. package/dist/mcp/server.d.ts +4 -75
  383. package/dist/mcp/server.js +7 -1190
  384. package/dist/mcp/session-state.d.ts +11 -0
  385. package/dist/mcp/session-state.js +28 -0
  386. package/dist/mcp/stdio.d.ts +8 -0
  387. package/dist/mcp/stdio.js +79 -0
  388. package/dist/mcp/tools.d.ts +11 -0
  389. package/dist/mcp/tools.js +247 -0
  390. package/dist/memory.d.ts +3 -0
  391. package/dist/memory.js +27 -1
  392. package/dist/multihop.d.ts +1 -1
  393. package/dist/multihop.js +2 -1
  394. package/dist/owner-validation.js +2 -1
  395. package/dist/physics-state.js +10 -7
  396. package/dist/policies.d.ts +3 -0
  397. package/dist/policies.js +93 -74
  398. package/dist/postinstall.js +3 -2
  399. package/dist/predictions/planning-fallacy.d.ts +100 -0
  400. package/dist/predictions/planning-fallacy.js +190 -0
  401. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  402. package/dist/predictions/store.js +434 -0
  403. package/dist/processes.d.ts +3 -0
  404. package/dist/processes.js +94 -76
  405. package/dist/project-briefs.d.ts +3 -0
  406. package/dist/project-briefs.js +142 -113
  407. package/dist/project-identity.js +3 -2
  408. package/dist/project-merge.d.ts +12 -4
  409. package/dist/project-merge.js +132 -45
  410. package/dist/quarantine.d.ts +2 -1
  411. package/dist/quarantine.js +8 -5
  412. package/dist/raw-archive.js +1 -1
  413. package/dist/recall-history.js +3 -2
  414. package/dist/recall-pipeline.d.ts +2 -2
  415. package/dist/recall-pipeline.js +16 -8
  416. package/dist/recall-scope.js +1 -1
  417. package/dist/recall-trace.d.ts +1 -1
  418. package/dist/refine-llm.js +2 -1
  419. package/dist/reject-flow.js +6 -1
  420. package/dist/rerankers/clef.js +6 -5
  421. package/dist/rerankers/jev.d.ts +1 -1
  422. package/dist/rerankers/jev.js +4 -4
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +58 -38
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/scheduler.d.ts +1 -0
  428. package/dist/scheduler.js +26 -4
  429. package/dist/scope.js +4 -3
  430. package/dist/search/as-of.d.ts +10 -0
  431. package/dist/search/as-of.js +22 -0
  432. package/dist/search/bm25-search.d.ts +14 -0
  433. package/dist/search/bm25-search.js +43 -0
  434. package/dist/search/bm25.d.ts +15 -0
  435. package/dist/search/bm25.js +54 -0
  436. package/dist/search/boosts.d.ts +54 -0
  437. package/dist/search/boosts.js +94 -0
  438. package/dist/search/breakdown.d.ts +7 -0
  439. package/dist/search/breakdown.js +20 -0
  440. package/dist/search/explain.d.ts +25 -0
  441. package/dist/search/explain.js +31 -0
  442. package/dist/search/finalize.d.ts +8 -0
  443. package/dist/search/finalize.js +52 -0
  444. package/dist/search/fusion.d.ts +27 -0
  445. package/dist/search/fusion.js +42 -0
  446. package/dist/search/hybrid-score.d.ts +20 -0
  447. package/dist/search/hybrid-score.js +73 -0
  448. package/dist/search/hybrid.d.ts +46 -0
  449. package/dist/search/hybrid.js +64 -0
  450. package/dist/search/physics-search.d.ts +29 -0
  451. package/dist/search/physics-search.js +162 -0
  452. package/dist/search/rerank.d.ts +10 -0
  453. package/dist/search/rerank.js +72 -0
  454. package/dist/search/temporal.d.ts +15 -0
  455. package/dist/search/temporal.js +45 -0
  456. package/dist/search/types.d.ts +91 -0
  457. package/dist/search/types.js +2 -0
  458. package/dist/search/vector.d.ts +30 -0
  459. package/dist/search/vector.js +71 -0
  460. package/dist/secret-detect.d.ts +2 -0
  461. package/dist/secret-detect.js +2 -1
  462. package/dist/server/auth.d.ts +52 -0
  463. package/dist/server/auth.js +221 -0
  464. package/dist/server/client-ip.d.ts +25 -0
  465. package/dist/server/client-ip.js +92 -0
  466. package/dist/server/cursor.d.ts +23 -0
  467. package/dist/server/cursor.js +58 -0
  468. package/dist/server/lifecycle.d.ts +7 -0
  469. package/dist/server/lifecycle.js +29 -0
  470. package/dist/server/mcp-http.d.ts +5 -0
  471. package/dist/server/mcp-http.js +199 -0
  472. package/dist/server/request.d.ts +33 -0
  473. package/dist/server/request.js +103 -0
  474. package/dist/server/routes/admin.d.ts +9 -0
  475. package/dist/server/routes/admin.js +158 -0
  476. package/dist/server/routes/customer-notes.d.ts +7 -0
  477. package/dist/server/routes/customer-notes.js +112 -0
  478. package/dist/server/routes/decisions.d.ts +7 -0
  479. package/dist/server/routes/decisions.js +133 -0
  480. package/dist/server/routes/incidents.d.ts +7 -0
  481. package/dist/server/routes/incidents.js +126 -0
  482. package/dist/server/routes/memories.d.ts +10 -0
  483. package/dist/server/routes/memories.js +179 -0
  484. package/dist/server/routes/policies.d.ts +8 -0
  485. package/dist/server/routes/policies.js +151 -0
  486. package/dist/server/routes/predictions.d.ts +7 -0
  487. package/dist/server/routes/predictions.js +164 -0
  488. package/dist/server/routes/processes.d.ts +7 -0
  489. package/dist/server/routes/processes.js +161 -0
  490. package/dist/server/routes/project-briefs.d.ts +8 -0
  491. package/dist/server/routes/project-briefs.js +136 -0
  492. package/dist/server/routes/recall.d.ts +8 -0
  493. package/dist/server/routes/recall.js +340 -0
  494. package/dist/server/routes/skills.d.ts +8 -0
  495. package/dist/server/routes/skills.js +150 -0
  496. package/dist/server/types.d.ts +56 -0
  497. package/dist/server/types.js +2 -0
  498. package/dist/server/validation.d.ts +14 -0
  499. package/dist/server/validation.js +91 -0
  500. package/dist/server.d.ts +7 -61
  501. package/dist/server.js +69 -2362
  502. package/dist/session-digest.d.ts +1 -1
  503. package/dist/session-digest.js +9 -2
  504. package/dist/shared.d.ts +12 -1
  505. package/dist/shared.js +33 -27
  506. package/dist/skills.d.ts +3 -0
  507. package/dist/skills.js +88 -70
  508. package/dist/stdin.js +2 -2
  509. package/dist/store/audit-event.d.ts +19 -0
  510. package/dist/store/audit-event.js +33 -0
  511. package/dist/store/candidates.d.ts +42 -0
  512. package/dist/store/candidates.js +152 -0
  513. package/dist/store/conflicts.d.ts +44 -0
  514. package/dist/store/conflicts.js +444 -0
  515. package/dist/store/delete-and-batch.d.ts +63 -0
  516. package/dist/store/delete-and-batch.js +310 -0
  517. package/dist/store/entry-reads.d.ts +92 -0
  518. package/dist/store/entry-reads.js +255 -0
  519. package/dist/store/entry-row.d.ts +67 -0
  520. package/dist/store/entry-row.js +208 -0
  521. package/dist/store/entry-writes.d.ts +46 -0
  522. package/dist/store/entry-writes.js +148 -0
  523. package/dist/store/handoffs.d.ts +26 -0
  524. package/dist/store/handoffs.js +184 -0
  525. package/dist/store/index-and-stats.d.ts +52 -0
  526. package/dist/store/index-and-stats.js +214 -0
  527. package/dist/store/markdown.d.ts +10 -0
  528. package/dist/store/markdown.js +108 -0
  529. package/dist/store/mirrors.d.ts +49 -0
  530. package/dist/store/mirrors.js +312 -0
  531. package/dist/store/open.d.ts +15 -0
  532. package/dist/store/open.js +223 -0
  533. package/dist/store/rows.d.ts +178 -0
  534. package/dist/store/rows.js +158 -0
  535. package/dist/store/search-rows.d.ts +86 -0
  536. package/dist/store/search-rows.js +260 -0
  537. package/dist/store/sessions.d.ts +83 -0
  538. package/dist/store/sessions.js +272 -0
  539. package/dist/store/summaries.d.ts +94 -0
  540. package/dist/store/summaries.js +377 -0
  541. package/dist/store/tenant-lookup.d.ts +12 -0
  542. package/dist/store/tenant-lookup.js +16 -0
  543. package/dist/store-cards.js +2 -1
  544. package/dist/summary-dirty.d.ts +4 -0
  545. package/dist/summary-dirty.js +32 -0
  546. package/dist/support-bundle.js +4 -3
  547. package/dist/tenant.js +2 -2
  548. package/dist/tokenize.d.ts +2 -0
  549. package/dist/tokenize.js +16 -0
  550. package/dist/transcript-tail.d.ts +7 -0
  551. package/dist/transcript-tail.js +48 -0
  552. package/dist/vector-store.d.ts +27 -0
  553. package/dist/vector-store.js +210 -0
  554. package/dist/version.d.ts +2 -2
  555. package/dist/version.js +2 -2
  556. package/dist/working-memory.js +1 -1
  557. package/dist/yaml.js +36 -11
  558. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  559. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  560. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  566. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  570. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  571. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  572. package/dist-ui/index.html +3 -25
  573. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  574. package/extensions/openclaw-plugin/package.json +1 -1
  575. package/openclaw.plugin.json +1 -1
  576. package/package.json +1 -1
  577. package/dist/capture.d.ts +0 -155
  578. package/dist/capture.js +0 -1295
  579. package/dist/consolidate.d.ts +0 -58
  580. package/dist/consolidate.js +0 -1124
  581. package/dist/graph.d.ts +0 -245
  582. package/dist/hooks.d.ts +0 -208
  583. package/dist/hooks.js +0 -1076
  584. package/dist/importers.js +0 -900
  585. package/dist/predictions.js +0 -620
  586. package/dist/search.d.ts +0 -320
  587. package/dist/search.js +0 -970
  588. package/dist/store.d.ts +0 -776
  589. package/dist/store.js +0 -3473
  590. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  591. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  592. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  593. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,90 @@
1
+ import { closeHippoDb } from './db.js';
2
+ import { strengthSql } from './memory.js';
3
+ import { RECALL_DEFAULT_DENY_SCOPES } from './recall-scope.js';
4
+ import { SECRET_TAGS } from './secret-detect.js';
5
+ import { openStore } from './store/open.js';
6
+ import { isErrorTagged } from './ambient.js';
7
+ // A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
8
+ const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
9
+ // SHORTCUT: mirrors loadContextCandidates' WHERE (request-path snapshots pin the match); share it once store.ts is split.
10
+ function contextRowsWhere(tenantId, filter) {
11
+ const where = ['tenant_id = ?', `COALESCE(superseded_by, '') = ''`, `COALESCE(kind, '') != 'archived'`];
12
+ const params = [tenantId];
13
+ if (filter.exactScope) {
14
+ where.push('scope = ?');
15
+ params.push(filter.exactScope);
16
+ }
17
+ else {
18
+ where.push(`(scope IS NULL OR (scope NOT IN (${RECALL_DEFAULT_DENY_SCOPES.map(() => '?').join(', ')}) AND scope NOT LIKE '%:private:%'))`);
19
+ params.push(...RECALL_DEFAULT_DENY_SCOPES);
20
+ }
21
+ if (filter.project !== undefined) {
22
+ where.push(`(origin_project = '' OR origin_project = ?)`);
23
+ params.push(filter.project);
24
+ }
25
+ return { where, params };
26
+ }
27
+ /** A secret tag's row, the half of detectSecret SQL can check; the LIKEs only skip json_each on rows that cannot match. */
28
+ function secretTaggedSql() {
29
+ const tags = [...SECRET_TAGS];
30
+ return {
31
+ sql: `((${tags.map(() => 'tags_json LIKE ?').join(' OR ')})
32
+ AND EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE lower(value) IN (${tags.map(() => '?').join(', ')})))`,
33
+ params: [...tags.map((t) => `%"${t}"%`), ...tags],
34
+ };
35
+ }
36
+ /** Whole-store ambient tallies in one aggregate pass, no row loaded. Content-pattern secrets and session-local
37
+ * rows (own compaction items, a printed handoff's digest) still count: only injection drops them. */
38
+ export function loadAmbientTallies(hippoRoot, tenantId, filter) {
39
+ const { where, params } = contextRowsWhere(tenantId, filter);
40
+ const secret = secretTaggedSql();
41
+ const sevenDaysAgo = new Date(filter.now.getTime() - 7 * 86400000).toISOString();
42
+ const db = openStore(hippoRoot);
43
+ try {
44
+ // SAFETY: one aggregate row whose columns are the aliases named below. Tag lists come back as one JSON array of
45
+ // arrays and are counted in JS, which maps items through String() as parseJsonArray does.
46
+ const row = db.prepare(`SELECT
47
+ COUNT(*) AS total,
48
+ COALESCE(SUM(${strengthSql(filter.now)}), 0) AS strengthSum,
49
+ COALESCE(SUM(julianday(created) > julianday(?)), 0) AS fresh,
50
+ COALESCE(SUM(emotional_valence IN ('negative', 'critical')), 0) AS negative,
51
+ COALESCE(SUM(COALESCE(schema_fit, 0.5) > 0.7), 0) AS highSchemaFit,
52
+ COALESCE(SUM(layer = 'semantic'), 0) AS semantic,
53
+ COALESCE(SUM(layer = 'episodic'), 0) AS episodic,
54
+ COALESCE(SUM(json_array_length(${jsonList('conflicts_with_json')})), 0) AS conflicts,
55
+ COALESCE(SUM(COALESCE(extracted_from, '') != ''), 0) AS extracted,
56
+ MAX(0, COALESCE(MAX(COALESCE(dag_level, 0)), 0)) AS maxDagLevel,
57
+ '[' || COALESCE(group_concat(${jsonList('tags_json')}, ','), '') || ']' AS tagLists
58
+ FROM memories
59
+ WHERE ${where.join(' AND ')}
60
+ AND ((origin_project = ? AND origin_project != '') OR NOT ${secret.sql})`).get(sevenDaysAgo, ...params, filter.currentProject, ...secret.params);
61
+ const tagCounts = new Map();
62
+ let errors = 0;
63
+ const lists = /* SAFETY: jsonList yields an array per row, joined into one array */ JSON.parse(row.tagLists);
64
+ for (const raw of lists) {
65
+ const tags = raw.map((item) => String(item));
66
+ for (const tag of tags)
67
+ tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
68
+ if (isErrorTagged(tags))
69
+ errors++;
70
+ }
71
+ return {
72
+ total: Number(row.total),
73
+ strengthSum: Number(row.strengthSum),
74
+ fresh: Number(row.fresh),
75
+ negative: Number(row.negative),
76
+ highSchemaFit: Number(row.highSchemaFit),
77
+ errors,
78
+ semantic: Number(row.semantic),
79
+ episodic: Number(row.episodic),
80
+ conflicts: Number(row.conflicts),
81
+ extracted: Number(row.extracted),
82
+ maxDagLevel: Number(row.maxDagLevel),
83
+ tagCounts,
84
+ };
85
+ }
86
+ finally {
87
+ closeHippoDb(db);
88
+ }
89
+ }
90
+ //# sourceMappingURL=ambient-store.js.map
package/dist/ambient.d.ts CHANGED
@@ -20,7 +20,30 @@ export interface AmbientState {
20
20
  dagDepth: number;
21
21
  totalMemories: number;
22
22
  }
23
+ /** Row counts and sums an AmbientState is derived from; two stores' tallies add with addAmbientTallies. */
24
+ export interface AmbientTallies {
25
+ total: number;
26
+ strengthSum: number;
27
+ fresh: number;
28
+ negative: number;
29
+ highSchemaFit: number;
30
+ errors: number;
31
+ semantic: number;
32
+ episodic: number;
33
+ conflicts: number;
34
+ extracted: number;
35
+ maxDagLevel: number;
36
+ tagCounts: Map<string, number>;
37
+ }
38
+ /** The tallies of two disjoint row sets taken together. */
39
+ export declare function addAmbientTallies(a: AmbientTallies, b: AmbientTallies): AmbientTallies;
40
+ /** Whether a tag list marks its memory as an error for errorDensity. */
41
+ export declare function isErrorTagged(tags: readonly string[]): boolean;
42
+ /** Tallies over loaded entries; superseded rows count toward the total only, as they always have here. */
43
+ export declare function tallyAmbientEntries(entries: readonly MemoryEntry[], now?: Date): AmbientTallies;
23
44
  export declare function computeAmbientState(entries: MemoryEntry[], now?: Date): AmbientState;
45
+ /** The ambient state of a row set from its tallies, however they were counted. */
46
+ export declare function ambientStateFromTallies(t: AmbientTallies): AmbientState;
24
47
  export declare function renderAmbientSummary(state: AmbientState): string;
25
48
  export declare function formatAmbientVector(state: AmbientState): string;
26
49
  //# sourceMappingURL=ambient.d.ts.map
package/dist/ambient.js CHANGED
@@ -9,67 +9,89 @@
9
9
  import { evalNow } from './ablation.js';
10
10
  import { Layer } from './memory.js';
11
11
  import { calculateStrength } from './memory.js';
12
- export function computeAmbientState(entries, now) {
13
- const n = entries.length;
14
- if (n === 0) {
15
- return {
16
- tagEntropy: 0, avgStrength: 0, recencyFreshness: 0,
17
- emotionalSkew: 0, schemaFitRatio: 0, errorDensity: 0,
18
- consolidationRatio: 0, conflictIntensity: 0,
19
- extractionCoverage: 0, dagDepth: 0, totalMemories: 0,
20
- };
21
- }
12
+ /** The tallies of two disjoint row sets taken together. */
13
+ export function addAmbientTallies(a, b) {
14
+ const tagCounts = new Map(a.tagCounts);
15
+ for (const [tag, count] of b.tagCounts)
16
+ tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + count);
17
+ return {
18
+ total: a.total + b.total,
19
+ strengthSum: a.strengthSum + b.strengthSum,
20
+ fresh: a.fresh + b.fresh,
21
+ negative: a.negative + b.negative,
22
+ highSchemaFit: a.highSchemaFit + b.highSchemaFit,
23
+ errors: a.errors + b.errors,
24
+ semantic: a.semantic + b.semantic,
25
+ episodic: a.episodic + b.episodic,
26
+ conflicts: a.conflicts + b.conflicts,
27
+ extracted: a.extracted + b.extracted,
28
+ maxDagLevel: Math.max(a.maxDagLevel, b.maxDagLevel),
29
+ tagCounts,
30
+ };
31
+ }
32
+ /** Whether a tag list marks its memory as an error for errorDensity. */
33
+ export function isErrorTagged(tags) {
34
+ return tags.some(tag => tag === 'error' || tag === 'critical' || tag.startsWith('error:'));
35
+ }
36
+ /** Tallies over loaded entries; superseded rows count toward the total only, as they always have here. */
37
+ export function tallyAmbientEntries(entries, now) {
22
38
  const currentTime = now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only)
23
- const tagCounts = new Map();
24
- let strengthSum = 0;
25
- let freshCount = 0;
26
- let negativeCount = 0;
27
- let highSchemaCount = 0;
28
- let errorCount = 0;
29
- let semanticCount = 0;
30
- let episodicCount = 0;
31
- let conflictSum = 0;
32
- let extractedCount = 0;
33
- let maxDagLevel = 0;
34
39
  const sevenDaysAgo = currentTime.getTime() - 7 * 86400000;
40
+ const t = {
41
+ total: entries.length, strengthSum: 0, fresh: 0, negative: 0, highSchemaFit: 0, errors: 0,
42
+ semantic: 0, episodic: 0, conflicts: 0, extracted: 0, maxDagLevel: 0, tagCounts: new Map(),
43
+ };
35
44
  for (const entry of entries) {
36
45
  if (entry.superseded_by)
37
46
  continue;
38
- for (const tag of entry.tags) {
39
- tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
40
- }
41
- const strength = calculateStrength(entry, currentTime);
42
- strengthSum += strength;
47
+ for (const tag of entry.tags)
48
+ t.tagCounts.set(tag, (t.tagCounts.get(tag) ?? 0) + 1);
49
+ t.strengthSum += calculateStrength(entry, currentTime);
43
50
  if (new Date(entry.created).getTime() > sevenDaysAgo)
44
- freshCount++;
45
- if (entry.emotional_valence === 'negative' || entry.emotional_valence === 'critical') {
46
- negativeCount++;
47
- }
48
- if (entry.tags.some(t => t === 'error' || t === 'critical' || t.startsWith('error:'))) {
49
- errorCount++;
50
- }
51
+ t.fresh++;
52
+ if (entry.emotional_valence === 'negative' || entry.emotional_valence === 'critical')
53
+ t.negative++;
54
+ if (isErrorTagged(entry.tags))
55
+ t.errors++;
51
56
  if (entry.schema_fit > 0.7)
52
- highSchemaCount++;
57
+ t.highSchemaFit++;
53
58
  if (entry.layer === Layer.Semantic)
54
- semanticCount++;
59
+ t.semantic++;
55
60
  if (entry.layer === Layer.Episodic)
56
- episodicCount++;
57
- conflictSum += entry.conflicts_with.length;
61
+ t.episodic++;
62
+ t.conflicts += entry.conflicts_with.length;
58
63
  if (entry.extracted_from)
59
- extractedCount++;
60
- if (entry.dag_level > maxDagLevel)
61
- maxDagLevel = entry.dag_level;
64
+ t.extracted++;
65
+ if (entry.dag_level > t.maxDagLevel)
66
+ t.maxDagLevel = entry.dag_level;
67
+ }
68
+ return t;
69
+ }
70
+ export function computeAmbientState(entries, now) {
71
+ return ambientStateFromTallies(tallyAmbientEntries(entries, now));
72
+ }
73
+ /** The ambient state of a row set from its tallies, however they were counted. */
74
+ export function ambientStateFromTallies(t) {
75
+ const n = t.total;
76
+ if (n === 0) {
77
+ return {
78
+ tagEntropy: 0, avgStrength: 0, recencyFreshness: 0,
79
+ emotionalSkew: 0, schemaFitRatio: 0, errorDensity: 0,
80
+ consolidationRatio: 0, conflictIntensity: 0,
81
+ extractionCoverage: 0, dagDepth: 0, totalMemories: 0,
82
+ };
62
83
  }
63
- const tagEntropy = shannonEntropy(tagCounts, n);
64
- const avgStrength = strengthSum / n;
65
- const recencyFreshness = freshCount / n;
66
- const emotionalSkew = (negativeCount / n) * 2 - 0.5;
67
- const schemaFitRatio = highSchemaCount / n;
68
- const errorDensity = errorCount / n;
69
- const totalLayered = semanticCount + episodicCount;
70
- const consolidationRatio = totalLayered > 0 ? semanticCount / totalLayered : 0;
71
- const conflictIntensity = conflictSum / (n * 2);
72
- const extractionCoverage = episodicCount > 0 ? extractedCount / episodicCount : 0;
84
+ const tagEntropy = shannonEntropy(t.tagCounts, n);
85
+ const avgStrength = t.strengthSum / n;
86
+ const recencyFreshness = t.fresh / n;
87
+ const emotionalSkew = (t.negative / n) * 2 - 0.5;
88
+ const schemaFitRatio = t.highSchemaFit / n;
89
+ const errorDensity = t.errors / n;
90
+ const totalLayered = t.semantic + t.episodic;
91
+ const consolidationRatio = totalLayered > 0 ? t.semantic / totalLayered : 0;
92
+ const conflictIntensity = t.conflicts / (n * 2);
93
+ const extractionCoverage = t.episodic > 0 ? t.extracted / t.episodic : 0;
94
+ const maxDagLevel = t.maxDagLevel;
73
95
  return {
74
96
  tagEntropy,
75
97
  avgStrength,
@@ -0,0 +1,93 @@
1
+ import type { Context } from './types.js';
2
+ export interface AssembleOpts {
3
+ /** Token budget. Default 4000. */
4
+ budget?: number;
5
+ /** Recent raw rows always kept verbatim. Default 10. */
6
+ freshTailCount?: number;
7
+ /** Substitute parent summaries for older raws when ≥2 share a level-2
8
+ * ancestor. Default true. */
9
+ summarizeOlder?: boolean;
10
+ /**
11
+ * Restrict to a specific scope. v1.6.1 senior-review P1 #3 parity with
12
+ * `recall`: when set, exact match required (so an authorised caller can
13
+ * assemble a `slack:private:CSEC` session by passing scope explicitly).
14
+ * When undefined, default-deny applies to ANY `<source>:private:*` and
15
+ * `unknown:legacy` rows.
16
+ */
17
+ scope?: string;
18
+ /**
19
+ * Hard row cap on the SELECT that loads session raws. Default 5000 to
20
+ * protect against degenerate sessions. When the cap is hit, `truncated`
21
+ * is set on the result so the caller knows to widen.
22
+ */
23
+ rowCap?: number;
24
+ cost?: AssembleCost;
25
+ }
26
+ export interface AssembleCost {
27
+ item: (it: AssembledContextItem) => number;
28
+ fixed: (widest: number) => number;
29
+ }
30
+ export interface AssembledContextItem {
31
+ id: string;
32
+ content: string;
33
+ /** ISO timestamp of the source row's `created` field (or `earliest_at`
34
+ * for substituted summaries). */
35
+ createdAt: string;
36
+ /** Fresh-tail protected window (last freshTailCount raws). */
37
+ isFreshTail?: boolean;
38
+ /** Level-2 summary substituted for older raw rows that share a parent. */
39
+ isSummary?: boolean;
40
+ /** When isSummary, the raw ids this summary covers. drillDown
41
+ * recovers the originals. */
42
+ substitutedFor?: string[];
43
+ /** Decay × retrieval × emotional. Lets callers render a confidence
44
+ * hint without re-deriving from MemoryEntry. */
45
+ strength: number;
46
+ }
47
+ export interface AssembleResult {
48
+ sessionId: string;
49
+ items: AssembledContextItem[];
50
+ tokens: number;
51
+ /**
52
+ * Tenant + scope-filtered raw row count for the session — what the caller
53
+ * could have seen given their grant. Pre-v1.6.1 was pre-filter (confusing
54
+ * for all-private sessions); pre-v1.6.3 was capped (under-reported on
55
+ * sessions > rowCap). v1.6.3 reports the FULL post-filter count via a
56
+ * separate COUNT(*) query so consumers can render "session has N msgs"
57
+ * accurately even when items[] is the windowed view.
58
+ */
59
+ totalRaw: number;
60
+ summarized: number;
61
+ evicted: number;
62
+ /**
63
+ * True when `rowCap` truncated the loaded window. With v1.6.2's NEWEST-cap
64
+ * semantics, the items[] array represents the freshest tail of the session;
65
+ * older rows beyond the cap are silently absent. Use `totalRaw - items.length
66
+ * - summarized + ...` to estimate how much you didn't see, or widen `rowCap`.
67
+ */
68
+ truncated: boolean;
69
+ }
70
+ /**
71
+ * Build a chronologically-ordered context window for a session. Adapts the
72
+ * lossless-claw context-engine pattern to Hippo's score-ranked memory store.
73
+ *
74
+ * Algorithm:
75
+ * 1. Load all kind='raw' rows for the session, tenant + scope filtered.
76
+ * 2. Split: newest `freshTailCount` are protected (fresh tail).
77
+ * 3. For older rows, when ≥2 share a level-2 parent, substitute the
78
+ * summary; everything else passes through as raw.
79
+ * 4. Hippo-additive eviction: when over-budget, drop the lowest-strength
80
+ * non-fresh-tail item first. Fresh-tail rows are never evicted.
81
+ *
82
+ * Strength-weighted eviction is the differentiator from lossless-claw,
83
+ * which evicts oldest-first. A high-strength older row (high retrieval
84
+ * count, slow decay) survives; a low-strength recent row (newer but
85
+ * unimportant) goes first.
86
+ *
87
+ * Returns `items: []` cleanly when:
88
+ * - sessionId is empty
89
+ * - no raws exist for the session
90
+ * - all rows fail the scope/tenant filter
91
+ */
92
+ export declare function assemble(ctx: Context, sessionId: string, opts?: AssembleOpts): AssembleResult;
93
+ //# sourceMappingURL=assemble.d.ts.map
@@ -0,0 +1,153 @@
1
+ // Session context assembly under a token budget.
2
+ import { loadEntriesByIds, loadSessionRawMemories, countSessionRawMemories } from '../store/entry-reads.js';
3
+ import { estimateTokens } from '../token-ledger.js';
4
+ import { passesScopeFilterForRecall, assertScopeRequestAllowed } from '../recall-scope.js';
5
+ /**
6
+ * Build a chronologically-ordered context window for a session. Adapts the
7
+ * lossless-claw context-engine pattern to Hippo's score-ranked memory store.
8
+ *
9
+ * Algorithm:
10
+ * 1. Load all kind='raw' rows for the session, tenant + scope filtered.
11
+ * 2. Split: newest `freshTailCount` are protected (fresh tail).
12
+ * 3. For older rows, when ≥2 share a level-2 parent, substitute the
13
+ * summary; everything else passes through as raw.
14
+ * 4. Hippo-additive eviction: when over-budget, drop the lowest-strength
15
+ * non-fresh-tail item first. Fresh-tail rows are never evicted.
16
+ *
17
+ * Strength-weighted eviction is the differentiator from lossless-claw,
18
+ * which evicts oldest-first. A high-strength older row (high retrieval
19
+ * count, slow decay) survives; a low-strength recent row (newer but
20
+ * unimportant) goes first.
21
+ *
22
+ * Returns `items: []` cleanly when:
23
+ * - sessionId is empty
24
+ * - no raws exist for the session
25
+ * - all rows fail the scope/tenant filter
26
+ */
27
+ export function assemble(ctx, sessionId, opts = {}) {
28
+ assertScopeRequestAllowed(ctx.actor, opts.scope);
29
+ const budget = opts.budget ?? 4000;
30
+ const freshTailCount = opts.freshTailCount ?? 10;
31
+ const summarizeOlder = opts.summarizeOlder ?? true;
32
+ const rowCap = opts.rowCap ?? 5000;
33
+ if (!sessionId) {
34
+ return { sessionId, items: [], tokens: 0, totalRaw: 0, summarized: 0, evicted: 0, truncated: false };
35
+ }
36
+ const rows = loadSessionRawMemories(ctx.hippoRoot, sessionId, ctx.tenantId, rowCap);
37
+ const truncated = rows.length === rowCap;
38
+ // v1.6.3 senior-review P0-1: report the FULL post-filter row count even
39
+ // when the cap windows the loaded set. Pre-v1.6.3 used `scoped.length`
40
+ // which under-reported on long sessions and made consumers render
41
+ // wrong "session has N msgs" UX.
42
+ const scoped = rows.filter((r) => passesScopeFilterForRecall(r.scope ?? null, opts.scope));
43
+ let totalRaw;
44
+ if (truncated) {
45
+ // v1.6.3 codex P1 / senior P0: scope-aware unbounded COUNT. The helper
46
+ // SQL-encodes the same default-deny rule passesScopeFilterForRecall
47
+ // applies in TS, so a no-scope caller cannot infer private rows by
48
+ // comparing totalRaw to items.length on a truncated session.
49
+ totalRaw = countSessionRawMemories(ctx.hippoRoot, sessionId, ctx.tenantId, opts.scope);
50
+ }
51
+ else {
52
+ totalRaw = scoped.length;
53
+ }
54
+ if (scoped.length === 0) {
55
+ return { sessionId, items: [], tokens: 0, totalRaw, summarized: 0, evicted: 0, truncated };
56
+ }
57
+ // Split newest N into fresh tail; rest is older.
58
+ const tailStartIdx = Math.max(0, scoped.length - freshTailCount);
59
+ const olderRows = scoped.slice(0, tailStartIdx);
60
+ const tailRows = scoped.slice(tailStartIdx);
61
+ // Substitute parent summaries for older rows that share one.
62
+ const { olderItems, summarized } = summarizeOlder && olderRows.length > 0
63
+ ? substituteSummaries(ctx, olderRows, opts.scope)
64
+ : { olderItems: olderRows.map(rawItem), summarized: 0 };
65
+ const tailItems = tailRows.map((r) => ({
66
+ id: r.id,
67
+ content: r.content,
68
+ createdAt: r.created,
69
+ isFreshTail: true,
70
+ strength: r.strength,
71
+ }));
72
+ // F4 (v1.6.5): byte compare canonical UTC ISO timestamps. ~50× faster than
73
+ // localeCompare and chronological by virtue of the timestamp invariant
74
+ // documented in src/memory.ts above MemoryEntry.
75
+ const cmpIso = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
76
+ olderItems.sort((a, b) => cmpIso(a.createdAt, b.createdAt));
77
+ tailItems.sort((a, b) => cmpIso(a.createdAt, b.createdAt));
78
+ const itemCost = opts.cost?.item ?? ((it) => estimateTokens(it.content));
79
+ const room = budget - (opts.cost?.fixed(Math.max(budget, totalRaw)) ?? 0);
80
+ const { items, tokens, evicted } = evictToBudget([...olderItems, ...tailItems], itemCost, room);
81
+ return { sessionId, items, tokens, totalRaw, summarized, evicted, truncated };
82
+ }
83
+ function rawItem(r) {
84
+ return {
85
+ id: r.id,
86
+ content: r.content,
87
+ createdAt: r.created,
88
+ strength: r.strength,
89
+ };
90
+ }
91
+ function substituteSummaries(ctx, olderRows, scope) {
92
+ const olderItems = [];
93
+ let summarized = 0;
94
+ const olderByParent = new Map();
95
+ for (const r of olderRows) {
96
+ if (!r.dag_parent_id)
97
+ continue;
98
+ const list = olderByParent.get(r.dag_parent_id) ?? [];
99
+ list.push(r);
100
+ olderByParent.set(r.dag_parent_id, list);
101
+ }
102
+ const eligibleParentIds = Array.from(olderByParent.keys()).filter((pid) => (olderByParent.get(pid)?.length ?? 0) >= 2);
103
+ const parents = eligibleParentIds.length > 0
104
+ ? loadEntriesByIds(ctx.hippoRoot, eligibleParentIds, ctx.tenantId)
105
+ .filter((p) => (p.dag_level ?? 0) === 2 && !p.superseded_by)
106
+ .filter((p) => passesScopeFilterForRecall(p.scope ?? null, scope))
107
+ : [];
108
+ const claimedRawIds = new Set();
109
+ for (const parent of parents) {
110
+ const claimed = (olderByParent.get(parent.id) ?? []).map((r) => r.id);
111
+ claimed.forEach((id) => claimedRawIds.add(id));
112
+ olderItems.push({
113
+ id: parent.id,
114
+ content: parent.content,
115
+ createdAt: parent.earliest_at ?? parent.created,
116
+ isSummary: true,
117
+ substitutedFor: claimed,
118
+ strength: parent.strength,
119
+ });
120
+ summarized += claimed.length;
121
+ }
122
+ for (const r of olderRows) {
123
+ if (claimedRawIds.has(r.id))
124
+ continue;
125
+ olderItems.push(rawItem(r));
126
+ }
127
+ return { olderItems, summarized };
128
+ }
129
+ function evictToBudget(start, itemCost, room) {
130
+ let items = start;
131
+ let tokens = items.reduce((acc, it) => acc + itemCost(it), 0);
132
+ let evicted = 0;
133
+ while (tokens > room && items.length > 0) {
134
+ let worstIdx = -1;
135
+ let worstStrength = Infinity;
136
+ for (let i = 0; i < items.length; i++) {
137
+ if (items[i].isFreshTail)
138
+ continue;
139
+ if (items[i].strength < worstStrength) {
140
+ worstStrength = items[i].strength;
141
+ worstIdx = i;
142
+ }
143
+ }
144
+ if (worstIdx === -1)
145
+ break;
146
+ const cost = itemCost(items[worstIdx]);
147
+ items = items.filter((_, i) => i !== worstIdx);
148
+ tokens -= cost;
149
+ evicted++;
150
+ }
151
+ return { items, tokens, evicted };
152
+ }
153
+ //# sourceMappingURL=assemble.js.map
@@ -0,0 +1,17 @@
1
+ import { type AuditEvent, type AuditOp } from '../audit.js';
2
+ import type { KeysetPosition } from '../keyset.js';
3
+ import type { Context } from './types.js';
4
+ export interface AuditListOpts {
5
+ op?: AuditOp;
6
+ /** ISO timestamp lower bound. */
7
+ since?: string;
8
+ limit?: number;
9
+ /** Resume after this row: the (ts, id) position the previous page ended on. */
10
+ after?: KeysetPosition;
11
+ }
12
+ /**
13
+ * Read audit events scoped to `ctx.tenantId`. Read-only — no audit emit (matches
14
+ * A5: cmdAuditList does not record a 'recall'-style read event).
15
+ */
16
+ export declare function auditList(ctx: Context, opts: AuditListOpts): AuditEvent[];
17
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1,23 @@
1
+ // Audit log queries.
2
+ import { openHippoDb, closeHippoDb } from '../db.js';
3
+ import { queryAuditEvents } from '../audit.js';
4
+ /**
5
+ * Read audit events scoped to `ctx.tenantId`. Read-only — no audit emit (matches
6
+ * A5: cmdAuditList does not record a 'recall'-style read event).
7
+ */
8
+ export function auditList(ctx, opts) {
9
+ const db = openHippoDb(ctx.hippoRoot);
10
+ try {
11
+ return queryAuditEvents(db, {
12
+ tenantId: ctx.tenantId,
13
+ op: opts.op,
14
+ since: opts.since,
15
+ limit: opts.limit,
16
+ after: opts.after,
17
+ });
18
+ }
19
+ finally {
20
+ closeHippoDb(db);
21
+ }
22
+ }
23
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1,79 @@
1
+ import { type ApiKeyListItem, type ApiKeyListRow } from '../auth.js';
2
+ import type { KeysetPosition } from '../keyset.js';
3
+ import type { Context } from './types.js';
4
+ export interface AuthCreateOpts {
5
+ label?: string;
6
+ /**
7
+ * v1.12.3: authorization role for the new key. Defaults to `'admin'` for
8
+ * back-compat with v1.12.0-v1.12.2 (the api_keys.role column DEFAULT also
9
+ * resolves to 'admin' if omitted from the INSERT). Member keys are
10
+ * 403-blocked from admin-gated routes (e.g. `POST /v1/sleep`).
11
+ */
12
+ role?: 'admin' | 'member';
13
+ }
14
+ export interface AuthCreateResult {
15
+ keyId: string;
16
+ plaintext: string;
17
+ tenantId: string;
18
+ /** v1.12.3: the role bound to the new key (admin | member). */
19
+ role: 'admin' | 'member';
20
+ }
21
+ /**
22
+ * Mint a new API key. The new key is ALWAYS bound to `ctx.tenantId`. Callers
23
+ * cannot override the tenant via the opts bag — a previous `tenantId` field
24
+ * was removed because the HTTP layer would happily forward `body.tenantId`,
25
+ * letting tenant A mint a key for tenant B. The HTTP route handler at
26
+ * `src/server.ts` POST /v1/auth/keys mirrors this: it ignores any body
27
+ * `tenantId` and uses the resolved Bearer's tenant exclusively.
28
+ *
29
+ * Only an admin actor can mint (ForbiddenError otherwise), and a key never
30
+ * outranks its minter: a resolver admin is tenant-only, so it mints members.
31
+ */
32
+ export declare function authCreate(ctx: Context, opts: AuthCreateOpts): AuthCreateResult;
33
+ /**
34
+ * List API keys visible to the calling tenant.
35
+ *
36
+ * Divergence from `cmdAuthList` in src/cli.ts: the CLI today returns ALL keys
37
+ * regardless of tenant (single-tenant deployments). The API surface is tenant-
38
+ * scoped because future multi-tenant deployments will share a hippoRoot, and
39
+ * tenant A must not see tenant B's keys. Read-only — no audit emit (matches A5).
40
+ */
41
+ export declare function authList(ctx: Context, opts: {
42
+ active: boolean;
43
+ }): ApiKeyListItem[];
44
+ /** One page of the caller's tenant's keys, newest first, with the row ids a next-page cursor is built from. */
45
+ export declare function authListRows(ctx: Context, opts: {
46
+ active: boolean;
47
+ limit?: number;
48
+ after?: KeysetPosition;
49
+ }): ApiKeyListRow[];
50
+ /**
51
+ * Revoke an API key.
52
+ *
53
+ * Security: the key must belong to `ctx.tenantId`. Cross-tenant revoke is
54
+ * rejected with the "not found" message used for missing keys, and a member may
55
+ * revoke only its own key (checked first), so no caller can probe other key_ids.
56
+ *
57
+ * Audit: emits 'auth_revoke' with `tenantId` set to the KEY ROW's tenant_id
58
+ * (M1 fix from A5 review, mirrors src/cli.ts:cmdAuthRevoke). Skipped on no-op
59
+ * revoke (already revoked) so re-running doesn't pad the audit log.
60
+ */
61
+ export interface AuthRevokeResult {
62
+ ok: true;
63
+ revokedAt: string;
64
+ }
65
+ export declare function authRevoke(ctx: Context, keyId: string): AuthRevokeResult;
66
+ /**
67
+ * The tenant that owns `keyId`, or undefined for an unknown key. Host admin only: it reads across tenants,
68
+ * so the local CLI can run revoke and grant in the key's own tenant.
69
+ */
70
+ export declare function authKeyTenant(ctx: Context, keyId: string): string | undefined;
71
+ /** Shared result shape for authGrant/authUngrant, named per the file's oxlint anti-slop rule. */
72
+ export interface AuthGrantResult {
73
+ ok: true;
74
+ }
75
+ /** Grant `keyId` read access to one restricted `scope` (ROADMAP Part VIII EI2). Admin only. */
76
+ export declare function authGrant(ctx: Context, keyId: string, scope: string): AuthGrantResult;
77
+ /** Revoke `keyId`'s grant on `scope`. Same authorization and lookup rules as authGrant. */
78
+ export declare function authUngrant(ctx: Context, keyId: string, scope: string): AuthGrantResult;
79
+ //# sourceMappingURL=auth.d.ts.map