hippo-memory 1.22.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 (164) hide show
  1. package/README.md +17 -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/capture.d.ts.map +1 -1
  16. package/dist/capture.js +3 -2
  17. package/dist/capture.js.map +1 -1
  18. package/dist/cli.d.ts.map +1 -1
  19. package/dist/cli.js +211 -40
  20. package/dist/cli.js.map +1 -1
  21. package/dist/config.d.ts +18 -0
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/config.js +3 -0
  24. package/dist/config.js.map +1 -1
  25. package/dist/connectors/github/backfill.js +4 -4
  26. package/dist/connectors/github/cli-impl.js +6 -6
  27. package/dist/connectors/github/dlq.js +14 -14
  28. package/dist/connectors/slack/backfill.js +1 -1
  29. package/dist/connectors/slack/dlq.js +10 -10
  30. package/dist/connectors/slack/workspaces.js +4 -4
  31. package/dist/consolidate.d.ts.map +1 -1
  32. package/dist/consolidate.js +27 -5
  33. package/dist/consolidate.js.map +1 -1
  34. package/dist/dag.js +6 -6
  35. package/dist/dashboard.js +7 -7
  36. package/dist/db.d.ts.map +1 -1
  37. package/dist/db.js +55 -4
  38. package/dist/db.js.map +1 -1
  39. package/dist/embedding-provider.d.ts +76 -0
  40. package/dist/embedding-provider.d.ts.map +1 -0
  41. package/dist/embedding-provider.js +301 -0
  42. package/dist/embedding-provider.js.map +1 -0
  43. package/dist/embeddings.d.ts +1 -0
  44. package/dist/embeddings.d.ts.map +1 -1
  45. package/dist/embeddings.js +112 -55
  46. package/dist/embeddings.js.map +1 -1
  47. package/dist/hooks.js +24 -24
  48. package/dist/importers.d.ts +28 -0
  49. package/dist/importers.d.ts.map +1 -1
  50. package/dist/importers.js +412 -1
  51. package/dist/importers.js.map +1 -1
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +1 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/mcp/server.d.ts.map +1 -1
  57. package/dist/mcp/server.js +44 -7
  58. package/dist/mcp/server.js.map +1 -1
  59. package/dist/memory.d.ts +9 -0
  60. package/dist/memory.d.ts.map +1 -1
  61. package/dist/memory.js +29 -6
  62. package/dist/memory.js.map +1 -1
  63. package/dist/physics-state.d.ts.map +1 -1
  64. package/dist/physics-state.js +4 -3
  65. package/dist/physics-state.js.map +1 -1
  66. package/dist/physics.d.ts.map +1 -1
  67. package/dist/physics.js +8 -1
  68. package/dist/physics.js.map +1 -1
  69. package/dist/predictions.js +67 -67
  70. package/dist/project-identity.d.ts +84 -0
  71. package/dist/project-identity.d.ts.map +1 -0
  72. package/dist/project-identity.js +184 -0
  73. package/dist/project-identity.js.map +1 -0
  74. package/dist/refine-llm.js +13 -13
  75. package/dist/replay.d.ts.map +1 -1
  76. package/dist/replay.js +4 -1
  77. package/dist/replay.js.map +1 -1
  78. package/dist/search.d.ts +14 -0
  79. package/dist/search.d.ts.map +1 -1
  80. package/dist/search.js +67 -20
  81. package/dist/search.js.map +1 -1
  82. package/dist/secret-detect.d.ts +33 -0
  83. package/dist/secret-detect.d.ts.map +1 -0
  84. package/dist/secret-detect.js +70 -0
  85. package/dist/secret-detect.js.map +1 -0
  86. package/dist/server.d.ts.map +1 -1
  87. package/dist/server.js +11 -0
  88. package/dist/server.js.map +1 -1
  89. package/dist/shared.d.ts +9 -1
  90. package/dist/shared.d.ts.map +1 -1
  91. package/dist/shared.js +67 -16
  92. package/dist/shared.js.map +1 -1
  93. package/dist/src/ablation.js +138 -0
  94. package/dist/src/ablation.js.map +1 -0
  95. package/dist/src/ambient.js +2 -1
  96. package/dist/src/ambient.js.map +1 -1
  97. package/dist/src/api.js +88 -11
  98. package/dist/src/api.js.map +1 -1
  99. package/dist/src/capture.js +3 -2
  100. package/dist/src/capture.js.map +1 -1
  101. package/dist/src/cli.js +211 -40
  102. package/dist/src/cli.js.map +1 -1
  103. package/dist/src/config.js +3 -0
  104. package/dist/src/config.js.map +1 -1
  105. package/dist/src/connectors/github/backfill.js +4 -4
  106. package/dist/src/connectors/github/cli-impl.js +6 -6
  107. package/dist/src/connectors/github/dlq.js +14 -14
  108. package/dist/src/connectors/slack/backfill.js +1 -1
  109. package/dist/src/connectors/slack/dlq.js +10 -10
  110. package/dist/src/connectors/slack/workspaces.js +4 -4
  111. package/dist/src/consolidate.js +27 -5
  112. package/dist/src/consolidate.js.map +1 -1
  113. package/dist/src/dag.js +6 -6
  114. package/dist/src/dashboard.js +7 -7
  115. package/dist/src/db.js +55 -4
  116. package/dist/src/db.js.map +1 -1
  117. package/dist/src/embedding-provider.js +301 -0
  118. package/dist/src/embedding-provider.js.map +1 -0
  119. package/dist/src/embeddings.js +112 -55
  120. package/dist/src/embeddings.js.map +1 -1
  121. package/dist/src/hooks.js +24 -24
  122. package/dist/src/importers.js +412 -1
  123. package/dist/src/importers.js.map +1 -1
  124. package/dist/src/index.js +1 -1
  125. package/dist/src/index.js.map +1 -1
  126. package/dist/src/mcp/server.js +44 -7
  127. package/dist/src/mcp/server.js.map +1 -1
  128. package/dist/src/memory.js +29 -6
  129. package/dist/src/memory.js.map +1 -1
  130. package/dist/src/physics-state.js +4 -3
  131. package/dist/src/physics-state.js.map +1 -1
  132. package/dist/src/physics.js +8 -1
  133. package/dist/src/physics.js.map +1 -1
  134. package/dist/src/predictions.js +67 -67
  135. package/dist/src/project-identity.js +184 -0
  136. package/dist/src/project-identity.js.map +1 -0
  137. package/dist/src/refine-llm.js +13 -13
  138. package/dist/src/replay.js +4 -1
  139. package/dist/src/replay.js.map +1 -1
  140. package/dist/src/search.js +67 -20
  141. package/dist/src/search.js.map +1 -1
  142. package/dist/src/secret-detect.js +70 -0
  143. package/dist/src/secret-detect.js.map +1 -0
  144. package/dist/src/server.js +11 -0
  145. package/dist/src/server.js.map +1 -1
  146. package/dist/src/shared.js +67 -16
  147. package/dist/src/shared.js.map +1 -1
  148. package/dist/src/store.js +66 -11
  149. package/dist/src/store.js.map +1 -1
  150. package/dist/src/version.js +1 -1
  151. package/dist/src/working-memory.js +19 -19
  152. package/dist/store.d.ts +15 -0
  153. package/dist/store.d.ts.map +1 -1
  154. package/dist/store.js +66 -11
  155. package/dist/store.js.map +1 -1
  156. package/dist/version.d.ts +1 -1
  157. package/dist/version.js +1 -1
  158. package/dist/working-memory.js +19 -19
  159. package/dist-ui/index.html +12 -12
  160. package/extensions/openclaw-plugin/index.ts +650 -650
  161. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  162. package/extensions/openclaw-plugin/package.json +1 -1
  163. package/openclaw.plugin.json +1 -1
  164. package/package.json +3 -1
