hippo-memory 0.38.0 → 0.40.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 (112) hide show
  1. package/README.md +9 -0
  2. package/dist/api.d.ts +29 -6
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +168 -42
  5. package/dist/api.js.map +1 -1
  6. package/dist/audit.d.ts +1 -1
  7. package/dist/audit.d.ts.map +1 -1
  8. package/dist/audit.js.map +1 -1
  9. package/dist/auth.d.ts.map +1 -1
  10. package/dist/auth.js +20 -4
  11. package/dist/auth.js.map +1 -1
  12. package/dist/cli.js +101 -6
  13. package/dist/cli.js.map +1 -1
  14. package/dist/connectors/slack/deletion.d.ts +10 -0
  15. package/dist/connectors/slack/deletion.d.ts.map +1 -1
  16. package/dist/connectors/slack/deletion.js +21 -10
  17. package/dist/connectors/slack/deletion.js.map +1 -1
  18. package/dist/connectors/slack/dlq.d.ts +59 -1
  19. package/dist/connectors/slack/dlq.d.ts.map +1 -1
  20. package/dist/connectors/slack/dlq.js +204 -6
  21. package/dist/connectors/slack/dlq.js.map +1 -1
  22. package/dist/connectors/slack/idempotency.d.ts +12 -0
  23. package/dist/connectors/slack/idempotency.d.ts.map +1 -1
  24. package/dist/connectors/slack/idempotency.js +16 -0
  25. package/dist/connectors/slack/idempotency.js.map +1 -1
  26. package/dist/connectors/slack/ingest.d.ts +7 -1
  27. package/dist/connectors/slack/ingest.d.ts.map +1 -1
  28. package/dist/connectors/slack/ingest.js +40 -6
  29. package/dist/connectors/slack/ingest.js.map +1 -1
  30. package/dist/connectors/slack/signature.d.ts +7 -0
  31. package/dist/connectors/slack/signature.d.ts.map +1 -1
  32. package/dist/connectors/slack/signature.js +16 -9
  33. package/dist/connectors/slack/signature.js.map +1 -1
  34. package/dist/connectors/slack/tenant-routing.d.ts +15 -7
  35. package/dist/connectors/slack/tenant-routing.d.ts.map +1 -1
  36. package/dist/connectors/slack/tenant-routing.js +28 -8
  37. package/dist/connectors/slack/tenant-routing.js.map +1 -1
  38. package/dist/correction-latency.d.ts +36 -0
  39. package/dist/correction-latency.d.ts.map +1 -0
  40. package/dist/correction-latency.js +74 -0
  41. package/dist/correction-latency.js.map +1 -0
  42. package/dist/db.d.ts.map +1 -1
  43. package/dist/db.js +88 -1
  44. package/dist/db.js.map +1 -1
  45. package/dist/mcp/server.d.ts +7 -0
  46. package/dist/mcp/server.d.ts.map +1 -1
  47. package/dist/mcp/server.js +73 -30
  48. package/dist/mcp/server.js.map +1 -1
  49. package/dist/provenance-coverage.d.ts +18 -0
  50. package/dist/provenance-coverage.d.ts.map +1 -0
  51. package/dist/provenance-coverage.js +23 -0
  52. package/dist/provenance-coverage.js.map +1 -0
  53. package/dist/raw-archive-mirror-cleanup.d.ts +20 -0
  54. package/dist/raw-archive-mirror-cleanup.d.ts.map +1 -0
  55. package/dist/raw-archive-mirror-cleanup.js +53 -0
  56. package/dist/raw-archive-mirror-cleanup.js.map +1 -0
  57. package/dist/raw-archive.d.ts +8 -0
  58. package/dist/raw-archive.d.ts.map +1 -1
  59. package/dist/raw-archive.js +21 -7
  60. package/dist/raw-archive.js.map +1 -1
  61. package/dist/server.d.ts.map +1 -1
  62. package/dist/server.js +142 -18
  63. package/dist/server.js.map +1 -1
  64. package/dist/shared.d.ts +1 -0
  65. package/dist/shared.d.ts.map +1 -1
  66. package/dist/shared.js +6 -1
  67. package/dist/shared.js.map +1 -1
  68. package/dist/src/api.js +168 -42
  69. package/dist/src/api.js.map +1 -1
  70. package/dist/src/audit.js.map +1 -1
  71. package/dist/src/auth.js +20 -4
  72. package/dist/src/auth.js.map +1 -1
  73. package/dist/src/cli.js +101 -6
  74. package/dist/src/cli.js.map +1 -1
  75. package/dist/src/connectors/slack/deletion.js +21 -10
  76. package/dist/src/connectors/slack/deletion.js.map +1 -1
  77. package/dist/src/connectors/slack/dlq.js +204 -6
  78. package/dist/src/connectors/slack/dlq.js.map +1 -1
  79. package/dist/src/connectors/slack/idempotency.js +16 -0
  80. package/dist/src/connectors/slack/idempotency.js.map +1 -1
  81. package/dist/src/connectors/slack/ingest.js +40 -6
  82. package/dist/src/connectors/slack/ingest.js.map +1 -1
  83. package/dist/src/connectors/slack/signature.js +16 -9
  84. package/dist/src/connectors/slack/signature.js.map +1 -1
  85. package/dist/src/connectors/slack/tenant-routing.js +28 -8
  86. package/dist/src/connectors/slack/tenant-routing.js.map +1 -1
  87. package/dist/src/correction-latency.js +74 -0
  88. package/dist/src/correction-latency.js.map +1 -0
  89. package/dist/src/db.js +88 -1
  90. package/dist/src/db.js.map +1 -1
  91. package/dist/src/mcp/server.js +73 -30
  92. package/dist/src/mcp/server.js.map +1 -1
  93. package/dist/src/provenance-coverage.js +23 -0
  94. package/dist/src/provenance-coverage.js.map +1 -0
  95. package/dist/src/raw-archive-mirror-cleanup.js +53 -0
  96. package/dist/src/raw-archive-mirror-cleanup.js.map +1 -0
  97. package/dist/src/raw-archive.js +21 -7
  98. package/dist/src/raw-archive.js.map +1 -1
  99. package/dist/src/server.js +142 -18
  100. package/dist/src/server.js.map +1 -1
  101. package/dist/src/shared.js +6 -1
  102. package/dist/src/shared.js.map +1 -1
  103. package/dist/src/store.js +50 -26
  104. package/dist/src/store.js.map +1 -1
  105. package/dist/store.d.ts +24 -0
  106. package/dist/store.d.ts.map +1 -1
  107. package/dist/store.js +50 -26
  108. package/dist/store.js.map +1 -1
  109. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  110. package/extensions/openclaw-plugin/package.json +1 -1
  111. package/openclaw.plugin.json +1 -1
  112. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../src/connectors/slack/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAarD,MAAM,UAAU,oBAAoB,CAAC,IAAgB;IACnD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IACxC,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAChH,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../src/connectors/slack/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAoBrD,SAAS,SAAS,CAChB,OAAe,EACf,SAAiB,EACjB,SAAiB,EACjB,MAAc;IAEd,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACzG,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAgB;IACnD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IACxC,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,cAAc,IAAI,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5F,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,13 +1,21 @@
