hippo-memory 1.17.0 → 1.19.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 (106) hide show
  1. package/bin/hippo.js +2 -2
  2. package/dist/api.d.ts +43 -0
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +109 -7
  5. package/dist/api.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +109 -11
  8. package/dist/cli.js.map +1 -1
  9. package/dist/connectors/github/backfill.js +4 -4
  10. package/dist/connectors/github/cli-impl.js +6 -6
  11. package/dist/connectors/github/dlq.js +14 -14
  12. package/dist/connectors/slack/backfill.js +1 -1
  13. package/dist/connectors/slack/dlq.js +10 -10
  14. package/dist/connectors/slack/workspaces.js +4 -4
  15. package/dist/customer-notes.d.ts.map +1 -1
  16. package/dist/customer-notes.js +5 -1
  17. package/dist/customer-notes.js.map +1 -1
  18. package/dist/dag.js +6 -6
  19. package/dist/dashboard.js +7 -7
  20. package/dist/decisions.d.ts.map +1 -1
  21. package/dist/decisions.js +9 -1
  22. package/dist/decisions.js.map +1 -1
  23. package/dist/goals.d.ts +11 -0
  24. package/dist/goals.d.ts.map +1 -1
  25. package/dist/goals.js +61 -49
  26. package/dist/goals.js.map +1 -1
  27. package/dist/graph-extract.d.ts.map +1 -1
  28. package/dist/graph-extract.js +32 -12
  29. package/dist/graph-extract.js.map +1 -1
  30. package/dist/graph.d.ts +46 -3
  31. package/dist/graph.d.ts.map +1 -1
  32. package/dist/graph.js +116 -8
  33. package/dist/graph.js.map +1 -1
  34. package/dist/hooks.js +24 -24
  35. package/dist/physics-state.js +27 -27
  36. package/dist/policies.d.ts.map +1 -1
  37. package/dist/policies.js +5 -1
  38. package/dist/policies.js.map +1 -1
  39. package/dist/predictions.js +67 -67
  40. package/dist/project-briefs.d.ts.map +1 -1
  41. package/dist/project-briefs.js +6 -1
  42. package/dist/project-briefs.js.map +1 -1
  43. package/dist/refine-llm.js +13 -13
  44. package/dist/search.d.ts +33 -0
  45. package/dist/search.d.ts.map +1 -1
  46. package/dist/search.js.map +1 -1
  47. package/dist/server.d.ts.map +1 -1
  48. package/dist/server.js +7 -0
  49. package/dist/server.js.map +1 -1
  50. package/dist/sleep-redact.d.ts +1 -0
  51. package/dist/sleep-redact.d.ts.map +1 -1
  52. package/dist/sleep-redact.js +6 -0
  53. package/dist/sleep-redact.js.map +1 -1
  54. package/dist/src/api.js +109 -7
  55. package/dist/src/api.js.map +1 -1
  56. package/dist/src/cli.js +109 -11
  57. package/dist/src/cli.js.map +1 -1
  58. package/dist/src/connectors/github/backfill.js +4 -4
  59. package/dist/src/connectors/github/cli-impl.js +6 -6
  60. package/dist/src/connectors/github/dlq.js +14 -14
  61. package/dist/src/connectors/slack/backfill.js +1 -1
  62. package/dist/src/connectors/slack/dlq.js +10 -10
  63. package/dist/src/connectors/slack/workspaces.js +4 -4
  64. package/dist/src/customer-notes.js +5 -1
  65. package/dist/src/customer-notes.js.map +1 -1
  66. package/dist/src/dag.js +6 -6
  67. package/dist/src/dashboard.js +7 -7
  68. package/dist/src/decisions.js +9 -1
  69. package/dist/src/decisions.js.map +1 -1
  70. package/dist/src/goals.js +61 -49
  71. package/dist/src/goals.js.map +1 -1
  72. package/dist/src/graph-extract.js +32 -12
  73. package/dist/src/graph-extract.js.map +1 -1
  74. package/dist/src/graph.js +116 -8
  75. package/dist/src/graph.js.map +1 -1
  76. package/dist/src/hooks.js +24 -24
  77. package/dist/src/physics-state.js +27 -27
  78. package/dist/src/policies.js +5 -1
  79. package/dist/src/policies.js.map +1 -1
  80. package/dist/src/predictions.js +67 -67
  81. package/dist/src/project-briefs.js +6 -1
  82. package/dist/src/project-briefs.js.map +1 -1
  83. package/dist/src/refine-llm.js +13 -13
  84. package/dist/src/search.js.map +1 -1
  85. package/dist/src/server.js +7 -0
  86. package/dist/src/server.js.map +1 -1
  87. package/dist/src/sleep-redact.js +6 -0
  88. package/dist/src/sleep-redact.js.map +1 -1
  89. package/dist/src/store.js +261 -260
  90. package/dist/src/store.js.map +1 -1
  91. package/dist/src/version.js +1 -1
  92. package/dist/src/working-memory.js +19 -19
  93. package/dist/store.d.ts +6 -0
  94. package/dist/store.d.ts.map +1 -1
  95. package/dist/store.js +261 -260
  96. package/dist/store.js.map +1 -1
  97. package/dist/version.d.ts +1 -1
  98. package/dist/version.js +1 -1
  99. package/dist/working-memory.js +19 -19
  100. package/dist-ui/index.html +12 -12
  101. package/extensions/openclaw-plugin/index.ts +650 -650
  102. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  103. package/extensions/openclaw-plugin/package.json +1 -1
  104. package/openclaw.plugin.json +1 -1
  105. package/package.json +1 -1
  106. package/dist/benchmarks/e1.3/scenarios.json +0 -2587
