@snoai/memory 1.5.0 → 1.6.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-B1H2AJlH.d.ts → access-tracker-CFxRg7Bt.d.ts} +4 -4
- package/dist/{adapter-CgdVA88V.d.ts → adapter-BFtbOOw3.d.ts} +2 -2
- package/dist/{atomic-memory-extraction-DCMTQ0h-.d.ts → atomic-memory-extraction-Bp7AWZqi.d.ts} +4 -4
- package/dist/{atomic-memory-extraction-De86y7O-.js → atomic-memory-extraction-l65aofbl.js} +5 -5
- package/dist/{b-profile-section-dictionary-provider-DbqdRYMw.d.ts → b-profile-section-dictionary-provider-Buj_M-QA.d.ts} +1 -1
- package/dist/{capture-policy-detector-D4ziS7KF.d.ts → capture-policy-detector-3tDQkBi9.d.ts} +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/{config-DWeuetYo.js → config-CByvnX3d.js} +57 -135
- package/dist/{connection-PQcq3TPO.js → connection-BtK-3r-f.js} +1 -20
- package/dist/{connection-3IVXpuPE.d.ts → connection-D989FqGS.d.ts} +1 -17
- package/dist/{derived-suppression-cache-2xOq6XHX.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-PjHhlG6e.d.ts → index-Df9420Pl.d.ts} +2 -2
- package/dist/index.d.ts +9 -9
- package/dist/index.js +5 -5
- 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 +2 -2
- 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/atomic-memory-cutover-sql.js +1 -1
- package/dist/internal/store/connection.d.ts +2 -2
- package/dist/internal/store/connection.js +2 -2
- package/dist/internal/store/maintenance.d.ts +2 -2
- package/dist/internal/store/maintenance.js +5 -5
- package/dist/internal/store/memory-kinds-cutover-migrator.d.ts +0 -2
- package/dist/internal/store/memory-kinds-cutover-migrator.js +1 -10
- package/dist/internal/store/store.d.ts +2 -2
- package/dist/internal/store/store.js +1 -1
- package/dist/{llm-client-DDdUjYWS.js → llm-client-ByzZRemn.js} +8 -5
- package/dist/{llm-client-C-K7oyfu.d.ts → llm-client-nWW1o1F6.d.ts} +1 -1
- package/dist/{log-site-catalog.generated-Cn8rTa65.js → log-site-catalog.generated-DsvDgHJa.js} +101 -171
- package/dist/log-site-catalog.json +1 -1
- package/dist/{memory-entry-projector-DHo8jH10.js → memory-entry-projector-B36Nwsi_.js} +2 -1
- package/dist/{memory-kind-policy-DgPCjfY4.d.ts → memory-kind-policy-BMebgugU.d.ts} +1 -1
- package/dist/{memory-metadata-codec-CfP9JLVO.d.ts → memory-metadata-codec-H8BniJM3.d.ts} +1 -1
- package/dist/{memory-runtime-jQke2sBc.js → memory-runtime-DXr1VO1p.js} +110 -175
- package/dist/{memory-snapshot-B6a-6nJ7.d.ts → memory-snapshot-CKnQovB5.d.ts} +2 -2
- package/dist/{memory-store-base-upd9MuG6.d.ts → memory-store-base-BHYXgsCq.d.ts} +4 -4
- package/dist/{memory-store-shared-CURizQIy.js → memory-store-shared-pOb59ScU.js} +1 -1
- package/dist/{memory-temporality-classifier-BwBKEQbL.js → memory-temporality-classifier-Bauwnls7.js} +2 -2
- package/dist/{memory-temporality-classifier-DPk3_9Or.d.ts → memory-temporality-classifier-Wi6WWeAj.d.ts} +1 -1
- package/dist/{memory-tier-promoter-Cq23yveQ.d.ts → memory-tier-promoter-m60-RlAj.d.ts} +1 -1
- package/dist/{memory-tool-dependencies-aAr7Pkuj.js → memory-tool-dependencies-Cc4SJMtd.js} +1 -1
- package/dist/memory-tool-dependencies-D2fOC-KL.d.ts +14 -0
- package/dist/{model-call-table-DoIl2S0P.js → model-call-table-CPyQfBJ6.js} +7 -7
- package/dist/{observable-embedder-DihQuuQD.d.ts → observable-embedder-0FwxJMhJ.d.ts} +1 -1
- package/dist/{observable-llm-client-BglDBFN5.d.ts → observable-llm-client-DY7w1Fj1.d.ts} +3 -3
- package/dist/{observable-memory-store--n02Dre8.d.ts → observable-memory-store-C25Q_hoW.d.ts} +4 -4
- package/dist/{observable-retriever-CV6odifA.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-dV2_HgBo.d.ts → plugin-config-schema-DQh5njrS.d.ts} +9 -11
- package/dist/{profile-CoLKGobS.d.ts → profile-CcvVR6K8.d.ts} +1 -1
- package/dist/{profile-section-writer-Dd4FKpt5.js → profile-section-writer-CR-WWIoB.js} +2 -2
- package/dist/{reflection-command-hooks-Cfv836Wc.d.ts → reflection-command-hooks-BRLqVNCi.d.ts} +4 -4
- package/dist/{reflection-command-hooks-B2P4zDr6.js → reflection-command-hooks-Der9aX0e.js} +6 -4
- package/dist/{reflection-deps-DihlwQxE.d.ts → reflection-deps-C0TJ-gpU.d.ts} +2 -2
- package/dist/{reflection-embedded-generator-DV-NkeU-.js → reflection-embedded-generator-BEdDusPV.js} +2 -1
- package/dist/{reflection-embedded-generator-DCZaS6kz.d.ts → reflection-embedded-generator-Cs59hWYr.d.ts} +3 -3
- package/dist/{reflection-injection-hooks-BYxkrds6.d.ts → reflection-injection-hooks-Cy4bRemm.d.ts} +4 -4
- package/dist/{reflection-lifecycle-hooks-Bwq2y5pe.d.ts → reflection-lifecycle-hooks-C-lf00DB.d.ts} +3 -3
- package/dist/{rem-batch-executor-B_49KivZ.js → rem-batch-executor-DiU8hSGc.js} +1 -1
- package/dist/{rem-trigger-DL0MlLeo.js → rem-trigger-CBfyJVfh.js} +48 -432
- package/dist/{retriever-hTIkt3CJ.d.ts → retriever-2RJYAvlD.d.ts} +10 -52
- package/dist/{retriever-CsBW6MZv.js → retriever-C54bXeDh.js} +30 -452
- package/dist/{runtime-audit-log-eBrt_iPp.d.ts → runtime-audit-log-D2Hqk_kl.d.ts} +1 -1
- package/dist/{server-BnBzsvMF.js → server-BlbG5uOM.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-DrVDRAmf.js → sno-station-mem-runtime-dependencies-DsidkZi2.js} +7 -7
- package/dist/{store-COwW7mIh.js → store-Bja1tVFw.js} +3 -3
- package/dist/{store-DEG06TLb.d.ts → store-Bz0y76cJ.d.ts} +1 -1
- package/dist/{strategy-hook-runner-CALbWcys.js → strategy-hook-runner-F-ruiw48.js} +2 -2
- package/dist/{strategy-hook-runner-D1sRVThs.d.ts → strategy-hook-runner-vbrWiDbK.d.ts} +7 -7
- package/dist/{types-DBEwNYdR.d.ts → types-El7jViCz.d.ts} +1 -1
- package/package.json +1 -1
- package/settings.default.json +2 -3
- package/dist/memory-tool-dependencies-C9qgVGOn.d.ts +0 -14
- package/dist/paths-qJqwGcKl.d.ts +0 -1
- package/dist/sno-station-mem-runtime-dependencies-9L8WkMMV.d.ts +0 -31
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as FIXED_IDX_MEMORY_ACTIVE_TASK_CURRENT_REVISION,
|
|
1
|
+
import { $ as FIXED_IDX_MEMORY_ACTIVE_TASK_CURRENT_REVISION, A as modelCallDestination, At as FIXED_MEMORY_PROFILE_RECOVERY_ENTRIES, B as FIXED_EXTERNAL_VALUE_49, C as getSnoStationMemStateDir, Cn as CHUNK_OVERLAP_TOKENS, Cr as ensureModelDownloaded, Ct as FIXED_MEMORY_CHUNKS_MEM_FACET_IDX, D as settingsToPluginConfig, Dn as DEFAULT_IMPORTANCE, Dt as FIXED_MEMORY_MEMORIES_FACT_ID_INSERT_GUARD, En as DEFAULT_BM25_WEIGHT, Et as FIXED_MEMORY_MEMORIES, Fn as EMBEDDER_DIM, G as FIXED_EXTERNAL_VALUE_55, H as FIXED_EXTERNAL_VALUE_52, Hn as HEAD_EXTRACT_OVERLAP_DROP_RATIO, In as EMBEDDER_MODEL_DEFAULT, It as FIXED_MEMORY_SNO_EXTRACT_CHAT, J as FIXED_EXTERNAL_VALUE_58, K as FIXED_EXTERNAL_VALUE_56, Kn as INTRA_MEMORY_COSINE_THRESHOLD, Kt as FIXED_PROTOCOL_VALUE_69, Ln as EMBEDDER_PROVIDER_DEFAULT, Mn as DEFAULT_RERANK_TIMEOUT_MS, Mt as FIXED_MEMORY_PROVIDER_PROJECT_AGENTS, Nt as FIXED_MEMORY_PROVIDER_PROJECT_MAPPINGS, O as MODEL_CALLS, On as DEFAULT_RECALL_LIFECYCLE, Ot as FIXED_MEMORY_MEMORIES_FACT_ID_UPDATE_GUARD, P as observeAgentId, Pn as DEFAULT_VECTOR_WEIGHT, Q as FIXED_IDX_MEMORY, Rn as EVAL_QA_TRACES_FILENAME, Rt as FIXED_MEMORY_TASK_LIFECYCLE_COMMANDS, Sn as CHUNK_MIN_TOKENS, Sr as LocalReranker, St as FIXED_MEMORY_CHUNKS_MEMORY_ID_IDX, T as readSettings, Tn as CHUNK_TOKENIZER_MODE, Tt as FIXED_MEMORY_EXTRACTION_TIMESTAMPS, U as FIXED_EXTERNAL_VALUE_53, Un as HEAD_EXTRACT_TOKEN_BUDGET, V as FIXED_EXTERNAL_VALUE_51, Vn as HEAD_EXTRACT_MIN_CONTENT_TOKENS, W as FIXED_EXTERNAL_VALUE_54, Wn as IMPORTANCE_WEIGHT_BASE, X as FIXED_EXTERNAL_VALUE_8, Xn as MAX_CHUNK_FETCH_LIMIT, Y as FIXED_EXTERNAL_VALUE_62, Z as FIXED_EXTERNAL_VALUE_9, Zn as MAX_LIST_LIMIT, _r as CachedEmbeddingProvider, _t as FIXED_MEMORY_CHUNKS, a as REM_MODEL_OUTPUT_TOKEN_CAP, an as PERSISTED_PROVIDER_SYSTEM, ar as RECENCY_WEIGHT, at as FIXED_IDX_MEMORY_MEMORIES_LANE_PROJECT, bn as CHUNKING_VERSION$1, bt as FIXED_MEMORY_CHUNKS_AU, cn as SUPPORTED_LOCALES, cr as RETRIEVAL_STORAGE_CHUNK_PROFILE, ct as FIXED_IDX_MEMORY_MEMORIES_PROJECT_FACT_KEY_ACTIVE, d as getRemDiscoveryPath, dn as ADJACENCY_BONUS_PER_PAIR, dt as FIXED_MEMORY_ACTIVE_TASK_EVIDENCE, en as FIXED_VEC_MEMORY, et as FIXED_IDX_MEMORY_ACTIVE_TASK_EVIDENCE_INSTANCE, ft as FIXED_MEMORY_ACTIVE_TASK_INSTANCES, g as readRemOperationalConfig, gt as FIXED_MEMORY_ACTIVE_TASK_TRANSITIONS, hr as experimentMmrDisabled, ht as FIXED_MEMORY_ACTIVE_TASK_REVISIONS, in as PERSISTED_CONTENT_HASH_V3, it as FIXED_IDX_MEMORY_MEMORIES_FACT_ID, jr as REM_SIDECAR_TOKEN_HEADER, jt as FIXED_MEMORY_PROVIDER_AGENT_MAPPINGS, k as MODEL_CALL_WORKLOAD, kt as FIXED_MEMORY_MIGRATION_MARKERS, lt as FIXED_IDX_MEMORY_MEMORIES_PROJECT_TIMESTAMP, mr as experimentCandidatePoolOverride, mt as FIXED_MEMORY_ACTIVE_TASK_MIGRATION_MANIFESTS, nn as PERSISTED_CANDIDATE_HASH_V1, nr as MULTI_HIT_BONUS_CAP, nt as FIXED_IDX_MEMORY_MEMORIES_CATEGORY, o as REM_RUN_PATH, ot as FIXED_IDX_MEMORY_MEMORIES_PROJECT, pt as FIXED_MEMORY_ACTIVE_TASK_MIGRATION_EVIDENCE, q as FIXED_EXTERNAL_VALUE_57, qt as FIXED_PROTOCOL_VALUE_73, r as REM_CORRELATION_ID_HEADER, rn as PERSISTED_CONTENT_HASH_V1, rr as MULTI_HIT_BONUS_PER_HIT, rt as FIXED_IDX_MEMORY_MEMORIES_CONTENT_HASH, s as REM_SIDECAR_HOST, sn as llmRoutingConfigSchema, st as FIXED_IDX_MEMORY_MEMORIES_PROJECT_CONTENT_HASH, tn as FIXED_VEC_MEMORY_CHUNKS, tr as MMR_LAMBDA, tt as FIXED_IDX_MEMORY_ACTIVE_TASK_INSTANCES_PROJECTION, un as ADJACENCY_BONUS_CAP, ur as TIME_DECAY_FLOOR, ut as FIXED_MEMORY, vn as BONUS_TOTAL_INVARIANT, vr as LOCAL_EMBEDDING_CACHE_DIR_DEFAULT, vt as FIXED_MEMORY_CHUNKS_AD, wn as CHUNK_TARGET_TOKENS, wt as FIXED_MEMORY_CHUNKS_MEM_IDX, xn as CHUNK_MAX_TOKENS, xr as LocalEmbedProvider, xt as FIXED_MEMORY_CHUNKS_FTS, yn as CACHE_TTL_MS, yr as LOCAL_EMBEDDING_MODEL, yt as FIXED_MEMORY_CHUNKS_AI, zt as FIXED_MEMORY_UNPLACED_CANDIDATES } from "./config-CByvnX3d.js";
|
|
2
2
|
import { createLogger, createLogger as createLogger$1, currentLogContext, privateLogReference, withLogContext } from "@snoai/utils/logger";
|
|
3
3
|
import path, { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { appendFileSync, closeSync, createReadStream, existsSync, fstatSync, fsyncSync, ftruncateSync, mkdirSync, openSync, readFileSync, readSync, realpathSync, renameSync, rmSync, statSync, writeFileSync, writeSync } from "node:fs";
|
|
@@ -6662,11 +6662,12 @@ function withProviderResponses(responses, run) {
|
|
|
6662
6662
|
}
|
|
6663
6663
|
/** Sno GPU request attribution (GPU_REQUEST_METADATA_STANDARD): self-reported labels, never identity. */
|
|
6664
6664
|
const SNO_GPU_SOURCE = "sno-station";
|
|
6665
|
-
function snoGpuAttributionHeaders(clientRequestId, callId) {
|
|
6665
|
+
function snoGpuAttributionHeaders(clientRequestId, callId, usageClass) {
|
|
6666
6666
|
return {
|
|
6667
6667
|
"X-Sno-Source": SNO_GPU_SOURCE,
|
|
6668
6668
|
"X-Sno-Workload": callId ? MODEL_CALL_WORKLOAD[callId] : "station-aux",
|
|
6669
|
-
"X-Request-ID": clientRequestId
|
|
6669
|
+
"X-Request-ID": clientRequestId,
|
|
6670
|
+
...usageClass ? { "X-Sno-Usage-Class": usageClass } : {}
|
|
6670
6671
|
};
|
|
6671
6672
|
}
|
|
6672
6673
|
async function observeRequest(input, run) {
|
|
@@ -6882,7 +6883,7 @@ async function callSnoProfileCompletion(request) {
|
|
|
6882
6883
|
headers: {
|
|
6883
6884
|
"Content-Type": "application/json",
|
|
6884
6885
|
"X-Internal-Token": request.apiKey,
|
|
6885
|
-
...snoGpuAttributionHeaders(diagnostic.clientRequestId, request.callId),
|
|
6886
|
+
...snoGpuAttributionHeaders(diagnostic.clientRequestId, request.callId, request.usageClass),
|
|
6886
6887
|
...request.operationId ? { "X-Sno-Operation": request.operationId } : {}
|
|
6887
6888
|
},
|
|
6888
6889
|
body: JSON.stringify({
|
|
@@ -6982,7 +6983,7 @@ async function snoStationMemDispatch(ctx) {
|
|
|
6982
6983
|
if (typeof cfgExt.requestId === "string") headers["X-Request-ID"] = cfgExt.requestId;
|
|
6983
6984
|
if (provider === "sno-gpu") {
|
|
6984
6985
|
headers["X-Internal-Token"] = ctx.apiKey;
|
|
6985
|
-
Object.assign(headers, snoGpuAttributionHeaders(diagnostic.clientRequestId, cfgExt.callId));
|
|
6986
|
+
Object.assign(headers, snoGpuAttributionHeaders(diagnostic.clientRequestId, cfgExt.callId, cfgExt.usageClass));
|
|
6986
6987
|
if (typeof cfgExt.operationId === "string") headers["X-Sno-Operation"] = cfgExt.operationId;
|
|
6987
6988
|
} else headers.Authorization = `Bearer ${ctx.apiKey}`;
|
|
6988
6989
|
let response;
|
|
@@ -7058,6 +7059,7 @@ async function callProvider(ctx) {
|
|
|
7058
7059
|
if (typeof raw.endpointUrl !== "string" || typeof raw.prompt !== "string" || typeof raw.timeoutMs !== "number") throw new Error("sno-station-mem llm-client: invalid raw profile completion config");
|
|
7059
7060
|
return {
|
|
7060
7061
|
...await callSnoProfileCompletion({
|
|
7062
|
+
...cfgExt.usageClass ? { usageClass: cfgExt.usageClass } : {},
|
|
7061
7063
|
...cfgExt.promptTemplateHash ? { promptTemplateHash: cfgExt.promptTemplateHash } : {},
|
|
7062
7064
|
...cfgExt.extractionSkillHash ? { extractionSkillHash: cfgExt.extractionSkillHash } : {},
|
|
7063
7065
|
endpointUrl: raw.endpointUrl,
|
|
@@ -7220,6 +7222,7 @@ function buildPipelineConfig(preset, config, endpoint, request, destination, ope
|
|
|
7220
7222
|
destination,
|
|
7221
7223
|
...request.requestId ? { requestId: request.requestId } : {},
|
|
7222
7224
|
...operationId ? { operationId } : {},
|
|
7225
|
+
...config.usageClass ? { usageClass: config.usageClass } : {},
|
|
7223
7226
|
...request.promptTemplateHash ? { promptTemplateHash: request.promptTemplateHash } : {},
|
|
7224
7227
|
...request.extractionSkillHash ? { extractionSkillHash: request.extractionSkillHash } : {},
|
|
7225
7228
|
...request.signal ? { signal: request.signal } : {},
|
|
@@ -18209,6 +18212,15 @@ function loadStorageExtensions(sqlite) {
|
|
|
18209
18212
|
loadSqliteVecExtension(sqlite.raw);
|
|
18210
18213
|
loadSimpleTokenizer(sqlite.db);
|
|
18211
18214
|
}
|
|
18215
|
+
/**
|
|
18216
|
+
* Startup invariant: the persisted DDL
|
|
18217
|
+
* for `nodix_memory_chunks_fts` must declare `tokenize='simple ...'`. Catches DBs
|
|
18218
|
+
* created against an older plugin build (still on `unicode61`) so a stale
|
|
18219
|
+
* DB plus a fresh plugin doesn't silently degrade CJK recall to char-level.
|
|
18220
|
+
*
|
|
18221
|
+
* Mirrors the regex pattern used by `parseVecTableDimension` for
|
|
18222
|
+
* `nodix_memory_chunk_vectors` — single SELECT against `sqlite_master`, regex match.
|
|
18223
|
+
*/
|
|
18212
18224
|
function ensureMemoryKindIndexes(db) {
|
|
18213
18225
|
db.exec("CREATE INDEX IF NOT EXISTS nodix_idx_memories_project_fact_key_active ON nodix_memories(project_id, json_extract(metadata, '$.fact_key')) WHERE json_valid(metadata) AND json_extract(metadata, '$.fact_key') IS NOT NULL AND json_extract(metadata, '$.invalidated_at') IS NULL;");
|
|
18214
18226
|
}
|
|
@@ -26695,9 +26707,8 @@ function buildConfigSnapshot() {
|
|
|
26695
26707
|
HEAD_EXTRACT_OVERLAP_DROP_RATIO,
|
|
26696
26708
|
HEAD_EXTRACT_TOKEN_BUDGET,
|
|
26697
26709
|
INTRA_MEMORY_COSINE_THRESHOLD,
|
|
26698
|
-
LIGHTWEIGHT_COSINE_WEIGHT,
|
|
26699
|
-
LIGHTWEIGHT_FUSION_WEIGHT,
|
|
26700
|
-
LIGHTWEIGHT_RERANK_PENALTY,
|
|
26710
|
+
LIGHTWEIGHT_COSINE_WEIGHT: 1,
|
|
26711
|
+
LIGHTWEIGHT_FUSION_WEIGHT: 0,
|
|
26701
26712
|
MAX_CHUNKS_PER_PARENT: 16,
|
|
26702
26713
|
MMR_LAMBDA,
|
|
26703
26714
|
MULTI_HIT_BONUS_CAP,
|
|
@@ -27210,7 +27221,7 @@ const DEFAULT_RETRIEVAL_CONFIG = {
|
|
|
27210
27221
|
vectorWeight: DEFAULT_VECTOR_WEIGHT,
|
|
27211
27222
|
bm25Weight: DEFAULT_BM25_WEIGHT,
|
|
27212
27223
|
minScore: 0,
|
|
27213
|
-
rerank: "
|
|
27224
|
+
rerank: "lightweight",
|
|
27214
27225
|
candidatePoolSize: 64,
|
|
27215
27226
|
recencyHalfLifeDays: 14,
|
|
27216
27227
|
recencyWeight: RECENCY_WEIGHT,
|
|
@@ -27220,10 +27231,8 @@ const DEFAULT_RETRIEVAL_CONFIG = {
|
|
|
27220
27231
|
lengthNormAnchor: 0,
|
|
27221
27232
|
hardMinScore: 0,
|
|
27222
27233
|
timeDecayHalfLifeDays: 60,
|
|
27223
|
-
|
|
27224
|
-
|
|
27225
|
-
lightweightFusionWeight: LIGHTWEIGHT_FUSION_WEIGHT,
|
|
27226
|
-
lightweightCosineWeight: LIGHTWEIGHT_COSINE_WEIGHT,
|
|
27234
|
+
lightweightFusionWeight: 0,
|
|
27235
|
+
lightweightCosineWeight: 1,
|
|
27227
27236
|
importanceWeightBase: IMPORTANCE_WEIGHT_BASE,
|
|
27228
27237
|
timeDecayFloor: TIME_DECAY_FLOOR,
|
|
27229
27238
|
mmrLambda: MMR_LAMBDA,
|
|
@@ -27519,11 +27528,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27519
27528
|
});
|
|
27520
27529
|
fused = rerankOutcome.candidates;
|
|
27521
27530
|
this.throwIfAborted(context);
|
|
27522
|
-
|
|
27523
|
-
...rerankOutcome.stats,
|
|
27524
|
-
rerankFallbackReason: rerankOutcome.fallback.reason
|
|
27525
|
-
} : rerankOutcome.stats;
|
|
27526
|
-
trace?.endStage(fused.map((r) => r.entry.id), fused.map((r) => r.score), rerankStageMetadata);
|
|
27531
|
+
trace?.endStage(fused.map((r) => r.entry.id), fused.map((r) => r.score));
|
|
27527
27532
|
fused = this.applyScoringPipeline(fused, trace, context.limit, rerankOutcome.modelOrder);
|
|
27528
27533
|
trace?.startStage("min_score_filter", fused.map((result) => result.entry.id));
|
|
27529
27534
|
fused = fused.filter((result) => result.score >= (context.minScore ?? this.config.minScore));
|
|
@@ -27592,423 +27597,23 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27592
27597
|
}
|
|
27593
27598
|
});
|
|
27594
27599
|
//#endregion
|
|
27595
|
-
//#region src/engine/retrieval/retrieval-rerank-provider.ts
|
|
27596
|
-
function buildRerankRequest(apiKey, query, candidates) {
|
|
27597
|
-
return {
|
|
27598
|
-
headers: {
|
|
27599
|
-
"Content-Type": "application/json",
|
|
27600
|
-
Authorization: `Bearer ${apiKey}`,
|
|
27601
|
-
"X-Sno-Source": "sno-station",
|
|
27602
|
-
"X-Sno-Workload": "station-rerank"
|
|
27603
|
-
},
|
|
27604
|
-
body: {
|
|
27605
|
-
query,
|
|
27606
|
-
texts: candidates,
|
|
27607
|
-
raw_scores: true
|
|
27608
|
-
}
|
|
27609
|
-
};
|
|
27610
|
-
}
|
|
27611
|
-
/** Sno's reranker answers a list of `{index, score}`, bare or under `results` / `data`. */
|
|
27612
|
-
function parseRerankResponse(data) {
|
|
27613
|
-
const parseItems = (items) => {
|
|
27614
|
-
if (!Array.isArray(items)) return void 0;
|
|
27615
|
-
const parsed = [];
|
|
27616
|
-
for (const raw of items) {
|
|
27617
|
-
const index = typeof raw?.index === "number" ? raw.index : Number(raw?.index);
|
|
27618
|
-
if (!Number.isFinite(index)) continue;
|
|
27619
|
-
let score;
|
|
27620
|
-
for (const key of ["score", "relevance_score"]) {
|
|
27621
|
-
const value = raw?.[key];
|
|
27622
|
-
const n = typeof value === "number" ? value : Number(value);
|
|
27623
|
-
if (Number.isFinite(n)) {
|
|
27624
|
-
score = n;
|
|
27625
|
-
break;
|
|
27626
|
-
}
|
|
27627
|
-
}
|
|
27628
|
-
if (score === void 0) continue;
|
|
27629
|
-
parsed.push({
|
|
27630
|
-
index,
|
|
27631
|
-
score
|
|
27632
|
-
});
|
|
27633
|
-
}
|
|
27634
|
-
return parsed.length > 0 ? parsed : void 0;
|
|
27635
|
-
};
|
|
27636
|
-
const objectData = data && typeof data === "object" && !Array.isArray(data) ? data : void 0;
|
|
27637
|
-
return parseItems(data) ?? parseItems(objectData?.results) ?? parseItems(objectData?.data);
|
|
27638
|
-
}
|
|
27639
|
-
//#endregion
|
|
27640
27600
|
//#region src/engine/retrieval/retriever-rerank.ts
|
|
27641
27601
|
/** @file retriever-rerank.ts
|
|
27642
|
-
* @purpose Runs
|
|
27602
|
+
* @purpose Runs local cosine ordering and local model reranking.
|
|
27643
27603
|
* @boundary Prototype-mounted MemoryRetriever methods; no constructor state ownership.
|
|
27644
27604
|
*/
|
|
27645
|
-
const RERANK_TRANSIENT_ATTEMPTS = 3;
|
|
27646
|
-
const RERANK_TRANSIENT_BACKOFF_MS = 200;
|
|
27647
|
-
const RERANK_TRANSIENT_STATUSES = /* @__PURE__ */ new Set([
|
|
27648
|
-
429,
|
|
27649
|
-
502,
|
|
27650
|
-
503,
|
|
27651
|
-
504
|
|
27652
|
-
]);
|
|
27653
|
-
const RERANK_RETRY_AFTER_MAX_MS = 5e3;
|
|
27654
|
-
function isRerankTimeout(error) {
|
|
27655
|
-
return error instanceof Error && (error.name === "TimeoutError" || error.name === "AbortError");
|
|
27656
|
-
}
|
|
27657
|
-
/**
|
|
27658
|
-
* The reranker's refusal when a pair is over its window, as the endpoint states it:
|
|
27659
|
-
* `{"detail":{"code":"input_token_limit_exceeded","max_input_tokens":512,
|
|
27660
|
-
* "candidates":[{"index":0,"input_tokens":728,"excess_tokens":216}]}}` (measured 2026-09-14).
|
|
27661
|
-
*
|
|
27662
|
-
* It names every offending text, so the batch can be repaired and sent again instead of
|
|
27663
|
-
* losing the scores of the 49 texts that were fine. The counts are the SERVER's, taken with
|
|
27664
|
-
* the ranking model's tokenizer — which is not the embedder's — so they are the only exact
|
|
27665
|
-
* measure available here of how far over the window a text is.
|
|
27666
|
-
*/
|
|
27667
|
-
const RERANK_OVER_WINDOW_CODE = "input_token_limit_exceeded";
|
|
27668
|
-
function parseOverWindowRefusal(body) {
|
|
27669
|
-
let parsed;
|
|
27670
|
-
try {
|
|
27671
|
-
parsed = JSON.parse(body);
|
|
27672
|
-
} catch {
|
|
27673
|
-
return;
|
|
27674
|
-
}
|
|
27675
|
-
if (typeof parsed !== "object" || parsed === null) return void 0;
|
|
27676
|
-
const detail = parsed.detail;
|
|
27677
|
-
if (typeof detail !== "object" || detail === null) return void 0;
|
|
27678
|
-
const shape = detail;
|
|
27679
|
-
if (shape.code !== RERANK_OVER_WINDOW_CODE) return void 0;
|
|
27680
|
-
if (typeof shape.max_input_tokens !== "number" || !Array.isArray(shape.candidates)) return;
|
|
27681
|
-
const overLong = [];
|
|
27682
|
-
for (const candidate of shape.candidates) {
|
|
27683
|
-
if (typeof candidate !== "object" || candidate === null) continue;
|
|
27684
|
-
const named = candidate;
|
|
27685
|
-
if (typeof named.index !== "number" || typeof named.input_tokens !== "number") continue;
|
|
27686
|
-
overLong.push({
|
|
27687
|
-
index: named.index,
|
|
27688
|
-
inputTokens: named.input_tokens
|
|
27689
|
-
});
|
|
27690
|
-
}
|
|
27691
|
-
return overLong.length === 0 ? void 0 : {
|
|
27692
|
-
maxInputTokens: shape.max_input_tokens,
|
|
27693
|
-
overLong
|
|
27694
|
-
};
|
|
27695
|
-
}
|
|
27696
|
-
function isTransientRerankError(error) {
|
|
27697
|
-
if (isRerankTimeout(error)) return true;
|
|
27698
|
-
return error instanceof TypeError && error.cause !== void 0;
|
|
27699
|
-
}
|
|
27700
|
-
async function fetchRerankWithRetry(send, stop) {
|
|
27701
|
-
let lastError;
|
|
27702
|
-
for (let attempt = 1; attempt <= RERANK_TRANSIENT_ATTEMPTS; attempt += 1) {
|
|
27703
|
-
let retryDelayMs = RERANK_TRANSIENT_BACKOFF_MS * attempt;
|
|
27704
|
-
try {
|
|
27705
|
-
const reply = await send();
|
|
27706
|
-
const { response } = reply;
|
|
27707
|
-
if (response.ok) return reply;
|
|
27708
|
-
if (!RERANK_TRANSIENT_STATUSES.has(response.status) || attempt === RERANK_TRANSIENT_ATTEMPTS) return { response };
|
|
27709
|
-
if (response.status === 429) {
|
|
27710
|
-
const retryAfter = response.headers.get("retry-after");
|
|
27711
|
-
if (retryAfter !== null && /^\d+$/.test(retryAfter)) retryDelayMs = Math.min(Number.parseInt(retryAfter, 10) * 1e3, RERANK_RETRY_AFTER_MAX_MS);
|
|
27712
|
-
}
|
|
27713
|
-
await response.body?.cancel();
|
|
27714
|
-
lastError = /* @__PURE__ */ new Error(`rerank API responded ${response.status}`);
|
|
27715
|
-
} catch (error) {
|
|
27716
|
-
if (!isTransientRerankError(error) || attempt === RERANK_TRANSIENT_ATTEMPTS || stop?.aborted) throw error;
|
|
27717
|
-
lastError = error;
|
|
27718
|
-
}
|
|
27719
|
-
if (stop?.aborted) throw lastError;
|
|
27720
|
-
await new Promise((resolve) => {
|
|
27721
|
-
const onAbort = () => {
|
|
27722
|
-
clearTimeout(timer);
|
|
27723
|
-
resolve();
|
|
27724
|
-
};
|
|
27725
|
-
const timer = setTimeout(() => {
|
|
27726
|
-
stop?.removeEventListener("abort", onAbort);
|
|
27727
|
-
resolve();
|
|
27728
|
-
}, retryDelayMs);
|
|
27729
|
-
stop?.addEventListener("abort", onAbort, { once: true });
|
|
27730
|
-
});
|
|
27731
|
-
if (stop?.aborted) throw lastError;
|
|
27732
|
-
}
|
|
27733
|
-
throw lastError;
|
|
27734
|
-
}
|
|
27735
27605
|
Object.assign(MemoryRetriever.prototype, {
|
|
27736
27606
|
async rerank(query, candidates, queryVector, options) {
|
|
27737
|
-
if (candidates.length === 0) return { candidates };
|
|
27738
|
-
|
|
27739
|
-
const unranked = () => this.rerankLightweight(candidates, queryVector);
|
|
27740
|
-
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");
|
|
27741
|
-
if (this.config.rerank === "lightweight" || !this.config.rerankApiKey) return await this.rerankLocalModel(query, this.rerankLightweight(candidates, queryVector), options?.deadlineAt, options?.signal);
|
|
27742
|
-
const rerankEndpoint = this.config.rerankEndpoint;
|
|
27743
|
-
if (!rerankEndpoint) {
|
|
27744
|
-
log$4.warn("rerank skipped: no reranker address", {}, {
|
|
27745
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
27746
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27747
|
-
function: "rerank",
|
|
27748
|
-
site_id: "retrieval.retriever-rerank.rerank.6fbc6b3a22"
|
|
27749
|
-
});
|
|
27750
|
-
return {
|
|
27751
|
-
candidates: unranked(),
|
|
27752
|
-
fallback: { reason: "no_endpoint" }
|
|
27753
|
-
};
|
|
27754
|
-
}
|
|
27755
|
-
const rerankTimeoutMs = this.config.rerankTimeoutMs ?? 15e3;
|
|
27756
|
-
const stepBudget = AbortSignal.timeout(Math.max(0, Math.floor(options?.deadlineAt === void 0 ? rerankTimeoutMs : options.deadlineAt - Date.now())));
|
|
27757
|
-
const stepStop = options?.signal ? AbortSignal.any([options.signal, stepBudget]) : stepBudget;
|
|
27758
|
-
const rerankApiKey = this.config.rerankApiKey;
|
|
27759
|
-
const maxCandidates = this.config.rerankMaxCandidates;
|
|
27760
|
-
const overCap = maxCandidates !== void 0 && candidates.length > maxCandidates;
|
|
27761
|
-
const toRerank = overCap ? candidates.slice(0, maxCandidates) : candidates;
|
|
27762
|
-
const beyondCap = overCap ? candidates.slice(maxCandidates) : [];
|
|
27763
|
-
const batchSize = 50;
|
|
27764
|
-
const queryTokens = this.embedder.countTokens(query);
|
|
27765
|
-
const documentTokenBudget = 509 - queryTokens;
|
|
27766
|
-
if (documentTokenBudget <= 0) {
|
|
27767
|
-
log$4.warn("rerank skipped: the query alone fills the reranker token window", {
|
|
27768
|
-
queryTokens,
|
|
27769
|
-
window: 512,
|
|
27770
|
-
templateTokens: 3
|
|
27771
|
-
}, {
|
|
27772
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
27773
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27774
|
-
function: "rerank",
|
|
27775
|
-
site_id: "retrieval.retriever-rerank.rerank.query_over_window"
|
|
27776
|
-
});
|
|
27777
|
-
return {
|
|
27778
|
-
candidates: unranked(),
|
|
27779
|
-
fallback: { reason: "query_over_window" }
|
|
27780
|
-
};
|
|
27781
|
-
}
|
|
27782
|
-
let truncatedCandidates = 0;
|
|
27783
|
-
const rerankTexts = toRerank.map((c) => {
|
|
27784
|
-
const bounded = this.embedder.truncateToTokens(c.entry.text, documentTokenBudget);
|
|
27785
|
-
if (bounded !== c.entry.text) truncatedCandidates += 1;
|
|
27786
|
-
return bounded;
|
|
27787
|
-
});
|
|
27788
|
-
if (truncatedCandidates > 0) log$4.warn("rerank candidates were cut to the document budget the query left", {
|
|
27789
|
-
truncatedCandidates,
|
|
27790
|
-
documentTokenBudget,
|
|
27791
|
-
queryTokens
|
|
27792
|
-
}, {
|
|
27793
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
27794
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27795
|
-
function: "rerank",
|
|
27796
|
-
site_id: "retrieval.retriever-rerank.rerank.candidate_over_ceiling"
|
|
27797
|
-
});
|
|
27798
|
-
try {
|
|
27799
|
-
const runBatch = async (start) => {
|
|
27800
|
-
let batchTexts = rerankTexts.slice(start, start + batchSize);
|
|
27801
|
-
for (let pass = 0;; pass += 1) {
|
|
27802
|
-
const { headers, body } = buildRerankRequest(rerankApiKey, query, batchTexts);
|
|
27803
|
-
const sendAttempt = async () => {
|
|
27804
|
-
const clientRequestId = randomUUID();
|
|
27805
|
-
const attemptStarted = performance.now();
|
|
27806
|
-
let outcome = "failed";
|
|
27807
|
-
let statusCode;
|
|
27808
|
-
try {
|
|
27809
|
-
const attempt = await fetch(rerankEndpoint, {
|
|
27810
|
-
method: "POST",
|
|
27811
|
-
headers: {
|
|
27812
|
-
...headers,
|
|
27813
|
-
"X-Request-ID": clientRequestId
|
|
27814
|
-
},
|
|
27815
|
-
body: JSON.stringify(body),
|
|
27816
|
-
signal: AbortSignal.any([AbortSignal.timeout(rerankTimeoutMs), stepStop])
|
|
27817
|
-
});
|
|
27818
|
-
statusCode = attempt.status;
|
|
27819
|
-
if (!attempt.ok) {
|
|
27820
|
-
outcome = "http_error";
|
|
27821
|
-
return { response: attempt };
|
|
27822
|
-
}
|
|
27823
|
-
const data = await attempt.json();
|
|
27824
|
-
outcome = "success";
|
|
27825
|
-
return {
|
|
27826
|
-
response: attempt,
|
|
27827
|
-
data
|
|
27828
|
-
};
|
|
27829
|
-
} catch (error) {
|
|
27830
|
-
outcome = isRerankTimeout(error) ? "timeout" : "failed";
|
|
27831
|
-
throw error;
|
|
27832
|
-
} finally {
|
|
27833
|
-
log$4.info("Rerank request completed", {
|
|
27834
|
-
outcome,
|
|
27835
|
-
status_code: statusCode ?? "unavailable",
|
|
27836
|
-
duration_ms: performance.now() - attemptStarted,
|
|
27837
|
-
texts_sent: batchTexts.length,
|
|
27838
|
-
client_request_id: clientRequestId
|
|
27839
|
-
}, {
|
|
27840
|
-
event_name: "rerank.request.completed",
|
|
27841
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27842
|
-
function: "runBatch",
|
|
27843
|
-
site_id: "rerank.request.completed"
|
|
27844
|
-
});
|
|
27845
|
-
}
|
|
27846
|
-
};
|
|
27847
|
-
const { response, data } = await fetchRerankWithRetry(sendAttempt, stepStop);
|
|
27848
|
-
if (!response.ok) {
|
|
27849
|
-
const retryAfter = response.headers.get("retry-after");
|
|
27850
|
-
const errorBody = await response.text().catch(() => "<unreadable body>");
|
|
27851
|
-
const refusal = pass === 0 ? parseOverWindowRefusal(errorBody) : void 0;
|
|
27852
|
-
if (refusal) {
|
|
27853
|
-
const allowed = refusal.maxInputTokens - 3;
|
|
27854
|
-
batchTexts = batchTexts.map((text, index) => {
|
|
27855
|
-
const named = refusal.overLong.find((c) => c.index === index);
|
|
27856
|
-
if (!named) return text;
|
|
27857
|
-
const localTokens = this.embedder.countTokens(text);
|
|
27858
|
-
const localPairTokens = queryTokens + localTokens;
|
|
27859
|
-
const target = Math.max(1, Math.floor(allowed * localPairTokens / named.inputTokens) - queryTokens);
|
|
27860
|
-
return this.embedder.truncateToTokens(text, target);
|
|
27861
|
-
});
|
|
27862
|
-
log$4.warn("rerank batch refused over its token window; resending the named texts cut to fit", {
|
|
27863
|
-
status: response.status,
|
|
27864
|
-
overLongCount: refusal.overLong.length,
|
|
27865
|
-
maxInputTokens: refusal.maxInputTokens,
|
|
27866
|
-
sentToRerankCount: batchTexts.length,
|
|
27867
|
-
batchStart: start
|
|
27868
|
-
}, {
|
|
27869
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
27870
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27871
|
-
function: "runBatch",
|
|
27872
|
-
site_id: "retrieval.retriever-rerank.runBatch.over_window_repair"
|
|
27873
|
-
});
|
|
27874
|
-
continue;
|
|
27875
|
-
}
|
|
27876
|
-
log$4.warn("rerank API failed, using pre-rerank results", {
|
|
27877
|
-
status: response.status,
|
|
27878
|
-
endpoint_hash: createHash("sha256").update(rerankEndpoint).digest("hex"),
|
|
27879
|
-
retryAfter,
|
|
27880
|
-
sentToRerankCount: batchTexts.length,
|
|
27881
|
-
batchStart: start,
|
|
27882
|
-
body_length: errorBody.length
|
|
27883
|
-
}, {
|
|
27884
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
27885
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27886
|
-
function: "runBatch",
|
|
27887
|
-
site_id: "retrieval.retriever-rerank.runBatch.76d7d1fac6"
|
|
27888
|
-
});
|
|
27889
|
-
return "http_error";
|
|
27890
|
-
}
|
|
27891
|
-
const parsed = parseRerankResponse(data);
|
|
27892
|
-
if (!parsed) {
|
|
27893
|
-
log$4.warn("rerank API returned unparseable response", {
|
|
27894
|
-
endpoint_hash: createHash("sha256").update(rerankEndpoint).digest("hex"),
|
|
27895
|
-
batchStart: start
|
|
27896
|
-
}, {
|
|
27897
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
27898
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27899
|
-
function: "runBatch",
|
|
27900
|
-
site_id: "retrieval.retriever-rerank.runBatch.4429b8bd8a"
|
|
27901
|
-
});
|
|
27902
|
-
return "invalid_response";
|
|
27903
|
-
}
|
|
27904
|
-
const batchItems = [];
|
|
27905
|
-
for (const item of parsed) {
|
|
27906
|
-
if (item.index < 0 || item.index >= batchTexts.length) continue;
|
|
27907
|
-
batchItems.push({
|
|
27908
|
-
index: start + item.index,
|
|
27909
|
-
score: item.score
|
|
27910
|
-
});
|
|
27911
|
-
}
|
|
27912
|
-
return batchItems;
|
|
27913
|
-
}
|
|
27914
|
-
};
|
|
27915
|
-
const batchStarts = [];
|
|
27916
|
-
for (let start = 0; start < rerankTexts.length; start += batchSize) batchStarts.push(start);
|
|
27917
|
-
const items = [];
|
|
27918
|
-
for (let wave = 0; wave < batchStarts.length; wave += 4) {
|
|
27919
|
-
const waveStarts = batchStarts.slice(wave, wave + 4);
|
|
27920
|
-
const settled = await Promise.allSettled(waveStarts.map(runBatch));
|
|
27921
|
-
for (const outcome of settled) if (outcome.status === "rejected" && outcome.reason instanceof RetrievalError) throw outcome.reason;
|
|
27922
|
-
for (const outcome of settled) if (outcome.status === "rejected") throw outcome.reason;
|
|
27923
|
-
for (const outcome of settled) if (outcome.status === "fulfilled" && typeof outcome.value === "string") return {
|
|
27924
|
-
candidates: unranked(),
|
|
27925
|
-
fallback: { reason: outcome.value }
|
|
27926
|
-
};
|
|
27927
|
-
for (const outcome of settled) if (outcome.status === "fulfilled" && typeof outcome.value !== "string") items.push(...outcome.value);
|
|
27928
|
-
}
|
|
27929
|
-
const blendCross = this.config.rerankBlendCross ?? .7;
|
|
27930
|
-
const blendVector = this.config.rerankBlendVector ?? .3;
|
|
27931
|
-
const returnedIndices = new Set(items.map((r) => r.index));
|
|
27932
|
-
const reranked = [];
|
|
27933
|
-
const seenIndices = /* @__PURE__ */ new Set();
|
|
27934
|
-
for (const item of items) {
|
|
27935
|
-
if (seenIndices.has(item.index)) continue;
|
|
27936
|
-
seenIndices.add(item.index);
|
|
27937
|
-
const candidate = toRerank[item.index];
|
|
27938
|
-
if (!candidate) continue;
|
|
27939
|
-
const sourceScore = this.getRerankSourceScore(candidate);
|
|
27940
|
-
const blendedScore = clamp01(1 / (1 + Math.exp(-item.score)) * blendCross + sourceScore * blendVector, 0);
|
|
27941
|
-
reranked.push({
|
|
27942
|
-
...candidate,
|
|
27943
|
-
score: blendedScore,
|
|
27944
|
-
sources: {
|
|
27945
|
-
...candidate.sources,
|
|
27946
|
-
reranked: { score: item.score }
|
|
27947
|
-
}
|
|
27948
|
-
});
|
|
27949
|
-
}
|
|
27950
|
-
const unreturned = [...toRerank.filter((_, idx) => !returnedIndices.has(idx)), ...beyondCap].map((r) => ({
|
|
27951
|
-
...r,
|
|
27952
|
-
score: clamp01(this.getRerankSourceScore(r) * LIGHTWEIGHT_RERANK_PENALTY, 0)
|
|
27953
|
-
}));
|
|
27954
|
-
const merged = [...reranked, ...unreturned].sort((a, b) => b.score - a.score);
|
|
27955
|
-
log$4.debug("reranked", {
|
|
27956
|
-
totalCandidateCount: candidates.length,
|
|
27957
|
-
sentToRerankCount: toRerank.length,
|
|
27958
|
-
returnedCount: reranked.length
|
|
27959
|
-
}, {
|
|
27960
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
27961
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27962
|
-
function: "rerank",
|
|
27963
|
-
site_id: "retrieval.retriever-rerank.rerank.7847c6248a"
|
|
27964
|
-
});
|
|
27965
|
-
return {
|
|
27966
|
-
candidates: merged.length > 0 ? merged : candidates,
|
|
27967
|
-
stats: {
|
|
27968
|
-
rerankSentCount: toRerank.length,
|
|
27969
|
-
rerankReturnedCount: reranked.length,
|
|
27970
|
-
rerankBeyondCapCount: beyondCap.length
|
|
27971
|
-
}
|
|
27972
|
-
};
|
|
27973
|
-
} catch (error) {
|
|
27974
|
-
if (error instanceof RetrievalError) throw error;
|
|
27975
|
-
let reason;
|
|
27976
|
-
if (isRerankTimeout(error)) {
|
|
27977
|
-
reason = "timeout";
|
|
27978
|
-
log$4.warn("rerank API timed out, using pre-rerank results", {
|
|
27979
|
-
timeoutMs: rerankTimeoutMs,
|
|
27980
|
-
attempts: RERANK_TRANSIENT_ATTEMPTS
|
|
27981
|
-
}, {
|
|
27982
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
27983
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27984
|
-
function: "rerank",
|
|
27985
|
-
site_id: "retrieval.retriever-rerank.rerank.4af9c17c75"
|
|
27986
|
-
});
|
|
27987
|
-
} else {
|
|
27988
|
-
reason = "request_error";
|
|
27989
|
-
log$4.warn("rerank error, using pre-rerank results", {
|
|
27990
|
-
error,
|
|
27991
|
-
attempts: RERANK_TRANSIENT_ATTEMPTS
|
|
27992
|
-
}, {
|
|
27993
|
-
event_name: "memory.retriever_rerank.diagnostic",
|
|
27994
|
-
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27995
|
-
function: "rerank",
|
|
27996
|
-
site_id: "retrieval.retriever-rerank.rerank.2c5fc67dbf"
|
|
27997
|
-
});
|
|
27998
|
-
}
|
|
27999
|
-
return {
|
|
28000
|
-
candidates: unranked(),
|
|
28001
|
-
fallback: { reason }
|
|
28002
|
-
};
|
|
28003
|
-
}
|
|
27607
|
+
if (candidates.length === 0 || this.config.rerank === "none") return { candidates };
|
|
27608
|
+
return this.rerankLocalModel(query, this.rerankLightweight(candidates, queryVector), options?.deadlineAt, options?.signal);
|
|
28004
27609
|
},
|
|
28005
27610
|
rerankLightweight(candidates, queryVector) {
|
|
28006
27611
|
if (queryVector.length === 0) return candidates;
|
|
28007
27612
|
if (candidates.length === 0) return candidates;
|
|
28008
27613
|
const chunkIds = candidates.map((c) => c.chunkId).filter((id) => id !== void 0);
|
|
28009
27614
|
const vectorMap = chunkIds.length > 0 ? this.store.getVectorsByIds(chunkIds) : /* @__PURE__ */ new Map();
|
|
28010
|
-
const wF = this.config.lightweightFusionWeight ??
|
|
28011
|
-
const wC = this.config.lightweightCosineWeight ??
|
|
27615
|
+
const wF = this.config.lightweightFusionWeight ?? 0;
|
|
27616
|
+
const wC = this.config.lightweightCosineWeight ?? 1;
|
|
28012
27617
|
let blendedCount = 0;
|
|
28013
27618
|
let dimMismatchCount = 0;
|
|
28014
27619
|
const reranked = candidates.map((candidate) => {
|
|
@@ -28074,9 +27679,10 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
28074
27679
|
*/
|
|
28075
27680
|
async rerankLocalModel(query, ordered, deadlineAt, signal) {
|
|
28076
27681
|
if (ordered.length < 2 || signal?.aborted || deadlineAt !== void 0 && Date.now() >= deadlineAt) return { candidates: ordered };
|
|
28077
|
-
const head = ordered.slice(0,
|
|
27682
|
+
const head = ordered.slice(0, 32);
|
|
28078
27683
|
const started = performance.now();
|
|
28079
|
-
const budgetMs =
|
|
27684
|
+
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())));
|
|
27685
|
+
if (budgetMs === 0) return { candidates: ordered };
|
|
28080
27686
|
const stop = signal ? AbortSignal.any([signal, AbortSignal.timeout(budgetMs)]) : AbortSignal.timeout(budgetMs);
|
|
28081
27687
|
const scoring = this.embedder.scoreRelevance(query, head.map((r) => r.entry.text), stop).catch((error) => {
|
|
28082
27688
|
log$4.warn("local reranker failed; recall keeps the local ranking order", { error }, {
|
|
@@ -28086,11 +27692,23 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
28086
27692
|
site_id: "retrieval.retriever-rerank.rerankLocalModel.failed"
|
|
28087
27693
|
});
|
|
28088
27694
|
});
|
|
28089
|
-
|
|
27695
|
+
let onAbort = () => {};
|
|
27696
|
+
const aborted = new Promise((resolve) => {
|
|
27697
|
+
onAbort = () => resolve(void 0);
|
|
27698
|
+
stop.addEventListener("abort", onAbort, { once: true });
|
|
27699
|
+
});
|
|
27700
|
+
let logits;
|
|
27701
|
+
try {
|
|
27702
|
+
logits = await Promise.race([scoring, aborted]);
|
|
27703
|
+
} finally {
|
|
27704
|
+
stop.removeEventListener("abort", onAbort);
|
|
27705
|
+
}
|
|
28090
27706
|
if (!logits || signal?.aborted) return { candidates: ordered };
|
|
27707
|
+
const minimum = Math.min(...logits);
|
|
27708
|
+
const span = Math.max(1e-9, Math.max(...logits) - minimum);
|
|
28091
27709
|
const blended = head.map((candidate, index) => ({
|
|
28092
27710
|
candidate,
|
|
28093
|
-
value: logits[index] ??
|
|
27711
|
+
value: .5 * (((logits[index] ?? minimum) - minimum) / span) + .5 * candidate.score
|
|
28094
27712
|
}));
|
|
28095
27713
|
blended.sort((a, b) => b.value - a.value || a.candidate.entry.id.localeCompare(b.candidate.entry.id));
|
|
28096
27714
|
const slots = head.map((candidate) => candidate.score).sort((a, b) => b - a);
|
|
@@ -28119,9 +27737,6 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
28119
27737
|
candidates: [...rescored, ...ordered.slice(head.length)],
|
|
28120
27738
|
modelOrder: blended.map(({ candidate }) => candidate.entry.id)
|
|
28121
27739
|
};
|
|
28122
|
-
},
|
|
28123
|
-
getRerankSourceScore(result) {
|
|
28124
|
-
return clamp01(Math.max(result.sources.bm25?.score ?? 0, result.sources.vector?.score ?? 0), 0);
|
|
28125
27740
|
}
|
|
28126
27741
|
});
|
|
28127
27742
|
//#endregion
|
|
@@ -28415,7 +28030,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
28415
28030
|
},
|
|
28416
28031
|
applyMmrDiversity(results) {
|
|
28417
28032
|
if (results.length === 0) return results;
|
|
28418
|
-
const lambda = this.config.mmrLambda ?? .
|
|
28033
|
+
const lambda = this.config.mmrLambda ?? .9;
|
|
28419
28034
|
const chunkIds = results.map((r) => r.chunkId).filter((id) => id !== void 0);
|
|
28420
28035
|
const vectorMap = chunkIds.length > 0 ? this.store.getVectorsByIds(chunkIds) : /* @__PURE__ */ new Map();
|
|
28421
28036
|
const sorted = [...results].sort((a, b) => {
|
|
@@ -30222,7 +29837,7 @@ async function runWithCanonicalStoreWriteMutex(canonicalStorePath, action) {
|
|
|
30222
29837
|
async function openBatchRuntime(input) {
|
|
30223
29838
|
const settings = input.settings;
|
|
30224
29839
|
const dbPath = settings.store.path;
|
|
30225
|
-
const pluginConfig = settingsToPluginConfig(settings);
|
|
29840
|
+
const pluginConfig = settingsToPluginConfig(settings, "product");
|
|
30226
29841
|
initSqliteRuntime(settings.store.encryptionKey);
|
|
30227
29842
|
const embedder = createEmbedder(pluginConfig.embedding, getSnoStationMemStateDir());
|
|
30228
29843
|
let store;
|
|
@@ -30249,6 +29864,7 @@ async function openBatchRuntime(input) {
|
|
|
30249
29864
|
loadStorageExtensions(database);
|
|
30250
29865
|
const llm = createLlmClient({
|
|
30251
29866
|
preset: FIXED_MEMORY_SNO_EXTRACT_CHAT,
|
|
29867
|
+
usageClass: pluginConfig.extraction.llm.usageClass,
|
|
30252
29868
|
operationId: input.jobId,
|
|
30253
29869
|
apiKey: settings.snoGpu.apiKey,
|
|
30254
29870
|
baseURL: settings.snoGpu.baseUrl,
|