@remnic/core 9.6.30 → 9.6.31

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 (74) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -0
  2. package/dist/access-boundary.d.ts +1 -0
  3. package/dist/access-cli.js +9 -9
  4. package/dist/access-http.d.ts +1 -0
  5. package/dist/access-identity-continuity-surface.d.ts +1 -0
  6. package/dist/access-lcm-surface.d.ts +1 -0
  7. package/dist/access-mcp.d.ts +1 -0
  8. package/dist/access-observe-write-surface.d.ts +1 -0
  9. package/dist/access-operations.d.ts +1 -0
  10. package/dist/access-recall-surface.d.ts +1 -0
  11. package/dist/access-service.d.ts +1 -0
  12. package/dist/access-surface-catalog.d.ts +1 -0
  13. package/dist/bootstrap.d.ts +1 -0
  14. package/dist/causal-behavior.d.ts +1 -0
  15. package/dist/{chunk-XGSOXFD4.js → chunk-6TCXIRP5.js} +2 -2
  16. package/dist/{chunk-7O2JL5RY.js → chunk-DEOYTFA6.js} +2 -2
  17. package/dist/{chunk-R26WO46Z.js → chunk-DGFU5MSX.js} +16 -1
  18. package/dist/chunk-DGFU5MSX.js.map +1 -0
  19. package/dist/{chunk-BFU7H32D.js → chunk-OH7QLI6W.js} +2 -2
  20. package/dist/{chunk-IRMLYBMU.js → chunk-T67LUYCR.js} +2 -2
  21. package/dist/{chunk-77UPM7P3.js → chunk-TVIVY7KU.js} +160 -61
  22. package/dist/chunk-TVIVY7KU.js.map +1 -0
  23. package/dist/{chunk-KCYE2MZM.js → chunk-UXPUUL3G.js} +29 -8
  24. package/dist/chunk-UXPUUL3G.js.map +1 -0
  25. package/dist/{chunk-3VSTTB74.js → chunk-WSOEYOHN.js} +7 -7
  26. package/dist/{chunk-5AJIDEFT.js → chunk-XFTPUXCE.js} +11 -7
  27. package/dist/chunk-XFTPUXCE.js.map +1 -0
  28. package/dist/cli.d.ts +1 -0
  29. package/dist/compounding/preference-consolidator.d.ts +1 -0
  30. package/dist/event-order-recall.d.ts +1 -0
  31. package/dist/event-order-recall.js +2 -2
  32. package/dist/evidence-pack.d.ts +16 -1
  33. package/dist/evidence-pack.js +1 -1
  34. package/dist/explicit-capture.d.ts +1 -0
  35. package/dist/explicit-cue-recall.d.ts +16 -1
  36. package/dist/explicit-cue-recall.js +2 -2
  37. package/dist/focused-list-recall.d.ts +1 -0
  38. package/dist/focused-list-recall.js +2 -2
  39. package/dist/index.d.ts +3 -2
  40. package/dist/index.js +9 -9
  41. package/dist/lcm/engine.d.ts +3 -0
  42. package/dist/lcm/engine.js +2 -2
  43. package/dist/lcm/index.d.ts +1 -1
  44. package/dist/lcm/index.js +5 -3
  45. package/dist/lcm/recall.d.ts +15 -1
  46. package/dist/lcm/recall.js +5 -3
  47. package/dist/lcm/tools.d.ts +1 -0
  48. package/dist/mcp-memory-inspector-app.d.ts +1 -0
  49. package/dist/orchestrator.d.ts +1 -0
  50. package/dist/orchestrator.js +9 -9
  51. package/dist/response-guidance-recall.d.ts +1 -0
  52. package/dist/response-guidance-recall.js +2 -2
  53. package/dist/targeted-fact-recall.d.ts +1 -0
  54. package/dist/targeted-fact-recall.js +2 -2
  55. package/package.json +2 -2
  56. package/src/evidence-pack.test.ts +66 -1
  57. package/src/evidence-pack.ts +39 -0
  58. package/src/explicit-cue-recall.ts +224 -67
  59. package/src/index.ts +3 -0
  60. package/src/lcm/engine.ts +17 -5
  61. package/src/lcm/index.ts +6 -1
  62. package/src/lcm/recall.ts +48 -5
  63. package/src/lcm-engine.test.ts +46 -0
  64. package/src/lcm-recall.test.ts +48 -1
  65. package/src/recall-trace-receipts.test.ts +380 -0
  66. package/dist/chunk-5AJIDEFT.js.map +0 -1
  67. package/dist/chunk-77UPM7P3.js.map +0 -1
  68. package/dist/chunk-KCYE2MZM.js.map +0 -1
  69. package/dist/chunk-R26WO46Z.js.map +0 -1
  70. /package/dist/{chunk-XGSOXFD4.js.map → chunk-6TCXIRP5.js.map} +0 -0
  71. /package/dist/{chunk-7O2JL5RY.js.map → chunk-DEOYTFA6.js.map} +0 -0
  72. /package/dist/{chunk-BFU7H32D.js.map → chunk-OH7QLI6W.js.map} +0 -0
  73. /package/dist/{chunk-IRMLYBMU.js.map → chunk-T67LUYCR.js.map} +0 -0
  74. /package/dist/{chunk-3VSTTB74.js.map → chunk-WSOEYOHN.js.map} +0 -0
