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,112 @@
1
+ // First-class object verbs for incidents: open one, resolve it, close it.
2
+ import { extractPathTags } from '../search/path-context.js';
3
+ import * as incidentsModule from '../objects/incidents.js';
4
+ import { printError } from './output.js';
5
+ import { nonEmptyStringFlag, isStringFlag, stringFlag } from './flag-values.js';
6
+ import { requireInit } from './shared.js';
7
+ import { closeObject, foundOrExit, idArgOrExit, listObjects } from './object-verbs.js';
8
+ import { CliExit } from './exit.js';
9
+ const INCIDENT = { cmd: 'incident', noun: 'Incident', idLabel: 'incident' };
10
+ function printIncidentRow(inc) {
11
+ const linkPart = inc.linkedMemoryIds.length > 0 ? ` links=${inc.linkedMemoryIds.length}` : '';
12
+ console.log(`#${inc.id} [${inc.status}]${linkPart} memory=${inc.memoryId ?? '-'}`);
13
+ console.log(` ${inc.incidentText}`);
14
+ if (inc.context)
15
+ console.log(` context: ${inc.context}`);
16
+ }
17
+ function incidentList(hippoRoot, tenantId, flags) {
18
+ listObjects(flags, {
19
+ plural: 'incidents',
20
+ states: incidentsModule.VALID_INCIDENT_STATES,
21
+ load: (opts) => incidentsModule.loadIncidents(hippoRoot, tenantId, opts),
22
+ printRow: printIncidentRow,
23
+ });
24
+ }
25
+ function incidentGet(hippoRoot, tenantId, args) {
26
+ const id = idArgOrExit(args, 'Usage: hippo incident get <id>', INCIDENT.idLabel);
27
+ const incident = foundOrExit(incidentsModule.loadIncidentById(hippoRoot, tenantId, id), INCIDENT.noun, id);
28
+ console.log(`Incident #${incident.id}`);
29
+ console.log(` status: ${incident.status}`);
30
+ console.log(` text: ${incident.incidentText}`);
31
+ if (incident.context)
32
+ console.log(` context: ${incident.context}`);
33
+ if (incident.resolutionText)
34
+ console.log(` resolution: ${incident.resolutionText}`);
35
+ if (incident.resolvedAt)
36
+ console.log(` resolved_at: ${incident.resolvedAt}`);
37
+ if (incident.closedAt)
38
+ console.log(` closed_at: ${incident.closedAt}`);
39
+ if (incident.linkedMemoryIds.length > 0) {
40
+ console.log(` linked memories: ${incident.linkedMemoryIds.join(', ')}`);
41
+ }
42
+ if (incident.memoryId)
43
+ console.log(` memory: ${incident.memoryId}`);
44
+ console.log(` created: ${incident.createdAt}`);
45
+ }
46
+ function incidentResolve(hippoRoot, tenantId, args, flags) {
47
+ const id = idArgOrExit(args, 'Usage: hippo incident resolve <id> --resolution "<text>"', INCIDENT.idLabel);
48
+ const resolutionRaw = stringFlag(flags, 'resolution');
49
+ if (!resolutionRaw?.trim()) {
50
+ printError('--resolution requires a non-empty value, e.g. hippo incident resolve <id> --resolution "root cause fixed".');
51
+ throw new CliExit(1);
52
+ }
53
+ const resolved = incidentsModule.resolveIncident(hippoRoot, tenantId, id, resolutionRaw);
54
+ console.log(`Incident #${resolved.id} resolved.`);
55
+ }
56
+ function incidentClose(hippoRoot, tenantId, args) {
57
+ closeObject(args, INCIDENT, (id) => incidentsModule.closeIncident(hippoRoot, tenantId, id));
58
+ }
59
+ export function handleIncident({ hippoRoot, tenantId, args, flags }) {
60
+ requireInit(hippoRoot);
61
+ const subcommand = args[0] ?? '';
62
+ if (subcommand === 'list')
63
+ return incidentList(hippoRoot, tenantId, flags);
64
+ if (subcommand === 'get')
65
+ return incidentGet(hippoRoot, tenantId, args);
66
+ if (subcommand === 'resolve')
67
+ return incidentResolve(hippoRoot, tenantId, args, flags);
68
+ if (subcommand === 'close')
69
+ return incidentClose(hippoRoot, tenantId, args);
70
+ // Default subcommand is open (create): accept both `incident open "<text>"` and bare `incident "<text>"`;
71
+ // for the `open` keyword the text is args[1], otherwise args[0] is the text.
72
+ incidentCreate(hippoRoot, tenantId, subcommand === 'open' ? (args[1] ?? '') : subcommand, flags);
73
+ }
74
+ function incidentCreate(hippoRoot, tenantId, incidentText, flags) {
75
+ if (!incidentText) {
76
+ printError('Usage: hippo incident "<incident>" [--context "<details>"] [--link <memory-id>]...');
77
+ printError(' hippo incident list [--status open|resolved|closed|all] [--limit N]');
78
+ printError(' hippo incident get <id>');
79
+ printError(' hippo incident resolve <id> --resolution "<text>"');
80
+ printError(' hippo incident close <id>');
81
+ throw new CliExit(1);
82
+ }
83
+ const context = nonEmptyStringFlag(flags, 'context');
84
+ // --link is a repeatable flag (collected into an array by parseArgs). A
85
+ // single --link <id> yields a string; normalize both to string[].
86
+ const linkRaw = flags['link'];
87
+ let linkedMemoryIds;
88
+ if (Array.isArray(linkRaw)) {
89
+ linkedMemoryIds = linkRaw;
90
+ }
91
+ else if (isStringFlag(linkRaw)) {
92
+ linkedMemoryIds = [linkRaw];
93
+ }
94
+ else if (linkRaw === true) {
95
+ printError('--link requires a memory id, e.g. hippo incident "<text>" --link mem_abc123.');
96
+ throw new CliExit(1);
97
+ }
98
+ const incidentPathTags = extractPathTags(process.cwd());
99
+ const created = incidentsModule.saveIncident(hippoRoot, tenantId, {
100
+ incidentText,
101
+ context,
102
+ linkedMemoryIds,
103
+ extraTags: incidentPathTags,
104
+ });
105
+ console.log(`Incident recorded: #${created.id}`);
106
+ if (created.memoryId)
107
+ console.log(` memory: ${created.memoryId}`);
108
+ if (created.linkedMemoryIds.length > 0) {
109
+ console.log(` linked memories: ${created.linkedMemoryIds.join(', ')}`);
110
+ }
111
+ }
112
+ //# sourceMappingURL=incidents.js.map
@@ -1,3 +1,3 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleInit({ hippoRoot, flags }: CommandContext): void;
2
+ export declare function handleInit({ hippoRoot, tenantId, flags }: CommandContext): void;
3
3
  //# sourceMappingURL=init.d.ts.map
