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,30 @@
1
+ import { type DormantMemory, type ListDormantOpts } from '../dormant.js';
2
+ import { type MemoryEntry } from '../memory.js';
3
+ import type { Context } from './types.js';
4
+ /**
5
+ * A tenant's dormant memories (src/dormant.ts): what sleep moved out of
6
+ * active memory instead of deleting, when `dormant.enabled` is on. Newest
7
+ * first; `opts.query` keeps rows containing every term (case-insensitive).
8
+ */
9
+ export declare function listDormant(ctx: Context, opts?: ListDormantOpts): DormantMemory[];
10
+ /**
11
+ * Bring a dormant memory back into active memory. It returns as if just
12
+ * recalled: `last_retrieved` is now, so it gets a full half-life before it
13
+ * can fade again. Every other field is the snapshot taken when it went
14
+ * dormant.
15
+ *
16
+ * Throws when the tenant has no dormant memory with that id (another
17
+ * tenant's id reads the same way), when a live memory already holds the id,
18
+ * and RejectedValueError when the value has been rejected since. On any
19
+ * throw the dormant copy stays where it is.
20
+ */
21
+ export declare function restoreDormant(ctx: Context, id: string): MemoryEntry;
22
+ /**
23
+ * Permanently delete a dormant memory: the explicit "forget it for good"
24
+ * that dormant storage leaves to the user. Throws when the tenant has no
25
+ * dormant memory with that id.
26
+ */
27
+ export declare function forgetDormant(ctx: Context, id: string): void;
28
+ /** Whether the tenant holds a dormant memory with this id (for "not found" hints). */
29
+ export declare function isDormant(ctx: Context, id: string): boolean;
30
+ //# sourceMappingURL=dormant.d.ts.map
@@ -0,0 +1,140 @@
1
+ // Dormant memories: list, restore, forget and check.
2
+ import { openHippoDb, closeHippoDb } from '../db.js';
3
+ import { ConflictError, NotFoundError } from '../api-errors.js';
4
+ import { auditRejectionRefusal } from '../store/audit-event.js';
5
+ import { stampOriginProject } from '../store/entry-row.js';
6
+ import { writeEntryDbOnly, writeEntryMirrors } from '../store/entry-writes.js';
7
+ import { updateStatsUnlessBusy } from '../store/index-and-stats.js';
8
+ import { RejectedValueError } from '../rejection.js';
9
+ import { listDormantRows, readDormantSnapshot, deleteDormantRow, hasDormantRow, } from '../dormant.js';
10
+ import { createMemory, calculateStrength } from '../memory.js';
11
+ import { appendAuditEvent, reportAuditWriteFailure } from '../audit.js';
12
+ import { loadConfig } from '../config.js';
13
+ /**
14
+ * A tenant's dormant memories (src/dormant.ts): what sleep moved out of
15
+ * active memory instead of deleting, when `dormant.enabled` is on. Newest
16
+ * first; `opts.query` keeps rows containing every term (case-insensitive).
17
+ */
18
+ export function listDormant(ctx, opts = {}) {
19
+ const db = openHippoDb(ctx.hippoRoot);
20
+ try {
21
+ return listDormantRows(db, ctx.tenantId, opts);
22
+ }
23
+ finally {
24
+ closeHippoDb(db);
25
+ }
26
+ }
27
+ /**
28
+ * Bring a dormant memory back into active memory. It returns as if just
29
+ * recalled: `last_retrieved` is now, so it gets a full half-life before it
30
+ * can fade again. Every other field is the snapshot taken when it went
31
+ * dormant.
32
+ *
33
+ * Throws when the tenant has no dormant memory with that id (another
34
+ * tenant's id reads the same way), when a live memory already holds the id,
35
+ * and RejectedValueError when the value has been rejected since. On any
36
+ * throw the dormant copy stays where it is.
37
+ */
38
+ export function restoreDormant(ctx, id) {
39
+ const db = openHippoDb(ctx.hippoRoot);
40
+ try {
41
+ let restored;
42
+ db.exec('BEGIN IMMEDIATE');
43
+ try {
44
+ const dormant = readDormantSnapshot(db, ctx.tenantId, id);
45
+ if (!dormant) {
46
+ throw new NotFoundError(`dormant memory not found: ${id}`);
47
+ }
48
+ if (db.prepare(`SELECT 1 FROM memories WHERE id = ?`).get(id) !== undefined) {
49
+ throw new ConflictError(`memory ${id} is already active; forget it before restoring its dormant copy`);
50
+ }
51
+ const now = new Date();
52
+ // Dormant rows are long-lived, so a snapshot can predate a field added
53
+ // later: createMemory supplies a default for anything it lacks, then
54
+ // the snapshot overrides every field it does carry, content included.
55
+ // (The placeholder only satisfies createMemory's minimum length, so a
56
+ // legacy row shorter than 3 chars can still be restored.)
57
+ const revived = {
58
+ ...createMemory('dormant snapshot defaults', { baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays }),
59
+ ...dormant.entry,
60
+ last_retrieved: now.toISOString(),
61
+ };
62
+ restored = stampOriginProject(ctx.hippoRoot, { ...revived, strength: calculateStrength(revived, now) });
63
+ writeEntryDbOnly(db, restored, { actor: ctx.actor.subject });
64
+ deleteDormantRow(db, ctx.tenantId, id);
65
+ // A restore is a labelled "forgot it, then needed it" event: the
66
+ // signal a learned lifecycle (ROADMAP LC3) trains on. Same transaction
67
+ // as the restore, so the label exists exactly when the restore does.
68
+ appendAuditEvent(db, {
69
+ tenantId: ctx.tenantId,
70
+ actor: ctx.actor.subject,
71
+ op: 'dormant_restore',
72
+ targetId: id,
73
+ metadata: {
74
+ reason: dormant.reason,
75
+ strengthAtDormancy: dormant.strength,
76
+ dormantAt: dormant.dormantAt,
77
+ daysDormant: Math.max(0, (now.getTime() - Date.parse(dormant.dormantAt)) / (24 * 60 * 60 * 1000)),
78
+ },
79
+ });
80
+ db.exec('COMMIT');
81
+ }
82
+ catch (err) {
83
+ try {
84
+ db.exec('ROLLBACK');
85
+ }
86
+ catch { /* already rolled back */ }
87
+ if (err instanceof RejectedValueError) {
88
+ auditRejectionRefusal(db, err, ctx.actor.subject);
89
+ }
90
+ throw err;
91
+ }
92
+ writeEntryMirrors(ctx.hippoRoot, restored);
93
+ return restored;
94
+ }
95
+ finally {
96
+ closeHippoDb(db);
97
+ }
98
+ }
99
+ /**
100
+ * Permanently delete a dormant memory: the explicit "forget it for good"
101
+ * that dormant storage leaves to the user. Throws when the tenant has no
102
+ * dormant memory with that id.
103
+ */
104
+ export function forgetDormant(ctx, id) {
105
+ const db = openHippoDb(ctx.hippoRoot);
106
+ try {
107
+ if (!deleteDormantRow(db, ctx.tenantId, id)) {
108
+ throw new NotFoundError(`dormant memory not found: ${id}`);
109
+ }
110
+ try {
111
+ appendAuditEvent(db, {
112
+ tenantId: ctx.tenantId,
113
+ actor: ctx.actor.subject,
114
+ op: 'forget',
115
+ targetId: id,
116
+ metadata: { dormant: true },
117
+ });
118
+ }
119
+ catch (error) {
120
+ // Best-effort, like every other forget audit row: the delete stands.
121
+ reportAuditWriteFailure('forget', String(error), id);
122
+ }
123
+ }
124
+ finally {
125
+ closeHippoDb(db);
126
+ }
127
+ // Counted like every other permanent removal (forget, archiveRaw).
128
+ updateStatsUnlessBusy(ctx.hippoRoot, { forgotten: 1 }, `removed ${id}`);
129
+ }
130
+ /** Whether the tenant holds a dormant memory with this id (for "not found" hints). */
131
+ export function isDormant(ctx, id) {
132
+ const db = openHippoDb(ctx.hippoRoot);
133
+ try {
134
+ return hasDormantRow(db, ctx.tenantId, id);
135
+ }
136
+ finally {
137
+ closeHippoDb(db);
138
+ }
139
+ }
140
+ //# sourceMappingURL=dormant.js.map
@@ -0,0 +1,84 @@
1
+ import type { Context } from './types.js';
2
+ export interface DrillDownOpts {
3
+ /** Cap on number of children returned. Default 50. */
4
+ limit?: number;
5
+ /**
6
+ * Optional token budget. When set, children are appended in chronological
7
+ * order (created ASC) until adding the next child would exceed the budget.
8
+ * Token cost = the child's printed line under `cost`, else ceil(content.length / 4).
9
+ *
10
+ * For depth > 1, the budget is GLOBAL cumulative (NOT per-level).
11
+ */
12
+ budget?: number;
13
+ /**
14
+ * v0.30 / E5 — walk N levels down (default 1 = direct children only).
15
+ * Higher values include children of children, etc. Internal hard cap 10
16
+ * to prevent pathological depth walks. BFS uses visited Set for dedup
17
+ * (defensive against shared-child data anomalies; DAG is acyclic by
18
+ * construction).
19
+ */
20
+ depth?: number;
21
+ cost?: DrillDownCost;
22
+ }
23
+ export interface DrillDownSummary {
24
+ id: string;
25
+ content: string;
26
+ descendantCount: number;
27
+ earliestAt: string | null;
28
+ latestAt: string | null;
29
+ }
30
+ export interface DrillDownChild {
31
+ id: string;
32
+ content: string;
33
+ layer: string;
34
+ dagLevel: number;
35
+ created: string;
36
+ }
37
+ export interface DrillDownCost {
38
+ child: (c: DrillDownChild) => number;
39
+ fixed: (summary: DrillDownSummary, widest: number) => number;
40
+ }
41
+ export interface DrillDownResult {
42
+ summary: DrillDownSummary;
43
+ children: DrillDownChild[];
44
+ totalChildren: number;
45
+ truncated: boolean;
46
+ }
47
+ /**
48
+ * v1.6.4 discriminated failure shape. Two reasons distinguishable:
49
+ * - `not_found`: covers genuinely-missing, wrong-tenant, AND
50
+ * scope-blocked (codex round 3 P1 — distinguishing scope_blocked
51
+ * from not_found on non-HTTP surfaces leaked private-row existence
52
+ * to no-scope callers, even though the HTTP route already collapsed
53
+ * them. Collapse at the API layer.)
54
+ * - `not_drillable`: id is a leaf row (level 0/1). Caller-actionable.
55
+ *
56
+ * If a future drillDown gains a `scope` opt for explicit-scope callers,
57
+ * a `scope_blocked` failure could be safely re-introduced ONLY for that
58
+ * code path (caller already proved authorization by passing a scope).
59
+ */
60
+ export interface DrillDownFailure {
61
+ failure: 'not_found' | 'not_drillable';
62
+ }
63
+ export type DrillDownOutcome = DrillDownResult | DrillDownFailure;
64
+ /**
65
+ * Walk one step down the DAG from a level-2 (or higher) summary to its direct
66
+ * children. Companion to `recall(... summarizeOverflow: true)` — when recall
67
+ * surfaces a summary with `substitutedFor: [...]`, the caller drills into the
68
+ * summary id to recover the original detail.
69
+ *
70
+ * Tenant scope: only summaries owned by `ctx.tenantId` are reachable. The same
71
+ * scope filter that recall applies is enforced on the children — a level-2
72
+ * summary in `slack:public:CGEN` cannot leak `slack:private:*` children even
73
+ * if the underlying DAG accidentally linked across scopes.
74
+ *
75
+ * Returns a discriminated `DrillDownOutcome`: `DrillDownResult` on success,
76
+ * or `{failure: '...'}` for `not_found` (covers genuinely-missing AND wrong-
77
+ * tenant, intentionally indistinguishable), `not_drillable` (id is a leaf
78
+ * row), or `scope_blocked` (caller has no scope grant for the row's scope).
79
+ *
80
+ * Pre-v1.6.4 returned null for all four cases. JS callers migrate via
81
+ * `'failure' in result` checks; HTTP route maps `not_drillable` to 422.
82
+ */
83
+ export declare function drillDown(ctx: Context, summaryId: string, opts?: DrillDownOpts): DrillDownOutcome;
84
+ //# sourceMappingURL=drill-down.d.ts.map
@@ -0,0 +1,123 @@
1
+ // DAG drill-down from a summary to its children.
2
+ import { readEntry, loadChildrenOf } from '../store/entry-reads.js';
3
+ import { estimateTokens } from '../token-ledger.js';
4
+ import { passesScopeFilterForRecall } from '../recall-scope.js';
5
+ /**
6
+ * Walk one step down the DAG from a level-2 (or higher) summary to its direct
7
+ * children. Companion to `recall(... summarizeOverflow: true)` — when recall
8
+ * surfaces a summary with `substitutedFor: [...]`, the caller drills into the
9
+ * summary id to recover the original detail.
10
+ *
11
+ * Tenant scope: only summaries owned by `ctx.tenantId` are reachable. The same
12
+ * scope filter that recall applies is enforced on the children — a level-2
13
+ * summary in `slack:public:CGEN` cannot leak `slack:private:*` children even
14
+ * if the underlying DAG accidentally linked across scopes.
15
+ *
16
+ * Returns a discriminated `DrillDownOutcome`: `DrillDownResult` on success,
17
+ * or `{failure: '...'}` for `not_found` (covers genuinely-missing AND wrong-
18
+ * tenant, intentionally indistinguishable), `not_drillable` (id is a leaf
19
+ * row), or `scope_blocked` (caller has no scope grant for the row's scope).
20
+ *
21
+ * Pre-v1.6.4 returned null for all four cases. JS callers migrate via
22
+ * `'failure' in result` checks; HTTP route maps `not_drillable` to 422.
23
+ */
24
+ export function drillDown(ctx, summaryId, opts = {}) {
25
+ const limit = opts.limit ?? 50;
26
+ // v0.30 / E5: depth defaults 1 (backward compat); hard cap 10 levels
27
+ // prevents pathological deep trees. CLI/HTTP/MCP reject invalid values.
28
+ const depth = Math.max(1, Math.min(Math.trunc(opts.depth ?? 1), 10));
29
+ const summary = readEntry(ctx.hippoRoot, summaryId, ctx.tenantId);
30
+ // No unscoped cross-tenant probe here — readEntry's null return covers
31
+ // both "doesn't exist" and "exists in another tenant" by design.
32
+ // Distinguishing them via an unscoped lookup would leak existence to
33
+ // unauthorised tenants. The two cases collapse into not_found.
34
+ if (!summary)
35
+ return { failure: 'not_found' };
36
+ if ((summary.dag_level ?? 0) < 2)
37
+ return { failure: 'not_drillable' };
38
+ if (!passesScopeFilterForRecall(summary.scope ?? null, undefined)) {
39
+ // codex round 3 P1: collapse to not_found. A distinguishable
40
+ // "scope_blocked" tells a no-scope caller "this row exists, just
41
+ // not for you" — same existence-leak the HTTP 404 collapse was
42
+ // already preventing. Match the HTTP behaviour at the API level.
43
+ return { failure: 'not_found' };
44
+ }
45
+ // v0.30 / E5: BFS walk levels 1..depth with visited-Set dedup. Defensive
46
+ // against shared-child data anomalies (dag_parent_id has no uniqueness
47
+ // constraint, so a misconfigured tree could double-emit at depth > 1).
48
+ // Each level uses loadChildrenOf which is tenant-scoped via ctx.tenantId.
49
+ const collected = [];
50
+ const visited = new Set([summaryId]);
51
+ let frontier = [summaryId];
52
+ // independent-review MED #4 fold: track level-0 direct-children count
53
+ // separately so the descendantCount fallback (for legacy summaries with
54
+ // null descendant_count) reflects DIRECT children, not BFS-collected total.
55
+ let level0DirectCount = 0;
56
+ for (let level = 0; level < depth; level++) {
57
+ const nextFrontier = [];
58
+ for (const parentId of frontier) {
59
+ const kids = loadChildrenOf(ctx.hippoRoot, parentId, ctx.tenantId);
60
+ const eligibleKids = kids.filter((c) => passesScopeFilterForRecall(c.scope ?? null, undefined));
61
+ for (const k of eligibleKids) {
62
+ if (visited.has(k.id))
63
+ continue;
64
+ visited.add(k.id);
65
+ collected.push(k);
66
+ nextFrontier.push(k.id);
67
+ if (level === 0)
68
+ level0DirectCount++;
69
+ }
70
+ }
71
+ if (nextFrontier.length === 0)
72
+ break;
73
+ frontier = nextFrontier;
74
+ }
75
+ const summaryOut = {
76
+ id: summary.id,
77
+ content: summary.content,
78
+ // v0.30 / E5: the STORED direct-child count; the legacy fallback counts
79
+ // level-0 children, never the BFS-depth-N total (independent-review MED #4).
80
+ descendantCount: summary.descendant_count ?? level0DirectCount,
81
+ earliestAt: summary.earliest_at ?? null,
82
+ latestAt: summary.latest_at ?? null,
83
+ };
84
+ const all = collected.map((c) => ({
85
+ id: c.id,
86
+ content: c.content,
87
+ layer: c.layer,
88
+ dagLevel: c.dag_level ?? 0,
89
+ created: c.created,
90
+ }));
91
+ // Apply global cumulative token budget + limit cap on collected.
92
+ let children = all;
93
+ let truncated = false;
94
+ if (opts.budget !== undefined) {
95
+ const out = [];
96
+ let used = 0;
97
+ const room = opts.budget - (opts.cost?.fixed(summaryOut, all.length) ?? 0);
98
+ for (const c of all) {
99
+ const t = opts.cost ? opts.cost.child(c) : estimateTokens(c.content);
100
+ if (out.length > 0 && used + t > room) {
101
+ truncated = true;
102
+ break;
103
+ }
104
+ out.push(c);
105
+ used += t;
106
+ }
107
+ children = out;
108
+ }
109
+ if (children.length > limit) {
110
+ children = children.slice(0, limit);
111
+ truncated = true;
112
+ }
113
+ return {
114
+ summary: summaryOut,
115
+ children,
116
+ // v0.30 / E5: totalChildren = BFS-collected count (depth-aware). For
117
+ // depth=1 this equals the eligible direct-children count (backward
118
+ // compat). For depth>1 it is the cumulative count across levels.
119
+ totalChildren: collected.length,
120
+ truncated,
121
+ };
122
+ }
123
+ //# sourceMappingURL=drill-down.js.map
@@ -0,0 +1,57 @@
1
+ import type { RejectedValueRow } from '../rejection.js';
2
+ import type { Context } from './types.js';
3
+ /**
4
+ * Delete a memory by id. `deleteEntry` threads ctx.actor.subject into its internal
5
+ * audit hook, so exactly one 'forget' event lands with the supplied actor.
6
+ *
7
+ * Tenant scope: deleteEntry looks up the row by id alone, so without an
8
+ * explicit tenant guard a Bearer for tenant A could delete tenant B's row
9
+ * by guessing or leaking the id. Pre-check the row's tenant_id and deny
10
+ * cross-tenant access with a not-found error (no info leak about whether
11
+ * the id exists in another tenant).
12
+ */
13
+ export interface ForgetResult {
14
+ ok: true;
15
+ id: string;
16
+ }
17
+ export declare function forget(ctx: Context, id: string): ForgetResult;
18
+ export interface RejectOpts {
19
+ /** By-id form: reject the CURRENT content of an existing memory. */
20
+ memoryId?: string;
21
+ /** Pre-emptive form: reject a value not currently stored (or already gone). */
22
+ value?: string;
23
+ /** Required — the tombstone stores no content; reason is its only identity. */
24
+ reason: string;
25
+ }
26
+ export interface RejectResult {
27
+ digest: string;
28
+ removedIds: string[];
29
+ }
30
+ /**
31
+ * Reject a value: tombstone its normalized digest so a matching write is
32
+ * refused everywhere (remember/capture/import/sync) until `unreject`. Two
33
+ * forms — pass exactly one:
34
+ * - `memoryId`: reject the CURRENT content of an existing memory. Removes
35
+ * that row and every other live row in the tenant whose normalized
36
+ * digest matches (not just the id passed).
37
+ * - `value`: pre-emptive form — tombstone content that may not currently
38
+ * be stored (or is already gone). Zero removals.
39
+ *
40
+ * `reason` is required (the tombstone stores no content; reason is its
41
+ * only human-readable identity). Throws if the memory id is not found in
42
+ * `ctx.tenantId`, or if both/neither of `memoryId`/`value` are given.
43
+ */
44
+ export declare function reject(ctx: Context, opts: RejectOpts): RejectResult;
45
+ /**
46
+ * Delete a tombstone by exact digest or unambiguous prefix, restoring the
47
+ * value's writability — the only v1 escape hatch (no per-write force flag).
48
+ * Throws if `digestOrPrefix` matches no tombstone, is blank, or matches
49
+ * more than one (use a longer prefix).
50
+ */
51
+ export declare function unreject(ctx: Context, digestOrPrefix: string): {
52
+ ok: boolean;
53
+ digest: string;
54
+ };
55
+ /** List every rejected-value tombstone for `ctx.tenantId`, newest first. */
56
+ export declare function listRejections(ctx: Context): RejectedValueRow[];
57
+ //# sourceMappingURL=forget.d.ts.map
@@ -0,0 +1,87 @@
1
+ // Forget a memory, and reject or unreject a value so it cannot be stored again.
2
+ import { openHippoDb, closeHippoDb } from '../db.js';
3
+ import { BadRequestError, NotFoundError } from '../api-errors.js';
4
+ import { deleteEntry } from '../store/delete-and-batch.js';
5
+ import { updateStatsUnlessBusy } from '../store/index-and-stats.js';
6
+ import { rejectValue, unrejectValue, listRejectionsForTenant } from '../reject-flow.js';
7
+ import { selectMemoryTenant } from '../store/tenant-lookup.js';
8
+ export function forget(ctx, id) {
9
+ const db = openHippoDb(ctx.hippoRoot);
10
+ try {
11
+ if (selectMemoryTenant(db, id) !== ctx.tenantId) {
12
+ throw new NotFoundError(`memory not found: ${id}`);
13
+ }
14
+ }
15
+ finally {
16
+ closeHippoDb(db);
17
+ }
18
+ const removed = deleteEntry(ctx.hippoRoot, id, { actor: ctx.actor.subject });
19
+ if (!removed) {
20
+ throw new NotFoundError(`memory not found: ${id}`);
21
+ }
22
+ // Counted here, not in the CLI: both callers of this function (cmdForget and
23
+ // the HTTP route) are the two paths of one user command, so neither can miss
24
+ // it. api.remember cannot take the same move; see the server route.
25
+ updateStatsUnlessBusy(ctx.hippoRoot, { forgotten: 1 }, `removed ${id}`);
26
+ return { ok: true, id };
27
+ }
28
+ /**
29
+ * Reject a value: tombstone its normalized digest so a matching write is
30
+ * refused everywhere (remember/capture/import/sync) until `unreject`. Two
31
+ * forms — pass exactly one:
32
+ * - `memoryId`: reject the CURRENT content of an existing memory. Removes
33
+ * that row and every other live row in the tenant whose normalized
34
+ * digest matches (not just the id passed).
35
+ * - `value`: pre-emptive form — tombstone content that may not currently
36
+ * be stored (or is already gone). Zero removals.
37
+ *
38
+ * `reason` is required (the tombstone stores no content; reason is its
39
+ * only human-readable identity). Throws if the memory id is not found in
40
+ * `ctx.tenantId`, or if both/neither of `memoryId`/`value` are given.
41
+ */
42
+ export function reject(ctx, opts) {
43
+ if (opts.memoryId !== undefined) {
44
+ // Tenant scope, same not-found-shaped denial as forget/promote above:
45
+ // rejectValue itself also tenant-checks the id, but pre-checking here
46
+ // keeps the error message consistent with the rest of this module.
47
+ const db = openHippoDb(ctx.hippoRoot);
48
+ try {
49
+ if (selectMemoryTenant(db, opts.memoryId) !== ctx.tenantId) {
50
+ throw new NotFoundError(`memory not found: ${opts.memoryId}`);
51
+ }
52
+ }
53
+ finally {
54
+ closeHippoDb(db);
55
+ }
56
+ }
57
+ const result = rejectValue({
58
+ hippoRoot: ctx.hippoRoot,
59
+ tenantId: ctx.tenantId,
60
+ actor: ctx.actor.subject,
61
+ reason: opts.reason,
62
+ memoryId: opts.memoryId,
63
+ value: opts.value,
64
+ });
65
+ return { digest: result.digest, removedIds: result.removedIds };
66
+ }
67
+ /**
68
+ * Delete a tombstone by exact digest or unambiguous prefix, restoring the
69
+ * value's writability — the only v1 escape hatch (no per-write force flag).
70
+ * Throws if `digestOrPrefix` matches no tombstone, is blank, or matches
71
+ * more than one (use a longer prefix).
72
+ */
73
+ export function unreject(ctx, digestOrPrefix) {
74
+ const outcome = unrejectValue(ctx.hippoRoot, ctx.tenantId, digestOrPrefix, ctx.actor.subject);
75
+ if (outcome.status === 'not_found') {
76
+ throw new NotFoundError(`no rejected value matches: ${digestOrPrefix}`);
77
+ }
78
+ if (outcome.status === 'ambiguous') {
79
+ throw new BadRequestError(`"${digestOrPrefix}" matches ${outcome.candidates.length} tombstones; use a longer prefix`);
80
+ }
81
+ return { ok: true, digest: outcome.digest };
82
+ }
83
+ /** List every rejected-value tombstone for `ctx.tenantId`, newest first. */
84
+ export function listRejections(ctx) {
85
+ return listRejectionsForTenant(ctx.hippoRoot, ctx.tenantId);
86
+ }
87
+ //# sourceMappingURL=forget.js.map
@@ -0,0 +1,18 @@
1
+ import { type CompleteGoalOpts, type Goal, type PushGoalOpts } from '../goals.js';
2
+ import type { Context } from './types.js';
3
+ /** What a new goal carries; its tenant is always the caller's. */
4
+ export type GoalPushOpts = Omit<PushGoalOpts, 'tenantId'>;
5
+ /** Push a goal onto `sessionId`'s stack in the caller's tenant. */
6
+ export declare function goalPush(ctx: Context, opts: GoalPushOpts): Goal;
7
+ /** The caller's goals for `sessionId`: active ones, or every status when `all` is set. */
8
+ export declare function goalList(ctx: Context, opts: {
9
+ sessionId: string;
10
+ all: boolean;
11
+ }): Goal[];
12
+ /** Complete a goal by id; a no-op for an unknown or already completed goal. Host admin only. */
13
+ export declare function goalComplete(ctx: Context, goalId: string, opts: CompleteGoalOpts): void;
14
+ /** Suspend an active goal by id. Host admin only. */
15
+ export declare function goalSuspend(ctx: Context, goalId: string): void;
16
+ /** Resume a suspended goal by id, suspending the oldest active one past the depth cap. Host admin only. */
17
+ export declare function goalResume(ctx: Context, goalId: string): void;
18
+ //# sourceMappingURL=goals.d.ts.map
@@ -0,0 +1,33 @@
1
+ // The per-session goal stack that recall boosts: push, list, complete, suspend and resume.
2
+ import { ForbiddenError } from '../api-errors.js';
3
+ import { completeGoal, getActiveGoals, getSessionGoals, pushGoal, resumeGoal, suspendGoal, } from '../goals.js';
4
+ /** Push a goal onto `sessionId`'s stack in the caller's tenant. */
5
+ export function goalPush(ctx, opts) {
6
+ return pushGoal(ctx.hippoRoot, { ...opts, tenantId: ctx.tenantId });
7
+ }
8
+ /** The caller's goals for `sessionId`: active ones, or every status when `all` is set. */
9
+ export function goalList(ctx, opts) {
10
+ const scope = { sessionId: opts.sessionId, tenantId: ctx.tenantId };
11
+ return opts.all ? getSessionGoals(ctx.hippoRoot, scope) : getActiveGoals(ctx.hippoRoot, scope);
12
+ }
13
+ /** Complete a goal by id; a no-op for an unknown or already completed goal. Host admin only. */
14
+ export function goalComplete(ctx, goalId, opts) {
15
+ requireHostAdmin(ctx);
16
+ completeGoal(ctx.hippoRoot, goalId, opts);
17
+ }
18
+ /** Suspend an active goal by id. Host admin only. */
19
+ export function goalSuspend(ctx, goalId) {
20
+ requireHostAdmin(ctx);
21
+ suspendGoal(ctx.hippoRoot, goalId);
22
+ }
23
+ /** Resume a suspended goal by id, suspending the oldest active one past the depth cap. Host admin only. */
24
+ export function goalResume(ctx, goalId) {
25
+ requireHostAdmin(ctx);
26
+ resumeGoal(ctx.hippoRoot, goalId);
27
+ }
28
+ // Goal ids are not tenant-scoped in the store, so acting on one by id is a cross-tenant power.
29
+ function requireHostAdmin(ctx) {
30
+ if (!ctx.actor.hostAdmin)
31
+ throw new ForbiddenError('Only the host admin can change a goal by id');
32
+ }
33
+ //# sourceMappingURL=goals.js.map
@@ -0,0 +1,31 @@
1
+ import type { Context } from './types.js';
2
+ /** How a surface writes what it learns. */
3
+ export interface LearnProfile {
4
+ readonly tags: readonly string[];
5
+ readonly source: string;
6
+ /** Also invalidate what a migration subject supersedes, score schema fit, path-tag, count and embed each row. */
7
+ readonly full: boolean;
8
+ }
9
+ export declare const CLI_LEARN: LearnProfile;
10
+ export declare const MCP_LEARN: LearnProfile;
11
+ export interface LearnOpts {
12
+ repoPath: string;
13
+ days: number;
14
+ profile: LearnProfile;
15
+ }
16
+ export interface LearnResult {
17
+ /** `no-commits`: an empty git log; `no-lessons`: a log with no lesson-shaped subject. */
18
+ status: 'not-a-repo' | 'no-commits' | 'no-lessons' | 'scanned';
19
+ added: number;
20
+ skipped: number;
21
+ rejected: number;
22
+ lowInfo: number;
23
+ /** Each lesson whose migration target weakened at least one memory, in scan order. */
24
+ invalidations: Array<{
25
+ from: string;
26
+ count: number;
27
+ }>;
28
+ }
29
+ /** Learn from `repoPath`'s last `days` of commits into the caller's tenant. Host admin only. */
30
+ export declare function learn(ctx: Context, opts: LearnOpts): LearnResult;
31
+ //# sourceMappingURL=learn.d.ts.map