hippo-memory 1.71.0 → 1.72.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 (555) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  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 +1 -1
  12. package/dist/api/audit.d.ts +29 -1
  13. package/dist/api/audit.js +44 -5
  14. package/dist/api/auth.d.ts +7 -4
  15. package/dist/api/auth.js +12 -8
  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-render.js +4 -3
  24. package/dist/api/context-select.js +9 -11
  25. package/dist/api/context.js +17 -8
  26. package/dist/api/continuity.d.ts +47 -0
  27. package/dist/api/continuity.js +66 -0
  28. package/dist/api/dormant.js +4 -2
  29. package/dist/api/drill-down.js +1 -1
  30. package/dist/api/embeddings.d.ts +17 -0
  31. package/dist/api/embeddings.js +28 -0
  32. package/dist/api/error-reply.d.ts +8 -0
  33. package/dist/api/error-reply.js +21 -0
  34. package/dist/api/forget.d.ts +6 -2
  35. package/dist/api/forget.js +18 -7
  36. package/dist/api/goals.d.ts +1 -1
  37. package/dist/api/goals.js +5 -9
  38. package/dist/api/index.d.ts +4 -2
  39. package/dist/api/index.js +4 -2
  40. package/dist/api/instruction-detect.js +5 -1
  41. package/dist/api/learn.d.ts +4 -0
  42. package/dist/api/learn.js +53 -27
  43. package/dist/api/ledger-db.d.ts +2 -6
  44. package/dist/api/ledger-db.js +4 -36
  45. package/dist/api/memories.d.ts +19 -1
  46. package/dist/api/memories.js +39 -0
  47. package/dist/api/objects.d.ts +1 -1
  48. package/dist/api/outcome.js +1 -1
  49. package/dist/api/pilot-arm.d.ts +1 -11
  50. package/dist/api/pilot-arm.js +5 -45
  51. package/dist/api/predictions.d.ts +3 -1
  52. package/dist/api/predictions.js +6 -0
  53. package/dist/api/projects.d.ts +21 -0
  54. package/dist/api/projects.js +24 -0
  55. package/dist/api/promote.js +1 -1
  56. package/dist/api/prompt-hook.d.ts +15 -2
  57. package/dist/api/prompt-hook.js +44 -4
  58. package/dist/api/recall-cli.d.ts +3 -0
  59. package/dist/api/recall-cli.js +13 -4
  60. package/dist/api/recall-core.js +3 -3
  61. package/dist/api/recall-pipeline.js +6 -7
  62. package/dist/api/recall-request.js +1 -1
  63. package/dist/api/recall.d.ts +0 -3
  64. package/dist/api/recall.js +19 -44
  65. package/dist/api/remember-local.js +1 -1
  66. package/dist/api/remember.d.ts +2 -1
  67. package/dist/api/remember.js +3 -2
  68. package/dist/api/session-end.d.ts +22 -0
  69. package/dist/api/session-end.js +101 -0
  70. package/dist/api/sleep-run.d.ts +1 -1
  71. package/dist/api/sleep-run.js +13 -9
  72. package/dist/api/status.d.ts +24 -0
  73. package/dist/api/status.js +40 -0
  74. package/dist/api/store-init.d.ts +4 -0
  75. package/dist/api/store-init.js +9 -0
  76. package/dist/api/tokens.js +1 -1
  77. package/dist/api/types.d.ts +2 -0
  78. package/dist/api/types.js +6 -1
  79. package/dist/capture/caller-session.d.ts +0 -3
  80. package/dist/capture/caller-session.js +1 -12
  81. package/dist/capture/capture-error.d.ts +2 -2
  82. package/dist/capture/capture-error.js +23 -18
  83. package/dist/capture/codex-patch.js +3 -1
  84. package/dist/capture/command.js +36 -95
  85. package/dist/capture/compact.js +10 -5
  86. package/dist/capture/compaction-items-caller.js +11 -20
  87. package/dist/capture/compaction-record.d.ts +7 -93
  88. package/dist/capture/compaction-record.js +29 -426
  89. package/dist/capture/compaction-spool.d.ts +4 -2
  90. package/dist/capture/compaction-spool.js +20 -6
  91. package/dist/capture/copilot-transcript.d.ts +2 -1
  92. package/dist/capture/copilot-transcript.js +2 -1
  93. package/dist/capture/extract.d.ts +5 -2
  94. package/dist/capture/extract.js +4 -3
  95. package/dist/capture/failure-caller.d.ts +1 -1
  96. package/dist/capture/failure-caller.js +21 -16
  97. package/dist/capture/failure-reading.d.ts +2 -1
  98. package/dist/capture/failure-reading.js +7 -9
  99. package/dist/capture/pre-compact-caller.js +5 -4
  100. package/dist/capture/session-digest.js +4 -3
  101. package/dist/capture/session-end-caller.js +2 -1
  102. package/dist/capture/session-worker.js +3 -4
  103. package/dist/capture/transcript.d.ts +2 -1
  104. package/dist/capture/transcript.js +6 -3
  105. package/dist/capture/working-state.d.ts +4 -2
  106. package/dist/capture/working-state.js +4 -2
  107. package/dist/cli/audit-prune.d.ts +0 -25
  108. package/dist/cli/audit-prune.js +1 -27
  109. package/dist/cli/audit.js +13 -13
  110. package/dist/cli/auth.d.ts +1 -1
  111. package/dist/cli/auth.js +12 -13
  112. package/dist/cli/briefs.d.ts +1 -4
  113. package/dist/cli/briefs.js +37 -292
  114. package/dist/cli/card.js +41 -33
  115. package/dist/cli/client.d.ts +5 -0
  116. package/dist/cli/client.js +24 -8
  117. package/dist/cli/compact-resume-payload.js +1 -1
  118. package/dist/cli/context.d.ts +1 -1
  119. package/dist/cli/context.js +12 -12
  120. package/dist/cli/continuity.d.ts +1 -1
  121. package/dist/cli/continuity.js +36 -39
  122. package/dist/cli/curate.d.ts +1 -1
  123. package/dist/cli/curate.js +23 -27
  124. package/dist/cli/dag.d.ts +1 -1
  125. package/dist/cli/dag.js +23 -8
  126. package/dist/cli/decisions.d.ts +0 -2
  127. package/dist/cli/decisions.js +4 -281
  128. package/dist/cli/eval.d.ts +1 -1
  129. package/dist/cli/eval.js +12 -13
  130. package/dist/cli/explain.d.ts +1 -1
  131. package/dist/cli/explain.js +21 -25
  132. package/dist/cli/flag-values.js +16 -6
  133. package/dist/cli/flags.d.ts +0 -289
  134. package/dist/cli/flags.js +3 -138
  135. package/dist/cli/graph.d.ts +3 -0
  136. package/dist/cli/graph.js +83 -0
  137. package/dist/cli/hook-runtime.d.ts +3 -5
  138. package/dist/cli/hook-runtime.js +7 -34
  139. package/dist/cli/incidents.d.ts +3 -0
  140. package/dist/cli/incidents.js +112 -0
  141. package/dist/cli/init.d.ts +1 -1
  142. package/dist/cli/init.js +28 -19
  143. package/dist/cli/install-steps.d.ts +2 -1
  144. package/dist/cli/install-steps.js +11 -3
  145. package/dist/cli/last-sleep.js +1 -1
  146. package/dist/cli/lenient-id.d.ts +2 -0
  147. package/dist/cli/lenient-id.js +13 -0
  148. package/dist/cli/maintenance.d.ts +3 -3
  149. package/dist/cli/maintenance.js +29 -30
  150. package/dist/cli/notes.d.ts +2 -0
  151. package/dist/cli/notes.js +41 -0
  152. package/dist/cli/open-browser.d.ts +14 -0
  153. package/dist/cli/open-browser.js +26 -0
  154. package/dist/cli/playbooks.d.ts +3 -4
  155. package/dist/cli/playbooks.js +126 -290
  156. package/dist/cli/predictions.d.ts +3 -0
  157. package/dist/cli/predictions.js +175 -0
  158. package/dist/cli/print.js +2 -1
  159. package/dist/cli/projects.js +30 -22
  160. package/dist/cli/quality-repair-once.d.ts +1 -1
  161. package/dist/cli/quality-repair-once.js +6 -5
  162. package/dist/cli/recall.js +13 -7
  163. package/dist/cli/refine-llm.js +17 -17
  164. package/dist/cli/remember.js +12 -12
  165. package/dist/cli/scheduler.js +2 -1
  166. package/dist/cli/serve.js +3 -3
  167. package/dist/cli/session-hooks.d.ts +1 -1
  168. package/dist/cli/session-hooks.js +45 -115
  169. package/dist/cli/setup.d.ts +1 -1
  170. package/dist/cli/setup.js +17 -10
  171. package/dist/cli/shared.d.ts +2 -6
  172. package/dist/cli/shared.js +9 -29
  173. package/dist/cli/sleep-render.js +6 -3
  174. package/dist/cli/sleep.js +6 -37
  175. package/dist/cli/status.d.ts +3 -3
  176. package/dist/cli/status.js +32 -35
  177. package/dist/cli/transfer.d.ts +1 -1
  178. package/dist/cli/transfer.js +33 -31
  179. package/dist/cli/usage.d.ts +0 -79
  180. package/dist/cli/usage.js +1 -695
  181. package/dist/cli/verb-row.d.ts +32 -0
  182. package/dist/cli/verb-row.js +6 -0
  183. package/dist/cli/verbs/health.d.ts +27 -0
  184. package/dist/cli/verbs/health.js +232 -0
  185. package/dist/cli/verbs/memory.d.ts +16 -0
  186. package/dist/cli/verbs/memory.js +244 -0
  187. package/dist/cli/verbs/objects.d.ts +20 -0
  188. package/dist/cli/verbs/objects.js +254 -0
  189. package/dist/cli/verbs/sessions.d.ts +31 -0
  190. package/dist/cli/verbs/sessions.js +312 -0
  191. package/dist/cli/verbs.d.ts +81 -0
  192. package/dist/cli/verbs.js +7 -0
  193. package/dist/cli/versioned-verbs.d.ts +51 -0
  194. package/dist/cli/versioned-verbs.js +79 -0
  195. package/dist/cli.d.ts +1 -272
  196. package/dist/cli.js +23 -313
  197. package/dist/connectors/dlq.d.ts +39 -3
  198. package/dist/connectors/dlq.js +37 -3
  199. package/dist/connectors/github/backfill.js +12 -3
  200. package/dist/connectors/github/dlq.js +31 -73
  201. package/dist/connectors/github/ingest.d.ts +2 -6
  202. package/dist/connectors/github/ingest.js +3 -28
  203. package/dist/connectors/github/webhook.d.ts +2 -1
  204. package/dist/connectors/github/webhook.js +33 -2
  205. package/dist/connectors/ingest.d.ts +10 -0
  206. package/dist/connectors/ingest.js +28 -0
  207. package/dist/connectors/slack/dlq.js +49 -71
  208. package/dist/connectors/slack/ingest.d.ts +2 -6
  209. package/dist/connectors/slack/ingest.js +2 -27
  210. package/dist/connectors/slack/webhook.d.ts +2 -1
  211. package/dist/connectors/slack/webhook.js +2 -1
  212. package/dist/consolidate/conflicts.js +1 -1
  213. package/dist/consolidate/dag.js +15 -9
  214. package/dist/consolidate/dedupe.d.ts +7 -0
  215. package/dist/consolidate/dedupe.js +5 -3
  216. package/dist/consolidate/llm-passes.js +45 -19
  217. package/dist/consolidate/memory-value.js +2 -1
  218. package/dist/consolidate/merge.js +2 -2
  219. package/dist/consolidate/physics-pass.d.ts +6 -1
  220. package/dist/consolidate/physics-pass.js +26 -6
  221. package/dist/consolidate/replay.js +11 -4
  222. package/dist/consolidate/sleep.js +8 -5
  223. package/dist/consolidate/traces.js +3 -3
  224. package/dist/core/ablation.d.ts +10 -0
  225. package/dist/core/ablation.js +12 -0
  226. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  227. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  228. package/dist/core/ambient.d.ts +4 -0
  229. package/dist/core/ambient.js +39 -18
  230. package/dist/core/api-errors.d.ts +16 -0
  231. package/dist/core/api-errors.js +20 -0
  232. package/dist/core/card.js +3 -1
  233. package/dist/core/compaction-timing.d.ts +7 -0
  234. package/dist/core/compaction-timing.js +9 -0
  235. package/dist/core/config.d.ts +1 -1
  236. package/dist/core/config.js +7 -2
  237. package/dist/core/cosine.d.ts +3 -0
  238. package/dist/core/cosine.js +19 -0
  239. package/dist/{store → core}/markdown.d.ts +1 -1
  240. package/dist/{store → core}/markdown.js +2 -2
  241. package/dist/core/memory-audit.d.ts +17 -0
  242. package/dist/core/memory-audit.js +54 -0
  243. package/dist/core/memory.d.ts +10 -4
  244. package/dist/core/memory.js +25 -18
  245. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  246. package/dist/{consolidate → core}/merged-row.js +1 -1
  247. package/dist/core/physics.js +6 -16
  248. package/dist/core/prediction.d.ts +3 -0
  249. package/dist/core/prediction.js +6 -0
  250. package/dist/core/project-identity.d.ts +3 -0
  251. package/dist/core/project-identity.js +10 -1
  252. package/dist/{store → core}/recall-scope.d.ts +1 -10
  253. package/dist/{store → core}/recall-scope.js +2 -19
  254. package/dist/db/busy.d.ts +2 -7
  255. package/dist/db/busy.js +21 -26
  256. package/dist/db/connect.d.ts +0 -1
  257. package/dist/db/connect.js +5 -6
  258. package/dist/db/index.d.ts +3 -3
  259. package/dist/db/index.js +3 -3
  260. package/dist/db/migrations/index.d.ts +1 -1
  261. package/dist/db/migrations/index.js +3 -1
  262. package/dist/db/migrations/v55.d.ts +3 -0
  263. package/dist/db/migrations/v55.js +17 -0
  264. package/dist/db/open.d.ts +0 -2
  265. package/dist/db/open.js +6 -10
  266. package/dist/db/physics-state.js +3 -3
  267. package/dist/db/tables.d.ts +2 -0
  268. package/dist/db/tables.js +6 -2
  269. package/dist/db/vector-store.js +17 -4
  270. package/dist/db/wal-checkpointer.js +2 -1
  271. package/dist/doctor.js +11 -8
  272. package/dist/embeddings/local.d.ts +62 -0
  273. package/dist/embeddings/local.js +146 -0
  274. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  275. package/dist/{store/embeddings → embeddings}/provider.js +18 -15
  276. package/dist/embeddings/transformers.d.ts +26 -0
  277. package/dist/embeddings/transformers.js +89 -0
  278. package/dist/entry/session-text.d.ts +1 -1
  279. package/dist/entry/session-text.js +1 -1
  280. package/dist/eval/eval-suite.js +17 -11
  281. package/dist/eval/eval.js +1 -1
  282. package/dist/eval/judgment.js +11 -4
  283. package/dist/graph/extract.js +3 -3
  284. package/dist/graph/recall.js +1 -1
  285. package/dist/graph/view.js +13 -5
  286. package/dist/graph/write.d.ts +1 -1
  287. package/dist/graph/write.js +9 -9
  288. package/dist/hooks/codex-session.js +3 -2
  289. package/dist/hooks/codex-wrapper.js +2 -1
  290. package/dist/hooks/json-hooks.js +4 -2
  291. package/dist/hooks/opencode.js +8 -5
  292. package/dist/hooks/shared.d.ts +0 -6
  293. package/dist/hooks/shared.js +4 -15
  294. package/dist/importers/core.js +1 -1
  295. package/dist/importers/sources.js +5 -4
  296. package/dist/importers/vault.js +7 -5
  297. package/dist/index.d.ts +3 -2
  298. package/dist/index.js +3 -2
  299. package/dist/learn/autolearn.d.ts +10 -2
  300. package/dist/learn/autolearn.js +32 -12
  301. package/dist/learn/churn-git.js +13 -4
  302. package/dist/learn/extract.d.ts +3 -2
  303. package/dist/learn/extract.js +6 -4
  304. package/dist/learn/forward-claim-detector.js +4 -2
  305. package/dist/learn/invalidation.js +10 -6
  306. package/dist/mcp/admin-tools.d.ts +2 -2
  307. package/dist/mcp/admin-tools.js +27 -48
  308. package/dist/mcp/format.js +3 -2
  309. package/dist/mcp/framing.d.ts +1 -0
  310. package/dist/mcp/framing.js +1 -1
  311. package/dist/mcp/memory-tools.js +3 -1
  312. package/dist/mcp/protocol.d.ts +11 -7
  313. package/dist/mcp/protocol.js +25 -12
  314. package/dist/mcp/recall-tools.js +12 -9
  315. package/dist/mcp/request.js +2 -1
  316. package/dist/mcp/stdio.js +24 -8
  317. package/dist/mcp/tool-args.js +2 -1
  318. package/dist/mcp/tools.js +44 -21
  319. package/dist/objects/customer-notes.d.ts +2 -2
  320. package/dist/objects/decisions.d.ts +2 -2
  321. package/dist/objects/descriptor.d.ts +1 -1
  322. package/dist/objects/incidents.d.ts +2 -2
  323. package/dist/objects/lifecycle.d.ts +1 -1
  324. package/dist/objects/lifecycle.js +2 -1
  325. package/dist/objects/policies.d.ts +2 -2
  326. package/dist/objects/policies.js +2 -1
  327. package/dist/objects/processes.d.ts +2 -2
  328. package/dist/objects/project-briefs.d.ts +2 -2
  329. package/dist/objects/project-briefs.js +2 -3
  330. package/dist/objects/skills.d.ts +2 -2
  331. package/dist/postinstall.js +1 -1
  332. package/dist/rerankers/clef.js +3 -6
  333. package/dist/rerankers/cross-encoder.d.ts +31 -2
  334. package/dist/rerankers/cross-encoder.js +63 -97
  335. package/dist/rerankers/index.js +5 -4
  336. package/dist/rerankers/jev.js +2 -4
  337. package/dist/rerankers/outage-warning.d.ts +3 -1
  338. package/dist/rerankers/outage-warning.js +5 -3
  339. package/dist/search/bm25-search.js +1 -1
  340. package/dist/search/boosts.js +1 -1
  341. package/dist/search/embed-memories.d.ts +9 -0
  342. package/dist/search/embed-memories.js +377 -0
  343. package/dist/search/goal-boost.d.ts +1 -1
  344. package/dist/search/goal-boost.js +6 -3
  345. package/dist/search/hybrid.d.ts +9 -2
  346. package/dist/search/hybrid.js +9 -4
  347. package/dist/search/physics-search.d.ts +6 -3
  348. package/dist/search/physics-search.js +22 -15
  349. package/dist/search/rerank.js +1 -1
  350. package/dist/search/vector.d.ts +8 -6
  351. package/dist/search/vector.js +10 -13
  352. package/dist/server/auth.d.ts +2 -0
  353. package/dist/server/auth.js +17 -7
  354. package/dist/server/boot.js +7 -66
  355. package/dist/server/client-ip.d.ts +0 -2
  356. package/dist/server/client-ip.js +3 -2
  357. package/dist/server/deadline.d.ts +0 -2
  358. package/dist/server/deadline.js +1 -7
  359. package/dist/server/defaults.d.ts +1 -0
  360. package/dist/server/defaults.js +1 -0
  361. package/dist/server/mcp-http.js +16 -11
  362. package/dist/server/request.js +7 -2
  363. package/dist/server/route-checks.d.ts +7 -0
  364. package/dist/server/route-checks.js +42 -0
  365. package/dist/server/route-table.d.ts +9 -8
  366. package/dist/server/route-table.js +127 -132
  367. package/dist/server/routes/admin.d.ts +8 -8
  368. package/dist/server/routes/admin.js +13 -21
  369. package/dist/server/routes/customer-notes.d.ts +6 -6
  370. package/dist/server/routes/customer-notes.js +1 -2
  371. package/dist/server/routes/decisions.d.ts +6 -6
  372. package/dist/server/routes/decisions.js +2 -4
  373. package/dist/server/routes/incidents.d.ts +6 -6
  374. package/dist/server/routes/incidents.js +2 -5
  375. package/dist/server/routes/memories.d.ts +9 -9
  376. package/dist/server/routes/memories.js +15 -38
  377. package/dist/server/routes/object-routes.d.ts +6 -6
  378. package/dist/server/routes/object-routes.js +4 -7
  379. package/dist/server/routes/policies.d.ts +7 -7
  380. package/dist/server/routes/policies.js +2 -4
  381. package/dist/server/routes/predictions.d.ts +6 -6
  382. package/dist/server/routes/predictions.js +9 -13
  383. package/dist/server/routes/processes.d.ts +6 -6
  384. package/dist/server/routes/processes.js +1 -2
  385. package/dist/server/routes/project-briefs.d.ts +7 -7
  386. package/dist/server/routes/project-briefs.js +2 -4
  387. package/dist/server/routes/recall.d.ts +5 -5
  388. package/dist/server/routes/recall.js +6 -10
  389. package/dist/server/routes/skills.d.ts +7 -7
  390. package/dist/server/routes/skills.js +2 -4
  391. package/dist/server/server-detect.d.ts +7 -1
  392. package/dist/server/server-detect.js +36 -11
  393. package/dist/server/sleep-child.js +26 -7
  394. package/dist/server/sleep-offload.d.ts +11 -5
  395. package/dist/server/sleep-offload.js +17 -11
  396. package/dist/server/types.d.ts +22 -10
  397. package/dist/server/validation.d.ts +1 -2
  398. package/dist/server/validation.js +6 -11
  399. package/dist/server.d.ts +5 -4
  400. package/dist/server.js +5 -4
  401. package/dist/sharing/global-store.js +2 -2
  402. package/dist/sharing/global-sync.js +38 -45
  403. package/dist/sharing/project-merge.d.ts +7 -14
  404. package/dist/sharing/project-merge.js +57 -121
  405. package/dist/sharing/search-both.js +1 -1
  406. package/dist/sharing/share.d.ts +2 -0
  407. package/dist/sharing/share.js +37 -34
  408. package/dist/store/ambient.js +5 -6
  409. package/dist/store/audit-event.d.ts +1 -1
  410. package/dist/store/audit.d.ts +0 -16
  411. package/dist/store/audit.js +4 -55
  412. package/dist/store/auth.d.ts +4 -2
  413. package/dist/store/auth.js +7 -3
  414. package/dist/store/candidates.d.ts +3 -2
  415. package/dist/store/candidates.js +42 -23
  416. package/dist/store/capture-write.d.ts +17 -0
  417. package/dist/store/capture-write.js +35 -0
  418. package/dist/store/cards.js +1 -1
  419. package/dist/store/compaction-caller.d.ts +18 -0
  420. package/dist/store/compaction-caller.js +29 -0
  421. package/dist/store/compactions-record.d.ts +115 -0
  422. package/dist/store/compactions-record.js +417 -0
  423. package/dist/store/compactions.js +6 -4
  424. package/dist/store/conflicts.js +7 -4
  425. package/dist/store/connectors/dlq.d.ts +10 -0
  426. package/dist/store/connectors/dlq.js +32 -0
  427. package/dist/store/connectors/github.d.ts +7 -9
  428. package/dist/store/connectors/github.js +30 -53
  429. package/dist/store/connectors/slack.d.ts +2 -11
  430. package/dist/store/connectors/slack.js +18 -47
  431. package/dist/store/dashboard-reads.js +7 -6
  432. package/dist/store/delete-and-batch.d.ts +6 -0
  433. package/dist/store/delete-and-batch.js +36 -3
  434. package/dist/store/delivery-recorder.d.ts +10 -3
  435. package/dist/store/delivery-recorder.js +12 -5
  436. package/dist/store/descendant-page.js +6 -3
  437. package/dist/store/dormant.d.ts +1 -1
  438. package/dist/store/dormant.js +3 -1
  439. package/dist/store/embeddings/index.d.ts +2 -12
  440. package/dist/store/embeddings/index.js +5 -374
  441. package/dist/store/entry-reads.d.ts +13 -4
  442. package/dist/store/entry-reads.js +47 -11
  443. package/dist/store/entry-writes.d.ts +5 -5
  444. package/dist/store/entry-writes.js +32 -12
  445. package/dist/store/failure-log-at.d.ts +8 -0
  446. package/dist/store/failure-log-at.js +16 -0
  447. package/dist/store/failure-log.d.ts +2 -2
  448. package/dist/store/failure-log.js +5 -3
  449. package/dist/{trust → store}/gated-write.d.ts +3 -1
  450. package/dist/{trust → store}/gated-write.js +7 -5
  451. package/dist/store/goals.js +20 -18
  452. package/dist/store/graph-reads.js +4 -2
  453. package/dist/store/graph-writes.d.ts +6 -6
  454. package/dist/store/graph-writes.js +48 -71
  455. package/dist/store/handoffs.d.ts +1 -1
  456. package/dist/store/handoffs.js +6 -6
  457. package/dist/store/index-and-stats.js +2 -2
  458. package/dist/store/key-writes.js +1 -1
  459. package/dist/store/ledger-turn.d.ts +9 -0
  460. package/dist/store/ledger-turn.js +38 -0
  461. package/dist/store/mirrors.js +10 -6
  462. package/dist/store/open.d.ts +0 -4
  463. package/dist/store/open.js +40 -53
  464. package/dist/store/pilot-arm.d.ts +12 -0
  465. package/dist/store/pilot-arm.js +42 -0
  466. package/dist/store/port.d.ts +9 -3
  467. package/dist/store/port.js +8 -0
  468. package/dist/store/predictions.d.ts +1 -2
  469. package/dist/store/predictions.js +3 -6
  470. package/dist/store/project-tags.d.ts +62 -0
  471. package/dist/store/project-tags.js +67 -0
  472. package/dist/store/quarantine.js +2 -1
  473. package/dist/store/recall-trace.d.ts +2 -0
  474. package/dist/store/recall-trace.js +18 -2
  475. package/dist/store/rejected-values.js +2 -1
  476. package/dist/store/rejection-probe.d.ts +4 -0
  477. package/dist/store/rejection-probe.js +19 -0
  478. package/dist/store/rejection.d.ts +0 -17
  479. package/dist/store/rejection.js +1 -21
  480. package/dist/store/rule-sql.d.ts +9 -0
  481. package/dist/store/rule-sql.js +21 -2
  482. package/dist/store/search-rows.js +9 -4
  483. package/dist/store/sessions.js +4 -2
  484. package/dist/store/set-aside.d.ts +14 -0
  485. package/dist/store/set-aside.js +23 -0
  486. package/dist/store/sqlite/busy.d.ts +3 -0
  487. package/dist/store/sqlite/busy.js +8 -0
  488. package/dist/store/sqlite/connector-events-group.js +4 -7
  489. package/dist/store/sqlite/connector-writes-group.js +3 -3
  490. package/dist/store/sqlite/entry-writes-group.js +2 -2
  491. package/dist/store/sqlite/error-codec.js +4 -3
  492. package/dist/store/sqlite/executor.js +10 -4
  493. package/dist/store/sqlite/graph-reads-group.js +1 -1
  494. package/dist/store/sqlite/held-connection.d.ts +9 -0
  495. package/dist/store/sqlite/held-connection.js +41 -0
  496. package/dist/store/sqlite/object-rows.d.ts +1 -1
  497. package/dist/store/sqlite/objects-group.d.ts +1 -1
  498. package/dist/store/sqlite/objects-group.js +1 -1
  499. package/dist/store/sqlite/store.js +14 -12
  500. package/dist/store/summaries.d.ts +3 -3
  501. package/dist/store/summaries.js +5 -4
  502. package/dist/store/token-ledger.d.ts +0 -7
  503. package/dist/store/token-ledger.js +0 -35
  504. package/dist/store/vector-index.js +3 -2
  505. package/dist/support-bundle.js +2 -3
  506. package/dist/trust/reject-flow.js +2 -2
  507. package/dist/util/agent-homes.d.ts +15 -0
  508. package/dist/util/agent-homes.js +34 -0
  509. package/dist/util/anthropic-messages.d.ts +3 -0
  510. package/dist/util/anthropic-messages.js +22 -5
  511. package/dist/util/chunked.d.ts +3 -0
  512. package/dist/util/chunked.js +10 -0
  513. package/dist/util/ellipsize.d.ts +3 -0
  514. package/dist/util/ellipsize.js +5 -0
  515. package/dist/util/env.d.ts +2 -1
  516. package/dist/util/env.js +2 -1
  517. package/dist/util/format.d.ts +3 -0
  518. package/dist/util/format.js +6 -0
  519. package/dist/util/hook-payload.d.ts +8 -0
  520. package/dist/util/hook-payload.js +37 -0
  521. package/dist/util/http-retry.d.ts +6 -0
  522. package/dist/util/http-retry.js +43 -5
  523. package/dist/util/http-util.d.ts +0 -8
  524. package/dist/util/http-util.js +10 -21
  525. package/dist/util/limits.d.ts +7 -0
  526. package/dist/util/limits.js +14 -0
  527. package/dist/util/log.d.ts +4 -0
  528. package/dist/util/log.js +9 -0
  529. package/dist/util/request-scope.d.ts +3 -1
  530. package/dist/util/request-scope.js +11 -6
  531. package/dist/util/secret-detect.js +6 -1
  532. package/dist/util/sqlite-blocked.d.ts +2 -0
  533. package/dist/util/sqlite-blocked.js +5 -0
  534. package/dist/util/stream-tee.d.ts +3 -0
  535. package/dist/util/stream-tee.js +35 -0
  536. package/dist/util/time.d.ts +4 -0
  537. package/dist/util/time.js +4 -0
  538. package/dist/util/version.d.ts +1 -1
  539. package/dist/util/version.js +1 -1
  540. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  541. package/extensions/openclaw-plugin/package.json +1 -1
  542. package/openclaw.plugin.json +1 -1
  543. package/package.json +2 -2
  544. package/dist/store/embeddings/local.d.ts +0 -15
  545. package/dist/store/embeddings/local.js +0 -175
  546. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  547. /package/dist/{cli → api}/correction-latency.js +0 -0
  548. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  549. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  550. /package/dist/{store → core}/object-types.d.ts +0 -0
  551. /package/dist/{store → core}/object-types.js +0 -0
  552. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  553. /package/dist/{capture → util}/compaction-items.js +0 -0
  554. /package/dist/{store → util}/yaml.d.ts +0 -0
  555. /package/dist/{store → util}/yaml.js +0 -0