package/dist/shared.js CHANGED
@@ -6,22 +6,20 @@
6
6
  */
7
7
  import * as fs from 'fs';
8
8
  import * as path from 'path';
9
- import * as os from 'os';
10
9
  import { generateId } from './memory.js';
11
10
  import { initStore, loadAllEntries, loadIndex, loadSearchEntries, writeEntry, readEntry, } from './store.js';
12
11
  import { search, hybridSearch } from './search.js';
12
+ import { evalNow } from './ablation.js';
13
+ import { deriveOriginProject, classifyOriginProject, resolveGlobalRootDir } from './project-identity.js';
14
+ import { detectSecret } from './secret-detect.js';
13
15
  /**
14
16
  * Returns the path to the global Hippo store.
15
17
  * Resolution order: $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo/
16
18
  */
17
19
  export function getGlobalRoot() {
18
- const hippoHome = process.env.HIPPO_HOME?.trim();
19
- if (hippoHome)
20
- return hippoHome;
21
- const xdgData = process.env.XDG_DATA_HOME?.trim();
22
- if (xdgData)
23
- return path.join(xdgData, 'hippo');
24
- return path.join(os.homedir(), '.hippo');
20
+ // Single source of truth lives in project-identity.ts (leaf) so db.ts
21
+ // migrations can resolve the same path without a shared.ts import cycle.
22
+ return resolveGlobalRootDir();
25
23
  }
