@remnic/core 1.0.3 → 1.1.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 (148) hide show
  1. package/dist/abort-error.d.ts +32 -0
  2. package/dist/abort-error.js +11 -0
  3. package/dist/access-cli.js +41 -40
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +3 -2
  6. package/dist/access-http.js +11 -11
  7. package/dist/access-mcp.d.ts +3 -2
  8. package/dist/access-mcp.js +7 -7
  9. package/dist/access-schema.d.ts +16 -16
  10. package/dist/access-service-HmO1Trrx.d.ts +732 -0
  11. package/dist/access-service.d.ts +11 -658
  12. package/dist/access-service.js +9 -9
  13. package/dist/bootstrap.d.ts +1 -1
  14. package/dist/briefing.js +6 -6
  15. package/dist/calibration.js +3 -3
  16. package/dist/causal-consolidation.js +10 -10
  17. package/dist/{chunk-PMB3WGDL.js → chunk-37UIFYWO.js} +64 -3
  18. package/dist/chunk-37UIFYWO.js.map +1 -0
  19. package/dist/{chunk-X4WESCKA.js → chunk-3QHL5ABG.js} +5 -5
  20. package/dist/{chunk-2VFW5K5U.js → chunk-3SV6CQHO.js} +10 -8
  21. package/dist/chunk-3SV6CQHO.js.map +1 -0
  22. package/dist/{chunk-U2IQTSBY.js → chunk-3WHVNEN7.js} +1 -1
  23. package/dist/chunk-3WHVNEN7.js.map +1 -0
  24. package/dist/{chunk-QKAH5B6E.js → chunk-44ICJRF3.js} +97 -9
  25. package/dist/chunk-44ICJRF3.js.map +1 -0
  26. package/dist/{chunk-S4LX5EBI.js → chunk-47UU5PU2.js} +48 -9
  27. package/dist/chunk-47UU5PU2.js.map +1 -0
  28. package/dist/{chunk-ECKDIK5F.js → chunk-4LACOVZX.js} +2 -2
  29. package/dist/{chunk-AYPYCLR7.js → chunk-6LX5ORAS.js} +2 -2
  30. package/dist/{chunk-GJQPH5G3.js → chunk-6UJ47TVX.js} +2 -2
  31. package/dist/{chunk-KWP7T3DP.js → chunk-7ECD5ATE.js} +2 -2
  32. package/dist/{chunk-74JR4N5J.js → chunk-7WQ6SLIE.js} +2 -2
  33. package/dist/{chunk-7PA4OZEU.js → chunk-BLKTA7MM.js} +6 -14
  34. package/dist/chunk-BLKTA7MM.js.map +1 -0
  35. package/dist/{chunk-XMGSSBFX.js → chunk-DEPL3635.js} +172 -100
  36. package/dist/chunk-DEPL3635.js.map +1 -0
  37. package/dist/{chunk-JROGC36Y.js → chunk-DHHP2Z4X.js} +2 -2
  38. package/dist/{chunk-BKQJBXXX.js → chunk-GGD5W7TB.js} +2 -2
  39. package/dist/chunk-GGD5W7TB.js.map +1 -0
  40. package/dist/{chunk-POMSFKTB.js → chunk-GV6NLQ4X.js} +14 -14
  41. package/dist/{chunk-AAI7JARD.js → chunk-HMDCOMYU.js} +8 -11
  42. package/dist/chunk-HMDCOMYU.js.map +1 -0
  43. package/dist/{chunk-POBPGDWI.js → chunk-ITRLGI2T.js} +2 -2
  44. package/dist/{chunk-MYQWXITD.js → chunk-JIU55F3X.js} +2 -2
  45. package/dist/{chunk-UPMD5XND.js → chunk-JL2PU6AI.js} +16 -5
  46. package/dist/chunk-JL2PU6AI.js.map +1 -0
  47. package/dist/{chunk-OJFGVJS6.js → chunk-MBJHSA7F.js} +65 -9
  48. package/dist/chunk-MBJHSA7F.js.map +1 -0
  49. package/dist/{chunk-V7XCAHIB.js → chunk-MVTHXUBX.js} +46 -23
  50. package/dist/chunk-MVTHXUBX.js.map +1 -0
  51. package/dist/{chunk-BTY5RRRF.js → chunk-N42IWANG.js} +5 -5
  52. package/dist/{chunk-NSB3WSYS.js → chunk-NQEVYWX6.js} +74 -3
  53. package/dist/chunk-NQEVYWX6.js.map +1 -0
  54. package/dist/chunk-OIT5QGG4.js +80 -0
  55. package/dist/chunk-OIT5QGG4.js.map +1 -0
  56. package/dist/chunk-PVGDJXVK.js +21 -0
  57. package/dist/chunk-PVGDJXVK.js.map +1 -0
  58. package/dist/{chunk-RCICHSHL.js → chunk-SYUK3VLY.js} +2 -2
  59. package/dist/{chunk-YFYL2SIJ.js → chunk-WBSAYXVI.js} +127 -39
  60. package/dist/chunk-WBSAYXVI.js.map +1 -0
  61. package/dist/{chunk-KEG4GNGI.js → chunk-XZ2TIKGC.js} +38 -8
  62. package/dist/chunk-XZ2TIKGC.js.map +1 -0
  63. package/dist/chunk-Y4FHOFJ2.js +140 -0
  64. package/dist/chunk-Y4FHOFJ2.js.map +1 -0
  65. package/dist/chunk-YNB73F22.js +137 -0
  66. package/dist/chunk-YNB73F22.js.map +1 -0
  67. package/dist/{chunk-HITJFT7E.js → chunk-ZVBB3T7V.js} +10 -5
  68. package/dist/chunk-ZVBB3T7V.js.map +1 -0
  69. package/dist/{cli-DwIBnp2g.d.ts → cli-BneVIEvh.d.ts} +2 -2
  70. package/dist/cli.d.ts +4 -3
  71. package/dist/cli.js +25 -24
  72. package/dist/config.js +1 -1
  73. package/dist/contradiction-review-WIUBAR52.js +21 -0
  74. package/dist/contradiction-review-WIUBAR52.js.map +1 -0
  75. package/dist/contradiction-scan-GR33PONM.js +376 -0
  76. package/dist/contradiction-scan-GR33PONM.js.map +1 -0
  77. package/dist/direct-answer-wiring.d.ts +77 -0
  78. package/dist/direct-answer-wiring.js +75 -0
  79. package/dist/direct-answer-wiring.js.map +1 -0
  80. package/dist/direct-answer.d.ts +106 -0
  81. package/dist/direct-answer.js +10 -0
  82. package/dist/direct-answer.js.map +1 -0
  83. package/dist/{engine-X7X3AAG3.js → engine-5TIQBYZR.js} +7 -7
  84. package/dist/engine-5TIQBYZR.js.map +1 -0
  85. package/dist/entity-retrieval.js +6 -6
  86. package/dist/explicit-capture.d.ts +1 -1
  87. package/dist/extraction.js +6 -6
  88. package/dist/fallback-llm.d.ts +11 -2
  89. package/dist/fallback-llm.js +3 -3
  90. package/dist/harmonic-retrieval.js +2 -1
  91. package/dist/index.d.ts +10 -124
  92. package/dist/index.js +74 -137
  93. package/dist/index.js.map +1 -1
  94. package/dist/intent.js +1 -1
  95. package/dist/local-llm.d.ts +10 -3
  96. package/dist/local-llm.js +1 -1
  97. package/dist/operator-toolkit.js +12 -11
  98. package/dist/{orchestrator-B9kwlCep.d.ts → orchestrator-DRYA6_lW.d.ts} +21 -2
  99. package/dist/orchestrator.d.ts +1 -1
  100. package/dist/orchestrator.js +36 -35
  101. package/dist/qmd.js +2 -1
  102. package/dist/recall-state.d.ts +28 -1
  103. package/dist/recall-state.js +1 -1
  104. package/dist/resolution-QBTDHTG7.js +100 -0
  105. package/dist/resolution-QBTDHTG7.js.map +1 -0
  106. package/dist/resolve-provider-secret.d.ts +24 -1
  107. package/dist/resolve-provider-secret.js +3 -1
  108. package/dist/resume-bundles.js +3 -3
  109. package/dist/schemas.d.ts +14 -14
  110. package/dist/semantic-consolidation.js +6 -6
  111. package/dist/semantic-rule-promotion.js +6 -6
  112. package/dist/semantic-rule-verifier.js +6 -6
  113. package/dist/storage.js +5 -5
  114. package/dist/summarizer.js +5 -5
  115. package/dist/types-DJhqDJUV.d.ts +50 -0
  116. package/dist/types.d.ts +34 -2
  117. package/dist/types.js +1 -1
  118. package/dist/verified-recall.js +6 -6
  119. package/package.json +1 -1
  120. package/dist/chunk-2VFW5K5U.js.map +0 -1
  121. package/dist/chunk-7PA4OZEU.js.map +0 -1
  122. package/dist/chunk-AAI7JARD.js.map +0 -1
  123. package/dist/chunk-BKQJBXXX.js.map +0 -1
  124. package/dist/chunk-HITJFT7E.js.map +0 -1
  125. package/dist/chunk-KEG4GNGI.js.map +0 -1
  126. package/dist/chunk-NSB3WSYS.js.map +0 -1
  127. package/dist/chunk-OJFGVJS6.js.map +0 -1
  128. package/dist/chunk-PMB3WGDL.js.map +0 -1
  129. package/dist/chunk-QKAH5B6E.js.map +0 -1
  130. package/dist/chunk-S4LX5EBI.js.map +0 -1
  131. package/dist/chunk-U2IQTSBY.js.map +0 -1
  132. package/dist/chunk-UPMD5XND.js.map +0 -1
  133. package/dist/chunk-V7XCAHIB.js.map +0 -1
  134. package/dist/chunk-XMGSSBFX.js.map +0 -1
  135. package/dist/chunk-YFYL2SIJ.js.map +0 -1
  136. /package/dist/{engine-X7X3AAG3.js.map → abort-error.js.map} +0 -0
  137. /package/dist/{chunk-X4WESCKA.js.map → chunk-3QHL5ABG.js.map} +0 -0
  138. /package/dist/{chunk-ECKDIK5F.js.map → chunk-4LACOVZX.js.map} +0 -0
  139. /package/dist/{chunk-AYPYCLR7.js.map → chunk-6LX5ORAS.js.map} +0 -0
  140. /package/dist/{chunk-GJQPH5G3.js.map → chunk-6UJ47TVX.js.map} +0 -0
  141. /package/dist/{chunk-KWP7T3DP.js.map → chunk-7ECD5ATE.js.map} +0 -0
  142. /package/dist/{chunk-74JR4N5J.js.map → chunk-7WQ6SLIE.js.map} +0 -0
  143. /package/dist/{chunk-JROGC36Y.js.map → chunk-DHHP2Z4X.js.map} +0 -0
  144. /package/dist/{chunk-POMSFKTB.js.map → chunk-GV6NLQ4X.js.map} +0 -0
  145. /package/dist/{chunk-POBPGDWI.js.map → chunk-ITRLGI2T.js.map} +0 -0
  146. /package/dist/{chunk-MYQWXITD.js.map → chunk-JIU55F3X.js.map} +0 -0
  147. /package/dist/{chunk-BTY5RRRF.js.map → chunk-N42IWANG.js.map} +0 -0
  148. /package/dist/{chunk-RCICHSHL.js.map → chunk-SYUK3VLY.js.map} +0 -0