1
1
  import type { DatabaseSyncLike } from '../../db.js';
2
2
  /**
3
- * Look up the tenant_id for a Slack team_id. Returns null when no row exists,
4
- * which signals "use the deployment's HIPPO_TENANT fallback". Multi-workspace
5
- * deployments populate slack_workspaces; single-workspace deployments leave
6
- * the table empty and rely on the env fallback.
3
+ * Look up the tenant_id for a Slack team_id.
7
4
  *
8
- * Review patch #6: dedicated routing seam — never inline this lookup at the
9
- * route handler so a future schema change (e.g. installation tokens) lands
10
- * in one place.
5
+ * Returns:
6
+ * - mapped tenant_id when slack_workspaces has a row for `teamId`
7
+ * - the deployment's HIPPO_TENANT fallback (or 'default') when slack_workspaces
8
+ * is empty (single-workspace install — env fallback is safe)
9
+ * - null when slack_workspaces is non-empty AND `teamId` is unknown
10
+ * (multi-workspace install — fail closed; an unknown team is not the
11
+ * deployment's tenant). Escape hatch: SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1
12
+ * restores the env fallback for emergency rollback only.
13
+ *
14
+ * v0.39 commit 3 (CRITICAL #5): the previous version returned null on miss
15
+ * unconditionally, and the route handler then fell back to HIPPO_TENANT —
16
+ * which silently routed events from a foreign workspace into the deployment
17
+ * tenant. The fail-closed contract lives here so every caller (route handler,
18
+ * CLI replay, future MCP) gets the same protection.
11
19
  */
12
20
  export declare function resolveTenantForTeam(db: DatabaseSyncLike, teamId: string): string | null;