@@ -0,0 +1,89 @@
1
+ // The optional Transformers.js package, and a bounded load of a model from it, shared by the local embedder and the cross-encoder.
2
+ import { MINUTE_MS } from '../util/time.js';
3
+ import { createRequire } from 'node:module';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { errorCode, errorMessage } from '../util/log.js';
6
+ const _require = createRequire(import.meta.url);
7
+ // Importing both loads two onnxruntime-node builds whose finalizers can double-free on exit, so one is picked:
8
+ // the maintained package hippo ships, with Xenova only as a fallback a user installed.
9
+ const TRANSFORMERS_PACKAGES = ['@huggingface/transformers', '@xenova/transformers'];
10
+ /** The installed package to import, or null when neither is installed. */
11
+ export function resolveTransformersPackage() {
12
+ for (const name of TRANSFORMERS_PACKAGES) {
13
+ const url = entryUrl(name);
14
+ if (url)
15
+ return { name, url };
16
+ }
17
+ return null;
18
+ }
19
+ function entryUrl(name) {
20
+ try {
21
+ return import.meta.resolve(name);
22
+ }
23
+ catch {
24
+ // import.meta.resolve is missing under some module runners (vitest's included), so the require-based resolve stands in there.
25
+ try {
26
+ return pathToFileURL(_require.resolve(name)).href;
27
+ }
28
+ catch {
29
+ return null; // not installed; the caller tries the next package
30
+ }
31
+ }
32
+ }
33
+ /** The package's module namespace, typed by the parts the caller reads; null when neither package is installed. */
34
+ export async function importTransformers() {
35
+ const pkg = resolveTransformersPackage();
36
+ if (!pkg)
37
+ return null;
38
+ try {
39
+ return { name: pkg.name, mod: await import(/* @vite-ignore */ pkg.url) };
40
+ }
41
+ catch (err) {
42
+ // A Node error's code (ERR_MODULE_NOT_FOUND and the like) says more than its message alone.
43
+ const code = errorCode(err);
44
+ throw new Error(`transformers import failed (${pkg.name}): ${code ? `${code} ` : ''}${errorMessage(err)}`, { cause: err });
45
+ }
46
+ }
47
+ // A quantized MiniLM is about 23 MB, so two minutes is a 1.5 Mbit/s link; a load from disk takes about a second.
48
+ // The backoff matches the reranker outage warning's repeat window, so each window has one attempt and one warning.
49
+ export const MODEL_LOAD_POLICY = { timeoutMs: 2 * MINUTE_MS, backoffMs: 5 * MINUTE_MS };
50
+ /** One load per key at a time, bounded by the policy's timeout; `onFailure` hears each failed attempt, so once per backoff window. */
51
+ export function createModelLoads(policy, onFailure) {
52
+ const loaded = new Map();
53
+ const inFlight = new Map();
54
+ const failed = new Map();
55
+ const attempt = (key, start) => new Promise((resolve, reject) => {
56
+ const timer = setTimeout(() => reject(new Error(`${key} did not load within ${policy.timeoutMs / 1000} s`)), policy.timeoutMs);
57
+ timer.unref();
58
+ Promise.resolve().then(start).then((model) => {
59
+ clearTimeout(timer);
60
+ loaded.set(key, model);
61
+ failed.delete(key);
62
+ resolve(model);
63
+ }, (err) => {
64
+ clearTimeout(timer);
65
+ reject(err instanceof Error ? err : new Error(errorMessage(err)));
66
+ });
67
+ });
68
+ return {
69
+ load(key, start) {
70
+ const model = loaded.get(key);
71
+ if (model !== undefined)
72
+ return Promise.resolve(model);
73
+ const pending = inFlight.get(key);
74
+ if (pending)
75
+ return pending;
76
+ const failure = failed.get(key);
77
+ if (failure && Date.now() < failure.until)
78
+ return Promise.reject(failure.error);
79
+ const next = attempt(key, start).catch((err) => {
80
+ failed.set(key, { error: err, until: Date.now() + policy.backoffMs });
81
+ onFailure?.(key, err);
82
+ throw err;
83
+ }).finally(() => inFlight.delete(key));
84
+ inFlight.set(key, next);
85
+ return next;
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=transformers.js.map
@@ -3,5 +3,5 @@ export { scrubForSharing } from '../capture/share-scrub.js';
3
3
  export { transcriptWorkingState, WORKING_STATE_CAPS } from '../capture/working-state.js';
4
4
  export { lessonFromFailure, failureReport, type FailureReport } from '../capture/failure-reading.js';
5
5
  export { collectHandoffEvidence } from '../capture/handoff-evidence.js';
6
- export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../capture/compaction-items.js';
6
+ export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../util/compaction-items.js';
7
7
  //# sourceMappingURL=session-text.d.ts.map
@@ -5,5 +5,5 @@ export { scrubForSharing } from '../capture/share-scrub.js';
5
5
  export { transcriptWorkingState, WORKING_STATE_CAPS } from '../capture/working-state.js';
6
6
  export { lessonFromFailure, failureReport } from '../capture/failure-reading.js';
7
7
  export { collectHandoffEvidence } from '../capture/handoff-evidence.js';
8
- export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../capture/compaction-items.js';
8
+ export { compactSummaryBody, parseCompactionItems, COMPACTION_ITEM_MAX_CHARS, COMPACTION_ITEM_ROW_CAP } from '../util/compaction-items.js';
9
9
  //# sourceMappingURL=session-text.js.map
@@ -5,6 +5,7 @@ import { search } from '../search/bm25-search.js';
5
5
  import { multihopSearch } from '../search/multihop.js';
6
6
  import { mrr, recallAtK, ndcgAtK } from './eval.js';
7
7
  import { DAY_MS } from '../util/time.js';
8
+ import { pct } from '../util/format.js';
8
9
  const BASE_DATE = new Date('2026-01-15T10:00:00Z');
9
10
  function dateOffset(days) {
10
11
  const d = new Date(BASE_DATE.getTime() + days * DAY_MS);
@@ -51,19 +52,24 @@ function addDirectRecall(entries, cases) {
51
52
  }
52
53
  /** Extraction preference: extracted facts should rank above raw source. */
53
54
  function addExtractionPreference(entries, cases) {
54
- entries.push(mem('ep-src-1', 'speaker:Alice: So we had this big meeting yesterday about the deployment pipeline and Bob mentioned that the staging environment is using Kubernetes 1.28 and we should upgrade to 1.30 before the end of Q2 because of the security patches', {
55
+ entries.push(mem('ep-src-1', 'speaker:Alice: So we had this big meeting yesterday about the deployment pipeline and Bob mentioned that the staging environment is ' +
56
+ 'using Kubernetes 1.28 and we should upgrade to 1.30 before the end of Q2 because of the security patches', {
55
57
  created: dateOffset(10), tags: ['speaker:Alice', 'topic:infrastructure', 'session:meeting-1'],
56
58
  }), mem('ep-ext-1', 'The staging environment runs Kubernetes 1.28 and needs to be upgraded to 1.30 before end of Q2 for security patches', {
57
59
  created: dateOffset(10), layer: Layer.Semantic, tags: ['speaker:Alice', 'topic:infrastructure', 'extracted'],
58
60
  extracted_from: 'ep-src-1',
59
- }), mem('ep-src-2', 'speaker:Bob: Yeah and the thing about the monitoring is that we switched from Datadog to Grafana last month and the alerting rules still need to be migrated, Carol was supposed to handle that but she has been busy with the frontend rewrite', {
61
+ }), mem('ep-src-2', 'speaker:Bob: Yeah and the thing about the monitoring is that we switched from Datadog to Grafana last month and the alerting rules ' +
62
+ 'still need to be migrated, Carol was supposed to handle that but she has been busy with the frontend rewrite', {
60
63
  created: dateOffset(11), tags: ['speaker:Bob', 'topic:monitoring', 'session:meeting-1'],
61
- }), mem('ep-ext-2', 'The team switched from Datadog to Grafana last month but alerting rules have not been migrated yet. Carol is responsible but blocked by the frontend rewrite.', {
64
+ }), mem('ep-ext-2', 'The team switched from Datadog to Grafana last month but alerting rules have not been migrated yet. Carol is responsible but blocked ' +
65
+ 'by the frontend rewrite.', {
62
66
  created: dateOffset(11), layer: Layer.Semantic, tags: ['speaker:Bob', 'topic:monitoring', 'extracted'],
63
67
  extracted_from: 'ep-src-2',
64
- }), mem('ep-src-3', 'speaker:Carol: The login page redesign is almost done, I just need to wire up the OAuth2 PKCE flow with the new identity provider and write the integration tests', {
68
+ }), mem('ep-src-3', 'speaker:Carol: The login page redesign is almost done, I just need to wire up the OAuth2 PKCE flow with the new identity provider and ' +
69
+ 'write the integration tests', {
65
70
  created: dateOffset(12), tags: ['speaker:Carol', 'topic:auth', 'session:meeting-2'],
66
- }), mem('ep-ext-3', 'Carol is nearly done with the login page redesign. Remaining work: wire up OAuth2 PKCE flow with the new identity provider and write integration tests.', {
71
+ }), mem('ep-ext-3', 'Carol is nearly done with the login page redesign. Remaining work: wire up OAuth2 PKCE flow with the new identity provider and write ' +
72
+ 'integration tests.', {
67
73
  created: dateOffset(12), layer: Layer.Semantic, tags: ['speaker:Carol', 'topic:auth', 'extracted'],
68
74
  extracted_from: 'ep-src-3',
69
75
  }));
@@ -89,7 +95,8 @@ function addDagDrilldown(entries, cases) {
89
95
  }), mem('dag-child-3', 'Batch API endpoint /reports/generate takes 8 seconds because it runs synchronously instead of using a job queue', {
90
96
  created: dateOffset(15), layer: Layer.Semantic, tags: ['topic:api-performance', 'extracted'],
91
97
  dag_level: 1,
92
- }), mem('dag-summary-1', 'API performance issues: /users degraded to 300ms (permissions check), /orders spiked to 500ms (missing index), /reports takes 8s (needs job queue)', {
98
+ }), mem('dag-summary-1', 'API performance issues: /users degraded to 300ms (permissions check), /orders spiked to 500ms (missing index), /reports takes 8s ' +
99
+ '(needs job queue)', {
93
100
  created: dateOffset(16), layer: Layer.Semantic, tags: ['topic:api-performance'],
94
101
  dag_level: 2, dag_parent_id: undefined,
95
102
  }));
@@ -171,7 +178,8 @@ function addMultiHop(entries, cases) {
171
178
  created: dateOffset(26), tags: ['speaker:Bob', 'topic:payments'],
172
179
  }), mem('mh-3', 'speaker:Alice fixed the Stripe webhook by switching to the production secret key. Payment confirmations now arrive within 2 seconds.', {
173
180
  created: dateOffset(27), tags: ['speaker:Alice', 'topic:payments'],
174
- }), mem('mh-4', 'speaker:Carol reported that the billing dashboard shows incorrect revenue numbers because it reads from the payments_raw table instead of payments_reconciled.', {
181
+ }), mem('mh-4', 'speaker:Carol reported that the billing dashboard shows incorrect revenue numbers because it reads from the payments_raw table instead of ' +
182
+ 'payments_reconciled.', {
175
183
  created: dateOffset(28), tags: ['speaker:Carol', 'topic:billing'],
176
184
  }));
177
185
  cases.push({
@@ -286,9 +294,6 @@ export function resultToBaseline(result) {
286
294
  overall: result.overall,
287
295
  };
288
296
  }
289
- function pct(n) {
290
- return (n * 100).toFixed(1) + '%';
291
- }
292
297
  function pad(s, w) {
293
298
  return s.padEnd(w);
294
299
  }
@@ -315,7 +320,8 @@ export function formatResult(result, baseline) {
315
320
  vsBaseline = deltaStr(delta);
316
321
  verdict = delta < -REGRESSION_THRESHOLD ? 'REGRESS' : 'PASS';
317
322
  }
318
- lines.push(`${pad(feat.category, 24)} | ${pad(pct(feat.mrr), 8)} | ${pad(pct(feat.recallAt5), 8)} | ${pad(pct(feat.ndcgAt5), 8)} | ${pad(vsBaseline, 12)} | ${verdict}`);
323
+ const cells = [pad(feat.category, 24), pad(pct(feat.mrr), 8), pad(pct(feat.recallAt5), 8), pad(pct(feat.ndcgAt5), 8), pad(vsBaseline, 12), verdict];
324
+ lines.push(cells.join(' | '));
319
325
  }
320
326
  lines.push('');
321
327
  lines.push(`Overall: MRR ${pct(result.overall.mrr)} | R@5 ${pct(result.overall.recallAt5)} | NDCG@5 ${pct(result.overall.ndcgAt5)}`);
package/dist/eval/eval.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * It exists so MMR lambda, embedding weights and scoring tweaks are tuned against evidence instead of intuition. */
3
3
  import { hybridSearch } from '../search/hybrid.js';
4
4
  import { searchBothHybrid } from '../sharing/search-both.js';
5
- import { isInitialized } from '../store/open.js';
5
+ import { isInitialized } from '../core/project-identity.js';
6
6
  // Generous so metrics are not truncated.
7
7
  const DEFAULT_EVAL_BUDGET = 100_000;
8
8
  const QUERY_WORDS = 8;
@@ -2,7 +2,7 @@
2
2
  * Regex picks WHAT is a candidate; it cannot say what is worth keeping, so
3
3
  * every captured memory currently lands on a flat schema_fit of 0.5. */
4
4
  import { fetchWithRetry } from '../util/http-retry.js';
5
- import { errorMessage, log } from '../util/log.js';
5
+ import { errorFields, errorMessage, log } from '../util/log.js';
6
6
  import { readCappedJson } from '../util/capped-json.js';
7
7
  import { isJsonNumber, isJsonObject, isJsonString } from '../util/json.js';
8
8
  const ENDPOINT = 'https://api.typesafe.ai/v1/systemone';
@@ -19,7 +19,9 @@ function answerNamed(reply, name) {
19
19
  const QUESTIONS = {
20
20
  durable: {
21
21
  type: 'noul',
22
- instructions: 'This text was extracted from an AI coding agent transcript as a candidate memory. It is worth storing long-term only if it would still be useful to a future agent working on this codebase weeks from now: a durable preference, a convention, a decision with a reason, or a gotcha that will recur. Transient chatter, one-off status, restatements of code already in the repo, and anything only true inside this one session are not worth storing.',
22
+ instructions: 'This text was extracted from an AI coding agent transcript as a candidate memory. It is worth storing long-term only if it would still be useful to ' +
23
+ 'a future agent working on this codebase weeks from now: a durable preference, a convention, a decision with a reason, or a gotcha that will recur. ' +
24
+ 'Transient chatter, one-off status, restatements of code already in the repo, and anything only true inside this one session are not worth storing.',
23
25
  },
24
26
  kind: {
25
27
  type: 'choice',
@@ -73,10 +75,15 @@ async function post(content, opts) {
73
75
  }, { timeoutMs: JUDGE_TIMEOUT_MS, fetchFn: opts.fetcher });
74
76
  }
75
77
  catch (err) {
76
- log.debug(`judge: request failed: ${errorMessage(err)}`);
78
+ log.warn(`judge: request failed: ${errorMessage(err)}`, errorFields(err));
77
79
  return null;
78
80
  }
79
- return res.ok ? res : null;
81
+ if (res.ok)
82
+ return res;
83
+ // The body is the server's reply, never the request, so it cannot hold the key.
84
+ const snippet = (await res.text().catch(() => '')).slice(0, 200);
85
+ log.warn('judge: non-2xx reply', { status: res.status, body: snippet });
86
+ return null;
80
87
  }
81
88
  /** `null` on any failure, so a Jev outage degrades capture to today's
82
89
  * behaviour instead of blocking the write. */
@@ -101,7 +101,7 @@ function deriveEntities(loaded) {
101
101
  pass.byType[entityType] = 0;
102
102
  for (const row of rows) {
103
103
  pass.allRows.push(row);
104
- // Names are uncapped at source; trimming on both sides of the cap gives the exact name insertEntity stores.
104
+ // Names are uncapped at source; trimming on both sides of the cap gives the exact name insertEntityRow stores.
105
105
  const name = (row.name ?? '').trim().slice(0, MAX_ENTITY_NAME_LEN).trim();
106
106
  const key = keyOf(row.entityType, row.e2Id);
107
107
  // A row seen twice was superseded between the two status loads; its first sighting stands.
@@ -220,7 +220,7 @@ export function extractGraph(hippoRoot, tenantId) {
220
220
  // Loaded first: opening a second connection under the rebuild's BEGIN IMMEDIATE dead-locks ('database is locked').
221
221
  const derived = deriveGraph(loadGraphSources(hippoRoot, tenantId));
222
222
  // Diffed and applied under one lock, so two concurrent rebuilds serialize instead of both inserting a missing row.
223
- const skipped = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, hippoRoot, tenantId, graphDelta(txDb, tenantId, derived), { from: 0, holdMs: Infinity }).skipped);
223
+ const skipped = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, tenantId, graphDelta(txDb, tenantId, derived), { from: 0, holdMs: Infinity }).skipped);
224
224
  return resultOf(derived, skipped);
225
225
  }
226
226
  /** extractGraph for sleep: diffs outside the lock, then applies in transactions of about `budget.holdMs` with a pause
@@ -237,7 +237,7 @@ export async function extractGraphChunked(hippoRoot, tenantId, budget = WRITE_BU
237
237
  await budget.pause(committedAt);
238
238
  const from = next;
239
239
  // Sleep's wait, not a server request's 250 ms: each chunk is a fresh BEGIN IMMEDIATE a hook's write could otherwise fail.
240
- const chunk = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, hippoRoot, tenantId, ops, { from, holdMs: budget.holdMs, clock: budget.clock }), { busyWaitMs: SLEEP_DB_WAIT_MS });
240
+ const chunk = runGraphRebuildTransaction(hippoRoot, tenantId, (txDb) => applyGraphOps(txDb, tenantId, ops, { from, holdMs: budget.holdMs, clock: budget.clock }), { busyWaitMs: SLEEP_DB_WAIT_MS });
241
241
  committedAt = budget.clock();
242
242
  next = chunk.next;
243
243
  skipped += chunk.skipped;
@@ -6,7 +6,7 @@ import { DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
6
6
  import { estimateTokens } from '../util/token-text.js';
7
7
  import { compareEntryIdentity, compareScoresDesc } from '../core/compare.js';
8
8
  import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations } from '../store/graph-reads.js';
9
- import { passesCliRecallScopeFilter, passesScopeFilterForRecall } from '../store/recall-scope.js';
9
+ import { passesCliRecallScopeFilter, passesScopeFilterForRecall } from '../core/recall-scope.js';
10
10
  /** Hard cap on `--hops` (a higher value just walks more of a finite graph; this bounds
11
11
  * worst-case work and keeps the flag honest). */
12
12
  export const MAX_HOPS = 3;
@@ -146,15 +146,23 @@ const CLIENT_JS = [
146
146
  " var panning=false,sx=0,sy=0;",
147
147
  " svg.addEventListener('mousedown',function(e){if(e.target.closest('.node'))return;panning=true;sx=e.clientX;sy=e.clientY;});",
148
148
  " window.addEventListener('mouseup',function(){panning=false;});",
149
- " window.addEventListener('mousemove',function(e){if(!panning)return;var r=svg.getBoundingClientRect();var k=view.w/r.width;view.x-=(e.clientX-sx)*k;view.y-=(e.clientY-sy)*k;sx=e.clientX;sy=e.clientY;apply();});",
150
- " svg.addEventListener('wheel',function(e){e.preventDefault();var r=svg.getBoundingClientRect();var mx=view.x+(e.clientX-r.left)/r.width*view.w;var my=view.y+(e.clientY-r.top)/r.height*view.h;var f=e.deltaY<0?0.9:1.1;view.x=mx-(mx-view.x)*f;view.y=my-(my-view.y)*f;view.w*=f;view.h*=f;apply();},{passive:false});",
151
- " var data={};try{data=JSON.parse(document.getElementById('graph-data').textContent);}catch(_){}",
149
+ " window.addEventListener('mousemove',function(e){if(!panning)return;var r=svg.getBoundingClientRect();var " +
150
+ "k=view.w/r.width;view.x-=(e.clientX-sx)*k;view.y-=(e.clientY-sy)*k;sx=e.clientX;sy=e.clientY;apply();});",
151
+ " svg.addEventListener('wheel',function(e){e.preventDefault();var r=svg.getBoundingClientRect();var mx=view.x+(e.clientX-r.left)/r.width*view.w;var " +
152
+ "my=view.y+(e.clientY-r.top)/r.height*view.h;var " +
153
+ "f=e.deltaY<0?0.9:1.1;view.x=mx-(mx-view.x)*f;view.y=my-(my-view.y)*f;view.w*=f;view.h*=f;apply();},{passive:false});",
154
+ " var data={};try{data=JSON.parse(document.getElementById('graph-data').textContent);}",
155
+ " catch(e){console.error('hippo graph: embedded model is not valid JSON',e);}",
152
156
  " var adj={};(data.edges||[]).forEach(function(e){(adj[e.from]=adj[e.from]||[]).push(e.to);(adj[e.to]=adj[e.to]||[]).push(e.from);});",
153
157
  " var active=null;",
154
- " document.querySelectorAll('.node').forEach(function(g){g.addEventListener('click',function(ev){ev.stopPropagation();var id=g.getAttribute('data-id');if(active===id){clearHi();active=null;return;}active=id;highlight(id);});});",
158
+ " document.querySelectorAll('.node').forEach(function(g){g.addEventListener('click',function(ev){ev.stopPropagation();var " +
159
+ "id=g.getAttribute('data-id');if(active===id){clearHi();active=null;return;}active=id;highlight(id);});});",
155
160
  " svg.addEventListener('click',function(){clearHi();active=null;});",
156
161
  " function clearHi(){svg.classList.remove('focused');document.querySelectorAll('.hi').forEach(function(el){el.classList.remove('hi');});}",
157
- " function highlight(id){clearHi();svg.classList.add('focused');var keep={};keep[id]=1;(adj[id]||[]).forEach(function(n){keep[n]=1;});document.querySelectorAll('.node').forEach(function(g){if(keep[g.getAttribute('data-id')])g.classList.add('hi');});document.querySelectorAll('.edge').forEach(function(l){if(l.getAttribute('data-from')===id||l.getAttribute('data-to')===id)l.classList.add('hi');});}",
162
+ " function highlight(id){clearHi();svg.classList.add('focused');var " +
163
+ "keep={};keep[id]=1;(adj[id]||[]).forEach(function(n){keep[n]=1;});document.querySelectorAll('.node').forEach(" +
164
+ "function(g){if(keep[g.getAttribute('data-id')])g.classList.add('hi');});document.querySelectorAll('.edge').forEach(" +
165
+ "function(l){if(l.getAttribute('data-from')===id||l.getAttribute('data-to')===id)l.classList.add('hi');});}",
158
166
  "})();",
159
167
  ].join("\n");
160
168
  const STYLE = [
@@ -6,7 +6,7 @@ export interface ApplyGraphOpsResult {
6
6
  }
7
7
  /** Applies `ops` from index `opts.from` on the caller's open transaction and stops at the first op boundary past `opts.holdMs`.
8
8
  * Returns where the next chunk starts and how many ops were skipped as stale. */
9
- export declare function applyGraphOps(db: DatabaseSyncLike, hippoRoot: string, tenantId: string, ops: readonly GraphOp[], opts: {
9
+ export declare function applyGraphOps(db: DatabaseSyncLike, tenantId: string, ops: readonly GraphOp[], opts: {
10
10
  readonly from: number;
11
11
  readonly holdMs: number;
12
12
  readonly clock?: () => number;
@@ -1,19 +1,19 @@
1
1
  // Applies a rebuild's op list on the caller's transaction. The statements and the consolidated-source guard sit in the store's graph writers.
2
2
  import { assertTenantId } from '../store/tenant.js';
3
3
  import { clock } from '../util/write-budget.js';
4
- import { deleteEntityRow, deleteRelationRow, entityIdBySource, insertEntity, insertRelation, objectInForce, relationPresent, updateEntity } from '../store/graph-writes.js';
5
- function insertDesiredRelation(db, hippoRoot, tenantId, rel) {
4
+ import { deleteEntityRow, deleteRelationRow, entityIdBySource, insertEntityRow, insertRelationRow, objectInForce, relationPresent, updateEntityRow } from '../store/graph-writes.js';
5
+ function insertDesiredRelation(db, tenantId, rel) {
6
6
  const fromEntityId = entityIdBySource(db, tenantId, rel.from.entityType, rel.from.sourceObject);
7
7
  const toEntityId = entityIdBySource(db, tenantId, rel.to.entityType, rel.to.sourceObject);
8
8
  if (fromEntityId === undefined || toEntityId === undefined || !objectInForce(db, tenantId, rel.sourceObject))
9
9
  return false;
10
10
  if (relationPresent(db, tenantId, fromEntityId, toEntityId, rel.relType))
11
11
  return false;
12
- insertRelation(hippoRoot, tenantId, { fromEntityId, toEntityId, relType: rel.relType, memoryId: rel.memoryId, sourceObject: rel.sourceObject }, db);
12
+ insertRelationRow(db, tenantId, { fromEntityId, toEntityId, relType: rel.relType, memoryId: rel.memoryId, sourceObject: rel.sourceObject });
13
13
  return true;
14
14
  }
15
15
  /** Applies one op; false when a writer since the diff made it stale, which the next run's diff repairs. */
16
- function applyGraphOp(db, hippoRoot, tenantId, op) {
16
+ function applyGraphOp(db, tenantId, op) {
17
17
  switch (op.op) {
18
18
  case 'deleteEntity':
19
19
  deleteEntityRow(db, tenantId, op.id);
@@ -24,27 +24,27 @@ function applyGraphOp(db, hippoRoot, tenantId, op) {
24
24
  case 'updateEntity':
25
25
  if (!objectInForce(db, tenantId, op.entity.sourceObject))
26
26
  return false;
27
- return updateEntity(hippoRoot, tenantId, op.id, op.entity, db) !== null;
27
+ return updateEntityRow(db, tenantId, op.id, op.entity) !== null;
28
28
  case 'insertEntity':
29
29
  // A mirrorless object closed since the load is never enqueued again, so a stale insert would stay for good.
30
30
  if (!objectInForce(db, tenantId, op.entity.sourceObject) || entityIdBySource(db, tenantId, op.entity.entityType, op.entity.sourceObject) !== undefined)
31
31
  return false;
32
- insertEntity(hippoRoot, tenantId, op.entity, db);
32
+ insertEntityRow(db, tenantId, op.entity);
33
33
  return true;
34
34
  case 'insertRelation':
35
- return insertDesiredRelation(db, hippoRoot, tenantId, op.relation);
35
+ return insertDesiredRelation(db, tenantId, op.relation);
36
36
  }
37
37
  }
38
38
  /** Applies `ops` from index `opts.from` on the caller's open transaction and stops at the first op boundary past `opts.holdMs`.
39
39
  * Returns where the next chunk starts and how many ops were skipped as stale. */
40
- export function applyGraphOps(db, hippoRoot, tenantId, ops, opts) {
40
+ export function applyGraphOps(db, tenantId, ops, opts) {
41
41
  assertTenantId('applyGraphOps', tenantId);
42
42
  const now = opts.clock ?? clock;
43
43
  const begunAt = now();
44
44
  let next = opts.from;
45
45
  let skipped = 0;
46
46
  while (next < ops.length) {
47
- if (!applyGraphOp(db, hippoRoot, tenantId, ops[next]))
47
+ if (!applyGraphOp(db, tenantId, ops[next]))
48
48
  skipped += 1;
49
49
  next += 1;
50
50
  if (now() - begunAt >= opts.holdMs)
@@ -1,6 +1,7 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import { isJsonString } from '../util/json.js';
4
+ import { errorMessage, log } from '../util/log.js';
4
5
  function collectFiles(dir) {
5
6
  if (!fs.existsSync(dir))
6
7
  return [];
@@ -42,8 +43,8 @@ function readCodexSessionIdsFromHistoryDelta(historyPath, startOffsetBytes) {
42
43
  ordered.push(sessionId);
43
44
  }
44
45
  }
45
- catch {
46
- // ignore malformed JSONL lines
46
+ catch (err) {
47
+ log.warn(`codex history ${historyPath}: skipped a malformed JSONL line (${errorMessage(err)})`);
47
48
  }
48
49
  }
49
50
  return ordered;
@@ -3,7 +3,8 @@ import * as fs from 'fs';
3
3
  import * as path from 'path';
4
4
  import { PACKAGE_ROOT } from '../core/package-root.js';
5
5
  import { errorMessage, log } from '../util/log.js';
6
- import { HIPPO_CODEX_WRAPPER_MARKER, homeDir, codexHomeDir, ensureDir } from './shared.js';
6
+ import { HIPPO_CODEX_WRAPPER_MARKER, ensureDir } from './shared.js';
7
+ import { homeDir, codexHomeDir } from '../util/agent-homes.js';
7
8
  import { isJsonString } from '../util/json.js';
8
9
  import { writeFileAtomic } from '../util/atomic-write.js';
9
10
  export function resolveCodexWrapperPaths() {
@@ -2,7 +2,8 @@
2
2
  * OpenCode rejects the JSON-hook schema (no `hooks` key), so it gets a TS plugin (OPENCODE_PLUGIN_SOURCE); see installCodexHooks, installCopilotHooks. */
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
- import { HIPPO_SLEEP_MARKER, HIPPO_LAST_SLEEP_MARKER, HIPPO_CAPTURE_MARKER, HIPPO_SESSION_END_MARKER, HIPPO_PINNED_INJECT_MARKER, HIPPO_PINNED_INJECT_COMMAND, HIPPO_PRE_COMPACT_MARKER, HIPPO_COMPACT_RESUME_MARKER, HIPPO_CAPTURE_ERROR_MARKER, HIPPO_POST_COMPACT_MARKER, homeDir, claudeConfigDir, codexHomeDir, copilotHooksFile, defaultPreCompactLogPath } from './shared.js';
5
+ import { HIPPO_SLEEP_MARKER, HIPPO_LAST_SLEEP_MARKER, HIPPO_CAPTURE_MARKER, HIPPO_SESSION_END_MARKER, HIPPO_PINNED_INJECT_MARKER, HIPPO_PINNED_INJECT_COMMAND, HIPPO_PRE_COMPACT_MARKER, HIPPO_COMPACT_RESUME_MARKER, HIPPO_CAPTURE_ERROR_MARKER, HIPPO_POST_COMPACT_MARKER, copilotHooksFile, defaultPreCompactLogPath } from './shared.js';
6
+ import { claudeConfigDir, codexHomeDir, homeDir } from '../util/agent-homes.js';
6
7
  import { isJsonString, readJsonFile, isJsonObjectLiteral } from '../util/json.js';
7
8
  import { escapeRegex } from '../util/escape.js';
8
9
  import { writeFileAtomic } from '../util/atomic-write.js';
@@ -348,7 +349,8 @@ function warnKeptHippoHandlers(settingsPath, hooks) {
348
349
  });
349
350
  if (kept.length === 0)
350
351
  return;
351
- process.stderr.write(`hippo kept these hook handlers in ${settingsPath} because they do not start with a hippo command; remove any that are hippo's by hand: ${kept.map((c) => JSON.stringify(c)).join(', ')}\n`);
352
+ process.stderr.write(`hippo kept these hook handlers in ${settingsPath} because they do not start with a hippo command; ` +
353
+ `remove any that are hippo's by hand: ${kept.map((c) => JSON.stringify(c)).join(', ')}\n`);
352
354
  }
353
355
  /** Removes hippo's own hook handlers from `target`'s settings file and keeps every other handler; true when the file changed. */
354
356
  export function uninstallJsonHooks(target) {
@@ -1,6 +1,6 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
- import { homeDir } from './shared.js';
3
+ import { homeDir } from '../util/agent-homes.js';
4
4
  import { writeFileAtomic } from '../util/atomic-write.js';
5
5
  import { isJsonString, isJsonObjectLiteral } from '../util/json.js';
6
6
  const HIPPO_OPENCODE_PLUGIN_MARKER = 'HIPPO_OPENCODE_PLUGIN_V1';
@@ -20,12 +20,15 @@ export const HippoPlugin = async ({ $ }) => {
20
20
  if (typeof $ !== "function") return;
21
21
  try {
22
22
  if (event.type === "session.idle") {
23
- await $\`hippo session-end\`.quiet().nothrow();
23
+ const r = await $\`hippo session-end\`.quiet().nothrow();
24
+ if (r && r.exitCode !== 0) console.error("[hippo] session-end exited " + r.exitCode);
24
25
  } else if (event.type === "session.created") {
25
- await $\`hippo last-sleep\`.quiet().nothrow();
26
+ const r = await $\`hippo last-sleep\`.quiet().nothrow();
27
+ if (r && r.exitCode !== 0) console.error("[hippo] last-sleep exited " + r.exitCode);
26
28
  }
27
- } catch {
28
- // hippo CLI not on PATH or other failure — never crash the host session.
29
+ } catch (err) {
30
+ // hippo CLI not on PATH or other failure: never crash the host session.
31
+ console.error("[hippo] plugin hook failed: " + (err && err.message ? err.message : err));
29
32
  }
30
33
  },
31
34
  };
@@ -17,15 +17,9 @@ export declare const HIPPO_PRE_COMPACT_MARKER = "hippo pre-compact";
17
17
  export declare const HIPPO_COMPACT_RESUME_MARKER = "hippo compact-resume";
18
18
  export declare const HIPPO_CAPTURE_ERROR_MARKER = "hippo capture-error";
19
19
  export declare const HIPPO_POST_COMPACT_MARKER = "hippo post-compact";
20
- export declare function homeDir(): string;
21
- /** Codex's config folder: $CODEX_HOME, else ~/.codex, as the Codex hooks docs describe. */
22
- export declare function codexHomeDir(home?: string, env?: Readonly<Record<string, string | undefined>>): string;
23
20
  /** Copilot's config folder: $COPILOT_HOME, else ~/.copilot under os.homedir(), as the
24
21
  * Copilot apps resolve it (a HOME that differs from the profile must not move it). */
25
22
  export declare function copilotHomeDir(home?: string, env?: Readonly<Record<string, string | undefined>>): string;
26
- /** Claude Code's config folder, where it reads settings.json: $CLAUDE_CONFIG_DIR when set and non-empty, else
27
- * ~/.claude under os.homedir(), as Claude Code does (a HOME that differs from the profile must not move it). */
28
- export declare function claudeConfigDir(home?: string, env?: Readonly<Record<string, string | undefined>>): string;
29
23
  /** Codex counts as installed only when its config folder exists: Codex itself refuses a CODEX_HOME that is not a folder. */
30
24
  export declare function isCodexPresent(home?: string): boolean;
31
25
  /** hippo's own hooks file, in the hooks folder the Copilot CLI reads. */
@@ -1,8 +1,8 @@
1
- import { envHomeDir, processEnv } from '../util/env.js';
1
+ import { processEnv } from '../util/env.js';
2
2
  import * as fs from 'fs';
3
3
  import * as os from 'os';
4
4
  import * as path from 'path';
5
- import { vscodeDataFolders } from '../agent-memories/copilot.js';
5
+ import { claudeConfigDir, codexHomeDir, homeDir, vscodeDataFolders } from '../util/agent-homes.js';
6
6
  export const HIPPO_SLEEP_MARKER = 'hippo sleep';
7
7
  export const HIPPO_LAST_SLEEP_MARKER = 'hippo last-sleep';
8
8
  export const HIPPO_CAPTURE_MARKER = 'hippo capture --last-session';
@@ -14,23 +14,11 @@ export const HIPPO_PRE_COMPACT_MARKER = 'hippo pre-compact';
14
14
  export const HIPPO_COMPACT_RESUME_MARKER = 'hippo compact-resume';
15
15
  export const HIPPO_CAPTURE_ERROR_MARKER = 'hippo capture-error';
16
16
  export const HIPPO_POST_COMPACT_MARKER = 'hippo post-compact';
17
- export function homeDir() {
18
- return envHomeDir() || os.homedir();
19
- }
20
- /** Codex's config folder: $CODEX_HOME, else ~/.codex, as the Codex hooks docs describe. */
21
- export function codexHomeDir(home = homeDir(), env = processEnv()) {
22
- return env.CODEX_HOME || path.join(home, '.codex');
23
- }
24
17
  /** Copilot's config folder: $COPILOT_HOME, else ~/.copilot under os.homedir(), as the
25
18
  * Copilot apps resolve it (a HOME that differs from the profile must not move it). */
26
19
  export function copilotHomeDir(home = os.homedir(), env = processEnv()) {
27
20
  return env.COPILOT_HOME || path.join(home, '.copilot');
28
21
  }
29
- /** Claude Code's config folder, where it reads settings.json: $CLAUDE_CONFIG_DIR when set and non-empty, else
30
- * ~/.claude under os.homedir(), as Claude Code does (a HOME that differs from the profile must not move it). */
31
- export function claudeConfigDir(home = os.homedir(), env = processEnv()) {
32
- return env.CLAUDE_CONFIG_DIR || path.join(home, '.claude');
33
- }
34
22
  /** Codex counts as installed only when its config folder exists: Codex itself refuses a CODEX_HOME that is not a folder. */
35
23
  export function isCodexPresent(home = homeDir()) {
36
24
  return fs.statSync(codexHomeDir(home), { throwIfNoEntry: false })?.isDirectory() === true;
@@ -90,7 +78,8 @@ export function detectInstalledTools() {
90
78
  kind: 'wrapper',
91
79
  notes: 'memory hooks in hooks.json, and wraps the detected codex launcher for session-end consolidation'
92
80
  },
93
- { name: 'copilot', configDir: copilotHomeDir(), detected: isCopilotPresent(), kind: 'json-hook', notes: 'hooks in hooks/hippo.json, the MCP server in mcp-config.json and a block in copilot-instructions.md; for VS Code, the server in each User mcp.json and prompts/hippo.instructions.md' },
81
+ { name: 'copilot', configDir: copilotHomeDir(), detected: isCopilotPresent(), kind: 'json-hook', notes: 'hooks in hooks/hippo.json, the MCP server in ' +
82
+ 'mcp-config.json and a block in copilot-instructions.md; for VS Code, the server in each User mcp.json and prompts/hippo.instructions.md' },
94
83
  {
95
84
  name: 'cursor',
96
85
  configDir: '~/.cursor',
@@ -7,7 +7,7 @@ import { loadAllEntries } from '../store/entry-reads.js';
7
7
  import { duplicateKey, storedTextKeys } from '../util/same-text.js';
8
8
  import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
9
9
  import { withRequestStoresSync } from '../db/request-stores.js';
10
- import { RejectedValueError } from '../store/rejection.js';
10
+ import { RejectedValueError } from '../core/api-errors.js';
11
11
  import { rejectionGuardRefuses } from '../store/rejected-values.js';
12
12
  import { loadConfig } from '../core/config.js';
13
13
  import { vetSecrets } from '../util/secret-detect.js';
@@ -2,6 +2,7 @@ import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import { importEntries } from './core.js';
4
4
  import { splitMarkdownFrontmatter, collectMarkdownFiles } from './markdown-parse.js';
5
+ import { errorMessage, log } from '../util/log.js';
5
6
  import { isJsonString, isJsonObject } from '../util/json.js';
6
7
  /** Coerce one imported record (string, `{content|text: ...}` object, or
7
8
  * anything else) into the plain-text memory chunk it represents. */
@@ -29,8 +30,8 @@ function parseChatGPTFile(filePath) {
29
30
  return parsed.map(extractMemoryText).filter(Boolean);
30
31
  }
31
32
  }
32
- catch {
33
- // Fall through to plain text
33
+ catch (err) {
34
+ log.warn(`import: ${filePath} is not valid JSON (${errorMessage(err)}); reading it as plain text`);
34
35
  }
35
36
  }
36
37
  // Plain text: one memory per line
@@ -116,8 +117,8 @@ function parseClaudeFile(filePath) {
116
117
  return parsed.map(extractMemoryText).filter(Boolean);
117
118
  }
118
119
  }
119
- catch {
120
- // Fall through to markdown
120
+ catch (err) {
121
+ log.warn(`import: ${filePath} is not valid JSON (${errorMessage(err)}); reading it as markdown`);
121
122
  }
122
123
  }
123
124
  // Markdown file: strip hippo block and split
@@ -5,8 +5,8 @@ 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
11
  import { withRequestStoresSync } from '../db/request-stores.js';
12
12
  import { loadConfig } from '../core/config.js';
@@ -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
  }
package/dist/index.d.ts CHANGED
@@ -32,8 +32,9 @@ 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
39
  export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './learn/autolearn.js';
39
40
  export { getGlobalRoot, initGlobal, promoteToGlobal } from './sharing/global-store.js';