package/dist/cli/init.js CHANGED
@@ -8,18 +8,23 @@ import { writeFileAtomic } from '../util/atomic-write.js';
8
8
  import { isCodexPresent } from '../hooks/shared.js';
9
9
  import { isCodexWrapperInstalled } from '../hooks/codex-wrapper.js';
10
10
  import { installOpencodePlugin } from '../hooks/opencode.js';
11
- import { isInitialized, initStore } from '../store/open.js';
12
- import { loadAllEntries } from '../store/entry-reads.js';
11
+ import { initMemoryStore } from '../api/store-init.js';
12
+ import { isInitialized } from '../core/project-identity.js';
13
+ import { listMemories } from '../api/memories.js';
14
+ import { cliApiContext } from './api-context.js';
13
15
  import { isGitRepo } from '../learn/autolearn.js';
14
16
  import { currentMachine, importForStore, importProjectMemories, importUserMemories } from '../agent-memories/sync.js';
15
17
  import { emptyReport, mergeReports } from '../agent-memories/report.js';
16
18
  import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
17
19
  import { registerWorkspace } from './scheduler.js';
18
- import { stringFlag } from './flag-values.js';
20
+ import { numberFlag, stringFlag } from './flag-values.js';
19
21
  import { printAgentImport } from './print.js';
22
+ import { errorCode, errorMessage, log } from '../util/log.js';
20
23
  import { installCodexMemoryHooks, setupDailySchedule, warnClaudeSettingsUnusable } from './install-steps.js';
21
24
  import { learnFromRepo, skipLearnOnSharedStore } from './shared.js';
22
25
  import { HOOK_MARKERS, HOOKS, hippoBlock } from '../hooks/hook-blocks.js';
26
+ // An unreadable or vanished folder is expected while scanning; any other failure is worth a line.
27
+ const QUIET_SCAN_ERRORS = new Set(['EACCES', 'EPERM', 'ENOENT', 'ENOTDIR']);
23
28
  function scanForGitRepos(rootDir, maxDepth = 2) {
24
29
  const repos = [];
25
30
  function walk(dir, depth) {
@@ -40,7 +45,11 @@ function scanForGitRepos(rootDir, maxDepth = 2) {
40
45
  walk(full, depth + 1);
41
46
  }
42
47
  }
43
- catch { /* permission denied, etc */ }
48
+ catch (err) {
49
+ const code = errorCode(err);
50
+ if (!QUIET_SCAN_ERRORS.has(code))
51
+ log.warn(`repo scan skipped ${dir}`, { code: code || 'unknown', reason: errorMessage(err) });
52
+ }
44
53
  }
