@remnic/core 9.6.29 → 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 (118) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -0
  2. package/dist/access-admin-ops-surface.js +2 -1
  3. package/dist/access-boundary.d.ts +1 -0
  4. package/dist/access-boundary.js +3 -2
  5. package/dist/access-cli.js +18 -17
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-http.d.ts +1 -0
  8. package/dist/access-http.js +7 -6
  9. package/dist/access-identity-continuity-surface.d.ts +1 -0
  10. package/dist/access-identity-continuity-surface.js +2 -1
  11. package/dist/access-lcm-surface.d.ts +1 -0
  12. package/dist/access-lcm-surface.js +2 -1
  13. package/dist/access-mcp.d.ts +1 -0
  14. package/dist/access-mcp.js +6 -5
  15. package/dist/access-observe-write-surface.d.ts +1 -0
  16. package/dist/access-observe-write-surface.js +2 -1
  17. package/dist/access-operations-batch.js +4 -3
  18. package/dist/access-operations.d.ts +1 -0
  19. package/dist/access-operations.js +5 -4
  20. package/dist/access-recall-surface.d.ts +1 -0
  21. package/dist/access-recall-surface.js +2 -1
  22. package/dist/access-service.d.ts +1 -0
  23. package/dist/access-service.js +2 -1
  24. package/dist/access-surface-catalog.d.ts +1 -0
  25. package/dist/bootstrap.d.ts +1 -0
  26. package/dist/causal-behavior.d.ts +1 -0
  27. package/dist/{chunk-L6W77GWW.js → chunk-6TCXIRP5.js} +25 -13
  28. package/dist/chunk-6TCXIRP5.js.map +1 -0
  29. package/dist/chunk-C37ZRXX7.js +36 -0
  30. package/dist/chunk-C37ZRXX7.js.map +1 -0
  31. package/dist/{chunk-SGYTQKC2.js → chunk-C6TKSI35.js} +3 -3
  32. package/dist/{chunk-C2SEH754.js → chunk-DAAJUA6Q.js} +4 -4
  33. package/dist/{chunk-FV5FVO2J.js → chunk-DEOYTFA6.js} +9 -5
  34. package/dist/chunk-DEOYTFA6.js.map +1 -0
  35. package/dist/{chunk-PYPOFEMK.js → chunk-DGFU5MSX.js} +16 -1
  36. package/dist/chunk-DGFU5MSX.js.map +1 -0
  37. package/dist/{chunk-EAREADWV.js → chunk-GQURC4B7.js} +2 -2
  38. package/dist/{chunk-XA4PWKBW.js → chunk-MXAGJHTA.js} +3 -3
  39. package/dist/{chunk-LZTFCAKE.js → chunk-OH7QLI6W.js} +28 -15
  40. package/dist/chunk-OH7QLI6W.js.map +1 -0
  41. package/dist/{chunk-5BHIGBHQ.js → chunk-OXVKR5OU.js} +6 -3
  42. package/dist/{chunk-5BHIGBHQ.js.map → chunk-OXVKR5OU.js.map} +1 -1
  43. package/dist/{chunk-IF7THCGJ.js → chunk-PUQZIS6A.js} +3 -3
  44. package/dist/{chunk-4SBW47WK.js → chunk-T67LUYCR.js} +28 -15
  45. package/dist/chunk-T67LUYCR.js.map +1 -0
  46. package/dist/{chunk-4463LUIE.js → chunk-TVIVY7KU.js} +180 -70
  47. package/dist/chunk-TVIVY7KU.js.map +1 -0
  48. package/dist/{chunk-KCYE2MZM.js → chunk-UXPUUL3G.js} +29 -8
  49. package/dist/chunk-UXPUUL3G.js.map +1 -0
  50. package/dist/chunk-VDC6RZI4.js +1 -0
  51. package/dist/{chunk-3RROR5KV.js → chunk-VJRJTRYF.js} +4 -4
  52. package/dist/{chunk-5WJ4LBFR.js → chunk-WSOEYOHN.js} +8 -8
  53. package/dist/{chunk-5AJIDEFT.js → chunk-XFTPUXCE.js} +11 -7
  54. package/dist/chunk-XFTPUXCE.js.map +1 -0
  55. package/dist/cli.d.ts +1 -0
  56. package/dist/cli.js +8 -7
  57. package/dist/compounding/preference-consolidator.d.ts +1 -0
  58. package/dist/event-order-recall.d.ts +1 -0
  59. package/dist/event-order-recall.js +3 -2
  60. package/dist/evidence-pack.d.ts +18 -1
  61. package/dist/evidence-pack.js +1 -1
  62. package/dist/explicit-capture.d.ts +1 -0
  63. package/dist/explicit-cue-recall.d.ts +19 -1
  64. package/dist/explicit-cue-recall.js +3 -2
  65. package/dist/focused-list-recall.d.ts +1 -0
  66. package/dist/focused-list-recall.js +3 -2
  67. package/dist/index.d.ts +3 -2
  68. package/dist/index.js +18 -17
  69. package/dist/lcm/engine.d.ts +3 -0
  70. package/dist/lcm/engine.js +2 -2
  71. package/dist/lcm/index.d.ts +23 -1
  72. package/dist/lcm/index.js +14 -4
  73. package/dist/lcm/recall.d.ts +15 -1
  74. package/dist/lcm/recall.js +5 -3
  75. package/dist/lcm/tools.d.ts +1 -0
  76. package/dist/mcp-memory-inspector-app.d.ts +1 -0
  77. package/dist/orchestrator.d.ts +1 -0
  78. package/dist/orchestrator.js +18 -17
  79. package/dist/response-guidance-recall.d.ts +1 -0
  80. package/dist/response-guidance-recall.js +3 -2
  81. package/dist/targeted-fact-recall.d.ts +1 -0
  82. package/dist/targeted-fact-recall.js +3 -2
  83. package/package.json +2 -2
  84. package/src/access-lcm-surface.ts +20 -5
  85. package/src/access-recall-surface.ts +2 -1
  86. package/src/event-order-recall.ts +5 -3
  87. package/src/evidence-pack.test.ts +66 -1
  88. package/src/evidence-pack.ts +41 -0
  89. package/src/explicit-cue-recall.ts +291 -133
  90. package/src/focused-list-recall.ts +25 -16
  91. package/src/index.ts +3 -0
  92. package/src/lcm/engine.ts +17 -5
  93. package/src/lcm/evidence-identity.ts +59 -0
  94. package/src/lcm/index.ts +13 -1
  95. package/src/lcm/recall.ts +48 -5
  96. package/src/lcm-engine.test.ts +46 -0
  97. package/src/lcm-recall.test.ts +48 -1
  98. package/src/lcm-retrieval-lineage.test.ts +236 -0
  99. package/src/recall-trace-receipts.test.ts +380 -0
  100. package/src/response-guidance-recall.ts +22 -14
  101. package/src/targeted-fact-recall.ts +25 -16
  102. package/dist/chunk-4463LUIE.js.map +0 -1
  103. package/dist/chunk-4SBW47WK.js.map +0 -1
  104. package/dist/chunk-5AJIDEFT.js.map +0 -1
  105. package/dist/chunk-FV5FVO2J.js.map +0 -1
  106. package/dist/chunk-HHLLAQGZ.js +0 -1
  107. package/dist/chunk-KCYE2MZM.js.map +0 -1
  108. package/dist/chunk-L6W77GWW.js.map +0 -1
  109. package/dist/chunk-LZTFCAKE.js.map +0 -1
  110. package/dist/chunk-PYPOFEMK.js.map +0 -1
  111. /package/dist/{chunk-SGYTQKC2.js.map → chunk-C6TKSI35.js.map} +0 -0
  112. /package/dist/{chunk-C2SEH754.js.map → chunk-DAAJUA6Q.js.map} +0 -0
  113. /package/dist/{chunk-EAREADWV.js.map → chunk-GQURC4B7.js.map} +0 -0
  114. /package/dist/{chunk-XA4PWKBW.js.map → chunk-MXAGJHTA.js.map} +0 -0
  115. /package/dist/{chunk-IF7THCGJ.js.map → chunk-PUQZIS6A.js.map} +0 -0
  116. /package/dist/{chunk-HHLLAQGZ.js.map → chunk-VDC6RZI4.js.map} +0 -0
  117. /package/dist/{chunk-3RROR5KV.js.map → chunk-VJRJTRYF.js.map} +0 -0
  118. /package/dist/{chunk-5WJ4LBFR.js.map → chunk-WSOEYOHN.js.map} +0 -0
