@snoai/memory 1.2.13 → 1.5.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 (152) hide show
  1. package/README.md +1 -1
  2. package/dist/{access-tracker-CglGg8uS.d.ts → access-tracker-B1H2AJlH.d.ts} +4 -4
  3. package/dist/{adapter-Cxyzdq6H.d.ts → adapter-CgdVA88V.d.ts} +2 -2
  4. package/dist/{agent-llm-port-DY2290EK.d.ts → agent-llm-port-BlFrD2ro.d.ts} +5 -0
  5. package/dist/{atomic-memory-extraction-DO4yTfch.d.ts → atomic-memory-extraction-DCMTQ0h-.d.ts} +4 -4
  6. package/dist/{atomic-memory-extraction-DWhlXJT6.js → atomic-memory-extraction-De86y7O-.js} +4 -4
  7. package/dist/{b-profile-section-dictionary-provider-BkUdS1SY.d.ts → b-profile-section-dictionary-provider-DbqdRYMw.d.ts} +1 -1
  8. package/dist/{capture-policy-detector-C7MA4jSr.d.ts → capture-policy-detector-D4ziS7KF.d.ts} +1 -1
  9. package/dist/client.d.ts +1 -1
  10. package/dist/{config-D_KOwEyg.js → config-DWeuetYo.js} +740 -447
  11. package/dist/{derived-suppression-cache-CmS4xAaN.d.ts → derived-suppression-cache-2xOq6XHX.d.ts} +1 -1
  12. package/dist/diagnostic-encoder.js +1 -1
  13. package/dist/{embedding-provider-client-vynZMuit.d.ts → embedding-provider-client-CELWtPgt.d.ts} +6 -0
  14. package/dist/{embedding-provider-client-40tpzKou.js → embedding-provider-client-CgpUK_1G.js} +16 -1
  15. package/dist/{index-Pb9LrHgL.d.ts → index-BGu91bjB.d.ts} +25 -19
  16. package/dist/{index-CTi1R9T4.d.ts → index-PjHhlG6e.d.ts} +2 -2
  17. package/dist/index.d.ts +11 -11
  18. package/dist/index.js +5 -5
  19. package/dist/internal/config/index.d.ts +2 -2
  20. package/dist/internal/config/index.js +25 -19
  21. package/dist/internal/config/plugin-config-schema.d.ts +1 -1
  22. package/dist/internal/config/plugin-config-schema.js +1 -1
  23. package/dist/internal/config/product-mode.d.ts +1 -1
  24. package/dist/internal/config/settings.d.ts +1 -1
  25. package/dist/internal/config/settings.js +3 -30
  26. package/dist/internal/config/skin-defaults.d.ts +1 -1
  27. package/dist/internal/contract/profile.d.ts +1 -1
  28. package/dist/internal/contract/routes.d.ts +1 -1
  29. package/dist/internal/engine/bindings/memory-cli-shared.d.ts +5 -5
  30. package/dist/internal/engine/bindings/memory-forget-tool.js +1 -1
  31. package/dist/internal/engine/bindings/memory-list-tool.js +1 -1
  32. package/dist/internal/engine/bindings/memory-recall-tool.js +1 -1
  33. package/dist/internal/engine/bindings/memory-reflection-resolve-tool.js +1 -1
  34. package/dist/internal/engine/bindings/memory-stats-tool.js +1 -1
  35. package/dist/internal/engine/bindings/memory-store-tool.js +3 -3
  36. package/dist/internal/engine/bindings/memory-tool-access.d.ts +1 -1
  37. package/dist/internal/engine/bindings/memory-tool-access.js +1 -1
  38. package/dist/internal/engine/bindings/memory-tool-results.d.ts +1 -1
  39. package/dist/internal/engine/bindings/memory-tool-results.js +1 -1
  40. package/dist/internal/engine/bindings/memory-tool-schemas.d.ts +6 -6
  41. package/dist/internal/engine/bindings/memory-tool-schemas.js +1 -1
  42. package/dist/internal/engine/bindings/memory-update-tool.js +2 -2
  43. package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.d.ts +5 -5
  44. package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.js +2 -2
  45. package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.d.ts +4 -4
  46. package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.js +1 -1
  47. package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.d.ts +7 -7
  48. package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.js +2 -2
  49. package/dist/internal/engine/bindings/sno-station-mem-message-transcript.js +2 -2
  50. package/dist/internal/engine/bindings/sno-station-mem-reset-hook.d.ts +4 -4
  51. package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.d.ts +1 -1
  52. package/dist/internal/engine/extraction/atomic-memory-extraction.d.ts +1 -1
  53. package/dist/internal/engine/extraction/atomic-memory-extraction.js +1 -1
  54. package/dist/internal/engine/extraction/b-profile-section-dictionary-provider.d.ts +1 -1
  55. package/dist/internal/engine/extraction/b-profile-section-rekey.d.ts +5 -5
  56. package/dist/internal/engine/extraction/capture-policy-detector.d.ts +1 -1
  57. package/dist/internal/engine/extraction/embedding-provider-client.d.ts +1 -1
  58. package/dist/internal/engine/extraction/embedding-provider-client.js +1 -1
  59. package/dist/internal/engine/extraction/memory-metadata-codec.d.ts +2 -2
  60. package/dist/internal/engine/extraction/memory-temporality-classifier.d.ts +1 -1
  61. package/dist/internal/engine/extraction/memory-temporality-classifier.js +1 -1
  62. package/dist/internal/engine/observability/adapter.d.ts +1 -1
  63. package/dist/internal/engine/observability/memory-snapshot.d.ts +1 -1
  64. package/dist/internal/engine/observability/observable-embedder.d.ts +1 -1
  65. package/dist/internal/engine/observability/observable-embedder.js +1 -1
  66. package/dist/internal/engine/observability/observable-llm-client.d.ts +1 -1
  67. package/dist/internal/engine/observability/observable-memory-store.d.ts +1 -1
  68. package/dist/internal/engine/observability/observable-memory-store.js +1 -1
  69. package/dist/internal/engine/observability/observable-retriever.d.ts +1 -1
  70. package/dist/internal/engine/observability/observable-retriever.js +1 -1
  71. package/dist/internal/engine/observability/runtime-diagnostics.d.ts +1 -1
  72. package/dist/internal/engine/observability/runtime-diagnostics.js +1 -1
  73. package/dist/internal/engine/operations/memory-tier-promoter.d.ts +1 -1
  74. package/dist/internal/engine/operations/runtime-audit-log.d.ts +2 -2
  75. package/dist/internal/engine/provider/provider-registration.d.ts +4 -4
  76. package/dist/internal/engine/provider/provider-row-renderer.d.ts +1 -1
  77. package/dist/internal/engine/reflection/reflection-command-hooks.d.ts +1 -1
  78. package/dist/internal/engine/reflection/reflection-command-hooks.js +1 -1
  79. package/dist/internal/engine/reflection/reflection-deps.d.ts +1 -1
  80. package/dist/internal/engine/reflection/reflection-embedded-generator.d.ts +1 -1
  81. package/dist/internal/engine/reflection/reflection-embedded-generator.js +1 -1
  82. package/dist/internal/engine/reflection/reflection-injection-hooks.d.ts +1 -1
  83. package/dist/internal/engine/reflection/reflection-injection-hooks.js +1 -1
  84. package/dist/internal/engine/reflection/reflection-lifecycle-hooks.d.ts +1 -1
  85. package/dist/internal/engine/reflection/reflection-lifecycle-hooks.js +1 -1
  86. package/dist/internal/engine/reflection/strategy-hook-runner.d.ts +3 -3
  87. package/dist/internal/engine/reflection/strategy-hook-runner.js +2 -2
  88. package/dist/internal/engine/retrieval/access-tracker.d.ts +1 -1
  89. package/dist/internal/engine/retrieval/retriever.d.ts +2 -2
  90. package/dist/internal/engine/retrieval/retriever.js +1 -1
  91. package/dist/internal/engine/shared/memory-kind-policy.d.ts +1 -1
  92. package/dist/internal/engine/shared/paths.d.ts +2 -2
  93. package/dist/internal/engine/shared/types.d.ts +2 -2
  94. package/dist/internal/engine/shared/types.js +1 -1
  95. package/dist/internal/engine/telemetry/observe-ledger.d.ts +1 -1
  96. package/dist/internal/model/agent-llm-port.d.ts +1 -1
  97. package/dist/internal/model/llm-client.d.ts +2 -2
  98. package/dist/internal/model/llm-client.js +1 -1
  99. package/dist/internal/model/llm-mode-routing.d.ts +1 -1
  100. package/dist/internal/store/maintenance.d.ts +2 -2
  101. package/dist/internal/store/maintenance.js +4 -4
  102. package/dist/internal/store/store.d.ts +2 -2
  103. package/dist/internal/store/store.js +1 -1
  104. package/dist/{llm-client-B7LSFL_m.d.ts → llm-client-C-K7oyfu.d.ts} +1 -1
  105. package/dist/{llm-client-C7yyFWu-.js → llm-client-DDdUjYWS.js} +10 -3
  106. package/dist/{log-site-catalog.generated-BODn_6Kx.js → log-site-catalog.generated-Cn8rTa65.js} +94 -73
  107. package/dist/log-site-catalog.json +1 -1
  108. package/dist/{memory-kind-policy-B4IBMAlv.d.ts → memory-kind-policy-DgPCjfY4.d.ts} +1 -1
  109. package/dist/{memory-metadata-codec-BQ8tBY-g.d.ts → memory-metadata-codec-CfP9JLVO.d.ts} +1 -1
  110. package/dist/{memory-runtime-4iOpeP09.js → memory-runtime-jQke2sBc.js} +118 -78
  111. package/dist/{memory-snapshot-B8mQbWR-.d.ts → memory-snapshot-B6a-6nJ7.d.ts} +2 -2
  112. package/dist/{memory-store-base-CTAMKigD.d.ts → memory-store-base-upd9MuG6.d.ts} +4 -4
  113. package/dist/{memory-temporality-classifier-epuZlfXa.js → memory-temporality-classifier-BwBKEQbL.js} +1 -1
  114. package/dist/{memory-temporality-classifier-LByFBiFJ.d.ts → memory-temporality-classifier-DPk3_9Or.d.ts} +1 -1
  115. package/dist/{memory-tier-promoter-CSGa4LBH.d.ts → memory-tier-promoter-Cq23yveQ.d.ts} +1 -1
  116. package/dist/memory-tool-dependencies-C9qgVGOn.d.ts +14 -0
  117. package/dist/{memory-tool-dependencies-xLaWzwpI.js → memory-tool-dependencies-aAr7Pkuj.js} +1 -1
  118. package/dist/{observable-embedder-Da0teBqx.d.ts → observable-embedder-DihQuuQD.d.ts} +2 -2
  119. package/dist/{observable-llm-client-i0sp0veF.d.ts → observable-llm-client-BglDBFN5.d.ts} +3 -3
  120. package/dist/{observable-memory-store-CS87pitJ.d.ts → observable-memory-store--n02Dre8.d.ts} +5 -5
  121. package/dist/{observable-retriever-Bhfg9DsZ.d.ts → observable-retriever-CV6odifA.d.ts} +6 -6
  122. package/dist/paths-qJqwGcKl.d.ts +1 -0
  123. package/dist/{plugin-config-schema-CvAGFPyE.js → plugin-config-schema-D9riSXDg.js} +3 -20
  124. package/dist/{plugin-config-schema-CcEeAEdi.d.ts → plugin-config-schema-dV2_HgBo.d.ts} +2 -8
  125. package/dist/{profile-BMvnRqf5.d.ts → profile-CoLKGobS.d.ts} +1 -1
  126. package/dist/{profile-section-writer-DeD9GPQJ.js → profile-section-writer-Dd4FKpt5.js} +2 -2
  127. package/dist/{reflection-command-hooks-S5L6ZWeh.js → reflection-command-hooks-B2P4zDr6.js} +3 -3
  128. package/dist/{reflection-command-hooks-CFXyoVvE.d.ts → reflection-command-hooks-Cfv836Wc.d.ts} +4 -4
  129. package/dist/{reflection-deps-BPMrDU0a.d.ts → reflection-deps-DihlwQxE.d.ts} +4 -4
  130. package/dist/{reflection-embedded-generator-CF-NbuPS.d.ts → reflection-embedded-generator-DCZaS6kz.d.ts} +4 -4
  131. package/dist/{reflection-embedded-generator-nmVrj4AZ.js → reflection-embedded-generator-DV-NkeU-.js} +1 -1
  132. package/dist/{reflection-injection-hooks-BRIr3lJM.d.ts → reflection-injection-hooks-BYxkrds6.d.ts} +4 -4
  133. package/dist/{reflection-lifecycle-hooks-Ci8y4qHk.d.ts → reflection-lifecycle-hooks-Bwq2y5pe.d.ts} +3 -3
  134. package/dist/{rem-batch-executor-CfWChDAk.js → rem-batch-executor-B_49KivZ.js} +1 -1
  135. package/dist/{rem-trigger-B1P5_RqV.js → rem-trigger-DL0MlLeo.js} +180 -160
  136. package/dist/{retriever-CpyZs2ND.js → retriever-CsBW6MZv.js} +158 -162
  137. package/dist/{retriever-DdikFSDC.d.ts → retriever-hTIkt3CJ.d.ts} +19 -26
  138. package/dist/{runtime-audit-log-BVOxzkh7.d.ts → runtime-audit-log-eBrt_iPp.d.ts} +1 -1
  139. package/dist/{server-DOL3D6bb.js → server-BnBzsvMF.js} +9 -9
  140. package/dist/sidecar/main.js +2 -2
  141. package/dist/sno-station-mem-runtime-dependencies-9L8WkMMV.d.ts +31 -0
  142. package/dist/{sno-station-mem-runtime-dependencies-DZe3z4RY.js → sno-station-mem-runtime-dependencies-DrVDRAmf.js} +6 -6
  143. package/dist/{store-DY_rWx__.js → store-COwW7mIh.js} +1 -1
  144. package/dist/{store-DraRJ-HI.d.ts → store-DEG06TLb.d.ts} +2 -2
  145. package/dist/{strategy-hook-runner-CltVTtzk.js → strategy-hook-runner-CALbWcys.js} +1 -1
  146. package/dist/{strategy-hook-runner-DH7OEQrH.d.ts → strategy-hook-runner-D1sRVThs.d.ts} +7 -7
  147. package/dist/{types-DZGL4QXi.d.ts → types-DBEwNYdR.d.ts} +1 -1
  148. package/package.json +2 -2
  149. package/settings.default.json +0 -4
  150. package/dist/memory-tool-dependencies-Bl11T6Xm.d.ts +0 -14
  151. package/dist/paths-B5y-npWs.d.ts +0 -1
  152. package/dist/sno-station-mem-runtime-dependencies-DgAm7WqA.d.ts +0 -31
