@remnic/core 9.69.47 → 9.69.48

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 (117) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -1
  2. package/dist/access-admin-ops-surface.js +2 -2
  3. package/dist/access-authorization-probe.d.ts +1 -1
  4. package/dist/access-authorization-probe.js +3 -3
  5. package/dist/access-boundary.d.ts +1 -1
  6. package/dist/access-boundary.js +2 -2
  7. package/dist/access-cli.js +19 -19
  8. package/dist/access-extraction-force-flush.d.ts +1 -1
  9. package/dist/access-extraction-force-flush.js +2 -2
  10. package/dist/access-http-briefing.d.ts +1 -1
  11. package/dist/access-http-briefing.js +3 -3
  12. package/dist/access-http-lcm-compaction.d.ts +1 -1
  13. package/dist/access-http-lifecycle-flush.d.ts +1 -1
  14. package/dist/access-http-offline-stream.d.ts +1 -1
  15. package/dist/access-http-query.js +2 -2
  16. package/dist/access-http.d.ts +2 -2
  17. package/dist/access-http.js +14 -14
  18. package/dist/access-identity-continuity-surface.js +2 -2
  19. package/dist/access-lcm-surface.d.ts +1 -1
  20. package/dist/access-lcm-surface.js +2 -2
  21. package/dist/access-mcp-shared-context-tools.d.ts +1 -1
  22. package/dist/access-mcp.d.ts +1 -1
  23. package/dist/access-mcp.js +9 -9
  24. package/dist/access-namespace-preflight.js +2 -2
  25. package/dist/access-observe-write-surface.d.ts +1 -1
  26. package/dist/access-observe-write-surface.js +2 -2
  27. package/dist/access-operations-batch.js +3 -3
  28. package/dist/access-operations.d.ts +1 -1
  29. package/dist/access-operations.js +8 -8
  30. package/dist/access-recall-concurrency.d.ts +1 -1
  31. package/dist/access-recall-concurrency.js +2 -2
  32. package/dist/access-recall-response.d.ts +1 -1
  33. package/dist/access-recall-response.js +2 -2
  34. package/dist/access-recall-surface.d.ts +1 -1
  35. package/dist/access-recall-surface.js +2 -2
  36. package/dist/access-schema.d.ts +113 -113
  37. package/dist/{access-service-BXYrJ3pO.d.ts → access-service-DUkTWyZS.d.ts} +64 -64
  38. package/dist/access-service-helpers.d.ts +1 -1
  39. package/dist/access-service.d.ts +1 -1
  40. package/dist/access-service.js +2 -2
  41. package/dist/access-surface-catalog.d.ts +1 -1
  42. package/dist/access-surface-catalog.js +4 -4
  43. package/dist/{chunk-NMA7RQPR.js → chunk-2B2RHLHI.js} +2 -2
  44. package/dist/{chunk-MMQVWKFY.js → chunk-32ZBIGID.js} +8 -8
  45. package/dist/{chunk-JXLEQIJ7.js → chunk-7DU2F7LM.js} +2 -2
  46. package/dist/{chunk-SJ7ZNUXB.js → chunk-B4WI7OF2.js} +2 -2
  47. package/dist/{chunk-YOSLKZLZ.js → chunk-BIXELUIR.js} +2 -2
  48. package/dist/{chunk-R4JTUTU6.js → chunk-BMBAA2M5.js} +2 -2
  49. package/dist/{chunk-QKFYJVDG.js → chunk-BNX2TUSF.js} +2 -2
  50. package/dist/{chunk-7ZNJN5WZ.js → chunk-IHOXK2I6.js} +55 -6
  51. package/dist/chunk-IHOXK2I6.js.map +1 -0
  52. package/dist/{chunk-2NKY7OC6.js → chunk-IMJPJY7V.js} +2 -2
  53. package/dist/{chunk-G2SJRFGP.js → chunk-JIURESYF.js} +2 -2
  54. package/dist/{chunk-AS4YKT75.js → chunk-KPYMORPQ.js} +2 -2
  55. package/dist/{chunk-BMENHAJL.js → chunk-KVIMQAER.js} +2 -2
  56. package/dist/{chunk-44BILQ7U.js → chunk-MKJFPIVG.js} +4 -4
  57. package/dist/{chunk-NE45P3OF.js → chunk-MKLDZNBD.js} +2 -2
  58. package/dist/{chunk-2QX65IEC.js → chunk-MUNR43V3.js} +2 -2
  59. package/dist/{chunk-V2XNMIAM.js → chunk-NNFB4CU4.js} +2 -2
  60. package/dist/{chunk-ROBGBT3D.js → chunk-R32AEEU3.js} +7 -7
  61. package/dist/{chunk-2JFSQWFH.js → chunk-TW4MXM7H.js} +3 -3
  62. package/dist/{chunk-GXJSLNYO.js → chunk-XYGINDIJ.js} +2 -2
  63. package/dist/{cli-B8YyIrPR.d.ts → cli-Bbndoc6k.d.ts} +1 -1
  64. package/dist/cli.d.ts +2 -2
  65. package/dist/cli.js +15 -15
  66. package/dist/deep-recall-http-glue.d.ts +1 -1
  67. package/dist/deep-recall-mcp-tools.d.ts +1 -1
  68. package/dist/entity-retrieval.js +2 -2
  69. package/dist/external-wiki-access.d.ts +1 -1
  70. package/dist/external-wiki-access.js +3 -3
  71. package/dist/external-wiki-mcp-tools.d.ts +1 -1
  72. package/dist/index.d.ts +681 -681
  73. package/dist/index.js +23 -19
  74. package/dist/mcp-memory-inspector-app.d.ts +1 -1
  75. package/dist/memory-browse-http-glue.d.ts +1 -1
  76. package/dist/memory-browse-mcp-tools.d.ts +1 -1
  77. package/dist/memory-browse-operations.js +3 -3
  78. package/dist/memory-subject-cli.d.ts +1 -1
  79. package/dist/memory-subject.d.ts +1 -1
  80. package/dist/orchestrator.js +19 -19
  81. package/dist/{public-http-VB85y0ZH.d.ts → public-http-DaHHhWRR.d.ts} +1 -1
  82. package/dist/recall-context-composition.d.ts +43 -3
  83. package/dist/recall-context-composition.js +5 -1
  84. package/dist/recall-navigation-http-glue.d.ts +1 -1
  85. package/dist/recall-navigation-mcp-tools.d.ts +1 -1
  86. package/dist/recall-navigation-operations.js +3 -3
  87. package/dist/recall-navigation.js +2 -2
  88. package/dist/schemas.d.ts +160 -160
  89. package/dist/shared-context/manager.d.ts +6 -6
  90. package/dist/support-passport/index.d.ts +4 -4
  91. package/dist/support-passport/index.js +5 -5
  92. package/dist/temporal-timeline-recall.js +2 -2
  93. package/dist/transfer/types.d.ts +78 -78
  94. package/dist/who-knows-cli.d.ts +1 -1
  95. package/dist/who-knows.d.ts +1 -1
  96. package/package.json +2 -2
  97. package/src/recall-context-composition.test.ts +66 -0
  98. package/src/recall-context-composition.ts +102 -2
  99. package/dist/chunk-7ZNJN5WZ.js.map +0 -1
  100. /package/dist/{chunk-NMA7RQPR.js.map → chunk-2B2RHLHI.js.map} +0 -0
  101. /package/dist/{chunk-MMQVWKFY.js.map → chunk-32ZBIGID.js.map} +0 -0
  102. /package/dist/{chunk-JXLEQIJ7.js.map → chunk-7DU2F7LM.js.map} +0 -0
  103. /package/dist/{chunk-SJ7ZNUXB.js.map → chunk-B4WI7OF2.js.map} +0 -0
  104. /package/dist/{chunk-YOSLKZLZ.js.map → chunk-BIXELUIR.js.map} +0 -0
  105. /package/dist/{chunk-R4JTUTU6.js.map → chunk-BMBAA2M5.js.map} +0 -0
  106. /package/dist/{chunk-QKFYJVDG.js.map → chunk-BNX2TUSF.js.map} +0 -0
  107. /package/dist/{chunk-2NKY7OC6.js.map → chunk-IMJPJY7V.js.map} +0 -0
  108. /package/dist/{chunk-G2SJRFGP.js.map → chunk-JIURESYF.js.map} +0 -0
  109. /package/dist/{chunk-AS4YKT75.js.map → chunk-KPYMORPQ.js.map} +0 -0
  110. /package/dist/{chunk-BMENHAJL.js.map → chunk-KVIMQAER.js.map} +0 -0
  111. /package/dist/{chunk-44BILQ7U.js.map → chunk-MKJFPIVG.js.map} +0 -0
  112. /package/dist/{chunk-NE45P3OF.js.map → chunk-MKLDZNBD.js.map} +0 -0
  113. /package/dist/{chunk-2QX65IEC.js.map → chunk-MUNR43V3.js.map} +0 -0
  114. /package/dist/{chunk-V2XNMIAM.js.map → chunk-NNFB4CU4.js.map} +0 -0
  115. /package/dist/{chunk-ROBGBT3D.js.map → chunk-R32AEEU3.js.map} +0 -0
  116. /package/dist/{chunk-2JFSQWFH.js.map → chunk-TW4MXM7H.js.map} +0 -0
  117. /package/dist/{chunk-GXJSLNYO.js.map → chunk-XYGINDIJ.js.map} +0 -0
