hippo-memory 1.71.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
package/dist/cli/flags.js CHANGED
@@ -1,144 +1,9 @@
1
- // Each verb's flags as data, keyed like the command table: parseArgs needs a flag's kind before the verb's module loads.
1
+ // Each flag's kind, read from the verb table's flags: parseArgs needs a flag's kind before the verb's module loads.
2
+ import { COMMANDS } from './verbs.js';
2
3
  // The entry point reads these for every verb, so no verb declares them.
3
4
  const GLOBAL_FLAGS = { switches: ['help', 'version'] };
4
- export const VERB_FLAGS = {
5
- init: { switches: ['global', 'no-hooks', 'no-learn', 'no-schedule'], values: ['scan'], numbers: ['days'] },
6
- remember: {
7
- switches: ['error', 'extract', 'force', 'global', 'inferred', 'observed', 'pin', 'verified'],
8
- values: ['artifact-ref', 'kind', 'layer', 'owner', 'scope'],
9
- lists: ['tag'],
10
- },
11
- recall: {
12
- switches: ['classic', 'continuity', 'equal-sources', 'evc-adaptive', 'filter-conflicts', 'graph-stream',
13
- 'include-superseded', 'json', 'multihop', 'no-mmr', 'physics', 'rerank-utility', 'value-aware', 'why'],
14
- values: ['as-of', 'budget', 'goal', 'graph-hops', 'graph-seeds', 'hops', 'layer', 'max-neighbors', 'outcome',
15
- 'reranker', 'salience-threshold', 'scope', 'session-id'],
16
- numbers: ['limit', 'local-bump', 'min-results', 'mmr-lambda', 'reranker-top-k'],
17
- },
18
- drill: { switches: ['json'], values: ['budget', 'depth'], numbers: ['limit'] },
19
- assemble: { switches: ['json', 'no-summarize-older'], values: ['budget', 'fresh-tail', 'scope', 'session'] },
20
- supersede: { switches: ['pin'], values: ['layer'], lists: ['tag'] },
21
- explain: {
22
- switches: ['classic', 'equal-sources', 'include-superseded', 'json', 'no-mmr', 'physics'],
23
- values: ['as-of', 'budget', 'scope'],
24
- numbers: ['limit', 'local-bump', 'mmr-lambda'],
25
- },
26
- eval: {
27
- switches: ['bootstrap', 'equal-sources', 'json', 'no-mmr', 'save-baseline', 'show-cases', 'suite'],
28
- values: ['baseline', 'compare', 'out'],
29
- numbers: ['embedding-weight', 'local-bump', 'max-cases', 'min-mrr', 'mmr-lambda'],
30
- },
31
- trace: { switches: ['json'], values: ['outcome', 'session', 'source', 'steps', 'task'], lists: ['tag'] },
32
- refine: { switches: ['all', 'dry-run', 'json'], values: ['model'], numbers: ['limit'] },
33
- sleep: { switches: ['dry-run', 'no-learn', 'no-share'], values: ['log-file'] },
34
- 'last-sleep': { switches: ['keep'], values: ['path'] },
35
- 'session-end': {
36
- switches: ['dry-run', 'no-learn', 'no-share', 'turn'],
37
- values: ['format', 'log-file', 'runtime', 'session-id', 'transcript'],
38
- },
39
- '__session-end-worker': {
40
- switches: ['dry-run', 'no-learn', 'no-share', 'turn'],
41
- values: ['log-file', 'session-id', 'transcript'],
42
- },
43
- 'pre-compact': { values: ['format', 'log-file', 'runtime'] },
44
- 'post-compact': { values: ['log-file'] },
45
- 'capture-error': { values: ['format', 'runtime'] },
46
- 'compact-resume': {},
47
- 'codex-run': {},
48
- '__codex-session-end-worker': { values: ['codex-home', 'history-path', 'log-file', 'start-offset', 'started-at'] },
49
- dedup: { switches: ['dry-run'], numbers: ['threshold'] },
50
- dag: { switches: ['stats'] },
51
- auth: { switches: ['all', 'global', 'json', 'no-expiry'], values: ['label', 'role', 'tenant'], numbers: ['ttl-days'] },
52
- goal: {
53
- switches: ['all', 'no-propagate'],
54
- values: ['level', 'outcome', 'parent', 'policy', 'session-id', 'success', 'tenant-id'],
55
- },
56
- slack: { switches: ['force'], values: ['channel', 'since', 'team', 'tenant'] },
57
- github: { switches: ['force'], values: ['max', 'repo', 'since'] },
58
- audit: {
59
- switches: ['apply', 'dry-run', 'fix', 'global', 'json'],
60
- values: ['older-than', 'op', 'since', 'tenant'],
61
- numbers: ['limit'],
62
- },
63
- 'correction-latency': { switches: ['json'] },
64
- provenance: { switches: ['json', 'strict'] },
65
- status: {},
66
- outcome: { switches: ['bad', 'good'], values: ['id'] },
67
- conflicts: { switches: ['json'], values: ['status'] },
68
- resolve: { switches: ['forget', 'reject-loser'], values: ['keep', 'reason'] },
69
- reject: { switches: ['global'], values: ['reason', 'value'] },
70
- rejections: { switches: ['global', 'json'] },
71
- unreject: { switches: ['global'] },
72
- dormant: { switches: ['global', 'json'], numbers: ['limit'] },
73
- projects: { switches: ['apply', 'global', 'json'] },
74
- quarantine: { switches: ['all', 'global', 'json'] },
75
- tokens: { switches: ['global', 'json'], numbers: ['days'] },
76
- failures: { switches: ['global', 'json'], numbers: ['days'] },
77
- doctor: { switches: ['json'] },
78
- 'support-bundle': { switches: ['include-logs'], values: ['out'] },
79
- snapshot: { switches: ['json'], values: ['id', 'next-step', 'session', 'source', 'status', 'summary', 'task'] },
80
- session: {
81
- switches: ['json'],
82
- values: ['content', 'id', 'outcome', 'session', 'source', 'summary', 'task', 'type'],
83
- numbers: ['limit'],
84
- },
85
- handoff: {
86
- switches: ['json'],
87
- values: ['card-id', 'id', 'next', 'outcome', 'session', 'summary', 'target-runtime', 'task', 'tests'],
88
- lists: ['artifact', 'constraint'],
89
- },
90
- // Every card subcommand's flags together; card.ts then refuses the ones its subcommand does not read.
91
- card: {
92
- switches: ['json'],
93
- values: ['author', 'body', 'budget', 'contract', 'outcome', 'reason', 'repo', 'run', 'runtime', 'session',
94
- 'status', 'title'],
95
- lists: ['depends-on'],
96
- },
97
- predict: {
98
- values: ['actual', 'class', 'estimate', 'note', 'state', 'status', 'target', 'unit'],
99
- numbers: ['limit'],
100
- },
101
- current: { switches: ['json'] },
102
- forget: { switches: ['archive', 'dry-run'], values: ['reason'] },
103
- inspect: {},
104
- context: {
105
- switches: ['auto', 'cross-project', 'pinned-only'],
106
- values: ['budget', 'format', 'framing', 'include-recent', 'runtime', 'scope'],
107
- numbers: ['limit'],
108
- },
109
- hook: {},
110
- setup: { switches: ['all', 'dry-run', 'no-learn', 'no-schedule'] },
111
- 'daily-runner': {},
112
- embed: { switches: ['global', 'reset-physics', 'status'] },
113
- watch: {},
114
- learn: { switches: ['git'], values: ['repos'], numbers: ['days'] },
115
- promote: {},
116
- sync: { switches: ['cross-project'] },
117
- share: { switches: ['auto', 'dry-run', 'force'], numbers: ['min-score'] },
118
- peers: { switches: ['all-tenants'] },
119
- import: {
120
- switches: ['agents', 'dry-run', 'global'],
121
- values: ['chatgpt', 'claude', 'cursor', 'file', 'markdown', 'name', 'scope', 'vault'],
122
- lists: ['tag'],
123
- },
124
- export: { values: ['format'] },
125
- capture: { switches: ['dry-run', 'global', 'last-session', 'stdin'], values: ['file', 'log-file', 'transcript'] },
126
- dashboard: { numbers: ['port'] },
127
- wm: { switches: ['json'], values: ['content', 'importance', 'scope', 'session', 'task'], numbers: ['limit'] },
128
- mcp: {},
129
- serve: { values: ['host', 'tls-cert', 'tls-key'], numbers: ['port'] },
130
- invalidate: { switches: ['churn', 'dry-run'], values: ['id', 'reason'] },
131
- decide: { values: ['context', 'status', 'supersedes'], numbers: ['limit'] },
132
- incident: { values: ['context', 'resolution', 'status'], numbers: ['limit'], lists: ['link'] },
133
- process: { values: ['change', 'description', 'status'], numbers: ['limit'], lists: ['step'] },
134
- policy: { values: ['change', 'from', 'name', 'status', 'text', 'to'], numbers: ['limit'] },
135
- skill: { values: ['change', 'instructions', 'status', 'trigger'], numbers: ['limit'] },
136
- brief: { switches: ['dry-run'], values: ['change', 'repo', 'status', 'summary'], numbers: ['limit'] },
137
- note: { values: ['change', 'customer', 'status', 'text'], numbers: ['limit'] },
138
- graph: { switches: ['json', 'open'], values: ['entity', 'format', 'out'] },
139
- };
140
5
  const FIELD_KINDS = [['switches', 'switch'], ['values', 'value'], ['numbers', 'number'], ['lists', 'list']];
