@ai2070/l0
Version:
L0: The Missing Reliability Substrate for AI
92 lines (91 loc) • 3.13 kB
JavaScript
const registeredAdapters = [];
const DEFAULT_ADAPTER_PRIORITY = 0;
function registerAdapter(adapter, options = {}) {
const { silent = false, priority = DEFAULT_ADAPTER_PRIORITY } = options;
if (!adapter.detect) {
if (!silent && typeof process !== "undefined" && process.env?.NODE_ENV !== "production") {
console.warn(
`\u26A0\uFE0F Adapter "${adapter.name}" has no detect() method.
It will not be used for auto-detection.
Use explicit \`adapter: myAdapter\` instead, or add a detect() method.`
);
}
}
if (registeredAdapters.some((entry2) => entry2.adapter.name === adapter.name)) {
throw new Error(`Adapter "${adapter.name}" is already registered`);
}
const entry = { adapter, priority };
const insertIndex = registeredAdapters.findIndex(
(e) => e.priority < priority
);
if (insertIndex === -1) {
registeredAdapters.push(entry);
} else {
registeredAdapters.splice(insertIndex, 0, entry);
}
}
function unregisterAdapter(name) {
const index = registeredAdapters.findIndex(
(entry) => entry.adapter.name === name
);
if (index === -1) return false;
registeredAdapters.splice(index, 1);
return true;
}
function getAdapter(name) {
const entry = registeredAdapters.find((e) => e.adapter.name === name);
return entry?.adapter;
}
function getRegisteredStreamAdapters() {
return registeredAdapters.map((entry) => entry.adapter.name);
}
function clearAdapters() {
registeredAdapters.length = 0;
}
function unregisterAllExcept(except = []) {
const exceptSet = new Set(except);
const toRemove = registeredAdapters.filter((entry) => !exceptSet.has(entry.adapter.name)).map((entry) => entry.adapter.name);
for (const name of toRemove) {
unregisterAdapter(name);
}
return toRemove;
}
function detectAdapter(input) {
const detectableAdapters = registeredAdapters.filter(
(entry) => entry.adapter.detect
);
const matches = detectableAdapters.filter(
(entry) => entry.adapter.detect(input)
);
if (matches.length === 0) {
const registered = getRegisteredStreamAdapters();
const detectable = detectableAdapters.map((entry) => entry.adapter.name);
const adapterList = detectable.length > 0 ? `[${detectable.join(", ")}]` : "(none)";
const hint = registered.length > detectable.length ? ` (${registered.length - detectable.length} adapter(s) without detect() were skipped)` : "";
throw new Error(
`No registered adapter detected for stream. Detectable adapters: ${adapterList}${hint}. Use explicit \`adapter: myAdapter\` or register an adapter with detect().`
);
}
return matches[0].adapter;
}
function hasMatchingAdapter(input) {
const detectableAdapters = registeredAdapters.filter(
(entry) => entry.adapter.detect
);
const matches = detectableAdapters.filter(
(entry) => entry.adapter.detect(input)
);
return matches.length >= 1;
}
export {
DEFAULT_ADAPTER_PRIORITY,
clearAdapters,
detectAdapter,
getAdapter,
getRegisteredStreamAdapters,
hasMatchingAdapter,
registerAdapter,
unregisterAdapter,
unregisterAllExcept
};
//# sourceMappingURL=registry.js.map