@@ -35,6 +35,33 @@ const TRIM_MARKER = "\n\n...(memory context trimmed)";
35
35
  export interface RecallContextComposition {
36
36
  context: string;
37
37
  footer?: string;
38
+ /**
39
+ * Machine-readable degradation marker (#2972). Absent on a healthy
40
+ * recall so the healthy wire shape stays byte-stable. Budget warnings
41
+ * ride here — never inside the injected text — so the block stays
42
+ * cache-stable while degradation stays inspectable.
43
+ */
44
+ degradation?: RecallContextDegradation;
45
+ }
46
+
47
+ export type RecallDegradationState = "complete" | "degraded" | "missing";
48
+
49
+ export type RecallDegradationReason =
50
+ | "budget-clipped"
51
+ | "budget-compacted"
52
+ | "backend-unavailable";
53
+
54
+ export interface RecallContextDegradation {
55
+ state: RecallDegradationState;
56
+ reason: RecallDegradationReason;
57
+ /** Operator-facing detail (e.g. a SearchDegradation code). */
58
+ detail?: string;
59
+ /** Budget accounting, present on budget-driven degradation. */
60
+ budget?: {
61
+ contextBudget: number;
62
+ fullChars: number;
63
+ deliveredChars: number;
64
+ };
38
65
  }
