hippo-memory 1.23.0 → 1.24.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 (147) hide show
  1. package/README.md +16 -5
  2. package/bin/hippo.js +2 -2
  3. package/dist/ablation.d.ts +93 -0
  4. package/dist/ablation.d.ts.map +1 -0
  5. package/dist/ablation.js +138 -0
  6. package/dist/ablation.js.map +1 -0
  7. package/dist/ambient.d.ts.map +1 -1
  8. package/dist/ambient.js +2 -1
  9. package/dist/ambient.js.map +1 -1
  10. package/dist/api.d.ts +37 -0
  11. package/dist/api.d.ts.map +1 -1
  12. package/dist/api.js +88 -11
  13. package/dist/api.js.map +1 -1
  14. package/dist/benchmarks/e1.3/scenarios.json +2587 -0
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +117 -18
  17. package/dist/cli.js.map +1 -1
  18. package/dist/config.d.ts +8 -0
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +2 -0
  21. package/dist/config.js.map +1 -1
  22. package/dist/connectors/github/backfill.js +4 -4
  23. package/dist/connectors/github/cli-impl.js +6 -6
  24. package/dist/connectors/github/dlq.js +14 -14
  25. package/dist/connectors/slack/backfill.js +1 -1
  26. package/dist/connectors/slack/dlq.js +10 -10
  27. package/dist/connectors/slack/workspaces.js +4 -4
  28. package/dist/consolidate.d.ts.map +1 -1
  29. package/dist/consolidate.js +27 -5
  30. package/dist/consolidate.js.map +1 -1
  31. package/dist/dag.js +6 -6
  32. package/dist/dashboard.js +7 -7
  33. package/dist/db.d.ts.map +1 -1
  34. package/dist/db.js +55 -4
  35. package/dist/db.js.map +1 -1
  36. package/dist/hooks.js +24 -24
  37. package/dist/importers.d.ts +28 -0
  38. package/dist/importers.d.ts.map +1 -1
  39. package/dist/importers.js +412 -1
  40. package/dist/importers.js.map +1 -1
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/mcp/server.d.ts.map +1 -1
  46. package/dist/mcp/server.js +44 -7
  47. package/dist/mcp/server.js.map +1 -1
  48. package/dist/memory.d.ts +9 -0
  49. package/dist/memory.d.ts.map +1 -1
  50. package/dist/memory.js +29 -6
  51. package/dist/memory.js.map +1 -1
  52. package/dist/physics-state.d.ts.map +1 -1
  53. package/dist/physics-state.js +4 -3
  54. package/dist/physics-state.js.map +1 -1
  55. package/dist/physics.d.ts.map +1 -1
  56. package/dist/physics.js +8 -1
  57. package/dist/physics.js.map +1 -1
  58. package/dist/predictions.js +67 -67
  59. package/dist/project-identity.d.ts +84 -0
  60. package/dist/project-identity.d.ts.map +1 -0
  61. package/dist/project-identity.js +184 -0
  62. package/dist/project-identity.js.map +1 -0
  63. package/dist/refine-llm.js +13 -13
  64. package/dist/replay.d.ts.map +1 -1
  65. package/dist/replay.js +4 -1
  66. package/dist/replay.js.map +1 -1
  67. package/dist/search.d.ts +14 -0
  68. package/dist/search.d.ts.map +1 -1
  69. package/dist/search.js +36 -7
  70. package/dist/search.js.map +1 -1
  71. package/dist/secret-detect.d.ts +33 -0
  72. package/dist/secret-detect.d.ts.map +1 -0
  73. package/dist/secret-detect.js +70 -0
  74. package/dist/secret-detect.js.map +1 -0
  75. package/dist/server.d.ts.map +1 -1
  76. package/dist/server.js +11 -0
  77. package/dist/server.js.map +1 -1
  78. package/dist/shared.d.ts +9 -1
  79. package/dist/shared.d.ts.map +1 -1
  80. package/dist/shared.js +67 -16
  81. package/dist/shared.js.map +1 -1
  82. package/dist/src/ablation.js +138 -0
  83. package/dist/src/ablation.js.map +1 -0
  84. package/dist/src/ambient.js +2 -1
  85. package/dist/src/ambient.js.map +1 -1
  86. package/dist/src/api.js +88 -11
  87. package/dist/src/api.js.map +1 -1
  88. package/dist/src/cli.js +117 -18
  89. package/dist/src/cli.js.map +1 -1
  90. package/dist/src/config.js +2 -0
  91. package/dist/src/config.js.map +1 -1
  92. package/dist/src/connectors/github/backfill.js +4 -4
  93. package/dist/src/connectors/github/cli-impl.js +6 -6
  94. package/dist/src/connectors/github/dlq.js +14 -14
  95. package/dist/src/connectors/slack/backfill.js +1 -1
  96. package/dist/src/connectors/slack/dlq.js +10 -10
  97. package/dist/src/connectors/slack/workspaces.js +4 -4
  98. package/dist/src/consolidate.js +27 -5
  99. package/dist/src/consolidate.js.map +1 -1
  100. package/dist/src/dag.js +6 -6
  101. package/dist/src/dashboard.js +7 -7
  102. package/dist/src/db.js +55 -4
  103. package/dist/src/db.js.map +1 -1
  104. package/dist/src/hooks.js +24 -24
  105. package/dist/src/importers.js +412 -1
  106. package/dist/src/importers.js.map +1 -1
  107. package/dist/src/index.js +1 -1
  108. package/dist/src/index.js.map +1 -1
  109. package/dist/src/mcp/server.js +44 -7
  110. package/dist/src/mcp/server.js.map +1 -1
  111. package/dist/src/memory.js +29 -6
  112. package/dist/src/memory.js.map +1 -1
  113. package/dist/src/physics-state.js +4 -3
  114. package/dist/src/physics-state.js.map +1 -1
  115. package/dist/src/physics.js +8 -1
  116. package/dist/src/physics.js.map +1 -1
  117. package/dist/src/predictions.js +67 -67
  118. package/dist/src/project-identity.js +184 -0
  119. package/dist/src/project-identity.js.map +1 -0
  120. package/dist/src/refine-llm.js +13 -13
  121. package/dist/src/replay.js +4 -1
  122. package/dist/src/replay.js.map +1 -1
  123. package/dist/src/search.js +36 -7
  124. package/dist/src/search.js.map +1 -1
  125. package/dist/src/secret-detect.js +70 -0
  126. package/dist/src/secret-detect.js.map +1 -0
  127. package/dist/src/server.js +11 -0
  128. package/dist/src/server.js.map +1 -1
  129. package/dist/src/shared.js +67 -16
  130. package/dist/src/shared.js.map +1 -1
  131. package/dist/src/store.js +66 -11
  132. package/dist/src/store.js.map +1 -1
  133. package/dist/src/version.js +1 -1
  134. package/dist/src/working-memory.js +19 -19
  135. package/dist/store.d.ts +15 -0
  136. package/dist/store.d.ts.map +1 -1
  137. package/dist/store.js +66 -11
  138. package/dist/store.js.map +1 -1
  139. package/dist/version.d.ts +1 -1
  140. package/dist/version.js +1 -1
  141. package/dist/working-memory.js +19 -19
  142. package/dist-ui/index.html +12 -12
  143. package/extensions/openclaw-plugin/index.ts +650 -650
  144. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  145. package/extensions/openclaw-plugin/package.json +1 -1
  146. package/openclaw.plugin.json +1 -1
  147. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"physics.js","sourceRoot":"","sources":["../../src/physics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"physics.js","sourceRoot":"","sources":["../../src/physics.ts"],"names":[],"mappings":"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"}
@@ -86,20 +86,20 @@ export function savePrediction(hippoRoot, tenantId, opts, actor = 'cli') {
86
86
  writeEntry(hippoRoot, mem, {
87
87
  actor,
88
88
  afterWrite: (db, memoryId) => {
89
- const result = db.prepare(`
90
- INSERT INTO predictions(
91
- memory_id, tenant_id, class_tag, claim_text,
92
- estimate_value, estimate_unit, target_date,
93
- actual_value, closure_state, closed_at, closure_note, created_at
94
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'open', NULL, NULL, ?)
89
+ const result = db.prepare(`
90
+ INSERT INTO predictions(
91
+ memory_id, tenant_id, class_tag, claim_text,
92
+ estimate_value, estimate_unit, target_date,
93
+ actual_value, closure_state, closed_at, closure_note, created_at
94
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'open', NULL, NULL, ?)
95
95
  `).run(memoryId, tenantId, opts.classTag, opts.claimText, opts.estimateValue ?? null, opts.estimateUnit ?? null, opts.targetDate ?? null, null, // actual_value — null until close
96
96
  now);
97
97
  const predictionId = Number(result.lastInsertRowid ?? 0);
98
- const row = db.prepare(`
99
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
100
- estimate_value, estimate_unit, target_date,
101
- actual_value, closure_state, closed_at, closure_note, created_at
102
- FROM predictions WHERE id = ?
98
+ const row = db.prepare(`
99
+ SELECT id, memory_id, tenant_id, class_tag, claim_text,
100
+ estimate_value, estimate_unit, target_date,
101
+ actual_value, closure_state, closed_at, closure_note, created_at
102
+ FROM predictions WHERE id = ?
103
103
  `).get(predictionId);
104
104
  if (!row) {
105
105
  throw new Error('Failed to reload saved prediction row');
@@ -150,16 +150,16 @@ export function closePrediction(hippoRoot, tenantId, id, opts, actor = 'cli') {
150
150
  // predict_close audit row. Zero changed rows → caller decides
151
151
  // whether it's a "not found" or "already closed" case based on the
152
152
  // load-then-close pattern.
153
- const updateResult = db.prepare(`
154
- UPDATE predictions
155
- SET actual_value = ?, closure_state = ?, closed_at = ?, closure_note = ?
156
- WHERE id = ? AND tenant_id = ? AND closure_state = 'open'
153
+ const updateResult = db.prepare(`
154
+ UPDATE predictions
155
+ SET actual_value = ?, closure_state = ?, closed_at = ?, closure_note = ?
156
+ WHERE id = ? AND tenant_id = ? AND closure_state = 'open'
157
157
  `).run(opts.actualValue ?? null, opts.closureState, now, opts.closureNote ?? null, id, tenantId);
158
158
  if (updateResult.changes === 0) {
159
159
  // Distinguish "not found" from "already closed" so callers (CLI, HTTP)
160
160
  // can surface the right error to the user.
161
- const existing = db.prepare(`
162
- SELECT closure_state FROM predictions WHERE id = ? AND tenant_id = ?
161
+ const existing = db.prepare(`
162
+ SELECT closure_state FROM predictions WHERE id = ? AND tenant_id = ?
163
163
  `).get(id, tenantId);
164
164
  if (!existing) {
165
165
  throw new Error(`closePrediction: prediction ${id} not found for tenant ${tenantId}`);
@@ -167,11 +167,11 @@ export function closePrediction(hippoRoot, tenantId, id, opts, actor = 'cli') {
167
167
  throw new Error(`closePrediction: prediction ${id} is already closed (state='${existing.closure_state}'); ` +
168
168
  `cannot re-close. Open predictions only.`);
169
169
  }
170
- const row = db.prepare(`
171
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
172
- estimate_value, estimate_unit, target_date,
173
- actual_value, closure_state, closed_at, closure_note, created_at
174
- FROM predictions WHERE id = ? AND tenant_id = ?
170
+ const row = db.prepare(`
171
+ SELECT id, memory_id, tenant_id, class_tag, claim_text,
172
+ estimate_value, estimate_unit, target_date,
173
+ actual_value, closure_state, closed_at, closure_note, created_at
174
+ FROM predictions WHERE id = ? AND tenant_id = ?
175
175
  `).get(id, tenantId);
176
176
  if (!row) {
177
177
  throw new Error(`closePrediction: prediction ${id} not found after UPDATE`);
@@ -208,11 +208,11 @@ export function loadPredictionById(hippoRoot, tenantId, id) {
208
208
  assertTenantId('loadPredictionById', tenantId);
209
209
  const db = openHippoDb(hippoRoot);
210
210
  try {
211
- const row = db.prepare(`
212
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
213
- estimate_value, estimate_unit, target_date,
214
- actual_value, closure_state, closed_at, closure_note, created_at
215
- FROM predictions WHERE id = ? AND tenant_id = ?
211
+ const row = db.prepare(`
212
+ SELECT id, memory_id, tenant_id, class_tag, claim_text,
213
+ estimate_value, estimate_unit, target_date,
214
+ actual_value, closure_state, closed_at, closure_note, created_at
215
+ FROM predictions WHERE id = ? AND tenant_id = ?
216
216
  `).get(id, tenantId);
217
217
  return row ? rowToPrediction(row) : null;
218
218
  }
@@ -230,25 +230,25 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
230
230
  if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
231
231
  throw new Error(`loadPredictionsByClass: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ${opts.closureState}`);
232
232
  }
233
- rows = db.prepare(`
234
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
235
- estimate_value, estimate_unit, target_date,
236
- actual_value, closure_state, closed_at, closure_note, created_at
237
- FROM predictions
238
- WHERE tenant_id = ? AND class_tag = ? AND closure_state = ?
239
- ORDER BY created_at DESC, id DESC
240
- LIMIT ?
233
+ rows = db.prepare(`
234
+ SELECT id, memory_id, tenant_id, class_tag, claim_text,
235
+ estimate_value, estimate_unit, target_date,
236
+ actual_value, closure_state, closed_at, closure_note, created_at
237
+ FROM predictions
238
+ WHERE tenant_id = ? AND class_tag = ? AND closure_state = ?
239
+ ORDER BY created_at DESC, id DESC
240
+ LIMIT ?
241
241
  `).all(tenantId, classTag, opts.closureState, limit);
242
242
  }
243
243
  else {
244
- rows = db.prepare(`
245
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
246
- estimate_value, estimate_unit, target_date,
247
- actual_value, closure_state, closed_at, closure_note, created_at
248
- FROM predictions
249
- WHERE tenant_id = ? AND class_tag = ?
250
- ORDER BY created_at DESC, id DESC
251
- LIMIT ?
244
+ rows = db.prepare(`
245
+ SELECT id, memory_id, tenant_id, class_tag, claim_text,
246
+ estimate_value, estimate_unit, target_date,
247
+ actual_value, closure_state, closed_at, closure_note, created_at
248
+ FROM predictions
249
+ WHERE tenant_id = ? AND class_tag = ?
250
+ ORDER BY created_at DESC, id DESC
251
+ LIMIT ?
252
252
  `).all(tenantId, classTag, limit);
253
253
  }
254
254
  return rows.map(rowToPrediction);
@@ -286,14 +286,14 @@ emitAudit = true) {
286
286
  throw new Error('computePredictionBaserate: classTag is required');
287
287
  const db = openHippoDb(hippoRoot);
288
288
  try {
289
- const rows = db.prepare(`
290
- SELECT estimate_value, actual_value
291
- FROM predictions
292
- WHERE tenant_id = ?
293
- AND class_tag = ?
294
- AND closure_state = 'closed'
295
- AND estimate_value IS NOT NULL
296
- AND actual_value IS NOT NULL
289
+ const rows = db.prepare(`
290
+ SELECT estimate_value, actual_value
291
+ FROM predictions
292
+ WHERE tenant_id = ?
293
+ AND class_tag = ?
294
+ AND closure_state = 'closed'
295
+ AND estimate_value IS NOT NULL
296
+ AND actual_value IS NOT NULL
297
297
  `).all(tenantId, classTag);
298
298
  const nClosed = rows.length;
299
299
  if (nClosed === 0) {
@@ -373,25 +373,25 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
373
373
  try {
374
374
  let rows;
375
375
  if (opts.classTag) {
376
- rows = db.prepare(`
377
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
378
- estimate_value, estimate_unit, target_date,
379
- actual_value, closure_state, closed_at, closure_note, created_at
380
- FROM predictions
381
- WHERE tenant_id = ? AND class_tag = ? AND closure_state = 'open'
382
- ORDER BY created_at DESC, id DESC
383
- LIMIT ?
376
+ rows = db.prepare(`
377
+ SELECT id, memory_id, tenant_id, class_tag, claim_text,
378
+ estimate_value, estimate_unit, target_date,
379
+ actual_value, closure_state, closed_at, closure_note, created_at
380
+ FROM predictions
381
+ WHERE tenant_id = ? AND class_tag = ? AND closure_state = 'open'
382
+ ORDER BY created_at DESC, id DESC
383
+ LIMIT ?
384
384
  `).all(tenantId, opts.classTag, limit);
385
385
  }
386
386
  else {
387
- rows = db.prepare(`
388
- SELECT id, memory_id, tenant_id, class_tag, claim_text,
389
- estimate_value, estimate_unit, target_date,
390
- actual_value, closure_state, closed_at, closure_note, created_at
391
- FROM predictions
392
- WHERE tenant_id = ? AND closure_state = 'open'
393
- ORDER BY created_at DESC, id DESC
394
- LIMIT ?
387
+ rows = db.prepare(`
388
+ SELECT id, memory_id, tenant_id, class_tag, claim_text,
389
+ estimate_value, estimate_unit, target_date,
390
+ actual_value, closure_state, closed_at, closure_note, created_at
391
+ FROM predictions
392
+ WHERE tenant_id = ? AND closure_state = 'open'
393
+ ORDER BY created_at DESC, id DESC
394
+ LIMIT ?
395
395
  `).all(tenantId, limit);
396
396
  }
397
397
  return rows.map(rowToPrediction);
@@ -0,0 +1,184 @@
1
+ import * as fs from 'fs';
2
+ import * as os from 'os';
3
+ import * as path from 'path';
4
+ const MAX_WALK_DEPTH = 64;
5
+ const identityCache = new Map();
6
+ /** Clear the per-process identity cache (test seam). */
7
+ export function clearProjectIdentityCache() {
8
+ identityCache.clear();
9
+ }
10
+ /**
11
+ * Canonicalize a path via realpath, falling back to path.resolve when the
12
+ * path does not exist or realpath fails (mirrors importers.ts).
13
+ */
14
+ function realpathOrResolve(p) {
15
+ try {
16
+ return fs.realpathSync.native(p);
17
+ }
18
+ catch {
19
+ return path.resolve(p);
20
+ }
21
+ }
22
+ /** Compare two canonical paths, case-insensitively on Windows. */
23
+ function samePath(a, b) {
24
+ if (process.platform === 'win32')
25
+ return a.toLowerCase() === b.toLowerCase();
26
+ return a === b;
27
+ }
28
+ function isUnder(child, parent) {
29
+ const rel = path.relative(parent, child);
30
+ const under = rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
31
+ if (under)
32
+ return true;
33
+ if (process.platform === 'win32') {
34
+ const relLower = path.relative(parent.toLowerCase(), child.toLowerCase());
35
+ return relLower === '' || (!relLower.startsWith('..') && !path.isAbsolute(relLower));
36
+ }
37
+ return false;
38
+ }
39
+ /** A `.hippo` marker must be a DIRECTORY (a store) - a stray file named
40
+ * `.hippo` must not turn its parent into a project. `.git` stays existsSync
41
+ * because worktrees legitimately use a `.git` FILE. */
42
+ function isDirectoryAt(p) {
43
+ try {
44
+ return fs.statSync(p).isDirectory();
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ /**
51
+ * Resolve the project identity for a working directory.
52
+ * Defaults to process.cwd(). Results are cached per resolved input path.
53
+ */
54
+ export function resolveProjectIdentity(cwd, opts) {
55
+ const startInput = path.resolve(cwd ?? process.cwd());
56
+ const cacheable = !opts?.homeDir && !opts?.stopDir;
57
+ if (cacheable) {
58
+ const cached = identityCache.get(startInput);
59
+ if (cached)
60
+ return cached;
61
+ }
62
+ const home = realpathOrResolve(opts?.homeDir ?? os.homedir());
63
+ const stopDir = opts?.stopDir ? realpathOrResolve(opts.stopDir) : null;
64
+ const start = realpathOrResolve(startInput);
65
+ let hippoRoot = null;
66
+ let gitRoot = null;
67
+ let reachedHome = false;
68
+ let dir = start;
69
+ for (let depth = 0; depth < MAX_WALK_DEPTH; depth++) {
70
+ if (samePath(dir, home)) {
71
+ reachedHome = true;
72
+ break;
73
+ }
74
+ if (stopDir !== null && samePath(dir, stopDir))
75
+ break;
76
+ if (hippoRoot === null && isDirectoryAt(path.join(dir, '.hippo'))) {
77
+ hippoRoot = dir;
78
+ }
79
+ if (gitRoot === null && fs.existsSync(path.join(dir, '.git'))) {
80
+ gitRoot = dir;
81
+ }
82
+ const parent = path.dirname(dir);
83
+ if (samePath(parent, dir))
84
+ break; // filesystem root
85
+ dir = parent;
86
+ }
87
+ let identity;
88
+ const root = hippoRoot ?? gitRoot;
89
+ if (root !== null) {
90
+ identity = { root, name: path.basename(root).toLowerCase(), isHome: false };
91
+ }
92
+ else if (reachedHome || isUnder(start, home)) {
93
+ identity = { root: home, name: '', isHome: true };
94
+ }
95
+ else {
96
+ // No markers anywhere: not a project. Empty name keeps these memories
97
+ // user-global rather than fabricating an origin from a basename.
98
+ identity = { root: start, name: '', isHome: false };
99
+ }
100
+ if (cacheable)
101
+ identityCache.set(startInput, identity);
102
+ return identity;
103
+ }
104
+ /**
105
+ * v39 memory scope isolation: classify a memory's origin_project against the
106
+ * active project. `currentName === ''` means the session is not in a project
107
+ * (home dir or markerless cwd) - everything is in scope there, matching
108
+ * pre-isolation behavior. NULL/undefined origin is a legacy pre-v39 row and
109
+ * is treated as cross-project (deny by default) - the safe direction for a
110
+ * security partition.
111
+ */
112
+ export function classifyOriginProject(origin, currentName) {
113
+ if (currentName === '')
114
+ return 'project';
115
+ if (origin === undefined || origin === null)
116
+ return 'cross-project';
117
+ if (origin === '')
118
+ return 'user-global';
119
+ return origin === currentName ? 'project' : 'cross-project';
120
+ }
121
+ /**
122
+ * The global Hippo store directory, resolved the same way shared.ts does:
123
+ * $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo. Lives here (leaf module) so
124
+ * db.ts migrations can use it without importing shared.ts (store.ts cycle);
125
+ * shared.getGlobalRoot delegates to this.
126
+ */
127
+ export function resolveGlobalRootDir() {
128
+ const hippoHome = process.env.HIPPO_HOME?.trim();
129
+ if (hippoHome)
130
+ return hippoHome;
131
+ const xdgData = process.env.XDG_DATA_HOME?.trim();
132
+ if (xdgData)
133
+ return path.join(xdgData, 'hippo');
134
+ return path.join(os.homedir(), '.hippo');
135
+ }
136
+ /**
137
+ * True when `p` IS the global store root. Used by the v39 migration so a
138
+ * global store whose parent chain happens to contain `.git`/`.hippo`
139
+ * (git-managed HIPPO_HOME, dotfiles setups) still backfills as user-global
140
+ * ('') instead of being stamped with the surrounding repo's name - which
141
+ * would hide the user's entire global corpus from every project.
142
+ */
143
+ export function isGlobalStoreRoot(p) {
144
+ return samePath(realpathOrResolve(path.resolve(p)), realpathOrResolve(resolveGlobalRootDir()));
145
+ }
146
+ /**
147
+ * Parse a memory's origin from its provenance `source` string, mirroring the
148
+ * v39 migration's evidence rules: `shared:<project>:<ts>` and
149
+ * `promoted:<localRoot>` identify the owning project; the user home dir's
150
+ * basename maps to '' (user-global). Returns null when the source carries no
151
+ * origin evidence. Pure string logic - recorded paths may no longer exist.
152
+ */
153
+ export function originFromSource(source, homeName) {
154
+ if (!source)
155
+ return null;
156
+ const home = (homeName ?? path.basename(os.homedir())).toLowerCase();
157
+ const shared = /^shared:([^:]+):/.exec(source);
158
+ if (shared) {
159
+ const name = shared[1].toLowerCase();
160
+ return name === home ? '' : name;
161
+ }
162
+ if (source.startsWith('promoted:')) {
163
+ const promotedPath = source.slice('promoted:'.length).trim();
164
+ if (!promotedPath)
165
+ return null;
166
+ const name = path.basename(path.resolve(promotedPath, '..')).toLowerCase();
167
+ if (!name)
168
+ return null;
169
+ return name === home ? '' : name;
170
+ }
171
+ return null;
172
+ }
173
+ /**
174
+ * The origin project to stamp on a memory written from cwd.
175
+ * Returns the project name, or '' for user-global (written at/under home or
176
+ * in a markerless directory) - injectable everywhere. Write sites must always
177
+ * persist this value; a NULL origin_project column is reserved for legacy
178
+ * pre-migration rows, which ambient context treats as deny (see plan
179
+ * docs/plans/2026-07-01-memory-scope-isolation.md "Origin model").
180
+ */
181
+ export function deriveOriginProject(cwd, opts) {
182
+ return resolveProjectIdentity(cwd, opts).name;
183
+ }
184
+ //# sourceMappingURL=project-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-identity.js","sourceRoot":"","sources":["../../src/project-identity.ts"],"names":[],"mappings":"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"}
@@ -31,19 +31,19 @@ export async function refineSemanticMemory(merged, sources, opts) {
31
31
  .slice(0, 8)
32
32
  .map((s, i) => `[source ${i + 1}] ${s.content.slice(0, 400)}`)
33
33
  .join('\n\n');
34
- const prompt = `You are refining a semantic memory in an agent's memory store. The rule-based consolidator merged several related episodic memories into one, but the output is clumsy. Produce a single coherent semantic memory that captures the underlying principle.
35
-
36
- Rules:
37
- - Output ONLY the refined content — no preamble, no quote marks, no "Here is...".
38
- - Keep it concise: one paragraph, no headers, no bullet lists unless the sources are inherently a list.
39
- - Preserve specific facts (names, numbers, paths, IDs) from the sources.
40
- - Generalize: state the pattern, not each instance.
41
- - Do NOT include the "[Consolidated from N ...]" marker.
42
-
43
- Current merged content:
44
- ${merged}
45
-
46
- Source memories (up to 8 shown):
34
+ const prompt = `You are refining a semantic memory in an agent's memory store. The rule-based consolidator merged several related episodic memories into one, but the output is clumsy. Produce a single coherent semantic memory that captures the underlying principle.
35
+
36
+ Rules:
37
+ - Output ONLY the refined content — no preamble, no quote marks, no "Here is...".
38
+ - Keep it concise: one paragraph, no headers, no bullet lists unless the sources are inherently a list.
39
+ - Preserve specific facts (names, numbers, paths, IDs) from the sources.
40
+ - Generalize: state the pattern, not each instance.
41
+ - Do NOT include the "[Consolidated from N ...]" marker.
42
+
43
+ Current merged content:
44
+ ${merged}
45
+
46
+ Source memories (up to 8 shown):
47
47
  ${sourceBlock}`;
48
48
  let res;
49
49
  try {
@@ -22,6 +22,7 @@
22
22
  * - merge: collapses near-duplicate episodics into semantics
23
23
  * - REPLAY: picks winners and rehearses them (this file)
24
24
  */
25
+ import { isOutcomeSlowAblated } from './ablation.js';
25
26
  const VALENCE_WEIGHT = {
26
27
  neutral: 1.0,
27
28
  positive: 1.3,
@@ -39,7 +40,9 @@ export function replayPriority(entry, now) {
39
40
  // negative-dominated memories floor at 0.1 (so they're still eligible, just
40
41
  // much less likely to be sampled than neutral peers). Clamp is required
41
42
  // because sampleForReplay depends on all weights being positive.
42
- const rewardSignal = Math.max(0.1, 1 + pos * 0.5 + (pos - neg) * 0.25);
43
+ const rewardSignal = isOutcomeSlowAblated()
44
+ ? 1.0 // EVAL-ONLY ablation (see ablation.ts): outcome-off also silences replay's reward bias
45
+ : Math.max(0.1, 1 + pos * 0.5 + (pos - neg) * 0.25);
43
46
  const valence = VALENCE_WEIGHT[entry.emotional_valence] ?? 1.0;
44
47
  // Under-rehearsed memories benefit most from replay.
45
48
  const underRehearsed = 1 / (1 + (entry.retrieval_count ?? 0));
@@ -1 +1 @@
1
- {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/replay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/replay.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,12 @@
3
3
  * Zero external dependencies when embeddings are not available.
4
4
  */
5
5
  import { calculateStrength } from './memory.js';
6
+ import { isOutcomeFastAblated, isRecallBoostAblated, evalNow } from './ablation.js';
6
7
  import { extractPathTags, pathOverlapScore } from './path-context.js';
7
8
  import { detectScope, scopeMatch } from './scope.js';
8
9
  import { cosineSimilarity, embeddingModelRequiresReindex, loadEmbeddingIndex, } from './embeddings.js';
9
10
  import { resolveEmbeddingProvider } from './embedding-provider.js';
10
- import { physicsScore as computePhysicsScores } from './physics.js';
11
+ import { physicsScore as computePhysicsScores, computeMass } from './physics.js';
11
12
  import { DEFAULT_PHYSICS_CONFIG } from './physics-config.js';
12
13
  import { loadPhysicsState } from './physics-state.js';
13
14
  import { openHippoDb, closeHippoDb } from './db.js';
@@ -182,7 +183,7 @@ function summaryFreshnessMultiplier(entry, now) {
182
183
  * embeddingWeight: weight for the cosine similarity component (0.0 to 1.0).
183
184
  */
184
185
  export async function hybridSearch(query, entries, options = {}) {
185
- const now = options.now ?? new Date();
186
+ const now = options.now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
186
187
  const budget = options.budget ?? 4000;
187
188
  const minResults = options.minResults ?? 1;
188
189
  const embeddingWeight = options.embeddingWeight ?? 0.6;
@@ -355,9 +356,10 @@ export async function hybridSearch(query, entries, options = {}) {
355
356
  compositeScore *= pathBoost;
356
357
  // Retrieval-time outcome personalization: nudge up/down from user feedback.
357
358
  // Distinct from reward-factor-via-strength (slow); this is immediate.
359
+ // EVAL-ONLY ablation (see ablation.ts): the fast outcome channel.
358
360
  const pos = entries[i].outcome_positive ?? 0;
359
361
  const neg = entries[i].outcome_negative ?? 0;
360
- const outcomeBoost = pos === 0 && neg === 0
362
+ const outcomeBoost = isOutcomeFastAblated() || (pos === 0 && neg === 0)
361
363
  ? 1.0
362
364
  : Math.max(0.85, Math.min(1.15, 1 + 0.15 * Math.tanh((pos - neg) / 2)));
363
365
  compositeScore *= outcomeBoost;
@@ -581,7 +583,7 @@ export function mmrRerank(scored, embeddingIndex, lambda, explain) {
581
583
  * without physics state.
582
584
  */
583
585
  export async function physicsSearch(query, entries, options = {}) {
584
- const now = options.now ?? new Date();
586
+ const now = options.now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
585
587
  const budget = options.budget ?? 4000;
586
588
  const minResults = options.minResults ?? 1;
587
589
  const config = options.physicsConfig ?? DEFAULT_PHYSICS_CONFIG;
@@ -640,7 +642,18 @@ export async function physicsSearch(query, entries, options = {}) {
640
642
  && particle.position.length === queryVector.length
641
643
  && particle.velocity.length === queryVector.length) {
642
644
  physicsEntries.push(entry);
643
- physicsParticles.push(particle);
645
+ // EVAL-ONLY ablation (see ablation.ts): persisted masses embed recall
646
+ // history TWICE - the outer retrieval-count multiplier AND the frozen
647
+ // strength inside it (computed at sleep time from clock-reset
648
+ // last_retrieved + the read-side boost). Stripping the outer multiplier
649
+ // alone is not enough (codex round-7 P2); under the flag, recompute the
650
+ // mass LIVE from the current entry under ablated strength rules
651
+ // (created-anchored decay, no boost - both applied inside
652
+ // calculateStrength/computeMass by the same flag). The frozen-at-sleep
653
+ // semantics is unrecoverable for the ablated arm by definition.
654
+ physicsParticles.push(isRecallBoostAblated()
655
+ ? { ...particle, mass: computeMass(calculateStrength(entry, now), entry.retrieval_count) }
656
+ : particle);
644
657
  }
645
658
  else {
646
659
  classicEntries.push(entry);
@@ -755,7 +768,7 @@ function mergeScorePools(poolA, poolB) {
755
768
  */
756
769
  export function search(query, entries, options = {}) {
757
770
  // Synchronous path: BM25 only (no async hybrid)
758
- const now = options.now ?? new Date();
771
+ const now = options.now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
759
772
  const budget = options.budget ?? 4000;
760
773
  const minResults = options.minResults ?? 1;
761
774
  // Bi-temporal filtering
@@ -879,8 +892,24 @@ export function search(query, entries, options = {}) {
879
892
  /**
880
893
  * Update retrieval metadata on entries that were returned by a search.
881
894
  * Returns the mutated copies (caller must persist to disk).
895
+ *
896
+ * EVAL-ONLY ablation (see ablation.ts): with HIPPO_ABLATE_RECALL_BOOST set,
897
+ * this returns the entries UNMUTATED - neutralizing all three strengthening
898
+ * sub-effects (clock reset, retrieval_count, half-life increment) at the
899
+ * single shared write site. The entries (not an empty array) must be
900
+ * returned because callers derive `last_retrieval_ids` from the return
901
+ * value, and a later `hippo outcome --good/--bad` targets those ids - an
902
+ * empty return would silently co-ablate the outcome channel in the
903
+ * strengthen-off arm (codex round-7 P2). PERSISTENCE is gated separately at
904
+ * each persisting caller (CLI recall, api context, MCP recall/context,
905
+ * consolidation replay): writeEntry on identical rows still refreshes
906
+ * updated_at, rewrites mirrors, and marks DAG parents dirty (codex round-6
907
+ * P2), so those write loops skip under the flag.
908
+ * The default `now` honors HIPPO_FAKE_NOW (simulated-time protocols).
882
909
  */
883
- export function markRetrieved(entries, now = new Date()) {
910
+ export function markRetrieved(entries, now = evalNow()) {
911
+ if (isRecallBoostAblated())
912
+ return entries;
884
913
  return entries.map((e) => {
885
914
  if (e.superseded_by)
886
915
  return e;