package/dist/index.js CHANGED
@@ -93,7 +93,7 @@ import {
93
93
  validateTaxonomy,
94
94
  watchForChanges,
95
95
  writeManifest
96
- } from "./chunk-5WJ4LBFR.js";
96
+ } from "./chunk-WSOEYOHN.js";
97
97
  import {
98
98
  WEARABLE_SOURCE_PREFIX,
99
99
  buildExtractionTurns,
@@ -138,10 +138,10 @@ import {
138
138
  rollbackFromEngramMigration
139
139
  } from "./chunk-7HYPN2GC.js";
140
140
  import "./chunk-666A3MOW.js";
141
- import "./chunk-HHLLAQGZ.js";
142
- import "./chunk-5AJIDEFT.js";
141
+ import "./chunk-VDC6RZI4.js";
142
+ import "./chunk-XFTPUXCE.js";
143
143
  import "./chunk-TPDBFYEG.js";
144
- import "./chunk-KCYE2MZM.js";
144
+ import "./chunk-UXPUUL3G.js";
145
145
  import {
146
146
  applyLcmSchema,
147
147
  ensureLcmStateDir,
@@ -214,7 +214,7 @@ import "./chunk-YN2UN7N3.js";
214
214
  import {
215
215
  buildTargetedFactRecallSection,
216
216
  shouldRecallTargetedFactEvidence
217
- } from "./chunk-4SBW47WK.js";
217
+ } from "./chunk-T67LUYCR.js";
218
218
  import "./chunk-I6WYQSX4.js";
219
219
  import {
220
220
  CODEX_THREAD_KEY_PREFIX
@@ -228,7 +228,7 @@ import "./chunk-E3VODCC3.js";
228
228
  import {
229
229
  buildResponseGuidanceRecallSection,
230
230
  shouldRecallResponseGuidance
231
- } from "./chunk-L6W77GWW.js";
231
+ } from "./chunk-6TCXIRP5.js";
232
232
  import "./chunk-DE6ENYLG.js";
233
233
  import "./chunk-HHAA35A3.js";
234
234
  import "./chunk-X7XN6YU4.js";
@@ -301,11 +301,11 @@ import "./chunk-QT2RZNRT.js";
301
301
  import {
302
302
  buildFocusedListRecallSection,
303
303
  shouldRecallFocusedListEvidence
304
- } from "./chunk-LZTFCAKE.js";
304
+ } from "./chunk-OH7QLI6W.js";
305
305
  import {
306
306
  buildEventOrderRecallSection,
307
307
  shouldRecallEventOrderEvidence
308
- } from "./chunk-FV5FVO2J.js";
308
+ } from "./chunk-DEOYTFA6.js";
309
309
  import "./chunk-IAIPNEHD.js";