package/dist/cli.js CHANGED
@@ -916,7 +916,17 @@ async function cmdRecall(hippoRoot, query, flags) {
916
916
  results = results.map((r) => {
917
917
  const peers = r.entry.conflicts_with || [];
918
918
  const hasPeerInResults = peers.some((peerId) => presentIds.has(peerId));
919
- return hasPeerInResults ? { ...r, score: r.score * 0.3 } : r;
919
+ if (!hasPeerInResults)
920
+ return r;
921
+ const next = { ...r, score: r.score * 0.3 };
922
+ // A7 recall-trace: interference (vlPFC) down-rank. Only when --why.
923
+ if (showWhy) {
924
+ next.rerankTrace = [
925
+ ...(r.rerankTrace ?? []),
926
+ { stage: 'interference', multiplier: 0.3, scoreBefore: r.score, scoreAfter: next.score },
927
+ ];
928
+ }
929
+ return next;
920
930
  });
921
931
  results.sort((a, b) => b.score - a.score);
922
932
  }
@@ -936,7 +946,15 @@ async function cmdRecall(hippoRoot, query, flags) {
936
946
  return r;
937
947
  const raw = 1 + 0.3 * Math.tanh(pos - neg);
938
948
  const valueMult = Math.max(0.7, Math.min(1.3, raw));
939
- return { ...r, score: r.score * valueMult };
949
+ const next = { ...r, score: r.score * valueMult };
950
+ // A7 recall-trace: vmPFC continuous value attribution. Only when --why.
951
+ if (showWhy) {
952
+ next.rerankTrace = [
953
+ ...(r.rerankTrace ?? []),
954
+ { stage: 'value', multiplier: valueMult, scoreBefore: r.score, scoreAfter: next.score },
955
+ ];
956
+ }
957
+ return next;
940
958
  });
941
959
  results.sort((a, b) => b.score - a.score);
942
960
  }
@@ -960,8 +978,17 @@ async function cmdRecall(hippoRoot, query, flags) {
960
978
  .map((r) => {
961
979
  const strength = typeof r.entry.strength === 'number' ? r.entry.strength : 1.0;
962
980
  const costFactor = Math.min(0.3, (r.tokens || 0) / 10000);
963
- const utility = r.score * (0.5 + 0.5 * strength) * (1 - costFactor);
964
- return { ...r, score: utility };
981
+ const utilityMult = (0.5 + 0.5 * strength) * (1 - costFactor);
982
+ const utility = r.score * utilityMult;
983
+ const next = { ...r, score: utility };
984
+ // A7 recall-trace: OFC option-value re-rank. Only when --why.
985
+ if (showWhy) {
986
+ next.rerankTrace = [
987
+ ...(r.rerankTrace ?? []),
988
+ { stage: 'utility', multiplier: utilityMult, scoreBefore: r.score, scoreAfter: utility },
989
+ ];
990
+ }
991
+ return next;
965
992
  })
966
993
  .sort((a, b) => b.score - a.score);
967
994
  }
