Channels: move onboarding adapters into extensions

This commit is contained in:
Peter Steinberger 2026-03-15 15:58:31 -07:00
parent 392ddb56e2
commit 8b001d6e4d
No known key found for this signature in database
18 changed files with 90 additions and 71 deletions

View File

@ -5,9 +5,9 @@ import type {
import { configureChannelAccessWithAllowlist } from "../../../src/channels/plugins/onboarding/channel-access-configure.js";
import {
applySingleTokenPromptResult,
parseMentionOrPrefixedId,
noteChannelLookupFailure,
noteChannelLookupSummary,
parseMentionOrPrefixedId,
patchChannelConfigForAccount,
promptLegacyChannelAllowFrom,
resolveAccountIdForConfigure,

View File

@ -1,14 +1,7 @@
import {
listIMessageAccountIds,
resolveDefaultIMessageAccountId,
resolveIMessageAccount,
} from "../../../../extensions/imessage/src/accounts.js";
import { normalizeIMessageHandle } from "../../../../extensions/imessage/src/targets.js";
import { detectBinary } from "../../../commands/onboard-helpers.js";
import type { OpenClawConfig } from "../../../config/config.js";
import { formatDocsLink } from "../../../terminal/links.js";
import type { WizardPrompter } from "../../../wizard/prompts.js";
import type { ChannelOnboardingAdapter, ChannelOnboardingDmPolicy } from "../onboarding-types.js";
import type {
ChannelOnboardingAdapter,
ChannelOnboardingDmPolicy,
} from "../../../src/channels/plugins/onboarding-types.js";
import {
parseOnboardingEntriesAllowingWildcard,
patchChannelConfigForAccount,
@ -16,7 +9,17 @@ import {
resolveAccountIdForConfigure,
setChannelDmPolicyWithAllowFrom,
setOnboardingChannelEnabled,
} from "./helpers.js";
} from "../../../src/channels/plugins/onboarding/helpers.js";
import { detectBinary } from "../../../src/commands/onboard-helpers.js";
import type { OpenClawConfig } from "../../../src/config/config.js";
import { formatDocsLink } from "../../../src/terminal/links.js";
import type { WizardPrompter } from "../../../src/wizard/prompts.js";
import {
listIMessageAccountIds,
resolveDefaultIMessageAccountId,
resolveIMessageAccount,
} from "./accounts.js";
import { normalizeIMessageHandle } from "./targets.js";
const channel = "imessage" as const;

View File

@ -1,17 +1,27 @@
import type {
ChannelOnboardingAdapter,
ChannelOnboardingDmPolicy,
} from "../../../src/channels/plugins/onboarding-types.js";
import {
parseOnboardingEntriesAllowingWildcard,
patchChannelConfigForAccount,
promptParsedAllowFromForScopedChannel,
resolveAccountIdForConfigure,
setChannelDmPolicyWithAllowFrom,
setOnboardingChannelEnabled,
} from "../../../src/channels/plugins/onboarding/helpers.js";
import { formatCliCommand } from "../../../src/cli/command-format.js";
import { detectBinary } from "../../../src/commands/onboard-helpers.js";
import { installSignalCli } from "../../../src/commands/signal-install.js";
import type { OpenClawConfig } from "../../../src/config/config.js";
import { formatDocsLink } from "../../../src/terminal/links.js";
import { normalizeE164 } from "../../../src/utils.js";
import type { WizardPrompter } from "../../../src/wizard/prompts.js";
import {
listSignalAccountIds,
resolveDefaultSignalAccountId,
resolveSignalAccount,
} from "../../../../extensions/signal/src/accounts.js";
import { formatCliCommand } from "../../../cli/command-format.js";
import { detectBinary } from "../../../commands/onboard-helpers.js";
import { installSignalCli } from "../../../commands/signal-install.js";
import type { OpenClawConfig } from "../../../config/config.js";
import { formatDocsLink } from "../../../terminal/links.js";
import { normalizeE164 } from "../../../utils.js";
import type { WizardPrompter } from "../../../wizard/prompts.js";
import type { ChannelOnboardingAdapter, ChannelOnboardingDmPolicy } from "../onboarding-types.js";
import * as onboardingHelpers from "./helpers.js";
} from "./accounts.js";
const channel = "signal" as const;
const MIN_E164_DIGITS = 5;
@ -41,7 +51,7 @@ function isUuidLike(value: string): boolean {
}
export function parseSignalAllowFromEntries(raw: string): { entries: string[]; error?: string } {
return onboardingHelpers.parseOnboardingEntriesAllowingWildcard(raw, (entry) => {
return parseOnboardingEntriesAllowingWildcard(raw, (entry) => {
if (entry.toLowerCase().startsWith("uuid:")) {
const id = entry.slice("uuid:".length).trim();
if (!id) {
@ -65,7 +75,7 @@ async function promptSignalAllowFrom(params: {
prompter: WizardPrompter;
accountId?: string;
}): Promise<OpenClawConfig> {
return onboardingHelpers.promptParsedAllowFromForScopedChannel({
return promptParsedAllowFromForScopedChannel({
cfg: params.cfg,
channel: "signal",
accountId: params.accountId,
@ -97,7 +107,7 @@ const dmPolicy: ChannelOnboardingDmPolicy = {
allowFromKey: "channels.signal.allowFrom",
getCurrent: (cfg) => cfg.channels?.signal?.dmPolicy ?? "pairing",
setPolicy: (cfg, policy) =>
onboardingHelpers.setChannelDmPolicyWithAllowFrom({
setChannelDmPolicyWithAllowFrom({
cfg,
channel: "signal",
dmPolicy: policy,
@ -133,7 +143,7 @@ export const signalOnboardingAdapter: ChannelOnboardingAdapter = {
options,
}) => {
const defaultSignalAccountId = resolveDefaultSignalAccountId(cfg);
const signalAccountId = await onboardingHelpers.resolveAccountIdForConfigure({
const signalAccountId = await resolveAccountIdForConfigure({
cfg,
prompter,
label: "Signal",
@ -216,7 +226,7 @@ export const signalOnboardingAdapter: ChannelOnboardingAdapter = {
}
if (account) {
next = onboardingHelpers.patchChannelConfigForAccount({
next = patchChannelConfigForAccount({
cfg: next,
channel: "signal",
accountId: signalAccountId,
@ -240,5 +250,5 @@ export const signalOnboardingAdapter: ChannelOnboardingAdapter = {
return { cfg: next, accountId: signalAccountId };
},
dmPolicy,
disable: (cfg) => onboardingHelpers.setOnboardingChannelEnabled(cfg, channel, false),
disable: (cfg) => setOnboardingChannelEnabled(cfg, channel, false),
};

View File

@ -1,22 +1,12 @@
import { inspectSlackAccount } from "../../../../extensions/slack/src/account-inspect.js";
import type {
ChannelOnboardingAdapter,
ChannelOnboardingDmPolicy,
} from "../../../src/channels/plugins/onboarding-types.js";
import { configureChannelAccessWithAllowlist } from "../../../src/channels/plugins/onboarding/channel-access-configure.js";
import {
listSlackAccountIds,
resolveDefaultSlackAccountId,
resolveSlackAccount,
} from "../../../../extensions/slack/src/accounts.js";
import { resolveSlackChannelAllowlist } from "../../../../extensions/slack/src/resolve-channels.js";
import { resolveSlackUserAllowlist } from "../../../../extensions/slack/src/resolve-users.js";
import type { OpenClawConfig } from "../../../config/config.js";
import { hasConfiguredSecretInput } from "../../../config/types.secrets.js";
import { DEFAULT_ACCOUNT_ID } from "../../../routing/session-key.js";
import { formatDocsLink } from "../../../terminal/links.js";
import type { WizardPrompter } from "../../../wizard/prompts.js";
import type { ChannelOnboardingAdapter, ChannelOnboardingDmPolicy } from "../onboarding-types.js";
import { configureChannelAccessWithAllowlist } from "./channel-access-configure.js";
import {
parseMentionOrPrefixedId,
noteChannelLookupFailure,
noteChannelLookupSummary,
parseMentionOrPrefixedId,
patchChannelConfigForAccount,
promptLegacyChannelAllowFrom,
resolveAccountIdForConfigure,
@ -25,7 +15,20 @@ import {
setAccountGroupPolicyForChannel,
setLegacyChannelDmPolicyWithAllowFrom,
setOnboardingChannelEnabled,
} from "./helpers.js";
} from "../../../src/channels/plugins/onboarding/helpers.js";
import type { OpenClawConfig } from "../../../src/config/config.js";
import { hasConfiguredSecretInput } from "../../../src/config/types.secrets.js";
import { DEFAULT_ACCOUNT_ID } from "../../../src/routing/session-key.js";
import { formatDocsLink } from "../../../src/terminal/links.js";
import type { WizardPrompter } from "../../../src/wizard/prompts.js";
import { inspectSlackAccount } from "./account-inspect.js";
import {
listSlackAccountIds,
resolveDefaultSlackAccountId,
resolveSlackAccount,
} from "./accounts.js";
import { resolveSlackChannelAllowlist } from "./resolve-channels.js";
import { resolveSlackUserAllowlist } from "./resolve-users.js";
const channel = "slack" as const;

View File

@ -5,8 +5,8 @@ import type {
import {
applySingleTokenPromptResult,
patchChannelConfigForAccount,
promptSingleChannelSecretInput,
promptResolvedAllowFrom,
promptSingleChannelSecretInput,
resolveAccountIdForConfigure,
resolveOnboardingAccountId,
setChannelDmPolicyWithAllowFrom,

View File

@ -1,2 +0,0 @@
// Shim: re-exports from extension
export * from "../../../../extensions/discord/src/onboarding.js";

View File

@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { parseIMessageAllowFromEntries } from "./imessage.js";
import { parseIMessageAllowFromEntries } from "../../../../extensions/imessage/src/onboarding.js";
describe("parseIMessageAllowFromEntries", () => {
it("parses handles and chat targets", () => {

View File

@ -1,5 +1,8 @@
import { describe, expect, it } from "vitest";
import { normalizeSignalAccountInput, parseSignalAllowFromEntries } from "./signal.js";
import {
normalizeSignalAccountInput,
parseSignalAllowFromEntries,
} from "../../../../extensions/signal/src/onboarding.js";
describe("normalizeSignalAccountInput", () => {
it("normalizes valid E.164 numbers", () => {

View File

@ -1 +0,0 @@
export * from "../../../../extensions/telegram/src/onboarding.js";

View File

@ -1,2 +0,0 @@
// Shim: re-exports from extensions/whatsapp/src/onboarding.ts
export * from "../../../../extensions/whatsapp/src/onboarding.js";

View File

@ -1,8 +1,8 @@
import { describe, expect, it, vi } from "vitest";
import { normalizeSignalAccountInput } from "../../../extensions/signal/src/onboarding.js";
import type { OpenClawConfig } from "../../config/config.js";
import { normalizeIMessageMessagingTarget } from "./normalize/imessage.js";
import { looksLikeSignalTargetId, normalizeSignalMessagingTarget } from "./normalize/signal.js";
import { normalizeSignalAccountInput } from "./onboarding/signal.js";
import { telegramOutbound } from "./outbound/telegram.js";
import { whatsappOutbound } from "./outbound/whatsapp.js";

View File

@ -1,10 +1,10 @@
import { discordOnboardingAdapter } from "../../../extensions/discord/src/onboarding.js";
import { imessageOnboardingAdapter } from "../../../extensions/imessage/src/onboarding.js";
import { signalOnboardingAdapter } from "../../../extensions/signal/src/onboarding.js";
import { slackOnboardingAdapter } from "../../../extensions/slack/src/onboarding.js";
import { telegramOnboardingAdapter } from "../../../extensions/telegram/src/onboarding.js";
import { whatsappOnboardingAdapter } from "../../../extensions/whatsapp/src/onboarding.js";
import { listChannelPlugins } from "../../channels/plugins/index.js";
import { discordOnboardingAdapter } from "../../channels/plugins/onboarding/discord.js";
import { imessageOnboardingAdapter } from "../../channels/plugins/onboarding/imessage.js";
import { signalOnboardingAdapter } from "../../channels/plugins/onboarding/signal.js";
import { slackOnboardingAdapter } from "../../channels/plugins/onboarding/slack.js";
import { telegramOnboardingAdapter } from "../../channels/plugins/onboarding/telegram.js";
import { whatsappOnboardingAdapter } from "../../channels/plugins/onboarding/whatsapp.js";
import type { ChannelChoice } from "../onboard-types.js";
import type { ChannelOnboardingAdapter } from "./types.js";

View File

@ -1,5 +1,6 @@
export type { ChannelMessageActionAdapter } from "../channels/plugins/types.js";
export type { OpenClawConfig } from "../config/config.js";
export type { DiscordAccountConfig, DiscordActionConfig } from "../config/types.js";
export type { InspectedDiscordAccount } from "../../extensions/discord/src/account-inspect.js";
export type { ResolvedDiscordAccount } from "../../extensions/discord/src/accounts.js";
export * from "./channel-plugin-common.js";
@ -34,7 +35,7 @@ export {
resolveDiscordGroupRequireMention,
resolveDiscordGroupToolPolicy,
} from "../channels/plugins/group-mentions.js";
export { discordOnboardingAdapter } from "../channels/plugins/onboarding/discord.js";
export { discordOnboardingAdapter } from "../../extensions/discord/src/onboarding.js";
export { DiscordConfigSchema } from "../config/zod-schema.providers-core.js";
export {

View File

@ -1,4 +1,5 @@
export type { ResolvedIMessageAccount } from "../../extensions/imessage/src/accounts.js";
export type { IMessageAccountConfig } from "../config/types.js";
export * from "./channel-plugin-common.js";
export {
listIMessageAccountIds,
@ -23,7 +24,7 @@ export {
resolveIMessageGroupRequireMention,
resolveIMessageGroupToolPolicy,
} from "../channels/plugins/group-mentions.js";
export { imessageOnboardingAdapter } from "../channels/plugins/onboarding/imessage.js";
export { imessageOnboardingAdapter } from "../../extensions/imessage/src/onboarding.js";
export { IMessageConfigSchema } from "../config/zod-schema.providers-core.js";
export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js";

View File

@ -664,7 +664,7 @@ export {
export { inspectDiscordAccount } from "../../extensions/discord/src/account-inspect.js";
export type { InspectedDiscordAccount } from "../../extensions/discord/src/account-inspect.js";
export { collectDiscordAuditChannelIds } from "../../extensions/discord/src/audit.js";
export { discordOnboardingAdapter } from "../channels/plugins/onboarding/discord.js";
export { discordOnboardingAdapter } from "../../extensions/discord/src/onboarding.js";
export {
looksLikeDiscordTargetId,
normalizeDiscordMessagingTarget,
@ -679,7 +679,7 @@ export {
resolveIMessageAccount,
type ResolvedIMessageAccount,
} from "../../extensions/imessage/src/accounts.js";
export { imessageOnboardingAdapter } from "../channels/plugins/onboarding/imessage.js";
export { imessageOnboardingAdapter } from "../../extensions/imessage/src/onboarding.js";
export {
looksLikeIMessageTargetId,
normalizeIMessageMessagingTarget,
@ -713,7 +713,7 @@ export {
extractSlackToolSend,
listSlackMessageActions,
} from "../../extensions/slack/src/message-actions.js";
export { slackOnboardingAdapter } from "../channels/plugins/onboarding/slack.js";
export { slackOnboardingAdapter } from "../../extensions/slack/src/onboarding.js";
export {
looksLikeSlackTargetId,
normalizeSlackMessagingTarget,
@ -729,7 +729,7 @@ export {
} from "../../extensions/telegram/src/accounts.js";
export { inspectTelegramAccount } from "../../extensions/telegram/src/account-inspect.js";
export type { InspectedTelegramAccount } from "../../extensions/telegram/src/account-inspect.js";
export { telegramOnboardingAdapter } from "../channels/plugins/onboarding/telegram.js";
export { telegramOnboardingAdapter } from "../../extensions/telegram/src/onboarding.js";
export {
looksLikeTelegramTargetId,
normalizeTelegramMessagingTarget,
@ -748,7 +748,7 @@ export {
resolveSignalAccount,
type ResolvedSignalAccount,
} from "../../extensions/signal/src/accounts.js";
export { signalOnboardingAdapter } from "../channels/plugins/onboarding/signal.js";
export { signalOnboardingAdapter } from "../../extensions/signal/src/onboarding.js";
export {
looksLikeSignalTargetId,
normalizeSignalMessagingTarget,

View File

@ -1,5 +1,6 @@
export type { ChannelMessageActionAdapter } from "../channels/plugins/types.js";
export type { ResolvedSignalAccount } from "../../extensions/signal/src/accounts.js";
export type { SignalAccountConfig } from "../config/types.js";
export * from "./channel-plugin-common.js";
export {
listSignalAccountIds,
@ -15,7 +16,7 @@ export {
resolveAllowlistProviderRuntimeGroupPolicy,
resolveDefaultGroupPolicy,
} from "../config/runtime-group-policy.js";
export { signalOnboardingAdapter } from "../channels/plugins/onboarding/signal.js";
export { signalOnboardingAdapter } from "../../extensions/signal/src/onboarding.js";
export { SignalConfigSchema } from "../config/zod-schema.providers-core.js";
export { normalizeE164 } from "../utils.js";

View File

@ -1,4 +1,5 @@
export type { OpenClawConfig } from "../config/config.js";
export type { SlackAccountConfig } from "../config/types.slack.js";
export type { InspectedSlackAccount } from "../../extensions/slack/src/account-inspect.js";
export type { ResolvedSlackAccount } from "../../extensions/slack/src/accounts.js";
export * from "./channel-plugin-common.js";
@ -38,7 +39,7 @@ export {
resolveSlackGroupRequireMention,
resolveSlackGroupToolPolicy,
} from "../channels/plugins/group-mentions.js";
export { slackOnboardingAdapter } from "../channels/plugins/onboarding/slack.js";
export { slackOnboardingAdapter } from "../../extensions/slack/src/onboarding.js";
export { SlackConfigSchema } from "../config/zod-schema.providers-core.js";
export { handleSlackMessageAction } from "./slack-message-actions.js";

View File

@ -7,6 +7,7 @@ export type { ChannelPlugin } from "../channels/plugins/types.plugin.js";
export type { OpenClawConfig } from "../config/config.js";
export type { PluginRuntime } from "../plugins/runtime/types.js";
export type { OpenClawPluginApi } from "../plugins/types.js";
export type { TelegramAccountConfig, TelegramActionConfig } from "../config/types.js";
export type { InspectedTelegramAccount } from "../../extensions/telegram/src/account-inspect.js";
export type { ResolvedTelegramAccount } from "../../extensions/telegram/src/accounts.js";
export type { TelegramProbe } from "../../extensions/telegram/src/probe.js";
@ -63,7 +64,7 @@ export {
resolveTelegramGroupRequireMention,
resolveTelegramGroupToolPolicy,
} from "../channels/plugins/group-mentions.js";
export { telegramOnboardingAdapter } from "../channels/plugins/onboarding/telegram.js";
export { telegramOnboardingAdapter } from "../../extensions/telegram/src/onboarding.js";
export { TelegramConfigSchema } from "../config/zod-schema.providers-core.js";
export { buildTokenChannelStatusSummary } from "./status-helpers.js";