import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import {
collectPluginConfigContractMatches,
resolvePluginConfigContractsById,
} from "../plugins/config-contracts.js"; import { normalizePluginsConfig, resolveEnableState } from "../plugins/config-state.js"; import type { PluginOrigin } from "../plugins/plugin-origin.types.js"; import {
collectSecretInputAssignment,
type ResolverContext,
type SecretDefaults,
} from "./runtime-shared.js"; import { isRecord } from "./shared.js";
/** * Walk manifest-declared plugin config SecretRef surfaces and collect * assignments for runtime materialization. Plugin-owned metadata controls which * config paths support SecretRefs and whether bundled plugins stay inactive on * that surface until explicitly enabled. * * When `loadablePluginOrigins` is provided, entries whose ID is not in the map * are treated as inactive (stale config entries for plugins that are no longer * installed). This prevents resolution failures for SecretRefs belonging to * non-loadable plugins from blocking startup or preflight validation.
*/
export function collectPluginConfigAssignments(params: {
config: OpenClawConfig;
defaults: SecretDefaults | undefined;
context: ResolverContext;
loadablePluginOrigins?: ReadonlyMap<string, PluginOrigin>;
}): void { const entries = params.config.plugins?.entries; if (!isRecord(entries)) { return;
}
function createPluginConfigAssignmentApply(
pluginConfig: Record<string, unknown>,
relativePath: string,
): (value: unknown) => void { return (value) => { const segments = relativePath
.replace(/\[(\d+)\]/g, ".$1")
.split(".")
.map((segment) => segment.trim())
.filter(Boolean); if (segments.length === 0) { return;
}
let current: unknown = pluginConfig; for (const segment of segments.slice(0, -1)) { if (Array.isArray(current)) { const index = Number.parseInt(segment, 10);
current = Number.isInteger(index) ? current[index] : undefined; continue;
}
current = isRecord(current) ? current[segment] : undefined;
} const finalSegment = segments.at(-1); if (!finalSegment) { return;
} if (Array.isArray(current)) { const index = Number.parseInt(finalSegment, 10); if (Number.isInteger(index) && index >= 0 && index < current.length) {
current[index] = value;
} return;
} if (isRecord(current)) {
current[finalSegment] = value;
}
};
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.1Bemerkung:
(vorverarbeitet am 2026-06-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.