310
310
  import {
311
311
  buildExplicitCueRecallSection,
@@ -318,12 +318,12 @@ import {
318
318
  collectStructuredPlanCues,
319
319
  collectTemporalLexicalCues,
320
320
  normalizeTurnExpansionEnd
321
- } from "./chunk-4463LUIE.js";
321
+ } from "./chunk-TVIVY7KU.js";
322
322
  import "./chunk-YVVQUAOO.js";
323
323
  import "./chunk-LUPVCGYK.js";
324
324
  import {
325
325
  buildEvidencePack
326
- } from "./chunk-PYPOFEMK.js";
326
+ } from "./chunk-DGFU5MSX.js";
327
327
  import {
328
328
  buildExtensionsFooterForSummary,
329
329
  loadDaySummaryPrompt
@@ -348,7 +348,7 @@ import {
348
348
  registerTrainingExportAdapter,
349
349
  runBulkImportCliCommand,
350
350
  runWearablesCliCommand
351
- } from "./chunk-3RROR5KV.js";
351
+ } from "./chunk-VJRJTRYF.js";
352
352
  import "./chunk-MMACM5G2.js";
353
353
  import "./chunk-54BGIBCR.js";
354
354
  import "./chunk-H4CKS5B2.js";
@@ -550,7 +550,7 @@ import "./chunk-K6MV3TRQ.js";
550
550
  import "./chunk-OADWQ5CR.js";
551
551
  import {
552
552
  EngramAccessHttpServer
553
- } from "./chunk-C2SEH754.js";
553
+ } from "./chunk-DAAJUA6Q.js";
554
554
  import {
555
555
  WearablesInputError,
556
556
  describeErrorForOperator
@@ -564,7 +564,7 @@ import "./chunk-TMSXWOBZ.js";
564
564
  import "./chunk-7RXCMVFQ.js";
565
565
  import {
566
566
  EngramMcpServer
567
- } from "./chunk-XA4PWKBW.js";
567
+ } from "./chunk-MXAGJHTA.js";
568
568
  import "./chunk-IC2TCZJ2.js";