@@ -72,6 +72,7 @@ import './user-model.js';
72
72
  import './lcm/archive.js';
73
73
  import './lcm/summarizer.js';
74
74
  import './lcm/dag.js';
75
+ import './lcm/recall.js';
75
76
  import './lcm/queue.js';
76
77
  import './connectors/codex-materialize.js';
77
78
  import './logger.js';
@@ -43,7 +43,7 @@ import {
43
43
  throwIfRecallAborted,
44
44
  tokenizeRecallQuery,
45
45
  utcDateKeysForLocalDay
46
- } from "./chunk-3VSTTB74.js";
46
+ } from "./chunk-WSOEYOHN.js";
47
47
  import "./chunk-J3XHPFEU.js";
48
48
  import {
49
49
  formatCompressionGuidelinesForRecall
@@ -54,9 +54,9 @@ import "./chunk-ILNPU5W5.js";
54
54
  import "./chunk-7HYPN2GC.js";
55
55
  import "./chunk-666A3MOW.js";
56
56
  import "./chunk-VDC6RZI4.js";
57
- import "./chunk-5AJIDEFT.js";
57
+ import "./chunk-XFTPUXCE.js";
58
58
  import "./chunk-TPDBFYEG.js";
59
- import "./chunk-KCYE2MZM.js";
59
+ import "./chunk-UXPUUL3G.js";
60
60
  import "./chunk-7N2RUBAP.js";
61
61
  import "./chunk-MTR7BZQN.js";
62
62
  import "./chunk-UWK5OXUJ.js";
@@ -78,7 +78,7 @@ import "./chunk-4OKLXWDZ.js";
78
78
  import "./chunk-UHGBNIOS.js";
79
79
  import "./chunk-BCDKBDSY.js";
80
80
  import "./chunk-YN2UN7N3.js";
81
- import "./chunk-IRMLYBMU.js";
81
+ import "./chunk-T67LUYCR.js";
82
82
  import "./chunk-I6WYQSX4.js";
83
83
  import "./chunk-4EX5WZ4M.js";
84
84
  import "./chunk-XZ5I7OZR.js";
@@ -87,7 +87,7 @@ import "./chunk-FDPZVY6D.js";
87
87
  import "./chunk-5IZL4DCV.js";
88
88
  import "./chunk-2IZAGAJR.js";
89
89
  import "./chunk-E3VODCC3.js";
90
- import "./chunk-XGSOXFD4.js";
90
+ import "./chunk-6TCXIRP5.js";
91
91
  import "./chunk-DE6ENYLG.js";
92
92
  import "./chunk-HHAA35A3.js";
93
93
  import "./chunk-X7XN6YU4.js";
@@ -113,13 +113,13 @@ import "./chunk-5GSUBCZM.js";
113
113
  import "./chunk-54V4BZWP.js";
114
114
  import "./chunk-KAWTOYAW.js";
115
115
  import "./chunk-QT2RZNRT.js";
116
- import "./chunk-BFU7H32D.js";
117
- import "./chunk-7O2JL5RY.js";
116
+ import "./chunk-OH7QLI6W.js";
117
+ import "./chunk-DEOYTFA6.js";
118
118
  import "./chunk-IAIPNEHD.js";
119
- import "./chunk-77UPM7P3.js";
119
+ import "./chunk-TVIVY7KU.js";
120
120
  import "./chunk-YVVQUAOO.js";
121
121
  import "./chunk-LUPVCGYK.js";
122
- import "./chunk-R26WO46Z.js";
122
+ import "./chunk-DGFU5MSX.js";
123
123
  import "./chunk-I73G4UH7.js";
124
124
  import "./chunk-VEWZZM3H.js";
125
125
  import "./chunk-Q6IP2ARR.js";
@@ -1,4 +1,5 @@
1
1
  import { ExplicitCueRecallEngine } from './explicit-cue-recall.js';
2
+ import './evidence-pack.js';
2
3
 
3
4
  interface ResponseGuidanceRecallOptions {
4
5
  engine: ExplicitCueRecallEngine | null | undefined;
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  buildResponseGuidanceRecallSection,
3
3
  shouldRecallResponseGuidance
4
- } from "./chunk-XGSOXFD4.js";
4
+ } from "./chunk-6TCXIRP5.js";
5
5
  import "./chunk-YVVQUAOO.js";
