hippo-memory 1.61.0 → 1.63.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 (377) hide show
  1. package/README.md +37 -53
  2. package/dist/agent-memories/apply.d.ts +3 -1
  3. package/dist/agent-memories/apply.js +23 -1
  4. package/dist/agent-memories/claude-code.d.ts +4 -1
  5. package/dist/agent-memories/claude-code.js +53 -9
  6. package/dist/agent-memories/report.d.ts +1 -0
  7. package/dist/agent-memories/report.js +2 -2
  8. package/dist/agent-memories/sync.d.ts +3 -3
  9. package/dist/agent-memories/sync.js +46 -24
  10. package/dist/agent-memories/types.d.ts +0 -2
  11. package/dist/ambient-store.d.ts +4 -4
  12. package/dist/ambient-store.js +4 -3
  13. package/dist/api/assemble.d.ts +7 -10
  14. package/dist/api/assemble.js +62 -66
  15. package/dist/api/audit.d.ts +2 -2
  16. package/dist/api/audit.js +2 -2
  17. package/dist/api/auth.d.ts +6 -6
  18. package/dist/api/auth.js +5 -7
  19. package/dist/api/context-select.d.ts +50 -0
  20. package/dist/api/context-select.js +342 -0
  21. package/dist/api/context-types.d.ts +12 -17
  22. package/dist/api/context.d.ts +5 -4
  23. package/dist/api/context.js +208 -535
  24. package/dist/api/dormant.js +1 -1
  25. package/dist/api/drill-down.d.ts +4 -4
  26. package/dist/api/drill-down.js +56 -41
  27. package/dist/api/outcome.d.ts +8 -13
  28. package/dist/api/outcome.js +13 -17
  29. package/dist/api/promote.d.ts +5 -8
  30. package/dist/api/promote.js +55 -66
  31. package/dist/api/quarantine.js +3 -2
  32. package/dist/api/recall-types.d.ts +43 -55
  33. package/dist/api/recall.d.ts +3 -3
  34. package/dist/api/recall.js +310 -456
  35. package/dist/api/remember.d.ts +2 -2
  36. package/dist/api/sleep.d.ts +7 -35
  37. package/dist/api/sleep.js +206 -220
  38. package/dist/api/tokens.d.ts +2 -2
  39. package/dist/api/tokens.js +2 -2
  40. package/dist/api/types.d.ts +6 -10
  41. package/dist/api/types.js +2 -4
  42. package/dist/audit-prune.d.ts +4 -6
  43. package/dist/audit-prune.js +3 -5
  44. package/dist/audit.js +11 -33
  45. package/dist/auth.d.ts +8 -9
  46. package/dist/auth.js +5 -7
  47. package/dist/autolearn.d.ts +1 -1
  48. package/dist/autolearn.js +1 -1
  49. package/dist/availability.js +3 -5
  50. package/dist/capture/command.d.ts +5 -4
  51. package/dist/capture/command.js +8 -22
  52. package/dist/capture/compact.d.ts +2 -2
  53. package/dist/capture/compact.js +11 -15
  54. package/dist/capture/extract.js +37 -115
  55. package/dist/capture-error.d.ts +1 -1
  56. package/dist/capture-error.js +1 -1
  57. package/dist/churn-git.d.ts +1 -1
  58. package/dist/churn-git.js +1 -1
  59. package/dist/cli/audit.js +3 -4
  60. package/dist/cli/auth.js +3 -6
  61. package/dist/cli/briefs.js +324 -306
  62. package/dist/cli/context.js +44 -34
  63. package/dist/cli/continuity.js +283 -271
  64. package/dist/cli/curate.d.ts +1 -1
  65. package/dist/cli/curate.js +43 -58
  66. package/dist/cli/dag.js +5 -9
  67. package/dist/cli/decisions.js +334 -345
  68. package/dist/cli/explain.js +68 -61
  69. package/dist/cli/goals.js +1 -1
  70. package/dist/cli/init.js +1 -1
  71. package/dist/cli/maintenance.js +62 -51
  72. package/dist/cli/playbooks.js +391 -379
  73. package/dist/cli/projects.js +11 -6
  74. package/dist/cli/recall.js +30 -44
  75. package/dist/cli/remember.js +118 -87
  76. package/dist/cli/session-hooks.js +106 -115
  77. package/dist/cli/setup.d.ts +1 -1
  78. package/dist/cli/setup.js +267 -250
  79. package/dist/cli/shared.js +3 -3
  80. package/dist/cli/slack.js +1 -1
  81. package/dist/cli/sleep.js +27 -1
  82. package/dist/cli/status.d.ts +4 -4
  83. package/dist/cli/status.js +80 -76
  84. package/dist/cli/transfer.js +88 -107
  85. package/dist/cli/usage.js +9 -6
  86. package/dist/cli.d.ts +1 -1
  87. package/dist/cli.js +4 -9
  88. package/dist/compaction-record.d.ts +2 -2
  89. package/dist/compaction-record.js +89 -68
  90. package/dist/compare.d.ts +11 -16
  91. package/dist/compare.js +11 -16
  92. package/dist/config.d.ts +19 -18
  93. package/dist/config.js +90 -67
  94. package/dist/connectors/github/backfill.d.ts +2 -2
  95. package/dist/connectors/github/backfill.js +8 -15
  96. package/dist/connectors/github/cli-impl.js +3 -8
  97. package/dist/connectors/github/deletion.d.ts +5 -12
  98. package/dist/connectors/github/deletion.js +5 -12
  99. package/dist/connectors/github/dlq.d.ts +6 -9
  100. package/dist/connectors/github/dlq.js +2 -3
  101. package/dist/connectors/github/ingest.d.ts +5 -7
  102. package/dist/connectors/github/ingest.js +8 -12
  103. package/dist/connectors/github/octokit-client.d.ts +3 -5
  104. package/dist/connectors/github/octokit-client.js +5 -6
  105. package/dist/connectors/github/signature.d.ts +9 -39
  106. package/dist/connectors/github/signature.js +9 -39
  107. package/dist/connectors/github/tenant-routing.d.ts +1 -1
  108. package/dist/connectors/github/tenant-routing.js +1 -1
  109. package/dist/connectors/github/transform.js +2 -2
  110. package/dist/connectors/github/types.d.ts +2 -10
  111. package/dist/connectors/github/types.js +1 -3
  112. package/dist/connectors/slack/deletion.d.ts +3 -8
  113. package/dist/connectors/slack/deletion.js +3 -8
  114. package/dist/connectors/slack/dlq.d.ts +1 -1
  115. package/dist/connectors/slack/ingest.d.ts +1 -1
  116. package/dist/connectors/slack/ingest.js +7 -16
  117. package/dist/connectors/slack/signature.d.ts +1 -1
  118. package/dist/connectors/slack/tenant-routing.d.ts +3 -5
  119. package/dist/connectors/slack/tenant-routing.js +3 -5
  120. package/dist/connectors/slack/transform.d.ts +5 -6
  121. package/dist/connectors/slack/transform.js +5 -6
  122. package/dist/connectors/slack/types.d.ts +2 -6
  123. package/dist/connectors/slack/types.js +1 -3
  124. package/dist/connectors/slack/web-client.js +10 -3
  125. package/dist/connectors/slack/workspaces.d.ts +3 -5
  126. package/dist/connectors/slack/workspaces.js +3 -5
  127. package/dist/consolidate/conflicts.js +3 -14
  128. package/dist/consolidate/decay.js +9 -29
  129. package/dist/consolidate/llm-passes.js +4 -5
  130. package/dist/consolidate/merge.js +8 -23
  131. package/dist/consolidate/run.d.ts +1 -8
  132. package/dist/consolidate/run.js +3 -25
  133. package/dist/consolidate/sleep.js +5 -17
  134. package/dist/consolidate/traces.js +9 -21
  135. package/dist/customer-notes.d.ts +5 -7
  136. package/dist/customer-notes.js +82 -76
  137. package/dist/dag.d.ts +10 -21
  138. package/dist/dag.js +189 -203
  139. package/dist/db/continuity.js +2 -2
  140. package/dist/db/migrations/v14.js +1 -1
  141. package/dist/db/migrations/v15.js +1 -2
  142. package/dist/db/migrations/v16.js +3 -4
  143. package/dist/db/migrations/v17.js +2 -3
  144. package/dist/db/migrations/v19.js +1 -1
  145. package/dist/db/migrations/v20.js +1 -1
  146. package/dist/db/migrations/v21.js +2 -6
  147. package/dist/db/migrations/v22.js +2 -4
  148. package/dist/db/migrations/v23.js +1 -1
  149. package/dist/db/migrations/v24.js +4 -6
  150. package/dist/db/migrations/v25.js +2 -3
  151. package/dist/db/migrations/v26.js +3 -3
  152. package/dist/db/migrations/v27.js +2 -10
  153. package/dist/db/migrations/v28.js +5 -8
  154. package/dist/db/migrations/v29.js +3 -4
  155. package/dist/db/migrations/v30.js +2 -2
  156. package/dist/db/migrations/v31.js +1 -1
  157. package/dist/db/migrations/v32.js +1 -1
  158. package/dist/db/migrations/v33.js +3 -3
  159. package/dist/db/migrations/v34.js +1 -1
  160. package/dist/db/migrations/v35.js +3 -4
  161. package/dist/db/migrations/v36.js +3 -4
  162. package/dist/db/migrations/v37.js +5 -5
  163. package/dist/db/migrations/v38.js +7 -8
  164. package/dist/db/migrations/v39.js +1 -1
  165. package/dist/db/migrations/v40.js +4 -16
  166. package/dist/db/migrations/v41.js +3 -4
  167. package/dist/db/migrations/v42.js +3 -4
  168. package/dist/db/migrations/v45.js +1 -1
  169. package/dist/db/migrations/v46.js +1 -1
  170. package/dist/db/migrations/v47.js +1 -1
  171. package/dist/db/migrations/v48.js +1 -1
  172. package/dist/decisions.d.ts +2 -2
  173. package/dist/decisions.js +97 -80
  174. package/dist/dedupe.js +86 -61
  175. package/dist/delivery-recorder.js +154 -135
  176. package/dist/doctor.js +129 -110
  177. package/dist/dormant.js +1 -4
  178. package/dist/embedding-provider.d.ts +4 -8
  179. package/dist/embedding-provider.js +4 -8
  180. package/dist/embeddings.js +55 -47
  181. package/dist/env.d.ts +1 -1
  182. package/dist/env.js +12 -12
  183. package/dist/escape.d.ts +5 -0
  184. package/dist/escape.js +10 -0
  185. package/dist/eval-stats.d.ts +1 -2
  186. package/dist/eval-stats.js +1 -2
  187. package/dist/eval-suite.js +27 -21
  188. package/dist/extract.js +4 -9
  189. package/dist/failure-log.d.ts +3 -3
  190. package/dist/failure-log.js +1 -1
  191. package/dist/forward-claim-detector.d.ts +2 -4
  192. package/dist/forward-claim-detector.js +6 -11
  193. package/dist/goals.d.ts +3 -3
  194. package/dist/goals.js +103 -91
  195. package/dist/graph/read.d.ts +2 -2
  196. package/dist/graph/read.js +5 -6
  197. package/dist/graph/types.d.ts +8 -8
  198. package/dist/graph/write.d.ts +7 -14
  199. package/dist/graph/write.js +16 -23
  200. package/dist/graph-extract.d.ts +7 -8
  201. package/dist/graph-extract.js +62 -72
  202. package/dist/graph-recall.d.ts +2 -2
  203. package/dist/graph-recall.js +55 -49
  204. package/dist/graph-stream.d.ts +5 -6
  205. package/dist/graph-stream.js +66 -57
  206. package/dist/graph-view.d.ts +2 -2
  207. package/dist/graph-view.js +7 -7
  208. package/dist/half-life-migration.d.ts +1 -2
  209. package/dist/half-life-migration.js +2 -3
  210. package/dist/hooks/codex-session.js +1 -1
  211. package/dist/hooks/codex-wrapper.d.ts +1 -1
  212. package/dist/hooks/codex-wrapper.js +3 -2
  213. package/dist/hooks/json-hooks.d.ts +2 -2
  214. package/dist/hooks/json-hooks.js +5 -4
  215. package/dist/hooks/opencode.d.ts +1 -1
  216. package/dist/hooks/opencode.js +5 -4
  217. package/dist/hooks/shared.d.ts +3 -7
  218. package/dist/hooks/shared.js +1 -8
  219. package/dist/http-util.d.ts +2 -3
  220. package/dist/http-util.js +3 -0
  221. package/dist/importers/core.d.ts +2 -9
  222. package/dist/importers/core.js +15 -30
  223. package/dist/importers/sources.js +2 -1
  224. package/dist/importers/vault.js +2 -20
  225. package/dist/incidents.d.ts +1 -1
  226. package/dist/incidents.js +46 -39
  227. package/dist/instruction-detect.d.ts +1 -1
  228. package/dist/instruction-detect.js +1 -1
  229. package/dist/invalidation.d.ts +3 -0
  230. package/dist/invalidation.js +160 -114
  231. package/dist/json.d.ts +5 -0
  232. package/dist/json.js +4 -0
  233. package/dist/judgment.js +1 -2
  234. package/dist/local-embedding.js +1 -1
  235. package/dist/mcp/admin-tools.js +7 -17
  236. package/dist/mcp/format.js +1 -1
  237. package/dist/mcp/framing.js +3 -6
  238. package/dist/mcp/protocol.d.ts +2 -5
  239. package/dist/mcp/protocol.js +1 -3
  240. package/dist/mcp/recall-tools.js +12 -15
  241. package/dist/mcp/request.js +4 -3
  242. package/dist/mcp/session-state.js +2 -3
  243. package/dist/mcp/stdio.js +2 -1
  244. package/dist/mcp/tools.js +9 -6
  245. package/dist/memory-value-weights.d.ts +5 -8
  246. package/dist/memory-value-weights.js +5 -8
  247. package/dist/memory-value.d.ts +13 -13
  248. package/dist/memory-value.js +26 -37
  249. package/dist/memory.d.ts +20 -22
  250. package/dist/memory.js +24 -48
  251. package/dist/multihop.d.ts +1 -1
  252. package/dist/multihop.js +3 -2
  253. package/dist/owner-validation.d.ts +4 -5
  254. package/dist/owner-validation.js +4 -5
  255. package/dist/physics.d.ts +4 -4
  256. package/dist/physics.js +7 -9
  257. package/dist/policies.d.ts +9 -10
  258. package/dist/policies.js +96 -81
  259. package/dist/postinstall.js +3 -6
  260. package/dist/predictions/planning-fallacy.d.ts +9 -14
  261. package/dist/predictions/planning-fallacy.js +10 -16
  262. package/dist/predictions/store.d.ts +15 -23
  263. package/dist/predictions/store.js +36 -33
  264. package/dist/processes.d.ts +2 -7
  265. package/dist/processes.js +88 -72
  266. package/dist/project-briefs.d.ts +2 -3
  267. package/dist/project-briefs.js +141 -118
  268. package/dist/project-identity.d.ts +22 -9
  269. package/dist/project-identity.js +47 -12
  270. package/dist/project-merge.d.ts +28 -5
  271. package/dist/project-merge.js +213 -46
  272. package/dist/project-remote.d.ts +12 -0
  273. package/dist/project-remote.js +138 -0
  274. package/dist/prompt-recall.js +1 -2
  275. package/dist/rate-limit.d.ts +1 -1
  276. package/dist/rate-limit.js +1 -1
  277. package/dist/raw-archive.d.ts +9 -0
  278. package/dist/raw-archive.js +70 -53
  279. package/dist/recall-history.d.ts +19 -20
  280. package/dist/recall-history.js +24 -42
  281. package/dist/recall-pipeline.js +4 -28
  282. package/dist/recall-scope.d.ts +7 -8
  283. package/dist/recall-scope.js +7 -8
  284. package/dist/recall-trace.d.ts +5 -9
  285. package/dist/recall-trace.js +6 -10
  286. package/dist/refine-llm.d.ts +1 -1
  287. package/dist/refine-llm.js +2 -2
  288. package/dist/reject-flow.d.ts +3 -4
  289. package/dist/reject-flow.js +122 -117
  290. package/dist/rejection.d.ts +5 -6
  291. package/dist/rejection.js +7 -15
  292. package/dist/rerankers/clef.d.ts +1 -1
  293. package/dist/rerankers/jev.d.ts +1 -2
  294. package/dist/rerankers/jev.js +4 -5
  295. package/dist/rerankers/llm.d.ts +1 -2
  296. package/dist/rerankers/llm.js +1 -2
  297. package/dist/rerankers/types.d.ts +1 -2
  298. package/dist/rrf.d.ts +2 -2
  299. package/dist/rrf.js +2 -2
  300. package/dist/search/bm25-search.d.ts +1 -1
  301. package/dist/search/bm25-search.js +2 -1
  302. package/dist/search/boosts.js +2 -1
  303. package/dist/search/hybrid.d.ts +1 -1
  304. package/dist/search/hybrid.js +2 -1
  305. package/dist/search/physics-search.d.ts +1 -1
  306. package/dist/search/physics-search.js +2 -1
  307. package/dist/search/types.d.ts +2 -0
  308. package/dist/search/types.js +3 -1
  309. package/dist/secret-detect.d.ts +4 -5
  310. package/dist/secret-detect.js +6 -10
  311. package/dist/server/auth.js +5 -5
  312. package/dist/server/client-ip.js +1 -1
  313. package/dist/server/cursor.js +2 -1
  314. package/dist/server/mcp-http.js +4 -4
  315. package/dist/server/request.d.ts +3 -6
  316. package/dist/server/request.js +6 -7
  317. package/dist/server/routes/admin.js +5 -4
  318. package/dist/server/routes/customer-notes.js +6 -5
  319. package/dist/server/routes/decisions.js +4 -3
  320. package/dist/server/routes/incidents.js +7 -5
  321. package/dist/server/routes/memories.js +7 -7
  322. package/dist/server/routes/policies.js +3 -2
  323. package/dist/server/routes/predictions.js +12 -15
  324. package/dist/server/routes/processes.js +3 -2
  325. package/dist/server/routes/project-briefs.js +8 -7
  326. package/dist/server/routes/recall.js +95 -93
  327. package/dist/server/routes/skills.js +6 -5
  328. package/dist/server/types.d.ts +1 -1
  329. package/dist/server/validation.d.ts +1 -2
  330. package/dist/server/validation.js +7 -14
  331. package/dist/server-detect.js +72 -58
  332. package/dist/server.d.ts +2 -2
  333. package/dist/server.js +131 -117
  334. package/dist/shared.d.ts +26 -17
  335. package/dist/shared.js +102 -104
  336. package/dist/skills.d.ts +3 -3
  337. package/dist/skills.js +88 -72
  338. package/dist/store/audit-event.d.ts +2 -2
  339. package/dist/store/audit-event.js +1 -1
  340. package/dist/store/candidates.d.ts +2 -2
  341. package/dist/store/candidates.js +4 -3
  342. package/dist/store/conflicts.js +30 -22
  343. package/dist/store/delete-and-batch.d.ts +11 -14
  344. package/dist/store/delete-and-batch.js +40 -91
  345. package/dist/store/entry-reads.d.ts +17 -25
  346. package/dist/store/entry-reads.js +59 -40
  347. package/dist/store/entry-row.d.ts +6 -24
  348. package/dist/store/entry-row.js +6 -24
  349. package/dist/store/entry-writes.d.ts +6 -7
  350. package/dist/store/entry-writes.js +13 -11
  351. package/dist/store/handoffs.d.ts +1 -1
  352. package/dist/store/handoffs.js +7 -10
  353. package/dist/store/index-and-stats.d.ts +2 -6
  354. package/dist/store/index-and-stats.js +4 -10
  355. package/dist/store/mirrors.d.ts +6 -19
  356. package/dist/store/mirrors.js +14 -39
  357. package/dist/store/open.js +9 -31
  358. package/dist/store/rows.d.ts +5 -11
  359. package/dist/store/rows.js +6 -11
  360. package/dist/store/search-rows.d.ts +17 -34
  361. package/dist/store/search-rows.js +34 -56
  362. package/dist/store/sessions.d.ts +4 -5
  363. package/dist/store/sessions.js +5 -6
  364. package/dist/store/summaries.d.ts +13 -17
  365. package/dist/store/summaries.js +26 -70
  366. package/dist/support-bundle.js +4 -8
  367. package/dist/tenant.d.ts +1 -5
  368. package/dist/token-ledger.d.ts +1 -1
  369. package/dist/token-ledger.js +3 -5
  370. package/dist/trace.js +1 -3
  371. package/dist/version.d.ts +1 -1
  372. package/dist/version.js +1 -1
  373. package/dist/working-memory.d.ts +1 -1
  374. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  375. package/extensions/openclaw-plugin/package.json +1 -1
  376. package/openclaw.plugin.json +1 -1
  377. package/package.json +1 -1