26
24
  /**
27
25
  * Ensure the global store exists.
@@ -45,13 +43,23 @@ export function promoteToGlobal(localRoot, id, opts) {
45
43
  const entry = readEntry(localRoot, id, opts?.tenantId);
46
44
  if (!entry)
47
45
  throw new Error(`Memory not found: ${id}`);
46
+ // v39 S4 producer veto: promote is a producer path to the global store
47
+ // exactly like shareMemory - same hard rule (codex gating review P2).
48
+ const promoteSecret = detectSecret(entry);
49
+ if (promoteSecret.flagged) {
50
+ throw new Error(`Refusing to promote ${id} to the global store: content matches secret material (${promoteSecret.reason}). ` +
51
+ `Secrets stay in their owning project's store.`);
52
+ }
48
53
  initGlobal();
49
54
  const globalRoot = getGlobalRoot();
50
- // Mint a new ID for the global store
55
+ // Mint a new ID for the global store. origin_project rides along from the
56
+ // local entry's write-time stamp via the spread; back-stop it for pre-v39
57
+ // local rows so a promoted copy never lands NULL in the global store.
51
58
  const globalEntry = {
52
59
  ...entry,
53
60
  id: generateId('g'),
54
61
  source: `promoted:${localRoot}`,
62
+ origin_project: entry.origin_project ?? deriveOriginProject(path.dirname(path.resolve(localRoot))),
55
63
  };
56
64
  writeEntry(globalRoot, globalEntry, { actor: opts?.actor });
57
65
  return globalEntry;
@@ -62,7 +70,7 @@ export function promoteToGlobal(localRoot, id, opts) {
62
70
  * Returns results sorted by adjusted score, within combined token budget.
63
71
  */
