@agentchatme/openclaw 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -0
- package/LICENSE +21 -0
- package/README.md +233 -0
- package/RUNBOOK.md +134 -0
- package/SECURITY.md +57 -0
- package/dist/configured-state.cjs +12 -0
- package/dist/configured-state.cjs.map +1 -0
- package/dist/configured-state.d.cts +14 -0
- package/dist/configured-state.d.ts +14 -0
- package/dist/configured-state.js +10 -0
- package/dist/configured-state.js.map +1 -0
- package/dist/index.cjs +2412 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +756 -0
- package/dist/index.d.ts +756 -0
- package/dist/index.js +2389 -0
- package/dist/index.js.map +1 -0
- package/dist/setup-entry-CU0vHfyd.d.cts +96 -0
- package/dist/setup-entry-CU0vHfyd.d.ts +96 -0
- package/dist/setup-entry.cjs +920 -0
- package/dist/setup-entry.cjs.map +1 -0
- package/dist/setup-entry.d.cts +3 -0
- package/dist/setup-entry.d.ts +3 -0
- package/dist/setup-entry.js +914 -0
- package/dist/setup-entry.js.map +1 -0
- package/openclaw.plugin.json +187 -0
- package/package.json +129 -0
- package/skills/agentchat/SKILL.md +142 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config-schema.ts","../src/setup-client.ts","../src/setup-wizard.ts","../src/channel.ts","../src/channel.setup.ts"],"names":["z","MIN_API_KEY_LENGTH","readAccountRaw","buildChannelConfigSchema","defineChannelPluginEntry","defineSetupPluginEntry"],"mappings":"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","file":"setup-entry.cjs","sourcesContent":["/**\r\n * Zod schema for AgentChat channel config.\r\n *\r\n * Source of truth: this file. The JSON Schema inlined in `openclaw.plugin.json`\r\n * MUST stay in sync (P1 adds a build step that emits it via zod-to-json-schema).\r\n *\r\n * `.strict()` rejects unknown keys — a common source of \"the config silently\r\n * ignored my setting\" bugs.\r\n */\r\n\r\nimport { z } from 'zod'\r\n\r\nexport const reconnectConfigSchema = z\r\n .object({\r\n initialBackoffMs: z.number().int().min(100).max(10_000).default(1_000),\r\n maxBackoffMs: z.number().int().min(1_000).max(300_000).default(30_000),\r\n jitterRatio: z.number().min(0).max(1).default(0.2),\r\n })\r\n .strict()\r\n\r\nexport const pingConfigSchema = z\r\n .object({\r\n intervalMs: z.number().int().min(5_000).max(120_000).default(30_000),\r\n timeoutMs: z.number().int().min(1_000).max(30_000).default(10_000),\r\n })\r\n .strict()\r\n\r\nexport const outboundConfigSchema = z\r\n .object({\r\n maxInFlight: z.number().int().min(1).max(10_000).default(256),\r\n sendTimeoutMs: z.number().int().min(1_000).max(60_000).default(15_000),\r\n })\r\n .strict()\r\n\r\nexport const observabilityConfigSchema = z\r\n .object({\r\n logLevel: z.enum(['trace', 'debug', 'info', 'warn', 'error']).default('info'),\r\n redactKeys: z\r\n .array(z.string())\r\n .default(['apiKey', 'authorization', 'cookie', 'set-cookie']),\r\n })\r\n .strict()\r\n\r\nexport const agentHandleSchema = z\r\n .string()\r\n .regex(/^[a-z0-9_.-]{3,32}$/, 'handle must be 3-32 chars, lowercase alphanumeric + . _ -')\r\n\r\nexport const agentchatChannelConfigSchema = z\r\n .object({\r\n apiBase: z.string().url().default('https://api.agentchat.me'),\r\n apiKey: z.string().min(20, 'apiKey looks too short for an AgentChat API key'),\r\n agentHandle: agentHandleSchema.optional(),\r\n // `.prefault({})` — Zod 4 idiom: when the key is missing from input, parse\r\n // `{}` through the inner schema so its own per-field defaults kick in.\r\n // Using `.default({})` here fails in Zod 4 because the output type's fields\r\n // are non-optional once the inner schema has defaults.\r\n reconnect: reconnectConfigSchema.prefault({}),\r\n ping: pingConfigSchema.prefault({}),\r\n outbound: outboundConfigSchema.prefault({}),\r\n observability: observabilityConfigSchema.prefault({}),\r\n })\r\n .strict()\r\n\r\nexport type AgentchatChannelConfig = z.infer<typeof agentchatChannelConfigSchema>\r\nexport type AgentchatChannelConfigInput = z.input<typeof agentchatChannelConfigSchema>\r\n\r\n/**\r\n * Parse + validate config at plugin startup.\r\n *\r\n * Fails fast on invalid config rather than waiting until the first request.\r\n * The `AgentChatChannelError` wrapper makes validation failures classifiable\r\n * by the gateway's error handler (`terminal-user` — operator fix required).\r\n */\r\nexport function parseChannelConfig(input: unknown): AgentchatChannelConfig {\r\n return agentchatChannelConfigSchema.parse(input)\r\n}\r\n","/**\r\n * Minimal HTTP client used by the setup plugin (P7) to:\r\n * - verify an API key is live before finalizing setup (`validateApiKey`)\r\n * - drive the email-OTP self-registration flow for agents without a key yet\r\n * (`registerAgentStart` → `registerAgentVerify`)\r\n *\r\n * Why this lives separately from `outbound.ts`:\r\n * - `outbound.ts` is the hot-path message sender. It wants retries, a circuit\r\n * breaker, metrics, and a long-lived `fetch`. Setup is one-shot, low-rate,\r\n * user-interactive — a 200ms validation call doesn't need any of that.\r\n * - Setup runs before the runtime exists; coupling it to `OutboundAdapter`\r\n * (which expects a parsed `AgentchatChannelConfig`) would force an odd\r\n * partial-config path during registration.\r\n *\r\n * The server endpoints this module targets are stable AgentChat REST calls:\r\n * - `GET /v1/agents/me` → 200 OK when the key authenticates\r\n * - `POST /v1/register` → 200 with `{ pending_id }`\r\n * - `POST /v1/register/verify` → 201 with `{ agent, api_key }` on success\r\n *\r\n * All methods return strongly-typed result unions — setup UIs can `switch` on\r\n * the discriminant without guessing at HTTP status codes.\r\n */\r\n\r\nimport { AgentChatChannelError } from './errors.js'\r\n\r\nconst DEFAULT_API_BASE = 'https://api.agentchat.me'\r\nconst DEFAULT_TIMEOUT_MS = 10_000\r\n\r\n/** Subset of the AgentChat agent row the setup surface needs to show the user. */\r\nexport interface AgentchatAgentIdentity {\r\n readonly handle: string\r\n readonly displayName: string | null\r\n readonly email: string\r\n readonly createdAt: string\r\n}\r\n\r\nexport type ValidateApiKeyResult =\r\n | { readonly ok: true; readonly agent: AgentchatAgentIdentity }\r\n | {\r\n readonly ok: false\r\n /** High-level reason code the UI can map to a localized message. */\r\n readonly reason:\r\n | 'unauthorized'\r\n | 'forbidden'\r\n | 'deleted'\r\n | 'network-error'\r\n | 'unreachable'\r\n | 'server-error'\r\n | 'unexpected-shape'\r\n readonly message: string\r\n readonly status?: number\r\n }\r\n\r\nexport interface ValidateApiKeyOptions {\r\n readonly apiBase?: string\r\n readonly fetch?: typeof fetch\r\n readonly timeoutMs?: number\r\n}\r\n\r\n/**\r\n * Probe the API key against `GET /v1/agents/me`. Returns a discriminated\r\n * result — never throws on HTTP or network errors. The caller decides how\r\n * to surface each failure mode to the user.\r\n */\r\nexport async function validateApiKey(\r\n apiKey: string,\r\n opts: ValidateApiKeyOptions = {},\r\n): Promise<ValidateApiKeyResult> {\r\n if (!apiKey || typeof apiKey !== 'string') {\r\n return { ok: false, reason: 'unauthorized', message: 'API key is empty' }\r\n }\r\n const base = (opts.apiBase ?? DEFAULT_API_BASE).replace(/\\/+$/, '')\r\n const url = `${base}/v1/agents/me`\r\n const controller = new AbortController()\r\n const fetchImpl = opts.fetch ?? fetch\r\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS\r\n const timer = setTimeout(() => controller.abort(), timeoutMs)\r\n\r\n let res: Response\r\n try {\r\n res = await fetchImpl(url, {\r\n method: 'GET',\r\n headers: {\r\n Authorization: `Bearer ${apiKey}`,\r\n Accept: 'application/json',\r\n },\r\n signal: controller.signal,\r\n })\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err)\r\n const unreachable =\r\n err instanceof Error &&\r\n (err.name === 'AbortError' || /ECONN|ETIMEDOUT|ENOTFOUND|EAI_AGAIN/i.test(message))\r\n return {\r\n ok: false,\r\n reason: unreachable ? 'unreachable' : 'network-error',\r\n message: `agentchat: GET /v1/agents/me failed: ${message}`,\r\n }\r\n } finally {\r\n clearTimeout(timer)\r\n }\r\n\r\n if (res.status === 401) {\r\n return { ok: false, reason: 'unauthorized', status: 401, message: 'API key is invalid or revoked' }\r\n }\r\n if (res.status === 403) {\r\n return { ok: false, reason: 'forbidden', status: 403, message: 'API key lacks permission to read /agents/me' }\r\n }\r\n if (res.status === 410) {\r\n return { ok: false, reason: 'deleted', status: 410, message: 'Agent account has been deleted' }\r\n }\r\n if (res.status >= 500) {\r\n return { ok: false, reason: 'server-error', status: res.status, message: `AgentChat API returned ${res.status}` }\r\n }\r\n if (!res.ok) {\r\n return {\r\n ok: false,\r\n reason: 'server-error',\r\n status: res.status,\r\n message: `AgentChat API returned ${res.status}`,\r\n }\r\n }\r\n\r\n const body = (await res.json().catch(() => null)) as {\r\n handle?: unknown\r\n display_name?: unknown\r\n email?: unknown\r\n email_masked?: unknown\r\n created_at?: unknown\r\n } | null\r\n // The live `GET /v1/agents/me` endpoint masks PII: it returns\r\n // `email_masked` (e.g. `a****@agentchat.local`), never the real `email`.\r\n // Accept either so tests that stub an unmasked body still pass, but the\r\n // caller should expect a masked value in production.\r\n const email =\r\n typeof body?.email === 'string'\r\n ? body.email\r\n : typeof body?.email_masked === 'string'\r\n ? body.email_masked\r\n : null\r\n if (!body || typeof body.handle !== 'string' || email === null || typeof body.created_at !== 'string') {\r\n return {\r\n ok: false,\r\n reason: 'unexpected-shape',\r\n status: res.status,\r\n message: 'AgentChat /agents/me returned an unrecognized shape',\r\n }\r\n }\r\n return {\r\n ok: true,\r\n agent: {\r\n handle: body.handle,\r\n displayName: typeof body.display_name === 'string' ? body.display_name : null,\r\n email,\r\n createdAt: body.created_at,\r\n },\r\n }\r\n}\r\n\r\n// ─── Self-registration (email + OTP) ───────────────────────────────────\r\n\r\nexport interface RegisterAgentStartInput {\r\n readonly email: string\r\n readonly handle: string\r\n readonly displayName?: string\r\n readonly description?: string\r\n}\r\n\r\nexport type RegisterStartResult =\r\n | { readonly ok: true; readonly pendingId: string }\r\n | {\r\n readonly ok: false\r\n readonly reason:\r\n | 'invalid-handle'\r\n | 'handle-taken'\r\n | 'email-taken'\r\n | 'email-is-owner'\r\n | 'email-exhausted'\r\n | 'rate-limited'\r\n | 'otp-failed'\r\n | 'network-error'\r\n | 'server-error'\r\n | 'validation'\r\n readonly message: string\r\n readonly status?: number\r\n readonly retryAfterSeconds?: number\r\n }\r\n\r\nexport interface RegisterAgentVerifyInput {\r\n readonly pendingId: string\r\n readonly code: string\r\n}\r\n\r\nexport type RegisterVerifyResult =\r\n | {\r\n readonly ok: true\r\n readonly apiKey: string\r\n readonly agent: AgentchatAgentIdentity\r\n }\r\n | {\r\n readonly ok: false\r\n readonly reason:\r\n | 'expired'\r\n | 'invalid-code'\r\n | 'rate-limited'\r\n | 'handle-taken'\r\n | 'email-taken'\r\n | 'email-is-owner'\r\n | 'network-error'\r\n | 'server-error'\r\n | 'unexpected-shape'\r\n | 'validation'\r\n readonly message: string\r\n readonly status?: number\r\n readonly retryAfterSeconds?: number\r\n }\r\n\r\nexport interface RegisterOptions {\r\n readonly apiBase?: string\r\n readonly fetch?: typeof fetch\r\n readonly timeoutMs?: number\r\n}\r\n\r\n/**\r\n * Kick off an email-OTP registration. Server caches the intent under a\r\n * `pending_id` for 10 minutes and emails a 6-digit code to `email`.\r\n */\r\nexport async function registerAgentStart(\r\n input: RegisterAgentStartInput,\r\n opts: RegisterOptions = {},\r\n): Promise<RegisterStartResult> {\r\n const res = await post('/v1/register', input, opts)\r\n if (res.kind === 'network') {\r\n return { ok: false, reason: 'network-error', message: res.message }\r\n }\r\n if (res.kind === 'timeout') {\r\n return { ok: false, reason: 'network-error', message: 'request timed out' }\r\n }\r\n\r\n const body = (res.body as { pending_id?: unknown; code?: unknown; message?: unknown }) ?? {}\r\n\r\n if (res.status === 200) {\r\n if (typeof body.pending_id !== 'string') {\r\n return {\r\n ok: false,\r\n reason: 'server-error',\r\n status: 200,\r\n message: 'AgentChat /register returned no pending_id',\r\n }\r\n }\r\n return { ok: true, pendingId: body.pending_id }\r\n }\r\n\r\n const code = typeof body.code === 'string' ? body.code : ''\r\n const message = typeof body.message === 'string' ? body.message : `status ${res.status}`\r\n\r\n if (res.status === 400 && code === 'INVALID_HANDLE') return { ok: false, reason: 'invalid-handle', message, status: 400 }\r\n if (res.status === 400 && code === 'VALIDATION_ERROR') return { ok: false, reason: 'validation', message, status: 400 }\r\n if (res.status === 409 && code === 'HANDLE_TAKEN') return { ok: false, reason: 'handle-taken', message, status: 409 }\r\n if (res.status === 409 && code === 'EMAIL_TAKEN') return { ok: false, reason: 'email-taken', message, status: 409 }\r\n if (res.status === 409 && code === 'EMAIL_IS_OWNER') return { ok: false, reason: 'email-is-owner', message, status: 409 }\r\n if (res.status === 409 && code === 'EMAIL_EXHAUSTED') return { ok: false, reason: 'email-exhausted', message, status: 409 }\r\n if (res.status === 429) {\r\n return {\r\n ok: false,\r\n reason: 'rate-limited',\r\n message,\r\n status: 429,\r\n retryAfterSeconds: res.retryAfterSeconds,\r\n }\r\n }\r\n if (res.status >= 500 || code === 'OTP_FAILED') return { ok: false, reason: 'otp-failed', message, status: res.status }\r\n return { ok: false, reason: 'server-error', status: res.status, message }\r\n}\r\n\r\n/** Verify the OTP the user received by email and mint the API key. */\r\nexport async function registerAgentVerify(\r\n input: RegisterAgentVerifyInput,\r\n opts: RegisterOptions = {},\r\n): Promise<RegisterVerifyResult> {\r\n const res = await post('/v1/register/verify', { pending_id: input.pendingId, code: input.code }, opts)\r\n if (res.kind === 'network') return { ok: false, reason: 'network-error', message: res.message }\r\n if (res.kind === 'timeout') return { ok: false, reason: 'network-error', message: 'request timed out' }\r\n\r\n const body = (res.body ?? {}) as {\r\n code?: unknown\r\n message?: unknown\r\n agent?: { handle?: unknown; display_name?: unknown; email?: unknown; created_at?: unknown }\r\n api_key?: unknown\r\n }\r\n\r\n if (res.status === 201) {\r\n const agent = body.agent\r\n if (\r\n typeof body.api_key !== 'string' ||\r\n !agent ||\r\n typeof agent.handle !== 'string' ||\r\n typeof agent.email !== 'string' ||\r\n typeof agent.created_at !== 'string'\r\n ) {\r\n return {\r\n ok: false,\r\n reason: 'unexpected-shape',\r\n status: 201,\r\n message: 'AgentChat /register/verify returned an unrecognized shape',\r\n }\r\n }\r\n return {\r\n ok: true,\r\n apiKey: body.api_key,\r\n agent: {\r\n handle: agent.handle,\r\n displayName: typeof agent.display_name === 'string' ? agent.display_name : null,\r\n email: agent.email,\r\n createdAt: agent.created_at,\r\n },\r\n }\r\n }\r\n\r\n const code = typeof body.code === 'string' ? body.code : ''\r\n const message = typeof body.message === 'string' ? body.message : `status ${res.status}`\r\n\r\n if (res.status === 400 && code === 'EXPIRED') return { ok: false, reason: 'expired', message, status: 400 }\r\n if (res.status === 400 && code === 'INVALID_CODE') return { ok: false, reason: 'invalid-code', message, status: 400 }\r\n if (res.status === 400 && code === 'VALIDATION_ERROR') return { ok: false, reason: 'validation', message, status: 400 }\r\n if (res.status === 409 && code === 'HANDLE_TAKEN') return { ok: false, reason: 'handle-taken', message, status: 409 }\r\n if (res.status === 409 && code === 'EMAIL_TAKEN') return { ok: false, reason: 'email-taken', message, status: 409 }\r\n if (res.status === 409 && code === 'EMAIL_IS_OWNER') return { ok: false, reason: 'email-is-owner', message, status: 409 }\r\n if (res.status === 429) {\r\n return { ok: false, reason: 'rate-limited', message, status: 429, retryAfterSeconds: res.retryAfterSeconds }\r\n }\r\n return { ok: false, reason: 'server-error', status: res.status, message }\r\n}\r\n\r\n// ─── Internals ─────────────────────────────────────────────────────────\r\n\r\ntype PostOutcome =\r\n | { kind: 'http'; status: number; body: unknown; retryAfterSeconds?: number }\r\n | { kind: 'network'; message: string }\r\n | { kind: 'timeout' }\r\n\r\nasync function post(path: string, body: unknown, opts: RegisterOptions): Promise<PostOutcome> {\r\n const base = (opts.apiBase ?? DEFAULT_API_BASE).replace(/\\/+$/, '')\r\n const url = `${base}${path}`\r\n const controller = new AbortController()\r\n const fetchImpl = opts.fetch ?? fetch\r\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS\r\n const timer = setTimeout(() => controller.abort(), timeoutMs)\r\n try {\r\n const res = await fetchImpl(url, {\r\n method: 'POST',\r\n headers: { 'content-type': 'application/json', accept: 'application/json' },\r\n body: JSON.stringify(body),\r\n signal: controller.signal,\r\n })\r\n const parsed = await res.json().catch(() => null)\r\n const retryAfterHeader = res.headers.get('retry-after')\r\n const retryAfterSeconds = retryAfterHeader ? Number(retryAfterHeader) : undefined\r\n return {\r\n kind: 'http',\r\n status: res.status,\r\n body: parsed,\r\n retryAfterSeconds: Number.isFinite(retryAfterSeconds) ? retryAfterSeconds : undefined,\r\n }\r\n } catch (err) {\r\n if (err instanceof Error && err.name === 'AbortError') return { kind: 'timeout' }\r\n return { kind: 'network', message: err instanceof Error ? err.message : String(err) }\r\n } finally {\r\n clearTimeout(timer)\r\n }\r\n}\r\n\r\n/**\r\n * Throw-flavored wrapper used by callers that prefer exception control flow\r\n * (the setup plugin's `afterAccountConfigWritten` hook). Converts a failure\r\n * result into an `AgentChatChannelError` with an appropriate class.\r\n */\r\nexport async function assertApiKeyValid(\r\n apiKey: string,\r\n opts: ValidateApiKeyOptions = {},\r\n): Promise<AgentchatAgentIdentity> {\r\n const result = await validateApiKey(apiKey, opts)\r\n if (result.ok) return result.agent\r\n const class_ =\r\n result.reason === 'unauthorized' || result.reason === 'forbidden' || result.reason === 'deleted'\r\n ? 'terminal-auth'\r\n : result.reason === 'server-error'\r\n ? 'retry-transient'\r\n : 'retry-transient'\r\n throw new AgentChatChannelError(class_, `${result.message} [reason=${result.reason}]`, {\r\n statusCode: result.status,\r\n })\r\n}\r\n","/**\n * Interactive setup wizard for the AgentChat channel.\n *\n * Invoked by `openclaw channels add --channel agentchat`. Drives three branches:\n *\n * - edit — existing config → re-validate OR rotate OR change API base\n * - have-key — user pastes an existing ac_live_* key → /agents/me probe → write\n * - register — email + handle + description → /register + OTP → /register/verify\n *\n * All branches converge on `writeAccountPatch` which mutates\n * `channels.agentchat.<accountId>` in either flat or multi-account form.\n *\n * Every server-side failure mode surfaces as actionable copy — there are no\n * silent failures. The wizard only returns when the user has either finished\n * or explicitly chosen to abort.\n */\n\nimport type { ChannelSetupWizard } from 'openclaw/plugin-sdk/channel-setup'\nimport type { OpenClawConfig } from 'openclaw/plugin-sdk/channel-core'\n\nimport { AGENTCHAT_CHANNEL_ID, AGENTCHAT_DEFAULT_ACCOUNT_ID } from './channel.js'\nimport {\n registerAgentStart,\n registerAgentVerify,\n validateApiKey,\n type RegisterStartResult,\n type RegisterVerifyResult,\n} from './setup-client.js'\n\n// WizardPrompter is not exported by name from any public subpath; we borrow\n// it off the finalize parameter shape, same idiom first-party extensions use.\ntype WizardPrompter = Parameters<NonNullable<ChannelSetupWizard['finalize']>>[0]['prompter']\n\nconst HANDLE_PATTERN = /^[a-z0-9_.-]{3,32}$/\nconst MIN_API_KEY_LENGTH = 20\nconst OTP_ATTEMPTS = 3\n\ntype FlowKind = 'edit' | 'new'\n\n// ─── Config read / write helpers ────────────────────────────────────────\n\nfunction readSection(cfg: OpenClawConfig): Record<string, unknown> | undefined {\n const channels = (cfg as { channels?: Record<string, unknown> } | undefined)?.channels\n const sec = channels?.[AGENTCHAT_CHANNEL_ID]\n return sec && typeof sec === 'object' && !Array.isArray(sec)\n ? (sec as Record<string, unknown>)\n : undefined\n}\n\nfunction readAccountRaw(\n cfg: OpenClawConfig,\n accountId: string,\n): Record<string, unknown> | undefined {\n const sec = readSection(cfg)\n if (!sec) return undefined\n const accounts = (sec as { accounts?: Record<string, unknown> }).accounts\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const entry = (accounts as Record<string, unknown>)[accountId]\n if (entry && typeof entry === 'object') return entry as Record<string, unknown>\n }\n if (accountId === AGENTCHAT_DEFAULT_ACCOUNT_ID) {\n const { accounts: _accounts, ...rest } = sec as Record<string, unknown>\n void _accounts\n return rest\n }\n return undefined\n}\n\nfunction readAccountApiKey(cfg: OpenClawConfig, accountId: string): string | undefined {\n const raw = readAccountRaw(cfg, accountId)\n const value = raw?.apiKey\n return typeof value === 'string' && value.length >= MIN_API_KEY_LENGTH ? value : undefined\n}\n\nfunction readAccountApiBase(cfg: OpenClawConfig, accountId: string): string | undefined {\n const raw = readAccountRaw(cfg, accountId)\n const value = raw?.apiBase\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction writeAccountPatch(\n cfg: OpenClawConfig,\n accountId: string,\n patch: { apiKey?: string; apiBase?: string; agentHandle?: string },\n): OpenClawConfig {\n const channels = {\n ...((cfg as { channels?: Record<string, unknown> } | undefined)?.channels ?? {}),\n }\n const existing = channels[AGENTCHAT_CHANNEL_ID]\n const section =\n existing && typeof existing === 'object' && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : ({} as Record<string, unknown>)\n\n const clean: Record<string, unknown> = {}\n if (patch.apiKey !== undefined) clean.apiKey = patch.apiKey\n if (patch.apiBase !== undefined) clean.apiBase = patch.apiBase\n if (patch.agentHandle !== undefined) clean.agentHandle = patch.agentHandle\n\n const hasAccountsMap =\n typeof section.accounts === 'object' &&\n section.accounts !== null &&\n !Array.isArray(section.accounts)\n if (accountId === AGENTCHAT_DEFAULT_ACCOUNT_ID && !hasAccountsMap) {\n Object.assign(section, clean)\n } else {\n const accounts = {\n ...((section.accounts as Record<string, unknown> | undefined) ?? {}),\n }\n const prev =\n typeof accounts[accountId] === 'object' && accounts[accountId] !== null\n ? (accounts[accountId] as Record<string, unknown>)\n : {}\n accounts[accountId] = { ...prev, ...clean }\n section.accounts = accounts\n }\n\n channels[AGENTCHAT_CHANNEL_ID] = section\n return { ...cfg, channels } as OpenClawConfig\n}\n\nfunction isAccountConfigured(cfg: OpenClawConfig, accountId: string | undefined): boolean {\n return Boolean(readAccountApiKey(cfg, accountId ?? AGENTCHAT_DEFAULT_ACCOUNT_ID))\n}\n\n// ─── Prompt primitives ──────────────────────────────────────────────────\n\nasync function promptApiKey(prompter: WizardPrompter): Promise<string> {\n const value = await prompter.text({\n message: 'Paste your AgentChat API key',\n placeholder: 'ac_live_...',\n validate: (v) => {\n const trimmed = v.trim()\n if (!trimmed) return 'API key is required'\n if (trimmed.length < MIN_API_KEY_LENGTH)\n return `Looks too short (${trimmed.length} chars — expect ≥${MIN_API_KEY_LENGTH})`\n return undefined\n },\n })\n return value.trim()\n}\n\nasync function promptEmail(prompter: WizardPrompter): Promise<string> {\n const value = await prompter.text({\n message: 'Your email address (for OTP verification)',\n placeholder: 'you@example.com',\n validate: (v) => {\n const trimmed = v.trim()\n if (!trimmed) return 'Email is required'\n if (!/.+@.+\\..+/.test(trimmed)) return 'Not a valid email address'\n return undefined\n },\n })\n return value.trim()\n}\n\nasync function promptHandle(prompter: WizardPrompter, initial?: string): Promise<string> {\n const value = await prompter.text({\n message: 'Pick a handle for your agent',\n placeholder: 'alice',\n initialValue: initial,\n validate: (v) => {\n const trimmed = v.trim().toLowerCase()\n if (!trimmed) return 'Handle is required'\n if (!HANDLE_PATTERN.test(trimmed))\n return '3–32 chars; lowercase a-z / 0-9 / dot / underscore / dash'\n return undefined\n },\n })\n return value.trim().toLowerCase()\n}\n\nasync function promptOtp(prompter: WizardPrompter): Promise<string> {\n const value = await prompter.text({\n message: 'Enter the 6-digit code we emailed you',\n placeholder: '123456',\n validate: (v) => (/^\\d{6}$/.test(v.trim()) ? undefined : '6-digit numeric code required'),\n })\n return value.trim()\n}\n\nasync function promptOptionalText(\n prompter: WizardPrompter,\n message: string,\n placeholder: string,\n): Promise<string> {\n const value = await prompter.text({\n message,\n placeholder,\n validate: () => undefined,\n })\n return value.trim()\n}\n\n// ─── Failure-copy helpers ───────────────────────────────────────────────\n\nfunction describeRegisterStartFailure(r: Extract<RegisterStartResult, { ok: false }>): string {\n switch (r.reason) {\n case 'invalid-handle':\n return 'That handle is not valid. Use 3–32 chars, lowercase a-z / 0-9 / . _ -.'\n case 'handle-taken':\n return 'That handle is already taken. Pick another.'\n case 'email-taken':\n return 'That email already has an agent. Sign in with the existing key instead, or use a different email.'\n case 'email-is-owner':\n return 'That email is reserved. Use a different address.'\n case 'email-exhausted':\n return 'This email has hit the per-address agent limit. Use a different email or delete an old agent.'\n case 'rate-limited':\n return r.retryAfterSeconds\n ? `Too many attempts. Try again in ${r.retryAfterSeconds}s.`\n : 'Too many attempts. Try again in a few minutes.'\n case 'otp-failed':\n return 'Could not send the verification email. Check the address and retry.'\n case 'network-error':\n return `Network error: ${r.message}`\n case 'validation':\n return `Validation error: ${r.message}`\n case 'server-error':\n return `AgentChat API error (${r.status ?? '??'}): ${r.message}`\n }\n}\n\nfunction describeRegisterVerifyFailure(r: Extract<RegisterVerifyResult, { ok: false }>): string {\n switch (r.reason) {\n case 'expired':\n return \"That code has expired. We'll request a new one — restart registration.\"\n case 'invalid-code':\n return 'Wrong code. Check the email and try again.'\n case 'rate-limited':\n return r.retryAfterSeconds\n ? `Too many attempts. Wait ${r.retryAfterSeconds}s before retrying.`\n : 'Too many attempts. Try again in a few minutes.'\n case 'handle-taken':\n return 'Someone else just took that handle. Restart and pick another.'\n case 'email-taken':\n return 'That email was registered by someone else between these steps. Start over.'\n case 'email-is-owner':\n return 'That email is reserved.'\n case 'network-error':\n return `Network error: ${r.message}`\n case 'unexpected-shape':\n return `Server returned an unexpected response (${r.status ?? '??'}). Try again shortly.`\n case 'validation':\n return `Validation error: ${r.message}`\n case 'server-error':\n return `AgentChat API error (${r.status ?? '??'}): ${r.message}`\n }\n}\n\n// ─── Sub-flows ──────────────────────────────────────────────────────────\n\nasync function runHaveKeyFlow(\n cfg: OpenClawConfig,\n accountId: string,\n prompter: WizardPrompter,\n apiBase: string | undefined,\n): Promise<{ cfg: OpenClawConfig }> {\n const apiKey = await promptApiKey(prompter)\n const progress = prompter.progress('Validating key against AgentChat…')\n const result = await validateApiKey(apiKey, { apiBase })\n if (!result.ok) {\n progress.stop('Key rejected.')\n await prompter.note(\n [\n `AgentChat rejected the key (${result.reason}):`,\n ` ${result.message}`,\n '',\n result.reason === 'unauthorized' || result.reason === 'deleted'\n ? 'The key is invalid, revoked, or the agent was deleted. Grab a fresh key from agentchat.me/dashboard.'\n : result.reason === 'unreachable' || result.reason === 'network-error'\n ? 'Could not reach the API. Check your network, then run setup again.'\n : 'Try again, or pick the register flow.',\n ].join('\\n'),\n 'Validation failed',\n )\n return runNewAccountFlow(cfg, accountId, prompter, apiBase)\n }\n progress.stop(`Authenticated as @${result.agent.handle}.`)\n const next = writeAccountPatch(cfg, accountId, {\n apiKey,\n agentHandle: result.agent.handle,\n ...(apiBase ? { apiBase } : {}),\n })\n await prompter.note(\n [\n `Connected to AgentChat as @${result.agent.handle}.`,\n `Email: ${result.agent.email}`,\n result.agent.displayName ? `Display name: ${result.agent.displayName}` : undefined,\n ]\n .filter((v): v is string => Boolean(v))\n .join('\\n'),\n 'AgentChat configured',\n )\n return { cfg: next }\n}\n\nasync function runRegisterFlow(\n cfg: OpenClawConfig,\n accountId: string,\n prompter: WizardPrompter,\n apiBase: string | undefined,\n): Promise<{ cfg: OpenClawConfig }> {\n await prompter.note(\n [\n 'We will email a 6-digit code to verify ownership of this address.',\n 'The email is hashed server-side and used only for account recovery.',\n ].join('\\n'),\n 'New-agent registration',\n )\n const email = await promptEmail(prompter)\n const handle = await promptHandle(prompter)\n const displayName = await promptOptionalText(\n prompter,\n 'Display name (optional, press Enter to skip)',\n handle,\n )\n const description = await promptOptionalText(\n prompter,\n 'Short description of your agent (optional)',\n 'Research assistant that summarises papers',\n )\n\n const startProgress = prompter.progress('Requesting OTP…')\n const start = await registerAgentStart(\n {\n email,\n handle,\n displayName: displayName || undefined,\n description: description || undefined,\n },\n { apiBase },\n )\n if (!start.ok) {\n startProgress.stop('Registration could not start.')\n await prompter.note(describeRegisterStartFailure(start), 'Registration failed')\n const retry = await prompter.confirm({\n message:\n start.reason === 'handle-taken' || start.reason === 'invalid-handle'\n ? 'Try a different handle?'\n : 'Try again?',\n initialValue: true,\n })\n if (!retry) return { cfg }\n return runRegisterFlow(cfg, accountId, prompter, apiBase)\n }\n startProgress.stop(`OTP sent to ${email}.`)\n\n const pendingId = start.pendingId\n for (let attempt = 1; attempt <= OTP_ATTEMPTS; attempt += 1) {\n const code = await promptOtp(prompter)\n const verifyProgress = prompter.progress('Verifying code…')\n const verify = await registerAgentVerify({ pendingId, code }, { apiBase })\n if (verify.ok) {\n verifyProgress.stop(`Verified. Agent @${verify.agent.handle} created.`)\n const next = writeAccountPatch(cfg, accountId, {\n apiKey: verify.apiKey,\n agentHandle: verify.agent.handle,\n ...(apiBase ? { apiBase } : {}),\n })\n await prompter.note(\n [\n 'Your AgentChat API key has been written to config.',\n '',\n ` handle: @${verify.agent.handle}`,\n ` email: ${verify.agent.email}`,\n '',\n 'Keep the key safe — it authenticates sends as this agent.',\n 'You can rotate it any time from agentchat.me/dashboard.',\n ].join('\\n'),\n 'Registration complete',\n )\n return { cfg: next }\n }\n verifyProgress.stop(`Attempt ${attempt}/${OTP_ATTEMPTS} failed (${verify.reason}).`)\n await prompter.note(describeRegisterVerifyFailure(verify), 'Code rejected')\n if (verify.reason === 'expired') {\n return runRegisterFlow(cfg, accountId, prompter, apiBase)\n }\n if (verify.reason !== 'invalid-code') {\n const retry = await prompter.confirm({\n message: 'Start over with different details?',\n initialValue: true,\n })\n if (!retry) return { cfg }\n return runRegisterFlow(cfg, accountId, prompter, apiBase)\n }\n // invalid-code → loop and re-prompt\n }\n await prompter.note(\n 'Too many invalid codes. Restart setup to request a new one.',\n 'Registration aborted',\n )\n return { cfg }\n}\n\nasync function runEditFlow(\n cfg: OpenClawConfig,\n accountId: string,\n prompter: WizardPrompter,\n): Promise<{ cfg: OpenClawConfig }> {\n const currentKey = readAccountApiKey(cfg, accountId)\n const currentBase = readAccountApiBase(cfg, accountId)\n\n const choice = await prompter.select<'validate' | 'rotate' | 'change-base' | 'skip'>({\n message: 'AgentChat is already configured. What would you like to do?',\n options: [\n {\n value: 'validate',\n label: 'Re-validate the current key',\n hint: 'Hit /agents/me to confirm it still authenticates',\n },\n {\n value: 'rotate',\n label: 'Rotate to a new API key',\n hint: 'Paste a freshly generated key or register a new agent',\n },\n {\n value: 'change-base',\n label: 'Change API base URL',\n hint: 'Only for self-hosted AgentChat deployments',\n },\n { value: 'skip', label: 'Leave as is', hint: 'No changes' },\n ],\n initialValue: 'validate',\n })\n\n if (choice === 'skip') return { cfg }\n\n if (choice === 'validate') {\n if (!currentKey) {\n await prompter.note('No API key is currently set.', 'Nothing to validate')\n return runNewAccountFlow(cfg, accountId, prompter, currentBase)\n }\n const progress = prompter.progress('Probing /agents/me…')\n const result = await validateApiKey(currentKey, { apiBase: currentBase })\n if (result.ok) {\n progress.stop(`Still authenticated as @${result.agent.handle}.`)\n return { cfg }\n }\n progress.stop('Key no longer works.')\n await prompter.note(`${result.message} [reason=${result.reason}]`, 'Re-validation failed')\n const doRotate = await prompter.confirm({\n message: 'Rotate to a new key now?',\n initialValue: true,\n })\n if (doRotate) return runNewAccountFlow(cfg, accountId, prompter, currentBase)\n return { cfg }\n }\n\n if (choice === 'rotate') {\n return runNewAccountFlow(cfg, accountId, prompter, currentBase)\n }\n\n // change-base\n const nextBase = await promptOptionalText(\n prompter,\n 'New API base URL (blank to reset to default)',\n currentBase ?? 'https://api.agentchat.me',\n )\n if (nextBase) {\n try {\n const url = new URL(nextBase)\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n await prompter.note('API base must use http:// or https://. Not updated.', 'Ignored')\n return { cfg }\n }\n } catch {\n await prompter.note('Not a valid URL. API base not updated.', 'Ignored')\n return { cfg }\n }\n }\n const next = writeAccountPatch(cfg, accountId, { apiBase: nextBase || undefined })\n await prompter.note(\n nextBase ? `API base set to ${nextBase}` : 'API base reset to default',\n 'Updated',\n )\n return { cfg: next }\n}\n\nasync function runNewAccountFlow(\n cfg: OpenClawConfig,\n accountId: string,\n prompter: WizardPrompter,\n apiBase: string | undefined,\n): Promise<{ cfg: OpenClawConfig }> {\n const choice = await prompter.select<'register' | 'have-key'>({\n message: 'How do you want to connect this agent?',\n options: [\n {\n value: 'register',\n label: 'Register a new agent (email + OTP)',\n hint: 'Mint a fresh API key — ~60 seconds',\n },\n {\n value: 'have-key',\n label: 'I already have an API key',\n hint: 'Paste ac_live_...',\n },\n ],\n initialValue: 'register',\n })\n if (choice === 'have-key') return runHaveKeyFlow(cfg, accountId, prompter, apiBase)\n return runRegisterFlow(cfg, accountId, prompter, apiBase)\n}\n\n// ─── The wizard ─────────────────────────────────────────────────────────\n\nexport const agentchatSetupWizard: ChannelSetupWizard = {\n channel: AGENTCHAT_CHANNEL_ID,\n\n resolveShouldPromptAccountIds: () => false,\n\n status: {\n configuredLabel: 'connected',\n unconfiguredLabel: 'needs API key',\n configuredHint: 'configured',\n unconfiguredHint: 'needs agent credentials',\n configuredScore: 2,\n unconfiguredScore: 0,\n resolveConfigured: ({ cfg, accountId }) => isAccountConfigured(cfg, accountId),\n resolveStatusLines: async ({ cfg, accountId, configured }) => {\n if (!configured) return ['AgentChat: needs API key — run setup to register or paste one']\n const id = accountId ?? AGENTCHAT_DEFAULT_ACCOUNT_ID\n const key = readAccountApiKey(cfg, id)\n const apiBase = readAccountApiBase(cfg, id)\n if (!key) return ['AgentChat: configured (no key visible)']\n try {\n const result = await validateApiKey(key, { apiBase, timeoutMs: 3000 })\n if (result.ok) return [`AgentChat: connected as @${result.agent.handle}`]\n return [`AgentChat: configured (live probe failed: ${result.reason})`]\n } catch {\n return ['AgentChat: configured (live probe unreachable)']\n }\n },\n },\n\n introNote: {\n title: 'AgentChat',\n lines: [\n 'A messaging platform for AI agents — handle-based routing, realtime WebSocket,',\n 'typed error taxonomy, idempotent sends.',\n '',\n 'You can paste an existing API key, or register a new agent inline (email + OTP).',\n ],\n },\n\n prepare: async ({ cfg, accountId, credentialValues }) => {\n const flow: FlowKind = isAccountConfigured(cfg, accountId) ? 'edit' : 'new'\n return { credentialValues: { ...credentialValues, _flow: flow } }\n },\n\n credentials: [],\n\n finalize: async ({ cfg, accountId, prompter, credentialValues }) => {\n const rawFlow = credentialValues._flow\n const flow: FlowKind = rawFlow === 'edit' ? 'edit' : 'new'\n const apiBase = readAccountApiBase(cfg, accountId)\n return flow === 'edit'\n ? await runEditFlow(cfg, accountId, prompter)\n : await runNewAccountFlow(cfg, accountId, prompter, apiBase)\n },\n\n completionNote: {\n title: 'AgentChat is ready',\n lines: [\n 'The channel runtime will auto-connect on the next `openclaw` boot.',\n 'Messages addressed to your handle arrive over WebSocket; sends go out',\n 'over HTTPS with at-least-once + idempotent semantics.',\n ],\n },\n\n disable: (cfg) => {\n const channels = {\n ...((cfg as { channels?: Record<string, unknown> } | undefined)?.channels ?? {}),\n }\n const existing = channels[AGENTCHAT_CHANNEL_ID]\n const section =\n existing && typeof existing === 'object' && !Array.isArray(existing)\n ? { ...(existing as Record<string, unknown>) }\n : ({} as Record<string, unknown>)\n section.enabled = false\n channels[AGENTCHAT_CHANNEL_ID] = section\n return { ...cfg, channels } as OpenClawConfig\n },\n}\n\n// Internal exports for unit tests (`@agentchatme/openclaw/internal/wizard`\n// is not a public export — these are deep-imported from test files only).\nexport const __testables = {\n readAccountApiKey,\n readAccountApiBase,\n writeAccountPatch,\n isAccountConfigured,\n describeRegisterStartFailure,\n describeRegisterVerifyFailure,\n runHaveKeyFlow,\n runRegisterFlow,\n runEditFlow,\n runNewAccountFlow,\n}\n","/**\r\n * AgentChat channel plugin — entry point.\r\n *\r\n * P1 (this file): wires the real OpenClaw SDK contracts — builds a\r\n * `ChannelPlugin<AgentchatResolvedAccount>` with id / meta / capabilities /\r\n * config-adapter / config-schema / setup, and wraps it via\r\n * `defineChannelPluginEntry(...)` for OpenClaw's extension loader.\r\n *\r\n * Config adapter supports both:\r\n * - single-account flat form: `channels.agentchat.{ apiKey, apiBase, ... }`\r\n * - multi-account form: `channels.agentchat.accounts.<id>.{ apiKey, ... }`\r\n *\r\n * Runtime (WS client, inbound normalizer, outbound adapter) arrives in P2+.\r\n *\r\n * Loaded by OpenClaw via `package.json`'s `openclaw.extensions` entry.\r\n */\r\n\r\nimport {\r\n buildChannelConfigSchema,\r\n defineChannelPluginEntry,\r\n type ChannelConfigUiHint,\r\n type ChannelPlugin,\r\n type OpenClawConfig,\r\n} from 'openclaw/plugin-sdk/channel-core'\r\n\r\nimport {\r\n agentchatChannelConfigSchema,\r\n parseChannelConfig,\r\n type AgentchatChannelConfig,\r\n} from './config-schema.js'\r\nimport { validateApiKey } from './setup-client.js'\r\nimport { agentchatSetupWizard } from './setup-wizard.js'\r\n\r\nexport const AGENTCHAT_CHANNEL_ID = 'agentchat' as const\r\nexport const AGENTCHAT_DEFAULT_ACCOUNT_ID = 'default'\r\n\r\nconst MIN_API_KEY_LENGTH = 20\r\n\r\nexport interface AgentchatResolvedAccount {\r\n accountId: string\r\n enabled: boolean\r\n configured: boolean\r\n config: AgentchatChannelConfig | null\r\n parseError: string | null\r\n}\r\n\r\ntype ChannelSectionRaw = Record<string, unknown> & {\r\n accounts?: Record<string, unknown>\r\n enabled?: unknown\r\n apiKey?: unknown\r\n apiBase?: unknown\r\n agentHandle?: unknown\r\n}\r\n\r\nfunction readChannelSection(cfg: OpenClawConfig | undefined): ChannelSectionRaw | undefined {\r\n const channels = (cfg as { channels?: Record<string, unknown> } | undefined)?.channels\r\n const section = channels?.[AGENTCHAT_CHANNEL_ID]\r\n return section && typeof section === 'object' && !Array.isArray(section)\r\n ? (section as ChannelSectionRaw)\r\n : undefined\r\n}\r\n\r\nfunction readAccountRaw(\r\n section: ChannelSectionRaw | undefined,\r\n accountId: string,\r\n): Record<string, unknown> | undefined {\r\n if (!section) return undefined\r\n const { accounts } = section\r\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\r\n const entry = (accounts as Record<string, unknown>)[accountId]\r\n if (entry && typeof entry === 'object') return entry as Record<string, unknown>\r\n }\r\n // Single-account fallback: treat section-level fields as the 'default' account,\r\n // stripping the `accounts` subsection (but preserving `enabled`, which the\r\n // caller extracts before Zod parsing).\r\n if (accountId === AGENTCHAT_DEFAULT_ACCOUNT_ID) {\r\n const { accounts: _accounts, ...rest } = section\r\n void _accounts\r\n return rest as Record<string, unknown>\r\n }\r\n return undefined\r\n}\r\n\r\n/**\r\n * Pulls the `enabled` flag out of a raw account record and returns a copy\r\n * safe to feed into `parseChannelConfig` (which enforces `.strict()` — an\r\n * unknown `enabled` key would otherwise reject).\r\n */\r\nfunction splitEnabledFromRaw(\r\n raw: Record<string, unknown> | undefined,\r\n): { enabled: boolean; forParse: Record<string, unknown> | undefined } {\r\n if (!raw) return { enabled: true, forParse: undefined }\r\n const { enabled, ...rest } = raw\r\n return { enabled: enabled !== false, forParse: rest }\r\n}\r\n\r\nfunction isApiKeyPresent(value: unknown): value is string {\r\n return typeof value === 'string' && value.length >= MIN_API_KEY_LENGTH\r\n}\r\n\r\nconst uiHints: Record<string, ChannelConfigUiHint> = {\r\n apiKey: {\r\n label: 'AgentChat API key',\r\n placeholder: 'ac_live_...',\r\n sensitive: true,\r\n help: 'Obtain from AgentChat dashboard → Settings → API keys.',\r\n },\r\n apiBase: {\r\n label: 'API base URL',\r\n placeholder: 'https://api.agentchat.me',\r\n help: 'Override only when targeting a self-hosted AgentChat instance.',\r\n advanced: true,\r\n },\r\n agentHandle: {\r\n label: 'Agent handle',\r\n placeholder: 'my-agent',\r\n help: '3–32 chars, lowercase alphanumeric plus . _ -',\r\n },\r\n reconnect: { label: 'Reconnect backoff', advanced: true },\r\n ping: { label: 'WebSocket ping cadence', advanced: true },\r\n outbound: { label: 'Outbound send tuning', advanced: true },\r\n observability: { label: 'Logs & metrics', advanced: true },\r\n}\r\n\r\nexport const agentchatPlugin: ChannelPlugin<AgentchatResolvedAccount> = {\r\n id: AGENTCHAT_CHANNEL_ID,\r\n\r\n meta: {\r\n id: AGENTCHAT_CHANNEL_ID,\r\n label: 'AgentChat',\r\n selectionLabel: 'AgentChat (messaging platform for agents)',\r\n detailLabel: 'AgentChat',\r\n docsPath: '/channels/agentchat',\r\n docsLabel: 'agentchat',\r\n blurb:\r\n 'connect your agent to the AgentChat messaging platform — handles, contacts, groups, presence, attachments.',\r\n systemImage: 'message',\r\n markdownCapable: true,\r\n order: 100,\r\n },\r\n\r\n capabilities: {\r\n chatTypes: ['direct', 'group'],\r\n media: true,\r\n reactions: false,\r\n edit: false,\r\n unsend: true,\r\n reply: true,\r\n threads: false,\r\n nativeCommands: false,\r\n },\r\n\r\n reload: {\r\n configPrefixes: [`channels.${AGENTCHAT_CHANNEL_ID}.`],\r\n },\r\n\r\n configSchema: buildChannelConfigSchema(agentchatChannelConfigSchema, { uiHints }),\r\n\r\n setupWizard: agentchatSetupWizard,\r\n\r\n config: {\r\n listAccountIds(cfg) {\r\n const section = readChannelSection(cfg)\r\n if (!section) return []\r\n const { accounts } = section\r\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\r\n const ids = Object.keys(accounts as Record<string, unknown>)\r\n if (ids.length > 0) return ids\r\n }\r\n const hasFlatFields =\r\n typeof section.apiKey === 'string' ||\r\n typeof section.apiBase === 'string' ||\r\n typeof section.agentHandle === 'string'\r\n return hasFlatFields ? [AGENTCHAT_DEFAULT_ACCOUNT_ID] : []\r\n },\r\n\r\n resolveAccount(cfg, accountId) {\r\n const id = accountId ?? AGENTCHAT_DEFAULT_ACCOUNT_ID\r\n const section = readChannelSection(cfg)\r\n const raw = readAccountRaw(section, id)\r\n const { enabled, forParse } = splitEnabledFromRaw(raw)\r\n let config: AgentchatChannelConfig | null = null\r\n let parseError: string | null = null\r\n if (forParse && Object.keys(forParse).length > 0) {\r\n try {\r\n config = parseChannelConfig(forParse)\r\n } catch (e) {\r\n parseError = e instanceof Error ? e.message : String(e)\r\n }\r\n }\r\n const configured = Boolean(config && isApiKeyPresent(config.apiKey))\r\n return { accountId: id, enabled, configured, config, parseError }\r\n },\r\n\r\n defaultAccountId() {\r\n return AGENTCHAT_DEFAULT_ACCOUNT_ID\r\n },\r\n\r\n isEnabled(account) {\r\n return account.enabled\r\n },\r\n\r\n disabledReason(account) {\r\n return account.enabled ? '' : 'channel disabled via channels.agentchat.enabled=false'\r\n },\r\n\r\n isConfigured(account) {\r\n return account.configured\r\n },\r\n\r\n unconfiguredReason(account) {\r\n if (account.parseError) return `config invalid: ${account.parseError}`\r\n if (!account.config) return 'missing channels.agentchat configuration'\r\n if (!isApiKeyPresent(account.config.apiKey)) return 'missing or too-short channels.agentchat.apiKey'\r\n return ''\r\n },\r\n\r\n hasConfiguredState({ cfg }) {\r\n const section = readChannelSection(cfg)\r\n if (!section) return false\r\n const { accounts } = section\r\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\r\n for (const entry of Object.values(accounts as Record<string, unknown>)) {\r\n if (entry && typeof entry === 'object') {\r\n const candidate = (entry as Record<string, unknown>).apiKey\r\n if (isApiKeyPresent(candidate)) return true\r\n }\r\n }\r\n }\r\n return isApiKeyPresent(section.apiKey)\r\n },\r\n\r\n describeAccount(account) {\r\n return {\r\n accountId: account.accountId,\r\n enabled: account.enabled,\r\n configured: account.configured,\r\n linked: account.configured,\r\n }\r\n },\r\n },\r\n\r\n setup: {\r\n /**\r\n * Pre-write gate: cheap, sync check that the caller supplied an API key\r\n * that's at least plausibly shaped. Real authentication happens in\r\n * `afterAccountConfigWritten` via a live /agents/me probe.\r\n */\r\n validateInput({ input }) {\r\n if (typeof input.token !== 'string' || input.token.trim().length === 0) {\r\n return 'apiKey is required — pass via --token or run the register flow'\r\n }\r\n if (input.token.length < MIN_API_KEY_LENGTH) {\r\n return `apiKey looks too short (got ${input.token.length} chars, expect ≥${MIN_API_KEY_LENGTH})`\r\n }\r\n if (typeof input.url === 'string' && input.url.length > 0) {\r\n try {\r\n const parsed = new URL(input.url)\r\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\r\n return 'apiBase must be http(s) — e.g. https://api.agentchat.me'\r\n }\r\n } catch {\r\n return 'apiBase is not a valid URL'\r\n }\r\n }\r\n return null\r\n },\r\n\r\n applyAccountConfig({ cfg, accountId, input }) {\r\n const channels: Record<string, unknown> = {\r\n ...((cfg as { channels?: Record<string, unknown> } | undefined)?.channels ?? {}),\r\n }\r\n const currentSection = channels[AGENTCHAT_CHANNEL_ID]\r\n const section: ChannelSectionRaw =\r\n currentSection && typeof currentSection === 'object' && !Array.isArray(currentSection)\r\n ? { ...(currentSection as ChannelSectionRaw) }\r\n : {}\r\n\r\n const patch: Record<string, unknown> = {}\r\n if (typeof input.token === 'string' && input.token.length > 0) patch.apiKey = input.token\r\n if (typeof input.url === 'string' && input.url.length > 0) patch.apiBase = input.url\r\n\r\n if (accountId === AGENTCHAT_DEFAULT_ACCOUNT_ID && !section.accounts) {\r\n // Flat form for the simple single-account case.\r\n Object.assign(section, patch)\r\n } else {\r\n const accounts: Record<string, unknown> = {\r\n ...((section.accounts as Record<string, unknown> | undefined) ?? {}),\r\n }\r\n const prevAccount =\r\n typeof accounts[accountId] === 'object' && accounts[accountId] !== null\r\n ? (accounts[accountId] as Record<string, unknown>)\r\n : {}\r\n accounts[accountId] = { ...prevAccount, ...patch }\r\n section.accounts = accounts\r\n }\r\n\r\n channels[AGENTCHAT_CHANNEL_ID] = section\r\n return { ...cfg, channels } as OpenClawConfig\r\n },\r\n\r\n /**\r\n * Post-write probe: call `GET /v1/agents/me` with the key we just wrote\r\n * so the operator sees a clear \"✓ authenticated as @handle\" on success\r\n * — or a specific failure reason (invalid, revoked, unreachable) they\r\n * can act on *before* the runtime starts flapping reconnects in prod.\r\n *\r\n * Never throws: setup-time UX is \"warn and proceed\". If the probe can't\r\n * reach the API (airgapped CI, corp proxy during first boot), we still\r\n * want the config written so the user can retry without reconfiguring.\r\n */\r\n async afterAccountConfigWritten({ cfg, accountId, input, runtime }) {\r\n const apiKey = typeof input.token === 'string' ? input.token : undefined\r\n if (!apiKey) return\r\n const apiBase = typeof input.url === 'string' && input.url.length > 0 ? input.url : undefined\r\n void cfg\r\n const logger = (runtime as { logger?: { info?: (...args: unknown[]) => void; warn?: (...args: unknown[]) => void } } | undefined)?.logger\r\n try {\r\n const result = await validateApiKey(apiKey, { apiBase })\r\n if (result.ok) {\r\n logger?.info?.(\r\n `[agentchat:${accountId}] authenticated as @${result.agent.handle} (${result.agent.email})`,\r\n )\r\n } else {\r\n logger?.warn?.(\r\n `[agentchat:${accountId}] api key did not pass live check (${result.reason}): ${result.message}`,\r\n )\r\n }\r\n } catch (err) {\r\n logger?.warn?.(\r\n `[agentchat:${accountId}] live key validation failed: ${err instanceof Error ? err.message : String(err)}`,\r\n )\r\n }\r\n },\r\n },\r\n}\r\n\r\n/**\r\n * Canonical channel-entry descriptor consumed by OpenClaw's extension loader.\r\n * Exported as `default` because `openclaw.extensions` in package.json points to\r\n * this module and the loader reads the default export.\r\n *\r\n * The explicit `ReturnType<...>` annotation pins the emitted `.d.ts` to the\r\n * function signature instead of the structural shape — otherwise the inferred\r\n * type references `ChannelConfigSchema` through a non-exported path and TS\r\n * fails with TS2742 (\"cannot be named without a reference to ...\").\r\n */\r\nexport const agentchatChannelEntry: ReturnType<\r\n typeof defineChannelPluginEntry<typeof agentchatPlugin>\r\n> = defineChannelPluginEntry({\r\n id: AGENTCHAT_CHANNEL_ID,\r\n name: 'AgentChat',\r\n description: 'Connect OpenClaw agents to the AgentChat messaging platform.',\r\n plugin: agentchatPlugin,\r\n})\r\n\r\nexport default agentchatChannelEntry\r\n\r\nexport { parseChannelConfig }\r\nexport type { AgentchatChannelConfig }\r\n","/**\r\n * AgentChat setup plugin — onboarding entry.\r\n *\r\n * P1 (this file): wraps the same `agentchatPlugin` from `channel.ts` with\r\n * `defineSetupPluginEntry(...)`. OpenClaw's setup-entry loader reads the\r\n * `plugin` field, then invokes the plugin's `setup` adapter during\r\n * `openclaw setup` runs.\r\n * P7: real interactive wizard — prompts for API key, validates against\r\n * `GET /v1/agents/me`, or registers a new agent via `POST /v1/agents`.\r\n *\r\n * Loaded by OpenClaw via `package.json`'s `openclaw.setupEntry`.\r\n */\r\n\r\nimport { defineSetupPluginEntry } from 'openclaw/plugin-sdk/channel-core'\r\n\r\nimport { agentchatPlugin } from './channel.js'\r\n\r\nexport const agentchatSetupEntry = defineSetupPluginEntry(agentchatPlugin)\r\n\r\nexport default agentchatSetupEntry\r\n\r\nexport { agentchatPlugin as agentchatSetupPlugin }\r\n"]}
|