@@ -1,10 +1,9 @@
1
- import { CHUNKING_VERSION, DEFAULT_BM25_WEIGHT, DEFAULT_RECALL_LIFECYCLE, DEFAULT_RERANK_MODEL, DEFAULT_RERANK_TIMEOUT_MS, DEFAULT_VECTOR_WEIGHT, IMPORTANCE_WEIGHT_BASE, LIGHTWEIGHT_COSINE_WEIGHT, LIGHTWEIGHT_FUSION_WEIGHT, LIGHTWEIGHT_RERANK_PENALTY, MMR_LAMBDA, RECENCY_WEIGHT, RERANK_BLEND_CROSS, RERANK_BLEND_VECTOR, TIME_DECAY_FLOOR, experimentCandidatePoolOverride, experimentMmrDisabled } from "./internal/config/index.js";
1
+ import { CHUNKING_VERSION, DEFAULT_BM25_WEIGHT, DEFAULT_RECALL_LIFECYCLE, DEFAULT_RERANK_TIMEOUT_MS, DEFAULT_VECTOR_WEIGHT, IMPORTANCE_WEIGHT_BASE, LIGHTWEIGHT_COSINE_WEIGHT, LIGHTWEIGHT_FUSION_WEIGHT, LIGHTWEIGHT_RERANK_PENALTY, MMR_LAMBDA, RECENCY_WEIGHT, RERANK_BLEND_CROSS, RERANK_BLEND_VECTOR, TIME_DECAY_FLOOR, experimentCandidatePoolOverride, experimentMmrDisabled } from "./internal/config/index.js";
2
2
  import "./internal/engine/shared/types.js";
