mirror of
https://github.com/Youzini-afk/ST-Bionic-Memory-Ecology.git
synced 2026-06-13 18:31:16 +08:00
Reorganize modules into layered directories
This commit is contained in:
103
host/adapter/injection.js
Normal file
103
host/adapter/injection.js
Normal file
@@ -0,0 +1,103 @@
|
||||
import { buildCapabilityStatus, mergeVersionHints } from "./capabilities.js";
|
||||
import { createContextHostFacade } from "./context.js";
|
||||
import { debugDebug } from "../../runtime/debug-logging.js";
|
||||
|
||||
function resolvePromptSetter(providedSetter = null, contextHost = null) {
|
||||
if (typeof providedSetter === "function") {
|
||||
return {
|
||||
setter: providedSetter,
|
||||
source: "provided",
|
||||
};
|
||||
}
|
||||
|
||||
const context = contextHost?.readContextSnapshot?.();
|
||||
if (typeof context?.setExtensionPrompt === "function") {
|
||||
return {
|
||||
setter: context.setExtensionPrompt.bind(context),
|
||||
source: "context",
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
setter: null,
|
||||
source: contextHost?.available ? "context-missing-setter" : "unavailable",
|
||||
};
|
||||
}
|
||||
|
||||
function detectInjectionMode(setterRecord, contextHost) {
|
||||
if (typeof setterRecord?.setter === "function") {
|
||||
return setterRecord.source === "provided"
|
||||
? "provided-setter"
|
||||
: "context-extension-prompt";
|
||||
}
|
||||
|
||||
if (contextHost?.available) {
|
||||
return "context-without-extension-prompt";
|
||||
}
|
||||
|
||||
return "unavailable";
|
||||
}
|
||||
|
||||
export function createInjectionHostFacade(options = {}) {
|
||||
const contextHost = options.contextHost || createContextHostFacade(options);
|
||||
const setterRecord = resolvePromptSetter(
|
||||
options.setExtensionPrompt,
|
||||
contextHost,
|
||||
);
|
||||
const available = typeof setterRecord.setter === "function";
|
||||
const mode = detectInjectionMode(setterRecord, contextHost);
|
||||
|
||||
return Object.freeze({
|
||||
available,
|
||||
mode,
|
||||
fallbackReason: available
|
||||
? ""
|
||||
: contextHost?.available
|
||||
? "当前上下文未暴露 setExtensionPrompt 接口"
|
||||
: "未检测到可用注入宿主接口",
|
||||
versionHints: mergeVersionHints(
|
||||
{
|
||||
setter: "setExtensionPrompt",
|
||||
source: setterRecord.source,
|
||||
contextMode: contextHost?.mode || "unknown",
|
||||
},
|
||||
options.versionHints,
|
||||
),
|
||||
setExtensionPrompt: (...args) => {
|
||||
const liveSetterRecord = resolvePromptSetter(
|
||||
options.setExtensionPrompt,
|
||||
contextHost,
|
||||
);
|
||||
if (typeof liveSetterRecord.setter !== "function") {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
liveSetterRecord.setter(...args);
|
||||
return true;
|
||||
} catch (error) {
|
||||
debugDebug(
|
||||
"[ST-BME] host-adapter/injection setExtensionPrompt 调用失败",
|
||||
error,
|
||||
);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
readInjectionSupport: () => {
|
||||
const liveSetterRecord = resolvePromptSetter(
|
||||
options.setExtensionPrompt,
|
||||
contextHost,
|
||||
);
|
||||
return Object.freeze({
|
||||
available: typeof liveSetterRecord.setter === "function",
|
||||
mode: detectInjectionMode(liveSetterRecord, contextHost),
|
||||
source: liveSetterRecord.source,
|
||||
});
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export function inspectInjectionHostCapability(options = {}) {
|
||||
const facade = createInjectionHostFacade(options);
|
||||
return buildCapabilityStatus(facade);
|
||||
}
|
||||
Reference in New Issue
Block a user