6
6
  import "./chunk-LUPVCGYK.js";
7
- import "./chunk-R26WO46Z.js";
7
+ import "./chunk-DGFU5MSX.js";
8
8
  import "./chunk-C37ZRXX7.js";
9
9
  import "./chunk-PZ5AY32C.js";
10
10
  export {
@@ -1,4 +1,5 @@
1
1
  import { ExplicitCueRecallEngine } from './explicit-cue-recall.js';
2
+ import './evidence-pack.js';
2
3
 
3
4
  interface TargetedFactRecallOptions {
4
5
  engine: ExplicitCueRecallEngine | null | undefined;
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  buildTargetedFactRecallSection,
3
3
  shouldRecallTargetedFactEvidence
4
- } from "./chunk-IRMLYBMU.js";
4
+ } from "./chunk-T67LUYCR.js";
5
5
  import "./chunk-YVVQUAOO.js";
6
6
  import "./chunk-LUPVCGYK.js";
7
- import "./chunk-R26WO46Z.js";
7
+ import "./chunk-DGFU5MSX.js";
8
8
  import "./chunk-C37ZRXX7.js";
9
9
  import "./chunk-PZ5AY32C.js";
10
10
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.6.30",
3
+ "version": "9.6.31",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3000,7 +3000,7 @@
3000
3000
  "core"
3001
3001
  ],
3002
3002
  "peerDependencies": {
3003
- "@remnic/coding-graph": "^9.6.30"
3003
+ "@remnic/coding-graph": "^9.6.31"
3004
3004
  },