569
569
  import {
570
570
  buildCitationGuidance,
@@ -573,7 +573,7 @@ import {
573
573
  sanitizeNoteForCitation
574
574
  } from "./chunk-D24OXEPB.js";
575
575
  import "./chunk-5RUE3GHQ.js";
576
- import "./chunk-SGYTQKC2.js";
576
+ import "./chunk-C6TKSI35.js";
577
577
  import {
578
578
  formatZodError,
579
579
  memoryStoreRequestSchema,
@@ -582,7 +582,7 @@ import {
582
582
  suggestionSubmitRequestSchema,
583
583
  validateRequest
584
584
  } from "./chunk-2MR3MFQB.js";
585
- import "./chunk-IF7THCGJ.js";
585
+ import "./chunk-PUQZIS6A.js";
586
586
  import "./chunk-HLTAPHZZ.js";
587
587
  import "./chunk-YF6FMLBT.js";
588
588
  import {
@@ -615,7 +615,7 @@ import {
615
615
  } from "./chunk-T4WDJPEZ.js";
616
616
  import {
617
617
  OPERATION_NAMES
618
- } from "./chunk-EAREADWV.js";
618
+ } from "./chunk-GQURC4B7.js";
619
619
  import {
620
620
  TOKEN_CAPABILITIES_VERSION,
621
621
  capabilityAllowsNamespace,
@@ -631,7 +631,7 @@ import {
631
631
  EngramAccessService,
632
632
  computeProcedureStats,
633
633
  formatProcedureStatsText
634
- } from "./chunk-5BHIGBHQ.js";
634
+ } from "./chunk-OXVKR5OU.js";
635
635
  import "./chunk-GDASG7NC.js";
636
636
  import "./chunk-GDB4J2H3.js";
637
637
  import "./chunk-M5QKGHCR.js";
@@ -727,6 +727,7 @@ import {
727
727
  parseProcedureStepsFromBody
728
728
  } from "./chunk-QDW3E4RD.js";
729
729
  import "./chunk-ZGPDSEKG.js";
730
+ import "./chunk-C37ZRXX7.js";
730
731
  import {
731
732
  getHostEmbeddingProvider,
732
733
  normalizeHostEmbeddingVector,
@@ -1,5 +1,6 @@
1
1
  import { LcmStructuredRecallMatch } from './archive.js';
2
2
  import { SummarizeFn } from './summarizer.js';
3
+ import { LcmRecallWithTraceResult } from './recall.js';
3
4
  import { LcmObserveMessage } from './queue.js';
4
5
  import { P as PluginConfig } from '../types-DDUDgd7T.js';
5
6
  import 'better-sqlite3';
@@ -65,6 +66,8 @@ declare class LcmEngine {
65
66
  private waitForPendingObserveInitIdle;
66
67
  /** Build the compressed history recall section for a session. */
67
68
  assembleRecall(sessionId: string, budgetChars: number): Promise<string>;
69
+ /** Build compressed recall plus content-free selected-summary receipts. */
70
+ assembleRecallWithTrace(sessionId: string, budgetChars: number): Promise<LcmRecallWithTraceResult>;
68
71
  searchStructuredParts(sessionId: string, query: string, limit?: number): Promise<LcmStructuredRecallMatch[]>;
69
72
  formatStructuredRecall(matches: LcmStructuredRecallMatch[], budgetChars: number): string;
70
73
  /** Flush pending summaries before compaction (called from before_compaction hook). */
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  LcmEngine,
3
3
  extractLcmConfig
4
- } from "../chunk-5AJIDEFT.js";
4
+ } from "../chunk-XFTPUXCE.js";
5
5
  import "../chunk-TPDBFYEG.js";
6
- import "../chunk-KCYE2MZM.js";
6
+ import "../chunk-UXPUUL3G.js";
7
7
  import "../chunk-7N2RUBAP.js";
8
8
  import "../chunk-MTR7BZQN.js";
9
9
  import "../chunk-O7BBFJLP.js";
@@ -2,7 +2,7 @@ export { LcmEngine, LcmEngineConfig, LcmExpandedMessage, extractLcmConfig } from
2
2
  export { LcmArchive, estimateTokens } from './archive.js';
3
3
  export { LcmDag, SummaryNode } from './dag.js';
4
4
  export { LcmSummarizer, SummarizeFn } from './summarizer.js';
5
- export { assembleCompressedHistory } from './recall.js';
5
+ export { LcmRecallWithTraceResult, LcmSummarySelectionReceipt, assembleCompressedHistory, assembleCompressedHistoryWithTrace } from './recall.js';
6
6
  export { registerLcmTools } from './tools.js';
7
7
  export { ensureLcmStateDir, openLcmDatabase } from './schema.js';
8
8
  import './queue.js';
@@ -10,3 +10,25 @@ import '../message-parts/index.js';
10
10
  import '../types-DDUDgd7T.js';
11
11
  import 'better-sqlite3';
12
12
  import '../runtime/better-sqlite.js';
13
+
14
+ interface LcmRowIdentity {
15
+ id?: number;
16
+ session_id?: string;
17
+ turn_index: number;
18
+ }
19
+ interface LcmEvidenceIdentity {
20
+ id: string;
21
+ archiveRowId?: number;
22
+ }
23
+ declare function lcmArchiveRowId(row: Pick<LcmRowIdentity, "id">): number | undefined;
24
+ /**
25
+ * Build the non-rendered evidence identity for an LCM archive row.
26
+ *
27
+ * Older adapters and test doubles may omit the SQLite row id. Those callers
28
+ * retain the historical session+turn identity until they adopt row lineage.
29
+ */
30
+ declare function lcmEvidenceIdentity(row: LcmRowIdentity, fallbackSessionId: string): LcmEvidenceIdentity;
31
+ /** Match a search hit to its expanded archive row without conflating siblings. */
32
+ declare function isSameLcmRow(left: LcmRowIdentity, leftFallbackSessionId: string, right: LcmRowIdentity, rightFallbackSessionId: string): boolean;
33
+
34
+ export { type LcmEvidenceIdentity, type LcmRowIdentity, isSameLcmRow, lcmArchiveRowId, lcmEvidenceIdentity };
package/dist/lcm/index.js CHANGED
@@ -1,12 +1,13 @@
1
- import "../chunk-HHLLAQGZ.js";
1
+ import "../chunk-VDC6RZI4.js";
2
2
  import {
3
3
  LcmEngine,
4
4
  extractLcmConfig
5
- } from "../chunk-5AJIDEFT.js";
5
+ } from "../chunk-XFTPUXCE.js";
6
6
  import "../chunk-TPDBFYEG.js";
7
7
  import {
8
- assembleCompressedHistory
9
- } from "../chunk-KCYE2MZM.js";
8
+ assembleCompressedHistory,
9
+ assembleCompressedHistoryWithTrace
10
+ } from "../chunk-UXPUUL3G.js";
10
11
  import {
11
12
  ensureLcmStateDir,
12
13
  openLcmDatabase
@@ -26,6 +27,11 @@ import {
26
27
  } from "../chunk-7N4KAIGN.js";
27
28
  import "../chunk-4RA3C3EV.js";
28
29
  import "../chunk-AQEJKOKI.js";
30
+ import {
31
+ isSameLcmRow,
32
+ lcmArchiveRowId,
33
+ lcmEvidenceIdentity
34
+ } from "../chunk-C37ZRXX7.js";
29
35
  import "../chunk-RL6NEVXT.js";
30
36
  import "../chunk-37CTGERM.js";
31
37
  import "../chunk-PZ5AY32C.js";
@@ -35,9 +41,13 @@ export {
35
41
  LcmEngine,
36
42
  LcmSummarizer,
37
43
  assembleCompressedHistory,
44
+ assembleCompressedHistoryWithTrace,
38
45
  ensureLcmStateDir,
39
46
  estimateTokens,
40
47
  extractLcmConfig,
48
+ isSameLcmRow,
49
+ lcmArchiveRowId,
50
+ lcmEvidenceIdentity,
41
51
  openLcmDatabase,
42
52
  registerLcmTools
43
53
  };
@@ -7,6 +7,19 @@ interface LcmRecallConfig {
7
7
  freshTailTurns: number;
8
8
  budgetChars: number;
9
9
  }
10
+ interface LcmSummarySelectionReceipt {
11
+ id: string;
12
+ depth: number;
13
+ msgStart: number;
14
+ msgEnd: number;
15
+ /** Half-open offsets within the returned compressed-history string. */
16
+ entryStart: number;
17
+ entryEnd: number;
18
+ }
19
+ interface LcmRecallWithTraceResult {
20
+ text: string;
21
+ selectedSummaries: LcmSummarySelectionReceipt[];
22
+ }
10
23
  /**
11
24
  * Assemble a compressed session history section from the summary DAG.
12
25
  *
@@ -16,5 +29,6 @@ interface LcmRecallConfig {
16
29
  * 3. Fill within budget, prioritizing recent content.
17
30
  */
18
31
  declare function assembleCompressedHistory(dag: LcmDag, archive: LcmArchive, sessionId: string, config: LcmRecallConfig): string;
32
+ declare function assembleCompressedHistoryWithTrace(dag: LcmDag, archive: LcmArchive, sessionId: string, config: LcmRecallConfig): LcmRecallWithTraceResult;
19
33
 
20
- export { type LcmRecallConfig, assembleCompressedHistory };
34
+ export { type LcmRecallConfig, type LcmRecallWithTraceResult, type LcmSummarySelectionReceipt, assembleCompressedHistory, assembleCompressedHistoryWithTrace };
@@ -1,8 +1,10 @@
1
1
  import {
2
- assembleCompressedHistory
3
- } from "../chunk-KCYE2MZM.js";
2
+ assembleCompressedHistory,
3
+ assembleCompressedHistoryWithTrace
4
+ } from "../chunk-UXPUUL3G.js";
4
5
  import "../chunk-PZ5AY32C.js";