@@ -990,11 +1017,22 @@ async function cmdRecall(hippoRoot, query, flags) {
990
1017
  // salience) that sort by `r.score` honor the reranker's order rather
991
1018
  // than unwinding it. Original score is preserved on rerankScore's
992
1019
  // input, but downstream sorters key on `score`.
993
- const withPostRank = reranked.map((r, i) => ({
994
- ...r,
995
- score: r.rerankScore,
996
- postRerankRank: i + 1,
997
- }));
1020
+ const withPostRank = reranked.map((r, i) => {
1021
+ const next = {
1022
+ ...r,
1023
+ score: r.rerankScore,
1024
+ postRerankRank: i + 1,
1025
+ };
1026
+ // A7 recall-trace: F6 reranker pass (reorder + rescale; not a scalar
1027
+ // multiply, so no multiplier field). Only when --why.
1028
+ if (showWhy) {
1029
+ next.rerankTrace = [
1030
+ ...(r.rerankTrace ?? []),
1031
+ { stage: 'reranker', scoreBefore: r.score, scoreAfter: r.rerankScore },
1032
+ ];
1033
+ }
1034
+ return next;
1035
+ });
998
1036
  results = [...withPostRank, ...tail];
999
1037
  }
1000
1038
  }
@@ -1008,7 +1046,23 @@ async function cmdRecall(hippoRoot, query, flags) {
1008
1046
  const goalTag = flags['goal'] !== undefined ? String(flags['goal']).trim() : '';
1009
1047
  if (goalTag) {
1010
1048
  results = results
1011
- .map((r) => (r.entry.tags?.includes(goalTag) ? { ...r, score: r.score * 1.5 } : r))
1049
+ .map((r) => {
1050
+ if (!r.entry.tags?.includes(goalTag))
1051
+ return r;
1052
+ const boosted = { ...r, score: r.score * 1.5 };
1053
+ // A7 recall-trace: the explicit `--goal <tag>` boost is a public CLI
1054
+ // re-ranker (score *= 1.5) and is mutually exclusive with the session
1055
+ // goal-stack boost below, so it must record its OWN step or `--why
1056
+ // --goal` produces no ranking line (codex review). Stage `goal`
1057
+ // (explicit flag) is distinct from `goal-boost` (session stack).
1058
+ if (showWhy) {
1059
+ boosted.rerankTrace = [
1060
+ ...(r.rerankTrace ?? []),
1061
+ { stage: 'goal', multiplier: 1.5, scoreBefore: r.score, scoreAfter: r.score * 1.5, note: `--goal ${goalTag}` },
1062
+ ];
1063
+ }
1064
+ return boosted;
1065
+ })
1012
1066
  .sort((a, b) => b.score - a.score);
1013
1067
  }
1014
1068
  // dlPFC depth (B3, v0.38; lifted v1.7.4 into applyGoalStackBoost). When
@@ -1022,16 +1076,31 @@ async function cmdRecall(hippoRoot, query, flags) {
1022
1076
  : process.env.HIPPO_SESSION_ID ?? '').trim();
1023
1077
  if (sessionId && goalTag === '') {
1024
1078
  const dbForGoals = openHippoDb(hippoRoot);
1079
+ // A7 recall-trace: goal-boost is the shared helper, not an inline map. It
1080
+ // writes its steps into this SEPARATE accumulator (keyed by entry id), NOT
1081
+ // onto the row (the helper strips internal markers on re-spread). Only
1082
+ // allocated under --why.
1083
+ const goalBoostTrace = showWhy ? new Map() : undefined;
1025
1084
  try {
1026
1085
  results = applyGoalStackBoost(dbForGoals, results, {
1027
1086
  sessionId,
1028
1087
  tenantId,
1029
1088
  limit,
1089
+ ...(goalBoostTrace ? { trace: goalBoostTrace } : {}),
1030
1090
  });
1031
1091
  }
1032
1092
  finally {
1033
1093
  closeHippoDb(dbForGoals);
1034
1094
  }
1095
+ // Merge the accumulated goal-boost steps onto the matching SearchResult.
1096
+ if (goalBoostTrace && goalBoostTrace.size > 0) {
1097
+ results = results.map((r) => {
1098
+ const step = goalBoostTrace.get(r.entry.id);
1099
+ if (!step)
1100
+ return r;
1101
+ return { ...r, rerankTrace: [...(r.rerankTrace ?? []), step] };
1102
+ });
1103
+ }
1035
1104
  }
1036
1105
  // Pineal salience MVP (RESEARCH.md §"AI Pineal Gland — Intuition and Awareness
1037
1106
  // Module"). When --salience-threshold T is set (T > 0), memories whose
@@ -1061,7 +1130,17 @@ async function cmdRecall(hippoRoot, query, flags) {
1061
1130
  if (count >= T)
1062
1131
  return r;
1063
1132
  const mult = Math.max(0.5, count / T);
1064
- return { ...r, score: r.score * mult };
1133
+ const next = { ...r, score: r.score * mult };
1134
+ // A7 recall-trace: pineal salience (retrieval_count) down-weight. The
1135
+ // stage names the ACTUAL transform (retrieval_count, not goal-stack).
1136
+ // Only when --why.
1137
+ if (showWhy) {
1138
+ next.rerankTrace = [
1139
+ ...(r.rerankTrace ?? []),
1140
+ { stage: 'retrieval-count-downweight', multiplier: mult, scoreBefore: r.score, scoreAfter: next.score },
1141
+ ];
1142
+ }
1143
+ return next;
1065
1144
  })