3005
3005
  "peerDependenciesMeta": {
3006
3006
  "@remnic/coding-graph": {
@@ -1,7 +1,10 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
3
 
4
- import { buildEvidencePack } from "./evidence-pack.js";
4
+ import {
5
+ buildEvidencePack,
6
+ type EvidencePackSelectionReceipt,
7
+ } from "./evidence-pack.js";
5
8
 
6
9
  test("buildEvidencePack deduplicates evidence and stays within budget", () => {
7
10
  const pack = buildEvidencePack(
@@ -87,3 +90,65 @@ test("buildEvidencePack keeps query-focused evidence from later long turns", ()
87
90
  assert.match(pack, /Dec 16, 2023 - Jan 15, 2024/);
88
91
  assert.match(pack, /Feb 16 - Mar 15, 2024/);
89
92
  });
93
+
94
+ test("buildEvidencePack reports only appended blocks with exact content-free offsets", () => {
95
+ const receipts: EvidencePackSelectionReceipt[] = [];
96
+ const items = [
97
+ {
98
+ id: "selected",
99
+ archiveRowId: 41,
100
+ sessionId: "private-session",
101
+ turnIndex: 7,
102
+ role: "user",
103
+ content: "selected private evidence",
104
+ score: 2,
105
+ },
106
+ {
107
+ id: "duplicate-content",
108
+ archiveRowId: 42,
109
+ sessionId: "private-session",
110
+ turnIndex: 8,
111
+ role: "assistant",
112
+ content: "selected private evidence",
113
+ score: 1,
114
+ },
115
+ {
116
+ id: "budget-rejected",
117
+ archiveRowId: 43,
118
+ sessionId: "private-session",
119
+ turnIndex: 9,
120
+ role: "assistant",
121
+ content: "this block cannot fit inside the remaining budget",
122
+ },
123
+ ];
124
+ const options = {
125
+ title: "Receipt evidence",
126
+ maxChars:
127
+ "## Receipt evidence".length +
128
+ 2 +
129
+ "[private-session, turn 7, user, score 2.000]: selected private evidence".length,
130
+ maxItemChars: 200,
131
+ };
132
+
133
+ const baseline = buildEvidencePack(items, options);
134
+ const traced = buildEvidencePack(items, {
135
+ ...options,
136
+ onSelection: (receipt) => receipts.push(receipt),
137
+ });
138
+
139
+ assert.equal(traced, baseline);
140
+ assert.equal(receipts.length, 1);
141
+ const receipt = receipts[0]!;
142
+ assert.equal(
143
+ traced.slice(receipt.blockStart, receipt.blockEnd),
144
+ "[private-session, turn 7, user, score 2.000]: selected private evidence",
145
+ );
146
+ assert.deepEqual(receipt.item, {
147
+ archiveRowId: 41,
148
+ turnIndex: 7,
149
+ role: "user",
150
+ score: 2,
151
+ });
152
+ assert.equal("content" in receipt.item, false);
153
+ assert.equal("sessionId" in receipt.item, false);
154
+ });
@@ -14,6 +14,23 @@ export interface EvidencePackOptions {
14
14
  maxChars: number;
15
15
  maxItemChars?: number;
16
16
  query?: string;
17
+ /** Optional non-rendering receipt for each block actually appended. */
18
+ onSelection?: (receipt: EvidencePackSelectionReceipt) => void;
19
+ }
20
+
21
+ /** Content-free identity fields for an evidence item that survived selection. */
22
+ export interface EvidencePackSelectedItem {
23
+ archiveRowId?: number;
24
+ turnIndex?: number;
25
+ role?: string;
26
+ score?: number;
27
+ }
28
+
29
+ export interface EvidencePackSelectionReceipt {
30
+ item: EvidencePackSelectedItem;
31
+ /** Half-open offsets within the returned evidence-pack string. */
32
+ blockStart: number;
33
+ blockEnd: number;
17
34
  }
18
35
 
19
36
  const DEFAULT_MAX_ITEM_CHARS = 1_200;
@@ -96,15 +113,37 @@ export function buildEvidencePack(
96
113
  block.length > remaining ? clipText(block, remaining) : block;
97
114
  if (!finalBlock.trim()) break;
98
115
 
116
+ const blockStart = used + separatorLength;
117
+ const blockEnd = blockStart + finalBlock.length;
99
118
  lines.push(finalBlock);
100
119
  used += separatorLength + finalBlock.length;
101
120
  if (id) seenIds.add(id);
102
121
  seenContent.add(contentKey);
122
+ options.onSelection?.({
123
+ item: evidencePackSelectedItem(item),
124
+ blockStart,
125
+ blockEnd,
126
+ });
103
127
  }
104
128
 
105
129
  return lines.length === 1 ? "" : lines.join("\n\n");
106
130
  }
107
131
 
132
+ function evidencePackSelectedItem(
133
+ item: EvidencePackItem,
134
+ ): EvidencePackSelectedItem {
135
+ return {
136
+ ...(typeof item.archiveRowId === "number"
137
+ ? { archiveRowId: item.archiveRowId }
138
+ : {}),
139
+ ...(typeof item.turnIndex === "number" ? { turnIndex: item.turnIndex } : {}),
140
+ ...(typeof item.role === "string" ? { role: item.role } : {}),
141
+ ...(typeof item.score === "number" && Number.isFinite(item.score)
142
+ ? { score: item.score }
143
+ : {}),
144
+ };
145
+ }
146
+
108
147
  export function insertAfterEvidenceHeading(
109
148
  evidence: string,
110
149
  title: string,