@snoai/memory 1.5.1 → 1.7.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-D-riPZRY.d.ts → access-tracker-CFxRg7Bt.d.ts} +4 -4
- package/dist/{adapter-BM58hult.d.ts → adapter-BFtbOOw3.d.ts} +2 -2
- package/dist/{atomic-extraction-reply-BJ9XV_9s.js → atomic-extraction-reply-DF_S9ROg.js} +6 -3
- package/dist/{atomic-memory-extraction-BNBCB1XD.d.ts → atomic-memory-extraction-Bp7AWZqi.d.ts} +4 -4
- package/dist/{atomic-memory-extraction-BaBrfESt.js → atomic-memory-extraction-pL1_58Kw.js} +45 -6
- package/dist/{b-profile-section-dictionary-provider-D2kzg9Re.d.ts → b-profile-section-dictionary-provider-Buj_M-QA.d.ts} +1 -1
- package/dist/{capture-policy-detector-CoT-j_Ic.d.ts → capture-policy-detector-3tDQkBi9.d.ts} +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/{coding-skin-azRXA51Z.js → coding-skin-AW1UPUPY.js} +9 -1
- package/dist/coding-skin.d.ts +8 -0
- package/dist/coding-skin.js +2 -2
- package/dist/{config-BhlMin82.js → config-BwUcq2zS.js} +61 -126
- package/dist/{derived-suppression-cache-BW52dq3w.d.ts → derived-suppression-cache-CcANI-p7.d.ts} +1 -1
- package/dist/diagnostic-encoder.js +1 -1
- package/dist/{index-BGu91bjB.d.ts → index-CJrMFlAU.d.ts} +12 -50
- package/dist/{index-GoYmsx8b.d.ts → index-Df9420Pl.d.ts} +2 -2
- package/dist/index.d.ts +9 -9
- package/dist/index.js +6 -6
- package/dist/internal/config/index.d.ts +2 -2
- package/dist/internal/config/index.js +13 -51
- 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 +17 -48
- 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 +4 -4
- 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 +5 -5
- 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 +4 -4
- package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.js +3 -3
- 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 +5 -5
- package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.js +3 -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 +3 -3
- package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.d.ts +1 -1
- package/dist/internal/engine/eval/trace.js +3 -4
- 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/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-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 +3 -3
- 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 +2 -2
- 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/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/model/llm-mode-routing.js +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-Z_VkmTsW.js → llm-client-Dq9FZPdC.js} +43 -10
- package/dist/{llm-client-9XCsnmf0.d.ts → llm-client-nWW1o1F6.d.ts} +1 -1
- package/dist/{log-site-catalog.generated-lc-iJczN.js → log-site-catalog.generated-Wze-GrOG.js} +130 -200
- package/dist/log-site-catalog.json +1 -1
- package/dist/{memory-kind-policy-DcEvUTKl.d.ts → memory-kind-policy-BMebgugU.d.ts} +1 -1
- package/dist/{memory-metadata-codec-CLtCCf-b.d.ts → memory-metadata-codec-H8BniJM3.d.ts} +1 -1
- package/dist/{memory-runtime-De1T9jTv.js → memory-runtime-B4A1t5DO.js} +182 -207
- package/dist/{memory-snapshot-BXB2APN0.d.ts → memory-snapshot-CKnQovB5.d.ts} +2 -2
- package/dist/{memory-store-base-yOAD7Ff8.d.ts → memory-store-base-BHYXgsCq.d.ts} +3 -3
- package/dist/{memory-temporality-classifier-s7TjoKB-.js → memory-temporality-classifier-CHcnOT5T.js} +2 -2
- package/dist/{memory-temporality-classifier-BxmM3FOb.d.ts → memory-temporality-classifier-Wi6WWeAj.d.ts} +1 -1
- package/dist/{memory-tier-promoter-DjJwYB4w.d.ts → memory-tier-promoter-m60-RlAj.d.ts} +1 -1
- package/dist/{memory-tool-dependencies-C8JSCWCz.js → memory-tool-dependencies-CAVm0Sy4.js} +1 -1
- package/dist/memory-tool-dependencies-D2fOC-KL.d.ts +14 -0
- package/dist/{model-call-table-CPyQfBJ6.js → model-call-table-DjfbmUDl.js} +12 -7
- package/dist/{observable-embedder-DCtHXucw.d.ts → observable-embedder-0FwxJMhJ.d.ts} +1 -1
- package/dist/{observable-llm-client-DykY0exK.d.ts → observable-llm-client-DY7w1Fj1.d.ts} +3 -3
- package/dist/{observable-memory-store-ZBTjMAHj.d.ts → observable-memory-store-C25Q_hoW.d.ts} +4 -4
- package/dist/{observable-retriever-f8ENkQnP.d.ts → observable-retriever-Cs9Bwzq6.d.ts} +5 -5
- package/dist/paths-obFSsJv3.d.ts +1 -0
- package/dist/{plugin-config-schema-D9riSXDg.js → plugin-config-schema-D-IoHmis.js} +22 -43
- package/dist/{plugin-config-schema-CsKKIHq9.d.ts → plugin-config-schema-DQh5njrS.d.ts} +8 -10
- package/dist/{profile-CxdMGvxU.d.ts → profile-CcvVR6K8.d.ts} +1 -1
- package/dist/{profile-section-writer-B54r7JN1.js → profile-section-writer-3apndAJu.js} +2 -2
- package/dist/{reflection-command-hooks-a1kgC2cr.js → reflection-command-hooks-B9UENMGV.js} +4 -3
- package/dist/{reflection-command-hooks-_B_XZBIz.d.ts → reflection-command-hooks-BRLqVNCi.d.ts} +4 -4
- package/dist/{reflection-deps-DQBHeGYK.d.ts → reflection-deps-C0TJ-gpU.d.ts} +2 -2
- package/dist/{reflection-embedded-generator-LmZQqGER.d.ts → reflection-embedded-generator-Cs59hWYr.d.ts} +3 -3
- package/dist/{reflection-embedded-generator-DEuTWrBh.js → reflection-embedded-generator-Do_r_LbU.js} +2 -1
- package/dist/{reflection-injection-hooks-CTDCwu2_.d.ts → reflection-injection-hooks-Cy4bRemm.d.ts} +4 -4
- package/dist/{reflection-lifecycle-hooks-eFUc2mcd.d.ts → reflection-lifecycle-hooks-C-lf00DB.d.ts} +3 -3
- package/dist/{rem-batch-executor-D42YWCNg.js → rem-batch-executor-BUgNyYLv.js} +1 -1
- package/dist/{rem-trigger-BKr4Qmhn.js → rem-trigger-pg_cCp5U.js} +74 -437
- package/dist/{retriever-BsjtyINJ.d.ts → retriever-2RJYAvlD.d.ts} +10 -52
- package/dist/{retriever-CsBW6MZv.js → retriever-C54bXeDh.js} +30 -452
- package/dist/{runtime-audit-log-C-L0v2HU.d.ts → runtime-audit-log-D2Hqk_kl.d.ts} +1 -1
- package/dist/{server-BPOT66a_.js → server-CByyXSvp.js} +4 -4
- package/dist/sidecar/main.js +2 -2
- package/dist/sno-station-mem-runtime-dependencies-ByI3b-wB.d.ts +31 -0
- package/dist/{sno-station-mem-runtime-dependencies-DES7ZvMt.js → sno-station-mem-runtime-dependencies-CgNS1dIM.js} +6 -6
- package/dist/{store-CukgAPqu.d.ts → store-Bz0y76cJ.d.ts} +1 -1
- package/dist/{store-DRwqWMTh.js → store-DNgKOGWP.js} +1 -1
- package/dist/{strategy-hook-runner-s8dAEQ3P.js → strategy-hook-runner-Bg6rBY71.js} +1 -1
- package/dist/{strategy-hook-runner-BlJxjMjC.d.ts → strategy-hook-runner-vbrWiDbK.d.ts} +7 -7
- package/dist/{types-C9Hngi-p.d.ts → types-El7jViCz.d.ts} +1 -1
- package/package.json +1 -1
- package/settings.default.json +9 -10
- package/skills/extract-atomic-memory/SKILL.md +4 -3
- package/skills/extract-atomic-memory/references/capture.md +3 -2
- package/dist/memory-tool-dependencies-BsaSVzC8.d.ts +0 -14
- package/dist/paths-m8yncZgm.d.ts +0 -1
- package/dist/sno-station-mem-runtime-dependencies-B47DIcei.d.ts +0 -31
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CHUNKING_VERSION, DEFAULT_BM25_WEIGHT, DEFAULT_RECALL_LIFECYCLE, DEFAULT_RERANK_TIMEOUT_MS, DEFAULT_VECTOR_WEIGHT, IMPORTANCE_WEIGHT_BASE,
|
|
1
|
+
import { CHUNKING_VERSION, DEFAULT_BM25_WEIGHT, DEFAULT_RECALL_LIFECYCLE, DEFAULT_RERANK_TIMEOUT_MS, DEFAULT_VECTOR_WEIGHT, IMPORTANCE_WEIGHT_BASE, MMR_LAMBDA, RECENCY_WEIGHT, 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";
|
|
@@ -7,7 +7,7 @@ import { a as memoryOperationSignal } from "./operation-cancellation-QcwC4mDX.js
|
|
|
7
7
|
import { appendQaTrace, computeConfigHash, isTraceEnabled } from "./internal/engine/eval/trace.js";
|
|
8
8
|
import { computeEffectiveHalfLife, parseAccessMetadata } from "./internal/engine/retrieval/access-tracker.js";
|
|
9
9
|
import { createLogger as createLogger$1, currentLogContext, privateLogReference, withLogContext } from "@snoai/utils/logger";
|
|
10
|
-
import {
|
|
10
|
+
import { randomUUID } from "node:crypto";
|
|
11
11
|
//#region src/engine/retrieval/retrieval-trace.ts
|
|
12
12
|
var StageLifecycle = class StageLifecycle {
|
|
13
13
|
name;
|
|
@@ -212,7 +212,7 @@ const DEFAULT_RETRIEVAL_CONFIG = {
|
|
|
212
212
|
vectorWeight: DEFAULT_VECTOR_WEIGHT,
|
|
213
213
|
bm25Weight: DEFAULT_BM25_WEIGHT,
|
|
214
214
|
minScore: 0,
|
|
215
|
-
rerank: "
|
|
215
|
+
rerank: "lightweight",
|
|
216
216
|
candidatePoolSize: 64,
|
|
217
217
|
recencyHalfLifeDays: 14,
|
|
218
218
|
recencyWeight: RECENCY_WEIGHT,
|
|
@@ -222,10 +222,8 @@ const DEFAULT_RETRIEVAL_CONFIG = {
|
|
|
222
222
|
lengthNormAnchor: 0,
|
|
223
223
|
hardMinScore: 0,
|
|
224
224
|
timeDecayHalfLifeDays: 60,
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
lightweightFusionWeight: LIGHTWEIGHT_FUSION_WEIGHT,
|
|
228
|
-
lightweightCosineWeight: LIGHTWEIGHT_COSINE_WEIGHT,
|
|
225
|
+
lightweightFusionWeight: 0,
|
|
226
|
+
lightweightCosineWeight: 1,
|
|
229
227
|
importanceWeightBase: IMPORTANCE_WEIGHT_BASE,
|
|
230
228
|
timeDecayFloor: TIME_DECAY_FLOOR,
|
|
231
229
|
mmrLambda: MMR_LAMBDA,
|
|
@@ -233,31 +231,6 @@ const DEFAULT_RETRIEVAL_CONFIG = {
|
|
|
233
231
|
};
|
|
234
232
|
//#endregion
|
|
235
233
|
//#region src/engine/retrieval/retriever-core.ts
|
|
236
|
-
/**
|
|
237
|
-
* Enumerates every branch in `rerank()` that fell back to the pre-rerank
|
|
238
|
-
* candidate ordering instead of applying the cross-encoder score. Aggregated
|
|
239
|
-
* via {@link RetrievalStatsCollector} and surfaced as trace stage metadata
|
|
240
|
-
* so callers can attribute degraded ranking without parsing log lines.
|
|
241
|
-
*
|
|
242
|
-
* - `missing_api_key`: cross-encoder configured but no rerankApiKey set;
|
|
243
|
-
* call routes through the lightweight cosine path instead.
|
|
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.
|
|
248
|
-
* - `request_error`: any other thrown error inside the fetch path.
|
|
249
|
-
* - `query_over_window`: the query alone fills the reranker's per-pair token window, so no
|
|
250
|
-
* document could be sent with it. Nothing was requested.
|
|
251
|
-
*/
|
|
252
|
-
const RERANK_FALLBACK_REASONS = [
|
|
253
|
-
"missing_api_key",
|
|
254
|
-
"no_endpoint",
|
|
255
|
-
"http_error",
|
|
256
|
-
"invalid_response",
|
|
257
|
-
"timeout",
|
|
258
|
-
"request_error",
|
|
259
|
-
"query_over_window"
|
|
260
|
-
];
|
|
261
234
|
var MemoryRetriever = class {
|
|
262
235
|
store;
|
|
263
236
|
embedder;
|
|
@@ -547,11 +520,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
547
520
|
});
|
|
548
521
|
fused = rerankOutcome.candidates;
|
|
549
522
|
this.throwIfAborted(context);
|
|
550
|
-
|
|
551
|
-
...rerankOutcome.stats,
|
|
552
|
-
rerankFallbackReason: rerankOutcome.fallback.reason
|
|
553
|
-
} : rerankOutcome.stats;
|
|
554
|
-
trace?.endStage(fused.map((r) => r.entry.id), fused.map((r) => r.score), rerankStageMetadata);
|
|
523
|
+
trace?.endStage(fused.map((r) => r.entry.id), fused.map((r) => r.score));
|
|
555
524
|
fused = this.applyScoringPipeline(fused, trace, context.limit, rerankOutcome.modelOrder);
|
|
556
525
|
trace?.startStage("min_score_filter", fused.map((result) => result.entry.id));
|
|
557
526
|
fused = fused.filter((result) => result.score >= (context.minScore ?? this.config.minScore));
|
|
@@ -620,424 +589,23 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
620
589
|
}
|
|
621
590
|
});
|
|
622
591
|
//#endregion
|
|
623
|
-
//#region src/engine/retrieval/retrieval-rerank-provider.ts
|
|
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
|
-
};
|
|
638
|
-
}
|
|
639
|
-
/** Sno's reranker answers a list of `{index, score}`, bare or under `results` / `data`. */
|
|
640
|
-
function parseRerankResponse(data) {
|
|
641
|
-
const parseItems = (items) => {
|
|
642
|
-
if (!Array.isArray(items)) return void 0;
|
|
643
|
-
const parsed = [];
|
|
644
|
-
for (const raw of items) {
|
|
645
|
-
const index = typeof raw?.index === "number" ? raw.index : Number(raw?.index);
|
|
646
|
-
if (!Number.isFinite(index)) continue;
|
|
647
|
-
let score;
|
|
648
|
-
for (const key of ["score", "relevance_score"]) {
|
|
649
|
-
const value = raw?.[key];
|
|
650
|
-
const n = typeof value === "number" ? value : Number(value);
|
|
651
|
-
if (Number.isFinite(n)) {
|
|
652
|
-
score = n;
|
|
653
|
-
break;
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
if (score === void 0) continue;
|
|
657
|
-
parsed.push({
|
|
658
|
-
index,
|
|
659
|
-
score
|
|
660
|
-
});
|
|
661
|
-
}
|
|
662
|
-
return parsed.length > 0 ? parsed : void 0;
|
|
663
|
-
};
|
|
664
|
-
const objectData = data && typeof data === "object" && !Array.isArray(data) ? data : void 0;
|
|
665
|
-
return parseItems(data) ?? parseItems(objectData?.results) ?? parseItems(objectData?.data);
|
|
666
|
-
}
|
|
667
|
-
//#endregion
|
|
668
592
|
//#region src/engine/retrieval/retriever-rerank.ts
|
|
669
593
|
/** @file retriever-rerank.ts
|
|
670
|
-
* @purpose Runs
|
|
594
|
+
* @purpose Runs local cosine ordering and local model reranking.
|
|
671
595
|
* @boundary Prototype-mounted MemoryRetriever methods; no constructor state ownership.
|
|
672
596
|
*/
|
|
673
|
-
const RERANK_TRANSIENT_ATTEMPTS = 3;
|
|
674
|
-
const RERANK_TRANSIENT_BACKOFF_MS = 200;
|
|
675
|
-
const RERANK_TRANSIENT_STATUSES = /* @__PURE__ */ new Set([
|
|
676
|
-
429,
|
|
677
|
-
502,
|
|
678
|
-
503,
|
|
679
|
-
504
|
|
680
|
-
]);
|
|
681
|
-
const RERANK_RETRY_AFTER_MAX_MS = 5e3;
|
|
682
|
-
function isRerankTimeout(error) {
|
|
683
|
-
return error instanceof Error && (error.name === "TimeoutError" || error.name === "AbortError");
|
|
684
|
-
}
|
|
685
|
-
/**
|
|
686
|
-
* The reranker's refusal when a pair is over its window, as the endpoint states it:
|
|
687
|
-
* `{"detail":{"code":"input_token_limit_exceeded","max_input_tokens":512,
|
|
688
|
-
* "candidates":[{"index":0,"input_tokens":728,"excess_tokens":216}]}}` (measured 2026-09-14).
|
|
689
|
-
*
|
|
690
|
-
* It names every offending text, so the batch can be repaired and sent again instead of
|
|
691
|
-
* losing the scores of the 49 texts that were fine. The counts are the SERVER's, taken with
|
|
692
|
-
* the ranking model's tokenizer — which is not the embedder's — so they are the only exact
|
|
693
|
-
* measure available here of how far over the window a text is.
|
|
694
|
-
*/
|
|
695
|
-
const RERANK_OVER_WINDOW_CODE = "input_token_limit_exceeded";
|
|
696
|
-
function parseOverWindowRefusal(body) {
|
|
697
|
-
let parsed;
|
|
698
|
-
try {
|
|
699
|
-
parsed = JSON.parse(body);
|
|
700
|
-
} catch {
|
|
701
|
-
return;
|
|
702
|
-
}
|
|
703
|
-
if (typeof parsed !== "object" || parsed === null) return void 0;
|
|
704
|
-
const detail = parsed.detail;
|
|
705
|
-
if (typeof detail !== "object" || detail === null) return void 0;
|
|
706
|
-
const shape = detail;
|
|
707
|
-
if (shape.code !== RERANK_OVER_WINDOW_CODE) return void 0;
|
|
708
|
-
if (typeof shape.max_input_tokens !== "number" || !Array.isArray(shape.candidates)) return;
|
|
709
|
-
const overLong = [];
|
|
710
|
-
for (const candidate of shape.candidates) {
|
|
711
|
-
if (typeof candidate !== "object" || candidate === null) continue;
|
|
712
|
-
const named = candidate;
|
|
713
|
-
if (typeof named.index !== "number" || typeof named.input_tokens !== "number") continue;
|
|
714
|
-
overLong.push({
|
|
715
|
-
index: named.index,
|
|
716
|
-
inputTokens: named.input_tokens
|
|
717
|
-
});
|
|
718
|
-
}
|
|
719
|
-
return overLong.length === 0 ? void 0 : {
|
|
720
|
-
maxInputTokens: shape.max_input_tokens,
|
|
721
|
-
overLong
|
|
722
|
-
};
|
|
723
|
-
}
|
|
724
|
-
function isTransientRerankError(error) {
|
|
725
|
-
if (isRerankTimeout(error)) return true;
|
|
726
|
-
return error instanceof TypeError && error.cause !== void 0;
|
|
727
|
-
}
|
|
728
|
-
async function fetchRerankWithRetry(send, stop) {
|
|
729
|
-
let lastError;
|
|
730
|
-
for (let attempt = 1; attempt <= RERANK_TRANSIENT_ATTEMPTS; attempt += 1) {
|
|
731
|
-
let retryDelayMs = RERANK_TRANSIENT_BACKOFF_MS * attempt;
|
|
732
|
-
try {
|
|
733
|
-
const reply = await send();
|
|
734
|
-
const { response } = reply;
|
|
735
|
-
if (response.ok) return reply;
|
|
736
|
-
if (!RERANK_TRANSIENT_STATUSES.has(response.status) || attempt === RERANK_TRANSIENT_ATTEMPTS) return { response };
|
|
737
|
-
if (response.status === 429) {
|
|
738
|
-
const retryAfter = response.headers.get("retry-after");
|
|
739
|
-
if (retryAfter !== null && /^\d+$/.test(retryAfter)) retryDelayMs = Math.min(Number.parseInt(retryAfter, 10) * 1e3, RERANK_RETRY_AFTER_MAX_MS);
|
|
740
|
-
}
|
|
741
|
-
await response.body?.cancel();
|
|
742
|
-
lastError = /* @__PURE__ */ new Error(`rerank API responded ${response.status}`);
|
|
743
|
-
} catch (error) {
|
|
744
|
-
if (!isTransientRerankError(error) || attempt === RERANK_TRANSIENT_ATTEMPTS || stop?.aborted) throw error;
|
|
745
|
-
lastError = error;
|
|
746
|
-
}
|
|
747
|
-
if (stop?.aborted) throw lastError;
|
|
748
|
-
await new Promise((resolve) => {
|
|
749
|
-
const onAbort = () => {
|
|
750
|
-
clearTimeout(timer);
|
|
751
|
-
resolve();
|
|
752
|
-
};
|
|
753
|
-
const timer = setTimeout(() => {
|
|
754
|
-
stop?.removeEventListener("abort", onAbort);
|
|
755
|
-
resolve();
|
|
756
|
-
}, retryDelayMs);
|
|
757
|
-
stop?.addEventListener("abort", onAbort, { once: true });
|
|
758
|
-
});
|
|
759
|
-
if (stop?.aborted) throw lastError;
|
|
760
|
-
}
|
|
761
|
-
throw lastError;
|
|
762
|
-
}
|
|
763
597
|
Object.assign(MemoryRetriever.prototype, {
|
|
764
598
|
async rerank(query, candidates, queryVector, options) {
|
|
765
|
-
if (candidates.length === 0) return { candidates };
|
|
766
|
-
|
|
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;
|
|
771
|
-
if (!rerankEndpoint) {
|
|
772
|
-
log.warn("rerank skipped: no reranker address", {}, {
|
|
773
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
774
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
775
|
-
function: "rerank",
|
|
776
|
-
site_id: "retrieval.retriever-rerank.rerank.6fbc6b3a22"
|
|
777
|
-
});
|
|
778
|
-
return {
|
|
779
|
-
candidates: unranked(),
|
|
780
|
-
fallback: { reason: "no_endpoint" }
|
|
781
|
-
};
|
|
782
|
-
}
|
|
783
|
-
const rerankTimeoutMs = this.config.rerankTimeoutMs ?? 15e3;
|
|
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;
|
|
786
|
-
const rerankApiKey = this.config.rerankApiKey;
|
|
787
|
-
const maxCandidates = this.config.rerankMaxCandidates;
|
|
788
|
-
const overCap = maxCandidates !== void 0 && candidates.length > maxCandidates;
|
|
789
|
-
const toRerank = overCap ? candidates.slice(0, maxCandidates) : candidates;
|
|
790
|
-
const beyondCap = overCap ? candidates.slice(maxCandidates) : [];
|
|
791
|
-
const batchSize = 50;
|
|
792
|
-
const queryTokens = this.embedder.countTokens(query);
|
|
793
|
-
const documentTokenBudget = 509 - queryTokens;
|
|
794
|
-
if (documentTokenBudget <= 0) {
|
|
795
|
-
log.warn("rerank skipped: the query alone fills the reranker token window", {
|
|
796
|
-
queryTokens,
|
|
797
|
-
window: 512,
|
|
798
|
-
templateTokens: 3
|
|
799
|
-
}, {
|
|
800
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
801
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
802
|
-
function: "rerank",
|
|
803
|
-
site_id: "retrieval.retriever-rerank.rerank.query_over_window"
|
|
804
|
-
});
|
|
805
|
-
return {
|
|
806
|
-
candidates: unranked(),
|
|
807
|
-
fallback: { reason: "query_over_window" }
|
|
808
|
-
};
|
|
809
|
-
}
|
|
810
|
-
let truncatedCandidates = 0;
|
|
811
|
-
const rerankTexts = toRerank.map((c) => {
|
|
812
|
-
const bounded = this.embedder.truncateToTokens(c.entry.text, documentTokenBudget);
|
|
813
|
-
if (bounded !== c.entry.text) truncatedCandidates += 1;
|
|
814
|
-
return bounded;
|
|
815
|
-
});
|
|
816
|
-
if (truncatedCandidates > 0) log.warn("rerank candidates were cut to the document budget the query left", {
|
|
817
|
-
truncatedCandidates,
|
|
818
|
-
documentTokenBudget,
|
|
819
|
-
queryTokens
|
|
820
|
-
}, {
|
|
821
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
822
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
823
|
-
function: "rerank",
|
|
824
|
-
site_id: "retrieval.retriever-rerank.rerank.candidate_over_ceiling"
|
|
825
|
-
});
|
|
826
|
-
try {
|
|
827
|
-
const runBatch = async (start) => {
|
|
828
|
-
let batchTexts = rerankTexts.slice(start, start + batchSize);
|
|
829
|
-
for (let pass = 0;; pass += 1) {
|
|
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);
|
|
876
|
-
if (!response.ok) {
|
|
877
|
-
const retryAfter = response.headers.get("retry-after");
|
|
878
|
-
const errorBody = await response.text().catch(() => "<unreadable body>");
|
|
879
|
-
const refusal = pass === 0 ? parseOverWindowRefusal(errorBody) : void 0;
|
|
880
|
-
if (refusal) {
|
|
881
|
-
const allowed = refusal.maxInputTokens - 3;
|
|
882
|
-
batchTexts = batchTexts.map((text, index) => {
|
|
883
|
-
const named = refusal.overLong.find((c) => c.index === index);
|
|
884
|
-
if (!named) return text;
|
|
885
|
-
const localTokens = this.embedder.countTokens(text);
|
|
886
|
-
const localPairTokens = queryTokens + localTokens;
|
|
887
|
-
const target = Math.max(1, Math.floor(allowed * localPairTokens / named.inputTokens) - queryTokens);
|
|
888
|
-
return this.embedder.truncateToTokens(text, target);
|
|
889
|
-
});
|
|
890
|
-
log.warn("rerank batch refused over its token window; resending the named texts cut to fit", {
|
|
891
|
-
status: response.status,
|
|
892
|
-
overLongCount: refusal.overLong.length,
|
|
893
|
-
maxInputTokens: refusal.maxInputTokens,
|
|
894
|
-
sentToRerankCount: batchTexts.length,
|
|
895
|
-
batchStart: start
|
|
896
|
-
}, {
|
|
897
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
898
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
899
|
-
function: "runBatch",
|
|
900
|
-
site_id: "retrieval.retriever-rerank.runBatch.over_window_repair"
|
|
901
|
-
});
|
|
902
|
-
continue;
|
|
903
|
-
}
|
|
904
|
-
log.warn("rerank API failed, using pre-rerank results", {
|
|
905
|
-
status: response.status,
|
|
906
|
-
endpoint_hash: createHash("sha256").update(rerankEndpoint).digest("hex"),
|
|
907
|
-
retryAfter,
|
|
908
|
-
sentToRerankCount: batchTexts.length,
|
|
909
|
-
batchStart: start,
|
|
910
|
-
body_length: errorBody.length
|
|
911
|
-
}, {
|
|
912
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
913
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
914
|
-
function: "runBatch",
|
|
915
|
-
site_id: "retrieval.retriever-rerank.runBatch.76d7d1fac6"
|
|
916
|
-
});
|
|
917
|
-
return "http_error";
|
|
918
|
-
}
|
|
919
|
-
const parsed = parseRerankResponse(data);
|
|
920
|
-
if (!parsed) {
|
|
921
|
-
log.warn("rerank API returned unparseable response", {
|
|
922
|
-
endpoint_hash: createHash("sha256").update(rerankEndpoint).digest("hex"),
|
|
923
|
-
batchStart: start
|
|
924
|
-
}, {
|
|
925
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
926
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
927
|
-
function: "runBatch",
|
|
928
|
-
site_id: "retrieval.retriever-rerank.runBatch.4429b8bd8a"
|
|
929
|
-
});
|
|
930
|
-
return "invalid_response";
|
|
931
|
-
}
|
|
932
|
-
const batchItems = [];
|
|
933
|
-
for (const item of parsed) {
|
|
934
|
-
if (item.index < 0 || item.index >= batchTexts.length) continue;
|
|
935
|
-
batchItems.push({
|
|
936
|
-
index: start + item.index,
|
|
937
|
-
score: item.score
|
|
938
|
-
});
|
|
939
|
-
}
|
|
940
|
-
return batchItems;
|
|
941
|
-
}
|
|
942
|
-
};
|
|
943
|
-
const batchStarts = [];
|
|
944
|
-
for (let start = 0; start < rerankTexts.length; start += batchSize) batchStarts.push(start);
|
|
945
|
-
const items = [];
|
|
946
|
-
for (let wave = 0; wave < batchStarts.length; wave += 4) {
|
|
947
|
-
const waveStarts = batchStarts.slice(wave, wave + 4);
|
|
948
|
-
const settled = await Promise.allSettled(waveStarts.map(runBatch));
|
|
949
|
-
for (const outcome of settled) if (outcome.status === "rejected" && outcome.reason instanceof RetrievalError) throw outcome.reason;
|
|
950
|
-
for (const outcome of settled) if (outcome.status === "rejected") throw outcome.reason;
|
|
951
|
-
for (const outcome of settled) if (outcome.status === "fulfilled" && typeof outcome.value === "string") return {
|
|
952
|
-
candidates: unranked(),
|
|
953
|
-
fallback: { reason: outcome.value }
|
|
954
|
-
};
|
|
955
|
-
for (const outcome of settled) if (outcome.status === "fulfilled" && typeof outcome.value !== "string") items.push(...outcome.value);
|
|
956
|
-
}
|
|
957
|
-
const blendCross = this.config.rerankBlendCross ?? .7;
|
|
958
|
-
const blendVector = this.config.rerankBlendVector ?? .3;
|
|
959
|
-
const returnedIndices = new Set(items.map((r) => r.index));
|
|
960
|
-
const reranked = [];
|
|
961
|
-
const seenIndices = /* @__PURE__ */ new Set();
|
|
962
|
-
for (const item of items) {
|
|
963
|
-
if (seenIndices.has(item.index)) continue;
|
|
964
|
-
seenIndices.add(item.index);
|
|
965
|
-
const candidate = toRerank[item.index];
|
|
966
|
-
if (!candidate) continue;
|
|
967
|
-
const sourceScore = this.getRerankSourceScore(candidate);
|
|
968
|
-
const crossScore = 1 / (1 + Math.exp(-item.score));
|
|
969
|
-
const blendedScore = clamp01(crossScore * blendCross + sourceScore * blendVector, 0);
|
|
970
|
-
reranked.push({
|
|
971
|
-
...candidate,
|
|
972
|
-
score: blendedScore,
|
|
973
|
-
sources: {
|
|
974
|
-
...candidate.sources,
|
|
975
|
-
reranked: { score: item.score }
|
|
976
|
-
}
|
|
977
|
-
});
|
|
978
|
-
}
|
|
979
|
-
const unreturned = [...toRerank.filter((_, idx) => !returnedIndices.has(idx)), ...beyondCap].map((r) => ({
|
|
980
|
-
...r,
|
|
981
|
-
score: clamp01(this.getRerankSourceScore(r) * LIGHTWEIGHT_RERANK_PENALTY, 0)
|
|
982
|
-
}));
|
|
983
|
-
const merged = [...reranked, ...unreturned].sort((a, b) => b.score - a.score);
|
|
984
|
-
log.debug("reranked", {
|
|
985
|
-
totalCandidateCount: candidates.length,
|
|
986
|
-
sentToRerankCount: toRerank.length,
|
|
987
|
-
returnedCount: reranked.length
|
|
988
|
-
}, {
|
|
989
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
990
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
991
|
-
function: "rerank",
|
|
992
|
-
site_id: "retrieval.retriever-rerank.rerank.7847c6248a"
|
|
993
|
-
});
|
|
994
|
-
return {
|
|
995
|
-
candidates: merged.length > 0 ? merged : candidates,
|
|
996
|
-
stats: {
|
|
997
|
-
rerankSentCount: toRerank.length,
|
|
998
|
-
rerankReturnedCount: reranked.length,
|
|
999
|
-
rerankBeyondCapCount: beyondCap.length
|
|
1000
|
-
}
|
|
1001
|
-
};
|
|
1002
|
-
} catch (error) {
|
|
1003
|
-
if (error instanceof RetrievalError) throw error;
|
|
1004
|
-
let reason;
|
|
1005
|
-
if (isRerankTimeout(error)) {
|
|
1006
|
-
reason = "timeout";
|
|
1007
|
-
log.warn("rerank API timed out, using pre-rerank results", {
|
|
1008
|
-
timeoutMs: rerankTimeoutMs,
|
|
1009
|
-
attempts: RERANK_TRANSIENT_ATTEMPTS
|
|
1010
|
-
}, {
|
|
1011
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
1012
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
1013
|
-
function: "rerank",
|
|
1014
|
-
site_id: "retrieval.retriever-rerank.rerank.4af9c17c75"
|
|
1015
|
-
});
|
|
1016
|
-
} else {
|
|
1017
|
-
reason = "request_error";
|
|
1018
|
-
log.warn("rerank error, using pre-rerank results", {
|
|
1019
|
-
error,
|
|
1020
|
-
attempts: RERANK_TRANSIENT_ATTEMPTS
|
|
1021
|
-
}, {
|
|
1022
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
1023
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
1024
|
-
function: "rerank",
|
|
1025
|
-
site_id: "retrieval.retriever-rerank.rerank.2c5fc67dbf"
|
|
1026
|
-
});
|
|
1027
|
-
}
|
|
1028
|
-
return {
|
|
1029
|
-
candidates: unranked(),
|
|
1030
|
-
fallback: { reason }
|
|
1031
|
-
};
|
|
1032
|
-
}
|
|
599
|
+
if (candidates.length === 0 || this.config.rerank === "none") return { candidates };
|
|
600
|
+
return this.rerankLocalModel(query, this.rerankLightweight(candidates, queryVector), options?.deadlineAt, options?.signal);
|
|
1033
601
|
},
|
|
1034
602
|
rerankLightweight(candidates, queryVector) {
|
|
1035
603
|
if (queryVector.length === 0) return candidates;
|
|
1036
604
|
if (candidates.length === 0) return candidates;
|
|
1037
605
|
const chunkIds = candidates.map((c) => c.chunkId).filter((id) => id !== void 0);
|
|
1038
606
|
const vectorMap = chunkIds.length > 0 ? this.store.getVectorsByIds(chunkIds) : /* @__PURE__ */ new Map();
|
|
1039
|
-
const wF = this.config.lightweightFusionWeight ??
|
|
1040
|
-
const wC = this.config.lightweightCosineWeight ??
|
|
607
|
+
const wF = this.config.lightweightFusionWeight ?? 0;
|
|
608
|
+
const wC = this.config.lightweightCosineWeight ?? 1;
|
|
1041
609
|
let blendedCount = 0;
|
|
1042
610
|
let dimMismatchCount = 0;
|
|
1043
611
|
const reranked = candidates.map((candidate) => {
|
|
@@ -1104,9 +672,10 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
1104
672
|
*/
|
|
1105
673
|
async rerankLocalModel(query, ordered, deadlineAt, signal) {
|
|
1106
674
|
if (ordered.length < 2 || signal?.aborted || deadlineAt !== void 0 && Date.now() >= deadlineAt) return { candidates: ordered };
|
|
1107
|
-
const head = ordered.slice(0,
|
|
675
|
+
const head = ordered.slice(0, 32);
|
|
1108
676
|
const started = performance.now();
|
|
1109
|
-
const budgetMs =
|
|
677
|
+
const budgetMs = Math.max(0, Math.floor(Math.min(DEFAULT_RERANK_TIMEOUT_MS, this.config.rerankTimeoutMs ?? 2e3, deadlineAt === void 0 ? DEFAULT_RERANK_TIMEOUT_MS : deadlineAt - Date.now())));
|
|
678
|
+
if (budgetMs === 0) return { candidates: ordered };
|
|
1110
679
|
const stop = signal ? AbortSignal.any([signal, AbortSignal.timeout(budgetMs)]) : AbortSignal.timeout(budgetMs);
|
|
1111
680
|
const scoring = this.embedder.scoreRelevance(query, head.map((r) => r.entry.text), stop).catch((error) => {
|
|
1112
681
|
log.warn("local reranker failed; recall keeps the local ranking order", { error }, {
|
|
@@ -1116,11 +685,23 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
1116
685
|
site_id: "retrieval.retriever-rerank.rerankLocalModel.failed"
|
|
1117
686
|
});
|
|
1118
687
|
});
|
|
1119
|
-
|
|
688
|
+
let onAbort = () => {};
|
|
689
|
+
const aborted = new Promise((resolve) => {
|
|
690
|
+
onAbort = () => resolve(void 0);
|
|
691
|
+
stop.addEventListener("abort", onAbort, { once: true });
|
|
692
|
+
});
|
|
693
|
+
let logits;
|
|
694
|
+
try {
|
|
695
|
+
logits = await Promise.race([scoring, aborted]);
|
|
696
|
+
} finally {
|
|
697
|
+
stop.removeEventListener("abort", onAbort);
|
|
698
|
+
}
|
|
1120
699
|
if (!logits || signal?.aborted) return { candidates: ordered };
|
|
700
|
+
const minimum = Math.min(...logits);
|
|
701
|
+
const span = Math.max(1e-9, Math.max(...logits) - minimum);
|
|
1121
702
|
const blended = head.map((candidate, index) => ({
|
|
1122
703
|
candidate,
|
|
1123
|
-
value: logits[index] ??
|
|
704
|
+
value: .5 * (((logits[index] ?? minimum) - minimum) / span) + .5 * candidate.score
|
|
1124
705
|
}));
|
|
1125
706
|
blended.sort((a, b) => b.value - a.value || a.candidate.entry.id.localeCompare(b.candidate.entry.id));
|
|
1126
707
|
const slots = head.map((candidate) => candidate.score).sort((a, b) => b - a);
|
|
@@ -1149,9 +730,6 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
1149
730
|
candidates: [...rescored, ...ordered.slice(head.length)],
|
|
1150
731
|
modelOrder: blended.map(({ candidate }) => candidate.entry.id)
|
|
1151
732
|
};
|
|
1152
|
-
},
|
|
1153
|
-
getRerankSourceScore(result) {
|
|
1154
|
-
return clamp01(Math.max(result.sources.bm25?.score ?? 0, result.sources.vector?.score ?? 0), 0);
|
|
1155
733
|
}
|
|
1156
734
|
});
|
|
1157
735
|
//#endregion
|
|
@@ -1446,7 +1024,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
1446
1024
|
},
|
|
1447
1025
|
applyMmrDiversity(results) {
|
|
1448
1026
|
if (results.length === 0) return results;
|
|
1449
|
-
const lambda = this.config.mmrLambda ?? .
|
|
1027
|
+
const lambda = this.config.mmrLambda ?? .9;
|
|
1450
1028
|
const chunkIds = results.map((r) => r.chunkId).filter((id) => id !== void 0);
|
|
1451
1029
|
const vectorMap = chunkIds.length > 0 ? this.store.getVectorsByIds(chunkIds) : /* @__PURE__ */ new Map();
|
|
1452
1030
|
const sorted = [...results].sort((a, b) => {
|
|
@@ -1790,4 +1368,4 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
1790
1368
|
}
|
|
1791
1369
|
});
|
|
1792
1370
|
//#endregion
|
|
1793
|
-
export {
|
|
1371
|
+
export { withServingValidityDefault as a, DEFAULT_RETRIEVAL_CONFIG as i, MemoryRetriever as n, createRetriever as r, collectParallelStage as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./paths-
|
|
1
|
+
import "./paths-obFSsJv3.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,5 +1,5 @@
|
|
|
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 {
|
|
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-pg_cCp5U.js";
|
|
2
|
+
import { $n as MEMORY_SHUTDOWN_TIMEOUT_MS, Ar as MEMORY_SKIN_HEADER, C as getSnoStationMemStateDir, Dr as MEMORY_ERROR_STATUS, Er as MEMORY_DEFAULT_SKIN_ID, Mr as memoryMethod, 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, kr as MEMORY_ROUTES, l as REM_SOURCE, r as REM_CORRELATION_ID_HEADER, s as REM_SIDECAR_HOST, u as getRemChassisJournalPath, v as SettingsUnavailableError, y as getDiscoveryPath } from "./config-BwUcq2zS.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";
|
|
@@ -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-B4A1t5DO.js").then((module) => module.MemoryRuntimePool.open()).then((pool) => {
|
|
339
339
|
currentMemory = pool;
|
|
340
340
|
if (stopping) pool.stopTimers();
|
|
341
341
|
return pool;
|
|
@@ -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-BUgNyYLv.js");
|
|
734
734
|
const result = enabledOperations.length === 0 ? {
|
|
735
735
|
decision: "allow",
|
|
736
736
|
reasonCode: null,
|
package/dist/sidecar/main.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Or as MEMORY_RECONNECT_INTERVAL_MS, m as isRemTraceEnabled, p as getRemTraceLogPath, v as SettingsUnavailableError } from "../config-BwUcq2zS.js";
|
|
2
2
|
import { setTimeout } from "node:timers/promises";
|
|
3
3
|
import { addLogFileTarget, closeLogger, createLogger } from "@snoai/utils/logger";
|
|
4
4
|
//#region src/sidecar/main.ts
|
|
@@ -6,7 +6,7 @@ import { addLogFileTarget, closeLogger, createLogger } from "@snoai/utils/logger
|
|
|
6
6
|
* @purpose Boots the standalone local REM sidecar process.
|
|
7
7
|
* @boundary Process environment, sidecar lifecycle, and local request-log destination.
|
|
8
8
|
*/
|
|
9
|
-
const { startRemSidecar, DuplicateSidecarError } = await import("../server-
|
|
9
|
+
const { startRemSidecar, DuplicateSidecarError } = await import("../server-CByyXSvp.js");
|
|
10
10
|
let sidecar;
|
|
11
11
|
for (let attempt = 1; !sidecar; attempt++) try {
|
|
12
12
|
sidecar = await startRemSidecar();
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import "./types-El7jViCz.js";
|
|
2
|
+
import "./index-CJrMFlAU.js";
|
|
3
|
+
import "./adapter-BFtbOOw3.js";
|
|
4
|
+
import "./embedding-provider-client-CELWtPgt.js";
|
|
5
|
+
import "./retriever-2RJYAvlD.js";
|
|
6
|
+
import "./connection-D989FqGS.js";
|
|
7
|
+
import "./sqlite-runtime-L_ywirTm.js";
|
|
8
|
+
import "./store-Bz0y76cJ.js";
|
|
9
|
+
import "./access-tracker-CFxRg7Bt.js";
|
|
10
|
+
import "./memory-tier-promoter-m60-RlAj.js";
|
|
11
|
+
import "./capture-policy-detector-3tDQkBi9.js";
|
|
12
|
+
import "./memory-temporality-classifier-Wi6WWeAj.js";
|
|
13
|
+
import "./runtime-audit-log-D2Hqk_kl.js";
|
|
14
|
+
import "./atomic-memory-extraction-Bp7AWZqi.js";
|
|
15
|
+
import "./llm-client-nWW1o1F6.js";
|
|
16
|
+
import "./memory-snapshot-CKnQovB5.js";
|
|
17
|
+
import "./observable-embedder-0FwxJMhJ.js";
|
|
18
|
+
import "./observable-llm-client-DY7w1Fj1.js";
|
|
19
|
+
import "./observable-memory-store-C25Q_hoW.js";
|
|
20
|
+
import "./observable-retriever-Cs9Bwzq6.js";
|
|
21
|
+
import "./reflection-embedded-generator-Cs59hWYr.js";
|
|
22
|
+
import "./strategy-hook-runner-vbrWiDbK.js";
|
|
23
|
+
import "./data-bootstrap-Bl3lthzE.js";
|
|
24
|
+
import "@snoai/sqlite-crypto";
|
|
25
|
+
//#region src/engine/bindings/sno-station-mem-runtime-dependencies.d.ts
|
|
26
|
+
/** Legacy parameters carry only an unused logger slot; no host operations are exposed. */
|
|
27
|
+
type SnoStationMemPluginApi = {
|
|
28
|
+
logger: unknown;
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
export { SnoStationMemPluginApi as t };
|