5
6
  export {
6
- assembleCompressedHistory
7
+ assembleCompressedHistory,
8
+ assembleCompressedHistoryWithTrace
7
9
  };
8
10
  //# sourceMappingURL=recall.js.map
@@ -4,6 +4,7 @@ import 'better-sqlite3';
4
4
  import '../message-parts/index.js';
5
5
  import './summarizer.js';
6
6
  import './dag.js';
7
+ import './recall.js';
7
8
  import './queue.js';
8
9
  import '../types-DDUDgd7T.js';
9
10
 
@@ -74,6 +74,7 @@ import './lcm/engine.js';
74
74
  import './lcm/archive.js';
75
75
  import './lcm/summarizer.js';
76
76
  import './lcm/dag.js';
77
+ import './lcm/recall.js';
77
78
  import './lcm/queue.js';
78
79
  import './policy-runtime.js';
79
80
  import './types-B1VHaf2w.js';
@@ -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-5WJ4LBFR.js";
46
+ } from "./chunk-WSOEYOHN.js";
47
47
  import "./chunk-J3XHPFEU.js";
48
48
  import {
49
49
  formatCompressionGuidelinesForRecall
@@ -53,10 +53,10 @@ import "./chunk-I74SUMNI.js";
53
53
  import "./chunk-ILNPU5W5.js";
54
54
  import "./chunk-7HYPN2GC.js";
55
55
  import "./chunk-666A3MOW.js";
56
- import "./chunk-HHLLAQGZ.js";
57
- import "./chunk-5AJIDEFT.js";
56
+ import "./chunk-VDC6RZI4.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-4SBW47WK.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-L6W77GWW.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,20 +113,20 @@ 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-LZTFCAKE.js";
117
- import "./chunk-FV5FVO2J.js";
116
+ import "./chunk-OH7QLI6W.js";
117
+ import "./chunk-DEOYTFA6.js";
118
118
  import "./chunk-IAIPNEHD.js";
119
- import "./chunk-4463LUIE.js";
119
+ import "./chunk-TVIVY7KU.js";
120
120
  import "./chunk-YVVQUAOO.js";
121
121
  import "./chunk-LUPVCGYK.js";
122
- import "./chunk-PYPOFEMK.js";
122
+ import "./chunk-DGFU5MSX.js";
123
123
  import "./chunk-I73G4UH7.js";
124
124
  import "./chunk-VEWZZM3H.js";
125
125
  import "./chunk-Q6IP2ARR.js";
126
126
  import "./chunk-6HEM6HTQ.js";
127
127
  import "./chunk-O2EL7EGG.js";
128
128
  import "./chunk-FVTLSFWU.js";
129
- import "./chunk-3RROR5KV.js";
129
+ import "./chunk-VJRJTRYF.js";
130
130
  import "./chunk-MMACM5G2.js";
131
131
  import "./chunk-54BGIBCR.js";
132
132
  import "./chunk-H4CKS5B2.js";
@@ -217,7 +217,7 @@ import "./chunk-G6NKALRN.js";
217
217
  import "./chunk-OO42R444.js";
218
218
  import "./chunk-K6MV3TRQ.js";
219
219
  import "./chunk-OADWQ5CR.js";
220
- import "./chunk-C2SEH754.js";
220
+ import "./chunk-DAAJUA6Q.js";
221
221
  import "./chunk-V7IZKJI3.js";
222
222
  import "./chunk-SEDEKFYQ.js";
223
223
  import "./chunk-RKNJBZ55.js";
@@ -226,13 +226,13 @@ import "./chunk-RSUYKGGZ.js";
226
226
  import "./chunk-42NQ7AVG.js";
227
227
  import "./chunk-TMSXWOBZ.js";
228
228
  import "./chunk-7RXCMVFQ.js";
229
- import "./chunk-XA4PWKBW.js";
229
+ import "./chunk-MXAGJHTA.js";
230
230
  import "./chunk-IC2TCZJ2.js";
231
231
  import "./chunk-D24OXEPB.js";
232
232
  import "./chunk-5RUE3GHQ.js";
233
- import "./chunk-SGYTQKC2.js";
233
+ import "./chunk-C6TKSI35.js";
234
234
  import "./chunk-2MR3MFQB.js";
235
- import "./chunk-IF7THCGJ.js";
235
+ import "./chunk-PUQZIS6A.js";
236
236
  import "./chunk-HLTAPHZZ.js";
237
237
  import "./chunk-YF6FMLBT.js";
238
238
  import "./chunk-PRTA6444.js";
@@ -240,9 +240,9 @@ import "./chunk-KQDNAXOM.js";
240
240
  import "./chunk-35NN3ZFA.js";
241
241
  import "./chunk-FTYDWKO6.js";
242
242
  import "./chunk-T4WDJPEZ.js";
243
- import "./chunk-EAREADWV.js";
243
+ import "./chunk-GQURC4B7.js";
244
244
  import "./chunk-D7FOKIY5.js";
245
- import "./chunk-5BHIGBHQ.js";
245
+ import "./chunk-OXVKR5OU.js";
246
246
  import "./chunk-GDASG7NC.js";
247
247
  import "./chunk-GDB4J2H3.js";
248
248
  import "./chunk-M5QKGHCR.js";
@@ -288,6 +288,7 @@ import "./chunk-MTWKDOVO.js";
288
288
  import "./chunk-O75CRYGF.js";
289
289
  import "./chunk-QDW3E4RD.js";
290
290
  import "./chunk-ZGPDSEKG.js";
291
+ import "./chunk-C37ZRXX7.js";
291
292
  import "./chunk-3ONXXHQO.js";
292
293
  import "./chunk-ODPLEWB6.js";
293
294
  import "./chunk-ZY2MNJR6.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,11 @@
1
1
  import {
2
2
  buildResponseGuidanceRecallSection,
3
3
  shouldRecallResponseGuidance
4
- } from "./chunk-L6W77GWW.js";
4
+ } from "./chunk-6TCXIRP5.js";
5
5
  import "./chunk-YVVQUAOO.js";