45
54
  // Check if rootDir itself is a git repo
46
55
  if (fs.existsSync(path.join(rootDir, '.git')))
@@ -49,22 +58,22 @@ function scanForGitRepos(rootDir, maxDepth = 2) {
49
58
  return repos;
50
59
  }
51
60
  /** Creates the repo's store when absent and registers it; returns whether it already existed. */
52
- function initScannedRepo(repo, globalRoot) {
61
+ function initScannedRepo(repo, tenantId, globalRoot) {
53
62
  const repoHippo = path.join(repo, '.hippo');
54
63
  const alreadyExists = isInitialized(repoHippo);
55
64
  if (!alreadyExists) {
56
- initStore(repoHippo);
65
+ initMemoryStore(cliApiContext(repoHippo, tenantId));
57
66
  }
58
67
  registerWorkspace(globalRoot, repo);
59
68
  return alreadyExists;
60
69
  }
61
70
  /** Seeds one scanned repo from git history and its agents' notes, unless --no-learn. */
62
- function learnScannedRepo(repo, seedDays, learn, machine, agentImport) {
71
+ function learnScannedRepo(repo, tenantId, seedDays, learn, machine, agentImport) {
63
72
  const repoHippo = path.join(repo, '.hippo');
64
73
  let added = 0;
65
74
  let lowInfo = 0;
66
75
  if (learn && isGitRepo(repo)) {
67
- const result = learnFromRepo(repoHippo, repo, seedDays, path.basename(repo));
76
+ const result = learnFromRepo(repoHippo, tenantId, repo, seedDays, path.basename(repo));
68
77
  added = result.added;
69
78
  lowInfo = result.lowInfo;
70
79
  }
@@ -93,7 +102,7 @@ function printScanSummary(repoCount, totalLessons, totalLowInfo) {
93
102
  (totalLowInfo > 0 ? `, ${totalLowInfo} low-information subject(s) dropped` : '') +
94
103
  '.');
95
104
  }
96
- function cmdInitScan(scanDir, flags) {
105
+ function cmdInitScan(scanDir, tenantId, flags) {
97
106
  const resolved = path.resolve(scanDir);
98
107
  console.log(`Scanning ${resolved} for git repositories...\n`);
99
108
  const repos = scanForGitRepos(resolved);
@@ -106,17 +115,17 @@ function cmdInitScan(scanDir, flags) {
106
115
  let totalLessons = 0;
107
116
  // Rolled up so the cross-repo summary reports the gate too: a dropped subject is never invisible.
108
117
  let totalLowInfo = 0;
109
- const seedDays = parseInt(String(flags['days'] ?? '365'), 10);
118
+ const seedDays = numberFlag(flags, 'days') ?? 365;
110
119
  const machine = currentMachine();
111
120
  const agentImport = emptyReport();
112
121
  const learn = !flags['no-learn'];
113
122
  for (const repo of repos) {
114
- const alreadyExists = initScannedRepo(repo, globalRoot);
115
- const { added, lowInfo } = learnScannedRepo(repo, seedDays, learn, machine, agentImport);
123
+ const alreadyExists = initScannedRepo(repo, tenantId, globalRoot);
124
+ const { added, lowInfo } = learnScannedRepo(repo, tenantId, seedDays, learn, machine, agentImport);
116
125
  totalLessons += added;
117
126
  totalLowInfo += lowInfo;
118
127
  const status = alreadyExists ? 'existing' : 'new';
119
- const entries = loadAllEntries(path.join(repo, '.hippo'));
128
+ const entries = listMemories(cliApiContext(path.join(repo, '.hippo'), tenantId), { everyTenant: true });
120
129
  console.log(` ${path.basename(repo).padEnd(25)} ${status.padEnd(10)} ${entries.length} memories${added > 0 ? ` (+${added} from git)` : ''}`);
121
130
  }
122
131
  printScanSummary(repos.length, totalLessons, totalLowInfo);
@@ -144,12 +153,12 @@ function initGlobalOnly(flags) {
144
153
  if (!flags['no-learn'])
145
154
  printAgentImport(importUserMemories(globalRoot, { machine: currentMachine() }));
146
155
  }
147
- function seedFromGitHistory(hippoRoot) {
156
+ function seedFromGitHistory(hippoRoot, tenantId) {
148
157
  if (!isGitRepo(process.cwd()))
149
158
  return;
150
159
  const seedDays = 30;
151
160
  console.log(`\n Seeding memories from last ${seedDays} days of git history...`);
152
- const { added, skipped } = learnFromRepo(hippoRoot, process.cwd(), seedDays);
161
+ const { added, skipped } = learnFromRepo(hippoRoot, tenantId, process.cwd(), seedDays);
153
162
  if (added > 0) {
154
163
  console.log(` Learned ${added} lessons from git (${skipped} duplicates skipped).`);
155
164
  }
@@ -157,11 +166,11 @@ function seedFromGitHistory(hippoRoot) {
157
166
  console.log(` No matching commits found in git history.`);
158
167
  }
159
168
  }
160
- export function handleInit({ hippoRoot, flags }) {
169
+ export function handleInit({ hippoRoot, tenantId, flags }) {
161
170
  // Handle --scan mode
162
171
  if (flags['scan']) {
163
172
  const scanDir = stringFlag(flags, 'scan') ?? os.homedir();
164
- cmdInitScan(scanDir, flags);
173
+ cmdInitScan(scanDir, tenantId, flags);
165
174
  return;
166
175
  }
167
176
  if (flags['global']) {
@@ -173,7 +182,7 @@ export function handleInit({ hippoRoot, flags }) {
173
182
  console.log('Already initialized at', hippoRoot);
174
183
  }
175
184
  else {
176
- initStore(hippoRoot);
185
+ initMemoryStore(cliApiContext(hippoRoot, tenantId));
177
186
  console.log('Initialized Hippo at', hippoRoot);
178
187
  console.log(' Directories: buffer/ episodic/ semantic/ conflicts/');
179
188
  console.log(' Files: hippo.db stats.json');
@@ -190,7 +199,7 @@ export function handleInit({ hippoRoot, flags }) {
190
199
  const learn = !flags['no-learn'] && !skipLearnOnSharedStore(hippoRoot);
191
200
  // Seed with git history on first init (unless --no-learn)
192
201
  if (!alreadyExists && learn && !flags['global'])
193
- seedFromGitHistory(hippoRoot);
202
+ seedFromGitHistory(hippoRoot, tenantId);
194
203
  // Every run, not only the first: an agent's notes change between inits.
195
204
  if (learn)
196
205
  printAgentImport(importForStore(hippoRoot, { machine: currentMachine() }));
@@ -1,7 +1,8 @@
1
1
  import { type InstallResult } from '../hooks/json-hooks.js';
2
2
  /** Adds hippo's two Codex hooks and says what changed; each install ends on the trust reminder, since Codex skips an untrusted hook. */
3
3
  export declare function installCodexMemoryHooks(indent: string): void;
4
- /** The one line init, hook install, hook uninstall and setup print when Claude Code's settings.json is not JSON hippo can edit and so was left unchanged; true when it printed. */
4
+ /** The one line init, hook install, hook uninstall and setup print when Claude Code's settings.json is not JSON hippo can edit and so was
5
+ * left unchanged; true when it printed. */
5
6
  export declare function warnClaudeSettingsUnusable(result: Pick<InstallResult, 'settingsPath' | 'invalidJson'>, indent: string, action?: 'install' | 'uninstall'): boolean;
6
7
  export declare function setupDailySchedule(globalRoot: string): void;
7
8
  //# sourceMappingURL=install-steps.d.ts.map
@@ -3,7 +3,8 @@ import * as path from 'path';
3
3
  import { execFileSync, execSync } from 'child_process';
4
4
  import { installJsonHooks } from '../hooks/json-hooks.js';
5
5
  import { CODEX_TRUST_LINE } from '../hooks/shared.js';
6
- import { DAILY_TASK_NAME, buildDailyRunnerCommand, hasUnsafeRunnerPathChars, buildSchtasksCreateArgs, buildWindowsTaskRun, quoteInsideWindowsArg } from './scheduler.js';
6
+ import { envSkipSchedule } from '../util/env.js';
7
+ import { DAILY_TASK_NAME, buildDailyRunnerCommand, hasUnsafeRunnerPathChars, buildSchtasksCreateArgs, buildWindowsTaskRun, quoteInsideWindowsArg, } from './scheduler.js';
7
8
  /** Adds hippo's two Codex hooks and says what changed; each install ends on the trust reminder, since Codex skips an untrusted hook. */
8
9
  export function installCodexMemoryHooks(indent) {
9
10
  const result = installJsonHooks('codex');
@@ -20,11 +21,13 @@ export function installCodexMemoryHooks(indent) {
20
21
  : `${indent}hippo's Codex memory hooks already in ${result.settingsPath}`);
21
22
  console.log(`${indent}${CODEX_TRUST_LINE}`);
22
23
  }
23
- /** The one line init, hook install, hook uninstall and setup print when Claude Code's settings.json is not JSON hippo can edit and so was left unchanged; true when it printed. */
24
+ /** The one line init, hook install, hook uninstall and setup print when Claude Code's settings.json is not JSON hippo can edit and so was
25
+ * left unchanged; true when it printed. */
24
26
  export function warnClaudeSettingsUnusable(result, indent, action = 'install') {
25
27
  if (!result.invalidJson)
26
28
  return false;
27
- console.log(`${indent}WARNING: ${result.settingsPath} is not a JSON object hippo can merge into, so it was left unchanged; fix it, then run \`hippo hook ${action} claude-code\`.`);
29
+ console.log(`${indent}WARNING: ${result.settingsPath} is not a JSON object hippo can merge into, so it was left unchanged; ` +
30
+ `fix it, then run \`hippo hook ${action} claude-code\`.`);
28
31
  return true;
29
32
  }
30
33
  /** Machine-level daily runner sweeping all registered workspaces: user crontab on Linux/macOS, a scheduled task on Windows; skips if installed. */
@@ -38,6 +41,11 @@ function warnSchedulerTimedOut(command) {
38
41
  console.log(` ${command} did not answer within ${SCHEDULER_CALL_TIMEOUT_MS / 1000} s and was stopped, so the daily runner is not scheduled.`);
39
42
  }
40
43
  export function setupDailySchedule(globalRoot) {
44
+ // Checked here, not per caller, so init, init --scan and setup all honour it.
45
+ if (envSkipSchedule()) {
46
+ console.log(' HIPPO_SKIP_SCHEDULE=1, so the machine-level daily runner was not scheduled.');
47
+ return;
48
+ }
41
49
  const runnerDir = path.resolve(globalRoot);
42
50
  if (hasUnsafeRunnerPathChars(runnerDir, process.platform)) {
43
51
  console.log(` Skipping schedule: runner path contains unsafe characters.`);
@@ -1,7 +1,7 @@
1
1
  // `hippo last-sleep`: the previous session's sleep log for the debug log, and one problems line for the user.
2
2
  import * as fs from 'fs';
3
3
  import { isStringValue } from '../core/capture-contract.js';
4
- import { REPLAY_AFTER_MS } from '../capture/compaction-record.js';
4
+ import { REPLAY_AFTER_MS } from '../core/compaction-timing.js';
5
5
  import { SPOOL_PROBLEM, spoolCounts } from '../capture/compaction-spool.js';
6
6
  import { defaultSleepLogPath } from '../hooks/shared.js';
7
7
  import { errorMessage, log } from '../util/log.js';
@@ -0,0 +1,2 @@
1
+ export declare function parseObjectId(idRaw: string, noun: string): number;
2
+ //# sourceMappingURL=lenient-id.d.ts.map
@@ -0,0 +1,13 @@
1
+ // The id parser the predict and decide verbs share.
2
+ import { printError } from './output.js';
3
+ import { CliExit } from './exit.js';
4
+ // Lenient on purpose (parseInt reads "1abc" as 1) until the next major version; the other object verbs use the strict parser.
5
+ export function parseObjectId(idRaw, noun) {
6
+ const id = parseInt(String(idRaw), 10);
7
+ if (!Number.isFinite(id) || id <= 0) {
8
+ printError(`Invalid ${noun} id: "${idRaw}"`);
9
+ throw new CliExit(1);
10
+ }
11
+ return id;
12
+ }
13
+ //# sourceMappingURL=lenient-id.js.map
@@ -1,6 +1,6 @@
1
- import { type EmbeddingProvider } from '../store/embeddings/provider.js';
1
+ import { type EmbeddingProvider } from '../embeddings/provider.js';
2
2
  import { type CommandContext } from './flag-values.js';
3
3
  export declare function handleRefine({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
4
- export declare function handleDedup({ hippoRoot, flags }: CommandContext): void;
5
- export declare function handleEmbed({ hippoRoot, flags }: CommandContext, given?: EmbeddingProvider): Promise<void>;
4
+ export declare function handleDedup({ hippoRoot, tenantId, flags }: CommandContext): void;
5
+ export declare function handleEmbed({ hippoRoot, tenantId, flags }: CommandContext, given?: EmbeddingProvider): Promise<void>;
6
6
  //# sourceMappingURL=maintenance.d.ts.map
@@ -1,14 +1,14 @@
1
1
  // Store upkeep verbs: `hippo refine`, `hippo dedup` and `hippo embed`.
2
2
  import { envAnthropicApiKey } from '../util/env.js';
3
- import { loadAllEntries, loadAllEntryIds } from '../store/entry-reads.js';
4
3
  import { deduplicateStore } from '../consolidate/dedupe.js';
5
- import { embedAll } from '../store/embeddings/index.js';
6
- import { resolveEmbeddingProvider } from '../store/embeddings/provider.js';
7
- import { loadEmbeddingIndex, resetStoredParticles } from '../store/vector-index.js';
4
+ import { resolveEmbeddingProvider } from '../embeddings/provider.js';
5
+ import { embedCoverage, embedMissingMemories, resetPhysicsFromVectors, storedVectorCount } from '../api/embeddings.js';
6
+ import { countAllMemories } from '../api/memories.js';
7
+ import { cliApiContext } from './api-context.js';
8
8
  import { loadConfig } from '../core/config.js';
9
9
  import { refineStore } from './refine-llm.js';
10
10
  import { printError } from './output.js';
11
- import { boolFlag } from './flag-values.js';
11
+ import { boolFlag, numberFlag } from './flag-values.js';
12
12
  import { requireInit, resolveAuthRoot } from './shared.js';
13
13
  import { errorMessage } from '../util/log.js';
14
14
  import { CliExit } from './exit.js';
@@ -24,7 +24,7 @@ export async function handleRefine({ hippoRoot, tenantId, flags }) {
24
24
  }
25
25
  const dryRun = boolFlag(flags, 'dry-run');
26
26
  const all = boolFlag(flags, 'all');
27
- const limit = flags['limit'] !== undefined ? parseInt(String(flags['limit']), 10) : undefined;
27
+ const limit = numberFlag(flags, 'limit');
28
28
  const model = flags['model'] ? String(flags['model']) : undefined;
29
29
  const asJson = boolFlag(flags, 'json');
30
30
  const result = await refineStore(hippoRoot, {
@@ -50,14 +50,14 @@ export async function handleRefine({ hippoRoot, tenantId, flags }) {
50
50
  }
51
51
  }
52
52
  }
53
- export function handleDedup({ hippoRoot, flags }) {
53
+ export function handleDedup({ hippoRoot, tenantId, flags }) {
54
54
  requireInit(hippoRoot);
55
55
  const dryRun = boolFlag(flags, 'dry-run');
56
56
  if (flags['threshold'] !== undefined) {
57
57
  printError('hippo dedup: --threshold is ignored; a duplicate is the same text apart from spacing.');
58
58
  }
59
- const entries = loadAllEntries(hippoRoot);
60
- console.log(`Scanning ${entries.length} memories for duplicates (same text apart from spacing)${dryRun ? ' (dry run)' : ''}...\n`);
59
+ const total = countAllMemories(cliApiContext(hippoRoot, tenantId));
60
+ console.log(`Scanning ${total} memories for duplicates (same text apart from spacing)${dryRun ? ' (dry run)' : ''}...\n`);
61
61
  const result = deduplicateStore(hippoRoot, { dryRun });
62
62
  if (result.removed === 0) {
63
63
  console.log('No duplicates found.');
@@ -100,18 +100,19 @@ function printDedupPairs(result, dryRun) {
100
100
  }
101
101
  }
102
102
  // Embed command
103
- export async function handleEmbed({ hippoRoot, flags }, given) {
103
+ export async function handleEmbed({ hippoRoot, tenantId, flags }, given) {
104
104
  // --global mirrors resolveAuthRoot: initGlobal() + the global root, skipping the local requireInit,
105
105
  // so it heals pre-1.27.0 global stores from a directory with no local .hippo.
106
106
  const root = resolveAuthRoot(hippoRoot, flags);
107
+ const ctx = cliApiContext(root, tenantId);
107
108
  // --status and --reset-physics only read cached state, so they must work with no provider key (e.g. removed after an earlier embed);
108
109
  // the provider-availability gate is deferred to the embed path.
109
110
  if (flags['reset-physics']) {
110
- resetPhysics(root);
111
+ resetPhysics(ctx);
111
112
  return;
112
113
  }
113
114
  if (flags['status']) {
114
- printEmbedStatus(root);
115
+ printEmbedStatus(ctx);
115
116
  return;
116
117
  }
117
118
  const provider = readyEmbedProvider(root, given);
@@ -120,40 +121,38 @@ export async function handleEmbed({ hippoRoot, flags }, given) {
120
121
  console.log('Embedding all memories (this may take a moment on first run to download model)...');
121
122
  let count;
122
123
  try {
123
- count = await embedAll(root, undefined, provider);
124
+ count = await embedMissingMemories(ctx, provider);
124
125
  }
125
126
  catch (err) {
126
127
  printError(`Embedding failed: ${errorMessage(err)}`);
127
- const partial = loadEmbeddingIndex(root);
128
- printError(`Partial progress saved: ${Object.keys(partial).length} embeddings on disk. Re-run \`hippo embed\` to resume.`);
128
+ printError(`Partial progress saved: ${storedVectorCount(ctx)} embeddings on disk. Re-run \`hippo embed\` to resume.`);
129
129
  process.exitCode = 1;
130
130
  return;
131
131
  }
132
- const entriesAfter = loadAllEntries(root);
133
- const embIndexAfter = loadEmbeddingIndex(root);
134
- console.log(`Done. ${count} new embeddings created. ${Object.keys(embIndexAfter).length}/${entriesAfter.length} total.`);
135
- const unembedded = entriesAfter.filter((e) => !embIndexAfter[e.id]).length;
132
+ const after = embedCoverage(ctx);
133
+ console.log(`Done. ${count} new embeddings created. ${after.vectorIds.length}/${after.memoryIds.length} total.`);
134
+ const embeddedAfter = new Set(after.vectorIds);
135
+ const unembedded = after.memoryIds.filter((id) => !embeddedAfter.has(id)).length;
136
136
  if (unembedded > 0) {
137
137
  printError(`${unembedded} memories are still not embedded (the warnings above name them). Re-run \`hippo embed\` to retry.`);
138
138
  process.exitCode = 1;
139
139
  }
140
140
  }
141
- function resetPhysics(root) {
142
- const embIndex = loadEmbeddingIndex(root);
143
- const count = resetStoredParticles(root, loadAllEntryIds(root), embIndex);
141
+ function resetPhysics(ctx) {
142
+ const count = resetPhysicsFromVectors(ctx);
144
143
  console.log(`Reset physics state: ${count} particles re-initialized from embeddings.`);
145
144
  }
146
- function printEmbedStatus(root) {
147
- const entries = loadAllEntries(root);
148
- const embIndex = loadEmbeddingIndex(root);
149
- const activeIds = new Set(entries.map((e) => e.id));
150
- const activeEmbedded = Object.keys(embIndex).filter((id) => activeIds.has(id)).length;
151
- const orphaned = Object.keys(embIndex).length - activeEmbedded;
152
- console.log(`Embedding status: ${activeEmbedded}/${entries.length} memories embedded`);
145
+ function printEmbedStatus(ctx) {
146
+ const { memoryIds, vectorIds } = embedCoverage(ctx);
147
+ const activeIds = new Set(memoryIds);
148
+ const activeEmbedded = vectorIds.filter((id) => activeIds.has(id)).length;
149
+ const orphaned = vectorIds.length - activeEmbedded;
150
+ console.log(`Embedding status: ${activeEmbedded}/${memoryIds.length} memories embedded`);
153
151
  if (orphaned > 0) {
154
152
  console.log(` ${orphaned} orphaned embeddings (run \`hippo embed\` to prune)`);
155
153
  }
156
- const missing = entries.filter((e) => !embIndex[e.id]);
154
+ const embedded = new Set(vectorIds);
155
+ const missing = memoryIds.filter((id) => !embedded.has(id));
157
156
  if (missing.length > 0) {
158
157
  console.log(` ${missing.length} memories need embedding (run \`hippo embed\` to embed them)`);
159
158
  }
@@ -0,0 +1,2 @@
1
+ export declare const handleCustomerNote: (ctx: import("./flag-values.js").CommandContext) => void;
2
+ //# sourceMappingURL=notes.d.ts.map
@@ -0,0 +1,41 @@
1
+ // The customer note verbs: one account's note, versioned by supersession.
2
+ import * as customerNotesModule from '../objects/customer-notes.js';
3
+ import { stringFlag } from './flag-values.js';
4
+ import { requiredText, versionedVerbs } from './versioned-verbs.js';
5
+ function printNoteRow(n) {
6
+ console.log(`#${n.id} [${n.status}] v${n.version} customer="${n.customer}" memory=${n.memoryId ?? '-'}`);
7
+ if (n.changeSummary)
8
+ console.log(` change: ${n.changeSummary}`);
9
+ }
10
+ const noteKind = (hippoRoot, tenantId) => ({
11
+ names: { cmd: 'note', noun: 'Customer note', idLabel: 'note' },
12
+ plural: 'customer notes',
13
+ states: customerNotesModule.VALID_NOTE_STATES,
14
+ usage: [
15
+ 'Usage: hippo note new "<customer>" --text "<note>"',
16
+ ' hippo note list [--status active|superseded|closed|all] [--customer "<id>"] [--limit N]',
17
+ ' hippo note get <id>',
18
+ ' hippo note supersede <id> --text "<note>" [--change "<summary>"]',
19
+ ' hippo note close <id>',
20
+ ],
21
+ supersedeUsage: 'Usage: hippo note supersede <id> --text "<note>" [--change "<summary>"]',
22
+ bodyRequired: '--text "<note>"',
23
+ body: (flags) => requiredText(flags, 'text'),
24
+ keyOf: (n) => n.customer,
25
+ save: (customer, note, extraTags, from) => customerNotesModule.saveCustomerNote(hippoRoot, tenantId, {
26
+ customer, note, extraTags, changeSummary: from?.changeSummary, supersedesNoteId: from?.id,
27
+ }),
28
+ recorded: (n) => `Customer note recorded: #${n.id} (v${n.version}) for customer "${n.customer}"`,
29
+ list: (opts, flags) => customerNotesModule.loadCustomerNotes(hippoRoot, tenantId, { ...opts, customer: stringFlag(flags, 'customer')?.trim() || undefined }),
30
+ loadById: (id) => customerNotesModule.loadCustomerNoteById(hippoRoot, tenantId, id),
31
+ close: (id) => customerNotesModule.closeCustomerNote(hippoRoot, tenantId, id),
32
+ printRow: printNoteRow,
33
+ printDetail: (n) => {
34
+ console.log(` customer: ${n.customer}`);
35
+ console.log(` status: ${n.status}`);
36
+ console.log(` version: ${n.version}`);
37
+ console.log(` note: ${n.note}`);
38
+ },
39
+ });
40
+ export const handleCustomerNote = versionedVerbs(noteKind);
41
+ //# sourceMappingURL=notes.js.map
@@ -0,0 +1,14 @@
1
+ /** The part of a child process the launch reads. */
2
+ interface Launched {
3
+ on(event: 'error', listener: (err: Error) => void): void;
4
+ unref(): void;
5
+ }
6
+ type Launcher = (cmd: string, args: string[], opts: {
7
+ detached: boolean;
8
+ stdio: 'ignore';
9
+ windowsHide: boolean;
10
+ }) => Launched;
11
+ /** `launch` is the process starter; tests hand in a stand-in. */
12
+ export declare function openInBrowser(out: string, launch?: Launcher): void;
13
+ export {};
14
+ //# sourceMappingURL=open-browser.d.ts.map
@@ -0,0 +1,26 @@
1
+ // Best-effort browser launch for CLI verbs that write a file.
2
+ import { spawn } from 'child_process';
3
+ import { errorMessage, log } from '../util/log.js';
4
+ /** `launch` is the process starter; tests hand in a stand-in. */
5
+ export function openInBrowser(out, launch = spawn) {
6
+ // Best-effort browser launch; never fail the command if it doesn't work.
7
+ try {
8
+ const [cmd, cmdArgs] = process.platform === 'win32'
9
+ ? ['cmd', ['/c', 'start', '', out]]
10
+ : process.platform === 'darwin'
11
+ ? ['open', [out]]
12
+ : ['xdg-open', [out]];
13
+ const child = launch(cmd, cmdArgs, { detached: true, stdio: 'ignore', windowsHide: true });
14
+ // A missing launcher (e.g. xdg-open absent) emits 'error' asynchronously; unhandled, it would throw.
15
+ child.on('error', (err) => {
16
+ log.warn(`graph view: could not open the browser: ${errorMessage(err)}`);
17
+ process.exitCode = 1;
18
+ });
19
+ child.unref();
20
+ }
21
+ catch (err) {
22
+ // The file is written and its path printed above, so a browser that will not start costs nothing.
23
+ log.debug(`browser not opened: ${errorMessage(err)}`);
24
+ }
25
+ }
26
+ //# sourceMappingURL=open-browser.js.map
@@ -1,5 +1,4 @@
1
- import { type CommandContext } from './flag-values.js';
2
- export declare function handleProcess({ hippoRoot, tenantId, args, flags }: CommandContext): void;
3
- export declare function handlePolicy({ hippoRoot, tenantId, args, flags }: CommandContext): void;
4
- export declare function handleSkill({ hippoRoot, tenantId, args, flags }: CommandContext): void;
1
+ export declare const handleProcess: (ctx: import("./flag-values.js").CommandContext) => void;
2
+ export declare const handlePolicy: (ctx: import("./flag-values.js").CommandContext) => void;
3
+ export declare const handleSkill: (ctx: import("./flag-values.js").CommandContext) => void;
5
4
  //# sourceMappingURL=playbooks.d.ts.map