13
21
  //# sourceMappingURL=tenant-routing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-routing.d.ts","sourceRoot":"","sources":["../../../src/connectors/slack/tenant-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKxF"}
1
+ {"version":3,"file":"tenant-routing.d.ts","sourceRoot":"","sources":["../../../src/connectors/slack/tenant-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBxF"}
@@ -1,17 +1,37 @@
1
1
  /**
2
- * Look up the tenant_id for a Slack team_id. Returns null when no row exists,
3
- * which signals "use the deployment's HIPPO_TENANT fallback". Multi-workspace
4
- * deployments populate slack_workspaces; single-workspace deployments leave
5
- * the table empty and rely on the env fallback.
2
+ * Look up the tenant_id for a Slack team_id.
6
3
  *
7
- * Review patch #6: dedicated routing seam — never inline this lookup at the
8
- * route handler so a future schema change (e.g. installation tokens) lands
9
- * in one place.
4
+ * Returns:
5
+ * - mapped tenant_id when slack_workspaces has a row for `teamId`
6
+ * - the deployment's HIPPO_TENANT fallback (or 'default') when slack_workspaces
7
+ * is empty (single-workspace install — env fallback is safe)
8
+ * - null when slack_workspaces is non-empty AND `teamId` is unknown
9
+ * (multi-workspace install — fail closed; an unknown team is not the
10
+ * deployment's tenant). Escape hatch: SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1
11
+ * restores the env fallback for emergency rollback only.
12
+ *
13
+ * v0.39 commit 3 (CRITICAL #5): the previous version returned null on miss
14
+ * unconditionally, and the route handler then fell back to HIPPO_TENANT —
15
+ * which silently routed events from a foreign workspace into the deployment
16
+ * tenant. The fail-closed contract lives here so every caller (route handler,
17
+ * CLI replay, future MCP) gets the same protection.
10
18
  */
11
19
  export function resolveTenantForTeam(db, teamId) {
12
20
  const row = db
13
21
  .prepare(`SELECT tenant_id FROM slack_workspaces WHERE team_id = ?`)
14
22
  .get(teamId);
15
- return row?.tenant_id ?? null;
23
+ if (row?.tenant_id)
24
+ return row.tenant_id;
25
+ const total = db
26
+ .prepare(`SELECT COUNT(*) AS c FROM slack_workspaces`)
27
+ .get().c;
28
+ if (Number(total) === 0) {
29
+ // Single-workspace install: env fallback is safe.
30
+ return process.env.HIPPO_TENANT?.trim() || 'default';
31
+ }
32
+ if (process.env.SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK === '1') {
33
+ return process.env.HIPPO_TENANT?.trim() || 'default';
34
+ }
35
+ return null; // fail closed
16
36
  }
17
37
  //# sourceMappingURL=tenant-routing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-routing.js","sourceRoot":"","sources":["../../../src/connectors/slack/tenant-routing.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAoB,EAAE,MAAc;IACvE,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAC,0DAA0D,CAAC;SACnE,GAAG,CAAC,MAAM,CAAuC,CAAC;IACrD,OAAO,GAAG,EAAE,SAAS,IAAI,IAAI,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"tenant-routing.js","sourceRoot":"","sources":["../../../src/connectors/slack/tenant-routing.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAoB,EAAE,MAAc;IACvE,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAC,0DAA0D,CAAC;SACnE,GAAG,CAAC,MAAM,CAAuC,CAAC;IACrD,IAAI,GAAG,EAAE,SAAS;QAAE,OAAO,GAAG,CAAC,SAAS,CAAC;IAEzC,MAAM,KAAK,GAAI,EAAE;SACd,OAAO,CAAC,4CAA4C,CAAC;SACrD,GAAG,EAA6B,CAAC,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,kDAAkD;QAClD,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,iCAAiC,KAAK,GAAG,EAAE,CAAC;QAC1D,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACvD,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,cAAc;AAC7B,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { MemoryEntry } from './memory.js';
2
+ export interface CorrectionPair {
3
+ oldId: string;
4
+ newId: string;
5
+ correctedAt: string;
6
+ observedAt: string;
7
+ latencyMs: number;
8
+ /** 'extraction' = new fact derived from a raw receipt; 'manual' = direct supersede call */
9
+ via: 'extraction' | 'manual';
10
+ }
11
+ export interface CorrectionLatencyReport {
12
+ count: number;
13
+ manualCount: number;
14
+ extractionCount: number;
15
+ /** Percentiles computed over `extraction` pairs only — manual pairs have no measurable lag */
16
+ p50Ms: number | null;
17
+ p95Ms: number | null;
18
+ maxMs: number | null;
19
+ pairs: CorrectionPair[];
20
+ }
21
+ /**
22
+ * Correction latency = wall-clock delta between when hippo first saw the
23
+ * change-of-truth and when the supersession actually landed.
24
+ *
25
+ * For each (old, new) chain via `old.superseded_by = new.id`:
26
+ * - `correctedAt` = `new.created` (always)
27
+ * - `observedAt` = source row's `created` if `new.extracted_from` is set,
28
+ * else `new.created` (no earlier observation possible)
29
+ *
30
+ * Pairs split into two cohorts:
31
+ * - `extraction` — derived from a raw receipt; latency is meaningful
32
+ * - `manual` — direct supersede call; latency is trivially 0 and
33
+ * excluded from percentiles to avoid masking real lag
34
+ */
35
+ export declare function buildCorrectionLatency(entries: MemoryEntry[]): CorrectionLatencyReport;
36
+ //# sourceMappingURL=correction-latency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correction-latency.d.ts","sourceRoot":"","sources":["../src/correction-latency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,GAAG,EAAE,YAAY,GAAG,QAAQ,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,8FAA8F;IAC9F,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAYD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,uBAAuB,CA8CtF"}
@@ -0,0 +1,74 @@
1
+ function percentile(sorted, q) {
2
+ if (sorted.length === 0)
3
+ return 0;
4
+ if (sorted.length === 1)
5
+ return sorted[0];
6
+ const idx = (sorted.length - 1) * q;
7
+ const lo = Math.floor(idx);
8
+ const hi = Math.ceil(idx);
9
+ if (lo === hi)
10
+ return sorted[lo];
11
+ return sorted[lo] + (sorted[hi] - sorted[lo]) * (idx - lo);
12
+ }
13
+ /**
14
+ * Correction latency = wall-clock delta between when hippo first saw the
15
+ * change-of-truth and when the supersession actually landed.
16
+ *
17
+ * For each (old, new) chain via `old.superseded_by = new.id`:
18
+ * - `correctedAt` = `new.created` (always)
19
+ * - `observedAt` = source row's `created` if `new.extracted_from` is set,
20
+ * else `new.created` (no earlier observation possible)
21
+ *
22
+ * Pairs split into two cohorts:
23
+ * - `extraction` — derived from a raw receipt; latency is meaningful
24
+ * - `manual` — direct supersede call; latency is trivially 0 and
25
+ * excluded from percentiles to avoid masking real lag
26
+ */
27
+ export function buildCorrectionLatency(entries) {
28
+ const byId = new Map();
29
+ for (const e of entries)
30
+ byId.set(e.id, e);
31
+ const pairs = [];
32
+ for (const oldEntry of entries) {
33
+ if (!oldEntry.superseded_by)
34
+ continue;
35
+ const newEntry = byId.get(oldEntry.superseded_by);
36
+ if (!newEntry)
37
+ continue;
38
+ const correctedAt = newEntry.created;
39
+ let observedAt = newEntry.created;
40
+ let via = 'manual';
41
+ if (newEntry.extracted_from) {
42
+ const source = byId.get(newEntry.extracted_from);
43
+ if (source) {
44
+ observedAt = source.created;
45
+ via = 'extraction';
46
+ }
47
+ }
48
+ const correctedMs = new Date(correctedAt).getTime();
49
+ const observedMs = new Date(observedAt).getTime();
50
+ if (!Number.isFinite(correctedMs) || !Number.isFinite(observedMs))
51
+ continue;
52
+ const latencyMs = Math.max(0, correctedMs - observedMs);
53
+ pairs.push({
54
+ oldId: oldEntry.id,
55
+ newId: newEntry.id,
56
+ correctedAt,
57
+ observedAt,
58
+ latencyMs,
59
+ via,
60
+ });
61
+ }
62
+ const extractionPairs = pairs.filter((p) => p.via === 'extraction');
63
+ const sorted = extractionPairs.map((p) => p.latencyMs).sort((a, b) => a - b);
64
+ return {
65
+ count: pairs.length,
66
+ manualCount: pairs.filter((p) => p.via === 'manual').length,
67
+ extractionCount: extractionPairs.length,
68
+ p50Ms: sorted.length === 0 ? null : percentile(sorted, 0.5),
69
+ p95Ms: sorted.length === 0 ? null : percentile(sorted, 0.95),
70
+ maxMs: sorted.length === 0 ? null : sorted[sorted.length - 1],
71
+ pairs,
72
+ };
73
+ }
74
+ //# sourceMappingURL=correction-latency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correction-latency.js","sourceRoot":"","sources":["../src/correction-latency.ts"],"names":[],"mappings":"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"}
package/dist/db.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG;QAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACxC,KAAK,IAAI,IAAI,CAAC;CACf;AAqgBD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAmB/D;AAkCD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,GAAG,MAAM,CAI7D;AAwDD,wBAAgB,YAAY,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAEvD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,MAAM,CAGhF;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAE5D;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,SAAK,GAAG,IAAI,CAS5E"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAQA,UAAU,iBAAiB;IACzB,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG;QAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACxC,KAAK,IAAI,IAAI,CAAC;CACf;AAylBD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CA2B/D;AAkCD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,GAAG,MAAM,CAI7D;AAwDD,wBAAgB,YAAY,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAEvD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,MAAM,CAGhF;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAE5D;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,SAAK,GAAG,IAAI,CAS5E"}
package/dist/db.js CHANGED
@@ -2,9 +2,10 @@ import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import { createRequire } from 'module';
4
4
  import { createPhysicsTable } from './physics-state.js';
