hippo-memory 1.60.0 → 1.61.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 (585) hide show
  1. package/README.md +1 -1
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.js +4 -1
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/gemini.js +1 -1
  7. package/dist/agent-memories/legacy.js +1 -1
  8. package/dist/agent-memories/source.js +1 -1
  9. package/dist/agent-memories/sync.js +8 -3
  10. package/dist/ambient-store.d.ts +14 -0
  11. package/dist/ambient-store.js +90 -0
  12. package/dist/ambient.d.ts +23 -0
  13. package/dist/ambient.js +72 -50
  14. package/dist/api/assemble.d.ts +93 -0
  15. package/dist/api/assemble.js +152 -0
  16. package/dist/api/audit.d.ts +17 -0
  17. package/dist/api/audit.js +23 -0
  18. package/dist/api/auth.d.ts +79 -0
  19. package/dist/api/auth.js +178 -0
  20. package/dist/api/context-types.d.ts +105 -0
  21. package/dist/api/context-types.js +3 -0
  22. package/dist/api/context.d.ts +31 -0
  23. package/dist/api/context.js +705 -0
  24. package/dist/api/dormant.d.ts +30 -0
  25. package/dist/api/dormant.js +140 -0
  26. package/dist/api/drill-down.d.ts +84 -0
  27. package/dist/api/drill-down.js +123 -0
  28. package/dist/api/forget.d.ts +57 -0
  29. package/dist/api/forget.js +87 -0
  30. package/dist/api/goals.d.ts +18 -0
  31. package/dist/api/goals.js +33 -0
  32. package/dist/api/learn.d.ts +31 -0
  33. package/dist/api/learn.js +88 -0
  34. package/dist/api/outcome.d.ts +61 -0
  35. package/dist/api/outcome.js +66 -0
  36. package/dist/api/promote.d.ts +54 -0
  37. package/dist/api/promote.js +203 -0
  38. package/dist/api/quarantine.d.ts +24 -0
  39. package/dist/api/quarantine.js +121 -0
  40. package/dist/api/recall-types.d.ts +390 -0
  41. package/dist/api/recall-types.js +3 -0
  42. package/dist/api/recall.d.ts +36 -0
  43. package/dist/api/recall.js +634 -0
  44. package/dist/api/remember.d.ts +35 -0
  45. package/dist/api/remember.js +43 -0
  46. package/dist/api/sleep.d.ts +136 -0
  47. package/dist/api/sleep.js +271 -0
  48. package/dist/api/tokens.d.ts +26 -0
  49. package/dist/api/tokens.js +60 -0
  50. package/dist/api/types.d.ts +56 -0
  51. package/dist/api/types.js +38 -0
  52. package/dist/api.d.ts +20 -1262
  53. package/dist/api.js +25 -2727
  54. package/dist/audit.d.ts +3 -0
  55. package/dist/audit.js +6 -3
  56. package/dist/auth.d.ts +45 -4
  57. package/dist/auth.js +125 -48
  58. package/dist/autolearn.js +2 -2
  59. package/dist/capture/command.d.ts +33 -0
  60. package/dist/capture/command.js +264 -0
  61. package/dist/capture/compact.d.ts +44 -0
  62. package/dist/capture/compact.js +354 -0
  63. package/dist/capture/extract.d.ts +21 -0
  64. package/dist/capture/extract.js +464 -0
  65. package/dist/capture/transcript.d.ts +40 -0
  66. package/dist/capture/transcript.js +193 -0
  67. package/dist/capture-error.js +2 -1
  68. package/dist/churn-git.js +4 -2
  69. package/dist/cli/audit.d.ts +3 -0
  70. package/dist/cli/audit.js +159 -0
  71. package/dist/cli/auth.d.ts +2 -0
  72. package/dist/cli/auth.js +171 -0
  73. package/dist/cli/briefs.d.ts +4 -0
  74. package/dist/cli/briefs.js +435 -0
  75. package/dist/cli/card.d.ts +3 -0
  76. package/dist/cli/card.js +333 -0
  77. package/dist/cli/context.d.ts +15 -0
  78. package/dist/cli/context.js +366 -0
  79. package/dist/cli/continuity.d.ts +6 -0
  80. package/dist/cli/continuity.js +445 -0
  81. package/dist/cli/curate.d.ts +19 -0
  82. package/dist/cli/curate.js +555 -0
  83. package/dist/cli/dag.d.ts +5 -0
  84. package/dist/cli/dag.js +177 -0
  85. package/dist/cli/decisions.d.ts +4 -0
  86. package/dist/cli/decisions.js +528 -0
  87. package/dist/cli/eval.d.ts +5 -0
  88. package/dist/cli/eval.js +213 -0
  89. package/dist/cli/explain.d.ts +4 -0
  90. package/dist/cli/explain.js +150 -0
  91. package/dist/cli/goals.d.ts +2 -0
  92. package/dist/cli/goals.js +196 -0
  93. package/dist/cli/hook-blocks.d.ts +18 -0
  94. package/dist/cli/hook-blocks.js +233 -0
  95. package/dist/cli/init.d.ts +2 -0
  96. package/dist/cli/init.js +305 -0
  97. package/dist/cli/maintenance.d.ts +4 -0
  98. package/dist/cli/maintenance.js +179 -0
  99. package/dist/cli/playbooks.d.ts +4 -0
  100. package/dist/cli/playbooks.js +556 -0
  101. package/dist/cli/projects.js +1 -1
  102. package/dist/cli/recall.d.ts +7 -0
  103. package/dist/cli/recall.js +597 -0
  104. package/dist/cli/remember.d.ts +5 -0
  105. package/dist/cli/remember.js +442 -0
  106. package/dist/cli/serve.d.ts +5 -0
  107. package/dist/cli/serve.js +40 -0
  108. package/dist/cli/session-hooks.d.ts +29 -0
  109. package/dist/cli/session-hooks.js +637 -0
  110. package/dist/cli/setup.d.ts +4 -0
  111. package/dist/cli/setup.js +376 -0
  112. package/dist/cli/shared.d.ts +15 -19
  113. package/dist/cli/shared.js +50 -341
  114. package/dist/cli/slack.d.ts +2 -0
  115. package/dist/cli/slack.js +171 -0
  116. package/dist/cli/status.d.ts +18 -0
  117. package/dist/cli/status.js +400 -0
  118. package/dist/cli/transfer.d.ts +10 -0
  119. package/dist/cli/transfer.js +438 -0
  120. package/dist/cli/usage.d.ts +85 -0
  121. package/dist/cli/usage.js +741 -0
  122. package/dist/cli.d.ts +71 -120
  123. package/dist/cli.js +170 -8469
  124. package/dist/client.js +15 -8
  125. package/dist/compaction-record.js +6 -4
  126. package/dist/connectors/github/backfill.js +94 -87
  127. package/dist/connectors/github/cli-impl.js +4 -3
  128. package/dist/connectors/github/dlq.js +67 -54
  129. package/dist/connectors/github/ingest.js +34 -35
  130. package/dist/connectors/github/tenant-routing.js +3 -2
  131. package/dist/connectors/github/webhook.js +135 -216
  132. package/dist/connectors/slack/dlq.js +49 -61
  133. package/dist/connectors/slack/ingest.js +55 -48
  134. package/dist/connectors/slack/tenant-routing.js +4 -3
  135. package/dist/connectors/slack/webhook.js +72 -74
  136. package/dist/consolidate/conflicts.d.ts +10 -0
  137. package/dist/consolidate/conflicts.js +178 -0
  138. package/dist/consolidate/decay.d.ts +12 -0
  139. package/dist/consolidate/decay.js +145 -0
  140. package/dist/consolidate/llm-passes.d.ts +3 -0
  141. package/dist/consolidate/llm-passes.js +141 -0
  142. package/dist/consolidate/merge.d.ts +7 -0
  143. package/dist/consolidate/merge.js +251 -0
  144. package/dist/consolidate/physics-pass.d.ts +3 -0
  145. package/dist/consolidate/physics-pass.js +60 -0
  146. package/dist/consolidate/run.d.ts +69 -0
  147. package/dist/consolidate/run.js +76 -0
  148. package/dist/consolidate/sleep.d.ts +18 -0
  149. package/dist/consolidate/sleep.js +209 -0
  150. package/dist/consolidate/traces.d.ts +4 -0
  151. package/dist/consolidate/traces.js +178 -0
  152. package/dist/context-auto.js +7 -11
  153. package/dist/context-render.d.ts +1 -1
  154. package/dist/context-render.js +1 -1
  155. package/dist/customer-notes.d.ts +3 -0
  156. package/dist/customer-notes.js +6 -4
  157. package/dist/dag.js +6 -5
  158. package/dist/dashboard-actions.d.ts +20 -0
  159. package/dist/dashboard-actions.js +88 -0
  160. package/dist/dashboard-params.d.ts +45 -0
  161. package/dist/dashboard-params.js +127 -0
  162. package/dist/dashboard-queries.d.ts +15 -0
  163. package/dist/dashboard-queries.js +355 -0
  164. package/dist/dashboard-snapshot.d.ts +138 -0
  165. package/dist/dashboard-snapshot.js +308 -0
  166. package/dist/dashboard-types.d.ts +163 -0
  167. package/dist/dashboard-types.js +3 -0
  168. package/dist/dashboard.d.ts +6 -7
  169. package/dist/dashboard.js +228 -202
  170. package/dist/db/busy.d.ts +5 -0
  171. package/dist/db/busy.js +24 -0
  172. package/dist/db/continuity.d.ts +5 -0
  173. package/dist/db/continuity.js +145 -0
  174. package/dist/db/meta.d.ts +8 -0
  175. package/dist/db/meta.js +35 -0
  176. package/dist/db/migrate.d.ts +9 -0
  177. package/dist/db/migrate.js +138 -0
  178. package/dist/db/migrations/index.d.ts +5 -0
  179. package/dist/db/migrations/index.js +109 -0
  180. package/dist/db/migrations/types.d.ts +14 -0
  181. package/dist/db/migrations/types.js +2 -0
  182. package/dist/db/migrations/v01.d.ts +3 -0
  183. package/dist/db/migrations/v01.js +38 -0
  184. package/dist/db/migrations/v02.d.ts +3 -0
  185. package/dist/db/migrations/v02.js +21 -0
  186. package/dist/db/migrations/v03.d.ts +3 -0
  187. package/dist/db/migrations/v03.js +22 -0
  188. package/dist/db/migrations/v04.d.ts +3 -0
  189. package/dist/db/migrations/v04.js +28 -0
  190. package/dist/db/migrations/v05.d.ts +3 -0
  191. package/dist/db/migrations/v05.js +21 -0
  192. package/dist/db/migrations/v06.d.ts +3 -0
  193. package/dist/db/migrations/v06.js +25 -0
  194. package/dist/db/migrations/v07.d.ts +3 -0
  195. package/dist/db/migrations/v07.js +13 -0
  196. package/dist/db/migrations/v08.d.ts +3 -0
  197. package/dist/db/migrations/v08.js +8 -0
  198. package/dist/db/migrations/v09.d.ts +3 -0
  199. package/dist/db/migrations/v09.js +13 -0
  200. package/dist/db/migrations/v10.d.ts +3 -0
  201. package/dist/db/migrations/v10.js +17 -0
  202. package/dist/db/migrations/v11.d.ts +3 -0
  203. package/dist/db/migrations/v11.js +15 -0
  204. package/dist/db/migrations/v12.d.ts +3 -0
  205. package/dist/db/migrations/v12.js +11 -0
  206. package/dist/db/migrations/v13.d.ts +3 -0
  207. package/dist/db/migrations/v13.js +15 -0
  208. package/dist/db/migrations/v14.d.ts +3 -0
  209. package/dist/db/migrations/v14.js +66 -0
  210. package/dist/db/migrations/v15.d.ts +3 -0
  211. package/dist/db/migrations/v15.js +42 -0
  212. package/dist/db/migrations/v16.d.ts +3 -0
  213. package/dist/db/migrations/v16.js +61 -0
  214. package/dist/db/migrations/v17.d.ts +3 -0
  215. package/dist/db/migrations/v17.js +46 -0
  216. package/dist/db/migrations/v18.d.ts +3 -0
  217. package/dist/db/migrations/v18.js +60 -0
  218. package/dist/db/migrations/v19.d.ts +3 -0
  219. package/dist/db/migrations/v19.js +28 -0
  220. package/dist/db/migrations/v20.d.ts +3 -0
  221. package/dist/db/migrations/v20.js +42 -0
  222. package/dist/db/migrations/v21.d.ts +3 -0
  223. package/dist/db/migrations/v21.js +16 -0
  224. package/dist/db/migrations/v22.d.ts +3 -0
  225. package/dist/db/migrations/v22.js +82 -0
  226. package/dist/db/migrations/v23.d.ts +3 -0
  227. package/dist/db/migrations/v23.js +48 -0
  228. package/dist/db/migrations/v24.d.ts +3 -0
  229. package/dist/db/migrations/v24.js +72 -0
  230. package/dist/db/migrations/v25.d.ts +3 -0
  231. package/dist/db/migrations/v25.js +46 -0
  232. package/dist/db/migrations/v26.d.ts +3 -0
  233. package/dist/db/migrations/v26.js +23 -0
  234. package/dist/db/migrations/v27.d.ts +3 -0
  235. package/dist/db/migrations/v27.js +57 -0
  236. package/dist/db/migrations/v28.d.ts +3 -0
  237. package/dist/db/migrations/v28.js +38 -0
  238. package/dist/db/migrations/v29.d.ts +3 -0
  239. package/dist/db/migrations/v29.js +78 -0
  240. package/dist/db/migrations/v30.d.ts +3 -0
  241. package/dist/db/migrations/v30.js +92 -0
  242. package/dist/db/migrations/v31.d.ts +3 -0
  243. package/dist/db/migrations/v31.js +74 -0
  244. package/dist/db/migrations/v32.d.ts +3 -0
  245. package/dist/db/migrations/v32.js +102 -0
  246. package/dist/db/migrations/v33.d.ts +3 -0
  247. package/dist/db/migrations/v33.js +104 -0
  248. package/dist/db/migrations/v34.d.ts +3 -0
  249. package/dist/db/migrations/v34.js +93 -0
  250. package/dist/db/migrations/v35.d.ts +3 -0
  251. package/dist/db/migrations/v35.js +98 -0
  252. package/dist/db/migrations/v36.d.ts +3 -0
  253. package/dist/db/migrations/v36.js +98 -0
  254. package/dist/db/migrations/v37.d.ts +3 -0
  255. package/dist/db/migrations/v37.js +219 -0
  256. package/dist/db/migrations/v38.d.ts +3 -0
  257. package/dist/db/migrations/v38.js +277 -0
  258. package/dist/db/migrations/v39.d.ts +3 -0
  259. package/dist/db/migrations/v39.js +59 -0
  260. package/dist/db/migrations/v40.d.ts +3 -0
  261. package/dist/db/migrations/v40.js +74 -0
  262. package/dist/db/migrations/v41.d.ts +3 -0
  263. package/dist/db/migrations/v41.js +43 -0
  264. package/dist/db/migrations/v42.d.ts +3 -0
  265. package/dist/db/migrations/v42.js +41 -0
  266. package/dist/db/migrations/v43.d.ts +3 -0
  267. package/dist/db/migrations/v43.js +67 -0
  268. package/dist/db/migrations/v44.d.ts +3 -0
  269. package/dist/db/migrations/v44.js +28 -0
  270. package/dist/db/migrations/v45.d.ts +3 -0
  271. package/dist/db/migrations/v45.js +30 -0
  272. package/dist/db/migrations/v46.d.ts +3 -0
  273. package/dist/db/migrations/v46.js +25 -0
  274. package/dist/db/migrations/v47.d.ts +3 -0
  275. package/dist/db/migrations/v47.js +17 -0
  276. package/dist/db/migrations/v48.d.ts +3 -0
  277. package/dist/db/migrations/v48.js +10 -0
  278. package/dist/db/migrations/v49.d.ts +3 -0
  279. package/dist/db/migrations/v49.js +31 -0
  280. package/dist/db/migrations/v50.d.ts +3 -0
  281. package/dist/db/migrations/v50.js +67 -0
  282. package/dist/db/migrations/v51.d.ts +3 -0
  283. package/dist/db/migrations/v51.js +14 -0
  284. package/dist/db/migrations/v52.d.ts +3 -0
  285. package/dist/db/migrations/v52.js +7 -0
  286. package/dist/db/open.d.ts +23 -0
  287. package/dist/db/open.js +146 -0
  288. package/dist/db/sqlite.d.ts +21 -0
  289. package/dist/db/sqlite.js +8 -0
  290. package/dist/db/tables.d.ts +7 -0
  291. package/dist/db/tables.js +38 -0
  292. package/dist/db.d.ts +6 -46
  293. package/dist/db.js +5 -3049
  294. package/dist/decisions.d.ts +4 -1
  295. package/dist/decisions.js +9 -7
  296. package/dist/dedupe.js +3 -2
  297. package/dist/delivery-recorder.js +4 -1
  298. package/dist/doctor.js +3 -3
  299. package/dist/embedding-provider.d.ts +1 -1
  300. package/dist/embedding-provider.js +4 -3
  301. package/dist/embeddings.d.ts +9 -52
  302. package/dist/embeddings.js +43 -297
  303. package/dist/env.d.ts +75 -0
  304. package/dist/env.js +119 -0
  305. package/dist/eval-suite.js +1 -1
  306. package/dist/eval.js +2 -2
  307. package/dist/extract.js +1 -1
  308. package/dist/gated-write.js +3 -1
  309. package/dist/goals.d.ts +3 -1
  310. package/dist/goals.js +18 -0
  311. package/dist/graph/read.d.ts +73 -0
  312. package/dist/graph/read.js +325 -0
  313. package/dist/graph/rows.d.ts +45 -0
  314. package/dist/graph/rows.js +51 -0
  315. package/dist/graph/types.d.ts +83 -0
  316. package/dist/graph/types.js +11 -0
  317. package/dist/graph/write.d.ts +93 -0
  318. package/dist/{graph.js → graph/write.js} +6 -384
  319. package/dist/graph-extract.js +2 -1
  320. package/dist/graph-recall.d.ts +1 -1
  321. package/dist/graph-recall.js +2 -2
  322. package/dist/graph-stream.js +1 -1
  323. package/dist/graph-view.d.ts +1 -1
  324. package/dist/graph-view.js +1 -1
  325. package/dist/half-life-migration.d.ts +1 -1
  326. package/dist/half-life-migration.js +2 -1
  327. package/dist/hooks/codex-session.d.ts +8 -0
  328. package/dist/hooks/codex-session.js +76 -0
  329. package/dist/hooks/codex-wrapper.d.ts +55 -0
  330. package/dist/hooks/codex-wrapper.js +288 -0
  331. package/dist/hooks/json-hooks.d.ts +63 -0
  332. package/dist/hooks/json-hooks.js +356 -0
  333. package/dist/hooks/opencode.d.ts +50 -0
  334. package/dist/hooks/opencode.js +202 -0
  335. package/dist/hooks/shared.d.ts +54 -0
  336. package/dist/hooks/shared.js +77 -0
  337. package/dist/http-retry.d.ts +2 -0
  338. package/dist/http-retry.js +4 -3
  339. package/dist/http-util.d.ts +3 -0
  340. package/dist/http-util.js +10 -0
  341. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  342. package/dist/importers/core.js +141 -0
  343. package/dist/importers/markdown-parse.d.ts +41 -0
  344. package/dist/importers/markdown-parse.js +132 -0
  345. package/dist/importers/markdown.d.ts +3 -0
  346. package/dist/importers/markdown.js +92 -0
  347. package/dist/importers/sources.d.ts +7 -0
  348. package/dist/importers/sources.js +229 -0
  349. package/dist/importers/vault.d.ts +11 -0
  350. package/dist/importers/vault.js +352 -0
  351. package/dist/incidents.d.ts +3 -0
  352. package/dist/incidents.js +7 -5
  353. package/dist/index.d.ts +25 -6
  354. package/dist/index.js +23 -6
  355. package/dist/invalidation.js +2 -1
  356. package/dist/judgment.js +2 -1
  357. package/dist/keyset.d.ts +13 -0
  358. package/dist/keyset.js +8 -0
  359. package/dist/local-embedding.d.ts +13 -0
  360. package/dist/local-embedding.js +165 -0
  361. package/dist/log.d.ts +7 -0
  362. package/dist/log.js +19 -1
  363. package/dist/mcp/admin-tools.d.ts +8 -0
  364. package/dist/mcp/admin-tools.js +116 -0
  365. package/dist/mcp/format.d.ts +27 -0
  366. package/dist/mcp/format.js +135 -0
  367. package/dist/mcp/memory-tools.d.ts +5 -0
  368. package/dist/mcp/memory-tools.js +83 -0
  369. package/dist/mcp/protocol.d.ts +83 -0
  370. package/dist/mcp/protocol.js +55 -0
  371. package/dist/mcp/recall-tools.d.ts +6 -0
  372. package/dist/mcp/recall-tools.js +320 -0
  373. package/dist/mcp/request.d.ts +10 -0
  374. package/dist/mcp/request.js +163 -0
  375. package/dist/mcp/server.d.ts +4 -75
  376. package/dist/mcp/server.js +7 -1190
  377. package/dist/mcp/session-state.d.ts +11 -0
  378. package/dist/mcp/session-state.js +28 -0
  379. package/dist/mcp/stdio.d.ts +8 -0
  380. package/dist/mcp/stdio.js +79 -0
  381. package/dist/mcp/tools.d.ts +11 -0
  382. package/dist/mcp/tools.js +247 -0
  383. package/dist/memory.d.ts +3 -0
  384. package/dist/memory.js +27 -1
  385. package/dist/multihop.d.ts +1 -1
  386. package/dist/multihop.js +2 -1
  387. package/dist/owner-validation.js +2 -1
  388. package/dist/physics-state.js +10 -7
  389. package/dist/policies.d.ts +3 -0
  390. package/dist/policies.js +8 -6
  391. package/dist/postinstall.js +3 -2
  392. package/dist/predictions/planning-fallacy.d.ts +100 -0
  393. package/dist/predictions/planning-fallacy.js +190 -0
  394. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  395. package/dist/predictions/store.js +434 -0
  396. package/dist/processes.d.ts +3 -0
  397. package/dist/processes.js +7 -5
  398. package/dist/project-briefs.d.ts +3 -0
  399. package/dist/project-briefs.js +7 -5
  400. package/dist/project-identity.js +3 -2
  401. package/dist/project-merge.js +3 -1
  402. package/dist/quarantine.d.ts +2 -1
  403. package/dist/quarantine.js +8 -5
  404. package/dist/raw-archive.js +1 -1
  405. package/dist/recall-history.js +3 -2
  406. package/dist/recall-pipeline.d.ts +2 -2
  407. package/dist/recall-pipeline.js +16 -8
  408. package/dist/recall-scope.js +1 -1
  409. package/dist/recall-trace.d.ts +1 -1
  410. package/dist/refine-llm.js +2 -1
  411. package/dist/reject-flow.js +6 -1
  412. package/dist/rerankers/clef.js +6 -5
  413. package/dist/rerankers/jev.d.ts +1 -1
  414. package/dist/rerankers/jev.js +4 -4
  415. package/dist/rerankers/llm.d.ts +4 -2
  416. package/dist/rerankers/llm.js +58 -38
  417. package/dist/rerankers/types.d.ts +1 -1
  418. package/dist/salience.js +1 -1
  419. package/dist/scheduler.d.ts +1 -0
  420. package/dist/scheduler.js +26 -4
  421. package/dist/scope.js +4 -3
  422. package/dist/search/as-of.d.ts +10 -0
  423. package/dist/search/as-of.js +22 -0
  424. package/dist/search/bm25-search.d.ts +14 -0
  425. package/dist/search/bm25-search.js +43 -0
  426. package/dist/search/bm25.d.ts +15 -0
  427. package/dist/search/bm25.js +54 -0
  428. package/dist/search/boosts.d.ts +54 -0
  429. package/dist/search/boosts.js +94 -0
  430. package/dist/search/breakdown.d.ts +7 -0
  431. package/dist/search/breakdown.js +20 -0
  432. package/dist/search/explain.d.ts +25 -0
  433. package/dist/search/explain.js +31 -0
  434. package/dist/search/finalize.d.ts +8 -0
  435. package/dist/search/finalize.js +52 -0
  436. package/dist/search/fusion.d.ts +27 -0
  437. package/dist/search/fusion.js +42 -0
  438. package/dist/search/hybrid-score.d.ts +20 -0
  439. package/dist/search/hybrid-score.js +73 -0
  440. package/dist/search/hybrid.d.ts +46 -0
  441. package/dist/search/hybrid.js +64 -0
  442. package/dist/search/physics-search.d.ts +29 -0
  443. package/dist/search/physics-search.js +162 -0
  444. package/dist/search/rerank.d.ts +10 -0
  445. package/dist/search/rerank.js +72 -0
  446. package/dist/search/temporal.d.ts +15 -0
  447. package/dist/search/temporal.js +45 -0
  448. package/dist/search/types.d.ts +91 -0
  449. package/dist/search/types.js +2 -0
  450. package/dist/search/vector.d.ts +30 -0
  451. package/dist/search/vector.js +71 -0
  452. package/dist/secret-detect.d.ts +2 -0
  453. package/dist/secret-detect.js +2 -1
  454. package/dist/server/auth.d.ts +52 -0
  455. package/dist/server/auth.js +221 -0
  456. package/dist/server/client-ip.d.ts +25 -0
  457. package/dist/server/client-ip.js +92 -0
  458. package/dist/server/cursor.d.ts +23 -0
  459. package/dist/server/cursor.js +58 -0
  460. package/dist/server/lifecycle.d.ts +7 -0
  461. package/dist/server/lifecycle.js +29 -0
  462. package/dist/server/mcp-http.d.ts +5 -0
  463. package/dist/server/mcp-http.js +199 -0
  464. package/dist/server/request.d.ts +33 -0
  465. package/dist/server/request.js +103 -0
  466. package/dist/server/routes/admin.d.ts +9 -0
  467. package/dist/server/routes/admin.js +158 -0
  468. package/dist/server/routes/customer-notes.d.ts +7 -0
  469. package/dist/server/routes/customer-notes.js +112 -0
  470. package/dist/server/routes/decisions.d.ts +7 -0
  471. package/dist/server/routes/decisions.js +133 -0
  472. package/dist/server/routes/incidents.d.ts +7 -0
  473. package/dist/server/routes/incidents.js +126 -0
  474. package/dist/server/routes/memories.d.ts +10 -0
  475. package/dist/server/routes/memories.js +179 -0
  476. package/dist/server/routes/policies.d.ts +8 -0
  477. package/dist/server/routes/policies.js +151 -0
  478. package/dist/server/routes/predictions.d.ts +7 -0
  479. package/dist/server/routes/predictions.js +164 -0
  480. package/dist/server/routes/processes.d.ts +7 -0
  481. package/dist/server/routes/processes.js +161 -0
  482. package/dist/server/routes/project-briefs.d.ts +8 -0
  483. package/dist/server/routes/project-briefs.js +136 -0
  484. package/dist/server/routes/recall.d.ts +8 -0
  485. package/dist/server/routes/recall.js +340 -0
  486. package/dist/server/routes/skills.d.ts +8 -0
  487. package/dist/server/routes/skills.js +150 -0
  488. package/dist/server/types.d.ts +56 -0
  489. package/dist/server/types.js +2 -0
  490. package/dist/server/validation.d.ts +14 -0
  491. package/dist/server/validation.js +91 -0
  492. package/dist/server.d.ts +7 -61
  493. package/dist/server.js +69 -2362
  494. package/dist/session-digest.d.ts +1 -1
  495. package/dist/session-digest.js +9 -2
  496. package/dist/shared.d.ts +3 -1
  497. package/dist/shared.js +26 -22
  498. package/dist/skills.d.ts +3 -0
  499. package/dist/skills.js +7 -5
  500. package/dist/stdin.js +2 -2
  501. package/dist/store/audit-event.d.ts +19 -0
  502. package/dist/store/audit-event.js +33 -0
  503. package/dist/store/candidates.d.ts +42 -0
  504. package/dist/store/candidates.js +152 -0
  505. package/dist/store/conflicts.d.ts +44 -0
  506. package/dist/store/conflicts.js +444 -0
  507. package/dist/store/delete-and-batch.d.ts +63 -0
  508. package/dist/store/delete-and-batch.js +310 -0
  509. package/dist/store/entry-reads.d.ts +92 -0
  510. package/dist/store/entry-reads.js +255 -0
  511. package/dist/store/entry-row.d.ts +67 -0
  512. package/dist/store/entry-row.js +208 -0
  513. package/dist/store/entry-writes.d.ts +46 -0
  514. package/dist/store/entry-writes.js +148 -0
  515. package/dist/store/handoffs.d.ts +26 -0
  516. package/dist/store/handoffs.js +184 -0
  517. package/dist/store/index-and-stats.d.ts +52 -0
  518. package/dist/store/index-and-stats.js +214 -0
  519. package/dist/store/markdown.d.ts +10 -0
  520. package/dist/store/markdown.js +108 -0
  521. package/dist/store/mirrors.d.ts +49 -0
  522. package/dist/store/mirrors.js +312 -0
  523. package/dist/store/open.d.ts +15 -0
  524. package/dist/store/open.js +223 -0
  525. package/dist/store/rows.d.ts +178 -0
  526. package/dist/store/rows.js +158 -0
  527. package/dist/store/search-rows.d.ts +86 -0
  528. package/dist/store/search-rows.js +254 -0
  529. package/dist/store/sessions.d.ts +83 -0
  530. package/dist/store/sessions.js +272 -0
  531. package/dist/store/summaries.d.ts +94 -0
  532. package/dist/store/summaries.js +377 -0
  533. package/dist/store/tenant-lookup.d.ts +12 -0
  534. package/dist/store/tenant-lookup.js +16 -0
  535. package/dist/store-cards.js +2 -1
  536. package/dist/summary-dirty.d.ts +4 -0
  537. package/dist/summary-dirty.js +32 -0
  538. package/dist/support-bundle.js +4 -3
  539. package/dist/tenant.js +2 -2
  540. package/dist/tokenize.d.ts +2 -0
  541. package/dist/tokenize.js +16 -0
  542. package/dist/transcript-tail.d.ts +7 -0
  543. package/dist/transcript-tail.js +48 -0
  544. package/dist/vector-store.d.ts +27 -0
  545. package/dist/vector-store.js +210 -0
  546. package/dist/version.d.ts +2 -2
  547. package/dist/version.js +2 -2
  548. package/dist/working-memory.js +1 -1
  549. package/dist/yaml.js +36 -11
  550. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  551. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  552. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  553. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  554. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  555. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  556. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  557. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  558. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  559. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  560. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  562. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  563. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  564. package/dist-ui/index.html +3 -25
  565. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  566. package/extensions/openclaw-plugin/package.json +1 -1
  567. package/openclaw.plugin.json +1 -1
  568. package/package.json +1 -1
  569. package/dist/capture.d.ts +0 -155
  570. package/dist/capture.js +0 -1295
  571. package/dist/consolidate.d.ts +0 -58
  572. package/dist/consolidate.js +0 -1124
  573. package/dist/graph.d.ts +0 -245
  574. package/dist/hooks.d.ts +0 -208
  575. package/dist/hooks.js +0 -1076
  576. package/dist/importers.js +0 -900
  577. package/dist/predictions.js +0 -620
  578. package/dist/search.d.ts +0 -320
  579. package/dist/search.js +0 -970
  580. package/dist/store.d.ts +0 -776
  581. package/dist/store.js +0 -3473
  582. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  583. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  584. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  585. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,67 @@
