@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.
- package/README.md +1 -1
- package/dist/{access-tracker-CglGg8uS.d.ts → access-tracker-B1H2AJlH.d.ts} +4 -4
- package/dist/{adapter-Cxyzdq6H.d.ts → adapter-CgdVA88V.d.ts} +2 -2
- package/dist/{agent-llm-port-DY2290EK.d.ts → agent-llm-port-BlFrD2ro.d.ts} +5 -0
- package/dist/{atomic-memory-extraction-DO4yTfch.d.ts → atomic-memory-extraction-DCMTQ0h-.d.ts} +4 -4
- package/dist/{atomic-memory-extraction-DWhlXJT6.js → atomic-memory-extraction-De86y7O-.js} +4 -4
- package/dist/{b-profile-section-dictionary-provider-BkUdS1SY.d.ts → b-profile-section-dictionary-provider-DbqdRYMw.d.ts} +1 -1
- package/dist/{capture-policy-detector-C7MA4jSr.d.ts → capture-policy-detector-D4ziS7KF.d.ts} +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/{config-D_KOwEyg.js → config-DWeuetYo.js} +740 -447
- package/dist/{derived-suppression-cache-CmS4xAaN.d.ts → derived-suppression-cache-2xOq6XHX.d.ts} +1 -1
- package/dist/diagnostic-encoder.js +1 -1
- package/dist/{embedding-provider-client-vynZMuit.d.ts → embedding-provider-client-CELWtPgt.d.ts} +6 -0
- package/dist/{embedding-provider-client-40tpzKou.js → embedding-provider-client-CgpUK_1G.js} +16 -1
- package/dist/{index-Pb9LrHgL.d.ts → index-BGu91bjB.d.ts} +25 -19
- package/dist/{index-CTi1R9T4.d.ts → index-PjHhlG6e.d.ts} +2 -2
- package/dist/index.d.ts +11 -11
- package/dist/index.js +5 -5
- package/dist/internal/config/index.d.ts +2 -2
- package/dist/internal/config/index.js +25 -19
- package/dist/internal/config/plugin-config-schema.d.ts +1 -1
- package/dist/internal/config/plugin-config-schema.js +1 -1
- package/dist/internal/config/product-mode.d.ts +1 -1
- package/dist/internal/config/settings.d.ts +1 -1
- package/dist/internal/config/settings.js +3 -30
- package/dist/internal/config/skin-defaults.d.ts +1 -1
- package/dist/internal/contract/profile.d.ts +1 -1
- package/dist/internal/contract/routes.d.ts +1 -1
- package/dist/internal/engine/bindings/memory-cli-shared.d.ts +5 -5
- package/dist/internal/engine/bindings/memory-forget-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-list-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-recall-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-reflection-resolve-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-stats-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-store-tool.js +3 -3
- package/dist/internal/engine/bindings/memory-tool-access.d.ts +1 -1
- package/dist/internal/engine/bindings/memory-tool-access.js +1 -1
- package/dist/internal/engine/bindings/memory-tool-results.d.ts +1 -1
- package/dist/internal/engine/bindings/memory-tool-results.js +1 -1
- package/dist/internal/engine/bindings/memory-tool-schemas.d.ts +6 -6
- package/dist/internal/engine/bindings/memory-tool-schemas.js +1 -1
- package/dist/internal/engine/bindings/memory-update-tool.js +2 -2
- package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.d.ts +5 -5
- package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.js +2 -2
- package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.d.ts +4 -4
- package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.js +1 -1
- package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.d.ts +7 -7
- package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.js +2 -2
- package/dist/internal/engine/bindings/sno-station-mem-message-transcript.js +2 -2
- package/dist/internal/engine/bindings/sno-station-mem-reset-hook.d.ts +4 -4
- package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.d.ts +1 -1
- package/dist/internal/engine/extraction/atomic-memory-extraction.d.ts +1 -1
- package/dist/internal/engine/extraction/atomic-memory-extraction.js +1 -1
- package/dist/internal/engine/extraction/b-profile-section-dictionary-provider.d.ts +1 -1
- package/dist/internal/engine/extraction/b-profile-section-rekey.d.ts +5 -5
- package/dist/internal/engine/extraction/capture-policy-detector.d.ts +1 -1
- package/dist/internal/engine/extraction/embedding-provider-client.d.ts +1 -1
- package/dist/internal/engine/extraction/embedding-provider-client.js +1 -1
- package/dist/internal/engine/extraction/memory-metadata-codec.d.ts +2 -2
- package/dist/internal/engine/extraction/memory-temporality-classifier.d.ts +1 -1
- package/dist/internal/engine/extraction/memory-temporality-classifier.js +1 -1
- package/dist/internal/engine/observability/adapter.d.ts +1 -1
- package/dist/internal/engine/observability/memory-snapshot.d.ts +1 -1
- package/dist/internal/engine/observability/observable-embedder.d.ts +1 -1
- package/dist/internal/engine/observability/observable-embedder.js +1 -1
- package/dist/internal/engine/observability/observable-llm-client.d.ts +1 -1
- package/dist/internal/engine/observability/observable-memory-store.d.ts +1 -1
- package/dist/internal/engine/observability/observable-memory-store.js +1 -1
- package/dist/internal/engine/observability/observable-retriever.d.ts +1 -1
- package/dist/internal/engine/observability/observable-retriever.js +1 -1
- package/dist/internal/engine/observability/runtime-diagnostics.d.ts +1 -1
- package/dist/internal/engine/observability/runtime-diagnostics.js +1 -1
- package/dist/internal/engine/operations/memory-tier-promoter.d.ts +1 -1
- package/dist/internal/engine/operations/runtime-audit-log.d.ts +2 -2
- package/dist/internal/engine/provider/provider-registration.d.ts +4 -4
- package/dist/internal/engine/provider/provider-row-renderer.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-command-hooks.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-command-hooks.js +1 -1
- package/dist/internal/engine/reflection/reflection-deps.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-embedded-generator.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-embedded-generator.js +1 -1
- package/dist/internal/engine/reflection/reflection-injection-hooks.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-injection-hooks.js +1 -1
- package/dist/internal/engine/reflection/reflection-lifecycle-hooks.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-lifecycle-hooks.js +1 -1
- package/dist/internal/engine/reflection/strategy-hook-runner.d.ts +3 -3
- package/dist/internal/engine/reflection/strategy-hook-runner.js +2 -2
- package/dist/internal/engine/retrieval/access-tracker.d.ts +1 -1
- package/dist/internal/engine/retrieval/retriever.d.ts +2 -2
- package/dist/internal/engine/retrieval/retriever.js +1 -1
- package/dist/internal/engine/shared/memory-kind-policy.d.ts +1 -1
- package/dist/internal/engine/shared/paths.d.ts +2 -2
- package/dist/internal/engine/shared/types.d.ts +2 -2
- package/dist/internal/engine/shared/types.js +1 -1
- package/dist/internal/engine/telemetry/observe-ledger.d.ts +1 -1
- package/dist/internal/model/agent-llm-port.d.ts +1 -1
- package/dist/internal/model/llm-client.d.ts +2 -2
- package/dist/internal/model/llm-client.js +1 -1
- package/dist/internal/model/llm-mode-routing.d.ts +1 -1
- package/dist/internal/store/maintenance.d.ts +2 -2
- package/dist/internal/store/maintenance.js +4 -4
- package/dist/internal/store/store.d.ts +2 -2
- package/dist/internal/store/store.js +1 -1
- package/dist/{llm-client-B7LSFL_m.d.ts → llm-client-C-K7oyfu.d.ts} +1 -1
- package/dist/{llm-client-C7yyFWu-.js → llm-client-DDdUjYWS.js} +10 -3
- package/dist/{log-site-catalog.generated-BODn_6Kx.js → log-site-catalog.generated-Cn8rTa65.js} +94 -73
- package/dist/log-site-catalog.json +1 -1
- package/dist/{memory-kind-policy-B4IBMAlv.d.ts → memory-kind-policy-DgPCjfY4.d.ts} +1 -1
- package/dist/{memory-metadata-codec-BQ8tBY-g.d.ts → memory-metadata-codec-CfP9JLVO.d.ts} +1 -1
- package/dist/{memory-runtime-4iOpeP09.js → memory-runtime-jQke2sBc.js} +118 -78
- package/dist/{memory-snapshot-B8mQbWR-.d.ts → memory-snapshot-B6a-6nJ7.d.ts} +2 -2
- package/dist/{memory-store-base-CTAMKigD.d.ts → memory-store-base-upd9MuG6.d.ts} +4 -4
- package/dist/{memory-temporality-classifier-epuZlfXa.js → memory-temporality-classifier-BwBKEQbL.js} +1 -1
- package/dist/{memory-temporality-classifier-LByFBiFJ.d.ts → memory-temporality-classifier-DPk3_9Or.d.ts} +1 -1
- package/dist/{memory-tier-promoter-CSGa4LBH.d.ts → memory-tier-promoter-Cq23yveQ.d.ts} +1 -1
- package/dist/memory-tool-dependencies-C9qgVGOn.d.ts +14 -0
- package/dist/{memory-tool-dependencies-xLaWzwpI.js → memory-tool-dependencies-aAr7Pkuj.js} +1 -1
- package/dist/{observable-embedder-Da0teBqx.d.ts → observable-embedder-DihQuuQD.d.ts} +2 -2
- package/dist/{observable-llm-client-i0sp0veF.d.ts → observable-llm-client-BglDBFN5.d.ts} +3 -3
- package/dist/{observable-memory-store-CS87pitJ.d.ts → observable-memory-store--n02Dre8.d.ts} +5 -5
- package/dist/{observable-retriever-Bhfg9DsZ.d.ts → observable-retriever-CV6odifA.d.ts} +6 -6
- package/dist/paths-qJqwGcKl.d.ts +1 -0
- package/dist/{plugin-config-schema-CvAGFPyE.js → plugin-config-schema-D9riSXDg.js} +3 -20
- package/dist/{plugin-config-schema-CcEeAEdi.d.ts → plugin-config-schema-dV2_HgBo.d.ts} +2 -8
- package/dist/{profile-BMvnRqf5.d.ts → profile-CoLKGobS.d.ts} +1 -1
- package/dist/{profile-section-writer-DeD9GPQJ.js → profile-section-writer-Dd4FKpt5.js} +2 -2
- package/dist/{reflection-command-hooks-S5L6ZWeh.js → reflection-command-hooks-B2P4zDr6.js} +3 -3
- package/dist/{reflection-command-hooks-CFXyoVvE.d.ts → reflection-command-hooks-Cfv836Wc.d.ts} +4 -4
- package/dist/{reflection-deps-BPMrDU0a.d.ts → reflection-deps-DihlwQxE.d.ts} +4 -4
- package/dist/{reflection-embedded-generator-CF-NbuPS.d.ts → reflection-embedded-generator-DCZaS6kz.d.ts} +4 -4
- package/dist/{reflection-embedded-generator-nmVrj4AZ.js → reflection-embedded-generator-DV-NkeU-.js} +1 -1
- package/dist/{reflection-injection-hooks-BRIr3lJM.d.ts → reflection-injection-hooks-BYxkrds6.d.ts} +4 -4
- package/dist/{reflection-lifecycle-hooks-Ci8y4qHk.d.ts → reflection-lifecycle-hooks-Bwq2y5pe.d.ts} +3 -3
- package/dist/{rem-batch-executor-CfWChDAk.js → rem-batch-executor-B_49KivZ.js} +1 -1
- package/dist/{rem-trigger-B1P5_RqV.js → rem-trigger-DL0MlLeo.js} +180 -160
- package/dist/{retriever-CpyZs2ND.js → retriever-CsBW6MZv.js} +158 -162
- package/dist/{retriever-DdikFSDC.d.ts → retriever-hTIkt3CJ.d.ts} +19 -26
- package/dist/{runtime-audit-log-BVOxzkh7.d.ts → runtime-audit-log-eBrt_iPp.d.ts} +1 -1
- package/dist/{server-DOL3D6bb.js → server-BnBzsvMF.js} +9 -9
- package/dist/sidecar/main.js +2 -2
- package/dist/sno-station-mem-runtime-dependencies-9L8WkMMV.d.ts +31 -0
- package/dist/{sno-station-mem-runtime-dependencies-DZe3z4RY.js → sno-station-mem-runtime-dependencies-DrVDRAmf.js} +6 -6
- package/dist/{store-DY_rWx__.js → store-COwW7mIh.js} +1 -1
- package/dist/{store-DraRJ-HI.d.ts → store-DEG06TLb.d.ts} +2 -2
- package/dist/{strategy-hook-runner-CltVTtzk.js → strategy-hook-runner-CALbWcys.js} +1 -1
- package/dist/{strategy-hook-runner-DH7OEQrH.d.ts → strategy-hook-runner-D1sRVThs.d.ts} +7 -7
- package/dist/{types-DZGL4QXi.d.ts → types-DBEwNYdR.d.ts} +1 -1
- package/package.json +2 -2
- package/settings.default.json +0 -4
- package/dist/memory-tool-dependencies-Bl11T6Xm.d.ts +0 -14
- package/dist/paths-B5y-npWs.d.ts +0 -1
- 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,
|
|
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`:
|
|
248
|
-
*
|
|
249
|
-
* - `
|
|
250
|
-
*
|
|
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
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
}
|
|
643
|
-
|
|
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
|
-
|
|
715
|
-
|
|
716
|
-
const parseItems = (items
|
|
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
|
|
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
|
-
|
|
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
|
|
820
|
-
|
|
821
|
-
|
|
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
|
|
856
|
-
|
|
857
|
-
if (this.config.rerank === "
|
|
858
|
-
|
|
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
|
|
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
|
|
877
|
-
const stepStop =
|
|
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(
|
|
926
|
-
const
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
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(
|
|
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
|
-
|
|
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 ?? .
|
|
1110
|
-
const wC = this.config.lightweightCosineWeight ?? .
|
|
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-
|
|
2
|
-
import { sn as RecallLifecycleConfig } from "./index-
|
|
3
|
-
import { t as Embedder } from "./embedding-provider-client-
|
|
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-
|
|
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-
|
|
8
|
-
import "./store-
|
|
9
|
-
import { n as AccessTracker } from "./access-tracker-
|
|
10
|
-
import { r as TierPromoter } from "./memory-tier-promoter-
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
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`:
|
|
365
|
-
*
|
|
366
|
-
* - `
|
|
367
|
-
*
|
|
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,
|
|
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-
|
|
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-
|
|
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,
|
|
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-
|
|
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
|
|
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-
|
|
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,
|