39
66
 
40
67
  export interface CuriosityQuestion {
@@ -53,6 +80,14 @@ export interface RenderedMemoryContextPrompt {
53
80
 
54
81
  export interface RenderMemoryContextPromptInput extends RecallContextComposition {
55
82
  maxChars: number;
83
+ /**
84
+ * Pre-rendered shallow form of every entry (#2972). When the full
85
+ * context exceeds budget, a fitting compact form is delivered instead
86
+ * of clipping the tail — breadth-complete-but-shallow over
87
+ * deep-but-amputated. Ignored unless strictly shorter than the full
88
+ * context and within budget.
89
+ */
90
+ compactContext?: string;
56
91
  }
57
92
 
58
93
  function trimText(value: string | undefined): string {
@@ -96,14 +131,77 @@ export function boundRecallContextComposition({
96
131
  context: rawContext,
97
132
  footer: rawFooter,
98
133
  maxChars,
134
+ compactContext: rawCompactContext,
99
135
  }: RenderMemoryContextPromptInput): RecallContextComposition {
100
136
  if (!Number.isFinite(maxChars) || maxChars <= 0) return { context: "" };
101
137
 
102
138
  const limit = Math.floor(maxChars);
103
139
  const footer = trimText(rawFooter);
104
- const context = truncateToBudget(trimText(rawContext), contextBudgetForFooter(limit, footer));
140
+ const contextBudget = contextBudgetForFooter(limit, footer);
141
+ const fullContext = trimText(rawContext);
142
+ let context = fullContext;
143
+ let degradation: RecallContextDegradation | undefined;
144
+ if (fullContext.length > contextBudget) {
145
+ const compactContext = trimText(rawCompactContext);
146
+ if (
147
+ compactContext.length > 0 &&
148
+ compactContext.length <= contextBudget &&
149
+ compactContext.length < fullContext.length
150
+ ) {
151
+ context = compactContext;
152
+ degradation = {
153
+ state: "degraded",
154
+ reason: "budget-compacted",
155
+ budget: {
156
+ contextBudget,
157
+ fullChars: fullContext.length,
158
+ deliveredChars: compactContext.length,
159
+ },
160
+ };
161
+ } else {
162
+ context = truncateToBudget(fullContext, contextBudget);
163
+ degradation = {
164
+ state: "degraded",
165
+ reason: "budget-clipped",
166
+ budget: {
167
+ contextBudget,
168
+ fullChars: fullContext.length,
169
+ deliveredChars: context.length,
170
+ },
171
+ };
172
+ }
173
+ }
174
+ // Footer truncation is fixed overhead, not lost memory content; the
175
+ // degradation contract covers the recall context only.
105
176
  const boundedFooter = footer.length > limit ? truncateToBudget(footer, limit) : footer;
106
- return { context, ...(boundedFooter ? { footer: boundedFooter } : {}) };
177
+ return {
178
+ context,
179
+ ...(boundedFooter ? { footer: boundedFooter } : {}),
180
+ ...(degradation ? { degradation } : {}),
181
+ };
182
+ }
183
+
184
+ export const MEMORY_CONTEXT_UNAVAILABLE_NOTE =
185
+ "Memory context unavailable for this turn: recall failed. " +
186
+ "This means the memory backend could not be queried — it does not mean " +
187
+ "no relevant memories exist.";
188
+
189
+ /**
190
+ * Missing state (#2972): a failed recall path composes this INSTEAD of an
191
+ * empty or silently truncated context, so "backend failed" is never
192
+ * indistinguishable from "no relevant memories" (the injection-side twin
193
+ * of Review-Prevention rule 22). Replace the bounded composition with
194
+ * this result on failure; do not run it back through bounding.
195
+ */
196
+ export function composeMissingMemoryContext(input: { detail?: string } = {}): RecallContextComposition {
197
+ return {
198
+ context: MEMORY_CONTEXT_UNAVAILABLE_NOTE,
199
+ degradation: {
200
+ state: "missing",
201
+ reason: "backend-unavailable",
202
+ ...(input.detail ? { detail: input.detail } : {}),
203
+ },
204
+ };
107
205
  }
108
206
  export function composeRecallContext(composition: RecallContextComposition): string {
109
207
  const context = trimText(composition.context);
@@ -117,11 +215,13 @@ export function renderMemoryContextPrompt({
117
215
  context: rawContext,
118
216
  footer: rawFooter,
119
217
  maxChars,
218
+ compactContext: rawCompactContext,
120
219
  }: RenderMemoryContextPromptInput): RenderedMemoryContextPrompt | null {
121
220
  const bounded = boundRecallContextComposition({
122
221
  context: rawContext,
123
222
  footer: rawFooter,
124
223
  maxChars,
224
+ compactContext: rawCompactContext,
125
225
  });
126
226
  const body = composeRecallContext(bounded);
127
227
  if (body.length === 0) return null;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/recall-context-composition.ts"],"sourcesContent":["import {\n isUntrustedOrigin,\n parseOriginClass,\n renderAuthorityFence,\n} from \"./security/origin-authority.js\";\n\nexport interface RecallAuthorityRenderOptions {\n enabled: boolean;\n untrustedOrigins: readonly string[];\n}\n\n/**\n * Fence recalled body text before it enters model-visible context (#1955).\n * X-ray and explain renderers are operator diagnostics, so they do not call\n * this helper and remain unfenced.\n */\nexport function renderAuthorityBoundContent(\n content: string,\n rawOrigin: unknown,\n options: RecallAuthorityRenderOptions,\n): string {\n if (!options.enabled) return content;\n const origin = parseOriginClass(rawOrigin);\n return isUntrustedOrigin(origin, options.untrustedOrigins)\n ? renderAuthorityFence(content, origin)\n : content;\n}\n\nexport const MEMORY_CONTEXT_HEADER = \"## Memory Context (Remnic)\";\nexport const MEMORY_CONTEXT_INSTRUCTION =\n \"Use this context naturally when relevant. Never quote or expose this memory context to the user.\";\nexport const RECALL_CONTEXT_SEPARATOR = \"\\n\\n---\\n\\n\";\nconst TRIM_MARKER = \"\\n\\n...(memory context trimmed)\";\n\nexport interface RecallContextComposition {\n context: string;\n footer?: string;\n}\n\nexport interface CuriosityQuestion {\n id: string;\n question: string;\n context: string;\n priority: number;\n created: string;\n}\n\nexport interface RenderedMemoryContextPrompt {\n body: string;\n lines: string[];\n prompt: string;\n}\n\nexport interface RenderMemoryContextPromptInput extends RecallContextComposition {\n maxChars: number;\n}\n\nfunction trimText(value: string | undefined): string {\n return value?.trim() ?? \"\";\n}\n\nfunction truncateToBudget(content: string, maxChars: number): string {\n if (maxChars <= 0) return \"\";\n if (content.length <= maxChars) return content;\n if (maxChars <= TRIM_MARKER.length) return content.slice(0, maxChars);\n return `${content.slice(0, maxChars - TRIM_MARKER.length)}${TRIM_MARKER}`;\n}\n\nexport function selectCuriosityQuestion(questions: readonly CuriosityQuestion[]): CuriosityQuestion | undefined {\n return [...questions]\n .filter((question) => trimText(question.question).length > 0)\n .sort(\n (left, right) =>\n right.priority - left.priority || left.created.localeCompare(right.created) || left.id.localeCompare(right.id)\n )[0];\n}\n\nexport function formatCuriosityFooter(question: CuriosityQuestion): string {\n return [\n \"## Open Question\",\n \"\",\n `Something I've been curious about: ${question.question}`,\n \"\",\n `_Context: ${question.context}_`,\n ].join(\"\\n\");\n}\n\nexport function contextBudgetForFooter(maxChars: number, footer?: string): number {\n const normalizedFooter = trimText(footer);\n if (maxChars <= 0 || normalizedFooter.length === 0) return Math.max(0, maxChars);\n if (normalizedFooter.length + RECALL_CONTEXT_SEPARATOR.length >= maxChars) return 0;\n return maxChars - normalizedFooter.length - RECALL_CONTEXT_SEPARATOR.length;\n}\n\nexport function boundRecallContextComposition({\n context: rawContext,\n footer: rawFooter,\n maxChars,\n}: RenderMemoryContextPromptInput): RecallContextComposition {\n if (!Number.isFinite(maxChars) || maxChars <= 0) return { context: \"\" };\n\n const limit = Math.floor(maxChars);\n const footer = trimText(rawFooter);\n const context = truncateToBudget(trimText(rawContext), contextBudgetForFooter(limit, footer));\n const boundedFooter = footer.length > limit ? truncateToBudget(footer, limit) : footer;\n return { context, ...(boundedFooter ? { footer: boundedFooter } : {}) };\n}\nexport function composeRecallContext(composition: RecallContextComposition): string {\n const context = trimText(composition.context);\n const footer = trimText(composition.footer);\n if (context.length === 0) return footer;\n if (footer.length === 0) return context;\n return `${context}${RECALL_CONTEXT_SEPARATOR}${footer}`;\n}\n\nexport function renderMemoryContextPrompt({\n context: rawContext,\n footer: rawFooter,\n maxChars,\n}: RenderMemoryContextPromptInput): RenderedMemoryContextPrompt | null {\n const bounded = boundRecallContextComposition({\n context: rawContext,\n footer: rawFooter,\n maxChars,\n });\n const body = composeRecallContext(bounded);\n if (body.length === 0) return null;\n\n const boundedBody = body.length <= maxChars ? body : truncateToBudget(bounded.footer || body, Math.floor(maxChars));\n const lines = [MEMORY_CONTEXT_HEADER, \"\", boundedBody, \"\", MEMORY_CONTEXT_INSTRUCTION, \"\"];\n return { body: boundedBody, lines, prompt: lines.join(\"\\n\").replace(/\\n$/, \"\") };\n}\n"],"mappings":"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","names":[]}