From 5eba663c38335057a73b9e3ad025f3fcec504ec2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 7 Mar 2026 21:44:58 +0000 Subject: [PATCH] refactor: unify onboarding secret-input prompt state wiring --- extensions/feishu/src/onboarding.ts | 27 ++++++++++----- extensions/matrix/src/onboarding.ts | 13 ++++++-- extensions/mattermost/src/onboarding.ts | 20 +++++++---- extensions/nextcloud-talk/src/onboarding.ts | 22 +++++++++---- extensions/zalo/src/onboarding.ts | 30 +++++++++++------ src/channels/plugins/onboarding/discord.ts | 18 ++++++---- .../plugins/onboarding/helpers.test.ts | 33 +++++++++++++++++++ src/channels/plugins/onboarding/helpers.ts | 17 ++++++++++ src/channels/plugins/onboarding/slack.ts | 29 ++++++++++------ src/channels/plugins/onboarding/telegram.ts | 18 ++++++---- src/plugin-sdk/feishu.ts | 1 + src/plugin-sdk/matrix.ts | 1 + src/plugin-sdk/mattermost.ts | 1 + src/plugin-sdk/nextcloud-talk.ts | 1 + src/plugin-sdk/zalo.ts | 1 + 15 files changed, 172 insertions(+), 60 deletions(-) diff --git a/extensions/feishu/src/onboarding.ts b/extensions/feishu/src/onboarding.ts index cf179057441..d19e20305aa 100644 --- a/extensions/feishu/src/onboarding.ts +++ b/extensions/feishu/src/onboarding.ts @@ -7,6 +7,7 @@ import type { WizardPrompter, } from "openclaw/plugin-sdk/feishu"; import { + buildSingleChannelSecretPromptState, DEFAULT_ACCOUNT_ID, formatDocsLink, hasConfiguredSecretInput, @@ -240,9 +241,12 @@ export const feishuOnboardingAdapter: ChannelOnboardingAdapter = { const hasConfigCreds = Boolean( typeof feishuCfg?.appId === "string" && feishuCfg.appId.trim() && hasConfigSecret, ); - const canUseEnv = Boolean( - !hasConfigCreds && process.env.FEISHU_APP_ID?.trim() && process.env.FEISHU_APP_SECRET?.trim(), - ); + const appSecretPromptState = buildSingleChannelSecretPromptState({ + accountConfigured: Boolean(resolved), + hasConfigToken: hasConfigSecret, + allowEnv: !hasConfigCreds && Boolean(process.env.FEISHU_APP_ID?.trim()), + envValue: process.env.FEISHU_APP_SECRET, + }); let next = cfg; let appId: string | null = null; @@ -258,9 +262,9 @@ export const feishuOnboardingAdapter: ChannelOnboardingAdapter = { prompter, providerHint: "feishu", credentialLabel: "App Secret", - accountConfigured: Boolean(resolved), - canUseEnv, - hasConfigToken: hasConfigSecret, + accountConfigured: appSecretPromptState.accountConfigured, + canUseEnv: appSecretPromptState.canUseEnv, + hasConfigToken: appSecretPromptState.hasConfigToken, envPrompt: "FEISHU_APP_ID + FEISHU_APP_SECRET detected. Use env vars?", keepPrompt: "Feishu App Secret already configured. Keep it?", inputPrompt: "Enter Feishu App Secret", @@ -346,14 +350,19 @@ export const feishuOnboardingAdapter: ChannelOnboardingAdapter = { if (connectionMode === "webhook") { const currentVerificationToken = (next.channels?.feishu as FeishuConfig | undefined) ?.verificationToken; + const verificationTokenPromptState = buildSingleChannelSecretPromptState({ + accountConfigured: hasConfiguredSecretInput(currentVerificationToken), + hasConfigToken: hasConfiguredSecretInput(currentVerificationToken), + allowEnv: false, + }); const verificationTokenResult = await promptSingleChannelSecretInput({ cfg: next, prompter, providerHint: "feishu-webhook", credentialLabel: "verification token", - accountConfigured: hasConfiguredSecretInput(currentVerificationToken), - canUseEnv: false, - hasConfigToken: hasConfiguredSecretInput(currentVerificationToken), + accountConfigured: verificationTokenPromptState.accountConfigured, + canUseEnv: verificationTokenPromptState.canUseEnv, + hasConfigToken: verificationTokenPromptState.hasConfigToken, envPrompt: "", keepPrompt: "Feishu verification token already configured. Keep it?", inputPrompt: "Enter Feishu verification token", diff --git a/extensions/matrix/src/onboarding.ts b/extensions/matrix/src/onboarding.ts index 7b5b7aa5346..642522dbc50 100644 --- a/extensions/matrix/src/onboarding.ts +++ b/extensions/matrix/src/onboarding.ts @@ -1,6 +1,7 @@ import type { DmPolicy } from "openclaw/plugin-sdk/matrix"; import { addWildcardAllowFrom, + buildSingleChannelSecretPromptState, formatResolvedUnresolvedNote, formatDocsLink, hasConfiguredSecretInput, @@ -323,14 +324,20 @@ export const matrixOnboardingAdapter: ChannelOnboardingAdapter = { }, }), ).trim(); + const passwordPromptState = buildSingleChannelSecretPromptState({ + accountConfigured: Boolean(existingPasswordConfigured), + hasConfigToken: existingPasswordConfigured, + allowEnv: true, + envValue: envPassword, + }); const passwordResult = await promptSingleChannelSecretInput({ cfg: next, prompter, providerHint: "matrix", credentialLabel: "password", - accountConfigured: Boolean(existingPasswordConfigured), - canUseEnv: Boolean(envPassword?.trim()) && !existingPasswordConfigured, - hasConfigToken: existingPasswordConfigured, + accountConfigured: passwordPromptState.accountConfigured, + canUseEnv: passwordPromptState.canUseEnv, + hasConfigToken: passwordPromptState.hasConfigToken, envPrompt: "MATRIX_PASSWORD detected. Use env var?", keepPrompt: "Matrix password already configured. Keep it?", inputPrompt: "Matrix password", diff --git a/extensions/mattermost/src/onboarding.ts b/extensions/mattermost/src/onboarding.ts index 86b47e12047..67f9cc2362e 100644 --- a/extensions/mattermost/src/onboarding.ts +++ b/extensions/mattermost/src/onboarding.ts @@ -1,5 +1,6 @@ import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/account-id"; import { + buildSingleChannelSecretPromptState, hasConfiguredSecretInput, promptSingleChannelSecretInput, type ChannelOnboardingAdapter, @@ -84,12 +85,17 @@ export const mattermostOnboardingAdapter: ChannelOnboardingAdapter = { }); const accountConfigured = Boolean(resolvedAccount.botToken && resolvedAccount.baseUrl); const allowEnv = accountId === DEFAULT_ACCOUNT_ID; - const canUseEnv = - allowEnv && - Boolean(process.env.MATTERMOST_BOT_TOKEN?.trim()) && - Boolean(process.env.MATTERMOST_URL?.trim()); const hasConfigToken = hasConfiguredSecretInput(resolvedAccount.config.botToken); const hasConfigValues = hasConfigToken || Boolean(resolvedAccount.config.baseUrl); + const tokenPromptState = buildSingleChannelSecretPromptState({ + accountConfigured, + hasConfigToken, + allowEnv: allowEnv && !hasConfigValues, + envValue: + process.env.MATTERMOST_BOT_TOKEN?.trim() && process.env.MATTERMOST_URL?.trim() + ? process.env.MATTERMOST_BOT_TOKEN + : undefined, + }); let botToken: SecretInput | null = null; let baseUrl: string | null = null; @@ -103,9 +109,9 @@ export const mattermostOnboardingAdapter: ChannelOnboardingAdapter = { prompter, providerHint: "mattermost", credentialLabel: "bot token", - accountConfigured, - canUseEnv: canUseEnv && !hasConfigValues, - hasConfigToken, + accountConfigured: tokenPromptState.accountConfigured, + canUseEnv: tokenPromptState.canUseEnv, + hasConfigToken: tokenPromptState.hasConfigToken, envPrompt: "MATTERMOST_BOT_TOKEN + MATTERMOST_URL detected. Use env vars?", keepPrompt: "Mattermost bot token already configured. Keep it?", inputPrompt: "Enter Mattermost bot token", diff --git a/extensions/nextcloud-talk/src/onboarding.ts b/extensions/nextcloud-talk/src/onboarding.ts index 1d897cbd6eb..30cc2596acf 100644 --- a/extensions/nextcloud-talk/src/onboarding.ts +++ b/extensions/nextcloud-talk/src/onboarding.ts @@ -1,4 +1,5 @@ import { + buildSingleChannelSecretPromptState, formatDocsLink, hasConfiguredSecretInput, mergeAllowFromEntries, @@ -209,11 +210,16 @@ export const nextcloudTalkOnboardingAdapter: ChannelOnboardingAdapter = { }); const accountConfigured = Boolean(resolvedAccount.secret && resolvedAccount.baseUrl); const allowEnv = accountId === DEFAULT_ACCOUNT_ID; - const canUseEnv = allowEnv && Boolean(process.env.NEXTCLOUD_TALK_BOT_SECRET?.trim()); const hasConfigSecret = Boolean( hasConfiguredSecretInput(resolvedAccount.config.botSecret) || resolvedAccount.config.botSecretFile, ); + const secretPromptState = buildSingleChannelSecretPromptState({ + accountConfigured, + hasConfigToken: hasConfigSecret, + allowEnv, + envValue: process.env.NEXTCLOUD_TALK_BOT_SECRET, + }); let baseUrl = resolvedAccount.baseUrl; if (!baseUrl) { @@ -244,9 +250,9 @@ export const nextcloudTalkOnboardingAdapter: ChannelOnboardingAdapter = { prompter, providerHint: "nextcloud-talk", credentialLabel: "bot secret", - accountConfigured, - canUseEnv: canUseEnv && !hasConfigSecret, - hasConfigToken: hasConfigSecret, + accountConfigured: secretPromptState.accountConfigured, + canUseEnv: secretPromptState.canUseEnv, + hasConfigToken: secretPromptState.hasConfigToken, envPrompt: "NEXTCLOUD_TALK_BOT_SECRET detected. Use env var?", keepPrompt: "Nextcloud Talk bot secret already configured. Keep it?", inputPrompt: "Enter Nextcloud Talk bot secret", @@ -285,9 +291,11 @@ export const nextcloudTalkOnboardingAdapter: ChannelOnboardingAdapter = { prompter, providerHint: "nextcloud-talk-api", credentialLabel: "API password", - accountConfigured: Boolean(existingApiUser && existingApiPasswordConfigured), - canUseEnv: false, - hasConfigToken: existingApiPasswordConfigured, + ...buildSingleChannelSecretPromptState({ + accountConfigured: Boolean(existingApiUser && existingApiPasswordConfigured), + hasConfigToken: existingApiPasswordConfigured, + allowEnv: false, + }), envPrompt: "", keepPrompt: "Nextcloud Talk API password already configured. Keep it?", inputPrompt: "Enter Nextcloud Talk API password", diff --git a/extensions/zalo/src/onboarding.ts b/extensions/zalo/src/onboarding.ts index 35f7759649b..e23765f4f7d 100644 --- a/extensions/zalo/src/onboarding.ts +++ b/extensions/zalo/src/onboarding.ts @@ -6,6 +6,7 @@ import type { WizardPrompter, } from "openclaw/plugin-sdk/zalo"; import { + buildSingleChannelSecretPromptState, DEFAULT_ACCOUNT_ID, hasConfiguredSecretInput, mergeAllowFromEntries, @@ -251,10 +252,15 @@ export const zaloOnboardingAdapter: ChannelOnboardingAdapter = { }); const accountConfigured = Boolean(resolvedAccount.token); const allowEnv = zaloAccountId === DEFAULT_ACCOUNT_ID; - const canUseEnv = allowEnv && Boolean(process.env.ZALO_BOT_TOKEN?.trim()); const hasConfigToken = Boolean( hasConfiguredSecretInput(resolvedAccount.config.botToken) || resolvedAccount.config.tokenFile, ); + const tokenPromptState = buildSingleChannelSecretPromptState({ + accountConfigured, + hasConfigToken, + allowEnv, + envValue: process.env.ZALO_BOT_TOKEN, + }); let token: SecretInput | null = null; if (!accountConfigured) { @@ -265,9 +271,9 @@ export const zaloOnboardingAdapter: ChannelOnboardingAdapter = { prompter, providerHint: "zalo", credentialLabel: "bot token", - accountConfigured, - canUseEnv: canUseEnv && !hasConfigToken, - hasConfigToken, + accountConfigured: tokenPromptState.accountConfigured, + canUseEnv: tokenPromptState.canUseEnv, + hasConfigToken: tokenPromptState.hasConfigToken, envPrompt: "ZALO_BOT_TOKEN detected. Use env var?", keepPrompt: "Zalo token already configured. Keep it?", inputPrompt: "Enter Zalo bot token", @@ -349,9 +355,11 @@ export const zaloOnboardingAdapter: ChannelOnboardingAdapter = { prompter, providerHint: "zalo-webhook", credentialLabel: "webhook secret", - accountConfigured: hasConfiguredSecretInput(resolvedAccount.config.webhookSecret), - canUseEnv: false, - hasConfigToken: hasConfiguredSecretInput(resolvedAccount.config.webhookSecret), + ...buildSingleChannelSecretPromptState({ + accountConfigured: hasConfiguredSecretInput(resolvedAccount.config.webhookSecret), + hasConfigToken: hasConfiguredSecretInput(resolvedAccount.config.webhookSecret), + allowEnv: false, + }), envPrompt: "", keepPrompt: "Zalo webhook secret already configured. Keep it?", inputPrompt: "Webhook secret (8-256 chars)", @@ -368,9 +376,11 @@ export const zaloOnboardingAdapter: ChannelOnboardingAdapter = { prompter, providerHint: "zalo-webhook", credentialLabel: "webhook secret", - accountConfigured: false, - canUseEnv: false, - hasConfigToken: false, + ...buildSingleChannelSecretPromptState({ + accountConfigured: false, + hasConfigToken: false, + allowEnv: false, + }), envPrompt: "", keepPrompt: "Zalo webhook secret already configured. Keep it?", inputPrompt: "Webhook secret (8-256 chars)", diff --git a/src/channels/plugins/onboarding/discord.ts b/src/channels/plugins/onboarding/discord.ts index 85592b7810e..52f0d2b1373 100644 --- a/src/channels/plugins/onboarding/discord.ts +++ b/src/channels/plugins/onboarding/discord.ts @@ -20,6 +20,7 @@ import type { ChannelOnboardingAdapter, ChannelOnboardingDmPolicy } from "../onb import { configureChannelAccessWithAllowlist } from "./channel-access-configure.js"; import { applySingleTokenPromptResult, + buildSingleChannelSecretPromptState, parseMentionOrPrefixedId, noteChannelLookupFailure, noteChannelLookupSummary, @@ -177,12 +178,15 @@ export const discordOnboardingAdapter: ChannelOnboardingAdapter = { cfg: next, accountId: discordAccountId, }); - const hasConfigToken = hasConfiguredSecretInput(resolvedAccount.config.token); - const accountConfigured = Boolean(resolvedAccount.token) || hasConfigToken; const allowEnv = discordAccountId === DEFAULT_ACCOUNT_ID; - const canUseEnv = allowEnv && !hasConfigToken && Boolean(process.env.DISCORD_BOT_TOKEN?.trim()); + const tokenPromptState = buildSingleChannelSecretPromptState({ + accountConfigured: Boolean(resolvedAccount.token), + hasConfigToken: hasConfiguredSecretInput(resolvedAccount.config.token), + allowEnv, + envValue: process.env.DISCORD_BOT_TOKEN, + }); - if (!accountConfigured) { + if (!tokenPromptState.accountConfigured) { await noteDiscordTokenHelp(prompter); } @@ -192,9 +196,9 @@ export const discordOnboardingAdapter: ChannelOnboardingAdapter = { providerHint: "discord", credentialLabel: "Discord bot token", secretInputMode: options?.secretInputMode, - accountConfigured, - canUseEnv, - hasConfigToken, + accountConfigured: tokenPromptState.accountConfigured, + canUseEnv: tokenPromptState.canUseEnv, + hasConfigToken: tokenPromptState.hasConfigToken, envPrompt: "DISCORD_BOT_TOKEN detected. Use env var?", keepPrompt: "Discord token already configured. Keep it?", inputPrompt: "Enter Discord bot token", diff --git a/src/channels/plugins/onboarding/helpers.test.ts b/src/channels/plugins/onboarding/helpers.test.ts index 95f577dc82a..9ceee484c77 100644 --- a/src/channels/plugins/onboarding/helpers.test.ts +++ b/src/channels/plugins/onboarding/helpers.test.ts @@ -9,6 +9,7 @@ vi.mock("../../../plugin-sdk/onboarding.js", () => ({ import { applySingleTokenPromptResult, + buildSingleChannelSecretPromptState, normalizeAllowFromEntries, noteChannelLookupFailure, noteChannelLookupSummary, @@ -104,6 +105,38 @@ async function runPromptSingleToken(params: { }); } +describe("buildSingleChannelSecretPromptState", () => { + it("enables env path only when env is present and no config token exists", () => { + expect( + buildSingleChannelSecretPromptState({ + accountConfigured: false, + hasConfigToken: false, + allowEnv: true, + envValue: "token-from-env", + }), + ).toEqual({ + accountConfigured: false, + hasConfigToken: false, + canUseEnv: true, + }); + }); + + it("disables env path when config token already exists", () => { + expect( + buildSingleChannelSecretPromptState({ + accountConfigured: true, + hasConfigToken: true, + allowEnv: true, + envValue: "token-from-env", + }), + ).toEqual({ + accountConfigured: true, + hasConfigToken: true, + canUseEnv: false, + }); + }); +}); + async function runPromptLegacyAllowFrom(params: { cfg?: OpenClawConfig; channel: "discord" | "slack"; diff --git a/src/channels/plugins/onboarding/helpers.ts b/src/channels/plugins/onboarding/helpers.ts index e82ad012a17..31ba023ba2f 100644 --- a/src/channels/plugins/onboarding/helpers.ts +++ b/src/channels/plugins/onboarding/helpers.ts @@ -452,6 +452,23 @@ export function applySingleTokenPromptResult(params: { return next; } +export function buildSingleChannelSecretPromptState(params: { + accountConfigured: boolean; + hasConfigToken: boolean; + allowEnv: boolean; + envValue?: string; +}): { + accountConfigured: boolean; + hasConfigToken: boolean; + canUseEnv: boolean; +} { + return { + accountConfigured: params.accountConfigured, + hasConfigToken: params.hasConfigToken, + canUseEnv: params.allowEnv && Boolean(params.envValue?.trim()) && !params.hasConfigToken, + }; +} + export async function promptSingleChannelToken(params: { prompter: Pick; accountConfigured: boolean; diff --git a/src/channels/plugins/onboarding/slack.ts b/src/channels/plugins/onboarding/slack.ts index ee054a851eb..cc683477c09 100644 --- a/src/channels/plugins/onboarding/slack.ts +++ b/src/channels/plugins/onboarding/slack.ts @@ -14,6 +14,7 @@ import type { WizardPrompter } from "../../../wizard/prompts.js"; import type { ChannelOnboardingAdapter, ChannelOnboardingDmPolicy } from "../onboarding-types.js"; import { configureChannelAccessWithAllowlist } from "./channel-access-configure.js"; import { + buildSingleChannelSecretPromptState, parseMentionOrPrefixedId, noteChannelLookupFailure, noteChannelLookupSummary, @@ -234,10 +235,18 @@ export const slackOnboardingAdapter: ChannelOnboardingAdapter = { const accountConfigured = Boolean(resolvedAccount.botToken && resolvedAccount.appToken) || hasConfigTokens; const allowEnv = slackAccountId === DEFAULT_ACCOUNT_ID; - const canUseBotEnv = - allowEnv && !hasConfiguredBotToken && Boolean(process.env.SLACK_BOT_TOKEN?.trim()); - const canUseAppEnv = - allowEnv && !hasConfiguredAppToken && Boolean(process.env.SLACK_APP_TOKEN?.trim()); + const botPromptState = buildSingleChannelSecretPromptState({ + accountConfigured: Boolean(resolvedAccount.botToken) || hasConfiguredBotToken, + hasConfigToken: hasConfiguredBotToken, + allowEnv, + envValue: process.env.SLACK_BOT_TOKEN, + }); + const appPromptState = buildSingleChannelSecretPromptState({ + accountConfigured: Boolean(resolvedAccount.appToken) || hasConfiguredAppToken, + hasConfigToken: hasConfiguredAppToken, + allowEnv, + envValue: process.env.SLACK_APP_TOKEN, + }); let resolvedBotTokenForAllowlist = resolvedAccount.botToken; const slackBotName = String( await prompter.text({ @@ -254,9 +263,9 @@ export const slackOnboardingAdapter: ChannelOnboardingAdapter = { providerHint: "slack-bot", credentialLabel: "Slack bot token", secretInputMode: options?.secretInputMode, - accountConfigured: Boolean(resolvedAccount.botToken) || hasConfiguredBotToken, - canUseEnv: canUseBotEnv, - hasConfigToken: hasConfiguredBotToken, + accountConfigured: botPromptState.accountConfigured, + canUseEnv: botPromptState.canUseEnv, + hasConfigToken: botPromptState.hasConfigToken, envPrompt: "SLACK_BOT_TOKEN detected. Use env var?", keepPrompt: "Slack bot token already configured. Keep it?", inputPrompt: "Enter Slack bot token (xoxb-...)", @@ -280,9 +289,9 @@ export const slackOnboardingAdapter: ChannelOnboardingAdapter = { providerHint: "slack-app", credentialLabel: "Slack app token", secretInputMode: options?.secretInputMode, - accountConfigured: Boolean(resolvedAccount.appToken) || hasConfiguredAppToken, - canUseEnv: canUseAppEnv, - hasConfigToken: hasConfiguredAppToken, + accountConfigured: appPromptState.accountConfigured, + canUseEnv: appPromptState.canUseEnv, + hasConfigToken: appPromptState.hasConfigToken, envPrompt: "SLACK_APP_TOKEN detected. Use env var?", keepPrompt: "Slack app token already configured. Keep it?", inputPrompt: "Enter Slack app token (xapp-...)", diff --git a/src/channels/plugins/onboarding/telegram.ts b/src/channels/plugins/onboarding/telegram.ts index 6a65d324d27..22a173d47fe 100644 --- a/src/channels/plugins/onboarding/telegram.ts +++ b/src/channels/plugins/onboarding/telegram.ts @@ -14,6 +14,7 @@ import { fetchTelegramChatId } from "../../telegram/api.js"; import type { ChannelOnboardingAdapter, ChannelOnboardingDmPolicy } from "../onboarding-types.js"; import { applySingleTokenPromptResult, + buildSingleChannelSecretPromptState, patchChannelConfigForAccount, promptSingleChannelSecretInput, promptResolvedAllowFrom, @@ -192,12 +193,15 @@ export const telegramOnboardingAdapter: ChannelOnboardingAdapter = { const hasConfiguredBotToken = hasConfiguredSecretInput(resolvedAccount.config.botToken); const hasConfigToken = hasConfiguredBotToken || Boolean(resolvedAccount.config.tokenFile?.trim()); - const accountConfigured = Boolean(resolvedAccount.token) || hasConfigToken; const allowEnv = telegramAccountId === DEFAULT_ACCOUNT_ID; - const canUseEnv = - allowEnv && !hasConfigToken && Boolean(process.env.TELEGRAM_BOT_TOKEN?.trim()); + const tokenPromptState = buildSingleChannelSecretPromptState({ + accountConfigured: Boolean(resolvedAccount.token) || hasConfigToken, + hasConfigToken, + allowEnv, + envValue: process.env.TELEGRAM_BOT_TOKEN, + }); - if (!accountConfigured) { + if (!tokenPromptState.accountConfigured) { await noteTelegramTokenHelp(prompter); } @@ -207,9 +211,9 @@ export const telegramOnboardingAdapter: ChannelOnboardingAdapter = { providerHint: "telegram", credentialLabel: "Telegram bot token", secretInputMode: options?.secretInputMode, - accountConfigured, - canUseEnv, - hasConfigToken, + accountConfigured: tokenPromptState.accountConfigured, + canUseEnv: tokenPromptState.canUseEnv, + hasConfigToken: tokenPromptState.hasConfigToken, envPrompt: "TELEGRAM_BOT_TOKEN detected. Use env var?", keepPrompt: "Telegram token already configured. Keep it?", inputPrompt: "Enter Telegram bot token", diff --git a/src/plugin-sdk/feishu.ts b/src/plugin-sdk/feishu.ts index 5bd47f942f0..425d13d7f03 100644 --- a/src/plugin-sdk/feishu.ts +++ b/src/plugin-sdk/feishu.ts @@ -16,6 +16,7 @@ export type { ChannelOnboardingDmPolicy, } from "../channels/plugins/onboarding-types.js"; export { + buildSingleChannelSecretPromptState, addWildcardAllowFrom, promptSingleChannelSecretInput, setTopLevelChannelAllowFrom, diff --git a/src/plugin-sdk/matrix.ts b/src/plugin-sdk/matrix.ts index 89feb7079e3..2e44f819940 100644 --- a/src/plugin-sdk/matrix.ts +++ b/src/plugin-sdk/matrix.ts @@ -33,6 +33,7 @@ export type { } from "../channels/plugins/onboarding-types.js"; export { promptChannelAccessConfig } from "../channels/plugins/onboarding/channel-access.js"; export { + buildSingleChannelSecretPromptState, addWildcardAllowFrom, mergeAllowFromEntries, promptSingleChannelSecretInput, diff --git a/src/plugin-sdk/mattermost.ts b/src/plugin-sdk/mattermost.ts index 6f074a7cc20..ddcea319082 100644 --- a/src/plugin-sdk/mattermost.ts +++ b/src/plugin-sdk/mattermost.ts @@ -30,6 +30,7 @@ export { formatPairingApproveHint } from "../channels/plugins/helpers.js"; export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js"; export type { ChannelOnboardingAdapter } from "../channels/plugins/onboarding-types.js"; export { + buildSingleChannelSecretPromptState, promptAccountId, promptSingleChannelSecretInput, resolveAccountIdForConfigure, diff --git a/src/plugin-sdk/nextcloud-talk.ts b/src/plugin-sdk/nextcloud-talk.ts index 30a01ca79dc..df2f32535d3 100644 --- a/src/plugin-sdk/nextcloud-talk.ts +++ b/src/plugin-sdk/nextcloud-talk.ts @@ -22,6 +22,7 @@ export type { ChannelOnboardingDmPolicy, } from "../channels/plugins/onboarding-types.js"; export { + buildSingleChannelSecretPromptState, addWildcardAllowFrom, mergeAllowFromEntries, promptAccountId, diff --git a/src/plugin-sdk/zalo.ts b/src/plugin-sdk/zalo.ts index d259a3659ae..b6c2d17cab4 100644 --- a/src/plugin-sdk/zalo.ts +++ b/src/plugin-sdk/zalo.ts @@ -16,6 +16,7 @@ export type { ChannelOnboardingDmPolicy, } from "../channels/plugins/onboarding-types.js"; export { + buildSingleChannelSecretPromptState, addWildcardAllowFrom, mergeAllowFromEntries, promptAccountId,