6
6
  import "./chunk-LUPVCGYK.js";
7
- import "./chunk-PYPOFEMK.js";
7
+ import "./chunk-DGFU5MSX.js";
8
+ import "./chunk-C37ZRXX7.js";
8
9
  import "./chunk-PZ5AY32C.js";
9
10
  export {
10
11
  buildResponseGuidanceRecallSection,
@@ -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,11 @@
1
1
  import {
2
2
  buildTargetedFactRecallSection,
3
3
  shouldRecallTargetedFactEvidence
4
- } from "./chunk-4SBW47WK.js";
4
+ } from "./chunk-T67LUYCR.js";
5
5
  import "./chunk-YVVQUAOO.js";
6
6
  import "./chunk-LUPVCGYK.js";
7
- import "./chunk-PYPOFEMK.js";
7
+ import "./chunk-DGFU5MSX.js";
8
+ import "./chunk-C37ZRXX7.js";
8
9
  import "./chunk-PZ5AY32C.js";
9
10
  export {
10
11
  buildTargetedFactRecallSection,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.6.29",
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.29"
3003
+ "@remnic/coding-graph": "^9.6.31"
3004
3004
  },
3005
3005
  "peerDependenciesMeta": {
3006
3006
  "@remnic/coding-graph": {
@@ -11,6 +11,7 @@
11
11
  import { resolveNamespaceCapabilities } from "./capabilities.js";
12
12
  import { combineNamespaces, lcmSessionKeyForNamespace, resolveCodingNamespaceOverlay } from "./coding/coding-namespace.js";
13
13
  import { log } from "./logger.js";
14
+ import { lcmEvidenceIdentity } from "./lcm/evidence-identity.js";
14
15
  import { canWriteNamespace, defaultNamespaceForPrincipal, recallNamespacesForPrincipal } from "./namespaces/principal.js";
15
16
  import type { Orchestrator } from "./orchestrator.js";
16
17
  import {
@@ -207,8 +208,8 @@ export class AccessLcmSurface {
207
208
  lcmEnabled: true,
208
209
  };
209
210
  }
210
- // Query each LCM read key in order, merging + deduping rows (by
211
- // sessionId+turnIndex) and preserving first-seen order, capped at `limit`.
211
+ // Query each LCM read key in order, merging + deduping by stable archive-row
212
+ // identity and preserving first-seen order, capped at `limit`.
212
213
  // Use allSettled so one corrupt/failed namespace key cannot discard sibling
213
214
  // results from other authorized profile namespaces.
214
215
  const seenRows = new Set<string>();
@@ -216,7 +217,14 @@ export class AccessLcmSurface {
216
217
  const lcmSearches: Array<{
217
218
  key: string | undefined;
218
219
  prefix: string | undefined;
219
- promise: Promise<Array<{ session_id: string; content: string; turn_index: number }>>;
220
+ promise: Promise<
221
+ Array<{
222
+ id?: number;
223
+ session_id: string;
224
+ content: string;
225
+ turn_index: number;
226
+ }>
227
+ >;
220
228
  }> = [];
221
229
  for (const lcmSessionKey of lcmSessionKeyIds) {
222
230
  for (const lcmSessionPrefix of lcmSessionPrefixes) {
@@ -228,7 +236,14 @@ export class AccessLcmSurface {
228
236
  limit,
229
237
  lcmSessionKey,
230
238
  lcmSessionPrefix,
231
- ) as Promise<Array<{ session_id: string; content: string; turn_index: number }>>,
239
+ ) as Promise<
240
+ Array<{
241
+ id?: number;
242
+ session_id: string;
243
+ content: string;
244
+ turn_index: number;
245
+ }>
246
+ >,
232
247
  });
233
248
  }
234
249
  }
