UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

108 lines (107 loc) 4.55 kB
import { c as normalizeOptionalLowercaseString, l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { f as resolveAgentIdFromSessionKey, g as sanitizeAgentId } from "./session-key-BnWWjqNc.js"; import { n as normalizeAccountId } from "./account-id-CETVCrTz.js"; import { o as sha256HexPrefixCore } from "./crypto-digest-C4hqTb_e.js"; //#region src/acp/persistent-bindings.types.ts /** Normalizes binding mode, defaulting to persistent sessions. */ function normalizeMode(value) { return normalizeOptionalLowercaseString(value) === "oneshot" ? "oneshot" : "persistent"; } /** Extracts supported ACP binding config keys from unknown plugin config. */ function normalizeBindingConfig(raw) { if (!raw || typeof raw !== "object") return {}; const shape = raw; const mode = normalizeOptionalString(shape.mode); return { mode: mode ? normalizeMode(mode) : void 0, cwd: normalizeOptionalString(shape.cwd), backend: normalizeOptionalString(shape.backend), label: normalizeOptionalString(shape.label) }; } function buildBindingHash(params) { return sha256HexPrefixCore(`${params.channel}:${params.accountId}:${params.conversationId}`, 16); } /** Builds the stable generated ACP session key for a configured binding. */ function buildConfiguredAcpSessionKey(spec) { const hash = buildBindingHash({ channel: spec.channel, accountId: spec.accountId, conversationId: spec.conversationId }); return `agent:${sanitizeAgentId(spec.agentId)}:acp:binding:${spec.channel}:${spec.accountId}:${hash}`; } /** Converts a configured ACP binding spec into an outbound session binding record. */ function toConfiguredAcpBindingRecord(spec) { return { bindingId: `config:acp:${spec.channel}:${spec.accountId}:${spec.conversationId}`, targetSessionKey: buildConfiguredAcpSessionKey(spec), targetKind: "session", conversation: { channel: spec.channel, accountId: spec.accountId, conversationId: spec.conversationId, parentConversationId: spec.parentConversationId }, status: "active", boundAt: 0, metadata: { source: "config", mode: spec.mode, agentId: spec.agentId, ...spec.acpAgentId ? { acpAgentId: spec.acpAgentId } : {}, label: spec.label, ...spec.model ? { model: spec.model } : {}, ...spec.thinking ? { thinking: spec.thinking } : {}, ...spec.backend ? { backend: spec.backend } : {}, ...spec.cwd ? { cwd: spec.cwd } : {} } }; } /** Parses generated configured-binding session keys back to channel/account identity. */ function parseConfiguredAcpSessionKey(sessionKey) { const trimmed = sessionKey.trim(); if (!trimmed.startsWith("agent:")) return null; const rest = trimmed.slice(trimmed.indexOf(":") + 1); const nextSeparator = rest.indexOf(":"); if (nextSeparator === -1) return null; const tokens = rest.slice(nextSeparator + 1).split(":"); if (tokens.length !== 5 || tokens[0] !== "acp" || tokens[1] !== "binding") return null; const channel = normalizeOptionalLowercaseString(tokens[2]); if (!channel) return null; return { channel, accountId: normalizeAccountId(tokens[3] ?? "default") }; } function resolveConfiguredAcpBindingSpecFromRecord(record) { if (record.targetKind !== "session") return null; const conversationId = record.conversation.conversationId.trim(); if (!conversationId) return null; const agentId = normalizeOptionalString(record.metadata?.agentId) ?? resolveAgentIdFromSessionKey(record.targetSessionKey); if (!agentId) return null; return { channel: record.conversation.channel, accountId: normalizeAccountId(record.conversation.accountId), conversationId, parentConversationId: normalizeOptionalString(record.conversation.parentConversationId), agentId, acpAgentId: normalizeOptionalString(record.metadata?.acpAgentId), mode: normalizeMode(record.metadata?.mode), model: normalizeOptionalString(record.metadata?.model), thinking: normalizeOptionalString(record.metadata?.thinking), cwd: normalizeOptionalString(record.metadata?.cwd), backend: normalizeOptionalString(record.metadata?.backend), label: normalizeOptionalString(record.metadata?.label) }; } function toResolvedConfiguredAcpBinding(record) { const spec = resolveConfiguredAcpBindingSpecFromRecord(record); if (!spec) return null; return { spec, record }; } //#endregion export { resolveConfiguredAcpBindingSpecFromRecord as a, parseConfiguredAcpSessionKey as i, normalizeBindingConfig as n, toConfiguredAcpBindingRecord as o, normalizeMode as r, toResolvedConfiguredAcpBinding as s, buildConfiguredAcpSessionKey as t };