5
+ import { cleanupArchivedMirrors } from './raw-archive-mirror-cleanup.js';
5
6
  const require = createRequire(import.meta.url);
6
7
  const { DatabaseSync } = require('node:sqlite');
7
- const CURRENT_SCHEMA_VERSION = 18;
8
+ const CURRENT_SCHEMA_VERSION = 21;
8
9
  const MIGRATIONS = [
9
10
  {
10
11
  version: 1,
@@ -500,6 +501,83 @@ const MIGRATIONS = [
500
501
  `);
501
502
  },
502
503
  },
504
+ {
505
+ version: 19,
506
+ up: (db) => {
507
+ // v0.39 commit 3 (Slack hardening): widen slack_dlq with bucketing,
508
+ // retry tracking, and the signature/timestamp pair that lets `hippo
509
+ // slack dlq replay` re-verify before re-running ingest. ALTER ADD
510
+ // COLUMN with DEFAULT is non-destructive — legacy rows take the
511
+ // default values. Idempotent via tableHasColumn().
512
+ if (!tableHasColumn(db, 'slack_dlq', 'team_id')) {
513
+ db.exec(`ALTER TABLE slack_dlq ADD COLUMN team_id TEXT`);
514
+ }
515
+ if (!tableHasColumn(db, 'slack_dlq', 'bucket')) {
516
+ db.exec(`ALTER TABLE slack_dlq ADD COLUMN bucket TEXT NOT NULL DEFAULT 'parse_error'`);
517
+ // SQLite ALTER TABLE cannot add CHECK; bucket value enforcement is app-level.
518
+ }
519
+ if (!tableHasColumn(db, 'slack_dlq', 'retry_count')) {
520
+ db.exec(`ALTER TABLE slack_dlq ADD COLUMN retry_count INTEGER NOT NULL DEFAULT 0`);
521
+ }
522
+ if (!tableHasColumn(db, 'slack_dlq', 'signature')) {
523
+ db.exec(`ALTER TABLE slack_dlq ADD COLUMN signature TEXT`);
524
+ }
525
+ if (!tableHasColumn(db, 'slack_dlq', 'slack_timestamp')) {
526
+ db.exec(`ALTER TABLE slack_dlq ADD COLUMN slack_timestamp TEXT`);
527
+ }
528
+ },
529
+ },
530
+ {
531
+ version: 20,
532
+ up: (db) => {
533
+ // v0.39 commit 4 (GDPR Path A backfill): redact every existing
534
+ // raw_archive.payload_json so historical archives match the new
535
+ // metadata-only contract from src/raw-archive.ts. Read each row, parse
536
+ // the existing JSON to extract tenant_id and kind (best effort), then
537
+ // UPDATE with the redacted shape. Rows with unparseable legacy JSON get
538
+ // redacted with tenant_id='unknown', kind='unknown'. The audit_log
539
+ // remains the compliance record.
540
+ const rows = db
541
+ .prepare(`SELECT id, archived_at, reason, payload_json FROM raw_archive`)
542
+ .all();
543
+ const update = db.prepare(`UPDATE raw_archive SET payload_json = ? WHERE id = ?`);
544
+ for (const row of rows) {
545
+ let tenant = 'unknown';
546
+ let kind = 'unknown';
547
+ try {
548
+ const parsed = JSON.parse(row.payload_json);
549
+ tenant = parsed.tenant_id ?? 'unknown';
550
+ kind = parsed.kind ?? 'unknown';
551
+ }
552
+ catch {
553
+ // Unparseable legacy payload — redact with unknowns.
554
+ }
555
+ const redacted = JSON.stringify({
556
+ redacted: true,
557
+ archived_at: row.archived_at,
558
+ tenant_id: tenant,
559
+ kind,
560
+ reason: row.reason,
561
+ migration: 'v20_redact',
562
+ });
563
+ update.run(redacted, row.id);
564
+ }
565
+ },
566
+ },
567
+ {
568
+ version: 21,
569
+ up: (db) => {
570
+ // v0.39 codex round 3: per-row mirror cleanup tracking. Replaces the
571
+ // global gdpr_v20_mirror_cleanup meta gate (which made the reaper
572
+ // one-shot and silently swallowed failed unlinks). With this column the
573
+ // reaper processes only rows WHERE mirror_cleaned_at IS NULL, sets the
574
+ // timestamp on success, and leaves it NULL on any unlink failure so the
575
+ // next openHippoDb retries automatically.
576
+ if (!tableHasColumn(db, 'raw_archive', 'mirror_cleaned_at')) {
577
+ db.exec(`ALTER TABLE raw_archive ADD COLUMN mirror_cleaned_at TEXT`);
578
+ }
579
+ },
580
+ },
503
581
  ];