141
- const DECLARED = new Map([GLOBAL_FLAGS, ...Object.values(VERB_FLAGS)].map((verb) => [
6
+ const DECLARED = new Map([GLOBAL_FLAGS, ...Object.values(COMMANDS).map((row) => row.flags)].map((verb) => [
142
7
  verb,
143
8
  new Map(FIELD_KINDS.flatMap(([field, kind]) => (verb[field] ?? []).map((name) => [name, kind]))),
144
9
  ]));
@@ -0,0 +1,3 @@
1
+ import { type CommandContext } from './flag-values.js';
2
+ export declare function handleGraph({ hippoRoot, tenantId, args, flags }: CommandContext): void;
3
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1,83 @@
1
+ // The entity graph verbs: rebuild it from the consolidated objects, print it, or write it out as a diagram.
2
+ import * as fs from 'fs';
3
+ import { extractGraph } from '../graph/extract.js';
4
+ import { buildGraphModel, renderGraphHtml, renderGraphCanvas, DEFAULT_VIEW_LIMIT } from '../graph/view.js';
5
+ import { printError } from './output.js';
6
+ import { stringFlag } from './flag-values.js';
7
+ import { requireInit } from './shared.js';
8
+ import { CliExit } from './exit.js';
9
+ import { openInBrowser } from './open-browser.js';
10
+ function graphExtract(hippoRoot, tenantId) {
11
+ const result = extractGraph(hippoRoot, tenantId);
12
+ const byType = Object.entries(result.byType)
13
+ .map(([t, n]) => `${t} ${n}`)
14
+ .join(', ');
15
+ const supersedes = result.relations - result.references;
16
+ const relations = `${result.relations} relations (${supersedes} supersedes, ${result.references} references)`;
17
+ console.log(`Graph extracted: ${result.entities} entities (${byType}) + ${relations}.`);
18
+ if (result.truncated.length > 0) {
19
+ printError(`WARNING: under-extracted (hit the per-type cap): ${result.truncated.join(', ')}. The graph is incomplete for those types.`);
20
+ }
21
+ }
22
+ function graphShow(hippoRoot, tenantId, entity, flags) {
23
+ const model = buildGraphModel(hippoRoot, tenantId, { entity, limit: DEFAULT_VIEW_LIMIT });
24
+ if (flags['json']) {
25
+ console.log(JSON.stringify(model, null, 2));
26
+ return;
27
+ }
28
+ if (model.nodes.length === 0) {
29
+ console.log(entity ? `No entity named "${entity}".` : 'Graph is empty. Run `hippo graph extract` first.');
30
+ return;
31
+ }
32
+ console.log(`Graph: ${model.nodes.length} entities, ${model.edges.length} relations${model.truncated ? ' (truncated)' : ''}`);
33
+ const byType = new Map();
34
+ for (const n of model.nodes) {
35
+ const arr = byType.get(n.type) ?? [];
36
+ arr.push({ id: n.id, name: n.name });
37
+ byType.set(n.type, arr);
38
+ }
39
+ for (const [type, ns] of byType) {
40
+ console.log(`\n${type} (${ns.length}):`);
41
+ for (const n of ns)
42
+ console.log(` [${n.id}] ${n.name}`);
43
+ }
44
+ if (model.edges.length > 0) {
45
+ const nameById = new Map(model.nodes.map((n) => [n.id, n.name]));
46
+ console.log('\nrelations:');
47
+ for (const e of model.edges) {
48
+ console.log(` ${nameById.get(e.from)} --${e.relType}--> ${nameById.get(e.to)}`);
49
+ }
50
+ }
51
+ }
52
+ function graphView(hippoRoot, tenantId, entity, flags) {
53
+ const format = stringFlag(flags, 'format') ?? 'html';
54
+ if (format !== 'html' && format !== 'canvas') {
55
+ printError("graph view: --format must be 'html' or 'canvas'");
56
+ throw new CliExit(1);
57
+ }
58
+ const model = buildGraphModel(hippoRoot, tenantId, { entity, limit: DEFAULT_VIEW_LIMIT });
59
+ const content = format === 'canvas' ? renderGraphCanvas(model) : renderGraphHtml(model);
60
+ const defaultOut = format === 'canvas' ? 'hippo-graph.canvas' : 'hippo-graph.html';
61
+ const out = stringFlag(flags, 'out') ?? defaultOut;
62
+ fs.writeFileSync(out, content, 'utf8');
63
+ console.log(`Wrote ${model.nodes.length} entities + ${model.edges.length} relations to ${out}${model.truncated ? ' (truncated)' : ''}`);
64
+ if (flags['open'] && format === 'html')
65
+ openInBrowser(out);
66
+ }
67
+ export function handleGraph({ hippoRoot, tenantId, args, flags }) {
68
+ requireInit(hippoRoot);
69
+ const subcommand = args[0] ?? '';
70
+ if (subcommand === 'extract')
71
+ return graphExtract(hippoRoot, tenantId);
72
+ const entity = stringFlag(flags, 'entity');
73
+ if (subcommand === 'show')
74
+ return graphShow(hippoRoot, tenantId, entity, flags);
75
+ if (subcommand === 'view')
76
+ return graphView(hippoRoot, tenantId, entity, flags);
77
+ printError('Usage:\n' +
78
+ ' hippo graph extract Rebuild the entity/relation graph from consolidated objects\n' +
79
+ ' hippo graph show [--entity NAME] [--json] Inspect entities + their edges (text or JSON)\n' +
80
+ ' hippo graph view [--out FILE] [--open] [--format html|canvas] [--entity NAME] Generate an interactive node-link diagram');
81
+ throw new CliExit(1);
82
+ }
83
+ //# sourceMappingURL=graph.js.map
@@ -1,5 +1,4 @@
1
1
  import type { HookRuntime } from '../core/capture-contract.js';
2
- import { type DeliveryEventType, type DeliveryRecorder } from '../store/delivery-recorder.js';
3
2
  import type { CliFlags } from './flag-values.js';
4
3
  /** Detached worker (internal `__session-end-worker`): counts re-reads, runs sleep, then capture; one stage failing does not block the other. */
5
4
  /** A folder without its own store never sleeps at session end, so its project's agent notes go to the global store here. */
@@ -14,18 +13,19 @@ export declare function reportSessionEndFailure<E>(logFile: string | null, step:
14
13
  export declare function hostSessionId(): string | undefined;
15
14
  /** Compaction drops the pinned blocks the per-prompt hook injected, so record a `reset` for the payload's session and the next prompt injects again.
16
15
  * `requiredSource` limits it to payloads with that `source`; best-effort and silent on a malformed payload. */
17
- export declare function resetHookInjection(hippoRoot: string, stdinText: string | undefined, requiredSource: string | null): void;
16
+ export declare function resetHookInjection(hippoRoot: string, tenantId: string, stdinText: string | undefined, requiredSource: string | null): void;
18
17
  /** Store a hook writes to: the project store, else an existing global one, else the project path (skipped: hooks must not create a store).
19
18
  * Pre-compact and compact-resume must agree, or a snapshot is looked for in the other store. */
20
19
  export declare function hookStoreRoot(hippoRoot: string): string;
21
20
  /** `--runtime copilot`, or `--format copilot` on `hippo context`, marks a Copilot hook: the flag decides, never the payload. */
22
21
  export declare function hookRuntime(flags: CliFlags): HookRuntime;
23
- /** A delivery recorder when the ledger store enables one, else null; never throws. */
24
- export declare function startDeliveryRecorder(hippoRoot: string, stdinText: string | undefined, runtime: HookRuntime, eventType?: DeliveryEventType): DeliveryRecorder | null;
25
22
  /** A Copilot hook's project root, from the payload's `cwd`, since VS Code runs user-level hooks in the home folder; other runtimes keep `hippoRoot`. */
26
23
  export declare function payloadCwdRoot(hippoRoot: string, stdinText: string | undefined, runtime: HookRuntime): string;
27
- /** Hook commands share one handle per store and wait at most HOOK_DB_WAIT_MS for a lock; a store still busy after that skips the hook's work with one warning, exit 0. */
24
+ /** Hook commands share one handle per store and wait at most HOOK_DB_WAIT_MS for a lock; a store still busy after that skips the hook's
25
+ * work with one warning, exit 0. */
28
26
  export declare function runHookWithStores<T>(fn: () => T | Promise<T>): Promise<T | undefined>;
29
27
  /** Whether this session sits in the pilot's holdout arm; off at rate 0 and with no session id. */
30
- export declare function inPilotHoldout(hippoRoot: string, tenantId: string, sessionId: string | undefined, write: boolean): boolean;
28
+ export declare function inPilotHoldout(hippoRoot: string, tenantId: string, sessionId: string | undefined, opts: {
29
+ write: boolean;
30
+ }): boolean;
31
31
  //# sourceMappingURL=hook-runtime.d.ts.map
@@ -2,20 +2,15 @@
2
2
  import { envClaudeCodeSessionId, envHippoSessionId } from '../util/env.js';
3
3
  import * as path from 'path';
4
4
  import * as fs from 'fs';
5
- import { getHippoRoot, isInitialized } from '../store/open.js';
6
- import { loadConfig } from '../core/config.js';
7
- import { createDeliveryRecorder } from '../store/delivery-recorder.js';
8
5
  import { isSqliteBusy, noteStoreBusy, runWithRequestStores, HOOK_DB_WAIT_MS } from '../db/index.js';
9
- import { bookTokenUse, ledgerRoot } from '../api/ledger-db.js';
6
+ import { bookTokenUse } from '../api/ledger-db.js';
10
7
  import { sessionPilotArm } from '../api/pilot-arm.js';
11
- import { hookPayloadSessionId, hookPayloadString, isSubagentPayload } from '../store/token-ledger.js';
12
- import { blockHash } from '../util/token-text.js';
8
+ import { hookPayloadSessionId, hookPayloadString, isSubagentPayload } from '../util/hook-payload.js';
13
9
  import { importAtSessionEnd, currentMachine } from '../agent-memories/sync.js';
14
10
  import { summaryLine } from '../agent-memories/report.js';
15
- import { isGlobalStoreRoot } from '../core/project-identity.js';
11
+ import { getHippoRoot, isInitialized } from '../core/project-identity.js';
16
12
  import { getGlobalRoot } from '../sharing/global-store.js';
17
13
  import { sanitizeLogMessage } from '../capture/compact.js';
18
- import { resolveTenantId } from '../store/tenant.js';
19
14
  import { errorMessage, log } from '../util/log.js';
20
15
  /** Detached worker (internal `__session-end-worker`): counts re-reads, runs sleep, then capture; one stage failing does not block the other. */
21
16
  /** A folder without its own store never sleeps at session end, so its project's agent notes go to the global store here. */
@@ -61,13 +56,13 @@ export function hostSessionId() {
61
56
  }
62
57
  /** Compaction drops the pinned blocks the per-prompt hook injected, so record a `reset` for the payload's session and the next prompt injects again.
63
58
  * `requiredSource` limits it to payloads with that `source`; best-effort and silent on a malformed payload. */
64
- export function resetHookInjection(hippoRoot, stdinText, requiredSource) {
59
+ export function resetHookInjection(hippoRoot, tenantId, stdinText, requiredSource) {
65
60
  const sessionId = hookPayloadSessionId(stdinText, requiredSource);
66
61
  // A sub-agent's compaction leaves its parent's context, and the blocks in it, as they were.
67
62
  if (sessionId === null || isSubagentPayload(stdinText))
68
63
  return;
69
64
  bookTokenUse(hippoRoot, {
70
- tenantId: resolveTenantId({}), sessionId, surface: 'hook', event: 'reset', items: 0, tokens: 0,
65
+ tenantId, sessionId, surface: 'hook', event: 'reset', items: 0, tokens: 0,
71
66
  });
72
67
  }
73
68
  /** Store a hook writes to: the project store, else an existing global one, else the project path (skipped: hooks must not create a store).
@@ -82,29 +77,6 @@ export function hookStoreRoot(hippoRoot) {
82
77
  export function hookRuntime(flags) {
83
78
  return flags['runtime'] === 'copilot' || flags['format'] === 'copilot' ? 'copilot' : 'claude-code';
84
79
  }
85
- /** A delivery recorder when the ledger store enables one, else null; never throws. */
86
- export function startDeliveryRecorder(hippoRoot, stdinText, runtime, eventType) {
87
- try {
88
- // The same store withLedgerDb writes the token ledger to, so its config governs both.
89
- const root = ledgerRoot(hippoRoot);
90
- if (root === null || !loadConfig(root).deliveryLedger.enabled)
91
- return null;
92
- return createDeliveryRecorder({
93
- root,
94
- storeHash: blockHash(path.resolve(root)),
95
- writeStore: isGlobalStoreRoot(root) ? 'global' : 'local',
96
- tenantId: resolveTenantId({}),
97
- stdinText,
98
- envSessionId: hostSessionId(),
99
- runtime: runtime === 'copilot' ? 'copilot' : undefined,
100
- eventType,
101
- });
102
- }
103
- catch (error) {
104
- log.warn(`delivery ledger skipped: ${errorMessage(error)}`);
105
- return null;
106
- }
107
- }
108
80
  /** A Copilot hook's project root, from the payload's `cwd`, since VS Code runs user-level hooks in the home folder; other runtimes keep `hippoRoot`. */
109
81
  export function payloadCwdRoot(hippoRoot, stdinText, runtime) {
110
82
  const cwd = runtime === 'copilot' ? hookPayloadString(stdinText, 'cwd') : null;
@@ -120,7 +92,8 @@ export function payloadCwdRoot(hippoRoot, stdinText, runtime) {
120
92
  }
121
93
  return getHippoRoot(process.cwd());
122
94
  }
123
- /** Hook commands share one handle per store and wait at most HOOK_DB_WAIT_MS for a lock; a store still busy after that skips the hook's work with one warning, exit 0. */
95
+ /** Hook commands share one handle per store and wait at most HOOK_DB_WAIT_MS for a lock; a store still busy after that skips the hook's
96
+ * work with one warning, exit 0. */
124
97
  export async function runHookWithStores(fn) {
125
98
  try {
126
99
  return await runWithRequestStores(fn, { busyWaitMs: HOOK_DB_WAIT_MS, failFastWhenBusy: true });
@@ -133,7 +106,7 @@ export async function runHookWithStores(fn) {
133
106
  }
134
107
  }
135
108
  /** Whether this session sits in the pilot's holdout arm; off at rate 0 and with no session id. */
136
- export function inPilotHoldout(hippoRoot, tenantId, sessionId, write) {
137
- return sessionPilotArm(hippoRoot, tenantId, sessionId, write) === 'holdout';
109
+ export function inPilotHoldout(hippoRoot, tenantId, sessionId, opts) {
110
+ return sessionPilotArm(hippoRoot, tenantId, sessionId, opts.write) === 'holdout';
138
111
  }
139
112
  //# sourceMappingURL=hook-runtime.js.map
@@ -0,0 +1,3 @@
1
+ import { type CommandContext } from './flag-values.js';
2
+ export declare function handleIncident({ hippoRoot, tenantId, args, flags }: CommandContext): void;
3
+ //# sourceMappingURL=incidents.d.ts.map
@@ -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): Promise<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
+ async 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 = await 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
+ async 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 } = await 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
+ async 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 } = await 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 async 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
+ await 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
+ await 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