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,325 @@
1
+ import { openHippoDb, closeHippoDb } from '../db.js';
2
+ import { assertTenantId } from '../tenant.js';
3
+ import { GRAPH_ENTITY_TYPES, VALID_QUEUE_STATES } from './types.js';
4
+ import { rowToEntity, rowToRelation, rowToQueueItem, ENTITY_COLS, RELATION_COLS, QUEUE_COLS } from './rows.js';
5
+ export function loadEntityById(hippoRoot, tenantId, id) {
6
+ assertTenantId('loadEntityById', tenantId);
7
+ const db = openHippoDb(hippoRoot);
8
+ try {
9
+ // SAFETY: row's shape matches the columns named in ENTITY_COLS above.
10
+ const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ? AND tenant_id = ?`)
11
+ .get(id, tenantId);
12
+ return row ? rowToEntity(row) : null;
13
+ }
14
+ finally {
15
+ closeHippoDb(db);
16
+ }
17
+ }
18
+ /** Entities with an exact `name` (read), bounded by `limit` in SQL with a
19
+ * deterministic order. Lets the graph-view focus query find the `--entity NAME`
20
+ * entity DIRECTLY (not from a globally-capped list) WITHOUT materializing every
21
+ * same-name row when a name maps to many entities. */
22
+ export function loadEntitiesByName(hippoRoot, tenantId, name, opts = {}, txDb) {
23
+ assertTenantId('loadEntitiesByName', tenantId);
24
+ const limit = opts.limit ?? 100;
25
+ if (!Number.isInteger(limit) || limit < 0) {
26
+ throw new Error(`loadEntitiesByName: limit must be a non-negative integer; got ${limit}`);
27
+ }
28
+ const ownDb = txDb ? null : openHippoDb(hippoRoot);
29
+ const db = txDb ?? ownDb;
30
+ try {
31
+ // SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
32
+ const rows = db.prepare(`
33
+ SELECT ${ENTITY_COLS} FROM entities WHERE tenant_id = ? AND name = ?
34
+ ORDER BY id ASC LIMIT ?
35
+ `).all(tenantId, name, limit);
36
+ return rows.map(rowToEntity);
37
+ }
38
+ finally {
39
+ if (ownDb)
40
+ closeHippoDb(ownDb);
41
+ }
42
+ }
43
+ export function loadEntities(hippoRoot, tenantId, opts = {}, txDb) {
44
+ assertTenantId('loadEntities', tenantId);
45
+ const limit = opts.limit ?? 100;
46
+ if (opts.entityType && !GRAPH_ENTITY_TYPES.has(opts.entityType)) {
47
+ throw new Error(`loadEntities: entityType must be one of ${Array.from(GRAPH_ENTITY_TYPES).join('|')}; got ${opts.entityType}`);
48
+ }
49
+ const ownDb = txDb ? null : openHippoDb(hippoRoot);
50
+ const db = txDb ?? ownDb;
51
+ try {
52
+ const clauses = ['tenant_id = ?'];
53
+ const params = [tenantId];
54
+ if (opts.entityType) {
55
+ clauses.push('entity_type = ?');
56
+ params.push(opts.entityType);
57
+ }
58
+ params.push(limit);
59
+ // SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
60
+ const rows = db.prepare(`
61
+ SELECT ${ENTITY_COLS} FROM entities
62
+ WHERE ${clauses.join(' AND ')}
63
+ ORDER BY created_at DESC, id DESC
64
+ LIMIT ?
65
+ `).all(...params);
66
+ return rows.map(rowToEntity);
67
+ }
68
+ finally {
69
+ if (ownDb)
70
+ closeHippoDb(ownDb);
71
+ }
72
+ }
73
+ export function loadRelations(hippoRoot, tenantId, opts = {}, txDb) {
74
+ assertTenantId('loadRelations', tenantId);
75
+ const limit = opts.limit ?? 100;
76
+ const ownDb = txDb ? null : openHippoDb(hippoRoot);
77
+ const db = txDb ?? ownDb;
78
+ try {
79
+ const clauses = ['tenant_id = ?'];
80
+ const params = [tenantId];
81
+ if (opts.fromEntityId !== undefined) {
82
+ clauses.push('from_entity_id = ?');
83
+ params.push(opts.fromEntityId);
84
+ }
85
+ params.push(limit);
86
+ // SAFETY: rows' shape matches the columns named in RELATION_COLS above.
87
+ const rows = db.prepare(`
88
+ SELECT ${RELATION_COLS} FROM relations
89
+ WHERE ${clauses.join(' AND ')}
90
+ ORDER BY created_at DESC, id DESC
91
+ LIMIT ?
92
+ `).all(...params);
93
+ return rows.map(rowToRelation);
94
+ }
95
+ finally {
96
+ if (ownDb)
97
+ closeHippoDb(ownDb);
98
+ }
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // E3.2 multi-hop recall read helpers (SELECT-only; the check-graph-writes lint
102
+ // permits these here and in the read-only consumer src/graph-recall.ts).
103
+ // ---------------------------------------------------------------------------
104
+ /** Chunk size for IN-list queries: well under SQLite's 999-bound-variable default
105
+ * (leaves headroom for the tenant_id param + the doubled list in neighbour lookups). */
106
+ const IN_LIST_CHUNK = 400;
107
+ /**
108
+ * Map consolidated source memory ids -> their graph entities. The SEED step of E3.2
109
+ * multi-hop recall (recall result memory ids -> entities to traverse from). Tenant-
110
+ * scoped, read-only; chunks the IN-list under the SQLite variable cap.
111
+ */
112
+ export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
113
+ assertTenantId('loadEntitiesByMemoryId', tenantId);
114
+ if (memoryIds.length === 0)
115
+ return [];
116
+ const db = openHippoDb(hippoRoot);
117
+ try {
118
+ const out = [];
119
+ for (let i = 0; i < memoryIds.length; i += IN_LIST_CHUNK) {
120
+ const slice = memoryIds.slice(i, i + IN_LIST_CHUNK);
121
+ const ph = slice.map(() => '?').join(',');
122
+ // T2: no ORDER BY meant chunk-local scan order decided ties; id ASC
123
+ // makes it deterministic (entities.id is an autoincrement integer PK).
124
+ // SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
125
+ const rows = db.prepare(`
126
+ SELECT ${ENTITY_COLS} FROM entities
127
+ WHERE tenant_id = ? AND memory_id IN (${ph})
128
+ ORDER BY id ASC
129
+ `).all(tenantId, ...slice);
130
+ out.push(...rows.map(rowToEntity));
131
+ }
132
+ return out;
133
+ }
134
+ finally {
135
+ closeHippoDb(db);
136
+ }
137
+ }
138
+ /**
139
+ * Load entities by their primary ids. Resolves the entity rows reached during the BFS
140
+ * (whose `memory_id` maps back to a recall result). Tenant-scoped, read-only.
141
+ */
142
+ export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
143
+ assertTenantId('loadEntitiesByIds', tenantId);
144
+ if (ids.length === 0)
145
+ return [];
146
+ const ownDb = txDb ? null : openHippoDb(hippoRoot);
147
+ const db = txDb ?? ownDb;
148
+ try {
149
+ const out = [];
150
+ for (let i = 0; i < ids.length; i += IN_LIST_CHUNK) {
151
+ const slice = ids.slice(i, i + IN_LIST_CHUNK);
152
+ const ph = slice.map(() => '?').join(',');
153
+ // SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
154
+ const rows = db.prepare(`
155
+ SELECT ${ENTITY_COLS} FROM entities
156
+ WHERE tenant_id = ? AND id IN (${ph})
157
+ `).all(tenantId, ...slice);
158
+ out.push(...rows.map(rowToEntity));
159
+ }
160
+ return out;
161
+ }
162
+ finally {
163
+ if (ownDb)
164
+ closeHippoDb(ownDb);
165
+ }
166
+ }
167
+ /**
168
+ * All relations touching ANY of `entityIds` in EITHER direction (from OR to) — the
169
+ * per-hop neighbour query for E3.2 multi-hop traversal. ONE query for the whole frontier
170
+ * (not one per node): this is the bidirectional read `loadRelations` (from-only) lacks,
171
+ * and avoids an N+1 across BFS frontier nodes. `limit` caps rows for the frontier and
172
+ * must be a non-negative integer (the raw `LIMIT ?` rejects a fractional value).
173
+ */
174
+ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
175
+ assertTenantId('loadNeighborRelations', tenantId);
176
+ if (entityIds.length === 0)
177
+ return [];
178
+ const limit = opts.limit ?? 1000;
179
+ if (!Number.isInteger(limit) || limit < 0) {
180
+ throw new Error(`loadNeighborRelations: limit must be a non-negative integer; got ${limit}`);
181
+ }
182
+ const ownDb = txDb ? null : openHippoDb(hippoRoot);
183
+ const db = txDb ?? ownDb;
184
+ try {
185
+ // `limit` is applied PER CHUNK; a frontier spanning >IN_LIST_CHUNK ids could return
186
+ // up to limit*chunks rows before the by-id dedup below. Harmless for E3.2 (the
187
+ // frontier is bounded by maxNeighbors <= 200 << IN_LIST_CHUNK, so a single chunk,
188
+ // and the BFS re-enforces the per-hop fanout cap), but note the semantics if a
189
+ // tighter total cap is ever needed.
190
+ const byId = new Map();
191
+ for (let i = 0; i < entityIds.length; i += IN_LIST_CHUNK) {
192
+ const slice = entityIds.slice(i, i + IN_LIST_CHUNK);
193
+ const ph = slice.map(() => '?').join(',');
194
+ // SAFETY: rows' shape matches the columns named in RELATION_COLS above.
195
+ const rows = db.prepare(`
196
+ SELECT ${RELATION_COLS} FROM relations
197
+ WHERE tenant_id = ? AND (from_entity_id IN (${ph}) OR to_entity_id IN (${ph}))
198
+ ORDER BY created_at DESC, id DESC
199
+ LIMIT ?
200
+ `).all(tenantId, ...slice, ...slice, limit);
201
+ for (const r of rows)
202
+ byId.set(r.id, rowToRelation(r));
203
+ }
204
+ return Array.from(byId.values());
205
+ }
206
+ finally {
207
+ if (ownDb)
208
+ closeHippoDb(ownDb);
209
+ }
210
+ }
211
+ /**
212
+ * Relations with BOTH endpoints in `entityIds` (edges AMONG the set, not merely
213
+ * touching it). Read. Used by the graph-view focus subgraph so the displayed
214
+ * edges are exactly the intra-union edges: the `LIMIT` only caps genuinely-many
215
+ * intra-union edges — no out-of-union row can evict a valid in-set edge. The
216
+ * caller bounds `entityIds` (<= the view limit), so a single query is safe.
217
+ */
218
+ export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
219
+ assertTenantId('loadRelationsAmong', tenantId);
220
+ if (entityIds.length === 0)
221
+ return [];
222
+ const limit = opts.limit ?? 1000;
223
+ if (!Number.isInteger(limit) || limit < 0) {
224
+ throw new Error(`loadRelationsAmong: limit must be a non-negative integer; got ${limit}`);
225
+ }
226
+ const ownDb = txDb ? null : openHippoDb(hippoRoot);
227
+ const db = txDb ?? ownDb;
228
+ try {
229
+ const ph = entityIds.map(() => '?').join(',');
230
+ // SAFETY: rows' shape matches the columns named in RELATION_COLS above.
231
+ const rows = db.prepare(`
232
+ SELECT ${RELATION_COLS} FROM relations
233
+ WHERE tenant_id = ? AND from_entity_id IN (${ph}) AND to_entity_id IN (${ph})
234
+ ORDER BY created_at DESC, id DESC
235
+ LIMIT ?
236
+ `).all(tenantId, ...entityIds, ...entityIds, limit);
237
+ return rows.map(rowToRelation);
238
+ }
239
+ finally {
240
+ if (ownDb)
241
+ closeHippoDb(ownDb);
242
+ }
243
+ }
244
+ /**
245
+ * Run `fn` inside ONE read transaction (a single WAL snapshot) so every graph read
246
+ * it performs — pass the supplied `txDb` to the `load*` functions — sees a consistent
247
+ * view, even if a `graph extract` / sleep-drain rebuild commits concurrently between
248
+ * reads (the rebuild clears + reinserts entities, so separate reads could otherwise
249
+ * mix old entity ids with new relation ids). Reads only; the connection is opened
250
+ * once and closed after.
251
+ */
252
+ export function withGraphReadSnapshot(hippoRoot, fn) {
253
+ const db = openHippoDb(hippoRoot);
254
+ try {
255
+ db.exec('BEGIN');
256
+ try {
257
+ const out = fn(db);
258
+ db.exec('COMMIT');
259
+ return out;
260
+ }
261
+ catch (e) {
262
+ try {
263
+ db.exec('ROLLBACK');
264
+ }
265
+ catch { /* ignore */ }
266
+ throw e;
267
+ }
268
+ }
269
+ finally {
270
+ closeHippoDb(db);
271
+ }
272
+ }
273
+ export function loadExtractionQueue(hippoRoot, tenantId, opts = {}) {
274
+ assertTenantId('loadExtractionQueue', tenantId);
275
+ const limit = opts.limit ?? 100;
276
+ if (opts.status && !VALID_QUEUE_STATES.has(opts.status)) {
277
+ throw new Error(`loadExtractionQueue: status must be one of ${Array.from(VALID_QUEUE_STATES).join('|')}; got ${opts.status}`);
278
+ }
279
+ const db = openHippoDb(hippoRoot);
280
+ try {
281
+ const clauses = ['tenant_id = ?'];
282
+ const params = [tenantId];
283
+ if (opts.status) {
284
+ clauses.push('status = ?');
285
+ params.push(opts.status);
286
+ }
287
+ params.push(limit);
288
+ // SAFETY: rows' shape matches the columns named in QUEUE_COLS above.
289
+ const rows = db.prepare(`
290
+ SELECT ${QUEUE_COLS} FROM graph_extraction_queue
291
+ WHERE ${clauses.join(' AND ')}
292
+ ORDER BY enqueued_at ASC, id ASC
293
+ LIMIT ?
294
+ `).all(...params);
295
+ return rows.map(rowToQueueItem);
296
+ }
297
+ finally {
298
+ closeHippoDb(db);
299
+ }
300
+ }
301
+ /**
302
+ * The dirty tenants awaiting graph re-extraction, each with the MAX pending
303
+ * queue id at read time (a watermark). The sleep drain rebuilds each tenant's
304
+ * graph, then marks only items at or below the watermark processed, so items
305
+ * enqueued DURING the rebuild stay pending for the next sleep (no lost-update
306
+ * race). Host-wide read (the queue is per-tenant but sleep is cross-tenant).
307
+ */
308
+ export function loadPendingExtractionTenants(hippoRoot) {
309
+ const db = openHippoDb(hippoRoot);
310
+ try {
311
+ // SAFETY: rows' shape matches the two aliased columns (tenant_id, max_id)
312
+ // named in the SELECT above.
313
+ const rows = db.prepare(`
314
+ SELECT tenant_id AS tenant_id, MAX(id) AS max_id
315
+ FROM graph_extraction_queue
316
+ WHERE status = 'pending'
317
+ GROUP BY tenant_id
318
+ `).all();
319
+ return rows.map((r) => ({ tenantId: r.tenant_id, maxPendingId: Number(r.max_id) }));
320
+ }
321
+ finally {
322
+ closeHippoDb(db);
323
+ }
324
+ }
325
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1,45 @@
1
+ import type { Entity, Relation, GraphQueueItem } from './types.js';
2
+ export interface EntityRow {
3
+ id: number;
4
+ tenant_id: string;
5
+ entity_type: string;
6
+ name: string;
7
+ memory_id: string | null;
8
+ source_kind: string;
9
+ source_object_type: string | null;
10
+ source_object_id: number | null;
11
+ created_at: string;
12
+ }
13
+ export interface RelationRow {
14
+ id: number;
15
+ tenant_id: string;
16
+ from_entity_id: number;
17
+ to_entity_id: number;
18
+ rel_type: string;
19
+ memory_id: string | null;
20
+ source_kind: string;
21
+ source_object_type: string | null;
22
+ source_object_id: number | null;
23
+ created_at: string;
24
+ }
25
+ export interface QueueRow {
26
+ id: number;
27
+ tenant_id: string;
28
+ memory_id: string;
29
+ kind: string;
30
+ status: string;
31
+ enqueued_at: string;
32
+ processed_at: string | null;
33
+ }
34
+ export declare function rowToEntity(row: EntityRow): Entity;
35
+ export declare function rowToRelation(row: RelationRow): Relation;
36
+ export declare function rowToQueueItem(row: QueueRow): GraphQueueItem;
37
+ export declare const ENTITY_COLS = "id, tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at";
38
+ export declare const RELATION_COLS = "id, tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at";
39
+ export declare const QUEUE_COLS = "id, tenant_id, memory_id, kind, status, enqueued_at, processed_at";
40
+ export interface DbLike {
41
+ prepare(sql: string): {
42
+ get<T>(...params: unknown[]): T;
43
+ };
44
+ }
45
+ //# sourceMappingURL=rows.d.ts.map
@@ -0,0 +1,51 @@
1
+ export function rowToEntity(row) {
2
+ // SAFETY: entity_type/source_kind/source_object_type are DB CHECK-constrained
3
+ // (see db.ts CREATE TABLE entities) to exactly the EntityType/SourceKind/
4
+ // SourceObjectType enum values, so the row's column values match those types.
5
+ return {
6
+ id: row.id,
7
+ tenantId: row.tenant_id,
8
+ entityType: row.entity_type,
9
+ name: row.name,
10
+ memoryId: row.memory_id,
11
+ sourceKind: row.source_kind,
12
+ sourceObjectType: row.source_object_type === null ? undefined : row.source_object_type,
13
+ sourceObjectId: row.source_object_id === null ? undefined : row.source_object_id,
14
+ createdAt: row.created_at,
15
+ };
16
+ }
17
+ export function rowToRelation(row) {
18
+ // SAFETY: rel_type/source_kind/source_object_type are DB CHECK-constrained
19
+ // (see db.ts CREATE TABLE relations) to exactly the RelationType/SourceKind/
20
+ // SourceObjectType enum values, so the row's column values match those types.
21
+ return {
22
+ id: row.id,
23
+ tenantId: row.tenant_id,
24
+ fromEntityId: row.from_entity_id,
25
+ toEntityId: row.to_entity_id,
26
+ relType: row.rel_type,
27
+ memoryId: row.memory_id,
28
+ sourceKind: row.source_kind,
29
+ sourceObjectType: row.source_object_type === null ? undefined : row.source_object_type,
30
+ sourceObjectId: row.source_object_id === null ? undefined : row.source_object_id,
31
+ createdAt: row.created_at,
32
+ };
33
+ }
34
+ export function rowToQueueItem(row) {
35
+ // SAFETY: kind/status are DB CHECK-constrained (see db.ts CREATE TABLE
36
+ // graph_extraction_queue) to exactly the SourceKind/GraphQueueStatus enum
37
+ // values, so the row's column values match those types.
38
+ return {
39
+ id: row.id,
40
+ tenantId: row.tenant_id,
41
+ memoryId: row.memory_id,
42
+ kind: row.kind,
43
+ status: row.status,
44
+ enqueuedAt: row.enqueued_at,
45
+ processedAt: row.processed_at,
46
+ };
47
+ }
48
+ export const ENTITY_COLS = `id, tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at`;
49
+ export const RELATION_COLS = `id, tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at`;
50
+ export const QUEUE_COLS = `id, tenant_id, memory_id, kind, status, enqueued_at, processed_at`;
51
+ //# sourceMappingURL=rows.js.map
@@ -0,0 +1,83 @@
1
+ import { openHippoDb } from '../db.js';
2
+ /** The DB connection handle `openHippoDb` returns. Threaded (optionally) through
3
+ * the graph writers so `extractGraph` can run clear + all inserts in ONE
4
+ * transaction — see `runGraphRebuildTransaction`. */
5
+ export type GraphTxDb = ReturnType<typeof openHippoDb>;
6
+ export type EntityType = 'person' | 'project' | 'customer' | 'system' | 'policy' | 'decision';
7
+ export type RelationType = 'owns' | 'supersedes' | 'depends-on' | 'blocked-by' | 'references';
8
+ export type GraphQueueStatus = 'pending' | 'processed' | 'skipped';
9
+ /** The consolidated source kinds the graph is permitted to index (never 'raw'). */
10
+ export type SourceKind = 'distilled' | 'superseded';
11
+ /** The authoritative E2 object types a graph row may be anchored to (the object
12
+ * provenance path, alongside the memory path). Maps to source_object_type. */
13
+ export type SourceObjectType = 'decision' | 'policy' | 'customer' | 'project';
14
+ /** A soft (type,id) pointer to the authoritative E2 row a graph row descends from.
15
+ * Survives a mirror memory forget/prune (memory_id may go NULL); the rebuild
16
+ * re-validates it (it is not a hard FK). */
17
+ export interface SourceObjectRef {
18
+ type: SourceObjectType;
19
+ id: number;
20
+ }
21
+ export declare const GRAPH_ENTITY_TYPES: ReadonlySet<EntityType>;
22
+ export declare const GRAPH_RELATION_TYPES: ReadonlySet<RelationType>;
23
+ export declare const VALID_QUEUE_STATES: ReadonlySet<GraphQueueStatus>;
24
+ export declare const MAX_ENTITY_NAME_LEN = 512;
25
+ export interface Entity {
26
+ id: number;
27
+ tenantId: string;
28
+ entityType: EntityType;
29
+ name: string;
30
+ /** The consolidated source memory this entity was extracted from. NULL once the
31
+ * mirror is forgotten/pruned (ON DELETE SET NULL) - the entity then survives via
32
+ * its source_object provenance. */
33
+ memoryId: string | null;
34
+ sourceKind: SourceKind;
35
+ /** The authoritative E2 object this entity is anchored to (E2-provenance path).
36
+ * Set for E2-sourced entities; absent for memory-only (prose/NLP) entities. */
37
+ sourceObjectType?: SourceObjectType;
38
+ sourceObjectId?: number;
39
+ createdAt: string;
40
+ }
41
+ export interface Relation {
42
+ id: number;
43
+ tenantId: string;
44
+ fromEntityId: number;
45
+ toEntityId: number;
46
+ relType: RelationType;
47
+ /** NULL once the mirror is forgotten/pruned; the relation survives via source_object. */
48
+ memoryId: string | null;
49
+ sourceKind: SourceKind;
50
+ sourceObjectType?: SourceObjectType;
51
+ sourceObjectId?: number;
52
+ createdAt: string;
53
+ }
54
+ export interface GraphQueueItem {
55
+ id: number;
56
+ tenantId: string;
57
+ memoryId: string;
58
+ kind: SourceKind;
59
+ status: GraphQueueStatus;
60
+ enqueuedAt: string;
61
+ processedAt: string | null;
62
+ }
63
+ export interface InsertEntityOpts {
64
+ entityType: EntityType;
65
+ name: string;
66
+ /** A consolidated (distilled/superseded) memory; raw is rejected. NULL/omitted when
67
+ * the entity is anchored only to its E2 source object (mirror forgotten/pruned). */
68
+ memoryId?: string | null;
69
+ /** The authoritative E2 object this entity descends from. Required when memoryId is
70
+ * null; optional alongside a live memory (both paths may be set). */
71
+ sourceObject?: SourceObjectRef;
72
+ }
73
+ export interface InsertRelationOpts {
74
+ fromEntityId: number;
75
+ toEntityId: number;
76
+ relType: RelationType;
77
+ /** A consolidated (distilled/superseded) memory; raw is rejected. NULL/omitted when
78
+ * the relation is anchored only to its E2 source object. */
79
+ memoryId?: string | null;
80
+ /** The authoritative E2 object this relation descends from. */
81
+ sourceObject?: SourceObjectRef;
82
+ }
83
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,11 @@
1
+ export const GRAPH_ENTITY_TYPES = new Set([
2
+ 'person', 'project', 'customer', 'system', 'policy', 'decision',
3
+ ]);
4
+ export const GRAPH_RELATION_TYPES = new Set([
5
+ 'owns', 'supersedes', 'depends-on', 'blocked-by', 'references',
6
+ ]);
7
+ export const VALID_QUEUE_STATES = new Set([
8
+ 'pending', 'processed', 'skipped',
9
+ ]);
10
+ export const MAX_ENTITY_NAME_LEN = 512;
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,93 @@
1
+ /**
2
+ * E3.3 graph layer over consolidated state - the graph-on-consolidated guard.
3
+ * (docs/plans/2026-06-01-e3-graph-guard.md).
4
+ *
5
+ * A graph of canonical `entities` (person/project/customer/system/policy/decision) and
6
+ * `relations` (owns/supersedes/depends-on/blocked-by/references) sits ON TOP OF
7
+ * consolidated memories. The hard rule: the graph NEVER indexes the raw layer - every
8
+ * entity and relation references a memory whose `kind IN ('distilled','superseded')`,
9
+ * never `kind='raw'`. Enforced at the DB level (CHECK on source_kind/kind + BEFORE
10
+ * INSERT and BEFORE UPDATE triggers that tie source_kind/kind to the FK'd memory's
11
+ * actual kind and enforce tenant-match - relations also reject cross-tenant edges), so
12
+ * the forbidden state is unrepresentable regardless of code path. These helpers
13
+ * surface the same guard as clear throws BEFORE hitting the trigger backstop.
14
+ *
15
+ * Scope (E3.3 first slice): the substrate + the guard + a thin insert/load/enqueue
16
+ * API. The `graph_extraction_queue` is the interface the deferred `hippo sleep`
17
+ * enqueue-hook + E3.1 entity extraction will call. No operator surface (CLI/HTTP/SDK)
18
+ * until E3.2 multi-hop recall.
19
+ */
20
+ import { type GraphTxDb, type SourceObjectType, type Entity, type Relation, type GraphQueueItem, type InsertEntityOpts, type InsertRelationOpts } from './types.js';
21
+ /**
22
+ * Insert a graph entity extracted from a consolidated memory. Throws if the source
23
+ * memory is missing / cross-tenant / raw (the DB trigger is the backstop).
24
+ */
25
+ export declare function insertEntity(hippoRoot: string, tenantId: string, opts: InsertEntityOpts, txDb?: GraphTxDb): Entity;
26
+ /**
27
+ * Insert a graph relation between two entities, sourced from a consolidated memory.
28
+ * Both entities must exist in the same tenant; the source memory must be consolidated.
29
+ */
30
+ export declare function insertRelation(hippoRoot: string, tenantId: string, opts: InsertRelationOpts, txDb?: GraphTxDb): Relation;
31
+ /**
32
+ * Enqueue a consolidated memory for later graph extraction. Rejects a raw / missing /
33
+ * cross-tenant memory (the DB trigger is the backstop). The producer hook in
34
+ * `hippo sleep` is deferred (E3.1); this is the API it will call.
35
+ */
36
+ export declare function enqueueExtraction(hippoRoot: string, tenantId: string, memoryId: string): GraphQueueItem;
37
+ /**
38
+ * Mark a queue item terminal (processed | skipped). Only `status`/`processed_at`
39
+ * change, so the consolidated-source guard trigger (which fires on
40
+ * memory_id/kind/tenant_id changes) is not involved. CAS on the current status to a
41
+ * non-terminal 'pending'.
42
+ */
43
+ export declare function markExtractionProcessed(hippoRoot: string, tenantId: string, id: number, status?: 'processed' | 'skipped'): GraphQueueItem;
44
+ /**
45
+ * Delete ALL entities for a tenant (relations cascade via the from/to FKs). Returns
46
+ * the number of entities deleted. The rebuild primitive for graph extraction: the
47
+ * deterministic graph is a pure derived function of the consolidated objects, so an
48
+ * extract clears then re-derives. Lives in graph.ts (the sole sanctioned graph
49
+ * writer), so the E3.3 CI lint permits this `DELETE FROM entities`. Does NOT touch
50
+ * graph_extraction_queue (the enqueue-hook's domain).
51
+ */
52
+ export declare function clearGraph(hippoRoot: string, tenantId: string, txDb?: GraphTxDb): number;
53
+ /**
54
+ * Run a full graph rebuild for one tenant inside a single transaction. `clearGraph`
55
+ * + every `insertEntity`/`insertRelation` call made inside `fn` (passing the supplied
56
+ * `txDb`) share the one connection and its `BEGIN IMMEDIATE` write lock, so the
57
+ * rebuild is ATOMIC: two concurrent rebuilds serialize on the write lock (the second
58
+ * waits, then re-derives cleanly) instead of interleaving into duplicate rows, and a
59
+ * throw mid-rebuild ROLLS BACK the clear (no bricked/empty graph). The sole sanctioned
60
+ * place to wrap graph writes in a transaction.
61
+ */
62
+ export declare function runGraphRebuildTransaction<T>(hippoRoot: string, tenantId: string, fn: (txDb: GraphTxDb) => T): T;
63
+ /**
64
+ * Fail-soft producer hook: mark a tenant dirty for graph re-extraction by
65
+ * enqueuing its consolidated mirror memory. NEVER throws into the caller — a
66
+ * graph-dirty signal failing must not abort a core E2 write. Graph staleness is
67
+ * recoverable (next sleep / manual `graph extract`); a broken `hippo decide` is
68
+ * not. Called POST-COMMIT from the E2 graph-source save/close mutations of
69
+ * decision, policy, customer_note and project_brief. A null memoryId (a
70
+ * forgotten mirror) is a no-op.
71
+ */
72
+ export declare function markGraphDirty(hippoRoot: string, tenantId: string, memoryId: string | null): void;
73
+ /**
74
+ * Remove the graph rows sourced from one E2 object, by its (type, id). Used when a
75
+ * MIRRORLESS object is closed: it has no mirror memory, so `markGraphDirty` cannot
76
+ * enqueue a rebuild (the queue is memory-keyed). Closing must still drop the object's
77
+ * now-stale entity + edges from the graph, so we remove them directly here. Fail-soft
78
+ * like `markGraphDirty` (never throws into the E2 close caller; graph staleness is
79
+ * recoverable). Deleting the entity cascade-deletes any relation where it is an endpoint
80
+ * (relations FK entities ON DELETE CASCADE); the explicit relations DELETE also covers a
81
+ * relation whose OWN provenance is this object (defensive — every such edge has the object
82
+ * as an endpoint today, so the cascade already covers it). DELETE fires no BEFORE
83
+ * INSERT/UPDATE guard trigger.
84
+ */
85
+ export declare function removeGraphEntitiesForObject(hippoRoot: string, tenantId: string, sourceObjectType: SourceObjectType, sourceObjectId: number): void;
86
+ /**
87
+ * Mark every pending queue item for a tenant with `id <= maxId` processed, in
88
+ * one UPDATE. Status/processed_at only, so the consolidated-source guard trigger
89
+ * is not involved (same as markExtractionProcessed). Returns the count marked.
90
+ * The `<= maxId` watermark excludes items enqueued after the drain snapshot.
91
+ */
92
+ export declare function markPendingProcessedUpTo(hippoRoot: string, tenantId: string, maxId: number): number;
93
+ //# sourceMappingURL=write.d.ts.map