hippo-memory 1.70.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 (855) hide show
  1. package/README.md +2 -2
  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.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -1,192 +0,0 @@
1
- // The local Transformers.js embedder, a leaf so embedding-provider.ts can wrap it without importing embeddings.ts.
2
- import { envModelCache } from '../../util/env.js';
3
- import * as fs from 'fs';
4
- import * as path from 'path';
5
- import { createRequire } from 'module';
6
- import { loadConfig } from '../../core/config.js';
7
- import { errorMessage, log } from '../../util/log.js';
8
- const _require = createRequire(import.meta.url);
9
- let _embeddingAvailable = null;
10
- // A pipeline is expensive to load, so one instance per model is kept for the process.
11
- const _pipelineInstances = new Map();
12
- const _pipelineLoading = new Map();
13
- const _pipelineErrors = new Map();
14
- export const DEFAULT_EMBEDDING_MODEL = 'Xenova/all-MiniLM-L6-v2';
15
- /** BGE was trained with CLS pooling; everything else gets mean, the sentence-transformers default, since CLS degrades mean-trained models. */
16
- export function poolingFor(model) {
17
- return /\bbge\b/i.test(model) ? 'cls' : 'mean';
18
- }
19
- /** e5 models only match a query to a passage when each side carries its trained prefix. */
20
- export function prefixFor(model, role) {
21
- if (!role)
22
- return '';
23
- if (/\be5\b/i.test(model)) {
24
- return role === 'query' ? 'query: ' : 'passage: ';
25
- }
26
- return '';
27
- }
28
- // Use Function constructor to bypass TypeScript static module resolution
29
- // for optional peer dependencies that may not be installed.
30
- // SAFETY: `import(s)` always resolves to a module namespace object (or rejects);
31
- // Promise<object> names that honestly without claiming a specific module shape.
32
- const _dynImport = new Function('s', 'return import(s)');
33
- /** Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed. */
34
- export function isEmbeddingAvailable() {
35
- if (_embeddingAvailable !== null)
36
- return _embeddingAvailable;
37
- try {
38
- _require.resolve('@xenova/transformers');
39
- _embeddingAvailable = true;
40
- return true;
41
- }
42
- catch {
43
- // fall through
44
- }
45
- try {
46
- _require.resolve('@huggingface/transformers');
47
- _embeddingAvailable = true;
48
- return true;
49
- }
50
- catch {
51
- // fall through
52
- }
53
- _embeddingAvailable = false;
54
- return false;
55
- }
56
- // Importing both packages loads two incompatible onnxruntime-node builds whose finalizers can double-free on exit,
57
- // so pick one first: the maintained package hippo ships, with Xenova only as a fallback a user installed.
58
- function resolveTransformersPackage() {
59
- try {
60
- _require.resolve('@huggingface/transformers');
61
- return '@huggingface/transformers';
62
- }
63
- catch {
64
- // fall through
65
- }
66
- try {
67
- _require.resolve('@xenova/transformers');
68
- return '@xenova/transformers';
69
- }
70
- catch {
71
- return null; // neither optional package is installed; callers fall back to no local embeddings
72
- }
73
- }
74
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
- async function loadPipeline(model) {
76
- if (_pipelineInstances.has(model))
77
- return _pipelineInstances.get(model);
78
- if (_pipelineLoading.has(model))
79
- return _pipelineLoading.get(model);
80
- const loading = createPipeline(model);
81
- _pipelineLoading.set(model, loading);
82
- return loading;
83
- }
84
- /** The model's pipeline, or null with the reason recorded in `_pipelineErrors`. */
85
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
- async function createPipeline(model) {
87
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
- const pkg = resolveTransformersPackage();
89
- if (!pkg) {
90
- _pipelineErrors.set(model, 'no transformers package is installed');
91
- return null;
92
- }
93
- const pipelineFn = await importPipelineFactory(pkg, model);
94
- if (!pipelineFn)
95
- return null;
96
- // The offline bundle used in egress-blocked sandboxes ships only the FP32 model, so use whichever file is on disk.
97
- const cacheRoot = envModelCache();
98
- const quantized = !cacheRoot
99
- || fs.existsSync(path.join(cacheRoot, model, 'onnx', 'model_quantized.onnx'));
100
- try {
101
- const instance = await pipelineFn('feature-extraction', model, { quantized });
102
- _pipelineInstances.set(model, instance);
103
- return instance;
104
- }
105
- catch (err) {
106
- const reason = `embedding pipeline load failed (${model}): ${String(err)}`;
107
- log.debug(reason);
108
- _pipelineErrors.set(model, reason);
109
- return null;
110
- }
111
- finally {
112
- _pipelineLoading.delete(model);
113
- }
114
- }
115
- /** The package's `pipeline` function, or null with the reason recorded in `_pipelineErrors`. */
116
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
- async function importPipelineFactory(pkg, model) {
118
- let pipelineFn = null;
119
- try {
120
- // SAFETY: the resolved module's shape is untyped by design (optional peer
121
- // dependency); pipelineFn/mod.env are read defensively below and any
122
- // failure to find a usable pipeline falls through to `return null`.
123
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
- const mod = await _dynImport(pkg);
125
- if (envModelCache()) {
126
- if (mod.env) {
127
- mod.env.cacheDir = envModelCache();
128
- mod.env.localModelPath = envModelCache();
129
- mod.env.allowRemoteModels = false;
130
- }
131
- }
132
- pipelineFn = mod.pipeline ?? mod.default?.pipeline;
133
- }
134
- catch (err) {
135
- // String(err) keeps a Node error's [ERR_...] code, which callers match on.
136
- const reason = `transformers import failed (${pkg}): ${String(err)}`;
137
- log.debug(reason);
138
- _pipelineErrors.set(model, reason);
139
- return null;
140
- }
141
- if (!pipelineFn) {
142
- _pipelineErrors.set(model, `${pkg} exports no pipeline function`);
143
- return null;
144
- }
145
- return pipelineFn;
146
- }
147
- /** Throws, with the reason, when the model's pipeline cannot load: a provider-level failure, not a per-item skip. */
148
- export async function requireLocalPipeline(model) {
149
- if (await loadPipeline(model))
150
- return;
151
- throw new Error(`local embedding model did not load: ${_pipelineErrors.get(model) ?? 'unknown reason'}`);
152
- }
153
- export function resolveEmbeddingModel(hippoRoot, explicitModel) {
154
- const direct = explicitModel?.trim();
155
- if (direct)
156
- return direct;
157
- try {
158
- const configured = loadConfig(hippoRoot).embeddings.model?.trim();
159
- if (configured)
160
- return configured;
161
- }
162
- catch {
163
- // Fall back to the default model when config cannot be read.
164
- }
165
- return DEFAULT_EMBEDDING_MODEL;
166
- }
167
- /** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds e5-style prefixes. */
168
- export async function getEmbedding(text, model = DEFAULT_EMBEDDING_MODEL, role) {
169
- if (!isEmbeddingAvailable())
170
- return [];
171
- try {
172
- const pipe = await loadPipeline(model);
173
- if (!pipe)
174
- return [];
175
- const prefix = prefixFor(model, role);
176
- const input = prefix ? `${prefix}${text}` : text;
177
- // SAFETY: pipe() is a Transformers.js feature-extraction pipeline call;
178
- // its untyped output is read defensively below (only `.data`, cast on
179
- // the return line to the documented Float32Array tensor shape).
180
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
181
- const output = await pipe(input, { pooling: poolingFor(model), normalize: true });
182
- // SAFETY: output.data is a Float32Array per the feature-extraction
183
- // pipeline's documented tensor output shape.
184
- return Array.from(output.data);
185
- }
186
- catch (err) {
187
- // The caller sees `[]` and names the memory; the reason only shows at debug.
188
- log.debug(`local embedding failed: ${errorMessage(err)}`);
189
- return [];
190
- }
191
- }
192
- //# sourceMappingURL=local.js.map
@@ -1,77 +0,0 @@
1
- /**
2
- * Pluggable embedding providers for Hippo.
3
- *
4
- * The local `@huggingface/transformers` path stays the zero-DEPENDENCY DEFAULT. Opt-in
5
- * API providers (OpenAI / Voyage / Cohere) let a user bring a frontier embedder
6
- * (e.g. text-embedding-3-large) for frontier-class retrieval. They use the native
7
- * `fetch` global (Node >= 22.16, see package.json engines; NO new dependency) and
8
- * read their key from a conventional env var. The provider is selected by
9
- * `config.embeddings.provider` (default `'local'`).
10
- *
11
- * Design contract:
12
- * - Local provider `id` is the BARE model string; the STORED identity adds a `#t<N>`
13
- * embed-text-format suffix (`embeddingIndexIdentity`), so older stores reindex once:
14
- * their vectors were computed over path-contaminated text.
15
- * - API provider `id` is `${kind}:${model}`; switching to/from an API embedder
16
- * (or a dimension change) flips the identity and triggers the existing
17
- * reindex-on-change path.
18
- * - `resolveEmbeddingProvider` throws on an invalid config (unknown provider,
19
- * bad apiBaseUrl); `embedMemory` turns that into a warning. `isAvailable()` is provider-aware
20
- * (local -> dependency installed; api -> key present). `embed()` MAY throw on
21
- * a hard transport/auth failure so a reindex can abort atomically; hot paths
22
- * wrap it and fall back to BM25.
23
- *
24
- * The exact request/response shapes for the API providers are documented from each
25
- * vendor's public embeddings API; they are unit-tested here against a mocked
26
- * `fetch` and are integration-verified in Workstream C (real API calls are
27
- * egress-blocked in the build sandbox).
28
- */
29
- import { type EmbeddingRole } from './local.js';
30
- export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
31
- export declare const API_PROVIDER_KINDS: readonly EmbeddingProviderKind[];
32
- export interface EmbeddingProvider {
33
- readonly kind: EmbeddingProviderKind;
34
- readonly model: string;
35
- /**
36
- * Identity recorded in DB meta to drive reindex-on-change.
37
- * local -> bare model string (back-compat); api -> `${kind}:${model}`.
38
- */
39
- readonly id: string;
40
- /** Known fixed output dimension, if any (undefined for local / unknown). */
41
- readonly dimensions?: number;
42
- /** Env var holding this provider's API key (undefined for the local provider). */
43
- readonly keyEnv?: string;
44
- /** local -> dependency installed; api -> key present. NEVER throws. */
45
- isAvailable(): boolean;
46
- /**
47
- * Batch-embed. Returns one row per input in order; a row is `[]` when that
48
- * single item could not be embedded. MAY throw on a hard transport/auth
49
- * failure (so a reindex aborts before saving a partial index).
50
- */
51
- embed(texts: string[], role?: EmbeddingRole): Promise<number[][]>;
52
- }
53
- export interface ResolveProviderOptions {
54
- /** Explicit model override (mirrors resolveEmbeddingModel's explicitModel). */
55
- model?: string;
56
- /** Explicit provider override (mainly for tests). */
57
- provider?: EmbeddingProviderKind;
58
- }
59
- /**
60
- * Build the active embedding provider from config (or an explicit override).
61
- * Never throws for a missing key — that surfaces via `isAvailable()` on the hot
62
- * paths and as a hard error only from the explicit `hippo embed` command. The
63
- * only hard throw is an invalid config (e.g. an insecure apiBaseUrl), a
64
- * deliberate loud failure; hot-path callers (search) wrap this in try/catch.
65
- */
66
- export declare function resolveEmbeddingProvider(hippoRoot: string, opts?: ResolveProviderOptions): EmbeddingProvider;
67
- /**
68
- * The reindex identity for the active provider. Use this (NOT resolveEmbeddingModel)
69
- * everywhere `embeddingModelRequiresReindex` / stored-model comparisons happen.
70
- */
71
- export declare function resolveEmbeddingIdentity(hippoRoot: string, opts?: ResolveProviderOptions): string;
72
- /**
73
- * Provider-aware availability for a store: local -> dependency installed;
74
- * api -> key present. Use at the call sites that decide whether to embed.
75
- */
76
- export declare function isEmbeddingConfigured(hippoRoot: string): boolean;
77
- //# sourceMappingURL=provider.d.ts.map
@@ -1,10 +0,0 @@
1
- import { type MemoryEntry } from '../core/memory.js';
2
- /**
3
- * Serialize a MemoryEntry to markdown with YAML frontmatter.
4
- */
5
- export declare function serializeEntry(entry: MemoryEntry): string;
6
- /**
7
- * Deserialize a markdown file to a MemoryEntry.
8
- */
9
- export declare function deserializeEntry(raw: string): MemoryEntry | null;
10
- //# sourceMappingURL=markdown.d.ts.map
@@ -1,138 +0,0 @@
1
- /**
2
- * Recall-side scope predicates, in a leaf module so shared.ts (which api.ts
3
- * imports) can apply the same default-deny rule to searchBothHybrid's internal
4
- * candidate loads without an import cycle. api.ts imports
5
- * these for its own call sites AND re-exports them for back-compat
6
- * (`api.isPrivateScope`, test imports of `passesScopeFilterForRecall`).
7
- */
8
- import { ForbiddenError } from '../core/api-errors.js';
9
- /**
10
- * Literal scopes excluded from recall by default-deny when the
11
- * caller passes no `scope`. The SQL clause in `loadSearchRows` and the JS
12
- * helper `passesScopeFilterForRecall` (src/api/index.ts) both read from this
13
- * constant. Adding a deny scope is a one-place change.
14
- *
15
- * Regex-based denies (e.g. `<source>:private:*`) stay in
16
- * `passesScopeFilterForRecall` as a separate JS step — they don't translate
17
- * cleanly to SQL.
18
- *
19
- * Invariant: never empty. An empty array would silently allow quarantine
20
- * scopes through both paths (SQL clause omitted, JS check vacuous). The
21
- * module-load assertion below pins this loudly.
22
- */
23
- export declare const RECALL_DEFAULT_DENY_SCOPES: readonly ["unknown:legacy"];
24
- /**
25
- * @internal Runtime guard against a future maintainer blanking a
26
- * load-bearing literal array. Extracted from the inline guard so the throw
27
- * path is directly testable. `as const` arrays widen via `readonly T[]` at
28
- * the call site so the empty case is reachable at runtime.
29
- */
30
- export declare function assertNonEmpty<T>(arr: readonly T[], name: string): void;
31
- /**
32
- * Source-agnostic private-scope detector. A scope string is treated
33
- * as private when it has the shape `<lowercase-source>:private:<rest>`.
34
- *
35
- * Examples that match:
36
- * slack:private:Cabc, github:private:owner/repo, jira:private:PROJ-1
37
- * Examples that DO NOT match:
38
- * slack:public:Cgeneral, acme:public:my-private-channel, null, '',
39
- * 'unknown:legacy', 'private' (alone), 'private:foo' (no source prefix).
40
- *
41
- * Used by api.recall, mcp/server.ts (hippo_recall + hippo_context),
42
- * cli.ts (cmdRecall + cmdExplain + continuity), shared.ts (searchBothHybrid
43
- * recall mode). Keep these in sync — the export is the single source of
44
- * truth so connector work cannot drift.
45
- */
46
- export declare const PRIVATE_SCOPE_RE: RegExp;
47
- /** True when `scope` matches the `<source>:private:*` shape. */
48
- export declare function isPrivateScope(scope: string | null | undefined): boolean;
49
- export declare const PERSONAL_SCOPE_PREFIX = "personal:private:";
50
- export declare const PERSONAL_OWNER_MAX: number;
51
- /** True for a `personal:private:<owner>` scope, any case, so a case variant is never mistaken for a team scope. */
52
- export declare function isPersonalScope(scope: string | null | undefined): boolean;
53
- /** The caller's own personal scope, or null when it has no owner that can hold one. */
54
- export declare function personalScopeOf(actor: {
55
- owner?: string;
56
- } | undefined): string | null;
57
- /** Refuses a client-sent `personal:` scope: only the server stamps one, from the caller's owner. */
58
- export declare function assertClientScope(scope: string | null | undefined): void;
59
- /** True when `actor` may change or delete a row in `scope`: any non-personal scope, or its own personal one. */
60
- export declare function canTouchScope(actor: {
61
- owner?: string;
62
- }, scope: string | null): boolean;
63
- /** canTouchScope for a caller known by its own personal scope, as a store method receives it. */
64
- export declare function ownScopeTouches(ownScope: string | null, scope: string | null): boolean;
65
- /**
66
- * Recall-side scope filter — the canonical JS half of the recall default-deny
67
- * rule (the SQL half lives in `loadSearchRows` via `loadRecallSearchEntries`).
68
- *
69
- * - When `requested` is set and non-empty: exact match required.
70
- * - When `requested` is undefined/empty: default-deny on any
71
- * `<source>:private:*` scope and on the `RECALL_DEFAULT_DENY_SCOPES`
72
- * quarantine buckets. `null` and public scopes pass, and so does `ownScope`, the caller's own personal scope.
73
- */
74
- export declare function passesScopeFilterForRecall(scope: string | null, requested: string | undefined, ownScope?: string | null): boolean;
75
- export interface SqlFragment {
76
- sql: string;
77
- params: string[];
78
- }
79
- /** SQL twin of the no-request arm of passesScopeFilterForRecall; `ownScope` is bound and compared with `=`, so `%` or `_` in an owner match nothing extra. */
80
- export declare function scopeAdmitSql(col: '' | 'm.', ownScope?: string | null): SqlFragment;
81
- /** SQL twin of canTouchScope, which is also canReadScope for an admin: every row but another person's personal one. LIKE folds ASCII case as isPersonalScope's /i does. */
82
- export declare function touchableScopeSql(col: '' | 'm.', ownScope?: string | null): SqlFragment;
83
- /**
84
- * The CLI `--scope` variant of the recall filter (JS half of the
85
- * SQL 'default-deny-or-exact' mode in loadSearchRows).
86
- *
87
- * The CLI flag predates the envelope column as a TAG-boost ranking hint
88
- * (`scope:<v>` tags, HIPPO_SCOPE, detectScope()), so an explicit `--scope X`
89
- * UNLOCKS envelope scope X in addition to the default-admitted set — it does
90
- * NOT narrow the result to X (that would return zero rows for every
91
- * tag-scoped workflow, whose envelope scope is NULL). api.recall keeps the
92
- * narrowing 'exact' semantics via `passesScopeFilterForRecall`.
93
- *
94
- * Note the unlock applies to whatever scope was explicitly named — including
95
- * a private scope or a quarantine bucket (`--scope unknown:legacy`). That is
96
- * deliberate owner access, identical in reach to api.recall's exact-match
97
- * for the same input; only NON-requested private/quarantine scopes stay
98
- * denied. A named personal scope never unlocks: the CLI has no caller identity to check it against.
99
- */
100
- export declare function passesCliRecallScopeFilter(scope: string | null, requested: string | undefined): boolean;
101
- /**
102
- * Thrown when a caller requests a scope its role may not read. The HTTP layer
103
- * maps it to 403.
104
- */
105
- export declare class ScopeForbiddenError extends ForbiddenError {
106
- readonly scope: string;
107
- constructor(scope: string);
108
- }
109
- /**
110
- * True for scopes that default-deny hides: `<source>:private:*` and the
111
- * quarantine buckets. Naming one explicitly is what unlocks it, so naming one
112
- * is the act that needs authorization.
113
- */
114
- export declare function isRestrictedScope(scope: string | null | undefined): boolean;
115
- /** The identity a scope check runs against: a role, any scope grants, and the person who owns the key. */
116
- export interface ScopeActor {
117
- role: 'admin' | 'member';
118
- scopes?: readonly string[];
119
- owner?: string;
120
- }
121
- /** Personal rows answer to their owner alone: role, key grants and resolver scopes never open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
122
- export declare function canReadScope(actor: ScopeActor, scope: string): boolean;
123
- /** Authorize an explicitly requested scope before any read honours it (member scope grants). */
124
- export declare function assertScopeRequestAllowed(actor: ScopeActor, requested: string | undefined): void;
125
- /** Scope a derived row keeps from one source: the restricted scope itself, else null. */
126
- export declare function derivationScope(scope: string | null | undefined): string | null;
127
- /** The one derivation scope shared by every source, or `{ ok: false }` when
128
- * two disagree, so the caller skips the derived row instead of under-scoping it. */
129
- export declare function commonDerivationScope(scopes: readonly (string | null | undefined)[]): {
130
- ok: true;
131
- scope: string | null;
132
- } | {
133
- ok: false;
134
- };
135
- /** Map-partition key for consolidate/dag/dedup producers: tenant + derivation scope + origin project,
136
- * so a derived row never blends two restricted scopes, a mixed pair, or two projects. */
137
- export declare function derivationPartitionKey(tenantId: string, scope: string | null | undefined, origin: string | null | undefined): string;
138
- //# sourceMappingURL=recall-scope.d.ts.map
@@ -1,216 +0,0 @@
1
- /**
2
- * Recall-side scope predicates, in a leaf module so shared.ts (which api.ts
3
- * imports) can apply the same default-deny rule to searchBothHybrid's internal
4
- * candidate loads without an import cycle. api.ts imports
5
- * these for its own call sites AND re-exports them for back-compat
6
- * (`api.isPrivateScope`, test imports of `passesScopeFilterForRecall`).
7
- */
8
- import { BadRequestError, ForbiddenError } from '../core/api-errors.js';
9
- import { MAX_ID_LEN } from '../util/http-util.js';
10
- /**
11
- * Literal scopes excluded from recall by default-deny when the
12
- * caller passes no `scope`. The SQL clause in `loadSearchRows` and the JS
13
- * helper `passesScopeFilterForRecall` (src/api/index.ts) both read from this
14
- * constant. Adding a deny scope is a one-place change.
15
- *
16
- * Regex-based denies (e.g. `<source>:private:*`) stay in
17
- * `passesScopeFilterForRecall` as a separate JS step — they don't translate
18
- * cleanly to SQL.
19
- *
20
- * Invariant: never empty. An empty array would silently allow quarantine
21
- * scopes through both paths (SQL clause omitted, JS check vacuous). The
22
- * module-load assertion below pins this loudly.
23
- */
24
- export const RECALL_DEFAULT_DENY_SCOPES = ['unknown:legacy'];
25
- /**
26
- * @internal Runtime guard against a future maintainer blanking a
27
- * load-bearing literal array. Extracted from the inline guard so the throw
28
- * path is directly testable. `as const` arrays widen via `readonly T[]` at
29
- * the call site so the empty case is reachable at runtime.
30
- */
31
- export function assertNonEmpty(arr, name) {
32
- if (arr.length === 0) {
33
- throw new Error(`${name} cannot be empty — would silently allow quarantine scopes`);
34
- }
35
- }
36
- assertNonEmpty(RECALL_DEFAULT_DENY_SCOPES, 'RECALL_DEFAULT_DENY_SCOPES');
37
- /**
38
- * Source-agnostic private-scope detector. A scope string is treated
39
- * as private when it has the shape `<lowercase-source>:private:<rest>`.
40
- *
41
- * Examples that match:
42
- * slack:private:Cabc, github:private:owner/repo, jira:private:PROJ-1
43
- * Examples that DO NOT match:
44
- * slack:public:Cgeneral, acme:public:my-private-channel, null, '',
45
- * 'unknown:legacy', 'private' (alone), 'private:foo' (no source prefix).
46
- *
47
- * Used by api.recall, mcp/server.ts (hippo_recall + hippo_context),
48
- * cli.ts (cmdRecall + cmdExplain + continuity), shared.ts (searchBothHybrid
49
- * recall mode). Keep these in sync — the export is the single source of
50
- * truth so connector work cannot drift.
51
- */
52
- export const PRIVATE_SCOPE_RE = /^[a-z][a-z0-9_-]*:private:/;
53
- function isScopeString(value) {
54
- return typeof value === 'string';
55
- }
56
- /** True when `scope` matches the `<source>:private:*` shape. */
57
- export function isPrivateScope(scope) {
58
- if (!isScopeString(scope))
59
- return false;
60
- return PRIVATE_SCOPE_RE.test(scope);
61
- }
62
- export const PERSONAL_SCOPE_PREFIX = 'personal:private:';
63
- // The scope must fit the 256-character scope caps, so the owner gets what the prefix leaves.
64
- export const PERSONAL_OWNER_MAX = MAX_ID_LEN - PERSONAL_SCOPE_PREFIX.length;
65
- /** True for a `personal:private:<owner>` scope, any case, so a case variant is never mistaken for a team scope. */
66
- export function isPersonalScope(scope) {
67
- if (!isScopeString(scope))
68
- return false;
69
- return /^personal:private:/i.test(scope);
70
- }
71
- /** The caller's own personal scope, or null when it has no owner that can hold one. */
72
- export function personalScopeOf(actor) {
73
- const owner = actor?.owner;
74
- if (!owner || owner.length > PERSONAL_OWNER_MAX || /\p{Cc}/u.test(owner))
75
- return null;
76
- return `${PERSONAL_SCOPE_PREFIX}${owner}`;
77
- }
78
- /** Refuses a client-sent `personal:` scope: only the server stamps one, from the caller's owner. */
79
- export function assertClientScope(scope) {
80
- if (isScopeString(scope) && /^personal:/i.test(scope)) {
81
- throw new BadRequestError(`scope ${scope} is reserved: the server sets personal scopes itself`);
82
- }
83
- }
84
- /** True when `actor` may change or delete a row in `scope`: any non-personal scope, or its own personal one. */
85
- export function canTouchScope(actor, scope) {
86
- return ownScopeTouches(personalScopeOf(actor), scope);
87
- }
88
- /** canTouchScope for a caller known by its own personal scope, as a store method receives it. */
89
- export function ownScopeTouches(ownScope, scope) {
90
- return !isPersonalScope(scope) || scope === ownScope;
91
- }
92
- /**
93
- * Recall-side scope filter — the canonical JS half of the recall default-deny
94
- * rule (the SQL half lives in `loadSearchRows` via `loadRecallSearchEntries`).
95
- *
96
- * - When `requested` is set and non-empty: exact match required.
97
- * - When `requested` is undefined/empty: default-deny on any
98
- * `<source>:private:*` scope and on the `RECALL_DEFAULT_DENY_SCOPES`
99
- * quarantine buckets. `null` and public scopes pass, and so does `ownScope`, the caller's own personal scope.
100
- */
101
- export function passesScopeFilterForRecall(scope, requested, ownScope) {
102
- if (requested !== undefined && requested !== '') {
103
- return scope === requested;
104
- }
105
- return !isRestrictedScope(scope) || (ownScope != null && scope === ownScope);
106
- }
107
- /** SQL twin of the no-request arm of passesScopeFilterForRecall; `ownScope` is bound and compared with `=`, so `%` or `_` in an owner match nothing extra. */
108
- export function scopeAdmitSql(col, ownScope) {
109
- const placeholders = RECALL_DEFAULT_DENY_SCOPES.map(() => '?').join(', ');
110
- const admitted = `${col}scope IS NULL OR (${col}scope NOT IN (${placeholders}) AND ${col}scope NOT LIKE '%:private:%')`;
111
- if (ownScope == null)
112
- return { sql: `(${admitted})`, params: [...RECALL_DEFAULT_DENY_SCOPES] };
113
- // The own arm sits inside the outer parentheses so a caller's `AND ${sql}` cannot split it off.
114
- return { sql: `(${admitted} OR ${col}scope = ?)`, params: [...RECALL_DEFAULT_DENY_SCOPES, ownScope] };
115
- }
116
- /** SQL twin of canTouchScope, which is also canReadScope for an admin: every row but another person's personal one. LIKE folds ASCII case as isPersonalScope's /i does. */
117
- export function touchableScopeSql(col, ownScope) {
118
- const notPersonal = `${col}scope IS NULL OR ${col}scope NOT LIKE '${PERSONAL_SCOPE_PREFIX}%'`;
119
- if (ownScope == null)
120
- return { sql: `(${notPersonal})`, params: [] };
121
- return { sql: `(${notPersonal} OR ${col}scope = ?)`, params: [ownScope] };
122
- }
123
- /**
124
- * The CLI `--scope` variant of the recall filter (JS half of the
125
- * SQL 'default-deny-or-exact' mode in loadSearchRows).
126
- *
127
- * The CLI flag predates the envelope column as a TAG-boost ranking hint
128
- * (`scope:<v>` tags, HIPPO_SCOPE, detectScope()), so an explicit `--scope X`
129
- * UNLOCKS envelope scope X in addition to the default-admitted set — it does
130
- * NOT narrow the result to X (that would return zero rows for every
131
- * tag-scoped workflow, whose envelope scope is NULL). api.recall keeps the
132
- * narrowing 'exact' semantics via `passesScopeFilterForRecall`.
133
- *
134
- * Note the unlock applies to whatever scope was explicitly named — including
135
- * a private scope or a quarantine bucket (`--scope unknown:legacy`). That is
136
- * deliberate owner access, identical in reach to api.recall's exact-match
137
- * for the same input; only NON-requested private/quarantine scopes stay
138
- * denied. A named personal scope never unlocks: the CLI has no caller identity to check it against.
139
- */
140
- export function passesCliRecallScopeFilter(scope, requested) {
141
- if (requested !== undefined && requested !== '' && !isPersonalScope(requested) && scope === requested) {
142
- return true;
143
- }
144
- return passesScopeFilterForRecall(scope, undefined);
145
- }
146
- /**
147
- * Thrown when a caller requests a scope its role may not read. The HTTP layer
148
- * maps it to 403.
149
- */
150
- export class ScopeForbiddenError extends ForbiddenError {
151
- scope;
152
- constructor(scope) {
153
- super(`scope ${scope} requires admin role`);
154
- this.name = 'ScopeForbiddenError';
155
- this.scope = scope;
156
- }
157
- }
158
- /**
159
- * True for scopes that default-deny hides: `<source>:private:*` and the
160
- * quarantine buckets. Naming one explicitly is what unlocks it, so naming one
161
- * is the act that needs authorization.
162
- */
163
- export function isRestrictedScope(scope) {
164
- if (!isScopeString(scope))
165
- return false;
166
- // SAFETY: RECALL_DEFAULT_DENY_SCOPES is a readonly tuple of string
167
- // literals; widening the array (not the input) lets .includes() take any scope.
168
- // `:private:` anywhere, any case, matches the store's SQL default-deny (store/search-rows.ts) so JS never admits what SQL hides.
169
- return isPrivateScope(scope) || /:private:/i.test(scope) || RECALL_DEFAULT_DENY_SCOPES.includes(scope);
170
- }
171
- /** Personal rows answer to their owner alone: role, key grants and resolver scopes never open one. Else admin reads all; a member needs an exact grant on a restricted scope. */
172
- export function canReadScope(actor, scope) {
173
- if (isPersonalScope(scope))
174
- return scope === personalScopeOf(actor);
175
- if (actor.role === 'admin')
176
- return true;
177
- if (!isRestrictedScope(scope))
178
- return true;
179
- return (actor.scopes ?? []).includes(scope);
180
- }
181
- /** Authorize an explicitly requested scope before any read honours it (member scope grants). */
182
- export function assertScopeRequestAllowed(actor, requested) {
183
- if (requested === undefined || requested === '')
184
- return;
185
- if (canReadScope(actor, requested))
186
- return;
187
- throw new ScopeForbiddenError(requested);
188
- }
189
- /** Scope a derived row keeps from one source: the restricted scope itself, else null. */
190
- export function derivationScope(scope) {
191
- return isRestrictedScope(scope) ? (scope ?? null) : null;
192
- }
193
- /** The one derivation scope shared by every source, or `{ ok: false }` when
194
- * two disagree, so the caller skips the derived row instead of under-scoping it. */
195
- export function commonDerivationScope(scopes) {
196
- let common = null;
197
- let seen = false;
198
- for (const raw of scopes) {
199
- const scope = derivationScope(raw);
200
- if (!seen) {
201
- common = scope;
202
- seen = true;
203
- }
204
- else if (scope !== common) {
205
- return { ok: false };
206
- }
207
- }
208
- return { ok: true, scope: common };
209
- }
210
- /** Map-partition key for consolidate/dag/dedup producers: tenant + derivation scope + origin project,
211
- * so a derived row never blends two restricted scopes, a mixed pair, or two projects. */
212
- export function derivationPartitionKey(tenantId, scope, origin) {
213
- const project = origin === undefined ? '\u0002' : origin ?? '\u0001'; // unstamped, unknown and named never share a bucket
214
- return `${tenantId}\u0000${derivationScope(scope) ?? ''}\u0000${project}`;
215
- }
216
- //# sourceMappingURL=recall-scope.js.map
@@ -1,13 +0,0 @@
1
- import { type DatabaseSyncLike } from '../db/index.js';
2
- import type { MemoryEntry } from '../core/memory.js';
3
- import type { PhysicsParticle } from '../core/physics.js';
4
- import type { VectorBackfillQuery, VectorWrite, VectorWriteResult } from './port.js';
5
- export declare function entriesWithoutVectorAt(db: DatabaseSyncLike, query: VectorBackfillQuery): MemoryEntry[];
6
- export declare function writeVectorsAt(db: DatabaseSyncLike, write: VectorWrite): VectorWriteResult;
7
- /** Every particle stored under `hippoRoot`. */
8
- export declare function loadStoredParticles(hippoRoot: string): PhysicsParticle[];
9
- /** Writes `particles` over their stored state under `hippoRoot`, as one batch. */
10
- export declare function saveStoredParticles(hippoRoot: string, particles: PhysicsParticle[]): void;
11
- /** Replaces every particle under `hippoRoot` with a fresh one per entry that has an embedding; returns how many. */
12
- export declare function resetStoredParticles(hippoRoot: string, entries: MemoryEntry[], embeddingIndex: Record<string, number[]>): number;
13
- //# sourceMappingURL=vector-writes.d.ts.map