1066
1145
  .sort((a, b) => b.score - a.score);
1067
1146
  }
@@ -1389,6 +1468,10 @@ async function cmdRecall(hippoRoot, query, flags) {
1389
1468
  if (explanation.envelope) {
1390
1469
  base.envelope = explanation.envelope;
1391
1470
  }
1471
+ // A7 recall-trace: emit the ordered lifecycle re-ranking steps.
1472
+ if (r.rerankTrace && r.rerankTrace.length > 0) {
1473
+ base.rerankTrace = r.rerankTrace;
1474
+ }
1392
1475
  }
1393
1476
  return base;
1394
1477
  });
@@ -1513,6 +1596,17 @@ async function cmdRecall(hippoRoot, query, flags) {
1513
1596
  console.log(` session_id: ${env.session_id}`);
1514
1597
  console.log(` confidence: ${env.confidence}`);
1515
1598
  }
1599
+ // A7 recall-trace: render the ordered lifecycle re-ranking chain, e.g.
1600
+ // "ranking: base 0.420 -> interference x0.3 -> 0.126 -> goal-boost x1.5 -> 0.189".
1601
+ if (r.rerankTrace && r.rerankTrace.length > 0) {
1602
+ const parts = [`base ${fmt(r.rerankTrace[0].scoreBefore, 3)}`];
1603
+ for (const step of r.rerankTrace) {
1604
+ const mult = step.multiplier !== undefined ? ` x${fmt(step.multiplier, 2)}` : '';
1605
+ parts.push(`${step.stage}${mult}`);
1606
+ parts.push(fmt(step.scoreAfter, 3));
1607
+ }
1608
+ console.log(` ranking: ${parts.join(' -> ')}`);
1609
+ }
1516
1610
  }
1517
1611
  console.log();
1518
1612
  console.log(e.content);
@@ -2262,6 +2356,10 @@ export function renderSleepResult(result) {
2262
2356
  if (result.ambient) {
2263
2357
  console.log(`\n${renderAmbientSummary(result.ambient)}`);
2264
2358
  }
2359
+ if (result.graph && result.graph.tenants > 0) {
2360
+ const { tenants, entities, relations } = result.graph;
2361
+ console.log(`\nGraph: rebuilt ${tenants} tenant${tenants === 1 ? '' : 's'} (${entities} entities, ${relations} relations).`);
2362
+ }
2265
2363
  }
2266
2364
  async function cmdSleepCore(hippoRoot, flags) {
2267
2365
  requireInit(hippoRoot);