package/dist/intent.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  intentCompatibilityScore,
5
5
  isTaskInitiationIntent,
6
6
  planRecallMode
7
- } from "./chunk-BKQJBXXX.js";
7
+ } from "./chunk-GGD5W7TB.js";
8
8
  export {
9
9
  hasBroadGraphIntent,
10
10
  inferIntentFromText,
@@ -52,9 +52,16 @@ declare class LocalLlmClient {
52
52
  private static readonly LMS_CACHE_INTERVAL_MS;
53
53
  constructor(config: PluginConfig, modelRegistry?: ModelRegistry);
54
54
  /**
55
- * Disable thinking/reasoning mode for models that support it (e.g. Qwen 3.5).
56
- * When enabled, adds chat_template_kwargs to suppress chain-of-thought,
57
- * reducing latency for fast-tier operations.
55
+ * Request thinking/reasoning suppression on the next chat completion.
56
+ *
57
+ * When `true`, the client will inject
58
+ * `chat_template_kwargs: { enable_thinking: false }` into the request
59
+ * body — **but only when the detected backend is known to support it**
60
+ * (LM Studio, vLLM; see `THINKING_COMPATIBLE_BACKENDS`). Strict
61
+ * OpenAI-compat backends reject unknown fields with 400; on those the
62
+ * client fails open (thinking runs normally). This is the safe
63
+ * default for Remnic extraction / consolidation: measurable latency
64
+ * win on thinking-capable backends, zero risk on others. Issue #548.
58
65
  */
59
66
  set disableThinking(value: boolean);
60
67
  private resolveHomeDir;
package/dist/local-llm.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  LocalLlmClient
3
- } from "./chunk-UPMD5XND.js";
3
+ } from "./chunk-JL2PU6AI.js";
4
4
  import "./chunk-LK6SGL53.js";