@@ -246,7 +261,7 @@ export class AccessLcmSurface {
246
261
  continue;
247
262
  }
248
263
  for (const r of settled.value) {
249
- const dedupeKey = `${r.session_id}\0${r.turn_index}`;
264
+ const dedupeKey = lcmEvidenceIdentity(r, r.session_id).id;
250
265
  if (seenRows.has(dedupeKey)) continue;
251
266
  seenRows.add(dedupeKey);
252
267
  results.push({
@@ -18,6 +18,7 @@ import { throwIfAborted } from "./abort-error.js";
18
18
  import { resolveNamespaceCapabilities } from "./capabilities.js";
19
19
  import { resolveCodingNamespaceOverlay } from "./coding/coding-namespace.js";
20
20
  import { type BudgetDecision, CrossNamespaceBudget } from "./cross-namespace-budget.js";
21
+ import { lcmEvidenceIdentity } from "./lcm/evidence-identity.js";
21
22
  import { normalizeProjectionTags } from "./memory-projection-format.js";
22
23
  import { namespaceIdentityFromToken } from "./namespaces/identity.js";
23
24
  import { canReadNamespace, defaultNamespaceForPrincipal, recallNamespacesForPrincipal, resolvePrincipal } from "./namespaces/principal.js";
@@ -593,7 +594,7 @@ export class AccessRecallSurface {
593
594
  if (excerpts.length >= limit) break;
594
595
  if (result.status !== "fulfilled") continue;
595
596
  for (const r of result.value) {
596
- const dedupeKey = `${r.session_id} ${r.turn_index}`;
597
+ const dedupeKey = lcmEvidenceIdentity(r, r.session_id).id;
597
598
  if (seenRows.has(dedupeKey)) continue;
598
599
  seenRows.add(dedupeKey);
599
600
  excerpts.push({
@@ -1,5 +1,6 @@
1
1
  import { buildEvidencePack, type EvidencePackItem } from "./evidence-pack.js";
2
2
  import type { ExplicitCueRecallEngine } from "./explicit-cue-recall.js";
3
+ import { lcmEvidenceIdentity } from "./lcm/evidence-identity.js";
3
4
 
4
5
  import {
5
6
  unifiedDedupeAndRank,
@@ -205,13 +206,14 @@ async function collectEventOrderItems(
205
206
  windowTokens,
206
207
  );
207
208
  for (const message of messages) {
208
- const id = `${options.sessionId}:${message.turn_index}`;
209
+ const identity = lcmEvidenceIdentity(message, options.sessionId);
210
+ const id = identity.id;
209
211
  if (seen.has(id)) continue;
210
212
  if (!isEventOrderCandidate(message.content, message.role, options.query)) continue;
211
213
  seen.add(id);
212
214
  items.push({
213
- id,
214
- sessionId: options.sessionId,
215
+ ...identity,
216
+ sessionId: message.session_id ?? options.sessionId,
215
217
  turnIndex: message.turn_index,
216
218
  role: message.role,
217
219
  content: appendChronologicalCues(message.content, options.query),
@@ -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
+ });