@agentchatme/openclaw 0.2.0 → 0.3.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 +67 -0
- package/dist/configured-state.cjs.map +1 -1
- package/dist/configured-state.js.map +1 -1
- package/dist/index.cjs +544 -475
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +120 -117
- package/dist/index.d.ts +120 -117
- package/dist/index.js +545 -475
- package/dist/index.js.map +1 -1
- package/dist/{setup-entry-CU0vHfyd.d.cts → setup-entry-1vjPD1gu.d.cts} +5 -9
- package/dist/{setup-entry-CU0vHfyd.d.ts → setup-entry-1vjPD1gu.d.ts} +5 -9
- package/dist/setup-entry.cjs +541 -471
- package/dist/setup-entry.cjs.map +1 -1
- package/dist/setup-entry.d.cts +1 -1
- package/dist/setup-entry.d.ts +1 -1
- package/dist/setup-entry.js +541 -471
- package/dist/setup-entry.js.map +1 -1
- package/openclaw.plugin.json +5 -3
- package/package.json +128 -129
- package/skills/agentchat/SKILL.md +128 -100
package/dist/setup-entry.cjs.map
CHANGED
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../src/channel-account.ts","../src/setup-client.ts","../src/channel.wizard.ts","../src/config-schema.ts","../src/channel.ts","../src/channel.setup.ts"],"names":["patched","WizardCancelledError","setSetupChannelEnabled","z","buildChannelConfigSchema","defineChannelPluginEntry","defineSetupPluginEntry"],"mappings":"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","file":"setup-entry.cjs","sourcesContent":["/**\n * Account-config primitives for the AgentChat channel plugin.\n *\n * This module owns the smallest set of shared pieces that both the plugin\n * definition (`channel.ts`) and the interactive setup wizard\n * (`channel.wizard.ts`) need to read or mutate the `channels.agentchat.*`\n * section of the OpenClaw config. Keeping them in a leaf file (no imports\n * from other channel-* modules) breaks the channel.ts ↔ channel.wizard.ts\n * import cycle — without it, the wizard literal's `channel:` field resolves\n * to the temporal-dead-zone value of `AGENTCHAT_CHANNEL_ID` at module-init\n * time, which bundlers emit as `undefined`.\n *\n * Invariants:\n * - Flat form (`channels.agentchat.{apiKey,...}`) is the default-account\n * layout when no `accounts` key is present. Once a named account is\n * written, flat form is never used again for the default account.\n * - The `enabled` flag is section-level (not per-account) and is kept out\n * of the Zod-parsed account shape because the schema is `.strict()`.\n */\nimport type { OpenClawConfig } from 'openclaw/plugin-sdk/channel-core'\n\nexport const AGENTCHAT_CHANNEL_ID = 'agentchat' as const\nexport const AGENTCHAT_DEFAULT_ACCOUNT_ID = 'default'\n\nexport const MIN_API_KEY_LENGTH = 20\n\nexport type ChannelSectionRaw = Record<string, unknown> & {\n accounts?: Record<string, unknown>\n enabled?: unknown\n apiKey?: unknown\n apiBase?: unknown\n agentHandle?: unknown\n}\n\nexport function readChannelSection(cfg: OpenClawConfig | undefined): ChannelSectionRaw | undefined {\n const channels = (cfg as { channels?: Record<string, unknown> } | undefined)?.channels\n const section = channels?.[AGENTCHAT_CHANNEL_ID]\n return section && typeof section === 'object' && !Array.isArray(section)\n ? (section as ChannelSectionRaw)\n : undefined\n}\n\nexport function readAccountRaw(\n section: ChannelSectionRaw | undefined,\n accountId: string,\n): Record<string, unknown> | undefined {\n if (!section) return undefined\n const { accounts } = section\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 // Single-account fallback: treat section-level fields as the 'default' account,\n // stripping the `accounts` subsection (but preserving `enabled`, which the\n // caller extracts before Zod parsing).\n if (accountId === AGENTCHAT_DEFAULT_ACCOUNT_ID) {\n const { accounts: _accounts, ...rest } = section\n void _accounts\n return rest as Record<string, unknown>\n }\n return undefined\n}\n\n/**\n * Pulls the `enabled` flag out of a raw account record and returns a copy\n * safe to feed into `parseChannelConfig` (which enforces `.strict()` — an\n * unknown `enabled` key would otherwise reject).\n */\nexport function splitEnabledFromRaw(\n raw: Record<string, unknown> | undefined,\n): { enabled: boolean; forParse: Record<string, unknown> | undefined } {\n if (!raw) return { enabled: true, forParse: undefined }\n const { enabled, ...rest } = raw\n return { enabled: enabled !== false, forParse: rest }\n}\n\nexport function isApiKeyPresent(value: unknown): value is string {\n return typeof value === 'string' && value.length >= MIN_API_KEY_LENGTH\n}\n\n/**\n * Read a string-valued field from the resolved account record. Mirrors the\n * fallback logic of `resolveAccount` — accounts.<id>.<field> when present,\n * falling back to the flat section for the default account.\n *\n * Used by the setup wizard so it can render live config state without\n * re-running the Zod parser (which would reject partial work-in-progress\n * inputs during the interactive flow).\n */\nexport function readAgentchatConfigField(\n cfg: OpenClawConfig | undefined,\n accountId: string,\n field: 'apiKey' | 'apiBase' | 'agentHandle',\n): string | undefined {\n const section = readChannelSection(cfg)\n const raw = readAccountRaw(section, accountId)\n if (!raw) return undefined\n const value = raw[field]\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\n/**\n * Shared writer for both the non-interactive `setup.applyAccountConfig`\n * adapter and the interactive wizard. Maintains the same flat-vs-accounts\n * invariant: default account uses flat form iff no `accounts` key is present;\n * named accounts always nest under `accounts.<id>`.\n */\nexport function applyAgentchatAccountPatch(\n cfg: OpenClawConfig | undefined,\n accountId: string,\n patch: Record<string, unknown>,\n): OpenClawConfig {\n const channels: Record<string, unknown> = {\n ...((cfg as { channels?: Record<string, unknown> } | undefined)?.channels ?? {}),\n }\n const currentSection = channels[AGENTCHAT_CHANNEL_ID]\n const section: ChannelSectionRaw =\n currentSection && typeof currentSection === 'object' && !Array.isArray(currentSection)\n ? { ...(currentSection as ChannelSectionRaw) }\n : {}\n\n if (accountId === AGENTCHAT_DEFAULT_ACCOUNT_ID && !section.accounts) {\n Object.assign(section, patch)\n } else {\n const accounts: Record<string, unknown> = {\n ...((section.accounts as Record<string, unknown> | undefined) ?? {}),\n }\n const prevAccount =\n typeof accounts[accountId] === 'object' && accounts[accountId] !== null\n ? (accounts[accountId] as Record<string, unknown>)\n : {}\n accounts[accountId] = { ...prevAccount, ...patch }\n section.accounts = accounts\n }\n\n channels[AGENTCHAT_CHANNEL_ID] = section\n return { ...(cfg ?? {}), channels } as OpenClawConfig\n}\n","/**\n * Minimal HTTP client used by the setup plugin (P7) to:\n * - verify an API key is live before finalizing setup (`validateApiKey`)\n * - drive the email-OTP self-registration flow for agents without a key yet\n * (`registerAgentStart` → `registerAgentVerify`)\n *\n * Why this lives separately from `outbound.ts`:\n * - `outbound.ts` is the hot-path message sender. It wants retries, a circuit\n * breaker, metrics, and a long-lived `fetch`. Setup is one-shot, low-rate,\n * user-interactive — a 200ms validation call doesn't need any of that.\n * - Setup runs before the runtime exists; coupling it to `OutboundAdapter`\n * (which expects a parsed `AgentchatChannelConfig`) would force an odd\n * partial-config path during registration.\n *\n * The server endpoints this module targets are stable AgentChat REST calls:\n * - `GET /v1/agents/me` → 200 OK when the key authenticates\n * - `POST /v1/register` → 200 with `{ pending_id }`\n * - `POST /v1/register/verify` → 201 with `{ agent, api_key }` on success\n *\n * All methods return strongly-typed result unions — setup UIs can `switch` on\n * the discriminant without guessing at HTTP status codes.\n */\n\nimport { AgentChatChannelError } from './errors.js'\n\nconst DEFAULT_API_BASE = 'https://api.agentchat.me'\nconst DEFAULT_TIMEOUT_MS = 10_000\n\n/** Subset of the AgentChat agent row the setup surface needs to show the user. */\nexport interface AgentchatAgentIdentity {\n readonly handle: string\n readonly displayName: string | null\n readonly email: string\n readonly createdAt: string\n}\n\nexport type ValidateApiKeyResult =\n | { readonly ok: true; readonly agent: AgentchatAgentIdentity }\n | {\n readonly ok: false\n /** High-level reason code the UI can map to a localized message. */\n readonly reason:\n | 'unauthorized'\n | 'forbidden'\n | 'deleted'\n | 'network-error'\n | 'unreachable'\n | 'server-error'\n | 'unexpected-shape'\n readonly message: string\n readonly status?: number\n }\n\nexport interface ValidateApiKeyOptions {\n readonly apiBase?: string\n readonly fetch?: typeof fetch\n readonly timeoutMs?: number\n}\n\n/**\n * Probe the API key against `GET /v1/agents/me`. Returns a discriminated\n * result — never throws on HTTP or network errors. The caller decides how\n * to surface each failure mode to the user.\n */\nexport async function validateApiKey(\n apiKey: string,\n opts: ValidateApiKeyOptions = {},\n): Promise<ValidateApiKeyResult> {\n if (!apiKey || typeof apiKey !== 'string') {\n return { ok: false, reason: 'unauthorized', message: 'API key is empty' }\n }\n const base = (opts.apiBase ?? DEFAULT_API_BASE).replace(/\\/+$/, '')\n const url = `${base}/v1/agents/me`\n const controller = new AbortController()\n const fetchImpl = opts.fetch ?? fetch\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n\n let res: Response\n try {\n res = await fetchImpl(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: 'application/json',\n },\n signal: controller.signal,\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n const unreachable =\n err instanceof Error &&\n (err.name === 'AbortError' || /ECONN|ETIMEDOUT|ENOTFOUND|EAI_AGAIN/i.test(message))\n return {\n ok: false,\n reason: unreachable ? 'unreachable' : 'network-error',\n message: `agentchat: GET /v1/agents/me failed: ${message}`,\n }\n } finally {\n clearTimeout(timer)\n }\n\n if (res.status === 401) {\n return { ok: false, reason: 'unauthorized', status: 401, message: 'API key is invalid or revoked' }\n }\n if (res.status === 403) {\n return { ok: false, reason: 'forbidden', status: 403, message: 'API key lacks permission to read /agents/me' }\n }\n if (res.status === 410) {\n return { ok: false, reason: 'deleted', status: 410, message: 'Agent account has been deleted' }\n }\n if (res.status >= 500) {\n return { ok: false, reason: 'server-error', status: res.status, message: `AgentChat API returned ${res.status}` }\n }\n if (!res.ok) {\n return {\n ok: false,\n reason: 'server-error',\n status: res.status,\n message: `AgentChat API returned ${res.status}`,\n }\n }\n\n const body = (await res.json().catch(() => null)) as {\n handle?: unknown\n display_name?: unknown\n email?: unknown\n email_masked?: unknown\n created_at?: unknown\n } | null\n // The live `GET /v1/agents/me` endpoint masks PII: it returns\n // `email_masked` (e.g. `a****@agentchat.local`), never the real `email`.\n // Accept either so tests that stub an unmasked body still pass, but the\n // caller should expect a masked value in production.\n const email =\n typeof body?.email === 'string'\n ? body.email\n : typeof body?.email_masked === 'string'\n ? body.email_masked\n : null\n if (!body || typeof body.handle !== 'string' || email === null || typeof body.created_at !== 'string') {\n return {\n ok: false,\n reason: 'unexpected-shape',\n status: res.status,\n message: 'AgentChat /agents/me returned an unrecognized shape',\n }\n }\n return {\n ok: true,\n agent: {\n handle: body.handle,\n displayName: typeof body.display_name === 'string' ? body.display_name : null,\n email,\n createdAt: body.created_at,\n },\n }\n}\n\n// ─── Self-registration (email + OTP) ───────────────────────────────────\n\nexport interface RegisterAgentStartInput {\n readonly email: string\n readonly handle: string\n readonly displayName?: string\n readonly description?: string\n}\n\nexport type RegisterStartResult =\n | { readonly ok: true; readonly pendingId: string }\n | {\n readonly ok: false\n readonly reason:\n | 'invalid-handle'\n | 'handle-taken'\n | 'email-taken'\n | 'email-exhausted'\n | 'rate-limited'\n | 'otp-failed'\n | 'network-error'\n | 'server-error'\n | 'validation'\n readonly message: string\n readonly status?: number\n readonly retryAfterSeconds?: number\n }\n\nexport interface RegisterAgentVerifyInput {\n readonly pendingId: string\n readonly code: string\n}\n\nexport type RegisterVerifyResult =\n | {\n readonly ok: true\n readonly apiKey: string\n readonly agent: AgentchatAgentIdentity\n }\n | {\n readonly ok: false\n readonly reason:\n | 'expired'\n | 'invalid-code'\n | 'rate-limited'\n | 'handle-taken'\n | 'email-taken'\n | 'network-error'\n | 'server-error'\n | 'unexpected-shape'\n | 'validation'\n readonly message: string\n readonly status?: number\n readonly retryAfterSeconds?: number\n }\n\nexport interface RegisterOptions {\n readonly apiBase?: string\n readonly fetch?: typeof fetch\n readonly timeoutMs?: number\n}\n\n/**\n * Kick off an email-OTP registration. Server caches the intent under a\n * `pending_id` for 10 minutes and emails a 6-digit code to `email`.\n */\nexport async function registerAgentStart(\n input: RegisterAgentStartInput,\n opts: RegisterOptions = {},\n): Promise<RegisterStartResult> {\n const res = await post('/v1/register', input, opts)\n if (res.kind === 'network') {\n return { ok: false, reason: 'network-error', message: res.message }\n }\n if (res.kind === 'timeout') {\n return { ok: false, reason: 'network-error', message: 'request timed out' }\n }\n\n const body = (res.body as { pending_id?: unknown; code?: unknown; message?: unknown }) ?? {}\n\n if (res.status === 200) {\n if (typeof body.pending_id !== 'string') {\n return {\n ok: false,\n reason: 'server-error',\n status: 200,\n message: 'AgentChat /register returned no pending_id',\n }\n }\n return { ok: true, pendingId: body.pending_id }\n }\n\n const code = typeof body.code === 'string' ? body.code : ''\n const message = typeof body.message === 'string' ? body.message : `status ${res.status}`\n\n if (res.status === 400 && code === 'INVALID_HANDLE') return { ok: false, reason: 'invalid-handle', message, status: 400 }\n if (res.status === 400 && code === 'VALIDATION_ERROR') return { ok: false, reason: 'validation', message, status: 400 }\n if (res.status === 409 && code === 'HANDLE_TAKEN') return { ok: false, reason: 'handle-taken', message, status: 409 }\n if (res.status === 409 && code === 'EMAIL_TAKEN') return { ok: false, reason: 'email-taken', message, status: 409 }\n if (res.status === 409 && code === 'EMAIL_EXHAUSTED') return { ok: false, reason: 'email-exhausted', message, status: 409 }\n if (res.status === 429) {\n return {\n ok: false,\n reason: 'rate-limited',\n message,\n status: 429,\n retryAfterSeconds: res.retryAfterSeconds,\n }\n }\n if (res.status >= 500 || code === 'OTP_FAILED') return { ok: false, reason: 'otp-failed', message, status: res.status }\n return { ok: false, reason: 'server-error', status: res.status, message }\n}\n\n/** Verify the OTP the user received by email and mint the API key. */\nexport async function registerAgentVerify(\n input: RegisterAgentVerifyInput,\n opts: RegisterOptions = {},\n): Promise<RegisterVerifyResult> {\n const res = await post('/v1/register/verify', { pending_id: input.pendingId, code: input.code }, opts)\n if (res.kind === 'network') return { ok: false, reason: 'network-error', message: res.message }\n if (res.kind === 'timeout') return { ok: false, reason: 'network-error', message: 'request timed out' }\n\n const body = (res.body ?? {}) as {\n code?: unknown\n message?: unknown\n agent?: { handle?: unknown; display_name?: unknown; email?: unknown; created_at?: unknown }\n api_key?: unknown\n }\n\n if (res.status === 201) {\n const agent = body.agent\n if (\n typeof body.api_key !== 'string' ||\n !agent ||\n typeof agent.handle !== 'string' ||\n typeof agent.email !== 'string' ||\n typeof agent.created_at !== 'string'\n ) {\n return {\n ok: false,\n reason: 'unexpected-shape',\n status: 201,\n message: 'AgentChat /register/verify returned an unrecognized shape',\n }\n }\n return {\n ok: true,\n apiKey: body.api_key,\n agent: {\n handle: agent.handle,\n displayName: typeof agent.display_name === 'string' ? agent.display_name : null,\n email: agent.email,\n createdAt: agent.created_at,\n },\n }\n }\n\n const code = typeof body.code === 'string' ? body.code : ''\n const message = typeof body.message === 'string' ? body.message : `status ${res.status}`\n\n if (res.status === 400 && code === 'EXPIRED') return { ok: false, reason: 'expired', message, status: 400 }\n if (res.status === 400 && code === 'INVALID_CODE') return { ok: false, reason: 'invalid-code', message, status: 400 }\n if (res.status === 400 && code === 'VALIDATION_ERROR') return { ok: false, reason: 'validation', message, status: 400 }\n if (res.status === 409 && code === 'HANDLE_TAKEN') return { ok: false, reason: 'handle-taken', message, status: 409 }\n if (res.status === 409 && code === 'EMAIL_TAKEN') return { ok: false, reason: 'email-taken', message, status: 409 }\n if (res.status === 429) {\n return { ok: false, reason: 'rate-limited', message, status: 429, retryAfterSeconds: res.retryAfterSeconds }\n }\n return { ok: false, reason: 'server-error', status: res.status, message }\n}\n\n// ─── Internals ─────────────────────────────────────────────────────────\n\ntype PostOutcome =\n | { kind: 'http'; status: number; body: unknown; retryAfterSeconds?: number }\n | { kind: 'network'; message: string }\n | { kind: 'timeout' }\n\nasync function post(path: string, body: unknown, opts: RegisterOptions): Promise<PostOutcome> {\n const base = (opts.apiBase ?? DEFAULT_API_BASE).replace(/\\/+$/, '')\n const url = `${base}${path}`\n const controller = new AbortController()\n const fetchImpl = opts.fetch ?? fetch\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n })\n const parsed = await res.json().catch(() => null)\n const retryAfterHeader = res.headers.get('retry-after')\n const retryAfterSeconds = retryAfterHeader ? Number(retryAfterHeader) : undefined\n return {\n kind: 'http',\n status: res.status,\n body: parsed,\n retryAfterSeconds: Number.isFinite(retryAfterSeconds) ? retryAfterSeconds : undefined,\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') return { kind: 'timeout' }\n return { kind: 'network', message: err instanceof Error ? err.message : String(err) }\n } finally {\n clearTimeout(timer)\n }\n}\n\n/**\n * Throw-flavored wrapper used by callers that prefer exception control flow\n * (the setup plugin's `afterAccountConfigWritten` hook). Converts a failure\n * result into an `AgentChatChannelError` with an appropriate class.\n */\nexport async function assertApiKeyValid(\n apiKey: string,\n opts: ValidateApiKeyOptions = {},\n): Promise<AgentchatAgentIdentity> {\n const result = await validateApiKey(apiKey, opts)\n if (result.ok) return result.agent\n const class_ =\n result.reason === 'unauthorized' || result.reason === 'forbidden' || result.reason === 'deleted'\n ? 'terminal-auth'\n : result.reason === 'server-error'\n ? 'retry-transient'\n : 'retry-transient'\n throw new AgentChatChannelError(class_, `${result.message} [reason=${result.reason}]`, {\n statusCode: result.status,\n })\n}\n","/**\n * AgentChat channel setup wizard.\n *\n * Implements the interactive onboarding flow that OpenClaw's `setup` driver\n * invokes for users who just ran `openclaw plugins install @agentchatme/openclaw`\n * and `openclaw channels add agentchat`.\n *\n * The core UX decision this wizard encodes: AgentChat is the first channel in\n * the OpenClaw ecosystem where the identity the channel authenticates against\n * lives inside the plugin's own issuer (not an external provider like Slack or\n * Telegram). That means we can — and should — let brand-new users provision\n * credentials without ever leaving the CLI. Hence the login-vs-register branch\n * at the top: paste an existing key, or register via email OTP in-wizard.\n *\n * Flow:\n * 1. `status.resolveConfigured` — reports \"configured / not configured\" for\n * `openclaw setup`'s pre-selection summary.\n * 2. `prepare` — runs BEFORE the credential step. Branches on user intent:\n * - \"I have a key\" → returns void; framework prompts for the key next.\n * - \"Register me\" → drives email-OTP registration via the REST client,\n * writes the minted key directly to cfg, and marks\n * a sentinel in credentialValues so the credential\n * step skips its redundant keep/replace prompt.\n * 3. `credentials[0]` — the API-key credential. `shouldPrompt` honors the\n * post-register sentinel; otherwise the framework's default prompt runs.\n * 4. `finalize` — calls GET /v1/agents/me once more to confirm the key works,\n * surfaces the authenticated handle, and never throws on transport errors\n * (a fresh clone with a proxy should still save config and retry later).\n *\n * Writes go through `applyAgentchatAccountPatch` — the same helper backing\n * `setup.applyAccountConfig`, so the non-interactive `openclaw setup --token\n * ac_live_…` path and the interactive wizard path converge on the same config\n * shape and stay round-trippable.\n *\n * `disable` wires `setSetupChannelEnabled` so `openclaw channels remove\n * agentchat` produces `channels.agentchat.enabled: false` and keeps the\n * apiKey on disk (in case the operator just wants to pause, not rotate).\n */\n\nimport {\n WizardCancelledError,\n setSetupChannelEnabled,\n type ChannelSetupWizard,\n type OpenClawConfig,\n type WizardPrompter,\n} from 'openclaw/plugin-sdk/setup'\n\n/**\n * Inline of `ChannelSetupWizardCredentialValues` — the plugin-sdk's public\n * barrel does not re-export it, so we match its shape locally. Extra keys\n * beyond `keyof ChannelSetupInput` (e.g. our `_agentchatJustRegistered`\n * sentinel) are allowed because the framework treats this as a bag of strings\n * keyed by whatever the wizard steps use.\n */\ntype ChannelSetupWizardCredentialValues = Partial<Record<string, string>>\n\nimport {\n AGENTCHAT_CHANNEL_ID,\n MIN_API_KEY_LENGTH,\n applyAgentchatAccountPatch,\n isApiKeyPresent,\n readAgentchatConfigField,\n} from './channel-account.js'\nimport {\n registerAgentStart,\n registerAgentVerify,\n validateApiKey,\n type RegisterStartResult,\n type RegisterVerifyResult,\n} from './setup-client.js'\n\n/**\n * Sentinel credential-values key used to signal \"the register path in prepare\n * already minted + persisted the API key, don't re-prompt\". Framework-level\n * prompt skipping is per-credential; we read this in `shouldPrompt` below.\n * The leading underscore keeps it out of any `keyof ChannelSetupInput` path.\n */\nconst JUST_REGISTERED_SENTINEL = '_agentchatJustRegistered' as const\n\n// Canonical handle shape — mirrors packages/shared/src/validation/handles.ts\n// HANDLE_REGEX plus the 3–30 length check. Server is authoritative; this is\n// a client-side fast-fail so users don't round-trip an obviously-bad handle.\nconst HANDLE_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/\nconst HANDLE_MIN_LENGTH = 3\nconst HANDLE_MAX_LENGTH = 30\nconst EMAIL_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nfunction isValidHandleShape(value: string): boolean {\n return (\n value.length >= HANDLE_MIN_LENGTH &&\n value.length <= HANDLE_MAX_LENGTH &&\n HANDLE_PATTERN.test(value)\n )\n}\n\n/** 6-digit numeric OTP; the server rejects any other shape with INVALID_CODE. */\nconst OTP_PATTERN = /^\\d{6}$/\n\nfunction hasConfiguredKey(cfg: OpenClawConfig | undefined, accountId: string): boolean {\n return isApiKeyPresent(readAgentchatConfigField(cfg, accountId, 'apiKey'))\n}\n\n/**\n * How many times we'll re-prompt around a retryable start-of-registration\n * error (handle-taken, invalid-handle, email-exhausted, …) before giving up\n * and steering the user to paste an existing key or cancel. A hard cap stops\n * a confused user looping forever; 5 is enough to pick a fresh handle or email\n * without being punishing.\n */\nconst MAX_START_RETRIES = 5\n\nasync function promptEmail(prompter: WizardPrompter): Promise<string> {\n return (\n await prompter.text({\n message: 'Email address (for the verification code)',\n placeholder: 'you@example.com',\n validate: (value) => {\n const trimmed = value.trim()\n if (!trimmed) return 'Email is required'\n if (!EMAIL_PATTERN.test(trimmed)) return 'That does not look like a valid email address'\n return undefined\n },\n })\n ).trim()\n}\n\nasync function promptHandle(prompter: WizardPrompter): Promise<string> {\n return (\n await prompter.text({\n message: 'Choose a handle (your @name on AgentChat)',\n placeholder: 'my-agent',\n validate: (value) => {\n const trimmed = value.trim()\n if (!trimmed) return 'Handle is required'\n if (!isValidHandleShape(trimmed)) {\n return 'Handle must be 3–30 chars — lowercase letters/digits/hyphens; must start with a letter'\n }\n return undefined\n },\n })\n ).trim()\n}\n\nasync function promptDisplayName(prompter: WizardPrompter): Promise<string> {\n return (\n await prompter.text({\n message: 'Display name (optional — shown next to your handle)',\n placeholder: '',\n validate: () => undefined,\n })\n ).trim()\n}\n\n/**\n * Change-API-base flow: only relevant for self-hosted AgentChat deployments.\n * The production client hits `https://api.agentchat.me` by default and the\n * config-schema pins that as the default value, so blank means \"reset to\n * default\" (remove the apiBase override entirely). Non-empty values must\n * parse as a valid http:// or https:// URL — we fail fast here so the user\n * does not save a typo that later surfaces as a misleading DNS-resolution\n * error at connect time.\n */\nasync function runChangeApiBaseFlow(params: {\n cfg: OpenClawConfig\n accountId: string\n prompter: WizardPrompter\n}): Promise<{ cfg: OpenClawConfig } | undefined> {\n const { cfg, accountId, prompter } = params\n const current = readAgentchatConfigField(cfg, accountId, 'apiBase')\n\n const input = (\n await prompter.text({\n message: 'New API base URL (blank to reset to default)',\n placeholder: current ?? 'https://api.agentchat.me',\n validate: (value) => {\n const trimmed = value.trim()\n if (!trimmed) return undefined // blank = reset to default\n try {\n const url = new URL(trimmed)\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n return 'API base must use http:// or https://'\n }\n return undefined\n } catch {\n return 'Not a valid URL'\n }\n },\n })\n ).trim()\n\n if (!input) {\n const patched = applyAgentchatAccountPatch(cfg, accountId, {\n apiBase: undefined,\n })\n await prompter.note(\n 'API base reset to default (https://api.agentchat.me).',\n 'Updated',\n )\n return { cfg: patched }\n }\n\n const patched = applyAgentchatAccountPatch(cfg, accountId, {\n apiBase: input,\n })\n await prompter.note(`API base set to ${input}`, 'Updated')\n return { cfg: patched }\n}\n\n/**\n * Return values from `runRegisterFlow`:\n * - success object → registration minted a key; credential step should\n * use it and skip its own prompt.\n * - `'abort'` → registration failed; caller shows the fallback\n * note and the framework prompts for a pasted key.\n * - `'user-chose-paste'`→ user explicitly elected to paste an existing key\n * (from an in-flow branch point like \"this email is\n * already registered\"). Caller skips the fallback\n * note because the user has already acknowledged\n * what's next.\n */\ntype RegisterFlowOutcome =\n | { cfg: OpenClawConfig; credentialValues: ChannelSetupWizardCredentialValues }\n | 'abort'\n | 'user-chose-paste'\n\nasync function runRegisterFlow(params: {\n cfg: OpenClawConfig\n accountId: string\n prompter: WizardPrompter\n apiBase: string | undefined\n}): Promise<RegisterFlowOutcome> {\n const { cfg, accountId, prompter, apiBase } = params\n\n await prompter.note(\n [\n 'Registration mints a new AgentChat agent identity tied to your email.',\n 'You will receive a 6-digit code to verify — check your inbox (and spam).',\n ].join('\\n'),\n 'AgentChat: register a new agent',\n )\n\n // Collect all three fields up front. If the server rejects on one specific\n // field (handle / email), we loop back and re-prompt ONLY that field below\n // — keeping the already-correct state so the user isn't punished for a\n // partial collision.\n let email = await promptEmail(prompter)\n let handle = await promptHandle(prompter)\n const displayName = await promptDisplayName(prompter)\n\n // ─── Start: request OTP, with field-specific retry ──────────────────\n // Retry semantics:\n // invalid-handle / handle-taken → re-prompt handle, keep email+displayName\n // email-exhausted → re-prompt email, keep handle+displayName\n // email-taken → branch: paste existing key, pick new\n // email, or cancel\n // rate-limited / otp-failed /\n // network / server / validation → abort with a clear message\n let startResult: RegisterStartResult | undefined\n let startedOk = false\n for (let attempt = 1; attempt <= MAX_START_RETRIES; attempt += 1) {\n const startSpinner = prompter.progress(\n attempt === 1 ? 'Sending verification code…' : 'Retrying…',\n )\n try {\n startResult = await registerAgentStart(\n {\n email,\n handle,\n ...(displayName ? { displayName } : {}),\n },\n { apiBase },\n )\n } catch (err) {\n startSpinner.stop('Could not reach AgentChat')\n await prompter.note(\n `${err instanceof Error ? err.message : String(err)}. Try again when the network is available, or paste an existing key instead.`,\n 'Registration failed',\n )\n return 'abort'\n }\n\n if (startResult.ok) {\n startSpinner.stop(`Verification code sent to ${email}`)\n startedOk = true\n break\n }\n\n startSpinner.stop('Registration rejected')\n\n switch (startResult.reason) {\n case 'invalid-handle':\n case 'handle-taken': {\n const detail =\n startResult.reason === 'handle-taken'\n ? `Handle @${handle} is already taken.`\n : 'That handle is not acceptable (3–30 chars — lowercase letters/digits/hyphens; must start with a letter).'\n await prompter.note(`${detail} Pick a different handle and we'll try again.`, 'Pick a different handle')\n handle = await promptHandle(prompter)\n continue\n }\n case 'email-taken': {\n const choice = await prompter.select<'paste' | 'retry' | 'cancel'>({\n message: `${email} is already registered as an AgentChat agent. What would you like to do?`,\n options: [\n {\n value: 'paste',\n label: 'Paste the existing API key for this agent',\n hint: 'recommended if you own the account',\n },\n { value: 'retry', label: 'Use a different email address' },\n { value: 'cancel', label: 'Cancel registration' },\n ],\n initialValue: 'paste',\n })\n if (choice === 'paste') return 'user-chose-paste'\n if (choice === 'cancel') return 'abort'\n email = await promptEmail(prompter)\n continue\n }\n case 'email-exhausted': {\n const choice = await prompter.select<'retry' | 'paste' | 'cancel'>({\n message: `${email} has reached the per-email agent quota. What next?`,\n options: [\n { value: 'retry', label: 'Use a different email address' },\n { value: 'paste', label: 'Paste a key from an existing agent' },\n { value: 'cancel', label: 'Cancel registration' },\n ],\n initialValue: 'retry',\n })\n if (choice === 'paste') return 'user-chose-paste'\n if (choice === 'cancel') return 'abort'\n email = await promptEmail(prompter)\n continue\n }\n case 'rate-limited': {\n const wait = startResult.retryAfterSeconds\n ? ` Try again in ${startResult.retryAfterSeconds}s.`\n : ''\n await prompter.note(`Too many registration attempts.${wait}`, 'Rate limited')\n return 'abort'\n }\n case 'otp-failed': {\n await prompter.note(\n 'The verification-code email could not be sent. Try again in a minute, or paste an existing key instead.',\n 'OTP delivery failed',\n )\n return 'abort'\n }\n case 'network-error':\n case 'server-error':\n case 'validation':\n default: {\n await prompter.note(describeRegisterStartError(startResult), 'Could not start registration')\n return 'abort'\n }\n }\n }\n\n if (!startedOk || !startResult || !startResult.ok) {\n await prompter.note(\n 'Too many attempts. Restart the wizard to try again, or paste an existing key at the next prompt.',\n 'Registration failed',\n )\n return 'abort'\n }\n\n // ─── Verify: collect OTP, retry on mistyped codes ───────────────────\n const maxCodeAttempts = 3\n let verifyResult: RegisterVerifyResult | null = null\n for (let attempt = 1; attempt <= maxCodeAttempts; attempt += 1) {\n const code = (\n await prompter.text({\n message:\n attempt === 1\n ? 'Enter the 6-digit verification code from your email'\n : `Verification code (attempt ${attempt}/${maxCodeAttempts})`,\n placeholder: '123456',\n validate: (value) => {\n const trimmed = value.trim()\n if (!trimmed) return 'Code is required'\n if (!OTP_PATTERN.test(trimmed)) return 'Code is 6 digits'\n return undefined\n },\n })\n ).trim()\n\n const verifySpinner = prompter.progress('Verifying code…')\n try {\n verifyResult = await registerAgentVerify({ pendingId: startResult.pendingId, code }, { apiBase })\n } catch (err) {\n verifySpinner.stop('Could not reach AgentChat')\n await prompter.note(\n `${err instanceof Error ? err.message : String(err)}. Try again, or paste an existing key instead.`,\n 'Verification failed',\n )\n return 'abort'\n }\n\n if (verifyResult.ok) {\n verifySpinner.stop(`Registered as @${verifyResult.agent.handle}`)\n break\n }\n\n verifySpinner.stop('Verification failed')\n\n // Retryable: bad code. Other failure modes are terminal for this flow.\n if (verifyResult.reason === 'invalid-code' && attempt < maxCodeAttempts) {\n await prompter.note(\n 'That code did not match. Check your email and try again.',\n 'Invalid verification code',\n )\n continue\n }\n\n await prompter.note(describeRegisterVerifyError(verifyResult), 'Registration failed')\n return 'abort'\n }\n\n if (!verifyResult || !verifyResult.ok) {\n await prompter.note(\n 'Too many incorrect codes. Restart the wizard to receive a new code.',\n 'Registration failed',\n )\n return 'abort'\n }\n\n // ─── Persist: write minted key to cfg, advertise handle in config ───\n const patch: Record<string, unknown> = { apiKey: verifyResult.apiKey }\n if (isValidHandleShape(verifyResult.agent.handle)) {\n patch.agentHandle = verifyResult.agent.handle\n }\n const nextCfg = applyAgentchatAccountPatch(cfg, accountId, patch)\n\n await prompter.note(\n [\n `Handle: @${verifyResult.agent.handle}`,\n `Email: ${verifyResult.agent.email}`,\n `API key: ${redactKey(verifyResult.apiKey)} (saved to your OpenClaw config)`,\n ].join('\\n'),\n 'AgentChat account created',\n )\n\n return {\n cfg: nextCfg,\n credentialValues: {\n token: verifyResult.apiKey,\n [JUST_REGISTERED_SENTINEL]: '1',\n },\n }\n}\n\nfunction describeRegisterStartError(result: Extract<RegisterStartResult, { ok: false }>): string {\n switch (result.reason) {\n case 'invalid-handle':\n return 'That handle is not acceptable. Try a different one (3–30 chars — lowercase letters/digits/hyphens; must start with a letter).'\n case 'handle-taken':\n return 'That handle is already taken. Try a different one.'\n case 'email-taken':\n return 'That email is already registered as an agent. Paste the existing key instead, or use a different email.'\n case 'email-exhausted':\n return 'This email has reached the agent quota. Use a different email, or paste a key from an existing agent.'\n case 'rate-limited': {\n const wait = result.retryAfterSeconds ? ` Try again in ${result.retryAfterSeconds}s.` : ''\n return `Rate limited.${wait}`\n }\n case 'otp-failed':\n return 'The verification-code email could not be sent. Try again in a minute.'\n case 'network-error':\n case 'server-error':\n case 'validation':\n default:\n return result.message\n }\n}\n\nfunction describeRegisterVerifyError(result: Extract<RegisterVerifyResult, { ok: false }>): string {\n switch (result.reason) {\n case 'expired':\n return 'This code expired. Restart the wizard to receive a new one.'\n case 'invalid-code':\n return 'Too many incorrect codes. Restart the wizard to receive a new one.'\n case 'handle-taken':\n return 'Your chosen handle was claimed by another registration in the meantime. Restart with a different handle.'\n case 'email-taken':\n return 'This email is already registered. Paste the existing key instead.'\n case 'rate-limited': {\n const wait = result.retryAfterSeconds ? ` Try again in ${result.retryAfterSeconds}s.` : ''\n return `Rate limited.${wait}`\n }\n case 'network-error':\n case 'server-error':\n case 'unexpected-shape':\n case 'validation':\n default:\n return result.message\n }\n}\n\nfunction redactKey(apiKey: string): string {\n if (apiKey.length < 12) return '••••'\n return `${apiKey.slice(0, 8)}…${apiKey.slice(-4)}`\n}\n\nexport const agentchatSetupWizard: ChannelSetupWizard = {\n channel: AGENTCHAT_CHANNEL_ID,\n\n status: {\n configuredLabel: 'configured',\n unconfiguredLabel: 'not configured',\n configuredHint: 'AgentChat agent is ready to receive messages',\n unconfiguredHint: 'connect your agent to the AgentChat messaging platform',\n configuredScore: 90,\n unconfiguredScore: 30,\n resolveConfigured: ({ cfg, accountId }) => {\n return hasConfiguredKey(cfg, accountId ?? 'default')\n },\n resolveStatusLines: ({ cfg, accountId, configured }) => {\n const id = accountId ?? 'default'\n if (!configured) {\n return ['AgentChat: not configured — the wizard will register you or accept an existing key.']\n }\n const handle = readAgentchatConfigField(cfg, id, 'agentHandle')\n return [`AgentChat: configured${handle ? ` (@${handle})` : ''}`]\n },\n },\n\n introNote: {\n title: 'AgentChat',\n lines: [\n 'AgentChat is a messaging platform for AI agents — direct messages,',\n 'groups, presence, attachments. Registration is free.',\n '',\n 'This wizard will either mint a new account via email OTP, or accept',\n 'an existing API key — your choice in the next prompt.',\n ],\n },\n\n prepare: async ({ cfg, accountId, credentialValues, prompter }) => {\n // Re-run against an already-configured account: offer the edit menu\n // (keep / change-base / replace-key). `change-base` is the only action\n // that cannot be driven through the framework's credential UX — it has\n // to mutate `apiBase`, which is not a credential field. `keep` and\n // `replace-key` both fall through to the framework's keep/replace prompt\n // on the credential step; the only difference is that `replace-key`\n // surfaces the register-or-paste menu below so the user gets the\n // in-wizard register path instead of just a paste box.\n if (hasConfiguredKey(cfg, accountId) && typeof credentialValues.token === 'string') {\n const editChoice = await prompter.select<'keep' | 'change-base' | 'replace-key'>({\n message: 'AgentChat is already configured. What would you like to do?',\n options: [\n {\n value: 'keep',\n label: 'Keep current config',\n hint: 'the credential step will still re-validate on the next run',\n },\n {\n value: 'change-base',\n label: 'Change API base URL',\n hint: 'only for self-hosted AgentChat deployments',\n },\n {\n value: 'replace-key',\n label: 'Replace the API key',\n hint: 'paste a new key, or register a new agent',\n },\n ],\n initialValue: 'keep',\n })\n\n if (editChoice === 'keep') return\n if (editChoice === 'change-base') {\n return await runChangeApiBaseFlow({ cfg, accountId, prompter })\n }\n // 'replace-key' falls through to the register-or-paste menu below.\n }\n\n const choice = await prompter.select<'register' | 'paste'>({\n message: 'How would you like to configure AgentChat?',\n options: [\n {\n value: 'register',\n label: 'Register a new agent (email OTP)',\n hint: 'no account yet — the wizard creates one',\n },\n {\n value: 'paste',\n label: 'I already have an API key',\n hint: 'paste ac_live_… on the next prompt',\n },\n ],\n initialValue: 'register',\n })\n\n if (choice === 'paste') {\n return\n }\n\n const apiBase = readAgentchatConfigField(cfg, accountId, 'apiBase')\n try {\n const result = await runRegisterFlow({ cfg, accountId, prompter, apiBase })\n if (result === 'abort') {\n // User can still paste an existing key at the credential step.\n await prompter.note(\n 'Registration was not completed. You can still paste an existing API key at the next prompt, or cancel the wizard.',\n 'Falling back to credential entry',\n )\n return\n }\n if (result === 'user-chose-paste') {\n // User picked the \"paste my existing key\" branch from inside the\n // register flow — they already acknowledged what's next, so don't\n // re-surface the generic fallback note. Fall through to the\n // credential step which will prompt for the key.\n return\n }\n return result\n } catch (err) {\n if (err instanceof WizardCancelledError) throw err\n await prompter.note(\n `${err instanceof Error ? err.message : String(err)}`,\n 'Registration flow failed',\n )\n return\n }\n },\n\n credentials: [\n {\n inputKey: 'token',\n providerHint: 'agentchat',\n credentialLabel: 'API key',\n preferredEnvVar: 'AGENTCHAT_API_KEY',\n envPrompt: 'AGENTCHAT_API_KEY detected in env. Use it?',\n keepPrompt: 'AgentChat API key already configured. Keep it?',\n inputPrompt: 'Paste your AgentChat API key (ac_live_…)',\n helpTitle: 'AgentChat API key',\n helpLines: [\n 'Format: ac_live_<base64>, ≥20 chars. Validated against',\n 'GET /v1/agents/me during this wizard — bad keys fail fast instead',\n 'of flapping reconnects at runtime.',\n ],\n allowEnv: () => true,\n shouldPrompt: ({ credentialValues, currentValue }) => {\n // Post-register: we already minted + persisted the key in prepare.\n if (credentialValues[JUST_REGISTERED_SENTINEL] === '1') return false\n // No key yet: always prompt.\n if (!currentValue) return true\n // Existing key + user didn't choose register: show keep/replace.\n return true\n },\n inspect: ({ cfg, accountId }) => {\n const apiKey = readAgentchatConfigField(cfg, accountId, 'apiKey')\n const configured = isApiKeyPresent(apiKey)\n const envValue = process.env.AGENTCHAT_API_KEY?.trim()\n return {\n accountConfigured: configured,\n hasConfiguredValue: configured,\n resolvedValue: configured ? apiKey : undefined,\n envValue: envValue && envValue.length >= MIN_API_KEY_LENGTH ? envValue : undefined,\n }\n },\n },\n ],\n\n finalize: async ({ cfg, accountId, credentialValues, prompter }) => {\n const apiKey =\n typeof credentialValues.token === 'string' && credentialValues.token.length >= MIN_API_KEY_LENGTH\n ? credentialValues.token\n : readAgentchatConfigField(cfg, accountId, 'apiKey')\n\n if (!apiKey || !isApiKeyPresent(apiKey)) {\n // Nothing to validate — prepare aborted and credential step got skipped\n // or the user bailed mid-flow. The `configure` call above will still\n // write whatever cfg we return; nothing more to do here.\n return\n }\n\n const apiBase = readAgentchatConfigField(cfg, accountId, 'apiBase')\n const spinner = prompter.progress('Validating API key against AgentChat…')\n try {\n const result = await validateApiKey(apiKey, { apiBase })\n if (result.ok) {\n spinner.stop(`Authenticated as @${result.agent.handle}`)\n\n // If the wizard registered fresh, agentHandle is already in cfg.\n // If the user pasted an existing key, capture the server-known handle\n // so status/log lines render nicely without a manual config edit.\n const existingHandle = readAgentchatConfigField(cfg, accountId, 'agentHandle')\n if (!existingHandle && isValidHandleShape(result.agent.handle)) {\n return {\n cfg: applyAgentchatAccountPatch(cfg, accountId, {\n agentHandle: result.agent.handle,\n }),\n }\n }\n return\n }\n\n spinner.stop(`API key did not pass the live check (${result.reason})`)\n await prompter.note(\n [\n result.message,\n '',\n 'The config was saved — you can re-run `openclaw channels add agentchat`',\n 'to replace the key, or edit ~/.openclaw/config.yaml directly.',\n ].join('\\n'),\n 'AgentChat validation warning',\n )\n } catch (err) {\n spinner.stop('Could not reach AgentChat for validation')\n await prompter.note(\n [\n err instanceof Error ? err.message : String(err),\n '',\n 'The config was saved — the runtime will retry on startup.',\n ].join('\\n'),\n 'AgentChat API unreachable',\n )\n }\n return\n },\n\n completionNote: {\n title: 'AgentChat is ready',\n lines: [\n 'Next steps:',\n ' • Start OpenClaw — the AgentChat channel auto-connects via WebSocket.',\n ' • DM another agent: @<handle> <message>',\n ' • Docs: https://agentchat.me/docs',\n ],\n },\n\n disable: (cfg) => setSetupChannelEnabled(cfg, AGENTCHAT_CHANNEL_ID, false),\n}\n","/**\n * Zod schema for AgentChat channel config.\n *\n * Source of truth: this file. The JSON Schema inlined in `openclaw.plugin.json`\n * MUST stay in sync (P1 adds a build step that emits it via zod-to-json-schema).\n *\n * `.strict()` rejects unknown keys — a common source of \"the config silently\n * ignored my setting\" bugs.\n */\n\nimport { z } from 'zod'\n\nexport const reconnectConfigSchema = z\n .object({\n initialBackoffMs: z.number().int().min(100).max(10_000).default(1_000),\n maxBackoffMs: z.number().int().min(1_000).max(300_000).default(30_000),\n jitterRatio: z.number().min(0).max(1).default(0.2),\n })\n .strict()\n\nexport const pingConfigSchema = z\n .object({\n intervalMs: z.number().int().min(5_000).max(120_000).default(30_000),\n timeoutMs: z.number().int().min(1_000).max(30_000).default(10_000),\n })\n .strict()\n\nexport const outboundConfigSchema = z\n .object({\n maxInFlight: z.number().int().min(1).max(10_000).default(256),\n sendTimeoutMs: z.number().int().min(1_000).max(60_000).default(15_000),\n })\n .strict()\n\nexport const observabilityConfigSchema = z\n .object({\n logLevel: z.enum(['trace', 'debug', 'info', 'warn', 'error']).default('info'),\n redactKeys: z\n .array(z.string())\n .default(['apiKey', 'authorization', 'cookie', 'set-cookie']),\n })\n .strict()\n\nexport const agentHandleSchema = z\n .string()\n .regex(\n /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/,\n 'handle must be lowercase letters/digits/hyphens; start with a letter; no trailing or doubled hyphens',\n )\n .min(3, 'handle must be at least 3 characters')\n .max(30, 'handle must be at most 30 characters')\n\nexport const agentchatChannelConfigSchema = z\n .object({\n apiBase: z.string().url().default('https://api.agentchat.me'),\n apiKey: z.string().min(20, 'apiKey looks too short for an AgentChat API key'),\n agentHandle: agentHandleSchema.optional(),\n // `.prefault({})` — Zod 4 idiom: when the key is missing from input, parse\n // `{}` through the inner schema so its own per-field defaults kick in.\n // Using `.default({})` here fails in Zod 4 because the output type's fields\n // are non-optional once the inner schema has defaults.\n reconnect: reconnectConfigSchema.prefault({}),\n ping: pingConfigSchema.prefault({}),\n outbound: outboundConfigSchema.prefault({}),\n observability: observabilityConfigSchema.prefault({}),\n })\n .strict()\n\nexport type AgentchatChannelConfig = z.infer<typeof agentchatChannelConfigSchema>\nexport type AgentchatChannelConfigInput = z.input<typeof agentchatChannelConfigSchema>\n\n/**\n * Parse + validate config at plugin startup.\n *\n * Fails fast on invalid config rather than waiting until the first request.\n * The `AgentChatChannelError` wrapper makes validation failures classifiable\n * by the gateway's error handler (`terminal-user` — operator fix required).\n */\nexport function parseChannelConfig(input: unknown): AgentchatChannelConfig {\n return agentchatChannelConfigSchema.parse(input)\n}\n","/**\n * AgentChat channel plugin — entry point.\n *\n * Wires the real OpenClaw SDK contracts — builds a\n * `ChannelPlugin<AgentchatResolvedAccount>` with id / meta / capabilities /\n * config-adapter / config-schema / setup + setupWizard, and wraps it via\n * `defineChannelPluginEntry(...)` for OpenClaw's extension loader.\n *\n * Config adapter supports both:\n * - single-account flat form: `channels.agentchat.{ apiKey, apiBase, ... }`\n * - multi-account form: `channels.agentchat.accounts.<id>.{ apiKey, ... }`\n *\n * Loaded by OpenClaw via `package.json`'s `openclaw.extensions` entry.\n */\n\nimport {\n buildChannelConfigSchema,\n defineChannelPluginEntry,\n type ChannelConfigUiHint,\n type ChannelPlugin,\n} from 'openclaw/plugin-sdk/channel-core'\n\nimport {\n AGENTCHAT_CHANNEL_ID,\n AGENTCHAT_DEFAULT_ACCOUNT_ID,\n MIN_API_KEY_LENGTH,\n applyAgentchatAccountPatch,\n isApiKeyPresent,\n readAccountRaw,\n readChannelSection,\n splitEnabledFromRaw,\n} from './channel-account.js'\nimport { agentchatSetupWizard } from './channel.wizard.js'\nimport {\n agentchatChannelConfigSchema,\n parseChannelConfig,\n type AgentchatChannelConfig,\n} from './config-schema.js'\nimport { validateApiKey } from './setup-client.js'\n\nexport {\n AGENTCHAT_CHANNEL_ID,\n AGENTCHAT_DEFAULT_ACCOUNT_ID,\n MIN_API_KEY_LENGTH,\n applyAgentchatAccountPatch,\n isApiKeyPresent,\n readAgentchatConfigField,\n} from './channel-account.js'\n\nexport interface AgentchatResolvedAccount {\n accountId: string\n enabled: boolean\n configured: boolean\n config: AgentchatChannelConfig | null\n parseError: string | null\n}\n\nconst uiHints: Record<string, ChannelConfigUiHint> = {\n apiKey: {\n label: 'AgentChat API key',\n placeholder: 'ac_live_...',\n sensitive: true,\n help: 'The setup wizard registers you via email OTP and mints a key — or paste an existing ac_live_… key.',\n },\n apiBase: {\n label: 'API base URL',\n placeholder: 'https://api.agentchat.me',\n help: 'Override only when targeting a self-hosted AgentChat instance.',\n advanced: true,\n },\n agentHandle: {\n label: 'Agent handle',\n placeholder: 'my-agent',\n help: '3–30 chars, lowercase letters/digits/hyphens; must start with a letter.',\n },\n reconnect: { label: 'Reconnect backoff', advanced: true },\n ping: { label: 'WebSocket ping cadence', advanced: true },\n outbound: { label: 'Outbound send tuning', advanced: true },\n observability: { label: 'Logs & metrics', advanced: true },\n}\n\nexport const agentchatPlugin: ChannelPlugin<AgentchatResolvedAccount> = {\n id: AGENTCHAT_CHANNEL_ID,\n\n meta: {\n id: AGENTCHAT_CHANNEL_ID,\n label: 'AgentChat',\n selectionLabel: 'AgentChat (messaging platform for agents)',\n detailLabel: 'AgentChat',\n docsPath: '/channels/agentchat',\n docsLabel: 'agentchat',\n blurb:\n 'connect your agent to the AgentChat messaging platform — handles, contacts, groups, presence, attachments.',\n systemImage: 'message',\n markdownCapable: true,\n order: 100,\n },\n\n capabilities: {\n chatTypes: ['direct', 'group'],\n media: true,\n reactions: false,\n edit: false,\n unsend: true,\n reply: true,\n threads: false,\n nativeCommands: false,\n },\n\n reload: {\n configPrefixes: [`channels.${AGENTCHAT_CHANNEL_ID}.`],\n },\n\n configSchema: buildChannelConfigSchema(agentchatChannelConfigSchema, { uiHints }),\n\n setupWizard: agentchatSetupWizard,\n\n config: {\n listAccountIds(cfg) {\n const section = readChannelSection(cfg)\n if (!section) return []\n const { accounts } = section\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n const ids = Object.keys(accounts as Record<string, unknown>)\n if (ids.length > 0) return ids\n }\n const hasFlatFields =\n typeof section.apiKey === 'string' ||\n typeof section.apiBase === 'string' ||\n typeof section.agentHandle === 'string'\n return hasFlatFields ? [AGENTCHAT_DEFAULT_ACCOUNT_ID] : []\n },\n\n resolveAccount(cfg, accountId) {\n const id = accountId ?? AGENTCHAT_DEFAULT_ACCOUNT_ID\n const section = readChannelSection(cfg)\n const raw = readAccountRaw(section, id)\n const { enabled, forParse } = splitEnabledFromRaw(raw)\n let config: AgentchatChannelConfig | null = null\n let parseError: string | null = null\n if (forParse && Object.keys(forParse).length > 0) {\n try {\n config = parseChannelConfig(forParse)\n } catch (e) {\n parseError = e instanceof Error ? e.message : String(e)\n }\n }\n const configured = Boolean(config && isApiKeyPresent(config.apiKey))\n return { accountId: id, enabled, configured, config, parseError }\n },\n\n defaultAccountId() {\n return AGENTCHAT_DEFAULT_ACCOUNT_ID\n },\n\n isEnabled(account) {\n return account.enabled\n },\n\n disabledReason(account) {\n return account.enabled ? '' : 'channel disabled via channels.agentchat.enabled=false'\n },\n\n isConfigured(account) {\n return account.configured\n },\n\n unconfiguredReason(account) {\n if (account.parseError) return `config invalid: ${account.parseError}`\n if (!account.config) return 'missing channels.agentchat configuration'\n if (!isApiKeyPresent(account.config.apiKey)) return 'missing or too-short channels.agentchat.apiKey'\n return ''\n },\n\n hasConfiguredState({ cfg }) {\n const section = readChannelSection(cfg)\n if (!section) return false\n const { accounts } = section\n if (accounts && typeof accounts === 'object' && !Array.isArray(accounts)) {\n for (const entry of Object.values(accounts as Record<string, unknown>)) {\n if (entry && typeof entry === 'object') {\n const candidate = (entry as Record<string, unknown>).apiKey\n if (isApiKeyPresent(candidate)) return true\n }\n }\n }\n return isApiKeyPresent(section.apiKey)\n },\n\n describeAccount(account) {\n return {\n accountId: account.accountId,\n enabled: account.enabled,\n configured: account.configured,\n linked: account.configured,\n }\n },\n },\n\n setup: {\n /**\n * Pre-write gate: cheap, sync check that the caller supplied an API key\n * that's at least plausibly shaped. Real authentication happens in\n * `afterAccountConfigWritten` via a live /agents/me probe.\n */\n validateInput({ input }) {\n if (typeof input.token !== 'string' || input.token.trim().length === 0) {\n return 'apiKey is required — pass via --token or run the register flow'\n }\n if (input.token.length < MIN_API_KEY_LENGTH) {\n return `apiKey looks too short (got ${input.token.length} chars, expect ≥${MIN_API_KEY_LENGTH})`\n }\n if (typeof input.url === 'string' && input.url.length > 0) {\n try {\n const parsed = new URL(input.url)\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n return 'apiBase must be http(s) — e.g. https://api.agentchat.me'\n }\n } catch {\n return 'apiBase is not a valid URL'\n }\n }\n return null\n },\n\n applyAccountConfig({ cfg, accountId, input }) {\n const patch: Record<string, unknown> = {}\n if (typeof input.token === 'string' && input.token.length > 0) patch.apiKey = input.token\n if (typeof input.url === 'string' && input.url.length > 0) patch.apiBase = input.url\n return applyAgentchatAccountPatch(cfg, accountId, patch)\n },\n\n /**\n * Post-write probe: call `GET /v1/agents/me` with the key we just wrote\n * so the operator sees a clear \"✓ authenticated as @handle\" on success\n * — or a specific failure reason (invalid, revoked, unreachable) they\n * can act on *before* the runtime starts flapping reconnects in prod.\n *\n * Never throws: setup-time UX is \"warn and proceed\". If the probe can't\n * reach the API (airgapped CI, corp proxy during first boot), we still\n * want the config written so the user can retry without reconfiguring.\n */\n async afterAccountConfigWritten({ cfg, accountId, input, runtime }) {\n const apiKey = typeof input.token === 'string' ? input.token : undefined\n if (!apiKey) return\n const apiBase = typeof input.url === 'string' && input.url.length > 0 ? input.url : undefined\n void cfg\n const logger = (runtime as { logger?: { info?: (...args: unknown[]) => void; warn?: (...args: unknown[]) => void } } | undefined)?.logger\n try {\n const result = await validateApiKey(apiKey, { apiBase })\n if (result.ok) {\n logger?.info?.(\n `[agentchat:${accountId}] authenticated as @${result.agent.handle} (${result.agent.email})`,\n )\n } else {\n logger?.warn?.(\n `[agentchat:${accountId}] api key did not pass live check (${result.reason}): ${result.message}`,\n )\n }\n } catch (err) {\n logger?.warn?.(\n `[agentchat:${accountId}] live key validation failed: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n },\n },\n}\n\n/**\n * Canonical channel-entry descriptor consumed by OpenClaw's extension loader.\n * Exported as `default` because `openclaw.extensions` in package.json points to\n * this module and the loader reads the default export.\n *\n * The explicit `ReturnType<...>` annotation pins the emitted `.d.ts` to the\n * function signature instead of the structural shape — otherwise the inferred\n * type references `ChannelConfigSchema` through a non-exported path and TS\n * fails with TS2742 (\"cannot be named without a reference to ...\").\n */\nexport const agentchatChannelEntry: ReturnType<\n typeof defineChannelPluginEntry<typeof agentchatPlugin>\n> = defineChannelPluginEntry({\n id: AGENTCHAT_CHANNEL_ID,\n name: 'AgentChat',\n description: 'Connect OpenClaw agents to the AgentChat messaging platform.',\n plugin: agentchatPlugin,\n})\n\nexport default agentchatChannelEntry\n\nexport { parseChannelConfig }\nexport type { AgentchatChannelConfig }\n","/**\n * AgentChat setup plugin — onboarding entry.\n *\n * Wraps the same `agentchatPlugin` from `channel.ts` with\n * `defineSetupPluginEntry(...)` so OpenClaw's setup-entry loader can pick it\n * up from `package.json`'s `openclaw.setupEntry` field.\n *\n * The plugin itself carries both:\n * - `plugin.setup` — the non-interactive adapter used by\n * `openclaw setup --channel agentchat --token …`\n * - `plugin.setupWizard` — the interactive login-vs-register wizard used by\n * `openclaw channels add agentchat`\n *\n * Both paths write through the same `applyAgentchatAccountPatch` helper, so\n * the resulting config is identical regardless of entry point.\n */\n\nimport { defineSetupPluginEntry } from 'openclaw/plugin-sdk/channel-core'\n\nimport { agentchatPlugin } from './channel.js'\n\nexport const agentchatSetupEntry = defineSetupPluginEntry(agentchatPlugin)\n\nexport default agentchatSetupEntry\n\nexport { agentchatPlugin as agentchatSetupPlugin }\n"]}
|
package/dist/setup-entry.d.cts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { d as agentchatSetupEntry, c as agentchatSetupPlugin, d as default } from './setup-entry-1vjPD1gu.cjs';
|
|
2
2
|
import 'openclaw/plugin-sdk/channel-core';
|
|
3
3
|
import 'zod';
|
package/dist/setup-entry.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { d as agentchatSetupEntry, c as agentchatSetupPlugin, d as default } from './setup-entry-1vjPD1gu.js';
|
|
2
2
|
import 'openclaw/plugin-sdk/channel-core';
|
|
3
3
|
import 'zod';
|