5
5
  import "./chunk-MARWOCVP.js";
6
6
  import "./chunk-2ODBA7MQ.js";
@@ -5,32 +5,33 @@ import {
5
5
  runOperatorInventory,
6
6
  runOperatorRepair,
7
7
  runOperatorSetup
8
- } from "./chunk-X4WESCKA.js";
9
- import "./chunk-HITJFT7E.js";
8
+ } from "./chunk-3QHL5ABG.js";
9
+ import "./chunk-ZVBB3T7V.js";
10
10
  import "./chunk-YRMVARQP.js";
11
+ import "./chunk-BLKTA7MM.js";
11
12
  import "./chunk-U66YHYC7.js";
12
- import "./chunk-7PA4OZEU.js";
13
+ import "./chunk-LK6SGL53.js";
13
14
  import "./chunk-7SEAZFFB.js";
14
15
  import "./chunk-K6WK37A6.js";
15
- import "./chunk-LK6SGL53.js";
16
- import "./chunk-OJFGVJS6.js";
16
+ import "./chunk-MBJHSA7F.js";
17
17
  import "./chunk-Z5LAYHGJ.js";
18
18
  import "./chunk-C2EFFULQ.js";
19
+ import "./chunk-PVGDJXVK.js";
19
20
  import "./chunk-MARWOCVP.js";
20
- import "./chunk-POBPGDWI.js";
21
+ import "./chunk-ITRLGI2T.js";
21
22
  import "./chunk-QNJMBKFK.js";
22
23
  import "./chunk-TBBDFYXW.js";
23
24
  import "./chunk-LPSF4OQH.js";
24
- import "./chunk-POMSFKTB.js";
25
- import "./chunk-U2IQTSBY.js";
25
+ import "./chunk-GV6NLQ4X.js";
26
+ import "./chunk-3WHVNEN7.js";
26
27
  import "./chunk-4KAN3GZ3.js";
27
28
  import "./chunk-6ZH4TU6I.js";
28
- import "./chunk-6PFRXT4K.js";
29
- import "./chunk-TP4FZJIZ.js";
30
29
  import "./chunk-SCU65EZI.js";
31
30
  import "./chunk-BOUYNNYD.js";
32
- import "./chunk-QSVPYQPG.js";
31
+ import "./chunk-6PFRXT4K.js";
32
+ import "./chunk-TP4FZJIZ.js";
33
33
  import "./chunk-DM2T26WE.js";
34
+ import "./chunk-QSVPYQPG.js";
34
35
  import "./chunk-M62O4P4T.js";
35
36
  import "./chunk-4DJQYKMN.js";
36
37
  import "./chunk-2ODBA7MQ.js";
