Files
ST-Bionic-Memory-Ecology/host-adapter/context.js
2026-03-26 22:24:45 +08:00

89 lines
2.3 KiB
JavaScript

import { getContext as extensionGetContext } from "../../../extensions.js";
import { buildCapabilityStatus, mergeVersionHints } from "./capabilities.js";
function resolveContextGetter(providedGetter = null) {
if (typeof providedGetter === "function") {
return providedGetter;
}
if (typeof extensionGetContext === "function") {
return extensionGetContext;
}
const globalGetter = globalThis?.SillyTavern?.getContext;
return typeof globalGetter === "function" ? globalGetter : null;
}
function detectContextMode(getContext) {
if (typeof getContext !== "function") {
return "unavailable";
}
if (getContext === extensionGetContext) {
return "extensions-api";
}
return "global-api";
}
export function createContextHostFacade(options = {}) {
const getContext = resolveContextGetter(options.getContext);
const available = typeof getContext === "function";
const mode = detectContextMode(getContext);
return Object.freeze({
available,
mode,
fallbackReason: available ? "" : "未检测到 getContext 宿主接口",
versionHints: mergeVersionHints(
{
getter: "getContext",
source: mode,
sillyTavernGlobal:
globalThis?.SillyTavern && typeof globalThis.SillyTavern === "object"
? "available"
: "missing",
},
options.versionHints,
),
getContext: (...args) => {
if (!available) {
return null;
}
try {
return getContext(...args);
} catch (error) {
console.debug(
"[ST-BME] host-adapter/context getContext 调用失败",
error,
);
return null;
}
},
readContextSnapshot: (...args) => {
if (!available) {
return null;
}
try {
const context = getContext(...args);
return context && typeof context === "object" ? context : null;
} catch (error) {
console.debug("[ST-BME] host-adapter/context 读取上下文失败", error);
return null;
}
},
});
}
export function inspectContextHostCapability(options = {}) {
const facade = createContextHostFacade(options);
return buildCapabilityStatus(facade);
}
export function readHostContext(options = {}) {
return createContextHostFacade(options).readContextSnapshot();
}