openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
234 lines (233 loc) • 8.52 kB
JavaScript
import "./agent-scope-MrLta7Pq.js";
import "./provider-auth-aliases-BNZrcvHv.js";
import "./sandbox-paths-DAj1Euvz.js";
import "./auth-profiles-84rzaGag.js";
import "./model-auth-markers-Sq8HdQFX.js";
import "./model-selection-CA_65iXi.js";
import "./model-catalog-0-HKr2yW.js";
import "./model-auth-DVfmdW0b.js";
import "./common-C4yy9V-D.js";
import "./typebox-DCO1JbMn.js";
import "./identity-Qcvvo6SY.js";
import "./embedded-agent-utils-CUYamrTB.js";
import "./simple-completion-runtime-BBvPbT7Q.js";
import "./tts-Dt79-aAB.js";
import "./web-shared-TPeHhehr.js";
import "./date-time-CcWivhrg.js";
import "./current-time-D-ClLmMh.js";
import "./agent-dir-compat-BqOAVSjO.js";
import "./identity-avatar-DDczSDZA.js";
import "./web-guarded-fetch-DYAWPWNo.js";
import "./agent-command-DimMXeog.js";
//#region src/tools/availability.ts
/**
* Tool availability evaluator for descriptor-driven tool planning.
*
* Descriptors express why a tool can be shown as small signals; this module
* turns those signals into diagnostics without knowing any concrete tool owner.
*/
function isRecord(value) {
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
}
function resolveConfigPath(config, path) {
let current = config;
for (const segment of path) {
if (!isRecord(current)) return;
current = current[segment];
}
return current;
}
function hasConfiguredValue(params) {
const { value, signal } = params;
if (value === void 0 || value === null) return false;
if ((signal.check ?? "exists") === "available") return params.context.isConfigValueAvailable?.({
value,
path: signal.path,
signal
}) === true;
if ((signal.check ?? "exists") === "exists") return true;
if (typeof value === "string") return value.trim().length > 0;
if (Array.isArray(value)) return value.length > 0;
if (typeof value === "object") return Object.keys(value).length > 0;
return true;
}
function hasAvailabilityExpressionShape(value) {
return "kind" in value || "allOf" in value || "anyOf" in value;
}
function diagnostic(reason, signal, message) {
return {
reason,
signal,
message
};
}
function evaluateSignal(signal, context) {
switch (signal.kind) {
case "always": return null;
case "auth": return context.authProviderIds?.has(signal.providerId) ? null : diagnostic("auth-missing", signal, `Missing auth provider: ${signal.providerId}`);
case "config": return hasConfiguredValue({
value: resolveConfigPath(context.config, signal.path),
signal,
context
}) ? null : diagnostic("config-missing", signal, `Missing config path: ${signal.path.join(".")}`);
case "env": return context.env?.[signal.name]?.trim() ? null : diagnostic("env-missing", signal, `Missing environment value: ${signal.name}`);
case "plugin-enabled": return context.enabledPluginIds?.has(signal.pluginId) ? null : diagnostic("plugin-disabled", signal, `Plugin is not enabled: ${signal.pluginId}`);
case "context": {
const value = context.values?.[signal.key];
if (!("equals" in signal)) return value === void 0 ? diagnostic("context-mismatch", signal, `Missing context value: ${signal.key}`) : null;
return value === signal.equals ? null : diagnostic("context-mismatch", signal, `Context value did not match: ${signal.key}`);
}
default: return diagnostic("unsupported-signal", signal, "Unsupported availability signal");
}
}
function evaluateExpression(expression, context) {
if ("kind" in expression) {
const diagnosticLocal = evaluateSignal(expression, context);
return diagnosticLocal ? [diagnosticLocal] : [];
}
if ("allOf" in expression) {
if (expression.allOf.length === 0) return [{
reason: "unsupported-signal",
message: "Empty availability allOf group"
}];
return expression.allOf.flatMap((entry) => evaluateExpression(entry, context));
}
if ("anyOf" in expression) {
if (expression.anyOf.length === 0) return [{
reason: "unsupported-signal",
message: "Empty availability anyOf group"
}];
const diagnostics = expression.anyOf.map((entry) => evaluateExpression(entry, context));
const unsupported = diagnostics.flat().filter((entry) => entry.reason === "unsupported-signal");
if (diagnostics.some((entries) => entries.length === 0)) return unsupported;
return diagnostics.flat();
}
return [{
reason: "unsupported-signal",
message: "Unsupported availability expression"
}];
}
/** Evaluate one descriptor against runtime context and return hidden-tool diagnostics. */
function evaluateToolAvailability(params) {
const context = params.context ?? {};
const availability = params.descriptor.availability ?? { kind: "always" };
if (!hasAvailabilityExpressionShape(availability)) return [{
reason: "unsupported-signal",
message: "Unsupported availability expression"
}];
return evaluateExpression(availability, context);
}
//#endregion
//#region src/tools/descriptors.ts
/**
* Identity helpers for authoring tool descriptors with stable inferred types.
*
* Callers use these at declaration sites so descriptor arrays keep readonly
* shapes while still validating against the public ToolDescriptor contract.
*/
/** Define one tool descriptor without changing its runtime shape. */
function defineToolDescriptor(descriptor) {
return descriptor;
}
/** Define a readonly descriptor list without changing runtime order or entries. */
function defineToolDescriptors(descriptors) {
return descriptors;
}
//#endregion
//#region src/tools/diagnostics.ts
/** Error thrown when a visible tool plan cannot be built from descriptors. */
var ToolPlanContractError = class extends Error {
constructor(params) {
super(params.message);
this.name = "ToolPlanContractError";
this.code = params.code;
this.toolName = params.toolName;
}
};
//#endregion
//#region src/tools/execution.ts
/**
* Formatting helpers for tool executor references.
*
* Executor refs are closed discriminated unions; the formatted string is for
* diagnostics/logging and must not become a parser contract.
*/
/** Render an executor ref as a compact diagnostic label. */
function formatToolExecutorRef(ref) {
switch (ref.kind) {
case "core": return `core:${ref.executorId}`;
case "plugin": return `plugin:${ref.pluginId}:${ref.toolName}`;
case "channel": return `channel:${ref.channelId}:${ref.actionId}`;
case "mcp": return `mcp:${ref.serverId}:${ref.toolName}`;
default: return ref;
}
}
//#endregion
//#region src/tools/planner.ts
/**
* Deterministic planner for descriptor-backed tools.
*
* The planner sorts descriptors, hides unavailable tools with diagnostics, and
* throws only when visible tool descriptors violate executor/name contracts.
*/
function compareDescriptors(left, right) {
return (left.sortKey ?? left.name).localeCompare(right.sortKey ?? right.name) || left.name.localeCompare(right.name);
}
function assertUniqueNames(descriptors) {
const seen = /* @__PURE__ */ new Set();
for (const descriptor of descriptors) {
if (seen.has(descriptor.name)) throw new ToolPlanContractError({
code: "duplicate-tool-name",
toolName: descriptor.name,
message: `Duplicate tool descriptor name: ${descriptor.name}`
});
seen.add(descriptor.name);
}
}
/** Build the visible and hidden tool plan for a runtime context. */
function buildToolPlan(options) {
const descriptors = options.descriptors.toSorted(compareDescriptors);
assertUniqueNames(descriptors);
const visible = [];
const hidden = [];
for (const descriptor of descriptors) {
const diagnostics = [...evaluateToolAvailability({
descriptor,
context: options.availability
})];
if (diagnostics.length > 0) {
hidden.push({
descriptor,
diagnostics
});
continue;
}
if (!descriptor.executor) throw new ToolPlanContractError({
code: "missing-executor",
toolName: descriptor.name,
message: `Visible tool descriptor has no executor ref: ${descriptor.name}`
});
visible.push({
descriptor,
executor: descriptor.executor
});
}
return {
visible,
hidden
};
}
//#endregion
//#region src/tools/protocol.ts
function toToolProtocolDescriptor(entry) {
return {
name: entry.descriptor.name,
description: entry.descriptor.description,
inputSchema: entry.descriptor.inputSchema
};
}
function toToolProtocolDescriptors(entries) {
return entries.map(toToolProtocolDescriptor);
}
//#endregion
export { ToolPlanContractError as a, evaluateToolAvailability as c, formatToolExecutorRef as i, toToolProtocolDescriptors as n, defineToolDescriptor as o, buildToolPlan as r, defineToolDescriptors as s, toToolProtocolDescriptor as t };