hippo-memory 1.60.0 → 1.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/README.md +29 -54
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.d.ts +1 -1
  4. package/dist/agent-memories/apply.js +4 -1
  5. package/dist/agent-memories/claude-code.d.ts +3 -1
  6. package/dist/agent-memories/claude-code.js +54 -10
  7. package/dist/agent-memories/codex.js +1 -1
  8. package/dist/agent-memories/gemini.js +1 -1
  9. package/dist/agent-memories/legacy.js +1 -1
  10. package/dist/agent-memories/source.js +1 -1
  11. package/dist/agent-memories/sync.d.ts +3 -3
  12. package/dist/agent-memories/sync.js +22 -9
  13. package/dist/agent-memories/types.d.ts +0 -2
  14. package/dist/ambient-store.d.ts +14 -0
  15. package/dist/ambient-store.js +90 -0
  16. package/dist/ambient.d.ts +23 -0
  17. package/dist/ambient.js +72 -50
  18. package/dist/api/assemble.d.ts +93 -0
  19. package/dist/api/assemble.js +153 -0
  20. package/dist/api/audit.d.ts +17 -0
  21. package/dist/api/audit.js +23 -0
  22. package/dist/api/auth.d.ts +79 -0
  23. package/dist/api/auth.js +178 -0
  24. package/dist/api/context-select.d.ts +49 -0
  25. package/dist/api/context-select.js +344 -0
  26. package/dist/api/context-types.d.ts +105 -0
  27. package/dist/api/context-types.js +3 -0
  28. package/dist/api/context.d.ts +31 -0
  29. package/dist/api/context.js +378 -0
  30. package/dist/api/dormant.d.ts +30 -0
  31. package/dist/api/dormant.js +140 -0
  32. package/dist/api/drill-down.d.ts +84 -0
  33. package/dist/api/drill-down.js +126 -0
  34. package/dist/api/forget.d.ts +57 -0
  35. package/dist/api/forget.js +87 -0
  36. package/dist/api/goals.d.ts +18 -0
  37. package/dist/api/goals.js +33 -0
  38. package/dist/api/learn.d.ts +31 -0
  39. package/dist/api/learn.js +88 -0
  40. package/dist/api/outcome.d.ts +61 -0
  41. package/dist/api/outcome.js +66 -0
  42. package/dist/api/promote.d.ts +54 -0
  43. package/dist/api/promote.js +192 -0
  44. package/dist/api/quarantine.d.ts +24 -0
  45. package/dist/api/quarantine.js +121 -0
  46. package/dist/api/recall-types.d.ts +390 -0
  47. package/dist/api/recall-types.js +3 -0
  48. package/dist/api/recall.d.ts +36 -0
  49. package/dist/api/recall.js +499 -0
  50. package/dist/api/remember.d.ts +35 -0
  51. package/dist/api/remember.js +43 -0
  52. package/dist/api/sleep.d.ts +136 -0
  53. package/dist/api/sleep.js +256 -0
  54. package/dist/api/tokens.d.ts +26 -0
  55. package/dist/api/tokens.js +60 -0
  56. package/dist/api/types.d.ts +56 -0
  57. package/dist/api/types.js +38 -0
  58. package/dist/api.d.ts +20 -1262
  59. package/dist/api.js +25 -2727
  60. package/dist/audit.d.ts +3 -0
  61. package/dist/audit.js +6 -3
  62. package/dist/auth.d.ts +45 -4
  63. package/dist/auth.js +125 -48
  64. package/dist/autolearn.js +2 -2
  65. package/dist/capture/command.d.ts +33 -0
  66. package/dist/capture/command.js +264 -0
  67. package/dist/capture/compact.d.ts +44 -0
  68. package/dist/capture/compact.js +354 -0
  69. package/dist/capture/extract.d.ts +21 -0
  70. package/dist/capture/extract.js +464 -0
  71. package/dist/capture/transcript.d.ts +40 -0
  72. package/dist/capture/transcript.js +193 -0
  73. package/dist/capture-error.js +2 -1
  74. package/dist/churn-git.js +4 -2
  75. package/dist/cli/audit.d.ts +3 -0
  76. package/dist/cli/audit.js +159 -0
  77. package/dist/cli/auth.d.ts +2 -0
  78. package/dist/cli/auth.js +171 -0
  79. package/dist/cli/briefs.d.ts +4 -0
  80. package/dist/cli/briefs.js +453 -0
  81. package/dist/cli/card.d.ts +3 -0
  82. package/dist/cli/card.js +333 -0
  83. package/dist/cli/context.d.ts +15 -0
  84. package/dist/cli/context.js +376 -0
  85. package/dist/cli/continuity.d.ts +6 -0
  86. package/dist/cli/continuity.js +457 -0
  87. package/dist/cli/curate.d.ts +19 -0
  88. package/dist/cli/curate.js +556 -0
  89. package/dist/cli/dag.d.ts +5 -0
  90. package/dist/cli/dag.js +177 -0
  91. package/dist/cli/decisions.d.ts +4 -0
  92. package/dist/cli/decisions.js +528 -0
  93. package/dist/cli/eval.d.ts +5 -0
  94. package/dist/cli/eval.js +213 -0
  95. package/dist/cli/explain.d.ts +4 -0
  96. package/dist/cli/explain.js +156 -0
  97. package/dist/cli/goals.d.ts +2 -0
  98. package/dist/cli/goals.js +196 -0
  99. package/dist/cli/hook-blocks.d.ts +18 -0
  100. package/dist/cli/hook-blocks.js +233 -0
  101. package/dist/cli/init.d.ts +2 -0
  102. package/dist/cli/init.js +305 -0
  103. package/dist/cli/maintenance.d.ts +4 -0
  104. package/dist/cli/maintenance.js +190 -0
  105. package/dist/cli/playbooks.d.ts +4 -0
  106. package/dist/cli/playbooks.js +573 -0
  107. package/dist/cli/projects.js +9 -6
  108. package/dist/cli/recall.d.ts +7 -0
  109. package/dist/cli/recall.js +582 -0
  110. package/dist/cli/remember.d.ts +5 -0
  111. package/dist/cli/remember.js +485 -0
  112. package/dist/cli/serve.d.ts +5 -0
  113. package/dist/cli/serve.js +40 -0
  114. package/dist/cli/session-hooks.d.ts +29 -0
  115. package/dist/cli/session-hooks.js +647 -0
  116. package/dist/cli/setup.d.ts +4 -0
  117. package/dist/cli/setup.js +397 -0
  118. package/dist/cli/shared.d.ts +15 -19
  119. package/dist/cli/shared.js +50 -341
  120. package/dist/cli/slack.d.ts +2 -0
  121. package/dist/cli/slack.js +171 -0
  122. package/dist/cli/status.d.ts +18 -0
  123. package/dist/cli/status.js +409 -0
  124. package/dist/cli/transfer.d.ts +10 -0
  125. package/dist/cli/transfer.js +424 -0
  126. package/dist/cli/usage.d.ts +85 -0
  127. package/dist/cli/usage.js +741 -0
  128. package/dist/cli.d.ts +71 -120
  129. package/dist/cli.js +170 -8469
  130. package/dist/client.js +15 -8
  131. package/dist/compaction-record.d.ts +0 -2
  132. package/dist/compaction-record.js +7 -5
  133. package/dist/connectors/github/backfill.js +94 -87
  134. package/dist/connectors/github/cli-impl.js +4 -3
  135. package/dist/connectors/github/dlq.js +67 -54
  136. package/dist/connectors/github/ingest.js +34 -35
  137. package/dist/connectors/github/tenant-routing.js +3 -2
  138. package/dist/connectors/github/webhook.js +135 -216
  139. package/dist/connectors/slack/dlq.js +49 -61
  140. package/dist/connectors/slack/ingest.js +55 -48
  141. package/dist/connectors/slack/tenant-routing.js +4 -3
  142. package/dist/connectors/slack/webhook.js +72 -74
  143. package/dist/consolidate/conflicts.d.ts +10 -0
  144. package/dist/consolidate/conflicts.js +178 -0
  145. package/dist/consolidate/decay.d.ts +12 -0
  146. package/dist/consolidate/decay.js +145 -0
  147. package/dist/consolidate/llm-passes.d.ts +3 -0
  148. package/dist/consolidate/llm-passes.js +141 -0
  149. package/dist/consolidate/merge.d.ts +7 -0
  150. package/dist/consolidate/merge.js +251 -0
  151. package/dist/consolidate/physics-pass.d.ts +3 -0
  152. package/dist/consolidate/physics-pass.js +60 -0
  153. package/dist/consolidate/run.d.ts +69 -0
  154. package/dist/consolidate/run.js +76 -0
  155. package/dist/consolidate/sleep.d.ts +18 -0
  156. package/dist/consolidate/sleep.js +209 -0
  157. package/dist/consolidate/traces.d.ts +4 -0
  158. package/dist/consolidate/traces.js +178 -0
  159. package/dist/context-auto.js +7 -11
  160. package/dist/context-render.d.ts +1 -1
  161. package/dist/context-render.js +1 -1
  162. package/dist/customer-notes.d.ts +3 -0
  163. package/dist/customer-notes.js +83 -72
  164. package/dist/dag.js +225 -188
  165. package/dist/dashboard-actions.d.ts +20 -0
  166. package/dist/dashboard-actions.js +88 -0
  167. package/dist/dashboard-params.d.ts +45 -0
  168. package/dist/dashboard-params.js +127 -0
  169. package/dist/dashboard-queries.d.ts +15 -0
  170. package/dist/dashboard-queries.js +355 -0
  171. package/dist/dashboard-snapshot.d.ts +138 -0
  172. package/dist/dashboard-snapshot.js +308 -0
  173. package/dist/dashboard-types.d.ts +163 -0
  174. package/dist/dashboard-types.js +3 -0
  175. package/dist/dashboard.d.ts +6 -7
  176. package/dist/dashboard.js +228 -202
  177. package/dist/db/busy.d.ts +5 -0
  178. package/dist/db/busy.js +24 -0
  179. package/dist/db/continuity.d.ts +5 -0
  180. package/dist/db/continuity.js +145 -0
  181. package/dist/db/meta.d.ts +8 -0
  182. package/dist/db/meta.js +35 -0
  183. package/dist/db/migrate.d.ts +9 -0
  184. package/dist/db/migrate.js +138 -0
  185. package/dist/db/migrations/index.d.ts +5 -0
  186. package/dist/db/migrations/index.js +109 -0
  187. package/dist/db/migrations/types.d.ts +14 -0
  188. package/dist/db/migrations/types.js +2 -0
  189. package/dist/db/migrations/v01.d.ts +3 -0
  190. package/dist/db/migrations/v01.js +38 -0
  191. package/dist/db/migrations/v02.d.ts +3 -0
  192. package/dist/db/migrations/v02.js +21 -0
  193. package/dist/db/migrations/v03.d.ts +3 -0
  194. package/dist/db/migrations/v03.js +22 -0
  195. package/dist/db/migrations/v04.d.ts +3 -0
  196. package/dist/db/migrations/v04.js +28 -0
  197. package/dist/db/migrations/v05.d.ts +3 -0
  198. package/dist/db/migrations/v05.js +21 -0
  199. package/dist/db/migrations/v06.d.ts +3 -0
  200. package/dist/db/migrations/v06.js +25 -0
  201. package/dist/db/migrations/v07.d.ts +3 -0
  202. package/dist/db/migrations/v07.js +13 -0
  203. package/dist/db/migrations/v08.d.ts +3 -0
  204. package/dist/db/migrations/v08.js +8 -0
  205. package/dist/db/migrations/v09.d.ts +3 -0
  206. package/dist/db/migrations/v09.js +13 -0
  207. package/dist/db/migrations/v10.d.ts +3 -0
  208. package/dist/db/migrations/v10.js +17 -0
  209. package/dist/db/migrations/v11.d.ts +3 -0
  210. package/dist/db/migrations/v11.js +15 -0
  211. package/dist/db/migrations/v12.d.ts +3 -0
  212. package/dist/db/migrations/v12.js +11 -0
  213. package/dist/db/migrations/v13.d.ts +3 -0
  214. package/dist/db/migrations/v13.js +15 -0
  215. package/dist/db/migrations/v14.d.ts +3 -0
  216. package/dist/db/migrations/v14.js +66 -0
  217. package/dist/db/migrations/v15.d.ts +3 -0
  218. package/dist/db/migrations/v15.js +42 -0
  219. package/dist/db/migrations/v16.d.ts +3 -0
  220. package/dist/db/migrations/v16.js +61 -0
  221. package/dist/db/migrations/v17.d.ts +3 -0
  222. package/dist/db/migrations/v17.js +46 -0
  223. package/dist/db/migrations/v18.d.ts +3 -0
  224. package/dist/db/migrations/v18.js +60 -0
  225. package/dist/db/migrations/v19.d.ts +3 -0
  226. package/dist/db/migrations/v19.js +28 -0
  227. package/dist/db/migrations/v20.d.ts +3 -0
  228. package/dist/db/migrations/v20.js +42 -0
  229. package/dist/db/migrations/v21.d.ts +3 -0
  230. package/dist/db/migrations/v21.js +16 -0
  231. package/dist/db/migrations/v22.d.ts +3 -0
  232. package/dist/db/migrations/v22.js +82 -0
  233. package/dist/db/migrations/v23.d.ts +3 -0
  234. package/dist/db/migrations/v23.js +48 -0
  235. package/dist/db/migrations/v24.d.ts +3 -0
  236. package/dist/db/migrations/v24.js +72 -0
  237. package/dist/db/migrations/v25.d.ts +3 -0
  238. package/dist/db/migrations/v25.js +46 -0
  239. package/dist/db/migrations/v26.d.ts +3 -0
  240. package/dist/db/migrations/v26.js +23 -0
  241. package/dist/db/migrations/v27.d.ts +3 -0
  242. package/dist/db/migrations/v27.js +57 -0
  243. package/dist/db/migrations/v28.d.ts +3 -0
  244. package/dist/db/migrations/v28.js +38 -0
  245. package/dist/db/migrations/v29.d.ts +3 -0
  246. package/dist/db/migrations/v29.js +78 -0
  247. package/dist/db/migrations/v30.d.ts +3 -0
  248. package/dist/db/migrations/v30.js +92 -0
  249. package/dist/db/migrations/v31.d.ts +3 -0
  250. package/dist/db/migrations/v31.js +74 -0
  251. package/dist/db/migrations/v32.d.ts +3 -0
  252. package/dist/db/migrations/v32.js +102 -0
  253. package/dist/db/migrations/v33.d.ts +3 -0
  254. package/dist/db/migrations/v33.js +104 -0
  255. package/dist/db/migrations/v34.d.ts +3 -0
  256. package/dist/db/migrations/v34.js +93 -0
  257. package/dist/db/migrations/v35.d.ts +3 -0
  258. package/dist/db/migrations/v35.js +98 -0
  259. package/dist/db/migrations/v36.d.ts +3 -0
  260. package/dist/db/migrations/v36.js +98 -0
  261. package/dist/db/migrations/v37.d.ts +3 -0
  262. package/dist/db/migrations/v37.js +219 -0
  263. package/dist/db/migrations/v38.d.ts +3 -0
  264. package/dist/db/migrations/v38.js +277 -0
  265. package/dist/db/migrations/v39.d.ts +3 -0
  266. package/dist/db/migrations/v39.js +59 -0
  267. package/dist/db/migrations/v40.d.ts +3 -0
  268. package/dist/db/migrations/v40.js +74 -0
  269. package/dist/db/migrations/v41.d.ts +3 -0
  270. package/dist/db/migrations/v41.js +43 -0
  271. package/dist/db/migrations/v42.d.ts +3 -0
  272. package/dist/db/migrations/v42.js +41 -0
  273. package/dist/db/migrations/v43.d.ts +3 -0
  274. package/dist/db/migrations/v43.js +67 -0
  275. package/dist/db/migrations/v44.d.ts +3 -0
  276. package/dist/db/migrations/v44.js +28 -0
  277. package/dist/db/migrations/v45.d.ts +3 -0
  278. package/dist/db/migrations/v45.js +30 -0
  279. package/dist/db/migrations/v46.d.ts +3 -0
  280. package/dist/db/migrations/v46.js +25 -0
  281. package/dist/db/migrations/v47.d.ts +3 -0
  282. package/dist/db/migrations/v47.js +17 -0
  283. package/dist/db/migrations/v48.d.ts +3 -0
  284. package/dist/db/migrations/v48.js +10 -0
  285. package/dist/db/migrations/v49.d.ts +3 -0
  286. package/dist/db/migrations/v49.js +31 -0
  287. package/dist/db/migrations/v50.d.ts +3 -0
  288. package/dist/db/migrations/v50.js +67 -0
  289. package/dist/db/migrations/v51.d.ts +3 -0
  290. package/dist/db/migrations/v51.js +14 -0
  291. package/dist/db/migrations/v52.d.ts +3 -0
  292. package/dist/db/migrations/v52.js +7 -0
  293. package/dist/db/open.d.ts +23 -0
  294. package/dist/db/open.js +146 -0
  295. package/dist/db/sqlite.d.ts +21 -0
  296. package/dist/db/sqlite.js +8 -0
  297. package/dist/db/tables.d.ts +7 -0
  298. package/dist/db/tables.js +38 -0
  299. package/dist/db.d.ts +6 -46
  300. package/dist/db.js +5 -3049
  301. package/dist/decisions.d.ts +4 -1
  302. package/dist/decisions.js +102 -83
  303. package/dist/dedupe.js +3 -2
  304. package/dist/delivery-recorder.js +4 -1
  305. package/dist/doctor.js +14 -10
  306. package/dist/embedding-provider.d.ts +1 -1
  307. package/dist/embedding-provider.js +4 -3
  308. package/dist/embeddings.d.ts +9 -52
  309. package/dist/embeddings.js +43 -297
  310. package/dist/env.d.ts +75 -0
  311. package/dist/env.js +119 -0
  312. package/dist/eval-suite.js +1 -1
  313. package/dist/eval.js +2 -2
  314. package/dist/extract.js +1 -1
  315. package/dist/gated-write.js +3 -1
  316. package/dist/goals.d.ts +3 -1
  317. package/dist/goals.js +117 -86
  318. package/dist/graph/read.d.ts +73 -0
  319. package/dist/graph/read.js +325 -0
  320. package/dist/graph/rows.d.ts +45 -0
  321. package/dist/graph/rows.js +51 -0
  322. package/dist/graph/types.d.ts +83 -0
  323. package/dist/graph/types.js +11 -0
  324. package/dist/graph/write.d.ts +93 -0
  325. package/dist/{graph.js → graph/write.js} +6 -384
  326. package/dist/graph-extract.js +2 -1
  327. package/dist/graph-recall.d.ts +1 -1
  328. package/dist/graph-recall.js +2 -2
  329. package/dist/graph-stream.js +1 -1
  330. package/dist/graph-view.d.ts +1 -1
  331. package/dist/graph-view.js +1 -1
  332. package/dist/half-life-migration.d.ts +1 -1
  333. package/dist/half-life-migration.js +2 -1
  334. package/dist/hooks/codex-session.d.ts +8 -0
  335. package/dist/hooks/codex-session.js +76 -0
  336. package/dist/hooks/codex-wrapper.d.ts +55 -0
  337. package/dist/hooks/codex-wrapper.js +288 -0
  338. package/dist/hooks/json-hooks.d.ts +63 -0
  339. package/dist/hooks/json-hooks.js +356 -0
  340. package/dist/hooks/opencode.d.ts +50 -0
  341. package/dist/hooks/opencode.js +202 -0
  342. package/dist/hooks/shared.d.ts +54 -0
  343. package/dist/hooks/shared.js +77 -0
  344. package/dist/http-retry.d.ts +2 -0
  345. package/dist/http-retry.js +4 -3
  346. package/dist/http-util.d.ts +3 -0
  347. package/dist/http-util.js +10 -0
  348. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  349. package/dist/importers/core.js +141 -0
  350. package/dist/importers/markdown-parse.d.ts +41 -0
  351. package/dist/importers/markdown-parse.js +132 -0
  352. package/dist/importers/markdown.d.ts +3 -0
  353. package/dist/importers/markdown.js +92 -0
  354. package/dist/importers/sources.d.ts +7 -0
  355. package/dist/importers/sources.js +229 -0
  356. package/dist/importers/vault.d.ts +11 -0
  357. package/dist/importers/vault.js +352 -0
  358. package/dist/incidents.d.ts +3 -0
  359. package/dist/incidents.js +52 -43
  360. package/dist/index.d.ts +25 -6
  361. package/dist/index.js +23 -6
  362. package/dist/invalidation.js +2 -1
  363. package/dist/judgment.js +2 -1
  364. package/dist/keyset.d.ts +13 -0
  365. package/dist/keyset.js +8 -0
  366. package/dist/local-embedding.d.ts +13 -0
  367. package/dist/local-embedding.js +165 -0
  368. package/dist/log.d.ts +7 -0
  369. package/dist/log.js +19 -1
  370. package/dist/mcp/admin-tools.d.ts +8 -0
  371. package/dist/mcp/admin-tools.js +116 -0
  372. package/dist/mcp/format.d.ts +27 -0
  373. package/dist/mcp/format.js +135 -0
  374. package/dist/mcp/memory-tools.d.ts +5 -0
  375. package/dist/mcp/memory-tools.js +83 -0
  376. package/dist/mcp/protocol.d.ts +83 -0
  377. package/dist/mcp/protocol.js +55 -0
  378. package/dist/mcp/recall-tools.d.ts +6 -0
  379. package/dist/mcp/recall-tools.js +320 -0
  380. package/dist/mcp/request.d.ts +10 -0
  381. package/dist/mcp/request.js +163 -0
  382. package/dist/mcp/server.d.ts +4 -75
  383. package/dist/mcp/server.js +7 -1190
  384. package/dist/mcp/session-state.d.ts +11 -0
  385. package/dist/mcp/session-state.js +28 -0
  386. package/dist/mcp/stdio.d.ts +8 -0
  387. package/dist/mcp/stdio.js +79 -0
  388. package/dist/mcp/tools.d.ts +11 -0
  389. package/dist/mcp/tools.js +247 -0
  390. package/dist/memory.d.ts +3 -0
  391. package/dist/memory.js +27 -1
  392. package/dist/multihop.d.ts +1 -1
  393. package/dist/multihop.js +2 -1
  394. package/dist/owner-validation.js +2 -1
  395. package/dist/physics-state.js +10 -7
  396. package/dist/policies.d.ts +3 -0
  397. package/dist/policies.js +93 -74
  398. package/dist/postinstall.js +3 -2
  399. package/dist/predictions/planning-fallacy.d.ts +100 -0
  400. package/dist/predictions/planning-fallacy.js +190 -0
  401. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  402. package/dist/predictions/store.js +434 -0
  403. package/dist/processes.d.ts +3 -0
  404. package/dist/processes.js +94 -76
  405. package/dist/project-briefs.d.ts +3 -0
  406. package/dist/project-briefs.js +142 -113
  407. package/dist/project-identity.js +3 -2
  408. package/dist/project-merge.d.ts +12 -4
  409. package/dist/project-merge.js +132 -45
  410. package/dist/quarantine.d.ts +2 -1
  411. package/dist/quarantine.js +8 -5
  412. package/dist/raw-archive.js +1 -1
  413. package/dist/recall-history.js +3 -2
  414. package/dist/recall-pipeline.d.ts +2 -2
  415. package/dist/recall-pipeline.js +16 -8
  416. package/dist/recall-scope.js +1 -1
  417. package/dist/recall-trace.d.ts +1 -1
  418. package/dist/refine-llm.js +2 -1
  419. package/dist/reject-flow.js +6 -1
  420. package/dist/rerankers/clef.js +6 -5
  421. package/dist/rerankers/jev.d.ts +1 -1
  422. package/dist/rerankers/jev.js +4 -4
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +58 -38
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/scheduler.d.ts +1 -0
  428. package/dist/scheduler.js +26 -4
  429. package/dist/scope.js +4 -3
  430. package/dist/search/as-of.d.ts +10 -0
  431. package/dist/search/as-of.js +22 -0
  432. package/dist/search/bm25-search.d.ts +14 -0
  433. package/dist/search/bm25-search.js +43 -0
  434. package/dist/search/bm25.d.ts +15 -0
  435. package/dist/search/bm25.js +54 -0
  436. package/dist/search/boosts.d.ts +54 -0
  437. package/dist/search/boosts.js +94 -0
  438. package/dist/search/breakdown.d.ts +7 -0
  439. package/dist/search/breakdown.js +20 -0
  440. package/dist/search/explain.d.ts +25 -0
  441. package/dist/search/explain.js +31 -0
  442. package/dist/search/finalize.d.ts +8 -0
  443. package/dist/search/finalize.js +52 -0
  444. package/dist/search/fusion.d.ts +27 -0
  445. package/dist/search/fusion.js +42 -0
  446. package/dist/search/hybrid-score.d.ts +20 -0
  447. package/dist/search/hybrid-score.js +73 -0
  448. package/dist/search/hybrid.d.ts +46 -0
  449. package/dist/search/hybrid.js +64 -0
  450. package/dist/search/physics-search.d.ts +29 -0
  451. package/dist/search/physics-search.js +162 -0
  452. package/dist/search/rerank.d.ts +10 -0
  453. package/dist/search/rerank.js +72 -0
  454. package/dist/search/temporal.d.ts +15 -0
  455. package/dist/search/temporal.js +45 -0
  456. package/dist/search/types.d.ts +91 -0
  457. package/dist/search/types.js +2 -0
  458. package/dist/search/vector.d.ts +30 -0
  459. package/dist/search/vector.js +71 -0
  460. package/dist/secret-detect.d.ts +2 -0
  461. package/dist/secret-detect.js +2 -1
  462. package/dist/server/auth.d.ts +52 -0
  463. package/dist/server/auth.js +221 -0
  464. package/dist/server/client-ip.d.ts +25 -0
  465. package/dist/server/client-ip.js +92 -0
  466. package/dist/server/cursor.d.ts +23 -0
  467. package/dist/server/cursor.js +58 -0
  468. package/dist/server/lifecycle.d.ts +7 -0
  469. package/dist/server/lifecycle.js +29 -0
  470. package/dist/server/mcp-http.d.ts +5 -0
  471. package/dist/server/mcp-http.js +199 -0
  472. package/dist/server/request.d.ts +33 -0
  473. package/dist/server/request.js +103 -0
  474. package/dist/server/routes/admin.d.ts +9 -0
  475. package/dist/server/routes/admin.js +158 -0
  476. package/dist/server/routes/customer-notes.d.ts +7 -0
  477. package/dist/server/routes/customer-notes.js +112 -0
  478. package/dist/server/routes/decisions.d.ts +7 -0
  479. package/dist/server/routes/decisions.js +133 -0
  480. package/dist/server/routes/incidents.d.ts +7 -0
  481. package/dist/server/routes/incidents.js +126 -0
  482. package/dist/server/routes/memories.d.ts +10 -0
  483. package/dist/server/routes/memories.js +179 -0
  484. package/dist/server/routes/policies.d.ts +8 -0
  485. package/dist/server/routes/policies.js +151 -0
  486. package/dist/server/routes/predictions.d.ts +7 -0
  487. package/dist/server/routes/predictions.js +164 -0
  488. package/dist/server/routes/processes.d.ts +7 -0
  489. package/dist/server/routes/processes.js +161 -0
  490. package/dist/server/routes/project-briefs.d.ts +8 -0
  491. package/dist/server/routes/project-briefs.js +136 -0
  492. package/dist/server/routes/recall.d.ts +8 -0
  493. package/dist/server/routes/recall.js +340 -0
  494. package/dist/server/routes/skills.d.ts +8 -0
  495. package/dist/server/routes/skills.js +150 -0
  496. package/dist/server/types.d.ts +56 -0
  497. package/dist/server/types.js +2 -0
  498. package/dist/server/validation.d.ts +14 -0
  499. package/dist/server/validation.js +91 -0
  500. package/dist/server.d.ts +7 -61
  501. package/dist/server.js +69 -2362
  502. package/dist/session-digest.d.ts +1 -1
  503. package/dist/session-digest.js +9 -2
  504. package/dist/shared.d.ts +12 -1
  505. package/dist/shared.js +33 -27
  506. package/dist/skills.d.ts +3 -0
  507. package/dist/skills.js +88 -70
  508. package/dist/stdin.js +2 -2
  509. package/dist/store/audit-event.d.ts +19 -0
  510. package/dist/store/audit-event.js +33 -0
  511. package/dist/store/candidates.d.ts +42 -0
  512. package/dist/store/candidates.js +152 -0
  513. package/dist/store/conflicts.d.ts +44 -0
  514. package/dist/store/conflicts.js +444 -0
  515. package/dist/store/delete-and-batch.d.ts +63 -0
  516. package/dist/store/delete-and-batch.js +310 -0
  517. package/dist/store/entry-reads.d.ts +92 -0
  518. package/dist/store/entry-reads.js +255 -0
  519. package/dist/store/entry-row.d.ts +67 -0
  520. package/dist/store/entry-row.js +208 -0
  521. package/dist/store/entry-writes.d.ts +46 -0
  522. package/dist/store/entry-writes.js +148 -0
  523. package/dist/store/handoffs.d.ts +26 -0
  524. package/dist/store/handoffs.js +184 -0
  525. package/dist/store/index-and-stats.d.ts +52 -0
  526. package/dist/store/index-and-stats.js +214 -0
  527. package/dist/store/markdown.d.ts +10 -0
  528. package/dist/store/markdown.js +108 -0
  529. package/dist/store/mirrors.d.ts +49 -0
  530. package/dist/store/mirrors.js +312 -0
  531. package/dist/store/open.d.ts +15 -0
  532. package/dist/store/open.js +223 -0
  533. package/dist/store/rows.d.ts +178 -0
  534. package/dist/store/rows.js +158 -0
  535. package/dist/store/search-rows.d.ts +86 -0
  536. package/dist/store/search-rows.js +260 -0
  537. package/dist/store/sessions.d.ts +83 -0
  538. package/dist/store/sessions.js +272 -0
  539. package/dist/store/summaries.d.ts +94 -0
  540. package/dist/store/summaries.js +377 -0
  541. package/dist/store/tenant-lookup.d.ts +12 -0
  542. package/dist/store/tenant-lookup.js +16 -0
  543. package/dist/store-cards.js +2 -1
  544. package/dist/summary-dirty.d.ts +4 -0
  545. package/dist/summary-dirty.js +32 -0
  546. package/dist/support-bundle.js +4 -3
  547. package/dist/tenant.js +2 -2
  548. package/dist/tokenize.d.ts +2 -0
  549. package/dist/tokenize.js +16 -0
  550. package/dist/transcript-tail.d.ts +7 -0
  551. package/dist/transcript-tail.js +48 -0
  552. package/dist/vector-store.d.ts +27 -0
  553. package/dist/vector-store.js +210 -0
  554. package/dist/version.d.ts +2 -2
  555. package/dist/version.js +2 -2
  556. package/dist/working-memory.js +1 -1
  557. package/dist/yaml.js +36 -11
  558. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  559. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  560. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  566. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  570. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  571. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  572. package/dist-ui/index.html +3 -25
  573. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  574. package/extensions/openclaw-plugin/package.json +1 -1
  575. package/openclaw.plugin.json +1 -1
  576. package/package.json +1 -1
  577. package/dist/capture.d.ts +0 -155
  578. package/dist/capture.js +0 -1295
  579. package/dist/consolidate.d.ts +0 -58
  580. package/dist/consolidate.js +0 -1124
  581. package/dist/graph.d.ts +0 -245
  582. package/dist/hooks.d.ts +0 -208
  583. package/dist/hooks.js +0 -1076
  584. package/dist/importers.js +0 -900
  585. package/dist/predictions.js +0 -620
  586. package/dist/search.d.ts +0 -320
  587. package/dist/search.js +0 -970
  588. package/dist/store.d.ts +0 -776
  589. package/dist/store.js +0 -3473
  590. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  591. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  592. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  593. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,126 @@
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
+ const { collected, level0DirectCount } = collectDescendants(ctx, summaryId, depth);
46
+ const summaryOut = {
47
+ id: summary.id,
48
+ content: summary.content,
49
+ // v0.30 / E5: the STORED direct-child count; the legacy fallback counts
50
+ // level-0 children, never the BFS-depth-N total (independent-review MED #4).
51
+ descendantCount: summary.descendant_count ?? level0DirectCount,
52
+ earliestAt: summary.earliest_at ?? null,
53
+ latestAt: summary.latest_at ?? null,
54
+ };
55
+ const all = collected.map((c) => ({
56
+ id: c.id,
57
+ content: c.content,
58
+ layer: c.layer,
59
+ dagLevel: c.dag_level ?? 0,
60
+ created: c.created,
61
+ }));
62
+ const { children, truncated } = capChildren(all, summaryOut, opts, limit);
63
+ return {
64
+ summary: summaryOut,
65
+ children,
66
+ // v0.30 / E5: totalChildren = BFS-collected count (depth-aware). For
67
+ // depth=1 this equals the eligible direct-children count (backward
68
+ // compat). For depth>1 it is the cumulative count across levels.
69
+ totalChildren: collected.length,
70
+ truncated,
71
+ };
72
+ }
73
+ // BFS with a visited set: dag_parent_id is not unique, so a misconfigured tree could emit a child twice past depth 1.
74
+ // The level-0 count is kept apart so a legacy summary's descendantCount fallback counts direct children only.
75
+ function collectDescendants(ctx, summaryId, depth) {
76
+ const collected = [];
77
+ const visited = new Set([summaryId]);
78
+ let frontier = [summaryId];
79
+ let level0DirectCount = 0;
80
+ for (let level = 0; level < depth; level++) {
81
+ const nextFrontier = [];
82
+ for (const parentId of frontier) {
83
+ const kids = loadChildrenOf(ctx.hippoRoot, parentId, ctx.tenantId);
84
+ const eligibleKids = kids.filter((c) => passesScopeFilterForRecall(c.scope ?? null, undefined));
85
+ for (const k of eligibleKids) {
86
+ if (visited.has(k.id))
87
+ continue;
88
+ visited.add(k.id);
89
+ collected.push(k);
90
+ nextFrontier.push(k.id);
91
+ if (level === 0)
92
+ level0DirectCount++;
93
+ }
94
+ }
95
+ if (nextFrontier.length === 0)
96
+ break;
97
+ frontier = nextFrontier;
98
+ }
99
+ return { collected, level0DirectCount };
100
+ }
101
+ /** Global cumulative token budget first, then the `limit` cap. */
102
+ function capChildren(all, summaryOut, opts, limit) {
103
+ let children = all;
104
+ let truncated = false;
105
+ if (opts.budget !== undefined) {
106
+ const out = [];
107
+ let used = 0;
108
+ const room = opts.budget - (opts.cost?.fixed(summaryOut, all.length) ?? 0);
109
+ for (const c of all) {
110
+ const t = opts.cost ? opts.cost.child(c) : estimateTokens(c.content);
111
+ if (out.length > 0 && used + t > room) {
112
+ truncated = true;
113
+ break;
114
+ }
115
+ out.push(c);
116
+ used += t;
117
+ }
118
+ children = out;
119
+ }
120
+ if (children.length > limit) {
121
+ children = children.slice(0, limit);
122
+ truncated = true;
123
+ }
124
+ return { children, truncated };
125
+ }
126
+ //# 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
@@ -0,0 +1,88 @@
1
+ // Git auto-learn: fix/revert/bug commit subjects become memories. `hippo learn`, init, sleep and MCP hippo_learn share it.
2
+ import { ForbiddenError } from '../api-errors.js';
3
+ import { fetchGitLog, extractLessons, partitionLessons, isGitRepo } from '../autolearn.js';
4
+ import { loadConfig } from '../config.js';
5
+ import { embedMemory } from '../embeddings.js';
6
+ import { extractInvalidationTarget, invalidateMatching } from '../invalidation.js';
7
+ import { computeSchemaFit, createMemory, Layer } from '../memory.js';
8
+ import { extractPathTags } from '../path-context.js';
9
+ import { RejectedValueError } from '../rejection.js';
10
+ import { duplicateKey, longestWord, storedTextKeys } from '../same-text.js';
11
+ import { loadTextsHoldingWords } from '../store/candidates.js';
12
+ import { loadAllEntries } from '../store/entry-reads.js';
13
+ import { writeEntry } from '../store/entry-writes.js';
14
+ import { updateStats } from '../store/index-and-stats.js';
15
+ // SHORTCUT: two profiles keep each surface's rows as they were; fold MCP onto the CLI profile once it may invalidate.
16
+ export const CLI_LEARN = Object.freeze({ tags: Object.freeze(['error', 'git-learned']), source: 'git-learn', full: true });
17
+ export const MCP_LEARN = Object.freeze({ tags: Object.freeze(['git-learned']), source: 'git', full: false });
18
+ /** Learn from `repoPath`'s last `days` of commits into the caller's tenant. Host admin only. */
19
+ export function learn(ctx, opts) {
20
+ // It reads the host's own git history, which belongs to the host, not to the caller's tenant.
21
+ if (!ctx.actor.hostAdmin)
22
+ throw new ForbiddenError('hippo_learn requires a host admin');
23
+ const none = { added: 0, skipped: 0, rejected: 0, lowInfo: 0, invalidations: [] };
24
+ if (!isGitRepo(opts.repoPath))
25
+ return { status: 'not-a-repo', ...none };
26
+ const gitLog = fetchGitLog(opts.repoPath, opts.days);
27
+ if (!gitLog.trim())
28
+ return { status: 'no-commits', ...none };
29
+ const config = loadConfig(ctx.hippoRoot);
30
+ const parsed = extractLessons(gitLog, config.gitLearnPatterns);
31
+ if (parsed.length === 0)
32
+ return { status: 'no-lessons', ...none };
33
+ // The gate filters the loop input, so a dropped lesson neither stores nor invalidates; docs/decisions git-learn-gate-placement says why.
34
+ const { kept, dropped } = partitionLessons(parsed);
35
+ return { status: 'scanned', lowInfo: dropped.length, ...writeLessons(ctx, kept, opts, config) };
36
+ }
37
+ function writeLessons(ctx, lessons, opts, config) {
38
+ const { hippoRoot, tenantId } = ctx;
39
+ const { profile } = opts;
40
+ // Schema fit needs every row; without it, only rows holding a lesson's longest word can be its copy.
41
+ const existing = profile.full ? loadAllEntries(hippoRoot, tenantId) : undefined;
42
+ const keys = storedTextKeys(existing ?? loadTextsHoldingWords(hippoRoot, tenantId, lessons.map(longestWord)));
43
+ const pathTags = profile.full ? extractPathTags(opts.repoPath) : [];
44
+ const counts = { added: 0, skipped: 0, rejected: 0, invalidations: [] };
45
+ for (const lesson of lessons) {
46
+ if (keys.has(duplicateKey(lesson))) {
47
+ counts.skipped++;
48
+ continue;
49
+ }
50
+ const target = profile.full ? extractInvalidationTarget(lesson) : null;
51
+ if (target) {
52
+ const { invalidated } = invalidateMatching(hippoRoot, target, tenantId);
53
+ if (invalidated > 0)
54
+ counts.invalidations.push({ from: target.from, count: invalidated });
55
+ }
56
+ const entry = createMemory(lesson, {
57
+ layer: Layer.Episodic,
58
+ tags: [...profile.tags],
59
+ source: profile.source,
60
+ confidence: 'observed',
61
+ schema_fit: existing && computeSchemaFit(lesson, [...profile.tags], existing),
62
+ tenantId,
63
+ baseHalfLifeDays: config.defaultHalfLifeDays,
64
+ });
65
+ for (const tag of pathTags)
66
+ if (!entry.tags.includes(tag))
67
+ entry.tags.push(tag);
68
+ // A refused lesson must not abort the rest of the git-log scan.
69
+ try {
70
+ writeEntry(hippoRoot, entry, { actor: ctx.actor.subject });
71
+ }
72
+ catch (err) {
73
+ if (err instanceof RejectedValueError) {
74
+ counts.rejected++;
75
+ continue;
76
+ }
77
+ throw err;
78
+ }
79
+ if (profile.full)
80
+ updateStats(hippoRoot, { remembered: 1 });
81
+ keys.add(duplicateKey(lesson));
82
+ if (profile.full)
83
+ void embedMemory(hippoRoot, entry);
84
+ counts.added++;
85
+ }
86
+ return counts;
87
+ }
88
+ //# sourceMappingURL=learn.js.map
@@ -0,0 +1,61 @@
1
+ import type { Context } from './types.js';
2
+ /**
3
+ * Apply a positive/negative outcome to a list of recently-recalled memory ids.
4
+ * Used by the MCP `hippo_outcome` tool and the HTTP `POST /v1/outcome` route.
5
+ * Tenant-scoped: ids that don't belong to ctx.tenantId are silently skipped
6
+ * (matches the prior MCP semantics — a stale id from another tenant doesn't
7
+ * crash the call). Each successful outcome emits one audit_log row with
8
+ * op='outcome' tagged with ctx.actor.subject.
9
+ *
10
+ * Returns `{applied, appliedIds}`. `appliedIds` is the tenant-filtered subset
11
+ * of input ids that actually had `applyOutcome` run on them (i.e. ids whose
12
+ * `readEntry(..., ctx.tenantId)` resolved). Callers that surface the id list
13
+ * over a multi-tenant boundary (HTTP /v1/outcome last-recall path, Python SDK)
14
+ * MUST return `appliedIds` instead of the raw input list — otherwise the
15
+ * non-applied (cross-tenant) ids leak to the caller. Added in v1.11.4 to
16
+ * close that disclosure path on POST /v1/outcome.
17
+ *
18
+ * `opts.traceId` (LC1, docs/plans/2026-08-02-lc1-recall-trace-persistence.md):
19
+ * OPTIONAL additive opt so a programmatic caller can link this outcome to
20
+ * the recall_traces row it judges. NOT applied unconditionally — an SDK
21
+ * caller passing explicit ids with no preceding CLI/context recall would
22
+ * otherwise get linked to a stale, unrelated trace. `outcomeForLastRecall`
23
+ * supplies this automatically from `last_trace_id`; every other caller
24
+ * (server.ts explicit-ids path, MCP hippo_outcome) omits it and gets no
25
+ * linkage, which is correct.
26
+ */
27
+ export interface OutcomeResult {
28
+ applied: number;
29
+ appliedIds: string[];
30
+ }
31
+ export declare function outcome(ctx: Context, ids: ReadonlyArray<string>, good: boolean, opts?: {
32
+ traceId?: number;
33
+ }): OutcomeResult;
34
+ /**
35
+ * Apply an outcome to the ids most recently returned by `recall()`.
36
+ *
37
+ * Reads `loadIndex(ctx.hippoRoot).last_retrieval_ids` (per-hippoRoot local
38
+ * state; not tenant-scoped at the index layer) and forwards to `outcome()`,
39
+ * which DOES tenant-filter via `readEntry(..., ctx.tenantId)`. Cross-tenant
40
+ * ids in `last_retrieval_ids` are silently skipped, matching the MCP
41
+ * `hippo_outcome` semantics.
42
+ *
43
+ * **Tenant-safe response shape (v1.11.4 security fix):** the returned `ids`
44
+ * field contains ONLY the tenant-filtered subset that actually had outcomes
45
+ * applied (i.e. `appliedIds` from the inner `outcome()` call). Earlier
46
+ * versions returned the raw `last_retrieval_ids` regardless of tenant, which
47
+ * leaked cross-tenant memory IDs to the caller via POST /v1/outcome's
48
+ * no-body last-recall response. The fix is at this helper so all callers
49
+ * (CLI cmdOutcome, HTTP /v1/outcome, MCP `hippo_outcome` if added later)
50
+ * inherit the tenant-safe contract.
51
+ *
52
+ * Do NOT tighten `loadIndex` with `tenantId` inside this helper — doing so
53
+ * would break the (correct) cross-tenant-silent-skip behavior covered by
54
+ * the test in `tests/api-outcome-for-last-recall.test.ts`.
55
+ */
56
+ export interface OutcomeForLastRecallResult {
57
+ applied: number;
58
+ ids: string[];
59
+ }
60
+ export declare function outcomeForLastRecall(ctx: Context, good: boolean): OutcomeForLastRecallResult;
61
+ //# sourceMappingURL=outcome.d.ts.map
@@ -0,0 +1,66 @@
1
+ // Outcome feedback on recalled memories.
2
+ import { openHippoDb, closeHippoDb } from '../db.js';
3
+ import { writeEntry } from '../store/entry-writes.js';
4
+ import { readEntry } from '../store/entry-reads.js';
5
+ import { loadIndex } from '../store/index-and-stats.js';
6
+ import { applyOutcome, CHURN_STALE_TAG } from '../memory.js';
7
+ import { appendAuditEvent } from '../audit.js';
8
+ import { recordTraceOutcome } from '../recall-trace.js';
9
+ export function outcome(ctx, ids, good, opts) {
10
+ const appliedIds = [];
11
+ const db = openHippoDb(ctx.hippoRoot);
12
+ try {
13
+ for (const id of ids) {
14
+ const entry = readEntry(ctx.hippoRoot, id, ctx.tenantId);
15
+ if (!entry)
16
+ continue;
17
+ let updated = applyOutcome(entry, good);
18
+ if (good && updated.tags.includes(CHURN_STALE_TAG)) { // FE2: a good outcome reconfirms the entry
19
+ updated = { ...updated, tags: updated.tags.filter((t) => t !== CHURN_STALE_TAG) };
20
+ }
21
+ writeEntry(ctx.hippoRoot, updated, { actor: ctx.actor.subject });
22
+ appendAuditEvent(db, {
23
+ tenantId: ctx.tenantId,
24
+ actor: ctx.actor.subject,
25
+ op: 'outcome',
26
+ targetId: id,
27
+ metadata: { good },
28
+ });
29
+ appliedIds.push(id);
30
+ }
31
+ // LC1: link the outcome to its trace, recording only the ids actually
32
+ // credited (post tenant-filtering, matches appliedIds). Lives in its own
33
+ // append-only table so audit_log pruning can never erase training data.
34
+ if (opts?.traceId !== undefined && appliedIds.length > 0) {
35
+ recordTraceOutcome(db, {
36
+ traceId: opts.traceId,
37
+ tenantId: ctx.tenantId,
38
+ outcome: good ? 'positive' : 'negative',
39
+ memoryIds: appliedIds,
40
+ });
41
+ }
42
+ }
43
+ finally {
44
+ closeHippoDb(db);
45
+ }
46
+ return { applied: appliedIds.length, appliedIds };
47
+ }
48
+ export function outcomeForLastRecall(ctx, good) {
49
+ const idx = loadIndex(ctx.hippoRoot);
50
+ const ids = idx.last_retrieval_ids;
51
+ if (ids.length === 0)
52
+ return { applied: 0, ids: [] };
53
+ // LC1 F1(d) structural fix (docs/plans/2026-08-02-lc1-recall-trace-persistence.md):
54
+ // read the trace id from the SAME `loadIndex` snapshot already in hand
55
+ // (idx.last_trace_id) — a single-snapshot read, not a second DB round
56
+ // trip via a now-deleted readLastTraceId helper. The value is already
57
+ // strict-parsed by buildIndexFromDb's parseLastTraceId (store.ts): every
58
+ // consumer gets a clean positive-integer string or null, never a garbage
59
+ // value that could reach outcome() and INSERT trace_id=0/NaN. null on a
60
+ // fresh store / pre-v40 flow / api.recall-only usage — outcome() skips
61
+ // linkage silently when traceId is undefined.
62
+ const traceId = idx.last_trace_id !== null ? Number(idx.last_trace_id) : null;
63
+ const { applied, appliedIds } = outcome(ctx, ids, good, traceId !== null ? { traceId } : undefined);
64
+ return { applied, ids: appliedIds };
65
+ }
66
+ //# sourceMappingURL=outcome.js.map
@@ -0,0 +1,54 @@
1
+ import { type DatabaseSyncLike } from '../db.js';
2
+ import type { Context } from './types.js';
3
+ /**
4
+ * Copy a local memory into the global store. Mirrors `cmdPromote` in cli.ts:
5
+ * the `writeEntry` inside `promoteToGlobal` emits a 'remember' on the global
6
+ * db; we add a 'promote' audit event on the global db so the user-facing
7
+ * intent stays distinct from the underlying upsert.
8
+ *
9
+ * Note: `promoteToGlobal` does not currently take a tenantId override — it
10
+ * reads the entry from the local root via `readEntry` (no tenant filter) and
11
+ * preserves the entry's existing tenantId on the global side. Task 4 may
12
+ * tighten this once writeEntry/readEntry thread tenant context.
13
+ */
14
+ export interface PromoteResult {
15
+ ok: true;
16
+ sourceId: string;
17
+ globalId: string;
18
+ }
19
+ export declare function promote(ctx: Context, id: string): PromoteResult;
20
+ /**
21
+ * Replace an old memory with new content, chaining old.superseded_by = new.id.
22
+ * Mirrors `cmdSupersede` in cli.ts (without flag-driven layer/tag/pin overrides
23
+ * — A1 keeps the API minimal; the CLI handler will continue to handle those
24
+ * flags and pass the resolved values once Task 4 lands).
25
+ */
26
+ export interface SupersedeResult {
27
+ ok: true;
28
+ oldId: string;
29
+ newId: string;
30
+ }
31
+ export declare function supersede(ctx: Context, oldId: string, newContent: string): SupersedeResult;
32
+ /**
33
+ * Archive a kind='raw' memory: snapshot into raw_archive, mark archived, delete.
34
+ *
35
+ * `archiveRawMemory` audits the operation internally (op='archive_raw') using the
36
+ * row's own tenant_id. We DO NOT emit a second audit event here to avoid double-
37
+ * emitting the archive_raw op (unlike Task 1 remember/forget where the underlying
38
+ * helpers hardcode actor='cli'). Instead we pass `ctx.actor.subject` through as `who`,
39
+ * and raw-archive.ts uses that for the audit row.
40
+ */
41
+ export interface ArchiveRawOpts {
42
+ /**
43
+ * Connector idempotency hook (v0.39 commit 3). Runs inside the same
44
+ * SAVEPOINT as the archive — throwing rolls the archive back. Used by the
45
+ * Slack deletion connector to mark the deletion event seen atomically.
46
+ */
47
+ afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
48
+ }
49
+ export interface ArchiveRawResult {
50
+ ok: true;
51
+ archivedAt: string;
52
+ }
53
+ export declare function archiveRaw(ctx: Context, id: string, reason: string, opts?: ArchiveRawOpts): ArchiveRawResult;
54
+ //# sourceMappingURL=promote.d.ts.map