hippo-memory 1.71.0 → 2.0.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 (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
@@ -5,10 +5,10 @@ import { createHash } from 'node:crypto';
5
5
  import { createMemory } from '../core/memory.js';
6
6
  import { loadVaultRawRows } from '../store/entry-reads.js';
7
7
  import { remember, archiveRaw, isPrivateScope } from '../api/index.js';
8
- import { assertClientScope } from '../store/recall-scope.js';
9
- import { RejectedValueError } from '../store/rejection.js';
8
+ import { assertClientScope } from '../core/recall-scope.js';
9
+ import { RejectedValueError } from '../core/api-errors.js';
10
10
  import { rejectionGuardRefuses } from '../store/rejected-values.js';
11
- import { withRequestStoresSync } from '../db/request-stores.js';
11
+ import { runWithRequestStores } from '../db/request-stores.js';
12
12
  import { loadConfig } from '../core/config.js';
13
13
  import { vetSecrets } from '../util/secret-detect.js';
14
14
  import { errorMessage, log } from '../util/log.js';
@@ -18,7 +18,7 @@ import { isJsonString } from '../util/json.js';
18
18
  import { escapeLike } from '../util/escape.js';
19
19
  /** Import a markdown vault FOLDER as `kind='raw'` memories.
20
20
  * NOT re-entrant: idempotency rests on the in-memory `existing` Map loaded once, so two concurrent runs over one vault can double-insert. */
21
- export function importVault(folderPath, options) {
21
+ export async function importVault(folderPath, options) {
22
22
  const hippoRoot = options.hippoRoot;
23
23
  const identity = vaultIdentityOrThrow(options);
24
24
  if (options.global) {
@@ -34,7 +34,7 @@ export function importVault(folderPath, options) {
34
34
  }
35
35
  return syncVaultFolder(folderPath, options, identity);
36
36
  }
37
- function syncVaultFolder(folderPath, options, { vaultName, scope }) {
37
+ async function syncVaultFolder(folderPath, options, { vaultName, scope }) {
38
38
  const hippoRoot = options.hippoRoot;
39
39
  const tenantId = options.tenantId ?? DEFAULT_TENANT_ID;
40
40
  const extraTags = options.extraTags ?? [];
@@ -54,15 +54,15 @@ function syncVaultFolder(folderPath, options, { vaultName, scope }) {
54
54
  const run = {
55
55
  ctx, folderPath, vaultName, scope, extraTags, dryRun, existing, seen, baseHalfLifeDays, tally,
56
56
  };
57
- const importNotes = () => {
57
+ const importNotes = async () => {
58
58
  for (const relpath of relpaths)
59
- importVaultNote(run, relpath);
59
+ await importVaultNote(run, relpath);
60
60
  };
61
61
  // A dry run probes the rejection guard once per changed note; one scope lets every probe share a handle.
62
62
  if (dryRun)
63
- withRequestStoresSync(importNotes);
63
+ await runWithRequestStores(importNotes);
64
64
  else
65
- importNotes();
65
+ await importNotes();
66
66
  // Deletion-sync: an artifactRef in the Map but not seen this run vanished from the source, so archive its raw row.
67
67
  // Per-file archiveRaw, no outer SAVEPOINT: there is no cross-file idempotency row to commit atomically.
68
68
  for (const [artifactRef, rows] of existing) {
@@ -71,7 +71,7 @@ function syncVaultFolder(folderPath, options, { vaultName, scope }) {
71
71
  for (const row of rows) {
72
72
  tally.archived++; // count even in dryRun so the preview reflects destructive deletes
73
73
  if (!dryRun)
74
- archiveRaw(ctx, row.id, `source_deleted:${artifactRef}`);
74
+ await archiveRaw(ctx, row.id, `source_deleted:${artifactRef}`);
75
75
  }
76
76
  }
77
77
  const { total, imported, skipped, rejected, archived, redacted, entries } = tally;
@@ -82,18 +82,20 @@ function vaultIdentityOrThrow(options) {
82
82
  // sharing a basename collide on the same `vault:<name>:*` prefix and the sync archived the first one's rows.
83
83
  const vaultName = options.name?.trim();
84
84
  if (!vaultName) {
85
- throw new Error('importVault requires an explicit vault name (options.name): it is the identity key for source-deletion sync and must not be inferred from the folder basename.');
85
+ throw new Error('importVault requires an explicit vault name (options.name): it is the identity key for source-deletion sync and must not be inferred from the folder ' +
86
+ 'basename.');
86
87
  }
87
88
  if (vaultName.includes(':')) {
88
89
  // ':' delimits the artifactRef (vault:<name>:<relpath>); a name containing it lets another vault's prefix scan over-match and archive its rows.
89
90
  throw new Error(`vault name must not contain ':' (artifactRef delimiter): ${vaultName}`);
90
91
  }
91
92
  const scope = options.scope ?? null;
92
- // Privacy guard: recall only default-denies scopes shaped `<source>:private:*` (isPrivateScope in src/store/recall-scope.ts), so a bare `private`
93
+ // Privacy guard: recall only default-denies scopes shaped `<source>:private:*` (isPrivateScope in src/core/recall-scope.ts), so a bare `private`
93
94
  // alias would be returned to no-scope callers. Reject any scope naming a `private` segment that is not a valid `<source>:private:*`.
94
95
  assertClientScope(scope);
95
96
  if (scope !== null && scope.split(':').includes('private') && !isPrivateScope(scope)) {
96
- throw new Error(`vault scope '${scope}' is not recognized as private by recall (only '<source>:private:*' scopes are default-denied). Use a source-prefixed scope such as 'vault:private:${vaultName}'.`);
97
+ throw new Error(`vault scope '${scope}' is not recognized as private by recall (only '<source>:private:*' scopes are default-denied). ` +
98
+ `Use a source-prefixed scope such as 'vault:private:${vaultName}'.`);
97
99
  }
98
100
  return { vaultName, scope };
99
101
  }
@@ -118,7 +120,7 @@ function loadVaultRows(hippoRoot, tenantId, vaultName) {
118
120
  }
119
121
  return existing;
120
122
  }
121
- function importVaultNote(run, relpath) {
123
+ async function importVaultNote(run, relpath) {
122
124
  const { tally } = run;
123
125
  tally.total++;
124
126
  const artifactRef = `vault:${run.vaultName}:${relpath}`;
@@ -135,7 +137,7 @@ function importVaultNote(run, relpath) {
135
137
  // Empty or frontmatter-only note: nothing storable, and the content was deleted at source, so archive prior rows (the old body must not stay searchable)
136
138
  // and skip the write. Safe because remember() is skipped, so there is no archive-then-throw hazard; the note stays in `seen` so deletion-sync skips it.
137
139
  if (body.trim().length < 3) {
138
- archivePriors(run, priors, `emptied:${artifactRef}`);
140
+ await archivePriors(run, priors, `emptied:${artifactRef}`);
139
141
  tally.skipped++;
140
142
  return;
141
143
  }
@@ -145,13 +147,13 @@ function importVaultNote(run, relpath) {
145
147
  tally.skipped++;
146
148
  return;
147
149
  }
148
- writeChangedNote(run, artifactRef, priors, body, tags);
150
+ await writeChangedNote(run, artifactRef, priors, body, tags);
149
151
  }
150
- function writeChangedNote(run, artifactRef, priors, body, tags) {
152
+ async function writeChangedNote(run, artifactRef, priors, body, tags) {
151
153
  const { ctx, tally } = run;
152
154
  // Changed file: archive EVERY old raw row for this ref (>1 only after a concurrent double-insert), then append the new one; NEVER supersede.
153
155
  // archiveRaw commits before remember() runs, so no double-live row; a crash between them self-heals on the next import.
154
- archivePriors(run, priors, `changed:${artifactRef}`);
156
+ await archivePriors(run, priors, `changed:${artifactRef}`);
155
157
  // remember() owns the write; the `echo` from createMemory only fills the ImportResult, with its id reconciled to the row that landed.
156
158
  const content = vetSecrets(body, tags, true).content;
157
159
  const echo = createMemory(content, {
@@ -163,7 +165,7 @@ function writeChangedNote(run, artifactRef, priors, body, tags) {
163
165
  tenantId: ctx.tenantId,
164
166
  baseHalfLifeDays: run.baseHalfLifeDays,
165
167
  });
166
- if (!storeVaultNote(run, echo, content, tags, artifactRef)) {
168
+ if (!(await storeVaultNote(run, echo, content, tags, artifactRef))) {
167
169
  tally.rejected++;
168
170
  return;
169
171
  }
@@ -183,11 +185,11 @@ function readVaultNote(run, relpath) {
183
185
  return null;
184
186
  }
185
187
  }
186
- function archivePriors(run, priors, reason) {
188
+ async function archivePriors(run, priors, reason) {
187
189
  for (const p of priors) {
188
190
  run.tally.archived++; // count the would-be archive even in dryRun (true preview)
189
191
  if (!run.dryRun)
190
- archiveRaw(run.ctx, p.id, reason);
192
+ await archiveRaw(run.ctx, p.id, reason);
191
193
  }
192
194
  }
193
195
  function vaultNoteTags(run, hashTag, fm, body) {
@@ -219,14 +221,14 @@ function vaultEnvelopeUnchanged(priors, tags, scope) {
219
221
  }));
220
222
  }
221
223
  /** Returns false when the rejection guard refuses the note; any other error propagates. */
222
- function storeVaultNote(run, echo, content, tags, artifactRef) {
224
+ async function storeVaultNote(run, echo, content, tags, artifactRef) {
223
225
  // A dry run writes nothing; it asks the guard remember() uses, so its `rejected` count matches what a real run would refuse.
224
226
  if (run.dryRun)
225
227
  return !rejectionGuardRefuses(run.ctx.hippoRoot, run.ctx.tenantId, echo.id, echo.content);
226
228
  try {
227
229
  // A rejected note must not stop the scan or the deletion sync. Its priors are archived by now, so a rerun meets
228
230
  // the same refusal and counts it again.
229
- const result = remember(run.ctx, {
231
+ const result = await remember(run.ctx, {
230
232
  content,
231
233
  kind: 'raw',
232
234
  artifactRef,
package/dist/index.d.ts CHANGED
@@ -20,7 +20,7 @@ export { initStore } from './store/open.js';
20
20
  export { writeEntry } from './store/entry-writes.js';
21
21
  export { loadAllEntries, readEntry } from './store/entry-reads.js';
22
22
  export { deleteEntry } from './store/delete-and-batch.js';
23
- export { loadSearchEntries, loadRecallSearchEntries } from './store/search-rows.js';
23
+ export { loadSearchEntries, loadRecallEntries, type RecallSearchEntriesOptions } from './store/search-rows.js';
24
24
  export { loadIndex, rebuildIndex, loadSessionDecayContext, SessionDecayContext } from './store/index-and-stats.js';
25
25
  export { saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, type ContinuityKey, } from './store/sessions.js';
26
26
  export { listMemoryConflicts, replaceDetectedConflicts, resolveConflict } from './store/conflicts.js';
@@ -32,10 +32,11 @@ export { consolidate } from './consolidate/sleep.js';
32
32
  export { ConsolidationResult } from './consolidate/run.js';
33
33
  export { sleep, type SleepOpts, type SleepResult } from './api/sleep.js';
34
34
  export { strengthBucket } from './consolidate/dedupe.js';
35
- export { isEmbeddingAvailable, getEmbedding } from './store/embeddings/local.js';
36
- export { cosineSimilarity, embedMemory, embedAll, } from './store/embeddings/index.js';
35
+ export { isEmbeddingAvailable, getEmbedding } from './embeddings/local.js';
36
+ export { cosineSimilarity } from './store/embeddings/index.js';
37
+ export { embedMemory, embedAll } from './search/embed-memories.js';
37
38
  export { loadEmbeddingIndex, saveEmbeddingIndex } from './store/vector-index.js';
38
- export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './learn/autolearn.js';
39
+ export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, type RunWatchedOptions, fetchGitLog, } from './learn/autolearn.js';
39
40
  export { getGlobalRoot, initGlobal, promoteToGlobal } from './sharing/global-store.js';
40
41
  export { searchBoth, searchBothHybrid, HybridSearchOptions } from './sharing/search-both.js';
41
42
  export { syncGlobalToLocal } from './sharing/global-sync.js';
package/dist/index.js CHANGED
@@ -21,7 +21,7 @@ export { initStore } from './store/open.js';
21
21
  export { writeEntry } from './store/entry-writes.js';
22
22
  export { loadAllEntries, readEntry } from './store/entry-reads.js';
23
23
  export { deleteEntry } from './store/delete-and-batch.js';
24
- export { loadSearchEntries, loadRecallSearchEntries } from './store/search-rows.js';
24
+ export { loadSearchEntries, loadRecallEntries } from './store/search-rows.js';
25
25
  export { loadIndex, rebuildIndex, loadSessionDecayContext } from './store/index-and-stats.js';
26
26
  export { saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, } from './store/sessions.js';
27
27
  export { listMemoryConflicts, replaceDetectedConflicts, resolveConflict } from './store/conflicts.js';
@@ -36,8 +36,9 @@ export { sleep } from './api/sleep.js';
36
36
  // Announced public in CHANGELOG 1.26.3 but never re-exported; the rest of dedupe.js stays internal.
37
37
  export { strengthBucket } from './consolidate/dedupe.js';
38
38
  // Feature 1: Embedding search
39
- export { isEmbeddingAvailable, getEmbedding } from './store/embeddings/local.js';
40
- export { cosineSimilarity, embedMemory, embedAll, } from './store/embeddings/index.js';
39
+ export { isEmbeddingAvailable, getEmbedding } from './embeddings/local.js';
40
+ export { cosineSimilarity } from './store/embeddings/index.js';
41
+ export { embedMemory, embedAll } from './search/embed-memories.js';
41
42
  export { loadEmbeddingIndex, saveEmbeddingIndex } from './store/vector-index.js';
42
43
  // Feature 2: Auto-learn from errors
43
44
  export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './learn/autolearn.js';
@@ -15,9 +15,21 @@ export declare function partitionLessons(lessons: string[]): {
15
15
  /** Check if a substantially similar memory already exists: true if overlap > threshold (default 0.7).
16
16
  * `tenantId` applies only on the root-string overload; a pre-loaded MemoryEntry[] is already scoped, so it is ignored there. */
17
17
  export declare function deduplicateLesson(hippoRootOrEntries: string | MemoryEntry[], lesson: string, threshold?: number, tenantId?: string): boolean;
18
- /** Run a command in a shell, streaming stderr live; never pass text the caller did not write.
19
- * Returns: { exitCode, stderr }. */
20
- export declare function runWatched(command: string): Promise<{
18
+ /** A transfer command that has not exited in this long is hung on a prompt or a dead remote. */
19
+ export declare const RUN_WATCHED_DEADLINE_MS: number;
20
+ /** The command passed its deadline and was killed. */
21
+ export declare class RunWatchedTimeoutError extends Error {
22
+ readonly deadlineMs: number;
23
+ readonly stderr: string;
24
+ constructor(deadlineMs: number, stderr: string);
25
+ }
26
+ export interface RunWatchedOptions {
27
+ /** Join argv with spaces and run it as one shell command line; only for text the caller wrote itself. */
28
+ shell?: boolean;
29
+ }
30
+ /** Run argv[0] with the rest as its arguments and no shell, so `;`, `&` and `$()` reach it literally; stderr streams live.
31
+ * Returns: { exitCode, stderr } with only the last 64 KiB of stderr; rejects with RunWatchedTimeoutError past `deadlineMs`. */
32
+ export declare function runWatched(argv: readonly string[], deadlineMs?: number, opts?: RunWatchedOptions): Promise<{
21
33
  exitCode: number;
22
34
  stderr: string;
23
35
  }>;
@@ -1,6 +1,7 @@
1
1
  /** Auto-learn from errors and git history.
2
2
  * Agents learn from failures without explicit hippo remember calls. */
3
- import { execSync, execFileSync, spawn } from 'child_process';
3
+ import { execFileSync, spawn } from 'child_process';
4
+ import { spawnArgv } from '../util/spawn-argv.js';
4
5
  import { createMemory, Layer, DEFAULT_HALF_LIFE_DAYS } from '../core/memory.js';
5
6
  import { loadAllEntries } from '../store/entry-reads.js';
6
7
  import { textOverlap } from '../util/tokenize.js';
@@ -97,25 +98,46 @@ export function deduplicateLesson(hippoRootOrEntries, lesson, threshold = 0.7, t
97
98
  }
98
99
  return false;
99
100
  }
100
- /** Run a command in a shell, streaming stderr live; never pass text the caller did not write.
101
- * Returns: { exitCode, stderr }. */
102
- export function runWatched(command) {
103
- return new Promise((resolve) => {
104
- // Use shell: true so the command string is handled by the shell as-is
105
- const child = spawn(command, { shell: true, stdio: ['inherit', 'inherit', 'pipe'], windowsHide: true });
106
- const stderrChunks = [];
107
- child.stderr.on('data', (chunk) => {
108
- stderrChunks.push(chunk);
109
- // Also pass through to terminal
101
+ /** The most stderr `runWatched` returns; the terminal still gets all of it. */
102
+ const STDERR_TAIL_BYTES = 64 * 1024;
103
+ /** A transfer command that has not exited in this long is hung on a prompt or a dead remote. */
104
+ export const RUN_WATCHED_DEADLINE_MS = 30 * 60_000;
105
+ /** The command passed its deadline and was killed. */
106
+ export class RunWatchedTimeoutError extends Error {
107
+ deadlineMs;
108
+ stderr;
109
+ constructor(deadlineMs, stderr) {
110
+ super(`the command did not exit within ${deadlineMs} ms and was killed`);
111
+ this.deadlineMs = deadlineMs;
112
+ this.stderr = stderr;
113
+ this.name = 'RunWatchedTimeoutError';
114
+ }
115
+ }
116
+ /** Run argv[0] with the rest as its arguments and no shell, so `;`, `&` and `$()` reach it literally; stderr streams live.
117
+ * Returns: { exitCode, stderr } with only the last 64 KiB of stderr; rejects with RunWatchedTimeoutError past `deadlineMs`. */
118
+ export function runWatched(argv, deadlineMs = RUN_WATCHED_DEADLINE_MS, opts = {}) {
119
+ return new Promise((resolve, reject) => {
120
+ const options = { stdio: ['inherit', 'inherit', 'pipe'], windowsHide: true };
121
+ const child = opts.shell ? spawn(argv.join(' '), { ...options, windowsHide: true, shell: true }) : spawnArgv(argv, options);
122
+ let tail = Buffer.alloc(0);
123
+ child.stderr?.on('data', (chunk) => {
124
+ tail = Buffer.concat([tail, chunk]);
125
+ if (tail.length > STDERR_TAIL_BYTES)
126
+ tail = tail.subarray(tail.length - STDERR_TAIL_BYTES);
110
127
  process.stderr.write(chunk);
111
128
  });
129
+ // SHORTCUT: kills the direct child only (the shell or cmd.exe when there is one); on Windows a grandchild can outlive it.
130
+ // A process-tree kill is the upgrade path.
131
+ const timer = setTimeout(() => {
132
+ child.kill('SIGKILL');
133
+ reject(new RunWatchedTimeoutError(deadlineMs, tail.toString('utf8')));
134
+ }, deadlineMs);
112
135
  child.on('close', (code) => {
113
- resolve({
114
- exitCode: code ?? 1,
115
- stderr: Buffer.concat(stderrChunks).toString('utf8'),
116
- });
136
+ clearTimeout(timer);
137
+ resolve({ exitCode: code ?? 1, stderr: tail.toString('utf8') });
117
138
  });
118
139
  child.on('error', (err) => {
140
+ clearTimeout(timer);
119
141
  resolve({ exitCode: 1, stderr: err.message });
120
142
  });
121
143
  });
@@ -123,7 +145,7 @@ export function runWatched(command) {
123
145
  /** Check whether a directory is a git work tree. */
124
146
  export function isGitRepo(cwd) {
125
147
  try {
126
- const raw = execSync('git rev-parse --is-inside-work-tree', {
148
+ const raw = execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {
127
149
  encoding: 'utf8',
128
150
  cwd,
129
151
  timeout: 10000,
@@ -3,12 +3,13 @@ import { execFileSync } from 'child_process';
3
3
  import * as fs from 'fs';
4
4
  import * as os from 'os';
5
5
  import * as path from 'path';
6
- import { DAY_MS } from '../util/time.js';
6
+ import { DAY_MS, MINUTE_MS } from '../util/time.js';
7
7
  import { errorMessage } from '../util/log.js';
8
+ import { isJsonObject, isJsonString } from '../util/json.js';
8
9
  // A `git log --name-status` dump can run to tens of MB; default 1MB pipe would truncate it.
9
10
  const GIT_MAX_BUFFER = 64 * 1024 * 1024;
10
11
  // Longer than the 10 s of one-line git reads because a full log dump on a large repo is slow, yet bounded so a wedged git cannot stall sleep.
11
- const GIT_TIMEOUT_MS = 60_000;
12
+ const GIT_TIMEOUT_MS = MINUTE_MS;
12
13
  /** A real git failure (not git grep's expected exit-1-no-match). Callers abort the whole run on this. */
13
14
  export class GitReadError extends Error {
14
15
  }
@@ -93,9 +94,17 @@ export function packageScriptsAt(repoRoot, rev) {
93
94
  return {};
94
95
  const raw = runGit(['show', `${rev}:package.json`], repoRoot);
95
96
  try {
96
- // SAFETY: optional chaining makes a `null` or scalar package.json read as "no scripts".
97
97
  const parsed = JSON.parse(raw);
98
- return parsed?.scripts ?? {};
98
+ const scripts = isJsonObject(parsed) ? parsed.scripts : undefined;
99
+ if (!isJsonObject(scripts))
100
+ return {};
101
+ const out = {};
102
+ for (const [name, command] of Object.entries(scripts)) {
103
+ if (!isJsonString(command))
104
+ return {};
105
+ out[name] = command;
106
+ }
107
+ return out;
99
108
  }
100
109
  catch (err) {
101
110
  if (err instanceof SyntaxError)
@@ -1,4 +1,5 @@
1
1
  import { MemoryEntry, EmotionalValence } from '../core/memory.js';
2
+ import { type AnthropicMessageFailure } from '../util/anthropic-messages.js';
2
3
  export interface ExtractedFact {
3
4
  content: string;
4
5
  tags: string[];
@@ -8,8 +9,8 @@ export interface ExtractOptions {
8
9
  apiKey: string;
9
10
  model?: string;
10
11
  fetcher?: typeof fetch;
11
- /** Told why a call produced nothing, so callers can surface it instead of guessing. */
12
- onError?: (msg: string) => void;
12
+ /** Told why a call produced nothing, so callers can surface it instead of guessing; `failure` is set when the API call itself failed. */
13
+ onError?: (msg: string, failure?: AnthropicMessageFailure) => void;
13
14
  }
14
15
  export declare function extractFacts(text: string, opts: ExtractOptions): Promise<ExtractedFact[]>;
15
16
  export declare function storeExtractedFacts(hippoRoot: string, source: MemoryEntry, facts: ExtractedFact[]): MemoryEntry[];
@@ -1,20 +1,22 @@
1
1
  import { Layer, createMemory } from '../core/memory.js';
2
2
  import { writeEntry } from '../store/entry-writes.js';
3
3
  import { loadConfig } from '../core/config.js';
4
- import { RejectedValueError } from '../store/rejection.js';
4
+ import { RejectedValueError } from '../core/api-errors.js';
5
5
  import { redactSecretsStrict } from '../util/secret-detect.js';
6
6
  import { describeMessageFailure, sendAnthropicMessage } from '../util/anthropic-messages.js';
7
7
  import { neverAutoShareTags } from '../sharing/share.js';
8
8
  import { errorMessage, log } from '../util/log.js';
9
9
  import { isJsonString } from '../util/json.js';
10
10
  import { certainDefect } from '../core/memory-quality.js';
11
- const EXTRACTION_PROMPT = `You are extracting factual statements from a conversation or memory entry. Extract 1-8 standalone factual statements that would be useful to remember later.
11
+ const EXTRACTION_PROMPT = `You are extracting factual statements from a conversation or memory entry. ` +
12
+ `Extract 1-8 standalone factual statements that would be useful to remember later.
12
13
 
13
14
  Rules:
14
15
  - Each fact must be a complete, standalone sentence
15
16
  - Include the speaker's name in every fact (e.g. "Alice prefers..." not "She prefers...")
16
17
  - Preserve specific details: names, numbers, dates, paths, IDs
17
- - Return a JSON array of objects with: content (string), tags (array of "speaker:X" and "topic:Y" strings), valence ("neutral", "positive", "negative", or "critical")
18
+ - Return a JSON array of objects with: content (string), tags (array of "speaker:X" and "topic:Y" strings), ` +
19
+ `valence ("neutral", "positive", "negative", or "critical")
18
20
  - Return an empty array [] for small talk with no extractable facts
19
21
  - Output ONLY the JSON array, no preamble or explanation
20
22
 
@@ -31,7 +33,7 @@ export async function extractFacts(text, opts) {
31
33
  fetcher: opts.fetcher,
32
34
  });
33
35
  if (!reply.ok) {
34
- opts.onError?.(describeMessageFailure(reply.failure));
36
+ opts.onError?.(describeMessageFailure(reply.failure), reply.failure);
35
37
  return [];
36
38
  }
37
39
  try {
@@ -116,7 +118,7 @@ function buildExtractedEntry(fact, source, inheritedTags, baseHalfLifeDays) {
116
118
  scope: source.scope,
117
119
  // Without it createMemory stamps 'default', and extracted facts leave
118
120
  // the tenant of the episodic memory they were extracted from.
119
- tenantId: source.tenantId,
121
+ tenantId: source.tenant_id,
120
122
  baseHalfLifeDays,
121
123
  }), origin_project: source.origin_project };
122
124
  }
@@ -7,7 +7,8 @@ const FORWARD_CLAIM_PATTERNS = [
7
7
  // Verb + duration tail: requires `<verb> take <N> <unit>`, because a bare `will take` matched `who will take ownership of auth?`.
8
8
  new RegExp(String.raw `\b(?:will|should|gonna|going\s+to)\s+take\s+${DURATION_TAIL}`, 'i'),
9
9
  // Ship + by/in + duration-or-day: a bare `ship in` matched `how does this ship in Docker?`, so a duration tail or literal day-of-week is required.
10
- new RegExp(String.raw `\bship(?:ping|s)?\s+(?:by|in)\s+(?:(?:about|around)\s+)?(?:next\s+)?(?:${DURATION_TAIL}|(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday))\b`, 'i'),
10
+ new RegExp(String.raw `\bship(?:ping|s)?\s+(?:by|in)\s+(?:(?:about|around)\s+)?(?:next\s+)?` +
11
+ String.raw `(?:${DURATION_TAIL}|(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday))\b`, 'i'),
11
12
  /\bestimate(?:d)?\s+(?:at\s+)?(?:~|≈|about|around)?\s*\d+/i,
12
13
  /\b(?:by|in|within)\s+(?:about|around|~)?\s*\d+\s*(?:day|week|month|hour)s?\b/i,
13
14
  /\bETA\s*(?:is|:)?\s*\d+/i,
@@ -17,7 +18,8 @@ const FORWARD_CLAIM_PATTERNS = [
17
18
  /(?<=^|\s)~\s*\d+\s*(?:day|week|month|hour)s?\b/i,
18
19
  // Should + verb + duration tail. Same tightening as the leading 'will
19
20
  // take' rule: 'should ship by EOD' must include a quantifier.
20
- new RegExp(String.raw `\bshould\s+(?:be|ship|finish|complete|land)\s+(?:by|in|within)\s+(?:(?:about|around)\s+)?(?:next\s+)?(?:${DURATION_TAIL}|(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday))\b`, 'i'),
21
+ new RegExp(String.raw `\bshould\s+(?:be|ship|finish|complete|land)\s+(?:by|in|within)\s+(?:(?:about|around)\s+)?(?:next\s+)?` +
22
+ String.raw `(?:${DURATION_TAIL}|(?:monday|tuesday|wednesday|thursday|friday|saturday|sunday))\b`, 'i'),
21
23
  ];
22
24
  /** Pronouns, function words and modal verbs the regex set already gates on; dropped before class resolution so overlap comes from domain tokens. */
23
25
  const STOP_WORDS = new Set([
@@ -1,3 +1,4 @@
1
+ import { type HippoStore } from '../store/port.js';
1
2
  import { type MemoryEntry } from '../core/memory.js';
2
3
  export interface InvalidationTarget {
3
4
  from: string;
@@ -28,7 +29,7 @@ export declare function extractInvalidationTarget(message: string): Invalidation
28
29
  export declare function invalidateMatching(hippoRoot: string, target: InvalidationTarget, tenantId?: string, options?: InvalidationOptions): InvalidationResult;
29
30
  /** invalidateMatching for a batch: matches against `live`, the caller's list of the tenant's rows, and keeps it current.
30
31
  * Each match is read again before it is weakened, so a row another writer changed since the list was read is never written back stale. */
31
- export declare function invalidateMatchingAmong(hippoRoot: string, live: MemoryEntry[], target: InvalidationTarget, tenantId?: string): InvalidationResult;
32
+ export declare function invalidateMatchingAmong(store: HippoStore, live: MemoryEntry[], target: InvalidationTarget, tenantId?: string): Promise<InvalidationResult>;
32
33
  export interface ChurnRefs {
33
34
  paths: string[];
34
35
  symbols: string[];
@@ -1,6 +1,8 @@
1
- import { addTagToEntries, writeEntriesSeparately } from '../store/entry-writes.js';
1
+ import { addTagToEntries, writeEntriesTogether } from '../store/entry-writes.js';
2
2
  import { confirmedOutcomeTimes } from '../store/audit.js';
3
- import { chunked, loadAllEntries, loadEntriesByIds } from '../store/entry-reads.js';
3
+ import { loadAllEntries, loadEntriesMentioning, readEntry } from '../store/entry-reads.js';
4
+ import { requireGroup } from '../store/port.js';
5
+ import { chunked } from '../util/chunked.js';
4
6
  import { CHURN_STALE_TAG } from '../core/memory.js';
5
7
  import { GitReadError, gitLsFilesAtHead, fetchChurnWindowLog, gitGrepPresence, resolveCommitBefore, packageScriptsAt, } from './churn-git.js';
6
8
  const HEADLINE_CHARS = 60;
@@ -46,20 +48,27 @@ export function extractInvalidationTarget(message) {
46
48
  * Tag matching is EXACT: the FULL pattern must equal a tag, so a pattern merely containing a common tag word cannot mass-weaken every memory with that tag. */
47
49
  export function invalidateMatching(hippoRoot, target, tenantId, options) {
48
50
  // tenantId opt-in: when set, only that tenant's memories are weakened; undefined is host-wide.
49
- // options.onlyId filters this tenant-scoped list rather than looking up an id directly, so another tenant's id is invisible here.
50
- const { result, weakened } = weakenMatches(loadAllEntries(hippoRoot, tenantId), target, options);
51
- writeEntriesSeparately(hippoRoot, weakened);
51
+ // The onlyId read is tenant-scoped too, so another tenant's id is invisible here.
52
+ const entries = options?.onlyId === undefined
53
+ ? loadEntriesMentioning(hippoRoot, invalidationTokenize(target.from), target.from.toLowerCase().trim(), tenantId)
54
+ : [readEntry(hippoRoot, options.onlyId, tenantId)].filter((entry) => entry !== null);
55
+ const { result, weakened } = weakenMatches(entries, target, options);
56
+ writeEntriesTogether(hippoRoot, weakened);
52
57
  return result;
53
58
  }
54
59
  /** invalidateMatching for a batch: matches against `live`, the caller's list of the tenant's rows, and keeps it current.
55
60
  * Each match is read again before it is weakened, so a row another writer changed since the list was read is never written back stale. */
56
- export function invalidateMatchingAmong(hippoRoot, live, target, tenantId) {
61
+ export async function invalidateMatchingAmong(store, live, target, tenantId) {
57
62
  const seen = weakenMatches(live, target, { dryRun: true }).result;
58
63
  const ids = [...seen.targets, ...seen.skippedPinned];
59
- // loadEntriesByIds reads at most 500 ids a call.
60
- const fresh = new Map(chunked(ids, 500).flatMap((chunk) => loadEntriesByIds(hippoRoot, chunk, tenantId)).map((entry) => [entry.id, entry]));
64
+ const fresh = new Map();
65
+ // The port reads at most 500 ids a call.
66
+ for (const chunk of chunked(ids, 500))
67
+ for (const entry of await store.entriesByIds(chunk, tenantId))
68
+ fresh.set(entry.id, entry);
61
69
  const { result, weakened } = weakenMatches(ids.flatMap((id) => fresh.get(id) ?? []), target);
62
- writeEntriesSeparately(hippoRoot, weakened);
70
+ if (weakened.length > 0)
71
+ await requireGroup(store, 'lessonWrites').writeTogether(weakened);
63
72
  const byId = new Map(weakened.map((entry) => [entry.id, entry]));
64
73
  for (let i = 0; i < live.length; i++)
65
74
  live[i] = byId.get(live[i].id) ?? live[i];
@@ -1,8 +1,8 @@
1
1
  import { type ToolCall } from './protocol.js';
2
2
  export declare function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }: ToolCall): Promise<string>;
3
- export declare function runStatusTool({ hippoRoot, config, tenantId }: ToolCall): string;
3
+ export declare function runStatusTool({ ctx, hippoRoot, config, tenantId }: ToolCall): string;
4
4
  export declare function runConflictsTool(call: ToolCall): string;
5
5
  export declare function runResolveTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
6
- export declare function runShareTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
6
+ export declare function runShareTool({ args, ctx, hippoRoot, tenantId }: ToolCall): Promise<string>;
7
7
  export declare function runPeersTool({ tenantId }: ToolCall): string;
8
8
  //# sourceMappingURL=admin-tools.d.ts.map