@@ -3,6 +3,7 @@ import { confidenceFacets } from '../memory.js';
3
3
  import { isInitialized } from '../store/open.js';
4
4
  import { loadSearchEntries } from '../store/search-rows.js';
5
5
  import { loadIndex } from '../store/index-and-stats.js';
6
+ import { DEFAULT_RECALL_BUDGET } from '../search/types.js';
6
7
  import { loadConfig } from '../config.js';
7
8
  import { dropHeldCopies } from '../same-text.js';
8
9
  import { detectScope } from '../scope.js';
@@ -27,7 +28,7 @@ function noteScopeHidden(hippoRoot, globalRoot, query, tenantId, requested) {
27
28
  }
28
29
  export async function cmdExplain(hippoRoot, query, flags) {
29
30
  requireInit(hippoRoot);
30
- const budget = parseBudgetFlag(flags['budget'], 4000);
31
+ const budget = parseBudgetFlag(flags['budget'], DEFAULT_RECALL_BUDGET);
31
32
  const limit = parseLimitFlag(flags['limit']);
32
33
  const asJson = Boolean(flags['json']);
33
34
  const includeSuperseded = Boolean(flags['include-superseded']);
@@ -57,31 +58,39 @@ export async function cmdExplain(hippoRoot, query, flags) {
57
58
  const results = dropHeldCopies(rank.results, (r) => r.entry);
58
59
  const candidates = rank.localEntries.length + rank.globalEntries.length;
59
60
  if (asJson) {
60
- const output = results.map((r, rank) => ({
61
- rank: rank + 1,
62
- id: r.entry.id,
63
- layer: r.entry.layer,
64
- confidence: confidenceFacets(r.entry).tier,
65
- aged_out: confidenceFacets(r.entry).agedOut,
66
- score: r.score,
67
- tokens: r.tokens,
68
- tags: r.entry.tags,
69
- content: r.entry.content,
70
- breakdown: r.breakdown,
71
- }));
72
- console.log(JSON.stringify({
73
- query,
74
- mode: modeUsed,
75
- candidates,
76
- returned: output.length,
77
- results: output,
78
- }));
61
+ printExplainJson(results, query, modeUsed, candidates);
79
62
  return;
80
63
  }
81
64
  if (results.length === 0) {
82
65
  console.log(`No memories matched "${query}" (scanned ${candidates}).`);
83
66
  return;
84
67
  }
68
+ printExplainTable(results, query, modeUsed, candidates);
69
+ results.forEach((r, i) => printExplainBreakdown(r, i));
70
+ console.log('Note: explain does not mark memories as retrieved (read-only).');
71
+ }
72
+ function printExplainJson(results, query, modeUsed, candidates) {
73
+ const output = results.map((r, rank) => ({
74
+ rank: rank + 1,
75
+ id: r.entry.id,
76
+ layer: r.entry.layer,
77
+ confidence: confidenceFacets(r.entry).tier,
78
+ aged_out: confidenceFacets(r.entry).agedOut,
79
+ score: r.score,
80
+ tokens: r.tokens,
81
+ tags: r.entry.tags,
82
+ content: r.entry.content,
83
+ breakdown: r.breakdown,
84
+ }));
85
+ console.log(JSON.stringify({
86
+ query,
87
+ mode: modeUsed,
88
+ candidates,
89
+ returned: output.length,
90
+ results: output,
91
+ }));
92
+ }
93
+ function printExplainTable(results, query, modeUsed, candidates) {
85
94
  console.log(`Query: "${query}"`);
86
95
  console.log(`Mode: ${modeUsed} candidates: ${candidates} returned: ${results.length}`);
87
96
  console.log();
@@ -95,49 +104,47 @@ export async function cmdExplain(hippoRoot, query, flags) {
95
104
  console.log(`${String(i + 1).padEnd(5)} ${fmt(r.score, 3).padEnd(7)} ${fmt(r.entry.strength).padEnd(9)} ${ageStr.padEnd(6)} ${r.entry.layer.padEnd(10)} ${r.entry.id.padEnd(17)} ${preview}`);
96
105
  }
97
106
  console.log();
98
- for (let i = 0; i < results.length; i++) {
99
- const r = results[i];
100
- const b = r.breakdown;
101
- console.log(`[${i + 1}] ${r.entry.id} composite=${fmt(r.score, 4)}`);
102
- if (!b) {
103
- console.log(' (no breakdown available)');
104
- console.log();
105
- continue;
106
- }
107
- if (b.mode === 'physics') {
108
- console.log(` mode: physics-gravity`);
109
- console.log(` cosine: ${fmt(b.cosine, 3)} (pre-amp baseline)`);
110
- console.log(` final: ${fmt(b.final, 4)} (post-amp, from physics scorer)`);
111
- }
112
- else {
113
- const matched = b.matchedTerms.length > 0 ? b.matchedTerms.join(', ') : '(none)';
114
- console.log(` mode: ${b.mode}${b.mode === 'hybrid-no-vec' ? ' (no cached doc vector — run `hippo embed`)' : ''}`);
115
- console.log(` BM25: raw=${fmt(r.bm25, 3)} normalized=${fmt(b.normBm25, 3)} weight=${fmt(b.bm25Weight, 2)} matched=[${matched}]`);
116
- console.log(` embedding: cosine=${fmt(b.cosine, 3)} weight=${fmt(b.embeddingWeight, 2)}`);
117
- console.log(` base: ${fmt(b.bm25Weight, 2)}*${fmt(b.normBm25, 3)} + ${fmt(b.embeddingWeight, 2)}*${fmt(b.cosine, 3)} = ${fmt(b.base, 4)}`);
118
- console.log(` strength: x${fmt(b.strengthMultiplier, 3)} (strength=${fmt(r.entry.strength, 3)})`);
119
- console.log(` recency: x${fmt(b.recencyMultiplier, 3)} (age=${b.ageDays}d)`);
120
- if (b.decisionBoost !== 1)
121
- console.log(` decision: x${fmt(b.decisionBoost, 2)} (tagged 'decision')`);
122
- if (b.scopeBoost !== 1)
123
- console.log(` scope: x${fmt(b.scopeBoost, 2)} (scope tag ${b.scopeBoost > 1 ? 'match' : 'mismatch'})`);
124
- if (b.pathBoost !== 1)
125
- console.log(` path: x${fmt(b.pathBoost, 3)} (cwd path tag overlap)`);
126
- if (b.sourceBump !== 1)
127
- console.log(` source: x${fmt(b.sourceBump, 2)} (local priority bump over global)`);
128
- if (b.outcomeBoost !== 1)
129
- console.log(` outcome: x${fmt(b.outcomeBoost, 3)} (user feedback: pos-neg = ${(r.entry.outcome_positive ?? 0) - (r.entry.outcome_negative ?? 0)})`);
130
- if (b.churnStaleMultiplier !== 1)
131
- console.log(` churn: x${fmt(b.churnStaleMultiplier, 2)} (tagged 'churn-stale')`);
132
- if (b.preMmrRank !== undefined && b.postMmrRank !== undefined && b.preMmrRank !== b.postMmrRank) {
133
- const arrow = b.postMmrRank < b.preMmrRank ? 'up' : 'down';
134
- console.log(` mmr: rank ${b.preMmrRank} -> ${b.postMmrRank} (diversity ${arrow})`);
135
- }
136
- console.log(` final: ${fmt(b.final, 4)}`);
137
- }
107
+ }
108
+ function printExplainBreakdown(r, i) {
109
+ const b = r.breakdown;
110
+ console.log(`[${i + 1}] ${r.entry.id} composite=${fmt(r.score, 4)}`);
111
+ if (!b) {
112
+ console.log(' (no breakdown available)');
138
113
  console.log();
114
+ return;
139
115
  }
140
- console.log('Note: explain does not mark memories as retrieved (read-only).');
116
+ if (b.mode === 'physics') {
117
+ console.log(` mode: physics-gravity`);
118
+ console.log(` cosine: ${fmt(b.cosine, 3)} (pre-amp baseline)`);
119
+ console.log(` final: ${fmt(b.final, 4)} (post-amp, from physics scorer)`);
120
+ }
121
+ else {
122
+ const matched = b.matchedTerms.length > 0 ? b.matchedTerms.join(', ') : '(none)';
123
+ console.log(` mode: ${b.mode}${b.mode === 'hybrid-no-vec' ? ' (no cached doc vector — run `hippo embed`)' : ''}`);
124
+ console.log(` BM25: raw=${fmt(r.bm25, 3)} normalized=${fmt(b.normBm25, 3)} weight=${fmt(b.bm25Weight, 2)} matched=[${matched}]`);
125
+ console.log(` embedding: cosine=${fmt(b.cosine, 3)} weight=${fmt(b.embeddingWeight, 2)}`);
126
+ console.log(` base: ${fmt(b.bm25Weight, 2)}*${fmt(b.normBm25, 3)} + ${fmt(b.embeddingWeight, 2)}*${fmt(b.cosine, 3)} = ${fmt(b.base, 4)}`);
127
+ console.log(` strength: x${fmt(b.strengthMultiplier, 3)} (strength=${fmt(r.entry.strength, 3)})`);
128
+ console.log(` recency: x${fmt(b.recencyMultiplier, 3)} (age=${b.ageDays}d)`);
129
+ if (b.decisionBoost !== 1)
130
+ console.log(` decision: x${fmt(b.decisionBoost, 2)} (tagged 'decision')`);
131
+ if (b.scopeBoost !== 1)
132
+ console.log(` scope: x${fmt(b.scopeBoost, 2)} (scope tag ${b.scopeBoost > 1 ? 'match' : 'mismatch'})`);
133
+ if (b.pathBoost !== 1)
134
+ console.log(` path: x${fmt(b.pathBoost, 3)} (cwd path tag overlap)`);
135
+ if (b.sourceBump !== 1)
136
+ console.log(` source: x${fmt(b.sourceBump, 2)} (local priority bump over global)`);
137
+ if (b.outcomeBoost !== 1)
138
+ console.log(` outcome: x${fmt(b.outcomeBoost, 3)} (user feedback: pos-neg = ${(r.entry.outcome_positive ?? 0) - (r.entry.outcome_negative ?? 0)})`);
139
+ if (b.churnStaleMultiplier !== 1)
140
+ console.log(` churn: x${fmt(b.churnStaleMultiplier, 2)} (tagged 'churn-stale')`);
141
+ if (b.preMmrRank !== undefined && b.postMmrRank !== undefined && b.preMmrRank !== b.postMmrRank) {
142
+ const arrow = b.postMmrRank < b.preMmrRank ? 'up' : 'down';
143
+ console.log(` mmr: rank ${b.preMmrRank} -> ${b.postMmrRank} (diversity ${arrow})`);
144
+ }
145
+ console.log(` final: ${fmt(b.final, 4)}`);
146
+ }
147
+ console.log();
141
148
  }
142
149
  export async function handleExplain({ hippoRoot, args, flags }) {
143
150
  const query = args.join(' ').trim();
package/dist/cli/goals.js CHANGED
@@ -4,7 +4,7 @@ import * as api from '../api.js';
4
4
  import { resolveTenantId } from '../tenant.js';
5
5
  import { printError } from './output.js';
6
6
  // ---------------------------------------------------------------------------
7
- // `hippo goal <push|list|complete|suspend|resume>` — B3 dlPFC depth (Task 10)
7
+ // `hippo goal <push|list|complete|suspend|resume>`
8
8
  // ---------------------------------------------------------------------------
9
9
  const GOAL_POLICY_TYPES = [
10
10
  'schema-fit-biased',
package/dist/cli/init.js CHANGED
@@ -242,7 +242,7 @@ function refreshShippedBlock(filePath, text, hook) {
242
242
  /** Claude Code settings hooks, Codex's hooks.json and the OpenCode plugin, under the home directory; idempotent, so re-running init adds newer hooks. */
243
243
  function installUserLevelHooks(agents, codexHint) {
244
244
  for (const hook of agents) {
245
- // The Codex capture wrapper swaps the codex launcher binary, so init only points at the opt-in (issue #133).
245
+ // The Codex capture wrapper swaps the codex launcher binary, so init only points at the opt-in.
246
246
  if (hook === 'codex' && codexHint && !isCodexWrapperInstalled()) {
247
247
  console.log(' Codex detected. To capture Codex sessions: hippo hook install codex');
248
248
  }
@@ -102,34 +102,60 @@ export async function cmdEmbed(hippoRoot, flags) {
102
102
  // when no provider key is present (e.g. embedded earlier with a key that was
103
103
  // later removed). The provider-availability gate is deferred to the embed path.
104
104
  if (flags['reset-physics']) {
105
- const entries = loadAllEntries(root);
106
- const embIndex = loadEmbeddingIndex(root);
107
- const db = openHippoDb(root);
108
- try {
109
- const count = resetAllPhysicsState(db, entries, embIndex);
110
- console.log(`Reset physics state: ${count} particles re-initialized from embeddings.`);
111
- }
112
- finally {
113
- closeHippoDb(db);
114
- }
105
+ resetPhysics(root);
115
106
  return;
116
107
  }
117
108
  if (flags['status']) {
118
- const entries = loadAllEntries(root);
119
- const embIndex = loadEmbeddingIndex(root);
120
- const activeIds = new Set(entries.map((e) => e.id));
121
- const activeEmbedded = Object.keys(embIndex).filter((id) => activeIds.has(id)).length;
122
- const orphaned = Object.keys(embIndex).length - activeEmbedded;
123
- console.log(`Embedding status: ${activeEmbedded}/${entries.length} memories embedded`);
124
- if (orphaned > 0) {
125
- console.log(` ${orphaned} orphaned embeddings (run \`hippo embed\` to prune)`);
126
- }
127
- const missing = entries.filter((e) => !embIndex[e.id]);
128
- if (missing.length > 0) {
129
- console.log(` ${missing.length} memories need embedding (run \`hippo embed\` to embed them)`);
130
- }
109
+ printEmbedStatus(root);
110
+ return;
111
+ }
112
+ if (!embedProviderReady(root))
131
113
  return;
114
+ console.log('Embedding all memories (this may take a moment on first run to download model)...');
115
+ let count;
116
+ try {
117
+ count = await embedAll(root, resolveEmbeddingModel(root));
132
118
  }
119
+ catch (err) {
120
+ printError(`Embedding failed: ${err instanceof Error ? err.message : String(err)}`);
121
+ const partial = loadEmbeddingIndex(root);
122
+ printError(`Partial progress saved: ${Object.keys(partial).length} embeddings on disk. Re-run \`hippo embed\` to resume.`);
123
+ process.exitCode = 1;
124
+ return;
125
+ }
126
+ const entriesAfter = loadAllEntries(root);
127
+ const embIndexAfter = loadEmbeddingIndex(root);
128
+ console.log(`Done. ${count} new embeddings created. ${Object.keys(embIndexAfter).length}/${entriesAfter.length} total.`);
129
+ }
130
+ function resetPhysics(root) {
131
+ const entries = loadAllEntries(root);
132
+ const embIndex = loadEmbeddingIndex(root);
133
+ const db = openHippoDb(root);
134
+ try {
135
+ const count = resetAllPhysicsState(db, entries, embIndex);
136
+ console.log(`Reset physics state: ${count} particles re-initialized from embeddings.`);
137
+ }
138
+ finally {
139
+ closeHippoDb(db);
140
+ }
141
+ }
142
+ function printEmbedStatus(root) {
143
+ const entries = loadAllEntries(root);
144
+ const embIndex = loadEmbeddingIndex(root);
145
+ const activeIds = new Set(entries.map((e) => e.id));
146
+ const activeEmbedded = Object.keys(embIndex).filter((id) => activeIds.has(id)).length;
147
+ const orphaned = Object.keys(embIndex).length - activeEmbedded;
148
+ console.log(`Embedding status: ${activeEmbedded}/${entries.length} memories embedded`);
149
+ if (orphaned > 0) {
150
+ console.log(` ${orphaned} orphaned embeddings (run \`hippo embed\` to prune)`);
151
+ }
152
+ const missing = entries.filter((e) => !embIndex[e.id]);
153
+ if (missing.length > 0) {
154
+ console.log(` ${missing.length} memories need embedding (run \`hippo embed\` to embed them)`);
155
+ }
156
+ }
157
+ /** False, after saying why, when no usable provider exists. */
158
+ function embedProviderReady(root) {
133
159
  // Embedding (unlike status/reset) needs an available provider.
134
160
  const embedProvider = (() => {
135
161
  try {
@@ -142,38 +168,23 @@ export async function cmdEmbed(hippoRoot, flags) {
142
168
  })();
143
169
  if (!embedProvider) {
144
170
  process.exitCode = 1;
145
- return;
171
+ return false;
146
172
  }
147
- if (!embedProvider.isAvailable()) {
148
- if (loadConfig(root).embeddings.enabled === false) {
149
- console.log('Embeddings are disabled in config (embeddings.enabled = false). Set it to true or "auto" to enable.');
150
- return;
151
- }
152
- if (embedProvider.kind === 'local') {
153
- console.log('Embeddings not available. Install @huggingface/transformers to enable:');
154
- console.log(' npm install @huggingface/transformers');
155
- }
156
- else {
157
- printError(`Embedding provider '${embedProvider.kind}' is configured but ${embedProvider.keyEnv} is not set.`);
158
- printError(`Export ${embedProvider.keyEnv}, or set config.embeddings.provider back to 'local'.`);
159
- process.exitCode = 1;
160
- }
161
- return;
173
+ if (embedProvider.isAvailable())
174
+ return true;
175
+ if (loadConfig(root).embeddings.enabled === false) {
176
+ console.log('Embeddings are disabled in config (embeddings.enabled = false). Set it to true or "auto" to enable.');
177
+ return false;
162
178
  }
163
- console.log('Embedding all memories (this may take a moment on first run to download model)...');
164
- let count;
165
- try {
166
- count = await embedAll(root, resolveEmbeddingModel(root));
179
+ if (embedProvider.kind === 'local') {
180
+ console.log('Embeddings not available. Install @huggingface/transformers to enable:');
181
+ console.log(' npm install @huggingface/transformers');
167
182
  }
168
- catch (err) {
169
- printError(`Embedding failed: ${err instanceof Error ? err.message : String(err)}`);
170
- const partial = loadEmbeddingIndex(root);
171
- printError(`Partial progress saved: ${Object.keys(partial).length} embeddings on disk. Re-run \`hippo embed\` to resume.`);
183
+ else {
184
+ printError(`Embedding provider '${embedProvider.kind}' is configured but ${embedProvider.keyEnv} is not set.`);
185
+ printError(`Export ${embedProvider.keyEnv}, or set config.embeddings.provider back to 'local'.`);
172
186
  process.exitCode = 1;
173
- return;
174
187
  }
175
- const entriesAfter = loadAllEntries(root);
176
- const embIndexAfter = loadEmbeddingIndex(root);
177
- console.log(`Done. ${count} new embeddings created. ${Object.keys(embIndexAfter).length}/${entriesAfter.length} total.`);
188
+ return false;
178
189
  }
179
190
  //# sourceMappingURL=maintenance.js.map