UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

146 lines (145 loc) 4.58 kB
import { At as boolean, Et as array, Nn as record, Rn as string, Tn as object, wn as number } from "./schemas-zxit8y5H.js"; import { n as normalizeAccountId, t as DEFAULT_ACCOUNT_ID } from "./account-id-CETVCrTz.js"; import { i as buildChannelConfigSchema } from "./config-schema-C6z2p1z2.js"; import { t as defineChannelSetupContract } from "./setup-contract-RbJSZiOH.js"; import "./channel-setup-Cf-_b9tx.js"; import "./channel-config-schema-DbbRRIEt.js"; //#region extensions/a2a/src/accounts.ts function listA2aChannelAccountIds(cfg) { return cfg.channels?.a2a ? [DEFAULT_ACCOUNT_ID] : []; } function resolveDefaultA2aChannelAccountId() { return DEFAULT_ACCOUNT_ID; } function resolveA2aChannelAccount(params) { const config = params.cfg.channels?.a2a ?? {}; return { accountId: normalizeAccountId(params.accountId), enabled: config.enabled !== false, configured: Object.keys(config.peers ?? {}).length > 0, config }; } //#endregion //#region extensions/a2a/src/config-schema.ts const a2aPeerNamePattern = /^[a-z0-9][a-z0-9._-]{0,63}$/; const a2aHttpUrlSchema = string().url().and(string().regex(/^https?:\/\//, "A2A URLs must use HTTP or HTTPS")); const a2aPeerConfigSchema = object({ token: string().min(1), url: a2aHttpUrlSchema.optional(), outboundToken: string().min(1).optional() }).strict(); const a2aChannelConfigSchema = object({ enabled: boolean().optional(), configWrites: boolean().optional(), advertisedUrl: a2aHttpUrlSchema.optional(), replyTimeoutMs: number().int().min(5e3).max(6e5).optional(), rateLimitPerMinute: number().int().min(0).optional(), exposeAgents: array(string()).optional(), peers: record(string().regex(a2aPeerNamePattern), a2aPeerConfigSchema).optional() }).strict(); const a2aPluginConfigSchema = buildChannelConfigSchema(a2aChannelConfigSchema, { uiHints: { advertisedUrl: { label: "Advertised Gateway URL", help: "Public Gateway origin included in the A2A agent card." }, replyTimeoutMs: { label: "Blocking Reply Timeout (ms)", advanced: true }, rateLimitPerMinute: { label: "Requests Per Peer Per Minute", advanced: true }, exposeAgents: { label: "Exposed Agent IDs" }, "peers.*.token": { label: "Inbound Bearer Token", sensitive: true }, "peers.*.outboundToken": { label: "Outbound Bearer Token", sensitive: true } } }); const a2aChannelRuntimeMeta = { id: "a2a", label: "A2A", selectionLabel: "A2A (Agent-to-Agent Protocol)", docsPath: "/channels/a2a", docsLabel: "a2a", blurb: "Connect external agents through the A2A v1.0 protocol.", order: 75 }; function createA2aChannelPluginBase() { return { id: "a2a", meta: a2aChannelRuntimeMeta, capabilities: { chatTypes: ["direct"] }, reload: { configPrefixes: ["channels.a2a"] }, configSchema: a2aPluginConfigSchema, setupContract: defineChannelSetupContract({ fields: { advertisedUrl: { kind: "string", cli: { flags: "--advertised-url <url>", description: "Public Gateway origin published in the A2A agent card" } }, peerName: { kind: "string", cli: { flags: "--peer-name <name>", description: "A2A peer identifier to authorize" } }, peerToken: { kind: "string", sensitive: true, cli: { flags: "--peer-token <token>", description: "Bearer token for the A2A peer" } } }, adapter: { applyAccountConfig: ({ cfg, input }) => { const setup = input; const current = resolveA2aChannelAccount({ cfg }).config; const peerName = setup.peerName?.trim(); const peerToken = setup.peerToken?.trim(); const advertisedUrl = setup.advertisedUrl?.trim(); return { ...cfg, channels: { ...cfg.channels, a2a: { ...current, enabled: true, ...advertisedUrl ? { advertisedUrl } : {}, ...peerName && peerToken ? { peers: { ...current.peers, [peerName]: { token: peerToken } } } : {} } } }; } } }), config: { listAccountIds: listA2aChannelAccountIds, resolveAccount: (cfg, accountId) => resolveA2aChannelAccount({ cfg, accountId }), defaultAccountId: resolveDefaultA2aChannelAccountId, isConfigured: (account) => account.configured, isEnabled: (account) => account.enabled, resolveAllowFrom: ({ cfg, accountId }) => Object.keys(resolveA2aChannelAccount({ cfg, accountId }).config.peers ?? {}) } }; } //#endregion export { resolveDefaultA2aChannelAccountId as i, listA2aChannelAccountIds as n, resolveA2aChannelAccount as r, createA2aChannelPluginBase as t };