import type { DmPolicy } from "../../config/types.js"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; import type { RuntimeEnv } from "../../runtime.js"; import type { WizardPrompter } from "../../wizard/prompts.js"; import type { ChannelAccessPolicy } from "./setup-group-access.js"; import type { ChannelConfigAdapter, ChannelSetupAdapter } from "./types.adapters.js"; import type { ChannelCapabilities, ChannelId, ChannelMeta, ChannelSetupInput } from "./types.core.js"; export type ChannelSetupPlugin = { id: ChannelId; meta: ChannelMeta; capabilities: ChannelCapabilities; config: ChannelConfigAdapter; setup?: ChannelSetupAdapter; setupWizard?: ChannelSetupWizard | ChannelSetupWizardAdapter; }; export type ChannelSetupWizardStatus = { configuredLabel: string; unconfiguredLabel: string; configuredHint?: string; unconfiguredHint?: string; configuredScore?: number; unconfiguredScore?: number; resolveConfigured: (params: { cfg: OpenClawConfig; accountId?: string; }) => boolean | Promise; resolveStatusLines?: (params: { cfg: OpenClawConfig; accountId?: string; configured: boolean; }) => string[] | Promise; resolveSelectionHint?: (params: { cfg: OpenClawConfig; accountId?: string; configured: boolean; }) => string | undefined | Promise; resolveQuickstartScore?: (params: { cfg: OpenClawConfig; accountId?: string; configured: boolean; }) => number | undefined | Promise; }; export type ChannelSetupWizardCredentialState = { accountConfigured: boolean; hasConfiguredValue: boolean; resolvedValue?: string; envValue?: string; }; export type ChannelSetupWizardCredentialValues = Partial>; export type ChannelSetupWizardNote = { title: string; lines: string[]; shouldShow?: (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; }) => boolean | Promise; }; export type ChannelSetupWizardEnvShortcut = { prompt: string; preferredEnvVar?: string; isAvailable: (params: { cfg: OpenClawConfig; accountId: string; }) => boolean; apply: (params: { cfg: OpenClawConfig; accountId: string; }) => OpenClawConfig | Promise; }; export type ChannelSetupWizardCredential = { inputKey: keyof ChannelSetupInput; providerHint: string; credentialLabel: string; preferredEnvVar?: string; helpTitle?: string; helpLines?: string[]; envPrompt: string; keepPrompt: string; inputPrompt: string; allowEnv?: (params: { cfg: OpenClawConfig; accountId: string; }) => boolean; inspect: (params: { cfg: OpenClawConfig; accountId: string; }) => ChannelSetupWizardCredentialState; shouldPrompt?: (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; currentValue?: string; state: ChannelSetupWizardCredentialState; }) => boolean | Promise; applyUseEnv?: (params: { cfg: OpenClawConfig; accountId: string; }) => OpenClawConfig | Promise; applySet?: (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; value: unknown; resolvedValue: string; }) => OpenClawConfig | Promise; }; export type ChannelSetupWizardTextInput = { inputKey: keyof ChannelSetupInput; message: string; placeholder?: string; required?: boolean; applyEmptyValue?: boolean; helpTitle?: string; helpLines?: string[]; confirmCurrentValue?: boolean; keepPrompt?: string | ((value: string) => string); currentValue?: (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; }) => string | undefined | Promise; initialValue?: (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; }) => string | undefined | Promise; shouldPrompt?: (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; currentValue?: string; }) => boolean | Promise; applyCurrentValue?: boolean; validate?: (params: { value: string; cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; }) => string | undefined; normalizeValue?: (params: { value: string; cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; }) => string; applySet?: (params: { cfg: OpenClawConfig; accountId: string; value: string; }) => OpenClawConfig | Promise; }; export type ChannelSetupWizardAllowFromEntry = { input: string; resolved: boolean; id: string | null; }; export type ChannelSetupWizardAllowFrom = { helpTitle?: string; helpLines?: string[]; credentialInputKey?: keyof ChannelSetupInput; message: string; placeholder: string; invalidWithoutCredentialNote: string; parseInputs?: (raw: string) => string[]; parseId: (raw: string) => string | null; resolveEntries: (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; entries: string[]; }) => Promise; apply: (params: { cfg: OpenClawConfig; accountId: string; allowFrom: string[]; }) => OpenClawConfig | Promise; }; export type ChannelSetupWizardGroupAccess = { label: string; placeholder: string; helpTitle?: string; helpLines?: string[]; skipAllowlistEntries?: boolean; currentPolicy: (params: { cfg: OpenClawConfig; accountId: string; }) => ChannelAccessPolicy; currentEntries: (params: { cfg: OpenClawConfig; accountId: string; }) => string[]; updatePrompt: (params: { cfg: OpenClawConfig; accountId: string; }) => boolean; setPolicy: (params: { cfg: OpenClawConfig; accountId: string; policy: ChannelAccessPolicy; }) => OpenClawConfig; resolveAllowlist?: (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; entries: string[]; prompter: Pick; }) => Promise; applyAllowlist?: (params: { cfg: OpenClawConfig; accountId: string; resolved: unknown; }) => OpenClawConfig; }; export type ChannelSetupWizardPrepare = (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; runtime: ChannelSetupConfigureContext["runtime"]; prompter: WizardPrompter; options?: ChannelSetupConfigureContext["options"]; }) => { cfg?: OpenClawConfig; credentialValues?: ChannelSetupWizardCredentialValues; } | void | Promise<{ cfg?: OpenClawConfig; credentialValues?: ChannelSetupWizardCredentialValues; } | void>; export type ChannelSetupWizardFinalize = (params: { cfg: OpenClawConfig; accountId: string; credentialValues: ChannelSetupWizardCredentialValues; runtime: ChannelSetupConfigureContext["runtime"]; prompter: WizardPrompter; options?: ChannelSetupConfigureContext["options"]; forceAllowFrom: boolean; }) => { cfg?: OpenClawConfig; credentialValues?: ChannelSetupWizardCredentialValues; } | void | Promise<{ cfg?: OpenClawConfig; credentialValues?: ChannelSetupWizardCredentialValues; } | void>; export type ChannelSetupWizard = { channel: string; status: ChannelSetupWizardStatus; introNote?: ChannelSetupWizardNote; envShortcut?: ChannelSetupWizardEnvShortcut; resolveAccountIdForConfigure?: (params: { cfg: OpenClawConfig; prompter: WizardPrompter; options?: ChannelSetupConfigureContext["options"]; accountOverride?: string; shouldPromptAccountIds: boolean; listAccountIds: ChannelSetupPlugin["config"]["listAccountIds"]; defaultAccountId: string; }) => string | Promise; resolveShouldPromptAccountIds?: (params: { cfg: OpenClawConfig; options?: ChannelSetupConfigureContext["options"]; shouldPromptAccountIds: boolean; }) => boolean; prepare?: ChannelSetupWizardPrepare; stepOrder?: "credentials-first" | "text-first"; credentials: ChannelSetupWizardCredential[]; textInputs?: ChannelSetupWizardTextInput[]; finalize?: ChannelSetupWizardFinalize; completionNote?: ChannelSetupWizardNote; dmPolicy?: ChannelSetupDmPolicy; allowFrom?: ChannelSetupWizardAllowFrom; groupAccess?: ChannelSetupWizardGroupAccess; disable?: (cfg: OpenClawConfig) => OpenClawConfig; onAccountRecorded?: ChannelSetupWizardAdapter["onAccountRecorded"]; }; export type SetupChannelsOptions = { allowDisable?: boolean; allowSignalInstall?: boolean; onSelection?: (selection: ChannelId[]) => void; onPostWriteHook?: (hook: ChannelOnboardingPostWriteHook) => void; accountIds?: Partial>; onAccountId?: (channel: ChannelId, accountId: string) => void; onResolvedPlugin?: (channel: ChannelId, plugin: ChannelSetupPlugin) => void; promptAccountIds?: boolean; forceAllowFromChannels?: ChannelId[]; deferStatusUntilSelection?: boolean; skipStatusNote?: boolean; skipDmPolicyPrompt?: boolean; skipConfirm?: boolean; quickstartDefaults?: boolean; initialSelection?: ChannelId[]; secretInputMode?: "plaintext" | "ref"; }; export type PromptAccountIdParams = { cfg: OpenClawConfig; prompter: WizardPrompter; label: string; currentId?: string; listAccountIds: (cfg: OpenClawConfig) => string[]; defaultAccountId: string; }; export type PromptAccountId = (params: PromptAccountIdParams) => Promise; export type ChannelSetupStatus = { channel: ChannelId; configured: boolean; statusLines: string[]; selectionHint?: string; quickstartScore?: number; }; export type ChannelSetupStatusContext = { cfg: OpenClawConfig; options?: SetupChannelsOptions; accountOverrides: Partial>; }; export type ChannelSetupConfigureContext = { cfg: OpenClawConfig; runtime: RuntimeEnv; prompter: WizardPrompter; options?: SetupChannelsOptions; accountOverrides: Partial>; shouldPromptAccountIds: boolean; forceAllowFrom: boolean; }; export type ChannelOnboardingPostWriteContext = { previousCfg: OpenClawConfig; cfg: OpenClawConfig; accountId: string; runtime: RuntimeEnv; }; export type ChannelOnboardingPostWriteHook = { channel: ChannelId; accountId: string; run: (ctx: { cfg: OpenClawConfig; runtime: RuntimeEnv; }) => Promise | void; }; export type ChannelSetupResult = { cfg: OpenClawConfig; accountId?: string; }; export type ChannelSetupConfiguredResult = ChannelSetupResult | "skip"; export type ChannelSetupInteractiveContext = ChannelSetupConfigureContext & { configured: boolean; label: string; }; export type ChannelSetupDmPolicy = { label: string; channel: ChannelId; policyKey: string; allowFromKey: string; resolveConfigKeys?: (cfg: OpenClawConfig, accountId?: string) => { policyKey: string; allowFromKey: string; }; getCurrent: (cfg: OpenClawConfig, accountId?: string) => DmPolicy; setPolicy: (cfg: OpenClawConfig, policy: DmPolicy, accountId?: string) => OpenClawConfig; promptAllowFrom?: (params: { cfg: OpenClawConfig; prompter: WizardPrompter; accountId?: string; }) => Promise; }; export type ChannelSetupWizardAdapter = { channel: ChannelId; getStatus: (ctx: ChannelSetupStatusContext) => Promise; configure: (ctx: ChannelSetupConfigureContext) => Promise; configureInteractive?: (ctx: ChannelSetupInteractiveContext) => Promise; configureWhenConfigured?: (ctx: ChannelSetupInteractiveContext) => Promise; afterConfigWritten?: (ctx: ChannelOnboardingPostWriteContext) => Promise | void; dmPolicy?: ChannelSetupDmPolicy; onAccountRecorded?: (accountId: string, options?: SetupChannelsOptions) => void; disable?: (cfg: OpenClawConfig) => OpenClawConfig; };