1
+ import type { MemoryEntry } from '../memory.js';
2
+ import { openHippoDb } from '../db.js';
3
+ /**
4
+ * `bypassRejectionGuard` (AT1, plan §3): ONLY `batchWriteAndDelete`'s call
5
+ * site passes `true`. Consolidation merges are DETERMINISTIC CONCATENATION
6
+ * (mergeContents, consolidate.ts:736-751), not LLM paraphrase — the bypass
7
+ * is safe because the producer (consolidate.ts's merge pass) now checks the
8
+ * merged content's rejection digest against the tenant's tombstones BEFORE
9
+ * ever assembling a batch to write, and skips the merge entirely on a hit.
10
+ * Every other caller (writeEntryDbOnly, bootstrapLegacyStore, rebuildIndex)
11
+ * leaves this false and the guard runs live.
12
+ *
13
+ * AT1 P1 fix (codex, batch-transaction rejection race): the producer check
14
+ * above runs on a DIFFERENT connection BEFORE this transaction opens — a
15
+ * `hippo reject X` that commits in that window is invisible to it. This
16
+ * parameter's contract is UNCHANGED (still the sole bypass, still trusted
17
+ * by the producer-side check for the common case); what changed is that
18
+ * `batchWriteAndDelete` no longer trusts it BLINDLY. It now runs its own
19
+ * in-transaction point-probe (same connection, same digest lookup this
20
+ * function's guard would have done) immediately before each upsert and
21
+ * skips — rather than writes — any entry whose content matches a tombstone
22
+ * that landed after the producer's check. See batchWriteAndDelete for the
23
+ * skip logic.
24
+ */
25
+ export declare function upsertEntryRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry, bypassRejectionGuard?: boolean): void;
26
+ export declare function syncFtsRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry, isNewRow?: boolean): void;
27
+ export declare function deleteFtsRow(db: ReturnType<typeof openHippoDb>, id: string): void;
28
+ /**
29
+ * Write a memory entry to SQLite and refresh compatibility mirrors.
30
+ *
31
+ * `opts.actor` defaults to 'cli' so unauthenticated direct-CLI callers still
32
+ * get the right audit attribution. The HTTP server (A1) and api.* layer pass
33
+ * the resolved actor (`api_key:<key_id>` / `localhost:cli`) so audit events
34
+ * land with one row per write, no double-emit.
35
+ *
36
+ * `opts.afterWrite` is invoked inside the same SAVEPOINT as the memories
37
+ * INSERT (mirrors archiveRawMemory's shape in raw-archive.ts). On callback
38
+ * throw, the SAVEPOINT rolls back — the memory row never lands, and the
39
+ * filesystem mirrors / audit emit never run. Used by E1.3+ connectors to
40
+ * stamp idempotency rows atomically with the memory write.
41
+ */
42
+ /**
43
+ * Stamp origin_project from the store's own location when the entry has
44
+ * never been stamped (v39 memory scope isolation). The store dir is
45
+ * `<project>/.hippo`, so its parent resolves to the owning project; the
46
+ * home/global store resolves to '' (user-global). Callers that know a better
47
+ * origin (shareMemory, syncGlobalToLocal) set entry.origin_project before
48
+ * writing and this is a no-op. Returns a stamped copy; never mutates.
49
+ *
50
+ * NULL is deliberately PRESERVED, not re-stamped: null means "legacy row the
51
+ * v39 migration found no evidence for" and is deny-by-default in ambient
52
+ * context. A writeback (e.g. markRetrieved on a crossProject-included row)
53
+ * must not launder it into an injectable origin - the migration is the only
54
+ * evidence-based NULL converter (codex gating round 2 P1).
55
+ */
56
+ export declare function stampOriginProject(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
57
+ /**
58
+ * Import-time variant for a mirror with no origin field (an explicit null stays null): used only where evidence exists
59
+ * for rows that predate the origin column - the legacy-markdown bootstrap and
60
+ * rebuildIndex import, which are the markdown-store equivalent of the v39 SQL
61
+ * backfill. Same evidence order as the migration: the provenance source
62
+ * (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination
63
+ * store's location, so a shared row imported into the global store keeps its
64
+ * owning project instead of becoming user-global (codex gating round 3 P1).
65
+ */
66
+ export declare function stampOriginProjectForImport(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
67
+ //# sourceMappingURL=entry-row.d.ts.map
@@ -0,0 +1,208 @@
1
+ import * as path from 'path';
2
+ import { isFtsAvailable } from '../db.js';
3
+ import { deriveOriginProject, originFromSource } from '../project-identity.js';
4
+ import { checkRejectionGuard } from '../rejection.js';
5
+ import { log } from '../log.js';
6
+ /**
7
+ * `bypassRejectionGuard` (AT1, plan §3): ONLY `batchWriteAndDelete`'s call
8
+ * site passes `true`. Consolidation merges are DETERMINISTIC CONCATENATION
9
+ * (mergeContents, consolidate.ts:736-751), not LLM paraphrase — the bypass
10
+ * is safe because the producer (consolidate.ts's merge pass) now checks the
11
+ * merged content's rejection digest against the tenant's tombstones BEFORE
12
+ * ever assembling a batch to write, and skips the merge entirely on a hit.
13
+ * Every other caller (writeEntryDbOnly, bootstrapLegacyStore, rebuildIndex)
14
+ * leaves this false and the guard runs live.
15
+ *
16
+ * AT1 P1 fix (codex, batch-transaction rejection race): the producer check
17
+ * above runs on a DIFFERENT connection BEFORE this transaction opens — a
18
+ * `hippo reject X` that commits in that window is invisible to it. This
19
+ * parameter's contract is UNCHANGED (still the sole bypass, still trusted
20
+ * by the producer-side check for the common case); what changed is that
21
+ * `batchWriteAndDelete` no longer trusts it BLINDLY. It now runs its own
22
+ * in-transaction point-probe (same connection, same digest lookup this
23
+ * function's guard would have done) immediately before each upsert and
24
+ * skips — rather than writes — any entry whose content matches a tombstone
25
+ * that landed after the producer's check. See batchWriteAndDelete for the
26
+ * skip logic.
27
+ */
28
+ export function upsertEntryRow(db, entry, bypassRejectionGuard = false) {
29
+ if (!bypassRejectionGuard) {
30
+ checkRejectionGuard(db, entry.tenantId ?? 'default', entry.id, entry.content);
31
+ }
32
+ const isNewRow = db.prepare(`SELECT 1 FROM memories WHERE id = ?`).get(entry.id) === undefined;
33
+ db.prepare(UPSERT_MEMORY_SQL).run(...memoryRowValues(entry));
34
+ syncFtsRow(db, entry, isNewRow);
35
+ }
36
+ const UPSERT_MEMORY_SQL = `
37
+ INSERT INTO memories(
38
+ id, created, last_retrieved, retrieval_count, strength, half_life_days, layer,
39
+ tags_json, emotional_valence, schema_fit, source, outcome_score,
40
+ outcome_positive, outcome_negative,
41
+ conflicts_with_json, pinned, confidence, content,
42
+ parents_json, starred,
43
+ trace_outcome, source_session_id,
44
+ valid_from, superseded_by,
45
+ extracted_from,
46
+ dag_level, dag_parent_id,
47
+ kind, scope, owner, artifact_ref,
48
+ tenant_id, origin_project,
49
+ descendant_count, earliest_at, latest_at,
50
+ dag_level_3_built_at,
51
+ updated_at
52
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))
53
+ ON CONFLICT(id) DO UPDATE SET
54
+ created = excluded.created,
55
+ last_retrieved = excluded.last_retrieved,
56
+ retrieval_count = excluded.retrieval_count,
57
+ strength = excluded.strength,
58
+ half_life_days = excluded.half_life_days,
59
+ layer = excluded.layer,
60
+ tags_json = excluded.tags_json,
61
+ emotional_valence = excluded.emotional_valence,
62
+ schema_fit = excluded.schema_fit,
63
+ source = excluded.source,
64
+ outcome_score = excluded.outcome_score,
65
+ outcome_positive = excluded.outcome_positive,
66
+ outcome_negative = excluded.outcome_negative,
67
+ conflicts_with_json = excluded.conflicts_with_json,
68
+ pinned = excluded.pinned,
69
+ confidence = excluded.confidence,
70
+ content = excluded.content,
71
+ parents_json = excluded.parents_json,
72
+ starred = excluded.starred,
73
+ trace_outcome = excluded.trace_outcome,
74
+ source_session_id = excluded.source_session_id,
75
+ valid_from = excluded.valid_from,
76
+ superseded_by = excluded.superseded_by,
77
+ extracted_from = excluded.extracted_from,
78
+ dag_level = excluded.dag_level,
79
+ dag_parent_id = excluded.dag_parent_id,
80
+ kind = excluded.kind,
81
+ scope = excluded.scope,
82
+ owner = excluded.owner,
83
+ artifact_ref = excluded.artifact_ref,
84
+ tenant_id = excluded.tenant_id,
85
+ origin_project = excluded.origin_project,
86
+ descendant_count = excluded.descendant_count,
87
+ earliest_at = excluded.earliest_at,
88
+ latest_at = excluded.latest_at,
89
+ dag_level_3_built_at = excluded.dag_level_3_built_at,
90
+ updated_at = datetime('now')
91
+ `;
92
+ /** Bind values for UPSERT_MEMORY_SQL, in its column order. */
93
+ function memoryRowValues(entry) {
94
+ return [
95
+ entry.id,
96
+ entry.created,
97
+ entry.last_retrieved,
98
+ entry.retrieval_count,
99
+ entry.strength,
100
+ entry.half_life_days,
101
+ entry.layer,
102
+ JSON.stringify(entry.tags ?? []),
103
+ entry.emotional_valence,
104
+ entry.schema_fit,
105
+ entry.source,
106
+ entry.outcome_score,
107
+ entry.outcome_positive ?? 0,
108
+ entry.outcome_negative ?? 0,
109
+ JSON.stringify(entry.conflicts_with ?? []),
110
+ entry.pinned ? 1 : 0,
111
+ entry.confidence,
112
+ entry.content,
113
+ JSON.stringify(entry.parents ?? []),
114
+ entry.starred ? 1 : 0,
115
+ entry.trace_outcome ?? null,
116
+ entry.source_session_id ?? null,
117
+ entry.valid_from ?? entry.created,
118
+ entry.superseded_by ?? null,
119
+ entry.extracted_from ?? null,
120
+ entry.dag_level ?? 0,
121
+ entry.dag_parent_id ?? null,
122
+ entry.kind ?? 'distilled',
123
+ entry.scope ?? null,
124
+ entry.owner ?? null,
125
+ entry.artifact_ref ?? null,
126
+ entry.tenantId ?? 'default',
127
+ entry.origin_project ?? null,
128
+ entry.descendant_count ?? 0,
129
+ entry.earliest_at ?? null,
130
+ entry.latest_at ?? null,
131
+ entry.dag_level_3_built_at ?? null,
132
+ ];
133
+ }
134
+ export function syncFtsRow(db, entry, isNewRow = false) {
135
+ if (!isFtsAvailable(db))
136
+ return;
137
+ try {
138
+ if (!isNewRow)
139
+ db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(entry.id);
140
+ db.prepare(`INSERT INTO memories_fts(id, content, tags) VALUES (?, ?, ?)`).run(entry.id, entry.content, entry.tags.join(' '));
141
+ }
142
+ catch (err) {
143
+ // The memories table stays authoritative; a stale FTS row only costs recall quality, so the write goes on.
144
+ log.warnThenDebug('fts-sync', `FTS index update failed for ${entry.id}; keyword recall may miss it: ${err instanceof Error ? err.message : String(err)}`);
145
+ }
146
+ }
147
+ export function deleteFtsRow(db, id) {
148
+ if (!isFtsAvailable(db))
149
+ return;
150
+ try {
151
+ db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
152
+ }
153
+ catch (err) {
154
+ log.warnThenDebug('fts-delete', `FTS index delete failed for ${id}; recall may return a stale hit: ${err instanceof Error ? err.message : String(err)}`);
155
+ }
156
+ }
157
+ /**
158
+ * Write a memory entry to SQLite and refresh compatibility mirrors.
159
+ *
160
+ * `opts.actor` defaults to 'cli' so unauthenticated direct-CLI callers still
161
+ * get the right audit attribution. The HTTP server (A1) and api.* layer pass
162
+ * the resolved actor (`api_key:<key_id>` / `localhost:cli`) so audit events
163
+ * land with one row per write, no double-emit.
164
+ *
165
+ * `opts.afterWrite` is invoked inside the same SAVEPOINT as the memories
166
+ * INSERT (mirrors archiveRawMemory's shape in raw-archive.ts). On callback
167
+ * throw, the SAVEPOINT rolls back — the memory row never lands, and the
168
+ * filesystem mirrors / audit emit never run. Used by E1.3+ connectors to
169
+ * stamp idempotency rows atomically with the memory write.
170
+ */
171
+ /**
172
+ * Stamp origin_project from the store's own location when the entry has
173
+ * never been stamped (v39 memory scope isolation). The store dir is
174
+ * `<project>/.hippo`, so its parent resolves to the owning project; the
175
+ * home/global store resolves to '' (user-global). Callers that know a better
176
+ * origin (shareMemory, syncGlobalToLocal) set entry.origin_project before
177
+ * writing and this is a no-op. Returns a stamped copy; never mutates.
178
+ *
179
+ * NULL is deliberately PRESERVED, not re-stamped: null means "legacy row the
180
+ * v39 migration found no evidence for" and is deny-by-default in ambient
181
+ * context. A writeback (e.g. markRetrieved on a crossProject-included row)
182
+ * must not launder it into an injectable origin - the migration is the only
183
+ * evidence-based NULL converter (codex gating round 2 P1).
184
+ */
185
+ export function stampOriginProject(hippoRoot, entry) {
186
+ if (entry.origin_project !== undefined)
187
+ return entry;
188
+ return { ...entry, origin_project: deriveOriginProject(path.dirname(hippoRoot)) };
189
+ }
190
+ /**
191
+ * Import-time variant for a mirror with no origin field (an explicit null stays null): used only where evidence exists
192
+ * for rows that predate the origin column - the legacy-markdown bootstrap and
193
+ * rebuildIndex import, which are the markdown-store equivalent of the v39 SQL
194
+ * backfill. Same evidence order as the migration: the provenance source
195
+ * (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination
196
+ * store's location, so a shared row imported into the global store keeps its
197
+ * owning project instead of becoming user-global (codex gating round 3 P1).
198
+ */
199
+ export function stampOriginProjectForImport(hippoRoot, entry) {
200
+ if (entry.origin_project !== undefined)
201
+ return entry;
202
+ const fromSource = originFromSource(entry.source);
203
+ return {
204
+ ...entry,
205
+ origin_project: fromSource ?? deriveOriginProject(path.dirname(hippoRoot)),
206
+ };
207
+ }
208
+ //# sourceMappingURL=entry-row.js.map
@@ -0,0 +1,46 @@
1
+ import { type MemoryEntry } from '../memory.js';
2
+ import { type DatabaseSyncLike } from '../db.js';
3
+ export declare function writeEntry(hippoRoot: string, entry: MemoryEntry, opts?: {
4
+ actor?: string;
5
+ afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
6
+ /** Runs AFTER the DB row commits (RELEASE SAVEPOINT in writeEntryDbOnly) but
7
+ * BEFORE the markdown mirrors are written. Lets a caller perform a post-commit
8
+ * side effect (e.g. mark the graph dirty) that must still happen even if a
9
+ * mirror write then throws. Keep it best-effort — it runs on a committed,
10
+ * idle connection, so opening another handle inside it is safe. */
11
+ afterCommit?: () => void;
12
+ }): void;
13
+ /**
14
+ * DB-only write path. Caller owns the open `db` handle. Runs SAVEPOINT +
15
+ * upsert + afterWrite hook + audit row inside the SAVEPOINT scope. Caller
16
+ * is responsible for opening `db`, optionally wrapping in a larger BEGIN/
17
+ * COMMIT (e.g. supersede's BEGIN IMMEDIATE), closing `db`, AND calling
18
+ * `writeEntryMirrors` after the larger tx commits — mirrors must run
19
+ * post-commit so a rolled-back tx never leaves orphan markdown.
20
+ *
21
+ * Audit-order note: the audit row is emitted INSIDE the SAVEPOINT, so audit
22
+ * commits atomically with the row INSERT. A subsequent mirror failure cannot
23
+ * leave a recorded audit entry without its corresponding DB row. This is a
24
+ * documented hardening over the prior writeEntry-as-monolith ordering.
25
+ */
26
+ export declare function writeEntryDbOnly(db: DatabaseSyncLike, entry: MemoryEntry, opts?: {
27
+ actor?: string;
28
+ afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
29
+ }): void;
30
+ /** Markdown mirror path, invoked AFTER commit (a rolled-back tx must leave no orphan markdown). */
31
+ export declare function writeEntryMirrors(hippoRoot: string, entry: MemoryEntry): void;
32
+ /** The caller passes the eval-only recall-boost ablation switch, so the store never reads experiment config itself. */
33
+ export interface StrengthenOptions {
34
+ readonly tenantId?: string;
35
+ readonly recallBoostAblated: boolean;
36
+ }
37
+ /** Strengthen what a read returned: update only the four retrieval columns on the live row, never a stale copy.
38
+ * Best effort: a failure logs and never fails the read. Returns the ids found in this store. */
39
+ export declare function strengthenRetrieved(hippoRoot: string, ids: readonly string[], opts: StrengthenOptions): Set<string>;
40
+ /** strengthenRetrieved on the caller's handle, inside the caller's transaction. Throws; the caller decides. */
41
+ export declare function strengthenRetrievedOn(db: DatabaseSyncLike, ids: readonly string[], opts: StrengthenOptions): Set<string>;
42
+ /** Rewrites a live row's tags and its full-text row on the caller's transaction, with no audit row. */
43
+ export declare function setEntryTagsInTx(db: DatabaseSyncLike, entry: MemoryEntry): void;
44
+ /** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and marks its summary parent dirty. */
45
+ export declare function deleteEntryRowInTx(db: DatabaseSyncLike, entry: MemoryEntry, actor: string): void;
46
+ //# sourceMappingURL=entry-writes.d.ts.map
@@ -0,0 +1,148 @@
1
+ import { markRetrieved } from '../memory.js';
2
+ import { closeHippoDb, openHippoDb } from '../db.js';
3
+ import { RejectedValueError } from '../rejection.js';
4
+ import { markSummaryDirtyInTx } from '../summary-dirty.js';
5
+ import { log } from '../log.js';
6
+ import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
7
+ import { auditRejectionRefusal, audit } from './audit-event.js';
8
+ import { stampOriginProject, upsertEntryRow, syncFtsRow, deleteFtsRow } from './entry-row.js';
9
+ import { mirrorBestEffort, writeMarkdownMirror } from './mirrors.js';
10
+ import { openStore } from './open.js';
11
+ export function writeEntry(hippoRoot, entry, opts) {
12
+ const db = openStore(hippoRoot);
13
+ try {
14
+ const stamped = stampOriginProject(hippoRoot, entry);
15
+ writeEntryDbOnly(db, stamped, opts);
16
+ opts?.afterCommit?.();
17
+ writeEntryMirrors(hippoRoot, stamped);
18
+ }
19
+ catch (error) {
20
+ // AT1 (plan §3): writeEntryDbOnly's own SAVEPOINT has already unwound by
21
+ // the time this catch runs, so the refusal audit lands post-rollback in
22
+ // a fresh implicit transaction — then rethrow so the caller sees the
23
+ // refusal.
24
+ if (error instanceof RejectedValueError) {
25
+ auditRejectionRefusal(db, error, opts?.actor ?? 'cli');
26
+ }
27
+ throw error;
28
+ }
29
+ finally {
30
+ closeHippoDb(db);
31
+ }
32
+ }
33
+ /**
34
+ * DB-only write path. Caller owns the open `db` handle. Runs SAVEPOINT +
35
+ * upsert + afterWrite hook + audit row inside the SAVEPOINT scope. Caller
36
+ * is responsible for opening `db`, optionally wrapping in a larger BEGIN/
37
+ * COMMIT (e.g. supersede's BEGIN IMMEDIATE), closing `db`, AND calling
38
+ * `writeEntryMirrors` after the larger tx commits — mirrors must run
39
+ * post-commit so a rolled-back tx never leaves orphan markdown.
40
+ *
41
+ * Audit-order note: the audit row is emitted INSIDE the SAVEPOINT, so audit
42
+ * commits atomically with the row INSERT. A subsequent mirror failure cannot
43
+ * leave a recorded audit entry without its corresponding DB row. This is a
44
+ * documented hardening over the prior writeEntry-as-monolith ordering.
45
+ */
46
+ export function writeEntryDbOnly(db, entry, opts) {
47
+ // SAVEPOINT (not BEGIN) so this nests safely inside any outer transaction
48
+ // a caller might hold (e.g. supersede's BEGIN IMMEDIATE). SQLite refuses
49
+ // BEGIN within a transaction; SAVEPOINT is the only way to scope rollback
50
+ // without disturbing outers.
51
+ db.exec('SAVEPOINT write_entry');
52
+ try {
53
+ upsertEntryRow(db, entry);
54
+ if (opts?.afterWrite) {
55
+ opts.afterWrite(db, entry.id);
56
+ }
57
+ audit(db, 'remember', entry.id, {
58
+ kind: entry.kind ?? 'distilled',
59
+ scope: entry.scope ?? null,
60
+ }, opts?.actor ?? 'cli', entry.tenantId);
61
+ // v0.30 / E2 — DAG live-coupling: child write under a level-2 summary
62
+ // marks the parent dirty for E3 sleep-cycle rebuild. Early-exit on
63
+ // null dag_parent_id (vast majority of writes); cost is one null check
64
+ // on the hot path.
65
+ if (entry.dag_parent_id) {
66
+ markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenantId, opts?.actor ?? 'cli');
67
+ }
68
+ db.exec('RELEASE SAVEPOINT write_entry');
69
+ }
70
+ catch (e) {
71
+ try {
72
+ db.exec('ROLLBACK TO SAVEPOINT write_entry');
73
+ db.exec('RELEASE SAVEPOINT write_entry');
74
+ }
75
+ catch {
76
+ // Ignore rollback failures — the throw below is what matters.
77
+ }
78
+ throw e;
79
+ }
80
+ }
81
+ /** Markdown mirror path, invoked AFTER commit (a rolled-back tx must leave no orphan markdown). */
82
+ export function writeEntryMirrors(hippoRoot, entry) {
83
+ mirrorBestEffort(`${entry.id}.md`, () => writeMarkdownMirror(hippoRoot, entry));
84
+ }
85
+ /** Strengthen what a read returned: update only the four retrieval columns on the live row, never a stale copy.
86
+ * Best effort: a failure logs and never fails the read. Returns the ids found in this store. */
87
+ export function strengthenRetrieved(hippoRoot, ids, opts) {
88
+ const found = new Set();
89
+ if (ids.length === 0 || opts.recallBoostAblated)
90
+ return found;
91
+ let db;
92
+ try {
93
+ db = openHippoDb(hippoRoot);
94
+ db.exec('BEGIN IMMEDIATE');
95
+ for (const id of strengthenRetrievedOn(db, ids, opts))
96
+ found.add(id);
97
+ db.exec('COMMIT');
98
+ }
99
+ catch (error) {
100
+ try {
101
+ db?.exec('ROLLBACK');
102
+ }
103
+ catch { /* already rolled back; keep the original error */ }
104
+ log.warn(`retrieval stats not saved (${error instanceof Error ? error.message : String(error)})`);
105
+ found.clear();
106
+ }
107
+ finally {
108
+ if (db)
109
+ closeHippoDb(db);
110
+ }
111
+ return found;
112
+ }
113
+ /** strengthenRetrieved on the caller's handle, inside the caller's transaction. Throws; the caller decides. */
114
+ export function strengthenRetrievedOn(db, ids, opts) {
115
+ const found = new Set();
116
+ if (ids.length === 0 || opts.recallBoostAblated)
117
+ return found;
118
+ const { tenantId } = opts;
119
+ const tenantClause = tenantId !== undefined ? ' AND tenant_id = ?' : '';
120
+ const select = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id = ?${tenantClause}`);
121
+ const live = [];
122
+ for (const id of ids) {
123
+ // SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
124
+ const row = (tenantId !== undefined ? select.get(id, tenantId) : select.get(id));
125
+ if (row)
126
+ live.push(rowToEntry(row));
127
+ }
128
+ const update = db.prepare('UPDATE memories SET retrieval_count = ?, last_retrieved = ?, half_life_days = ?, strength = ? WHERE id = ?');
129
+ for (const e of markRetrieved(live)) {
130
+ update.run(e.retrieval_count, e.last_retrieved, e.half_life_days, e.strength, e.id);
131
+ found.add(e.id);
132
+ }
133
+ return found;
134
+ }
135
+ /** Rewrites a live row's tags and its full-text row on the caller's transaction, with no audit row. */
136
+ export function setEntryTagsInTx(db, entry) {
137
+ db.prepare(`UPDATE memories SET tags_json = ?, updated_at = datetime('now') WHERE id = ? AND tenant_id = ?`)
138
+ .run(JSON.stringify(entry.tags), entry.id, entry.tenantId);
139
+ syncFtsRow(db, entry);
140
+ }
141
+ /** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and marks its summary parent dirty. */
142
+ export function deleteEntryRowInTx(db, entry, actor) {
143
+ db.prepare('DELETE FROM memories WHERE id = ? AND tenant_id = ?').run(entry.id, entry.tenantId);
144
+ deleteFtsRow(db, entry.id);
145
+ if (entry.dag_parent_id)
146
+ markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenantId, actor);
147
+ }
148
+ //# sourceMappingURL=entry-writes.js.map
@@ -0,0 +1,26 @@
1
+ import { type SessionHandoff, type HandoffOutcome, type HandoffEvidence } from '../handoff.js';
2
+ import type { TaskSnapshot } from './rows.js';
3
+ /** Column list shared by every session_handoffs SELECT; store-cards.ts reuses it for the card handoff lookup. */
4
+ export declare const HANDOFF_COLUMNS = "id, session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, created_at, constraints_json, evidence_json, outcome, target_runtime, card_id";
5
+ /**
6
+ * Save a session handoff record. Returns the persisted handoff.
7
+ */
8
+ export declare function saveSessionHandoff(hippoRoot: string, tenantId: string, handoff: Omit<SessionHandoff, 'updatedAt'>): SessionHandoff;
9
+ /** Load the most recent handoff, optionally filtered by session ID. */
10
+ export declare function loadLatestHandoff(hippoRoot: string, tenantId: string, sessionId?: string, opts?: {
11
+ unfinishedOnly?: boolean;
12
+ maxAgeMs?: number;
13
+ scopeFilter?: 'default-deny';
14
+ excludeSessionId?: string;
15
+ }): SessionHandoff | null;
16
+ /**
17
+ * Load a specific handoff by its row ID.
18
+ */
19
+ export declare function loadHandoffById(hippoRoot: string, tenantId: string, id: number): SessionHandoff | null;
20
+ /** Stamp the outcome on a session's newest handoff, only if it has none yet. Returns rows changed. */
21
+ export declare function stampHandoffOutcome(hippoRoot: string, tenantId: string, sessionId: string, outcome: HandoffOutcome): number;
22
+ /** Auto-write a handoff at session-end (DF1 T3) from the session's active snapshot, else from `derived`, its transcript state.
23
+ * @param evidence best-effort git state; outcome comes from the newest session_complete event.
24
+ * @returns null when neither source is the session's, a newer handoff covers the snapshot, or the session's latest handoff was not read off its transcript. */
25
+ export declare function writeSessionEndHandoff(hippoRoot: string, tenantId: string, sessionId: string, evidence: HandoffEvidence | null, derived?: Pick<TaskSnapshot, 'task' | 'summary' | 'next_step'> | null): SessionHandoff | null;
26
+ //# sourceMappingURL=handoffs.d.ts.map