@@ -240,11 +240,11 @@ declare const SharedFeedbackEntrySchema: z.ZodObject<{
240
240
  date: string;
241
241
  reason: string;
242
242
  confidence?: number | undefined;
243
+ workflow?: string | undefined;
243
244
  tags?: string[] | undefined;
244
245
  severity?: "low" | "medium" | "high" | undefined;
245
246
  outcome?: string | undefined;
246
247
  refs?: string[] | undefined;
247
- workflow?: string | undefined;
248
248
  learning?: string | undefined;
249
249
  evidenceWindowStart?: string | undefined;
250
250
  evidenceWindowEnd?: string | undefined;
@@ -254,11 +254,11 @@ declare const SharedFeedbackEntrySchema: z.ZodObject<{
254
254
  date: string;
255
255
  reason: string;
256
256
  confidence?: number | undefined;
257
+ workflow?: string | undefined;
257
258
  tags?: string[] | undefined;
258
259
  severity?: "low" | "medium" | "high" | undefined;
259
260
  outcome?: string | undefined;
260
261
  refs?: string[] | undefined;
261
- workflow?: string | undefined;
262
262
  learning?: string | undefined;
263
263
  evidenceWindowStart?: string | undefined;
264
264
  evidenceWindowEnd?: string | undefined;
@@ -917,6 +917,7 @@ declare class Orchestrator {
917
917
  private autoRegisterDaySummaryCron;
918
918
  private autoRegisterNightlyGovernanceCron;
919
919
  private autoRegisterProceduralMiningCron;
920
+ private autoRegisterContradictionScanCron;
920
921
  applyBehaviorRuntimePolicy(state: BehaviorLoopPolicyState): Promise<{
921
922
  applied: boolean;
922
923
  rolledBack: boolean;
@@ -1153,6 +1154,24 @@ declare class Orchestrator {
1153
1154
  * Called automatically when items are queued.
1154
1155
  */
1155
1156
  private processQueue;
1157
+ /**
1158
+ * Classify + log a failure from either the per-task catch inside
1159
+ * `processQueue()` or the outer `processQueue().catch(...)` in
1160
+ * `queueBufferedExtraction()`. Issue #549: `throwIfRecallAborted`
1161
+ * (used throughout `runExtraction`) raises an Error whose `name` is
1162
+ * `"AbortError"`. That path fires when `before_reset` aborts a
1163
+ * queued task to avoid duplicate extraction — it is intentional
1164
+ * cancellation, not a failure. Downgrading the log to debug
1165
+ * prevents spurious `error`-level lines that routinely appear
1166
+ * right next to a successful `persisted: N facts, M entities` log
1167
+ * and that confuse operators into thinking extraction is broken.
1168
+ * Genuine extraction failures (network, parse, I/O) still log at
1169
+ * `error`.
1170
+ *
1171
+ * Source differentiates the two call sites so the log message
1172
+ * names the right layer (`task` vs `processor`).
1173
+ */
1174
+ private logExtractionQueueFailure;
1156
1175
  private runExtraction;
1157
1176
  private recordProcessedExtractionFingerprint;
1158
1177
  private runTierMigrationCycle;
@@ -10,7 +10,7 @@ import './negative.js';
10
10
  import './recall-state.js';
11
11
  import './session-observer-state.js';
12
12
  import './embedding-fallback.js';
13
- export { l as GraphRecallRankedResult, m as GraphRecallShadowComparison, G as GraphRecallSnapshot, I as IntentDebugSnapshot, O as Orchestrator, Q as QmdRecallSnapshot, n as RecallInvocationOptions, o as RecallModeDecision, q as appendMemoryToGraphContext, r as blendGraphExpandedRecallScore, t as buildCompressionGuidelinesMarkdown, u as buildMemoryPathById, w as computeArtifactCandidateFetchLimit, x as computeArtifactRecallLimit, y as computeQmdHybridFetchLimit, z as dedupeEntitySynthesisEvidenceEntries, j as defaultWorkspaceDir, A as deriveTopicsFromExtraction, D as filterRecallCandidates, E as formatCompressionGuidelinesForRecall, F as graphPathRelativeToStorage, H as hasIdentityRecoveryIntent, J as isArtifactMemoryPath, K as lifecycleRecallScoreAdjustment, L as mergeArtifactRecallCandidates, M as mergeGraphExpandedResults, N as resolveEffectiveIdentityInjectionMode, P as resolveEffectiveRecallMode, S as resolvePersistedMemoryRelativePath, T as resolveRecallModeDecision, U as resolveRecentThreadMemoryPaths, s as sanitizeSessionKeyForFilename, V as shouldFilterLifecycleRecallCandidate, W as summarizeGraphShadowComparison } from './orchestrator-B9kwlCep.js';
13
+ export { l as GraphRecallRankedResult, m as GraphRecallShadowComparison, G as GraphRecallSnapshot, I as IntentDebugSnapshot, O as Orchestrator, Q as QmdRecallSnapshot, n as RecallInvocationOptions, o as RecallModeDecision, q as appendMemoryToGraphContext, r as blendGraphExpandedRecallScore, t as buildCompressionGuidelinesMarkdown, u as buildMemoryPathById, w as computeArtifactCandidateFetchLimit, x as computeArtifactRecallLimit, y as computeQmdHybridFetchLimit, z as dedupeEntitySynthesisEvidenceEntries, j as defaultWorkspaceDir, A as deriveTopicsFromExtraction, D as filterRecallCandidates, E as formatCompressionGuidelinesForRecall, F as graphPathRelativeToStorage, H as hasIdentityRecoveryIntent, J as isArtifactMemoryPath, K as lifecycleRecallScoreAdjustment, L as mergeArtifactRecallCandidates, M as mergeGraphExpandedResults, N as resolveEffectiveIdentityInjectionMode, P as resolveEffectiveRecallMode, S as resolvePersistedMemoryRelativePath, T as resolveRecallModeDecision, U as resolveRecentThreadMemoryPaths, s as sanitizeSessionKeyForFilename, V as shouldFilterLifecycleRecallCandidate, W as summarizeGraphShadowComparison } from './orchestrator-DRYA6_lW.js';
14
14
  import './types.js';
15
15
  import './semantic-consolidation-DrvSYRdB.js';
16
16
  import './policy-runtime.js';
@@ -26,67 +26,72 @@ import {
26
26
  sanitizeSessionKeyForFilename,
27
27
  shouldFilterLifecycleRecallCandidate,
28
28
  summarizeGraphShadowComparison
29
- } from "./chunk-XMGSSBFX.js";
30
- import "./chunk-JROGC36Y.js";
29
+ } from "./chunk-DEPL3635.js";
30
+ import "./chunk-DHHP2Z4X.js";
31
+ import "./chunk-UHGBNIOS.js";
31
32
  import "./chunk-FSFEQI74.js";
33
+ import "./chunk-N42IWANG.js";
34
+ import "./chunk-ETOW6ACV.js";
32
35
  import "./chunk-W6SL7OFG.js";
33
36
  import "./chunk-Z5AAYHUC.js";
34
37
  import "./chunk-S75M5ZRK.js";
35
38
  import "./chunk-TPB3I2AC.js";
36
- import "./chunk-UHGBNIOS.js";
37
- import "./chunk-BTY5RRRF.js";
38
- import "./chunk-ETOW6ACV.js";
39
- import "./chunk-KVE7R4CG.js";
40
39
  import "./chunk-JR4ZC3G4.js";
40
+ import "./chunk-KVE7R4CG.js";
41
+ import "./chunk-X7XN6YU4.js";
42
+ import "./chunk-5NPGSAVB.js";
41
43
  import "./chunk-C7VW7C3F.js";
42
44
  import "./chunk-K4FLSOR5.js";
43
45
  import "./chunk-V3RXWQIE.js";
44
46
  import "./chunk-5IZL4DCV.js";
47
+ import "./chunk-YCN4BVDK.js";
45
48
  import "./chunk-YDBIWGNI.js";
46
49
  import "./chunk-7DHTMOND.js";
47
- import "./chunk-S4LX5EBI.js";
48
- import "./chunk-X7XN6YU4.js";
49
- import "./chunk-5NPGSAVB.js";
50
- import "./chunk-YCN4BVDK.js";
50
+ import "./chunk-47UU5PU2.js";
51
51
  import "./chunk-D654IBA6.js";
52
52
  import "./chunk-H63EDPFJ.js";
53
- import "./chunk-BKQJBXXX.js";
54
53
  import "./chunk-YAZNBMNF.js";
55
- import "./chunk-ALXMCZEU.js";
56
- import "./chunk-74JR4N5J.js";
54
+ import "./chunk-GGD5W7TB.js";
57
55
  import "./chunk-LAYN4LDC.js";
58
- import "./chunk-2VFW5K5U.js";
56
+ import "./chunk-3SV6CQHO.js";
59
57
  import "./chunk-UEYA6UC7.js";
60
58
  import "./chunk-NBNN5GOB.js";
61
- import "./chunk-UPMD5XND.js";
62
59
  import "./chunk-FEMOX5AD.js";
60
+ import "./chunk-JL2PU6AI.js";
61
+ import "./chunk-GZCUW5IC.js";
63
62
  import "./chunk-VEWZZM3H.js";
63
+ import "./chunk-ALXMCZEU.js";
64
+ import "./chunk-7WQ6SLIE.js";
64
65
  import "./chunk-PAORGQRI.js";
66
+ import "./chunk-6UJ47TVX.js";
65
67
  import "./chunk-PYXS46O7.js";
66
68
  import "./chunk-3QKK7QOS.js";
67
- import "./chunk-GJQPH5G3.js";
68
69
  import "./chunk-JRNQ3RNA.js";
69
- import "./chunk-MYQWXITD.js";
70
+ import "./chunk-JIU55F3X.js";
70
71
  import "./chunk-CULXMQJH.js";
71
72
  import "./chunk-E6K4NIEU.js";
73
+ import "./chunk-ZVBB3T7V.js";
74
+ import "./chunk-YRMVARQP.js";
75
+ import "./chunk-BLKTA7MM.js";
72
76
  import "./chunk-EABGC2TL.js";
73
77
  import "./chunk-LOBRX7VD.js";
74
- import "./chunk-HITJFT7E.js";
75
- import "./chunk-YRMVARQP.js";
76
- import "./chunk-7PA4OZEU.js";
78
+ import "./chunk-HMDCOMYU.js";
77
79
  import "./chunk-J4IYOZZ5.js";
78
- import "./chunk-AAI7JARD.js";
80
+ import "./chunk-LK6SGL53.js";
79
81
  import "./chunk-7SEAZFFB.js";
80
82
  import "./chunk-K6WK37A6.js";
81
- import "./chunk-LK6SGL53.js";
82
83
  import "./chunk-3PG3H5TD.js";
83
84
  import "./chunk-FYIYMQ5N.js";
84
85
  import "./chunk-2NMMFZ5T.js";
85
86
  import "./chunk-Z5LAYHGJ.js";
86
87
  import "./chunk-C6QPK5GG.js";
87
- import "./chunk-GZCUW5IC.js";
88
- import "./chunk-RCICHSHL.js";
88
+ import "./chunk-SYUK3VLY.js";
89
89
  import "./chunk-EJI5XIBB.js";
90
+ import "./chunk-44ICJRF3.js";
91
+ import "./chunk-XZ2TIKGC.js";
92
+ import "./chunk-Y27UJK6V.js";
93
+ import "./chunk-ODWDQNRE.js";
94
+ import "./chunk-UZB5KHKX.js";
90
95
  import "./chunk-C2EFFULQ.js";
91
96
  import "./chunk-4WMCPJWX.js";
92
97
  import "./chunk-6HZ6AO2P.js";
@@ -95,11 +100,7 @@ import "./chunk-N53K2EXC.js";
95
100
  import "./chunk-URB2WSKZ.js";
96
101
  import "./chunk-UVJFDP7P.js";
97
102
  import "./chunk-XYIK4LF6.js";
98
- import "./chunk-QKAH5B6E.js";
99
- import "./chunk-KEG4GNGI.js";
100
- import "./chunk-ODWDQNRE.js";
101
- import "./chunk-Y27UJK6V.js";
102
- import "./chunk-UZB5KHKX.js";
103
+ import "./chunk-PVGDJXVK.js";
103
104
  import "./chunk-NGAVDO7E.js";
104
105
  import "./chunk-MARWOCVP.js";
105
106
  import "./chunk-EQINRHYR.js";
@@ -109,23 +110,23 @@ import "./chunk-EEQLFRUM.js";
109
110
  import "./chunk-QDW3E4RD.js";
110
111
  import "./chunk-4NRAJUDS.js";
111
112
  import "./chunk-DT5TVLJE.js";
113
+ import "./chunk-N5AKDXAI.js";
112
114
  import "./chunk-TBBDFYXW.js";
113
115
  import "./chunk-DGXUHMOV.js";
114
116
  import "./chunk-LPSF4OQH.js";
115
- import "./chunk-POMSFKTB.js";
116
- import "./chunk-U2IQTSBY.js";
117
+ import "./chunk-GV6NLQ4X.js";
118
+ import "./chunk-3WHVNEN7.js";
117
119
  import "./chunk-4KAN3GZ3.js";
118
120
  import "./chunk-6ZH4TU6I.js";
119
- import "./chunk-6PFRXT4K.js";
120
- import "./chunk-TP4FZJIZ.js";
121
121
  import "./chunk-SCU65EZI.js";
122
122
  import "./chunk-BOUYNNYD.js";
123
- import "./chunk-QSVPYQPG.js";
123
+ import "./chunk-6PFRXT4K.js";
124
+ import "./chunk-TP4FZJIZ.js";
124
125
  import "./chunk-DM2T26WE.js";
126
+ import "./chunk-QSVPYQPG.js";
125
127
  import "./chunk-M62O4P4T.js";
126
128
  import "./chunk-4DJQYKMN.js";
127
129
  import "./chunk-2ODBA7MQ.js";
128
- import "./chunk-N5AKDXAI.js";
129
130
  export {
130
131
  Orchestrator,
131
132
  appendMemoryToGraphContext,
package/dist/qmd.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  QmdClient,
3
3
  parseQmdExplain
4
- } from "./chunk-7PA4OZEU.js";
4
+ } from "./chunk-BLKTA7MM.js";
5
5
  import "./chunk-LK6SGL53.js";
6
+ import "./chunk-PVGDJXVK.js";
6
7
  import "./chunk-MARWOCVP.js";
7
8
  import "./chunk-6PFRXT4K.js";
8
9
  import "./chunk-2ODBA7MQ.js";
@@ -1,4 +1,4 @@
1
- import { RecallPlanMode, IdentityInjectionMode } from './types.js';
1
+ import { RecallPlanMode, IdentityInjectionMode, RecallTierExplain } from './types.js';
2
2
 
3
3
  interface LastRecallBudgetSummary {
4
4
  requestedTopK?: number;
@@ -32,6 +32,15 @@ interface LastRecallSnapshot {
32
32
  identityInjectionMode?: IdentityInjectionMode | "none";
33
33
  identityInjectedChars?: number;
34
34
  identityInjectionTruncated?: boolean;
35
+ /**
36
+ * Optional tier-level explanation of how recall was served
37
+ * (issue #518). Populated by orchestrator call sites that can
38
+ * identify a concrete tier; surfaces expose the block via
39
+ * `engram query --explain`, the `?explain=1` HTTP flag, and the
40
+ * `remnic_recall_explain` MCP tool. Orthogonal to the existing
41
+ * graph-path `recallExplain` operation.
42
+ */
43
+ tierExplain?: RecallTierExplain;
35
44
  }
36
45
  interface GraphRecallExpandedEntry {
37
46
  path: string;
@@ -99,7 +108,25 @@ declare class LastRecallStore {
99
108
  injectedChars: number;
100
109
  truncated: boolean;
101
110
  };
111
+ /**
112
+ * Per-tier explain annotation (issue #518). When supplied, the
113
+ * snapshot carries it so downstream surfaces (CLI / HTTP / MCP)
114
+ * can render which retrieval tier served the query.
115
+ */
116
+ tierExplain?: RecallTierExplain;
102
117
  }): Promise<void>;
118
+ /**
119
+ * Attach a RecallTierExplain block to the existing snapshot for a
120
+ * session without rewriting the entire snapshot. Used by the
121
+ * post-recall direct-answer annotation path (issue #518 slice 3c):
122
+ * recallInternal records the snapshot first, then the orchestrator
123
+ * fires the direct-answer tier in observation mode and annotates
124
+ * the stored snapshot with whichever tier served the query.
125
+ *
126
+ * No-op when no snapshot exists for the given session; callers do
127
+ * not need to guard on existence.
128
+ */
129
+ annotateTierExplain(sessionKey: string, tierExplain: RecallTierExplain): Promise<void>;
103
130
  }
104
131
  declare class TierMigrationStatusStore {
105
132
  private readonly statePath;
@@ -2,7 +2,7 @@ import {
2
2
  LastRecallStore,
3
3
  TierMigrationStatusStore,
4
4
  clampGraphRecallExpandedEntries
5
- } from "./chunk-S4LX5EBI.js";
5
+ } from "./chunk-47UU5PU2.js";
6
6
  import "./chunk-2ODBA7MQ.js";
7
7
  export {
8
8
  LastRecallStore,
@@ -0,0 +1,100 @@
1
+ import {
2
+ readPair,
3
+ resolvePair
4
+ } from "./chunk-YNB73F22.js";
5
+ import {
6
+ log
7
+ } from "./chunk-2ODBA7MQ.js";
8
+
9
+ // src/contradiction/resolution.ts
10
+ var VALID_VERBS = ["keep-a", "keep-b", "merge", "both-valid", "needs-more-context"];
11
+ function isValidResolutionVerb(value) {
12
+ return VALID_VERBS.includes(value);
13
+ }
14
+ async function executeResolution(memoryDir, storage, pairId, verb) {
15
+ const pair = readPair(memoryDir, pairId);
16
+ if (!pair) {
17
+ return { pairId, verb, affectedIds: [], message: `Pair ${pairId} not found` };
18
+ }
19
+ if (pair.resolution) {
20
+ return { pairId, verb, affectedIds: [], message: `Pair already resolved with verb "${pair.resolution}"` };
21
+ }
22
+ const [idA, idB] = pair.memoryIds;
23
+ const affectedIds = [];
24
+ let message = "";
25
+ let supersedeFailed = false;
26
+ switch (verb) {
27
+ case "keep-a": {
28
+ const ok = await supersedeSafe(storage, idB, idA, "contradiction-resolution:keep-a");
29
+ if (ok) {
30
+ affectedIds.push(idB);
31
+ message = `Kept ${idA}, superseded ${idB}`;
32
+ } else {
33
+ supersedeFailed = true;
34
+ message = `Supersede failed for ${idB}; not resolving`;
35
+ }
36
+ break;
37
+ }
38
+ case "keep-b": {
39
+ const ok = await supersedeSafe(storage, idA, idB, "contradiction-resolution:keep-b");
40
+ if (ok) {
41
+ affectedIds.push(idA);
42
+ message = `Kept ${idB}, superseded ${idA}`;
43
+ } else {
44
+ supersedeFailed = true;
45
+ message = `Supersede failed for ${idA}; not resolving`;
46
+ }
47
+ break;
48
+ }
49
+ case "merge": {
50
+ const mergedId = `merged-${pairId}`;
51
+ const okA = await supersedeSafe(storage, idA, mergedId, "contradiction-resolution:merge");
52
+ const okB = await supersedeSafe(storage, idB, mergedId, "contradiction-resolution:merge");
53
+ if (okA) affectedIds.push(idA);
54
+ if (okB) affectedIds.push(idB);
55
+ if (!okA || !okB) {
56
+ supersedeFailed = true;
57
+ message = `Merge incomplete: ${affectedIds.length}/2 superseded; not resolving to allow retry`;
58
+ } else {
59
+ message = `Both memories superseded by merged ${mergedId}`;
60
+ }
61
+ break;
62
+ }
63
+ case "both-valid": {
64
+ message = "Pair marked as both-valid; cooldown applied";
65
+ break;
66
+ }
67
+ case "needs-more-context": {
68
+ message = "Deferred; no action taken, short cooldown applied";
69
+ break;
70
+ }
71
+ }
72
+ if (!supersedeFailed) {
73
+ resolvePair(memoryDir, pairId, verb);
74
+ }
75
+ log.info("[contradiction-resolution] pair=%s verb=%s affected=%d", pairId, verb, affectedIds.length);
76
+ return { pairId, verb, affectedIds, message };
77
+ }
78
+ async function supersedeSafe(storage, oldId, newId, reason) {
79
+ try {
80
+ const result = await storage.supersedeMemory(oldId, newId, reason);
81
+ if (result === false) {
82
+ log.warn("[contradiction-resolution] supersede returned false for %s \u2192 %s", oldId, newId);
83
+ return false;
84
+ }
85
+ return true;
86
+ } catch (err) {
87
+ log.warn(
88
+ "[contradiction-resolution] supersede failed %s \u2192 %s: %s",
89
+ oldId,
90
+ newId,
91
+ err instanceof Error ? err.message : err
92
+ );
93
+ return false;
94
+ }
95
+ }
96
+ export {
97
+ executeResolution,
98
+ isValidResolutionVerb
99
+ };
100
+ //# sourceMappingURL=resolution-QBTDHTG7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contradiction/resolution.ts"],"sourcesContent":["/**\n * Resolution Verbs — executes user-chosen resolution actions on contradiction pairs (issue #520).\n *\n * All resolution paths delegate to StorageManager.supersedeMemory. Do not\n * reimplement supersession logic here (rule 22: deduplicate resolution).\n */\n\nimport type { StorageManager } from \"../storage.js\";\nimport type { ResolutionVerb } from \"./contradiction-review.js\";\nimport { resolvePair, readPair } from \"./contradiction-review.js\";\nimport { log } from \"../logger.js\";\n\nexport interface ResolutionResult {\n pairId: string;\n verb: ResolutionVerb;\n /** Memory IDs affected by the resolution. */\n affectedIds: string[];\n /** Human-readable status. */\n message: string;\n}\n\nconst VALID_VERBS: ResolutionVerb[] = [\"keep-a\", \"keep-b\", \"merge\", \"both-valid\", \"needs-more-context\"];\n\nexport function isValidResolutionVerb(value: string): value is ResolutionVerb {\n return VALID_VERBS.includes(value as ResolutionVerb);\n}\n\n/**\n * Execute a resolution verb on a contradiction pair.\n *\n * - `keep-a`: Supersede B, keep A active.\n * - `keep-b`: Supersede A, keep B active.\n * - `merge`: Mark both as superseded by a synthetic merged ID.\n * - `both-valid`: Mark pair as reviewed; no memories are superseded.\n * - `needs-more-context`: Defer; no action, short cooldown.\n */\nexport async function executeResolution(\n memoryDir: string,\n storage: StorageManager,\n pairId: string,\n verb: ResolutionVerb,\n): Promise<ResolutionResult> {\n const pair = readPair(memoryDir, pairId);\n if (!pair) {\n return { pairId, verb, affectedIds: [], message: `Pair ${pairId} not found` };\n }\n\n if (pair.resolution) {\n return { pairId, verb, affectedIds: [], message: `Pair already resolved with verb \"${pair.resolution}\"` };\n }\n\n const [idA, idB] = pair.memoryIds;\n const affectedIds: string[] = [];\n let message = \"\";\n let supersedeFailed = false;\n\n switch (verb) {\n case \"keep-a\": {\n const ok = await supersedeSafe(storage, idB, idA, \"contradiction-resolution:keep-a\");\n if (ok) { affectedIds.push(idB); message = `Kept ${idA}, superseded ${idB}`; }\n else { supersedeFailed = true; message = `Supersede failed for ${idB}; not resolving`; }\n break;\n }\n case \"keep-b\": {\n const ok = await supersedeSafe(storage, idA, idB, \"contradiction-resolution:keep-b\");\n if (ok) { affectedIds.push(idA); message = `Kept ${idB}, superseded ${idA}`; }\n else { supersedeFailed = true; message = `Supersede failed for ${idA}; not resolving`; }\n break;\n }\n case \"merge\": {\n const mergedId = `merged-${pairId}`;\n const okA = await supersedeSafe(storage, idA, mergedId, \"contradiction-resolution:merge\");\n const okB = await supersedeSafe(storage, idB, mergedId, \"contradiction-resolution:merge\");\n if (okA) affectedIds.push(idA);\n if (okB) affectedIds.push(idB);\n if (!okA || !okB) {\n supersedeFailed = true;\n message = `Merge incomplete: ${affectedIds.length}/2 superseded; not resolving to allow retry`;\n } else {\n message = `Both memories superseded by merged ${mergedId}`;\n }\n break;\n }\n case \"both-valid\": {\n message = \"Pair marked as both-valid; cooldown applied\";\n break;\n }\n case \"needs-more-context\": {\n message = \"Deferred; no action taken, short cooldown applied\";\n break;\n }\n }\n\n if (!supersedeFailed) {\n resolvePair(memoryDir, pairId, verb);\n }\n log.info(\"[contradiction-resolution] pair=%s verb=%s affected=%d\", pairId, verb, affectedIds.length);\n return { pairId, verb, affectedIds, message };\n}\n\nasync function supersedeSafe(\n storage: StorageManager,\n oldId: string,\n newId: string,\n reason: string,\n): Promise<boolean> {\n try {\n const result = await storage.supersedeMemory(oldId, newId, reason);\n if (result === false) {\n log.warn(\"[contradiction-resolution] supersede returned false for %s → %s\", oldId, newId);\n return false;\n }\n return true;\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] supersede failed %s → %s: %s\",\n oldId,\n newId,\n err instanceof Error ? err.message : err,\n );\n return false;\n }\n}\n"],"mappings":";;;;;;;;;AAqBA,IAAM,cAAgC,CAAC,UAAU,UAAU,SAAS,cAAc,oBAAoB;AAE/F,SAAS,sBAAsB,OAAwC;AAC5E,SAAO,YAAY,SAAS,KAAuB;AACrD;AAWA,eAAsB,kBACpB,WACA,SACA,QACA,MAC2B;AAC3B,QAAM,OAAO,SAAS,WAAW,MAAM;AACvC,MAAI,CAAC,MAAM;AACT,WAAO,EAAE,QAAQ,MAAM,aAAa,CAAC,GAAG,SAAS,QAAQ,MAAM,aAAa;AAAA,EAC9E;AAEA,MAAI,KAAK,YAAY;AACnB,WAAO,EAAE,QAAQ,MAAM,aAAa,CAAC,GAAG,SAAS,oCAAoC,KAAK,UAAU,IAAI;AAAA,EAC1G;AAEA,QAAM,CAAC,KAAK,GAAG,IAAI,KAAK;AACxB,QAAM,cAAwB,CAAC;AAC/B,MAAI,UAAU;AACd,MAAI,kBAAkB;AAEtB,UAAQ,MAAM;AAAA,IACZ,KAAK,UAAU;AACb,YAAM,KAAK,MAAM,cAAc,SAAS,KAAK,KAAK,iCAAiC;AACnF,UAAI,IAAI;AAAE,oBAAY,KAAK,GAAG;AAAG,kBAAU,QAAQ,GAAG,gBAAgB,GAAG;AAAA,MAAI,OACxE;AAAE,0BAAkB;AAAM,kBAAU,wBAAwB,GAAG;AAAA,MAAmB;AACvF;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,KAAK,MAAM,cAAc,SAAS,KAAK,KAAK,iCAAiC;AACnF,UAAI,IAAI;AAAE,oBAAY,KAAK,GAAG;AAAG,kBAAU,QAAQ,GAAG,gBAAgB,GAAG;AAAA,MAAI,OACxE;AAAE,0BAAkB;AAAM,kBAAU,wBAAwB,GAAG;AAAA,MAAmB;AACvF;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,WAAW,UAAU,MAAM;AACjC,YAAM,MAAM,MAAM,cAAc,SAAS,KAAK,UAAU,gCAAgC;AACxF,YAAM,MAAM,MAAM,cAAc,SAAS,KAAK,UAAU,gCAAgC;AACxF,UAAI,IAAK,aAAY,KAAK,GAAG;AAC7B,UAAI,IAAK,aAAY,KAAK,GAAG;AAC7B,UAAI,CAAC,OAAO,CAAC,KAAK;AAChB,0BAAkB;AAClB,kBAAU,qBAAqB,YAAY,MAAM;AAAA,MACnD,OAAO;AACL,kBAAU,sCAAsC,QAAQ;AAAA,MAC1D;AACA;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AACjB,gBAAU;AACV;AAAA,IACF;AAAA,IACA,KAAK,sBAAsB;AACzB,gBAAU;AACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,iBAAiB;AACpB,gBAAY,WAAW,QAAQ,IAAI;AAAA,EACrC;AACA,MAAI,KAAK,0DAA0D,QAAQ,MAAM,YAAY,MAAM;AACnG,SAAO,EAAE,QAAQ,MAAM,aAAa,QAAQ;AAC9C;AAEA,eAAe,cACb,SACA,OACA,OACA,QACkB;AAClB,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,gBAAgB,OAAO,OAAO,MAAM;AACjE,QAAI,WAAW,OAAO;AACpB,UAAI,KAAK,wEAAmE,OAAO,KAAK;AACxF,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAI;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,QAAQ,IAAI,UAAU;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1,3 +1,25 @@
1
+ /**
2
+ * Resolve a provider API key using OpenClaw's own auth resolution system.
3
+ *
4
+ * This module delegates to the gateway's `resolveApiKeyForProvider()` function,
5
+ * which handles all secret reference formats (SecretRef objects, auth profiles,
6
+ * "secretref-managed" markers, environment variables, etc.) using the same
7
+ * codepath the gateway uses for its own agent sessions.
8
+ *
9
+ * For plain-text API keys, a fast path returns them directly without
10
+ * involving the gateway auth system.
11
+ *
12
+ * Results are cached per provider for the gateway process lifetime.
13
+ */
14
+ type ResolveApiKeyFn = (params: {
15
+ provider: string;
16
+ cfg?: unknown;
17
+ agentDir?: string;
18
+ }) => Promise<{
19
+ apiKey?: string;
20
+ source?: string;
21
+ mode?: string;
22
+ } | null>;
1
23
  /**
2
24
  * Resolve request-ready auth for a model, including provider-owned transforms
3
25
  * (e.g., OAuth token exchange, base URL override for openai-codex).
@@ -40,5 +62,6 @@ declare function getGatewayRuntimeAuthForModel(): Promise<GetRuntimeAuthForModel
40
62
  * Clear the resolution cache (useful for testing or key rotation).
41
63
  */
42
64
  declare function clearSecretCache(): void;
65
+ declare function __setGatewayResolverForTest(resolver: ResolveApiKeyFn | null): void;
43
66
 
44
- export { type GetRuntimeAuthForModelFn, clearSecretCache, getGatewayRuntimeAuthForModel, resolveProviderApiKey };
67
+ export { type GetRuntimeAuthForModelFn, __setGatewayResolverForTest, clearSecretCache, getGatewayRuntimeAuthForModel, resolveProviderApiKey };
@@ -1,11 +1,13 @@
1
1
  import {
2
+ __setGatewayResolverForTest,
2
3
  clearSecretCache,
3
4
  getGatewayRuntimeAuthForModel,
4
5
  resolveProviderApiKey
5
- } from "./chunk-KEG4GNGI.js";
6
+ } from "./chunk-XZ2TIKGC.js";
6
7
  import "./chunk-MARWOCVP.js";
7
8
  import "./chunk-2ODBA7MQ.js";
8
9
  export {
10
+ __setGatewayResolverForTest,
9
11
  clearSecretCache,
10
12
  getGatewayRuntimeAuthForModel,
11
13
  resolveProviderApiKey
@@ -4,13 +4,13 @@ import {
4
4
  recordResumeBundle,
5
5
  resolveResumeBundleDir,
6
6
  validateResumeBundle
7
- } from "./chunk-AYPYCLR7.js";
7
+ } from "./chunk-6LX5ORAS.js";
8
8
  import "./chunk-CULXMQJH.js";
9
9
  import "./chunk-E6K4NIEU.js";
10
- import "./chunk-LOBRX7VD.js";
11
10
  import "./chunk-YRMVARQP.js";
11
+ import "./chunk-LOBRX7VD.js";
12
12
  import "./chunk-FYIYMQ5N.js";
13
- import "./chunk-OJFGVJS6.js";
13
+ import "./chunk-MBJHSA7F.js";
14
14
  import "./chunk-Z5LAYHGJ.js";
15
15
  import "./chunk-MARWOCVP.js";
16
16
  import "./chunk-DT5TVLJE.js";