3
3
  import { EmbeddingError, RetrievalError } from "./internal/engine/shared/errors.js";
4
4
  import { o as isMemoryExpired, s as parseInsightMetadata } from "./memory-metadata-codec-DL1sbJiN.js";
5
5
  import { clamp01 } from "./internal/engine/shared/utils.js";
6
6
  import { a as memoryOperationSignal } from "./operation-cancellation-QcwC4mDX.js";
7
- import { classifyLlmFailure } from "./internal/model/llm-failure.js";
8
7
  import { appendQaTrace, computeConfigHash, isTraceEnabled } from "./internal/engine/eval/trace.js";
9
8
  import { computeEffectiveHalfLife, parseAccessMetadata } from "./internal/engine/retrieval/access-tracker.js";
10
9
  import { createLogger as createLogger$1, currentLogContext, privateLogReference, withLogContext } from "@snoai/utils/logger";
@@ -219,9 +218,7 @@ const DEFAULT_RETRIEVAL_CONFIG = {
219
218
  recencyWeight: RECENCY_WEIGHT,
220
219
  temporalExpiry: false,
221
220
  temporalDecay: true,
222
- rerankModel: DEFAULT_RERANK_MODEL,
223
221
  rerankTimeoutMs: DEFAULT_RERANK_TIMEOUT_MS,
224
- rerankProvider: "voyage",
225
222
  lengthNormAnchor: 0,
226
223
  hardMinScore: 0,
227
224
  timeDecayHalfLifeDays: 60,
@@ -244,12 +241,10 @@ const DEFAULT_RETRIEVAL_CONFIG = {
244
241
  *
245
242
  * - `missing_api_key`: cross-encoder configured but no rerankApiKey set;
246
243
  * call routes through the lightweight cosine path instead.
247
- * - `no_endpoint`: provider has no known endpoint in `RERANK_DEFAULT_ENDPOINTS`
248
- * and `rerankEndpoint` was not overridden; rerank was skipped.
249
- * - `http_error`: provider responded with a non-OK status that did not map
250
- * to a fatal RetrievalError (i.e. degraded but not propagated).
251
- * - `invalid_response`: provider HTTP 2xx but response shape did not parse.
252
- * - `timeout`: the per-call AbortSignal fired before the provider responded.
244
+ * - `no_endpoint`: no reranker address (`rerankEndpoint`) was set; rerank was skipped.
245
+ * - `http_error`: the reranker responded with a non-OK status.
246
+ * - `invalid_response`: the reranker answered HTTP 2xx but the response shape did not parse.
247
+ * - `timeout`: the per-call AbortSignal fired before the reranker responded.
253
248
  * - `request_error`: any other thrown error inside the fetch path.
254
249
  * - `query_over_window`: the query alone fills the reranker's per-pair token window, so no
255
250
  * document could be sent with it. Nothing was requested.
@@ -554,11 +549,10 @@ Object.assign(MemoryRetriever.prototype, {
554
549
  this.throwIfAborted(context);
555
550
  const rerankStageMetadata = rerankOutcome.fallback ? {
556
551
  ...rerankOutcome.stats,
557
- rerankFallbackReason: rerankOutcome.fallback.reason,
558
- rerankFallbackProvider: rerankOutcome.fallback.provider
552
+ rerankFallbackReason: rerankOutcome.fallback.reason
559
553
  } : rerankOutcome.stats;
560
554
  trace?.endStage(fused.map((r) => r.entry.id), fused.map((r) => r.score), rerankStageMetadata);
561
- fused = this.applyScoringPipeline(fused, trace, context.limit);
555
+ fused = this.applyScoringPipeline(fused, trace, context.limit, rerankOutcome.modelOrder);
562
556
  trace?.startStage("min_score_filter", fused.map((result) => result.entry.id));
563
557
  fused = fused.filter((result) => result.score >= (context.minScore ?? this.config.minScore));
564
558
  trace?.endStage(fused.map((result) => result.entry.id), fused.map((result) => result.score));
@@ -627,100 +621,31 @@ Object.assign(MemoryRetriever.prototype, {
627
621
  });
628
622
  //#endregion
629
623
  //#region src/engine/retrieval/retrieval-rerank-provider.ts
630
- /** @file retrieval-rerank-provider.ts
631
- * @purpose Adapts external rerank provider request and response formats.
632
- * @boundary HTTP payload shaping and response parsing only.
633
- */
634
- const RERANK_DEFAULT_ENDPOINTS = {
635
- voyage: "https://api.voyageai.com/v1/rerank",
636
- jina: "https://api.jina.ai/v1/rerank",
637
- pinecone: "https://api.pinecone.io/rerank",
638
- dashscope: "https://dashscope.aliyuncs.com/api/v1/services/rerank"
639
- };
640
- function buildRerankHttpError(status) {
641
- if (classifyLlmFailure({ status }).category === "auth") return new RetrievalError(`Rerank API failed with status ${status}`);
642
- }
643
- function buildRerankRequest(provider, apiKey, model, query, candidates, topN) {
644
- switch (provider) {
645
- case "tei":
646
- case "sno-gpu": return {
647
- headers: {
648
- "Content-Type": "application/json",
649
- Authorization: `Bearer ${apiKey}`,
650
- ...provider === "sno-gpu" ? {
651
- "X-Sno-Source": "sno-station",
652
- "X-Sno-Workload": "station-rerank"
653
- } : {}
654
- },
655
- body: {
656
- query,
657
- texts: candidates,
658
- raw_scores: true
659
- }
660
- };
661
- case "dashscope": return {
662
- headers: {
663
- "Content-Type": "application/json",
664
- Authorization: `Bearer ${apiKey}`
665
- },
666
- body: {
667
- model,
668
- input: {
669
- query,
670
- documents: candidates
671
- }
672
- }
673
- };
674
- case "pinecone": return {
675
- headers: {
676
- "Content-Type": "application/json",
677
- "Api-Key": apiKey,
678
- "X-Pinecone-API-Version": "2024-10"
679
- },
680
- body: {
681
- model,
682
- query,
683
- documents: candidates.map((text) => ({ text })),
684
- top_n: topN,
685
- rank_fields: ["text"]
686
- }
687
- };
688
- case "voyage": return {
689
- headers: {
690
- "Content-Type": "application/json",
691
- Authorization: `Bearer ${apiKey}`
692
- },
693
- body: {
694
- model,
695
- query,
696
- documents: candidates,
697
- top_k: topN
698
- }
699
- };
700
- default: return {
701
- headers: {
702
- "Content-Type": "application/json",
703
- Authorization: `Bearer ${apiKey}`
704
- },
705
- body: {
706
- model,
707
- query,
708
- documents: candidates,
709
- top_n: topN
710
- }
711
- };
712
- }
624
+ function buildRerankRequest(apiKey, query, candidates) {
625
+ return {
626
+ headers: {
627
+ "Content-Type": "application/json",
628
+ Authorization: `Bearer ${apiKey}`,
629
+ "X-Sno-Source": "sno-station",
630
+ "X-Sno-Workload": "station-rerank"
631
+ },
632
+ body: {
633
+ query,
634
+ texts: candidates,
635
+ raw_scores: true
636
+ }
637
+ };
713
638
  }
714
- function parseRerankResponse(provider, data) {
715
- /** Parses items into the normalized shape used by precision recall retrieval ranking. */
716
- const parseItems = (items, scoreKeys) => {
639
+ /** Sno's reranker answers a list of `{index, score}`, bare or under `results` / `data`. */
640
+ function parseRerankResponse(data) {
641
+ const parseItems = (items) => {
717
642
  if (!Array.isArray(items)) return void 0;
718
643
  const parsed = [];
719
644
  for (const raw of items) {
720
645
  const index = typeof raw?.index === "number" ? raw.index : Number(raw?.index);
721
646
  if (!Number.isFinite(index)) continue;
722
647
  let score;
723
- for (const key of scoreKeys) {
648
+ for (const key of ["score", "relevance_score"]) {
724
649
  const value = raw?.[key];
725
650
  const n = typeof value === "number" ? value : Number(value);
726
651
  if (Number.isFinite(n)) {
@@ -737,18 +662,7 @@ function parseRerankResponse(provider, data) {
737
662
  return parsed.length > 0 ? parsed : void 0;
738
663
  };
739
664
  const objectData = data && typeof data === "object" && !Array.isArray(data) ? data : void 0;
740
- switch (provider) {
741
- case "tei":
742
- case "sno-gpu": return parseItems(data, ["score", "relevance_score"]) ?? parseItems(objectData?.results, ["score", "relevance_score"]) ?? parseItems(objectData?.data, ["score", "relevance_score"]);
743
- case "dashscope": {
744
- const output = objectData?.output;
745
- if (output) return parseItems(output.results, ["relevance_score", "score"]);
746
- return parseItems(objectData?.results, ["relevance_score", "score"]);
747
- }
748
- case "pinecone": return parseItems(objectData?.data, ["score", "relevance_score"]) ?? parseItems(objectData?.results, ["score", "relevance_score"]);
749
- case "voyage": return parseItems(objectData?.data, ["relevance_score", "score"]) ?? parseItems(objectData?.results, ["relevance_score", "score"]);
750
- default: return parseItems(objectData?.results, ["relevance_score", "score"]) ?? parseItems(objectData?.data, ["relevance_score", "score"]);
751
- }
665
+ return parseItems(data) ?? parseItems(objectData?.results) ?? parseItems(objectData?.data);
752
666
  }
753
667
  //#endregion
754
668
  //#region src/engine/retrieval/retriever-rerank.ts
@@ -816,11 +730,9 @@ async function fetchRerankWithRetry(send, stop) {
816
730
  for (let attempt = 1; attempt <= RERANK_TRANSIENT_ATTEMPTS; attempt += 1) {
817
731
  let retryDelayMs = RERANK_TRANSIENT_BACKOFF_MS * attempt;
818
732
  try {
819
- const response = await send();
820
- if (response.ok) return {
821
- response,
822
- data: await response.json()
823
- };
733
+ const reply = await send();
734
+ const { response } = reply;
735
+ if (response.ok) return reply;
824
736
  if (!RERANK_TRANSIENT_STATUSES.has(response.status) || attempt === RERANK_TRANSIENT_ATTEMPTS) return { response };
825
737
  if (response.status === 429) {
826
738
  const retryAfter = response.headers.get("retry-after");
@@ -852,13 +764,12 @@ Object.assign(MemoryRetriever.prototype, {
852
764
  async rerank(query, candidates, queryVector, options) {
853
765
  if (candidates.length === 0) return { candidates };
854
766
  if (this.config.rerank === "none") return { candidates };
855
- const provider = this.config.rerankProvider ?? "none";
856
- const unranked = () => provider === "sno-gpu" ? this.rerankLightweight(candidates, queryVector) : candidates;
857
- if (this.config.rerank === "cross-encoder" && !this.config.rerankApiKey) throw new RetrievalError(`rerank "cross-encoder" requires retrieval.rerankApiKey (provider: ${provider}); set the key, or set retrieval.rerank to "lightweight" to choose the local ranker`);
858
- if (this.config.rerank === "lightweight" || !this.config.rerankApiKey) return { candidates: this.rerankLightweight(candidates, queryVector) };
859
- const rerankEndpoint = this.config.rerankEndpoint ?? RERANK_DEFAULT_ENDPOINTS[provider];
767
+ const unranked = () => this.rerankLightweight(candidates, queryVector);
768
+ if (this.config.rerank === "cross-encoder" && !this.config.rerankApiKey) throw new RetrievalError("rerank \"cross-encoder\" requires retrieval.rerankApiKey; set the key, or set retrieval.rerank to \"lightweight\" to choose the local ranker");
769
+ if (this.config.rerank === "lightweight" || !this.config.rerankApiKey) return await this.rerankLocalModel(query, this.rerankLightweight(candidates, queryVector), options?.deadlineAt, options?.signal);
770
+ const rerankEndpoint = this.config.rerankEndpoint;
860
771
  if (!rerankEndpoint) {
861
- log.warn("rerank skipped: no endpoint for provider", { provider }, {
772
+ log.warn("rerank skipped: no reranker address", {}, {
862
773
  event_name: "memory.retriever_rerank.diagnostic",
863
774
  file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
864
775
  function: "rerank",
@@ -866,15 +777,12 @@ Object.assign(MemoryRetriever.prototype, {
866
777
  });
867
778
  return {
868
779
  candidates: unranked(),
869
- fallback: {
870
- reason: "no_endpoint",
871
- provider
872
- }
780
+ fallback: { reason: "no_endpoint" }
873
781
  };
874
782
  }
875
783
  const rerankTimeoutMs = this.config.rerankTimeoutMs ?? 15e3;
876
- const stepEnds = [options?.signal, provider === "sno-gpu" ? AbortSignal.timeout(Math.max(0, Math.floor(options?.deadlineAt === void 0 ? rerankTimeoutMs : options.deadlineAt - Date.now()))) : void 0].filter((each) => each !== void 0);
877
- const stepStop = stepEnds.length > 0 ? AbortSignal.any(stepEnds) : void 0;
784
+ const stepBudget = AbortSignal.timeout(Math.max(0, Math.floor(options?.deadlineAt === void 0 ? rerankTimeoutMs : options.deadlineAt - Date.now())));
785
+ const stepStop = options?.signal ? AbortSignal.any([options.signal, stepBudget]) : stepBudget;
878
786
  const rerankApiKey = this.config.rerankApiKey;
879
787
  const maxCandidates = this.config.rerankMaxCandidates;
880
788
  const overCap = maxCandidates !== void 0 && candidates.length > maxCandidates;
@@ -896,10 +804,7 @@ Object.assign(MemoryRetriever.prototype, {
896
804
  });
897
805
  return {
898
806
  candidates: unranked(),
899
- fallback: {
900
- reason: "query_over_window",
901
- provider
902
- }
807
+ fallback: { reason: "query_over_window" }
903
808
  };
904
809
  }
905
810
  let truncatedCandidates = 0;
@@ -922,20 +827,54 @@ Object.assign(MemoryRetriever.prototype, {
922
827
  const runBatch = async (start) => {
923
828
  let batchTexts = rerankTexts.slice(start, start + batchSize);
924
829
  for (let pass = 0;; pass += 1) {
925
- const { headers, body } = buildRerankRequest(provider, rerankApiKey, this.config.rerankModel ?? "rerank-2", query, batchTexts, batchTexts.length);
926
- const { response, data } = await fetchRerankWithRetry(() => fetch(rerankEndpoint, {
927
- method: "POST",
928
- headers: provider === "sno-gpu" ? {
929
- ...headers,
930
- "X-Request-ID": randomUUID()
931
- } : headers,
932
- body: JSON.stringify(body),
933
- signal: stepStop ? AbortSignal.any([AbortSignal.timeout(rerankTimeoutMs), stepStop]) : AbortSignal.timeout(rerankTimeoutMs)
934
- }), stepStop);
830
+ const { headers, body } = buildRerankRequest(rerankApiKey, query, batchTexts);
831
+ const sendAttempt = async () => {
832
+ const clientRequestId = randomUUID();
833
+ const attemptStarted = performance.now();
834
+ let outcome = "failed";
835
+ let statusCode;
836
+ try {
837
+ const attempt = await fetch(rerankEndpoint, {
838
+ method: "POST",
839
+ headers: {
840
+ ...headers,
841
+ "X-Request-ID": clientRequestId
842
+ },
843
+ body: JSON.stringify(body),
844
+ signal: AbortSignal.any([AbortSignal.timeout(rerankTimeoutMs), stepStop])
845
+ });
846
+ statusCode = attempt.status;
847
+ if (!attempt.ok) {
848
+ outcome = "http_error";
849
+ return { response: attempt };
850
+ }
851
+ const data = await attempt.json();
852
+ outcome = "success";
853
+ return {
854
+ response: attempt,
855
+ data
856
+ };
857
+ } catch (error) {
858
+ outcome = isRerankTimeout(error) ? "timeout" : "failed";
859
+ throw error;
860
+ } finally {
861
+ log.info("Rerank request completed", {
862
+ outcome,
863
+ status_code: statusCode ?? "unavailable",
864
+ duration_ms: performance.now() - attemptStarted,
865
+ texts_sent: batchTexts.length,
866
+ client_request_id: clientRequestId
867
+ }, {
868
+ event_name: "rerank.request.completed",
869
+ file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
870
+ function: "runBatch",
871
+ site_id: "rerank.request.completed"
872
+ });
873
+ }
874
+ };
875
+ const { response, data } = await fetchRerankWithRetry(sendAttempt, stepStop);
935
876
  if (!response.ok) {
936
877
  const retryAfter = response.headers.get("retry-after");
937
- const fatalError = buildRerankHttpError(response.status);
938
- if (fatalError && provider !== "sno-gpu") throw fatalError;
939
878
  const errorBody = await response.text().catch(() => "<unreadable body>");
940
879
  const refusal = pass === 0 ? parseOverWindowRefusal(errorBody) : void 0;
941
880
  if (refusal) {
@@ -977,10 +916,9 @@ Object.assign(MemoryRetriever.prototype, {
977
916
  });
978
917
  return "http_error";
979
918
  }
980
- const parsed = parseRerankResponse(provider, data);
919
+ const parsed = parseRerankResponse(data);
981
920
  if (!parsed) {
982
921
  log.warn("rerank API returned unparseable response", {
983
- provider,
984
922
  endpoint_hash: createHash("sha256").update(rerankEndpoint).digest("hex"),
985
923
  batchStart: start
986
924
  }, {
@@ -1012,10 +950,7 @@ Object.assign(MemoryRetriever.prototype, {
1012
950
  for (const outcome of settled) if (outcome.status === "rejected") throw outcome.reason;
1013
951
  for (const outcome of settled) if (outcome.status === "fulfilled" && typeof outcome.value === "string") return {
1014
952
  candidates: unranked(),
1015
- fallback: {
1016
- reason: outcome.value,
1017
- provider
1018
- }
953
+ fallback: { reason: outcome.value }
1019
954
  };
1020
955
  for (const outcome of settled) if (outcome.status === "fulfilled" && typeof outcome.value !== "string") items.push(...outcome.value);
1021
956
  }
@@ -1030,8 +965,7 @@ Object.assign(MemoryRetriever.prototype, {
1030
965
  const candidate = toRerank[item.index];
1031
966
  if (!candidate) continue;
1032
967
  const sourceScore = this.getRerankSourceScore(candidate);
1033
- let crossScore = item.score;
1034
- if (provider === "tei" || provider === "sno-gpu") crossScore = 1 / (1 + Math.exp(-item.score));
968
+ const crossScore = 1 / (1 + Math.exp(-item.score));
1035
969
  const blendedScore = clamp01(crossScore * blendCross + sourceScore * blendVector, 0);
1036
970
  reranked.push({
1037
971
  ...candidate,
@@ -1050,8 +984,7 @@ Object.assign(MemoryRetriever.prototype, {
1050
984
  log.debug("reranked", {
1051
985
  totalCandidateCount: candidates.length,
1052
986
  sentToRerankCount: toRerank.length,
1053
- returnedCount: reranked.length,
1054
- provider
987
+ returnedCount: reranked.length
1055
988
  }, {
1056
989
  event_name: "memory.retriever_rerank.diagnostic",
1057
990
  file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
@@ -1094,10 +1027,7 @@ Object.assign(MemoryRetriever.prototype, {
1094
1027
  }
1095
1028
  return {
1096
1029
  candidates: unranked(),
1097
- fallback: {
1098
- reason,
1099
- provider
1100
- }
1030
+ fallback: { reason }
1101
1031
  };
1102
1032
  }
1103
1033
  },
@@ -1106,8 +1036,8 @@ Object.assign(MemoryRetriever.prototype, {
1106
1036
  if (candidates.length === 0) return candidates;
1107
1037
  const chunkIds = candidates.map((c) => c.chunkId).filter((id) => id !== void 0);
1108
1038
  const vectorMap = chunkIds.length > 0 ? this.store.getVectorsByIds(chunkIds) : /* @__PURE__ */ new Map();
1109
- const wF = this.config.lightweightFusionWeight ?? .7;
1110
- const wC = this.config.lightweightCosineWeight ?? .3;
1039
+ const wF = this.config.lightweightFusionWeight ?? .1;
1040
+ const wC = this.config.lightweightCosineWeight ?? .9;
1111
1041
  let blendedCount = 0;
1112
1042
  let dimMismatchCount = 0;
1113
1043
  const reranked = candidates.map((candidate) => {
@@ -1168,6 +1098,58 @@ Object.assign(MemoryRetriever.prototype, {
1168
1098
  return a.entry.id.localeCompare(b.entry.id);
1169
1099
  });
1170
1100
  },
1101
+ /**
1102
+ * The local reranker model reorders the first candidates of the local ranking. Their order is unchanged while the
1103
+ * model is not loaded yet (the first call starts loading it), past the caller's deadline, and after a cancel.
1104
+ */
1105
+ async rerankLocalModel(query, ordered, deadlineAt, signal) {
1106
+ if (ordered.length < 2 || signal?.aborted || deadlineAt !== void 0 && Date.now() >= deadlineAt) return { candidates: ordered };
1107
+ const head = ordered.slice(0, 15);
1108
+ const started = performance.now();
1109
+ const budgetMs = deadlineAt === void 0 ? this.config.rerankTimeoutMs ?? 15e3 : Math.max(0, Math.floor(deadlineAt - Date.now()));
1110
+ const stop = signal ? AbortSignal.any([signal, AbortSignal.timeout(budgetMs)]) : AbortSignal.timeout(budgetMs);
1111
+ const scoring = this.embedder.scoreRelevance(query, head.map((r) => r.entry.text), stop).catch((error) => {
1112
+ log.warn("local reranker failed; recall keeps the local ranking order", { error }, {
1113
+ event_name: "memory.retriever_rerank.diagnostic",
1114
+ file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
1115
+ function: "rerankLocalModel",
1116
+ site_id: "retrieval.retriever-rerank.rerankLocalModel.failed"
1117
+ });
1118
+ });
1119
+ const logits = await Promise.race([scoring, new Promise((resolve) => stop.addEventListener("abort", () => resolve(void 0), { once: true }))]);
1120
+ if (!logits || signal?.aborted) return { candidates: ordered };
1121
+ const blended = head.map((candidate, index) => ({
1122
+ candidate,
1123
+ value: logits[index] ?? Number.NEGATIVE_INFINITY
1124
+ }));
1125
+ blended.sort((a, b) => b.value - a.value || a.candidate.entry.id.localeCompare(b.candidate.entry.id));
1126
+ const slots = head.map((candidate) => candidate.score).sort((a, b) => b - a);
1127
+ const rescored = blended.map(({ candidate }, index) => {
1128
+ const score = slots[index] ?? candidate.score;
1129
+ return {
1130
+ ...candidate,
1131
+ score,
1132
+ rerankScore: score,
1133
+ sources: {
1134
+ ...candidate.sources,
1135
+ reranked: { score }
1136
+ }
1137
+ };
1138
+ });
1139
+ log.debug("local reranker applied", {
1140
+ scored: head.length,
1141
+ duration_ms: performance.now() - started
1142
+ }, {
1143
+ event_name: "memory.retriever_rerank.diagnostic",
1144
+ file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
1145
+ function: "rerankLocalModel",
1146
+ site_id: "retrieval.retriever-rerank.rerankLocalModel.applied"
1147
+ });
1148
+ return {
1149
+ candidates: [...rescored, ...ordered.slice(head.length)],
1150
+ modelOrder: blended.map(({ candidate }) => candidate.entry.id)
1151
+ };
1152
+ },
1171
1153
  getRerankSourceScore(result) {
1172
1154
  return clamp01(Math.max(result.sources.bm25?.score ?? 0, result.sources.vector?.score ?? 0), 0);
1173
1155
  }
@@ -1359,8 +1341,21 @@ function tracedStage(trace, name, skipReason, run, input) {
1359
1341
  trace.endStage(output.map((result) => result.entry.id), output.map((result) => result.score), skipReason === void 0 ? void 0 : { skipped: skipReason });
1360
1342
  return output;
1361
1343
  }
1344
+ /** The candidates the local reranker model scored take their own scores, highest first, in its order. */
1345
+ function orderByLocalModel(results, modelOrder) {
1346
+ const present = new Set(results.map((result) => result.entry.id));
1347
+ const order = modelOrder.filter((id) => present.has(id));
1348
+ if (order.length < 2) return results;
1349
+ const judged = new Set(order);
1350
+ const slots = results.filter((result) => judged.has(result.entry.id)).map((result) => result.score).sort((a, b) => b - a);
1351
+ const scores = new Map(order.map((id, index) => [id, slots[index] ?? 0]));
1352
+ return results.map((result) => ({
1353
+ ...result,
1354
+ score: scores.get(result.entry.id) ?? result.score
1355
+ })).sort((a, b) => b.score - a.score);
1356
+ }
1362
1357
  Object.assign(MemoryRetriever.prototype, {
1363
- applyScoringPipeline(results, trace, limit = results.length) {
1358
+ applyScoringPipeline(results, trace, limit = results.length, modelOrder) {
1364
1359
  const stage = (name, skipReason, run, input) => tracedStage(trace, name, skipReason, run, input);
1365
1360
  const temporalOff = !this.config.temporalWeighting;
1366
1361
  let scored = stage("recency_boost", temporalOff ? "temporalWeighting" : this.config.recencyHalfLifeDays <= 0 ? "recencyHalfLifeDays" : this.config.recencyWeight <= 0 ? "recencyWeight" : void 0, (input) => temporalOff ? input : this.applyRecencyBoost(input), results);
@@ -1368,6 +1363,7 @@ Object.assign(MemoryRetriever.prototype, {
1368
1363
  scored = stage("length_normalization", this.config.lengthNormAnchor <= 0 ? "lengthNormAnchor" : void 0, (input) => this.applyLengthNormalization(input), scored);
1369
1364
  scored = stage("time_decay", temporalOff ? "temporalWeighting" : this.config.timeDecayHalfLifeDays <= 0 ? "timeDecayHalfLifeDays" : void 0, (input) => temporalOff ? input : this.applyTimeDecay(input), scored);
1370
1365
  scored = stage("retention_boost", temporalOff ? "temporalWeighting" : this.config.recallLifecycle?.retentionScorer === true ? void 0 : "recallLifecycle.retentionScorer", (input) => temporalOff ? input : this.applyRetentionBoost(input), scored);
1366
+ scored = stage("local_model_order", modelOrder ? void 0 : "modelOrder", (input) => modelOrder ? orderByLocalModel(input, modelOrder) : input, scored);
1371
1367
  scored = stage("hard_min_score", void 0, (input) => input.filter((result) => result.score >= this.config.hardMinScore), scored);
1372
1368
  const mmrOff = experimentMmrDisabled();
1373
1369
  scored = stage("mmr_diversity", mmrOff ? "experiment.disableMmr" : void 0, (input) => {
@@ -1,13 +1,13 @@
1
- import { h as MemoryCategory, l as DecayScore, r as AggregationQuery, u as DecayableMemory, x as RetrievalResult, y as MemorySearchResult } from "./types-DZGL4QXi.js";
2
- import { sn as RecallLifecycleConfig } from "./index-Pb9LrHgL.js";
3
- import { t as Embedder } from "./embedding-provider-client-vynZMuit.js";
1
+ import { h as MemoryCategory, l as DecayScore, r as AggregationQuery, u as DecayableMemory, x as RetrievalResult, y as MemorySearchResult } from "./types-DBEwNYdR.js";
2
+ import { sn as RecallLifecycleConfig } from "./index-BGu91bjB.js";
3
+ import { t as Embedder } from "./embedding-provider-client-CELWtPgt.js";
4
4
  import "./trace-C1JxMfs-.js";
5
- import "./memory-metadata-codec-BQ8tBY-g.js";
5
+ import "./memory-metadata-codec-CfP9JLVO.js";
6
6
  import { K as RemFacetPolicy } from "./index-DPfJrOFD.js";
7
- import { C as MemoryStore } from "./memory-store-base-CTAMKigD.js";
8
- import "./store-DraRJ-HI.js";
9
- import { n as AccessTracker } from "./access-tracker-CglGg8uS.js";
10
- import { r as TierPromoter } from "./memory-tier-promoter-CSGa4LBH.js";
7
+ import { C as MemoryStore } from "./memory-store-base-upd9MuG6.js";
8
+ import "./store-DEG06TLb.js";
9
+ import { n as AccessTracker } from "./access-tracker-B1H2AJlH.js";
10
+ import { r as TierPromoter } from "./memory-tier-promoter-Cq23yveQ.js";
11
11
  import "@snoai/utils/logger";
12
12
  //#region src/engine/retrieval/retrieval-trace.d.ts
13
13
  /** @file retrieval-trace.ts
@@ -209,7 +209,6 @@ declare class RetrievalStatsCollector {
209
209
  }
210
210
  //#endregion
211
211
  //#region src/engine/retrieval/retrieval-config.d.ts
212
- type RerankProvider = "jina" | "siliconflow" | "voyage" | "pinecone" | "dashscope" | "tei" | "sno-gpu";
213
212
  interface RetrievalConfig {
214
213
  /** Enable the historical recency, decay, and retention score transforms. */
215
214
  temporalWeighting: boolean;
@@ -228,7 +227,6 @@ interface RetrievalConfig {
228
227
  /** Dynamic memories decay 3× faster in time-decay scoring (default ON) */
229
228
  temporalDecay: boolean;
230
229
  rerankApiKey?: string;
231
- rerankModel?: string;
232
230
  rerankTimeoutMs?: number;
233
231
  lengthNormAnchor: number;
234
232
  hardMinScore: number;
@@ -247,15 +245,10 @@ interface RetrievalConfig {
247
245
  timeDecayFloor?: number;
248
246
  /** Relevance vs diversity tradeoff (default: 0.7) */
249
247
  mmrLambda?: number;
250
- /** Custom rerank API endpoint URL */
248
+ /** Address of Sno's reranker (the Sno GPU address plus `/rerank`) */
251
249
  rerankEndpoint?: string;
252
- /** Rerank provider name */
253
- rerankProvider?: RerankProvider | string;
254
250
  /**
255
- * Hard cap on how many candidates are sent to the cross-encoder rerank API
256
- * in one request. Some rerank deployments (e.g. this repo's Sno TEI
257
- * reranker) reject a batch above a fixed size instead of truncating it, so
258
- * an unset value here must never silently violate that limit. Candidates
251
+ * Cap on how many candidates are sent to Sno's reranker in total. Candidates
259
252
  * beyond the cap are NOT dropped — they still flow through the standard
260
253
  * `unreturned` preservation-floor path, same as a real reranker choosing
261
254
  * not to return them.
@@ -361,12 +354,10 @@ interface RetentionScorer {
361
354
  *
362
355
  * - `missing_api_key`: cross-encoder configured but no rerankApiKey set;
363
356
  * call routes through the lightweight cosine path instead.
364
- * - `no_endpoint`: provider has no known endpoint in `RERANK_DEFAULT_ENDPOINTS`
365
- * and `rerankEndpoint` was not overridden; rerank was skipped.
366
- * - `http_error`: provider responded with a non-OK status that did not map
367
- * to a fatal RetrievalError (i.e. degraded but not propagated).
368
- * - `invalid_response`: provider HTTP 2xx but response shape did not parse.
369
- * - `timeout`: the per-call AbortSignal fired before the provider responded.
357
+ * - `no_endpoint`: no reranker address (`rerankEndpoint`) was set; rerank was skipped.
358
+ * - `http_error`: the reranker responded with a non-OK status.
359
+ * - `invalid_response`: the reranker answered HTTP 2xx but the response shape did not parse.
360
+ * - `timeout`: the per-call AbortSignal fired before the reranker responded.
370
361
  * - `request_error`: any other thrown error inside the fetch path.
371
362
  * - `query_over_window`: the query alone fills the reranker's per-pair token window, so no
372
363
  * document could be sent with it. Nothing was requested.
@@ -375,10 +366,11 @@ declare const RERANK_FALLBACK_REASONS: readonly ["missing_api_key", "no_endpoint
375
366
  type RerankFallbackReason = (typeof RERANK_FALLBACK_REASONS)[number];
376
367
  interface RerankFallbackSignal {
377
368
  reason: RerankFallbackReason;
378
- provider: string;
379
369
  }
380
370
  interface RerankOutcome {
381
371
  candidates: RetrievalResult[];
372
+ /** Ids of the candidates the local reranker model scored, in its order; the scoring pipeline restores it last. */
373
+ modelOrder?: string[];
382
374
  fallback?: RerankFallbackSignal;
383
375
  stats?: {
384
376
  rerankSentCount: number;
@@ -459,8 +451,9 @@ interface MemoryRetrieverInternals {
459
451
  deadlineAt?: number;
460
452
  }): Promise<RerankOutcome>;
461
453
  rerankLightweight(candidates: RetrievalResult[], queryVector: Float32Array): RetrievalResult[];
454
+ rerankLocalModel(query: string, ordered: RetrievalResult[], deadlineAt?: number, signal?: AbortSignal): Promise<RerankOutcome>;
462
455
  getRerankSourceScore(result: RetrievalResult): number;
463
- applyScoringPipeline(results: RetrievalResult[], trace?: TraceCollector, limit?: number): RetrievalResult[];
456
+ applyScoringPipeline(results: RetrievalResult[], trace?: TraceCollector, limit?: number, modelOrder?: readonly string[]): RetrievalResult[];
464
457
  applyRecencyBoost(results: RetrievalResult[]): RetrievalResult[];
465
458
  applyImportanceWeight(results: RetrievalResult[]): RetrievalResult[];
466
459
  applyLengthNormalization(results: RetrievalResult[]): RetrievalResult[];
@@ -473,4 +466,4 @@ declare function createRetriever(store: MemoryStore, embedder: Embedder, logger?
473
466
  warn: (message: string, fields?: Record<string, unknown>) => void;
474
467
  }, config?: RetrievalConfig): MemoryRetriever;
475
468
  //#endregion
476
- export { RerankFallbackSignal as a, collectParallelStage as c, RetrievalConfig as d, RetrievalContext as f, RerankFallbackReason as i, DEFAULT_RETRIEVAL_CONFIG as l, MemoryRetrieverInternals as n, RerankOutcome as o, withServingValidityDefault as p, RERANK_FALLBACK_REASONS as r, createRetriever as s, MemoryRetriever as t, RerankProvider as u };
469
+ export { RerankFallbackSignal as a, collectParallelStage as c, RetrievalContext as d, withServingValidityDefault as f, RerankFallbackReason as i, DEFAULT_RETRIEVAL_CONFIG as l, MemoryRetrieverInternals as n, RerankOutcome as o, RERANK_FALLBACK_REASONS as r, createRetriever as s, MemoryRetriever as t, RetrievalConfig as u };
@@ -1,4 +1,4 @@
1
- import "./paths-B5y-npWs.js";
1
+ import "./paths-qJqwGcKl.js";
2
2
  //#region src/engine/operations/runtime-audit-log.d.ts
3
3
  type AuditEvent = "tool_call" | "hook_trigger" | "kill_switch" | "startup" | "error" | "auto_recall" | "ambient_learning" | "session_summary" | "envelope_strip" | "storage_integrity" | "memory_injected" | "memory_searched" | "memory_read" | "memory_updated" | "memory_superseded" | "memory_deleted" | "memory_purged" | "rem_trigger_evaluated" | "rem_triggered" | "rem_completed" | "rem_failed";
4
4
  type AuditStatus = "ok" | "error" | "skipped" | "partial";
@@ -1,16 +1,16 @@
1
- import { At as getAuditPath, Dt as appendAuditEntryStrict, K as REM_BUILT_OPERATION_TYPES, Ot as compactAuditLog, Pt as readJsonlLines, bt as ModelCallRefusedError, d as RemJobStore, f as parseRemJobStats, n as remNeedsHost, q as parseRemOperationType } from "./rem-trigger-B1P5_RqV.js";
2
- import { C as getSnoStationMemStateDir, Fr as MEMORY_SKIN_HEADER, Lr as memoryMethod, Mr as MEMORY_ERROR_STATUS, Pr as MEMORY_ROUTES, S as getSidecarSocketPath, _ as readRemTestHoldMs, c as REM_SIDECAR_ORIGIN, d as getRemDiscoveryPath, f as getRemJobJournalPath, g as readRemOperationalConfig, i as REM_JOBS_PATH_PREFIX, jr as MEMORY_DEFAULT_SKIN_ID, l as REM_SOURCE, r as REM_CORRELATION_ID_HEADER, rr as MEMORY_SHUTDOWN_TIMEOUT_MS, s as REM_SIDECAR_HOST, u as getRemChassisJournalPath, v as SettingsUnavailableError, y as getDiscoveryPath } from "./config-D_KOwEyg.js";
1
+ import { At as getAuditPath, Dt as appendAuditEntryStrict, K as REM_BUILT_OPERATION_TYPES, Ot as compactAuditLog, Pt as readJsonlLines, bt as ModelCallRefusedError, d as RemJobStore, f as parseRemJobStats, n as remNeedsHost, q as parseRemOperationType } from "./rem-trigger-DL0MlLeo.js";
2
+ import { C as getSnoStationMemStateDir, Fr as MEMORY_SKIN_HEADER, Lr as memoryMethod, Mr as MEMORY_ERROR_STATUS, Pr as MEMORY_ROUTES, S as getSidecarSocketPath, _ as readRemTestHoldMs, c as REM_SIDECAR_ORIGIN, d as getRemDiscoveryPath, f as getRemJobJournalPath, g as readRemOperationalConfig, i as REM_JOBS_PATH_PREFIX, jr as MEMORY_DEFAULT_SKIN_ID, l as REM_SOURCE, nr as MEMORY_SHUTDOWN_TIMEOUT_MS, r as REM_CORRELATION_ID_HEADER, s as REM_SIDECAR_HOST, u as getRemChassisJournalPath, v as SettingsUnavailableError, y as getDiscoveryPath } from "./config-DWeuetYo.js";
3
3
  import { t as ContractError } from "./error-D-wb-rZw.js";
4
4
  import { setImmediate } from "node:timers/promises";
5
5
  import { createLogger, currentLogContext, effectiveLogLevel, emitDiagnostic } from "@snoai/utils/logger";
6
6
  import path from "node:path";
7
7
  import { constants, existsSync, readFileSync, rmSync } from "node:fs";
8
- import { z } from "zod";
9
8
  import { randomBytes, randomUUID } from "node:crypto";
9
+ import { createServer } from "node:http";
10
+ import { z } from "zod";
10
11
  import { mkdir, open, readFile, rename, rm } from "node:fs/promises";
11
12
  import { withLogContext as withLogContext$1 } from "@snoai/utils/log-context";
12
- import { createConnection, createServer } from "node:net";
13
- import { createServer as createServer$1 } from "node:http";
13
+ import { createConnection, createServer as createServer$1 } from "node:net";
14
14
  import { tryLock } from "fs-native-extensions";
15
15
  //#region src/contract/discovery.ts
16
16
  const discoverySchema = z.strictObject({
@@ -268,7 +268,7 @@ async function bindSidecarSocket() {
268
268
  const lock = await open(`${socketPath}.lock`, constants.O_RDWR | constants.O_CREAT | constants.O_NOFOLLOW, 384);
269
269
  try {
270
270
  while (!tryLock(lock.fd)) await setImmediate();
271
- const guard = createServer((socket) => socket.destroy());
271
+ const guard = createServer$1((socket) => socket.destroy());
272
272
  for (;;) try {
273
273
  await new Promise((resolve, reject) => {
274
274
  guard.once("error", reject);
@@ -335,7 +335,7 @@ async function startOwnedRemSidecar() {
335
335
  async open() {
336
336
  if (currentMemory) return currentMemory;
337
337
  if (settingsError) throw settingsError;
338
- openingMemory ??= import("./memory-runtime-4iOpeP09.js").then((module) => module.MemoryRuntimePool.open()).then((pool) => {
338
+ openingMemory ??= import("./memory-runtime-jQke2sBc.js").then((module) => module.MemoryRuntimePool.open()).then((pool) => {
339
339
  currentMemory = pool;
340
340
  if (stopping) pool.stopTimers();
341
341
  return pool;
@@ -372,7 +372,7 @@ async function startOwnedRemSidecar() {
372
372
  };
373
373
  const activeTasks = /* @__PURE__ */ new Set();
374
374
  const pendingRequests = /* @__PURE__ */ new Set();
375
- const server = createServer$1((request, response) => {
375
+ const server = createServer((request, response) => {
376
376
  const started = performance.now();
377
377
  const operationId = `rem-http-${randomUUID()}`;
378
378
  const context = {};
@@ -730,7 +730,7 @@ async function runChassisJob(store, journal, waveId, holdMs, runtime) {
730
730
  cleanRefusalReasons.push(reason);
731
731
  await appendChassisRefusal(journal, queued, operation, "refused", reason);
732
732
  }
733
- const { runRemProductionOrderedWave } = await import("./rem-batch-executor-CfWChDAk.js");
733
+ const { runRemProductionOrderedWave } = await import("./rem-batch-executor-B_49KivZ.js");
734
734
  const result = enabledOperations.length === 0 ? {
735
735
  decision: "allow",
736
736
  reasonCode: null,