504
582
  function tableHasColumn(db, tableName, columnName) {
505
583
  if (!/^[a-z_]+$/i.test(tableName))
@@ -523,6 +601,15 @@ export function openHippoDb(hippoRoot) {
523
601
  db.exec('PRAGMA wal_autocheckpoint = 100');
524
602
  db.exec('PRAGMA foreign_keys = ON');
525
603
  runMigrations(db);
604
+ // Path A backfill: delete any orphan markdown mirrors for already-archived
605
+ // raw_archive rows. Idempotent via per-row raw_archive.mirror_cleaned_at
606
+ // (v21). Wrapped in try/catch — a filesystem failure must not prevent DB open.
607
+ try {
608
+ cleanupArchivedMirrors(hippoRoot, db);
609
+ }
610
+ catch (cleanupErr) {
611
+ console.error('openHippoDb: cleanupArchivedMirrors failed (non-fatal):', cleanupErr);
612
+ }
526
613
  return db;
527
614
  }
528
615
  catch (error) {
package/dist/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,13 @@ export interface McpContext {
37
37
  hippoRoot: string;
38
38
  tenantId: string;
39
39
  actor: string;
40
+ /**
41
+ * Per-client key for state isolation under HTTP-MCP. For stdio: 'stdio-${pid}'
42
+ * (one process = one client). For HTTP-SSE / HTTP MCP: hash(bearer + remoteAddr)
43
+ * built by src/server.ts when constructing McpContext for the request.
44
+ * Optional for backwards compatibility; defaults to `${tenantId}:default`.
45
+ */
46
+ clientKey?: string;
40
47
  }
41
48
  /**
42
49
  * Transport-agnostic MCP dispatcher. Both the stdio loop (below) and the
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAyCH,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AAExC;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AA0XD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,UAAU,EACf,GAAG,CAAC,EAAE,UAAU,GACf,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA2C7B;AAyBD;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAmBrC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AA0CH,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AAExC;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoaD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,UAAU,EACf,GAAG,CAAC,EAAE,UAAU,GACf,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA2C7B;AAyBD;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAmBrC"}
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import * as fs from 'fs';
11
11
  import * as path from 'path';
12
- import { createMemory, computeSchemaFit, Layer, applyOutcome, calculateStrength, } from '../memory.js';
12
+ import { createMemory, Layer, calculateStrength, } from '../memory.js';
13
13
  import { hybridSearch, physicsSearch, markRetrieved } from '../search.js';
14
14
  import { loadAllEntries, writeEntry, readEntry, loadActiveTaskSnapshot, listMemoryConflicts, resolveConflict } from '../store.js';
15
15
  import { shareMemory, listPeers, getGlobalRoot } from '../shared.js';
@@ -19,6 +19,7 @@ import { fetchGitLog, extractLessons, deduplicateLesson, isGitRepo } from '../au
19
19
  import { loadConfig } from '../config.js';
20
20
  import { resolveConfidence } from '../memory.js';
21
21
  import { resolveTenantId } from '../tenant.js';
22
+ import { recall as apiRecall, remember as apiRemember, outcome as apiOutcome } from '../api.js';
22
23
  // ── Find hippo root ──
23
24
  function findHippoRoot() {
24
25
  // Walk up from cwd
@@ -174,7 +175,22 @@ const TOOLS = [
174
175
  },
175
176
  ];
176
177
  // ── Track last recalled IDs for outcome feedback ──
177
- let lastRecalledIds = [];
178
+ //
179
+ // Keyed per-client so two HTTP-MCP clients hitting the same tenant cannot
180
+ // poison each other's outcome feedback. The key is `ctx.clientKey` when the
181
+ // transport supplies one (HTTP-MCP via src/server.ts builds
182
+ // hash(bearer+remoteAddr)); stdio and any caller without a clientKey falls
183
+ // back to `'stdio-${pid}'` (one process = one client) or
184
+ // `${tenantId}:default` if a McpContext is constructed in tests without a
185
+ // pid-bound transport.
186
+ const lastRecalledIds = new Map();
187
+ function resolveClientKey(ctx) {
188
+ if (ctx?.clientKey)
189
+ return ctx.clientKey;
190
+ if (ctx?.tenantId)
191
+ return `stdio-${process.pid}:${ctx.tenantId}`;
192
+ return `stdio-${process.pid}:default`;
193
+ }
178
194
  // ── Tool execution ──
179
195
  async function executeTool(name, args, ctx) {
180
196
  // When a transport hands us a context (HTTP path), trust it: the HTTP
@@ -194,7 +210,25 @@ async function executeTool(name, args, ctx) {
194
210
  case 'hippo_recall': {
195
211
  const query = String(args.query || '');
196
212
  const budget = Number(args.budget) || config.defaultBudget;
197
- const entries = loadAllEntries(hippoRoot, tenantId);
213
+ // Route through api.ts so audit_log captures actor='mcp' uniformly with
214
+ // CLI/REST. api.ts.recall handles tenant-scoped BM25 candidate loading;
215
+ // we re-fetch full entries for ranking + the markRetrieved bookkeeping
216
+ // that the MCP path has always done.
217
+ const apiCtx = {
218
+ hippoRoot,
219
+ tenantId,
220
+ actor: 'mcp',
221
+ };
222
+ apiRecall(apiCtx, { query, limit: 50 });
223
+ // Existing physics/hybrid scorer continues to drive user-visible
224
+ // ordering and the strength bump on retrieval — unchanged shape for
225
+ // existing MCP HTTP clients. v0.39 Fix 5.6: apply the same default-deny
226
+ // rule as src/api.ts.recall — when the caller passes no scope, drop
227
+ // `slack:private:*` rows so an MCP client cannot exfiltrate
228
+ // private-channel content via a bare query. (loadAllEntries is a
229
+ // tenant-only loader; scope filtering lives at the call site.)
230
+ const allEntries = loadAllEntries(hippoRoot, tenantId);
231
+ const entries = allEntries.filter((e) => !(e.scope ?? '').startsWith('slack:private:'));
198
232
  const usePhysics = config.physics?.enabled !== false;
199
233
  const results = usePhysics
200
234
  ? await physicsSearch(query, entries, { budget, hippoRoot, physicsConfig: config.physics })
@@ -203,7 +237,7 @@ async function executeTool(name, args, ctx) {
203
237
  const retrieved = markRetrieved(results.map((r) => r.entry));
204
238
  for (const entry of retrieved)
205
239
  writeEntry(hippoRoot, entry);
206
- lastRecalledIds = retrieved.map((e) => e.id);
240
+ lastRecalledIds.set(resolveClientKey(ctx), retrieved.map((e) => e.id));
207
241
  return formatMemories(results, hippoRoot);
208
242
  }
209
243
  case 'hippo_remember': {
@@ -215,19 +249,20 @@ async function executeTool(name, args, ctx) {
215
249
  tags.push('error');
216
250
  if (args.tag)
217
251
  tags.push(String(args.tag));
218
- const existing = loadAllEntries(hippoRoot, tenantId);
219
- const schemaFit = computeSchemaFit(text, tags, existing);
220
- const entry = createMemory(text, {
221
- layer: Layer.Episodic,
222
- tags,
223
- pinned: Boolean(args.pin),
224
- source: 'mcp',
225
- confidence: 'verified',
226
- baseHalfLifeDays: config.defaultHalfLifeDays,
227
- schema_fit: schemaFit,
252
+ // Route through api.ts so audit_log captures actor='mcp' uniformly with
253
+ // CLI/REST. api.ts.remember writes the memory + audit row in one
254
+ // transaction-friendly path; we re-read the entry to surface the
255
+ // half-life used in the MCP human-readable response.
256
+ const apiCtx = {
257
+ hippoRoot,
228
258
  tenantId,
259
+ actor: 'mcp',
260
+ };
261
+ const result = apiRemember(apiCtx, {
262
+ content: text,
263
+ tags,
229
264
  });
230
- writeEntry(hippoRoot, entry);
265
+ const entry = readEntry(hippoRoot, result.id, tenantId);
231
266
  // Auto-sleep check
232
267
  if (config.autoSleep.enabled) {
233
268
  const allEntries = loadAllEntries(hippoRoot, tenantId);
@@ -239,22 +274,26 @@ async function executeTool(name, args, ctx) {
239
274
  consolidate(hippoRoot);
240
275
  }
241
276
  }
242
- return `Remembered [${entry.id}] (half-life: ${entry.half_life_days}d, tags: ${entry.tags.join(', ') || 'none'})`;
277
+ const halfLife = entry?.half_life_days ?? config.defaultHalfLifeDays;
278
+ const tagStr = entry?.tags.join(', ') || tags.join(', ') || 'none';
279
+ return `Remembered [${result.id}] (half-life: ${halfLife}d, tags: ${tagStr})`;
243
280
  }
244
281
  case 'hippo_outcome': {
245
282
  const good = Boolean(args.good);
246
- if (lastRecalledIds.length === 0)
283
+ const clientKey = resolveClientKey(ctx);
284
+ const ids = lastRecalledIds.get(clientKey) ?? [];
285
+ if (ids.length === 0)
247
286
  return 'No recent recalls to apply outcome to.';
248
- let count = 0;
249
- for (const id of lastRecalledIds) {
250
- const entry = readEntry(hippoRoot, id);
251
- if (entry) {
252
- const updated = applyOutcome(entry, good);
253
- writeEntry(hippoRoot, updated);
254
- count++;
255
- }
256
- }
257
- return `Applied ${good ? 'positive' : 'negative'} outcome to ${count} memories`;
287
+ // Route through src/api.ts so audit_log captures actor='mcp' and
288
+ // tenant scoping is enforced uniformly (same surface as recall/remember).
289
+ // outcome() also handles cross-tenant id skip silently.
290
+ const apiCtx = {
291
+ hippoRoot,
292
+ tenantId,
293
+ actor: 'mcp',
294
+ };
295
+ const { applied } = apiOutcome(apiCtx, ids, good);
296
+ return `Applied ${good ? 'positive' : 'negative'} outcome to ${applied} memories`;
258
297
  }
259
298
  case 'hippo_context': {
260
299
  const budget = Number(args.budget) || config.defaultContextBudget;
@@ -277,7 +316,7 @@ async function executeTool(name, args, ctx) {
277
316
  const retrieved = markRetrieved(results.map((r) => r.entry));
278
317
  for (const entry of retrieved)
279
318
  writeEntry(hippoRoot, entry);
280
- lastRecalledIds = retrieved.map((e) => e.id);
319
+ lastRecalledIds.set(resolveClientKey(ctx), retrieved.map((e) => e.id));
281
320
  const snapshot = loadActiveTaskSnapshot(hippoRoot);
282
321
  const snapshotText = snapshot
283
322
  ? [
@@ -371,7 +410,11 @@ async function executeTool(name, args, ctx) {
371
410
  if (!shareId)
372
411
  return 'Required: id (memory ID to share).';
373
412
  const force = Boolean(args.force);
374
- const shared = shareMemory(hippoRoot, shareId, { force });
413
+ // Pass tenantId so shareMemory's readEntry filters by tenant. Without
414
+ // this, a Bearer for tenant A could call hippo_share with tenant B's
415
+ // id and copy the row to the global store. The 'Memory not found'
416
+ // error matches the cross-tenant deny shape elsewhere in the code.
417
+ const shared = shareMemory(hippoRoot, shareId, { force, tenantId });
375
418
  if (!shared)
376
419
  return 'Transfer score too low. Use force=true to override.';
377
420
  return `Shared [${shared.id}] to global store. Source: ${shared.source}`;
@@ -404,7 +447,7 @@ export async function handleMcpRequest(req, ctx) {
404
447
  result: {
405
448
  protocolVersion: '2024-11-05',
406
449
  capabilities: { tools: {} },
407
- serverInfo: { name: 'hippo-memory', version: '0.38.0' },
450
+ serverInfo: { name: 'hippo-memory', version: '0.39.0' },
408
451
  },
409
452
  };
410
453
  case 'notifications/initialized':