64
72
  export function searchBoth(query, localRoot, globalRoot, options = {}) {
65
- const { budget = 4000, now = new Date(), minResults, tenantId } = options;
73
+ const { budget = 4000, now = evalNow(), minResults, tenantId } = options;
66
74
  const effectiveMin = minResults ?? 1;
67
75
  const localEntries = fs.existsSync(localRoot) ? loadSearchEntries(localRoot, query, undefined, tenantId) : [];
68
76
  const globalEntries = fs.existsSync(globalRoot) ? loadSearchEntries(globalRoot, query, undefined, tenantId) : [];
@@ -111,9 +119,24 @@ export function searchBoth(query, localRoot, globalRoot, options = {}) {
111
119
  * Async version of searchBoth that calls hybridSearch instead of search.
112
120
  */
113
121
  export async function searchBothHybrid(query, localRoot, globalRoot, options = {}) {
114
- const { budget = 4000, now = new Date(), embeddingWeight, explain, mmr, mmrLambda, localBump = 1.2, minResults, scope, includeSuperseded, asOf, tenantId, summaryDeboost, summaryFreshness } = options;
115
- const localEntries = fs.existsSync(localRoot) ? loadSearchEntries(localRoot, query, undefined, tenantId) : [];
116
- const globalEntries = fs.existsSync(globalRoot) ? loadSearchEntries(globalRoot, query, undefined, tenantId) : [];
122
+ const { budget = 4000, now = evalNow(), embeddingWeight, explain, mmr, mmrLambda, localBump = 1.2, minResults, scope, includeSuperseded, asOf, tenantId, summaryDeboost, summaryFreshness, entryFilter } = options;
123
+ // When an admission filter is active, lift the per-store candidate cap
124
+ // (default 200): excluded rows matching the query could otherwise fill the
125
+ // window before any admitted row is even loaded (codex gating round 6).
126
+ // Only ambient-context query mode sets entryFilter, and that path is
127
+ // interactive - never the per-turn pinned-only hook - so ranking the full
128
+ // match set is acceptable.
129
+ // 5000 = 25x the default 200-row window: large enough that exclusion
130
+ // crowding is a non-issue on real stores, bounded so a common query term
131
+ // on a 100k-row store cannot stall an interactive call by ranking every
132
+ // match (post-merge adversarial review, 2026-07-02).
133
+ const searchWindow = entryFilter ? 5000 : undefined;
134
+ let localEntries = fs.existsSync(localRoot) ? loadSearchEntries(localRoot, query, searchWindow, tenantId) : [];
135
+ let globalEntries = fs.existsSync(globalRoot) ? loadSearchEntries(globalRoot, query, searchWindow, tenantId) : [];
136
+ if (entryFilter) {
137
+ localEntries = localEntries.filter(entryFilter);
138
+ globalEntries = globalEntries.filter(entryFilter);
139
+ }
117
140
  if (localEntries.length === 0 && globalEntries.length === 0)
118
141
  return [];
119
142
  const localResults = await hybridSearch(query, localEntries, {
@@ -208,16 +231,29 @@ export function shareMemory(localRoot, id, options = {}) {
208
231
  const entry = readEntry(localRoot, id, options.tenantId);
209
232
  if (!entry)
210
233
  throw new Error(`Memory not found: ${id}`);
234
+ // v39 S4 producer veto: secrets never go to the global store, not even
235
+ // with --force. Explicit and loud - a silent null would read as "low
236
+ // transfer score" and invite retries.
237
+ const secret = detectSecret(entry);
238
+ if (secret.flagged) {
239
+ throw new Error(`Refusing to share ${id} to the global store: content matches secret material (${secret.reason}). ` +
240
+ `Secrets stay in their owning project's store.`);
241
+ }
211
242
  const score = transferScore(entry);
212
243
  if (score < 0.3 && !options.force)
213
244
  return null;
214
245
  initGlobal();
215
246
  const globalRoot = getGlobalRoot();
216
- const projectName = path.basename(path.resolve(localRoot, '..'));
247
+ // v39: canonical origin comes from the entry's own stamp (write-time,
248
+ // store-location-derived); the localRoot parent basename is only a
249
+ // fallback for pre-v39 rows and keeps the legacy source format intact.
250
+ const fallbackName = path.basename(path.resolve(localRoot, '..'));
251
+ const originName = entry.origin_project ?? deriveOriginProject(path.dirname(path.resolve(localRoot)));
217
252
  const globalEntry = {
218
253
  ...entry,
219
254
  id: generateId('g'),
220
- source: `shared:${projectName}:${new Date().toISOString()}`,
255
+ source: `shared:${originName === '' ? fallbackName : originName}:${new Date().toISOString()}`,
256
+ origin_project: originName,
221
257
  };
222
258
  writeEntry(globalRoot, globalEntry);
223
259
  return globalEntry;
@@ -294,6 +330,11 @@ export function autoShare(localRoot, options = {}) {
294
330
  // Build set of global content hashes to avoid duplicates
295
331
  const globalContentSet = new Set(globalEntries.map((e) => e.content.toLowerCase().trim().slice(0, 200)));
296
332
  const candidates = localEntries.filter((entry) => {
333
+ // v39 S4 producer veto: secret rows never auto-share, regardless of
334
+ // transfer score. (shareMemory would throw; filtering here keeps the
335
+ // sleep pipeline fail-safe.)
336
+ if (detectSecret(entry).flagged)
337
+ return false;
297
338
  const score = transferScore(entry);
298
339
  if (score < minScore)
299
340
  return false;
@@ -318,7 +359,7 @@ export function autoShare(localRoot, options = {}) {
318
359
  * Skips entries that already exist locally (by ID or by near-identical content).
319
360
  * Returns the count of newly copied entries.
320
361
  */
321
- export function syncGlobalToLocal(localRoot, globalRoot) {
362
+ export function syncGlobalToLocal(localRoot, globalRoot, opts = {}) {
322
363
  if (!fs.existsSync(globalRoot))
323
364
  return 0;
324
365
  // L9: host-wide read. syncGlobalToLocal copies the global union into a
@@ -326,11 +367,21 @@ export function syncGlobalToLocal(localRoot, globalRoot) {
326
367
  // the local-root context provides one.
327
368
  const globalEntries = loadAllEntries(globalRoot);
328
369
  const localIndex = loadIndex(localRoot);
370
+ // v39 (codex P1-4): syncing down must not re-import what ambient context
371
+ // excludes - other-project rows are skipped by default and secret rows
372
+ // are never copied. origin_project is preserved on the copy (writeEntry
373
+ // only stamps when the field is missing).
374
+ const currentName = deriveOriginProject(path.dirname(path.resolve(localRoot)));
329
375
  let count = 0;
330
376
  for (const entry of globalEntries) {
331
377
  // Skip if already present by ID
332
378
  if (localIndex.entries[entry.id])
333
379
  continue;
380
+ if (detectSecret(entry).flagged)
381
+ continue;
382
+ if (!opts.includeCrossProject &&
383
+ classifyOriginProject(entry.origin_project, currentName) === 'cross-project')
384
+ continue;
334
385
  writeEntry(localRoot, entry);
335
386
  count++;
336
387
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * EVAL-ONLY lifecycle ablation switches.
3
+ *
4
+ * These env flags exist for controlled experiments on hippo's memory-lifecycle
5
+ * mechanisms (the "lifecycle, ablated" paper protocol): each switch neutralizes
6
+ * exactly ONE mechanism so its causal contribution can be measured in isolation.
7
+ *
8
+ * They are NOT a production configuration surface:
9
+ * - no config-file equivalents, deliberately (config implies support);
10
+ * - undocumented in user-facing help;
11
+ * - semantics may change with the experiment design.
12
+ * Production behavior with all flags unset is byte-identical to before this
13
+ * module existed.
14
+ *
15
+ * Flags (set to '1' or 'true'):
16
+ * HIPPO_ABLATE_DECAY time-decay term := 1 in calculateStrength.
17
+ * HIPPO_ABLATE_RECALL_BOOST full recall-strengthening ablation:
18
+ * - markRetrieved returns entries UNMUTATED (no
19
+ * clock reset / count / half-life increment);
20
+ * ids stay available so `hippo outcome`
21
+ * attribution keeps working in this arm;
22
+ * - persisting callers (CLI recall, api context,
23
+ * MCP recall/context, consolidation replay)
24
+ * skip their writeEntry loops (identical-row
25
+ * writes still refresh updated_at / mirrors /
26
+ * DAG dirty flags);
27
+ * - the retrieval-count READ boost := 1;
28
+ * - decay anchors at `created` instead of
29
+ * `last_retrieved` (prior-run clock resets
30
+ * cannot leak in);
31
+ * - physics: computeMass ignores the count, and
32
+ * physicsSearch recomputes loaded masses LIVE
33
+ * under ablated strength rules (persisted
34
+ * masses embed recall history in their frozen
35
+ * strength component);
36
+ * - replay rehearsal is silenced entirely (it IS
37
+ * strengthening; use config replay.count=0 to
38
+ * separate replay in unflagged arms).
39
+ * CAVEAT: half_life increments persisted by
40
+ * prior unflagged runs are NOT reconstructed
41
+ * (consolidation legitimately writes half_life
42
+ * too) - ablation arms run on FRESH stores, as
43
+ * the experiment protocol mandates.
44
+ * HIPPO_ABLATE_OUTCOME both outcome channels := neutral
45
+ * (= _SLOW + _FAST together). The slow side also
46
+ * silences replay's outcome reward bias
47
+ * (replayPriority). NOT gated: the opt-in
48
+ * `recall --value-aware` rerank (an explicit CLI
49
+ * flag that also reads outcome counts) - ablated
50
+ * arms must not pass it.
51
+ * HIPPO_ABLATE_OUTCOME_SLOW rewardFactor := 1 (no half-life modulation).
52
+ * HIPPO_ABLATE_OUTCOME_FAST hybridSearch outcomeBoost := 1.
53
+ * HIPPO_FAKE_NOW timestamp injected as the default `now` for
54
+ * strength computation and retrieval stamping
55
+ * (simulated-time protocols). MUST be the exact
56
+ * Date.toISOString() form
57
+ * (YYYY-MM-DDTHH:mm:ss.sssZ); validated by
58
+ * round-trip, so junk, locale dates, non-UTC
59
+ * offsets, and rolled-over dates (2026-02-31)
60
+ * all fall back to the real clock.
61
+ *
62
+ * Formula notes (load-bearing for the experiments) - ablating decay has TWO
63
+ * intrinsic co-effects, because the unified formula routes other mechanisms
64
+ * THROUGH the decay term. Both are real properties of the architecture, not
65
+ * implementation accidents; experiment analysis must attribute accordingly
66
+ * (the decay-off arm is "decay + its dependents off", see prereg amendment A1):
67
+ * 1. Read-side strengthening flattens: raw = retrievalBoost * emotionalMult
68
+ * >= 1, and the [0,1] clamp caps it at 1.0 - the recall boost can only
69
+ * offset decay, never exceed baseline. (Write-side still runs.)
70
+ * 2. Outcome-slow goes inert: rewardFactor only acts by scaling the
71
+ * effective half-life INSIDE the decay exponent; with decay := 1 there
72
+ * is no exponent for it to modulate. Outcome-slow is decay-rate
73
+ * modulation BY DESIGN, so "no decay" necessarily means "no slow
74
+ * channel" (the fast channel in hybridSearch is unaffected).
75
+ *
76
+ * Env caching follows the house pattern (see getLossAversionRatio in
77
+ * memory.ts): read once per process, with a test-only reset helper. Tests
78
+ * that mutate these env vars MUST call _resetAblationCacheForTests() in BOTH
79
+ * beforeEach AND afterEach.
80
+ */
81
+ let _cache;
82
+ function isTruthy(value) {
83
+ return value === '1' || value === 'true';
84
+ }
85
+ function readFlags() {
86
+ if (_cache !== undefined)
87
+ return _cache;
88
+ const outcomeBoth = isTruthy(process.env.HIPPO_ABLATE_OUTCOME);
89
+ let fakeNowMs = null;
90
+ const rawNow = process.env.HIPPO_FAKE_NOW;
91
+ if (rawNow !== undefined && rawNow !== '') {
92
+ // STRICT canonical form only: exactly what Date.prototype.toISOString
93
+ // emits (YYYY-MM-DDTHH:mm:ss.sssZ), verified by ROUND-TRIP equality.
94
+ // Two codex P2s drove this: (1) Date.parse accepts junk like '1' or
95
+ // locale-dependent '06/11/2026'; (2) a regex alone still admits
96
+ // rolled-over dates ('2026-02-31T...Z' silently becomes March 3). A
97
+ // value that does not round-trip byte-identical falls back to the real
98
+ // clock, exactly as documented.
99
+ const parsed = Date.parse(rawNow);
100
+ if (Number.isFinite(parsed) && new Date(parsed).toISOString() === rawNow) {
101
+ fakeNowMs = parsed;
102
+ }
103
+ }
104
+ _cache = {
105
+ decay: isTruthy(process.env.HIPPO_ABLATE_DECAY),
106
+ recallBoost: isTruthy(process.env.HIPPO_ABLATE_RECALL_BOOST),
107
+ outcomeSlow: outcomeBoth || isTruthy(process.env.HIPPO_ABLATE_OUTCOME_SLOW),
108
+ outcomeFast: outcomeBoth || isTruthy(process.env.HIPPO_ABLATE_OUTCOME_FAST),
109
+ fakeNowMs,
110
+ };
111
+ return _cache;
112
+ }
113
+ export function isDecayAblated() {
114
+ return readFlags().decay;
115
+ }
116
+ export function isRecallBoostAblated() {
117
+ return readFlags().recallBoost;
118
+ }
119
+ export function isOutcomeSlowAblated() {
120
+ return readFlags().outcomeSlow;
121
+ }
122
+ export function isOutcomeFastAblated() {
123
+ return readFlags().outcomeFast;
124
+ }
125
+ /**
126
+ * The default `now` for lifecycle computations: HIPPO_FAKE_NOW when set and
127
+ * parseable, else the real clock. Callers that already take an explicit `now`
128
+ * parameter are unaffected (explicit always wins).
129
+ */
130
+ export function evalNow() {
131
+ const ms = readFlags().fakeNowMs;
132
+ return ms === null ? new Date() : new Date(ms);
133
+ }
134
+ /** Test-only. See module JSDoc: call in BOTH beforeEach AND afterEach. */
135
+ export function _resetAblationCacheForTests() {
136
+ _cache = undefined;
137
+ }
138
+ //# sourceMappingURL=ablation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ablation.js","sourceRoot":"","sources":["../../src/ablation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AAWH,IAAI,MAAiC,CAAC;AAEtC,SAAS,QAAQ,CAAC,KAAyB;IACzC,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC/D,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1C,sEAAsE;QACtE,qEAAqE;QACrE,oEAAoE;QACpE,gEAAgE;QAChE,oEAAoE;QACpE,uEAAuE;QACvE,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACzE,SAAS,GAAG,MAAM,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,GAAG;QACP,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC/C,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;QAC5D,WAAW,EAAE,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;QAC3E,WAAW,EAAE,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;QAC3E,SAAS;KACV,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,SAAS,EAAE,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,SAAS,EAAE,CAAC,WAAW,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,SAAS,EAAE,CAAC,WAAW,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,SAAS,EAAE,CAAC,WAAW,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC,SAAS,CAAC;IACjC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,2BAA2B;IACzC,MAAM,GAAG,SAAS,CAAC;AACrB,CAAC"}
@@ -6,6 +6,7 @@
6
6
  * representation that tells the agent "where it is" in knowledge-space
7
7
  * without retrieving specific memories.
8
8
  */
9
+ import { evalNow } from './ablation.js';
9
10
  import { Layer } from './memory.js';
10
11
  import { calculateStrength } from './memory.js';
11
12
  export function computeAmbientState(entries, now) {
@@ -18,7 +19,7 @@ export function computeAmbientState(entries, now) {
18
19
  extractionCoverage: 0, dagDepth: 0, totalMemories: 0,
19
20
  };
20
21
  }
21
- const currentTime = now ?? new Date();
22
+ const currentTime = now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only)
22
23
  const tagCounts = new Map();
23
24
  let strengthSum = 0;
24
25
  let freshCount = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"ambient.js","sourceRoot":"","sources":["../../src/ambient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ambient.js","sourceRoot":"","sources":["../../src/ambient.ts"],"names":[],"mappings":"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"}
package/dist/src/api.js CHANGED
@@ -8,10 +8,11 @@
8
8
  */
9
9
  import { createHash } from 'node:crypto';
10
10
  import { openHippoDb, closeHippoDb } from './db.js';
11
- import { writeEntry, writeEntryDbOnly, writeEntryMirrors, readEntry, deleteEntry, loadRecallSearchEntries, loadEntriesByIds, loadChildrenOf, loadFreshRawMemories, loadSessionRawMemories, countSessionRawMemories, DEFAULT_SEARCH_CANDIDATE_LIMIT, RECALL_DEFAULT_DENY_SCOPES, removeEntryMirrors, loadActiveTaskSnapshot, loadLatestHandoff, listSessionEvents, loadIndex, saveIndex, loadAllEntries, updateStats, isInitialized, markSummaryDirtyInTx, } from './store.js';
11
+ import { writeEntry, writeEntryDbOnly, stampOriginProject, writeEntryMirrors, readEntry, deleteEntry, loadRecallSearchEntries, loadEntriesByIds, loadChildrenOf, loadFreshRawMemories, loadSessionRawMemories, countSessionRawMemories, DEFAULT_SEARCH_CANDIDATE_LIMIT, RECALL_DEFAULT_DENY_SCOPES, removeEntryMirrors, loadActiveTaskSnapshot, loadLatestHandoff, listSessionEvents, loadIndex, saveIndex, loadAllEntries, updateStats, isInitialized, markSummaryDirtyInTx, } from './store.js';
12
12
  import { createMemory, applyOutcome, calculateStrength, Layer, } from './memory.js';
13
13
  import { appendAuditEvent, queryAuditEvents, auditMemories, } from './audit.js';
14
14
  import { promoteToGlobal, getGlobalRoot, autoShare, searchBothHybrid } from './shared.js';
15
+ import { evalNow, isRecallBoostAblated } from './ablation.js';
15
16
  import { archiveRawMemory } from './raw-archive.js';
16
17
  import { createApiKey, listApiKeys, revokeApiKey, } from './auth.js';
17
18
  import { applyGoalStackBoost } from './goals.js';
@@ -19,6 +20,8 @@ import { markRetrieved, estimateTokens, hybridSearch, physicsSearch } from './se
19
20
  import { scopeMatch } from './scope.js';
20
21
  import { consolidate } from './consolidate.js';
21
22
  import { loadConfig } from './config.js';
23
+ import { resolveProjectIdentity, classifyOriginProject } from './project-identity.js';
24
+ import { detectSecret } from './secret-detect.js';
22
25
  import { deduplicateStore } from './dedupe.js';
23
26
  import { computeAmbientState } from './ambient.js';
24
27
  import { loadPendingExtractionTenants, markPendingProcessedUpTo } from './graph.js';
@@ -111,6 +114,46 @@ export function passesScopeFilterForRecall(scope, requested) {
111
114
  export function isPrivateScope(scope) {
112
115
  return typeof scope === 'string' && PRIVATE_SCOPE_RE.test(scope);
113
116
  }
117
+ // v39: classifyOriginProject lives in project-identity.ts (leaf) so
118
+ // shared.ts can use it without an api.ts import cycle. Re-exported here for
119
+ // callers that already import the api surface.
120
+ export { classifyOriginProject } from './project-identity.js';
121
+ /**
122
+ * v39: the single ambient-injection admission policy, shared by getContext
123
+ * and the CLI-side ambient-state summary so the two cannot drift.
124
+ *
125
+ * - S4 secret veto is UNCONDITIONAL: neither crossProject nor
126
+ * contextProjectIsolation:false re-includes secrets. A flagged row only
127
+ * injects inside its owning project; flagged rows with no project origin
128
+ * (''/null) never ambient-inject at all. Explicit recall is unaffected -
129
+ * recalling a secret is a deliberate act.
130
+ * - S2 envelope parity: private scopes + quarantine buckets never inject.
131
+ * - S3 origin partition: other-project rows are excluded unless
132
+ * `includeCrossProject`.
133
+ */
134
+ export function ambientAdmitEntry(e, currentProjectName, includeCrossProject) {
135
+ if (!ambientSecretAdmit(e, currentProjectName))
136
+ return false;
137
+ if (!passesScopeFilterForRecall(e.scope ?? null, undefined))
138
+ return false;
139
+ if (includeCrossProject)
140
+ return true;
141
+ return classifyOriginProject(e.origin_project, currentProjectName) !== 'cross-project';
142
+ }
143
+ /**
144
+ * v39 S4: the secret half of the ambient policy on its own, for surfaces
145
+ * with their own scope semantics (MCP hippo_context's explicit-scope
146
+ * exact-match). A flagged row is only admitted inside its owning project;
147
+ * flagged rows with no project origin never ambient-inject.
148
+ */
149
+ export function ambientSecretAdmit(e, currentProjectName) {
150
+ if (!detectSecret(e).flagged)
151
+ return true;
152
+ const origin = e.origin_project;
153
+ if (origin === undefined || origin === null || origin === '')
154
+ return false;
155
+ return origin === currentProjectName;
156
+ }
114
157
  export function remember(ctx, opts) {
115
158
  const entry = createMemory(opts.content, {
116
159
  kind: opts.kind ?? 'distilled',
@@ -1072,7 +1115,7 @@ export function supersede(ctx, oldId, newContent) {
1072
1115
  // 2. Write new memory inside same tx via writeEntryDbOnly (DB-only
1073
1116
  // path). This emits its OWN 'remember' audit row for the new
1074
1117
  // memory inside the SAVEPOINT — atomic with the row INSERT.
1075
- writeEntryDbOnly(db, newEntry, { actor: ctx.actor.subject });
1118
+ writeEntryDbOnly(db, stampOriginProject(ctx.hippoRoot, newEntry), { actor: ctx.actor.subject });
1076
1119
  // 3. User-facing 'supersede' audit row inside the same tx so the
1077
1120
  // chain pointer + audit trail commit atomically.
1078
1121
  appendAuditEvent(db, {
@@ -1332,6 +1375,19 @@ export async function getContext(ctx, opts = {}) {
1332
1375
  // Filter superseded — context never includes superseded rows.
1333
1376
  localEntries = localEntries.filter((e) => !e.superseded_by);
1334
1377
  globalEntries = globalEntries.filter((e) => !e.superseded_by);
1378
+ // v39 memory scope isolation (docs/plans/2026-07-01-memory-scope-isolation.md).
1379
+ // S2: envelope-filter parity with api.recall for AMBIENT context - private
1380
+ // scopes and quarantine buckets never inject. `requested` is deliberately
1381
+ // undefined: opts.scope is the scope-TAG boost input here, not an
1382
+ // envelope-scope request (api.recall's exact-match semantics don't apply).
1383
+ // S3: origin partition - other-project memories are excluded unless the
1384
+ // caller explicitly asks for them (crossProject) or isolation is disabled.
1385
+ const isolationEnabled = loadConfig(ctx.hippoRoot).contextProjectIsolation !== false;
1386
+ const currentProjectName = opts.currentProject ?? resolveProjectIdentity(process.cwd()).name;
1387
+ const includeCrossProject = opts.crossProject === true || !isolationEnabled;
1388
+ const ambientAdmit = (e) => ambientAdmitEntry(e, currentProjectName, includeCrossProject);
1389
+ localEntries = localEntries.filter(ambientAdmit);
1390
+ globalEntries = globalEntries.filter(ambientAdmit);
1335
1391
  const activeSnapshot = hasLocal
1336
1392
  ? loadActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId)
1337
1393
  : null;
@@ -1361,7 +1417,7 @@ export async function getContext(ctx, opts = {}) {
1361
1417
  }
1362
1418
  // Effective budget: explicit opts.budget wins over config.
1363
1419
  const effBudget = opts.budget !== undefined ? budget : pinnedCfg.pinnedInject.budget;
1364
- const nowP = new Date();
1420
+ const nowP = evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
1365
1421
  const selectedIds = new Set();
1366
1422
  let usedP = 0;
1367
1423
  if (includeRecent > 0) {
@@ -1425,7 +1481,7 @@ export async function getContext(ctx, opts = {}) {
1425
1481
  }
1426
1482
  else if (query === '*') {
1427
1483
  // No query: return strongest memories by strength, up to budget.
1428
- const now = new Date();
1484
+ const now = evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
1429
1485
  const localRanked = localEntries
1430
1486
  .map((e) => ({
1431
1487
  entry: e,
@@ -1456,10 +1512,18 @@ export async function getContext(ctx, opts = {}) {
1456
1512
  // Real query: hybrid search (global + local) or physics+hybrid (local only).
1457
1513
  let results;
1458
1514
  if (hasGlobal) {
1515
+ // searchBothHybrid loads from the store roots itself, so the ambient
1516
+ // filter above never saw its candidates. Admission runs INSIDE the
1517
+ // search via the opt-in entryFilter, BEFORE ranking, cross-store
1518
+ // content-dedupe, and budgeting - a post-filter instead would let an
1519
+ // excluded row saturate the budget (codex rounds 1+3) or shadow its
1520
+ // admitted duplicate in the dedupe pass (codex round 4). Recall paths
1521
+ // never set entryFilter, so their behavior is unchanged.
1459
1522
  const merged = await searchBothHybrid(query, ctx.hippoRoot, globalRoot, {
1460
1523
  budget,
1461
1524
  scope: activeScope,
1462
1525
  tenantId: ctx.tenantId,
1526
+ entryFilter: ambientAdmit,
1463
1527
  });
1464
1528
  const localIndex = loadIndex(ctx.hippoRoot);
1465
1529
  results = merged.map((r) => ({
@@ -1534,6 +1598,13 @@ export async function getContext(ctx, opts = {}) {
1534
1598
  selectedItems = selectedItems.slice(0, limit);
1535
1599
  totalTokens = selectedItems.reduce((sum, r) => sum + r.tokens, 0);
1536
1600
  }
1601
+ // v39: annotate every returned entry with its origin and how it relates to
1602
+ // the active project, so renderers can demarcate cross-project inclusions.
1603
+ selectedItems = selectedItems.map((r) => ({
1604
+ ...r,
1605
+ origin: r.entry.origin_project ?? null,
1606
+ category: classifyOriginProject(r.entry.origin_project, currentProjectName),
1607
+ }));
1537
1608
  if (selectedItems.length === 0 &&
1538
1609
  !activeSnapshot &&
1539
1610
  !sessionHandoff &&
@@ -1547,13 +1618,19 @@ export async function getContext(ctx, opts = {}) {
1547
1618
  const toUpdate = selectedItems.map((s) => s.entry);
1548
1619
  const updatedEntries = markRetrieved(toUpdate);
1549
1620
  const localIndex = loadIndex(ctx.hippoRoot);
1550
- for (const u of updatedEntries) {
1551
- const targetRoot = localIndex.entries[u.id]
1552
- ? ctx.hippoRoot
1553
- : hasGlobal
1554
- ? globalRoot
1555
- : ctx.hippoRoot;
1556
- writeEntry(targetRoot, u);
1621
+ // EVAL-ONLY ablation (see ablation.ts): under the recall flag,
1622
+ // markRetrieved returns unmutated entries (ids preserved for outcome
1623
+ // attribution) and persistence is skipped (identical-row writes still
1624
+ // refresh updated_at / mirrors / DAG dirty flags).
1625
+ if (!isRecallBoostAblated()) {
1626
+ for (const u of updatedEntries) {
1627
+ const targetRoot = localIndex.entries[u.id]
1628
+ ? ctx.hippoRoot
1629
+ : hasGlobal
1630
+ ? globalRoot
1631
+ : ctx.hippoRoot;
1632
+ writeEntry(targetRoot, u);
1633
+ }
1557
1634
  }
1558
1635
  localIndex.last_retrieval_ids = updatedEntries.map((u) => u.id);
1559
1636
  saveIndex(ctx.hippoRoot, localIndex);