diff --git a/extensions/telegram/contract-api.ts b/extensions/telegram/contract-api.ts index 145554fd685..9f0d3e362b2 100644 --- a/extensions/telegram/contract-api.ts +++ b/extensions/telegram/contract-api.ts @@ -11,6 +11,7 @@ export { } from "./src/command-config.js"; export { parseTelegramTopicConversation } from "./src/topic-conversation.js"; export { singleAccountKeysToMove } from "./src/setup-contract.js"; +export { mergeTelegramAccountConfig } from "./src/accounts.js"; export { buildCommandsPaginationKeyboard, buildTelegramModelsProviderChannelData, diff --git a/packages/plugin-sdk/package.json b/packages/plugin-sdk/package.json index 7e6a390381a..8db0de50a08 100644 --- a/packages/plugin-sdk/package.json +++ b/packages/plugin-sdk/package.json @@ -60,6 +60,10 @@ "types": "./dist/src/plugin-sdk/secret-input.d.ts", "default": "./src/secret-input.ts" }, + "./text-runtime": { + "types": "./dist/src/plugin-sdk/text-runtime.d.ts", + "default": "./src/text-runtime.ts" + }, "./testing": { "types": "./dist/src/plugin-sdk/testing.d.ts", "default": "./src/testing.ts" diff --git a/packages/plugin-sdk/src/text-runtime.ts b/packages/plugin-sdk/src/text-runtime.ts new file mode 100644 index 00000000000..f8b813ac8f3 --- /dev/null +++ b/packages/plugin-sdk/src/text-runtime.ts @@ -0,0 +1 @@ +export { normalizeOptionalString, readStringValue } from "../../../src/shared/string-coerce.js"; diff --git a/src/channels/plugins/setup-helpers.ts b/src/channels/plugins/setup-helpers.ts index a830d69d176..016f645c4cd 100644 --- a/src/channels/plugins/setup-helpers.ts +++ b/src/channels/plugins/setup-helpers.ts @@ -414,6 +414,11 @@ const BUNDLED_SINGLE_ACCOUNT_PROMOTION_FALLBACKS: Record = { + // Keep top-level Telegram policy fallback intact when only auth needs seeding. + telegram: ["botToken", "tokenFile"], +}; + type ChannelSetupPromotionSurface = { singleAccountKeysToMove?: readonly string[]; namedAccountPromotionKeys?: readonly string[]; @@ -455,9 +460,9 @@ export function resolveSingleAccountKeysToMove(params: { const hasNamedAccounts = Object.keys((params.channel.accounts as Record) ?? {}).filter(Boolean).length > 0; - const namedAccountPromotionKeys = getChannelSetupPromotionSurface( - params.channelKey, - )?.namedAccountPromotionKeys; + const namedAccountPromotionKeys = + getChannelSetupPromotionSurface(params.channelKey)?.namedAccountPromotionKeys ?? + BUNDLED_NAMED_ACCOUNT_PROMOTION_FALLBACKS[params.channelKey]; return Object.entries(params.channel) .filter(([key, value]) => { if (key === "accounts" || key === "enabled" || value === undefined) { diff --git a/src/plugin-sdk/telegram.ts b/src/plugin-sdk/telegram.ts index c2dfe338989..874dabfa99f 100644 --- a/src/plugin-sdk/telegram.ts +++ b/src/plugin-sdk/telegram.ts @@ -24,3 +24,8 @@ export const collectTelegramSecurityAuditFindings: FacadeModule["collectTelegram loadFacadeModule().collectTelegramSecurityAuditFindings( ...args, )) as FacadeModule["collectTelegramSecurityAuditFindings"]; + +export const mergeTelegramAccountConfig: FacadeModule["mergeTelegramAccountConfig"] = ((...args) => + loadFacadeModule().mergeTelegramAccountConfig( + ...args, + )) as FacadeModule["mergeTelegramAccountConfig"]; diff --git a/src/plugins/contracts/boundary-invariants.test.ts b/src/plugins/contracts/boundary-invariants.test.ts index efab2592431..988286fa634 100644 --- a/src/plugins/contracts/boundary-invariants.test.ts +++ b/src/plugins/contracts/boundary-invariants.test.ts @@ -14,6 +14,7 @@ const ALLOWED_BUNDLED_CAPABILITY_METADATA_CONSUMERS = new Set([ const ALLOWED_EXTENSION_PATH_STRING_TESTS = new Set([ "src/plugin-sdk/browser-maintenance.test.ts", "src/channels/plugins/bundled.shape-guard.test.ts", + "src/commands/doctor-legacy-config.migrations.test.ts", "src/plugins/contracts/bundled-extension-config-api-guardrails.test.ts", "src/scripts/test-projects.test.ts", ]); diff --git a/src/plugins/contracts/extension-package-project-boundaries.test.ts b/src/plugins/contracts/extension-package-project-boundaries.test.ts index 4b29a60aef0..803f63dfea4 100644 --- a/src/plugins/contracts/extension-package-project-boundaries.test.ts +++ b/src/plugins/contracts/extension-package-project-boundaries.test.ts @@ -131,6 +131,7 @@ describe("opt-in extension package boundaries", () => { expect(packageJson.exports?.["./text-runtime"]?.types).toBe( "./dist/src/plugin-sdk/text-runtime.d.ts", ); + ); expect(packageJson.exports?.["./video-generation"]?.types).toBe( "./dist/src/plugin-sdk/video-generation.d.ts", ); diff --git a/src/plugins/setup-registry.runtime.ts b/src/plugins/setup-registry.runtime.ts index 147c079bf8a..cbd2f9b96a1 100644 --- a/src/plugins/setup-registry.runtime.ts +++ b/src/plugins/setup-registry.runtime.ts @@ -24,7 +24,7 @@ function resolveBundledSetupCliBackends(): SetupCliBackendRuntimeEntry[] { if (bundledSetupCliBackendsCache) { return bundledSetupCliBackendsCache; } - bundledSetupCliBackendsCache = loadPluginManifestRegistry({}) + bundledSetupCliBackendsCache = loadPluginManifestRegistry({ cache: true }) .plugins.filter((plugin) => plugin.origin === "bundled" && plugin.cliBackends.length > 0) .flatMap((plugin) => plugin.cliBackends.map(